DEV Community

loading...

ERC777: Una versión mejorada de los ERC20

Ahmed Castro
Hago videos sobre todo lo de programación en blockchain
・2 min read

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

Discussion (0)