DEV Community

Ahmed Castro
Ahmed Castro

Posted on

ERC777: Una versión mejorada de los ERC20

Los ERC777 son un sistema de tokens 100% compatibles con ERC20 pero implementan un par de mejoras para mejorar la experiencia de usuario y al mismo tiempo nos hace la vida mas fácil a los programadores.

El standard ya tiene disponibles implementaciones de OpenZeppelin listas para que las importemos.

Diferencias de los ERC777 ante los ERC20

  • Debe tener 18 decimales.
  • Usa send(dest, amount, data) como alternativa a transfer(dest, amount). Se parece a cómo manejamos Ether y nos permite enviar data que puede ser manejada como a nuestra voluntad.
  • Tiene hooks de tokensToSend y tokensReceived que nos permiten prohibir la entrada y salida de fondos. Esto con el fin de prevenir enviar tokens a addresses que no los manejen.
  • Sistema de operators en vez de approve

Smart contract ejemplo de un ERC777

MyERC777.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.8.4;

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.1/contracts/token/ERC777/ERC777.sol";

contract MyERC777 is ERC777 {

  constructor ()
    ERC777("MyToken", "MT", new address[](0))
  {
    _mint(msg.sender, 1000 ether, "", "");
  }
}
Enter fullscreen mode Exit fullscreen mode

Smart contract de un operador de ERC777

MyERC777Reciever.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.8.4;

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.1/contracts/token/ERC777/ERC777.sol";

contract MyERC777Reciever is IERC777Recipient {

  mapping (address=>uint) public balances;
  ERC777 my_erc777;

  constructor (address my_erc777_address)
  {
    IERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24).
      setInterfaceImplementer(address(this),
        keccak256("ERC777TokensRecipient"),
        address(this)
      );
    my_erc777 = ERC777(my_erc777_address);
  }

  function tokensReceived(
      address operator,
      address from,
      address to,
      uint256 amount,
      bytes calldata userData,
      bytes calldata operatorData
    ) override external
  {
    // revert();
  }

  function deposit(uint amount) public
  {
    my_erc777.operatorSend(address(msg.sender), address(this), amount, "", "");
    balances[msg.sender] += amount;
  }

  function retrieveTokens() public
  {
    my_erc777.operatorSend(address(this), address(msg.sender), balances[msg.sender], "", "");
    balances[msg.sender] = 0;
  }
}
Enter fullscreen mode Exit fullscreen mode

Top comments (2)

Collapse
 
ignacio_wagmivs profile image
Ignacio Fernández

Crees que con estos tokens podría pactar que una wallet pudiese retirar fondos de otra (metamask)si se cumplen una serie de condiciones?

Collapse
 
turupawn profile image
Ahmed Castro

Si, siempre y cuando se haya predefinido todo en el smart contract.