Passer au contenu principal

Transferts et approbation de jetons ERC-20 à partir d'un contrat intelligent Solidity

contrats intelligents
jetons
Solidity
erc-20
Intermédiaire
jdourlens
7 avril 2020
7 minutes de lecture

Dans le tutoriel précédent, nous avons étudié l'anatomie d'un jeton ERC-20 dans Solidity sur la blockchain Ethereum. Dans cet article, nous verrons comment nous pouvons utiliser un contrat intelligent pour interagir avec un jeton en utilisant le langage Solidity.

Pour ce contrat intelligent, nous allons créer un véritable échange décentralisé factice où un utilisateur pourra échanger de l'éther contre notre jeton ERC-20 nouvellement déployé.

Pour ce tutoriel, nous utiliserons le code que nous avons écrit dans le tutoriel précédent comme base. Notre DEX instanciera une instance du contrat dans son constructeur et effectuera les opérations suivantes :

  • échanger des jetons contre de l'éther
  • échanger de l'éther contre des jetons

Nous allons commencer le code de notre échange décentralisé en ajoutant notre base de code ERC20 simple :

Notre nouveau contrat intelligent DEX déploiera l'ERC-20 et obtiendra toute la réserve de jetons :

Nous avons donc maintenant notre DEX et il dispose de toute la réserve de jetons. Le contrat a deux fonctions :

  • buy : L'utilisateur peut envoyer de l'éther et obtenir des jetons en échange
  • sell : L'utilisateur peut envoyer des jetons pour récupérer de l'éther

La fonction buy

Codons la fonction buy. Nous devrons d'abord vérifier la quantité d'éther que le message contient et vérifier que le contrat possède suffisamment de jetons et que le message contient bien de l'éther. Si le contrat possède suffisamment de jetons, il enverra le nombre de jetons à l'utilisateur et émettra l'événement Bought.

Notez que si nous appelons la fonction require, en cas d'erreur, l'éther envoyé sera directement annulé et rendu à l'utilisateur.

Pour simplifier, nous échangeons simplement 1 jeton contre 1 wei.

function buy() payable public {
    uint256 amountTobuy = msg.value;
    uint256 dexBalance = token.balanceOf(address(this));
    require(amountTobuy > 0, "Vous devez envoyer de l'éther");
    require(amountTobuy <= dexBalance, "Pas assez de jetons dans la réserve");
    token.transfer(msg.sender, amountTobuy);
    emit Bought(amountTobuy);
}

Si l'achat réussit, nous devrions voir deux événements dans la transaction : l'événement de jeton Transfer et l'événement Bought.

Deux événements dans la transaction : Transfer et Bought

La fonction sell

La fonction responsable de la vente exigera d'abord que l'utilisateur ait approuvé le montant en appelant au préalable la fonction approve. L'approbation du transfert exige que le jeton ERC20Basic instancié par le DEX soit appelé par l'utilisateur. Cela peut être réalisé en appelant d'abord la fonction token() du contrat DEX pour récupérer l'adresse où le DEX a déployé le contrat ERC20Basic appelé token. Ensuite, nous créons une instance de ce contrat dans notre session et appelons sa fonction approve. Ensuite, nous pouvons appeler la fonction sell du DEX et échanger nos jetons contre de l'éther. Par exemple, voici à quoi cela ressemble dans une session interactive de Brownie :

Ensuite, lorsque la fonction sell est appelée, nous vérifierons si le transfert depuis l'adresse de l'appelant vers l'adresse du contrat a réussi, puis nous renverrons l'éther à l'adresse de l'appelant.

function sell(uint256 amount) public {
    require(amount > 0, "Vous devez vendre au moins quelques jetons");
    uint256 allowance = token.allowance(msg.sender, address(this));
    require(allowance >= amount, "Vérifiez l'allocation de jetons");
    token.transferFrom(msg.sender, address(this), amount);
    payable(msg.sender).transfer(amount);
    emit Sold(amount);
}

Si tout fonctionne, vous devriez voir 2 événements (un Transfer et un Sold) dans la transaction, et votre solde de jetons ainsi que votre solde d'éther mis à jour.

Deux événements dans la transaction : Transfer et Sold

Dans ce tutoriel, nous avons vu comment vérifier le solde et l'allocation d'un jeton ERC-20, ainsi que la manière d'appeler Transfer et TransferFrom d'un contrat intelligent ERC20 en utilisant l'interface.

Une fois que vous avez effectué une transaction, nous avons un tutoriel JavaScript pour attendre et obtenir les détails sur les transactions (opens in a new tab) qui ont été effectuées sur votre contrat et un tutoriel pour décoder les événements générés par les transferts de jetons ou tout autre événement (opens in a new tab) tant que vous avez l'ABI.

Voici le code complet du tutoriel :

Dernière mise à jour de la page : 3 mars 2026

Ce tutoriel vous a-t-il été utile ?