Ir al contenido principal

Entender el contrato inteligente de token ERC

contratos inteligentestókenesSolidityerc-20
Principiante
jdourlens
EthereumDev(opens in a new tab)
5 de abril de 2020
5 minuto leído minute read
comp-tutorial-metadata-tip-author 0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE

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;
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
Copiar

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;
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
Copiar

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: @Sergitxin(opens in a new tab), 1 de abril de 2024

¿Le ha resultado útil este tutorial?