Entender el contrato inteligente de token ERC
Uno de los estándares de contrato inteligentes más significativos en Ethereum es conocido como ERC-20, que se ha convertido en el estándar técnico utilizado para todos los contratos inteligentes en la cadena de bloques de Ethereum para implementaciones de tókenes fungibles.
ERC-20 define una lista común de reglas a las que deben adherirse todos los tókenes fungibles de Ethereum. En consecuencia, este estándar de token permite a todo tipo de desarrolladores, predecir con precisión, cómo funcionarán los nuevos tókenes dentro del sistema Ethereum en general. Esto simplifica y facilita las tareas de los desarrolladores, ya que estos pueden continuar con su trabajo, sabiendo que todos y cada uno de los nuevos proyectos no se tendrán que repetir, cada vez que se libere un nuevo token, siempre y cuando el token siga las reglas.
He aquí, a modo de interfaz, las funciones que un ERC debe implementar. Si no está seguro de lo que es una interfaz, consulte nuestro artículo sobre programación OOP en Solidity(opens in a new tab).
1pragma solidity ^0.6.0;23interface IERC20 {45 function totalSupply() external view returns (uint256);6 function balanceOf(address account) external view returns (uint256);7 function allowance(address owner, address spender) external view returns (uint256);89 function transfer(address recipient, uint256 amount) external returns (bool);10 function approve(address spender, uint256 amount) external returns (bool);11 function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);121314 event Transfer(address indexed from, address indexed to, uint256 value);15 event Approval(address indexed owner, address indexed spender, uint256 value);16}Mostrar todoCopiar
Aquí encontrará una explicación detallada del propósito de cada función. Seguidamente, presentaremos una implementación simple del token ERC-20.
Getters
1function totalSupply() external view returns (uint256);Copiar
Devuelve la cantidad de tókenes que existen. Esta función es un getter (capturador) y no modifica el estado del contrato. Tenga en cuenta que no hay valores decimales, solo enteros en Solidity. Por lo tanto, la mayoría de los tókenes adoptan 18 decimales y devolverán el suministro total y otros resultados a razón de 100000000000000 por token. No todos los tókenes tienen definidos 18 decimales y esto es algo que debe tener en cuenta al tratar con tókenes.
1function balanceOf(address account) external view returns (uint256);Copiar
Devuelve la cantidad de tókenes pertenecientes a una dirección (cuenta
). Esta función es un getter (capturador) y no modifica el estado del contrato.
1function allowance(address owner, address spender) external view returns (uint256);Copiar
El estándar ERC-20 permite que una dirección dé una asignación a otra dirección para poder recuperar tókenes de ella. Este getter (capturador) devuelve el número restante de tókenes que el spender
(gastador) podrá gastar en nombre del owner
(propietario). Esta función es un getter (capturador) y no modifica el estado del contrato y debería devolver 0 por defecto.
Funciones
1function transfer(address recipient, uint256 amount) external returns (bool);Copiar
Mueve la amount
(cantidad) de tókenes de la dirección de la persona que llama a la función (msg.sender
) a la dirección del destinatario. Esta función emite el evento de Transfer
definido más adelante. Ella devuelve verdadero si la transferencia fuera posible.
1function approve(address spender, uint256 amount) external returns (bool);Copiar
Establece la cantidad permitida
que el gastador
puede transferir desde la función de llamada -caller- (msg.sender) balance
. Esta función emite el evento de aprobación. La función devuelve si el permiso se ha establecido correctamente.
1function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);Copiar
Pasa la cantidad
de tókenes de remitente
al destinatario
usando el mecanismo de autorización. La cantidad se deduce del total del solicitante. Esta función emite el evento Transfer
(transferencia).
Eventos
1event Transfer(address indexed from, address indexed to, uint256 value);Copiar
Este evento se emite cuando se envía la cantidad de tókenes (valor) de la dirección from
a la dirección to
.
En el caso de acuñar nuevos tókenes, la transferencia suele hacerse from
la dirección 0x00..0000, mientras que en el caso de la grabación de tókenes la transferencia es a to
0x00..0000.
1event Approval(address indexed owner, address indexed spender, uint256 value);Copiar
Este evento se emite cuando el owner
(propietario) aprueba la cantidad de tókenes (value
[valor]) que quiere utilizar el spender
(gastador).
Una implementación básica de los tókenes ERC-20
Este es el código más sencillo en el que puede basar su token ERC-20:
1pragma solidity ^0.8.0;23interface IERC20 {45 function totalSupply() external view returns (uint256);6 function balanceOf(address account) external view returns (uint256);7 function allowance(address owner, address spender) external view returns (uint256);89 function transfer(address recipient, uint256 amount) external returns (bool);10 function approve(address spender, uint256 amount) external returns (bool);11 function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);121314 event Transfer(address indexed from, address indexed to, uint256 value);15 event Approval(address indexed owner, address indexed spender, uint256 value);16}171819contract ERC20Basic is IERC20 {2021 string public constant name = "ERC20Basic";22 string public constant symbol = "ERC";23 uint8 public constant decimals = 18;242526 mapping(address => uint256) balances;2728 mapping(address => mapping (address => uint256)) allowed;2930 uint256 totalSupply_ = 10 ether;313233 constructor() {34 balances[msg.sender] = totalSupply_;35 }3637 function totalSupply() public override view returns (uint256) {38 return totalSupply_;39 }4041 function balanceOf(address tokenOwner) public override view returns (uint256) {42 return balances[tokenOwner];43 }4445 function transfer(address receiver, uint256 numTokens) public override returns (bool) {46 require(numTokens <= balances[msg.sender]);47 balances[msg.sender] = balances[msg.sender]-numTokens;48 balances[receiver] = balances[receiver]+numTokens;49 emit Transfer(msg.sender, receiver, numTokens);50 return true;51 }5253 function approve(address delegate, uint256 numTokens) public override returns (bool) {54 allowed[msg.sender][delegate] = numTokens;55 emit Approval(msg.sender, delegate, numTokens);56 return true;57 }5859 function allowance(address owner, address delegate) public override view returns (uint) {60 return allowed[owner][delegate];61 }6263 function transferFrom(address owner, address buyer, uint256 numTokens) public override returns (bool) {64 require(numTokens <= balances[owner]);65 require(numTokens <= allowed[owner][msg.sender]);6667 balances[owner] = balances[owner]-numTokens;68 allowed[owner][msg.sender] = allowed[owner][msg.sender]-numTokens;69 balances[buyer] = balances[buyer]+numTokens;70 emit Transfer(owner, buyer, numTokens);71 return true;72 }73}Mostrar todoCopiar
Otra implementación excelente del estándar de token ERC-20 es la implementación de OpenZeppelin ERC-20(opens in a new tab).
Última edición: @nhsz(opens in a new tab), 15 de agosto de 2023