Ir al contenido principal

Comprender el contrato inteligente del token ERC-20

contratos Inteligentes
tókenes
Solidity
erc-20
Principiante
jdourlens
5 de abril de 2020
5 minuto leído

Uno de los estándares de contratos inteligentes más significativos de Ethereum es el 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 tokens fungibles.

ERC-20 define una lista común de reglas a las que todos los tokens fungibles de Ethereum deben adherirse. En consecuencia, este estándar de token permite a los desarrolladores de todo tipo predecir con precisión cómo funcionarán los nuevos tokens dentro del sistema Ethereum en general. Esto simplifica y facilita las tareas de los desarrolladores, porque pueden continuar con su trabajo sabiendo que no será necesario rehacer cada nuevo proyecto cada vez que se lance un nuevo token, siempre que el token siga las reglas.

A continuación se presentan, a modo de interfaz, las funciones que un ERC-20 debe implementar. Si no está seguro de lo que es una interfaz, consulte nuestro artículo sobre la programación orientada a objetos (POO) en Solidityopens in a new tab.

1pragma solidity ^0.6.0;
2
3interface IERC20 {
4
5 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);
8
9 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);
12
13
14 event Transfer(address indexed from, address indexed to, uint256 value);
15 event Approval(address indexed owner, address indexed spender, uint256 value);
16}
Mostrar todo

A continuación, se ofrece una explicación línea por línea de la finalidad de cada función. Después de esto, presentaremos una implementación sencilla del token ERC-20.

Getters

1function totalSupply() external view returns (uint256);

Devuelve la cantidad de tokens existentes. Esta función es un «getter» y no modifica el estado del contrato. Tenga en cuenta que en Solidity no existen los números de punto flotante (conocidos como «floats»). Por lo tanto, la mayoría de los tokens adoptan 18 decimales y devolverán el suministro total y otros resultados como 1000000000000000000 para 1 token. No todos los tokens tienen 18 decimales y esto es algo a lo que debe prestar mucha atención cuando trabaje con tokens.

1function balanceOf(address account) external view returns (uint256);

Devuelve la cantidad de tokens que posee una dirección (account). Esta función es un «getter» y no modifica el estado del contrato.

1function allowance(address owner, address spender) external view returns (uint256);

El estándar ERC-20 permite que una dirección dé una asignación («allowance») a otra dirección para poder retirar tokens de ella. Este «getter» devuelve el número restante de tokens que el spender podrá gastar en nombre del owner. Esta función es un «getter», no modifica el estado del contrato y debería devolver 0 por defecto.

Funciones

1function transfer(address recipient, uint256 amount) external returns (bool);

Mueve la amount (cantidad) de tokens desde la dirección de quien llama a la función (msg.sender) a la dirección del destinatario. Esta función emite el evento Transfer que se define más adelante. Devuelve true si la transferencia fue posible.

1function approve(address spender, uint256 amount) external returns (bool);

Establece la cantidad de allowance (asignación) que el spender tiene permitido transferir desde el saldo de quien llama a la función (msg.sender). Esta función emite el evento Approval. La función devuelve un valor que indica si la asignación (allowance) se estableció con éxito.

1function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

Mueve la amount (cantidad) de tokens de sender a recipient utilizando el mecanismo de asignación (allowance). La amount (cantidad) se deduce entonces de la asignación (allowance) de quien llama. Esta función emite el evento Transfer.

Eventos

1event Transfer(address indexed from, address indexed to, uint256 value);

Este evento se emite cuando la cantidad de tokens (value) se envía desde la dirección from a la dirección to.

En el caso de acuñar nuevos tokens, la transferencia suele ser from la dirección 0x00..0000, mientras que en el caso de quemar tokens, la transferencia es to 0x00..0000.

1event Approval(address indexed owner, address indexed spender, uint256 value);

Este evento se emite cuando el owner aprueba la cantidad de tokens (value) que puede usar el spender.

Una implementación básica de los tokens ERC-20

Este es el código más sencillo en el que puede basar su token ERC-20:

1pragma solidity ^0.8.0;
2
3interface IERC20 {
4
5 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);
8
9 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);
12
13
14 event Transfer(address indexed from, address indexed to, uint256 value);
15 event Approval(address indexed owner, address indexed spender, uint256 value);
16}
17
18
19contract ERC20Basic is IERC20 {
20
21 string public constant name = "ERC20Basic";
22 string public constant symbol = "ERC";
23 uint8 public constant decimals = 18;
24
25
26 mapping(address => uint256) balances;
27
28 mapping(address => mapping (address => uint256)) allowed;
29
30 uint256 totalSupply_ = 10 ether;
31
32
33 constructor() {
34 balances[msg.sender] = totalSupply_;
35 }
36
37 function totalSupply() public override view returns (uint256) {
38 return totalSupply_;
39 }
40
41 function balanceOf(address tokenOwner) public override view returns (uint256) {
42 return balances[tokenOwner];
43 }
44
45 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 }
52
53 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 }
58
59 function allowance(address owner, address delegate) public override view returns (uint) {
60 return allowed[owner][delegate];
61 }
62
63 function transferFrom(address owner, address buyer, uint256 numTokens) public override returns (bool) {
64 require(numTokens <= balances[owner]);
65 require(numTokens <= allowed[owner][msg.sender]);
66
67 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 todo

Otra excelente implementación del estándar de token ERC-20 es la implementación de ERC-20 de OpenZeppelinopens in a new tab.

Última actualización de la página: 21 de agosto de 2025

¿Le ha resultado útil este tutorial?