Passer au contenu principal

Comprendre le contrat intelligent de jeton ERC-20

contrats intelligents
jetons
Solidity
erc-20
Débutant
jdourlens
5 avril 2020
5 minutes de lecture

L'une des normes de contrat intelligent les plus importantes sur Ethereum est connue sous le nom d'ERC-20. Elle s'est imposée comme la norme technique utilisée pour tous les contrats intelligents sur la blockchain Ethereum pour les implémentations de jetons fongibles.

L'ERC-20 définit une liste commune de règles auxquelles tous les jetons Ethereum fongibles doivent adhérer. Par conséquent, cette norme de jeton permet aux développeurs de tous types de prédire avec précision comment les nouveaux jetons fonctionneront au sein du système Ethereum. Cela simplifie et facilite la tâche des développeurs, car ils peuvent poursuivre leur travail, sachant que les projets n'auront pas besoin d'être refaits à chaque sortie d'un nouveau jeton, tant que ce dernier respecte les règles.

Voici, présentées sous forme d'interface, les fonctions qu'un ERC-20 doit mettre en œuvre. Si vous n'êtes pas sûr de ce qu'est une interface, consultez notre article sur la programmation orientée objet dans 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}
Afficher tout

Voici une explication ligne par ligne de ce à quoi sert chaque fonction. Après cela, nous présenterons une implémentation simple du jeton ERC-20.

Getters

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

Renvoie le nombre total de jetons existants. Cette fonction est un getter et ne modifie pas l'état du contrat. Gardez à l'esprit qu'il n'y a pas de nombres à virgule flottante dans Solidity. Par conséquent, la plupart des jetons adoptent 18 décimales et renvoient l'offre totale et d'autres résultats sous la forme 1000000000000000000 pour 1 jeton. Tous les jetons n'ont pas 18 décimales, et c'est un point auquel vous devez vraiment faire attention lorsque vous manipulez des jetons.

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

Renvoie la quantité de jetons détenus par une adresse (compte). Cette fonction est un getter et ne modifie pas l'état du contrat.

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

La norme ERC-20 permet à une adresse de donner une allocation (« allowance ») à une autre adresse afin que cette dernière puisse en retirer des jetons. Ce getter renvoie le nombre de jetons restants que le spender sera autorisé à dépenser au nom du owner. Cette fonction est un getter, ne modifie pas l'état du contrat et doit renvoyer 0 par défaut.

Fonctions

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

Déplace la quantité (amount) de jetons de l'adresse de l'appelant de la fonction (msg.sender) à l'adresse du destinataire. Cette fonction émet l'événement Transfer défini plus loin. Elle renvoie true si le transfert a été possible.

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

Définit le montant de l'allowance que le spender est autorisé à transférer depuis le solde de l'appelant de la fonction (msg.sender). Cette fonction émet l'événement Approval. La fonction renvoie une valeur indiquant si l'allocation a été définie avec succès.

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

Déplace la quantité (amount) de jetons de sender à recipient en utilisant le mécanisme d'allocation. La quantité amount est ensuite déduite de l'allocation de l'appelant. Cette fonction émet l'événement Transfer.

Événements

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

Cet événement est émis lorsque la quantité de jetons (value) est envoyée de l'adresse from à l'adresse to.

En cas de frappe de nouveaux jetons, le transfert est généralement from l'adresse 0x00..0000, tandis qu'en cas de destruction (« burn ») de jetons, le transfert est to l'adresse 0x00..0000.

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

Cet événement est émis lorsque la quantité de jetons (value) est approuvée par le owner pour être utilisée par le spender.

Une implémentation basique des jetons ERC-20

Voici le code le plus simple sur lequel baser votre jeton 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}
Afficher tout

Une autre excellente implémentation de la norme de jeton ERC-20 est l'implémentation ERC-20 d'OpenZeppelin (opens in a new tab).

Dernière mise à jour de la page : 21 août 2025

Ce tutoriel vous a été utile ?