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 atransfer(dest, amount)
. Se parece a cómo manejamos Ether y nos permite enviardata
que puede ser manejada como a nuestra voluntad. - Tiene hooks de
tokensToSend
ytokensReceived
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 deapprove
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, "", "");
}
}
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;
}
}
Top comments (2)
Crees que con estos tokens podría pactar que una wallet pudiese retirar fondos de otra (metamask)si se cumplen una serie de condiciones?
Si, siempre y cuando se haya predefinido todo en el smart contract.