Lição 4

Explorer le contrat LearnCoin

À la fin de cette leçon, vous devriez être en mesure de : 1. comprendre les principales parties et fonctionnalités du contrat LearnCoin. 2. comprendre le rôle des contrats et des bibliothèques OpenZeppelin dans notre contrat de jeton.

Introduction

Dans la dernière leçon, nous avons déployé notre contrat LearnCoin sur le Goerli Testnet. Dans cette leçon, nous allons explorer en détail les fonctionnalités du contrat LearnCoin et expliquer ce que fait chaque partie.

La structure du contrat

Voici le contrat complet de notre LearnCoin

Python
// SPDX-License-Identifier : None
pragma solidity ^0.8.9 ;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contrats/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contrats/token/ERC20/extensions/ERC20Snapshot.sol";
import "@openzeppelin/contrats/access/AccessControl.sol";
import "@openzeppelin/contrats/security/Pausable.sol";
import "@openzeppelin/contrats/token/ERC20/extensions/draft-ERC20Permit.sol";
import "@openzeppelin/contrats/token/ERC20/extensions/ERC20Votes.sol";
import "@openzeppelin/contrats/token/ERC20/extensions/ERC20FlashMint.sol";

Le contrat LearnCoin est ERC20, ERC20Burnable, ERC20Snapshot, AccessControl, Pausable, ERC20Permit, ERC20Votes, ERC20FlashMint {
 bytes32 public constant SNAPSHOT_ROLE = keccak256("SNAPSHOT_ROLE") ;
 bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE") ;

   constructor() ERC20("Learn Coin", "LC") ERC20Permit("Learn Coin") {
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _grantRole(SNAPSHOT_ROLE, msg.sender);
        _grantRole(PAUSER_ROLE, msg.sender);
        _mint(msg.sender, 21000000 * 10 ** decimals());
    }

    function snapshot() public onlyRole(SNAPSHOT_ROLE) {
        _snapshot();
    }

    function pause() public onlyRole(PAUSER_ROLE) {
        _pause();
    }

    function unpause() public onlyRole(PAUSER_ROLE) {
        _unpause();
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount)
 internal
 whenNotPaused
 override(ERC20, ERC20Snapshot)
    {
        super._beforeTokenTransfer(from, to, amount);
    }

    // Les fonctions suivantes sont des surcharges requises par Solidity.

    function _afterTokenTransfer(address from, address to, uint256 amount)
 internal
 override(ERC20, ERC20Votes)
    {
        super._afterTokenTransfer(from, to, amount);
    }

    function _mint(address to, uint256 amount)
 internal
 override(ERC20, ERC20Votes)
    {
        super._mint(to, amount);
    }

    function _burn(address account, uint256 amount)
 internal
 override(ERC20, ERC20Votes)
    {
        super._burn(account, amount);
    }
}

Le contrat que vous avez déployé est un contrat à jeton ERC20 nommé LearnCoin. Il inclut plusieurs fonctionnalités de la bibliothèque de contrats d'OpenZeppelin, telles que les jetons à brûler, les instantanés, le contrôle d'accès, les jetons pausables, la fonctionnalité de permis, les votes et la menthe flash.

Déclarations d'importation de contrats

Les déclarations d'importation au début du contrat permettent d'intégrer le code de la bibliothèque de contrats d'OpenZeppelin :

  • ERC20.sol est le contrat de base pour les jetons ERC20.
  • ERC20Burnable.sol ajoute la possibilité pour les détenteurs de jetons de détruire leurs propres jetons.
  • ERC20Snapshot.sol permet de créer des instantanés des soldes de jetons.
  • AccessControl.sol est un module contractuel permettant de gérer l'accès à certaines fonctionnalités.
  • Pausable.sol ajoute la possibilité de mettre en pause et d'annuler les transferts de jetons.
  • ERC20Permit.sol permet aux détenteurs de dépenser les jetons des utilisateurs par le biais de permis.
  • ERC20Votes.sol ajoute des capacités de vote au jeton.
  • ERC20FlashMint.sol permet de frapper des jetons en flash.

Déclaration du contrat LearnCoin

Le contrat LearnCoin hérite des contrats OpenZeppelin importés. Cela signifie qu'il disposera de toutes les méthodes et propriétés de ces contrats.

Déclarations de rôle

SNAPSHOT_ROLE et PAUSER_ROLE sont des valeurs constantes (créées à l'aide de la fonction de hachage keccak256 ) qui représentent des rôles spécifiques pour le contrôle d'accès au sein du contrat.

La fonction constructeur

Lorsque le contrat LearnCoin est déployé, la fonction constructeur est appelée. Il définit le nom et le symbole du jeton, accorde au compte de déploiement (msg.sender) les rôles admin, snapshot et pauser, et frappe une première quantité de jetons pour le compte de déploiement.

Fonctions supplémentaires

L'instantané, la pause et l'annulation de la pause sont des fonctions qui permettent aux comptes ayant les rôles correspondants d'effectuer certaines actions. snapshot permet de réaliser un instantané, pause et unpause permettent d'arrêter et de redémarrer les transferts de jetons.

Remplacements

Les fonctions _beforeTokenTransfer, _afterTokenTransfer, _mint et _burn sont des fonctions internes qui sont surchargées à partir des contrats parents. Ils mettent en œuvre une logique personnalisée pour le contrat LearnCoin.

  • _beforeTokenTransfer: Cette fonction est appelée avant tout transfert de jetons. Il garantit que les transferts de jetons ne sont pas interrompus.
  • _afterTokenTransfer: Cette fonction est appelée après tout transfert de jetons. Il s'agit d'une fonction vide ici, mais elle peut être utilisée pour une logique personnalisée qui doit se produire juste après les transferts.
  • _mint: Cette fonction crée de nouveaux jetons et les attribue à un compte donné.
  • _burn: Cette fonction détruit les jetons d'un compte donné.

Conclusion

Il s'agit d'une présentation rapide de votre contrat LearnCoin. Une fois le contrat déployé, vous êtes prêt à interagir avec lui, ce que nous verrons dans la prochaine leçon.

Exclusão de responsabilidade
* O investimento em criptomoedas envolve riscos significativos. Prossiga com cuidado. O curso não pretende ser um conselho de investimento.
* O curso é criado pelo autor que se juntou ao Gate Learn. Qualquer opinião partilhada pelo autor não representa o Gate Learn.
Catálogo
Lição 4

Explorer le contrat LearnCoin

À la fin de cette leçon, vous devriez être en mesure de : 1. comprendre les principales parties et fonctionnalités du contrat LearnCoin. 2. comprendre le rôle des contrats et des bibliothèques OpenZeppelin dans notre contrat de jeton.

Introduction

Dans la dernière leçon, nous avons déployé notre contrat LearnCoin sur le Goerli Testnet. Dans cette leçon, nous allons explorer en détail les fonctionnalités du contrat LearnCoin et expliquer ce que fait chaque partie.

La structure du contrat

Voici le contrat complet de notre LearnCoin

Python
// SPDX-License-Identifier : None
pragma solidity ^0.8.9 ;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contrats/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contrats/token/ERC20/extensions/ERC20Snapshot.sol";
import "@openzeppelin/contrats/access/AccessControl.sol";
import "@openzeppelin/contrats/security/Pausable.sol";
import "@openzeppelin/contrats/token/ERC20/extensions/draft-ERC20Permit.sol";
import "@openzeppelin/contrats/token/ERC20/extensions/ERC20Votes.sol";
import "@openzeppelin/contrats/token/ERC20/extensions/ERC20FlashMint.sol";

Le contrat LearnCoin est ERC20, ERC20Burnable, ERC20Snapshot, AccessControl, Pausable, ERC20Permit, ERC20Votes, ERC20FlashMint {
 bytes32 public constant SNAPSHOT_ROLE = keccak256("SNAPSHOT_ROLE") ;
 bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE") ;

   constructor() ERC20("Learn Coin", "LC") ERC20Permit("Learn Coin") {
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _grantRole(SNAPSHOT_ROLE, msg.sender);
        _grantRole(PAUSER_ROLE, msg.sender);
        _mint(msg.sender, 21000000 * 10 ** decimals());
    }

    function snapshot() public onlyRole(SNAPSHOT_ROLE) {
        _snapshot();
    }

    function pause() public onlyRole(PAUSER_ROLE) {
        _pause();
    }

    function unpause() public onlyRole(PAUSER_ROLE) {
        _unpause();
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount)
 internal
 whenNotPaused
 override(ERC20, ERC20Snapshot)
    {
        super._beforeTokenTransfer(from, to, amount);
    }

    // Les fonctions suivantes sont des surcharges requises par Solidity.

    function _afterTokenTransfer(address from, address to, uint256 amount)
 internal
 override(ERC20, ERC20Votes)
    {
        super._afterTokenTransfer(from, to, amount);
    }

    function _mint(address to, uint256 amount)
 internal
 override(ERC20, ERC20Votes)
    {
        super._mint(to, amount);
    }

    function _burn(address account, uint256 amount)
 internal
 override(ERC20, ERC20Votes)
    {
        super._burn(account, amount);
    }
}

Le contrat que vous avez déployé est un contrat à jeton ERC20 nommé LearnCoin. Il inclut plusieurs fonctionnalités de la bibliothèque de contrats d'OpenZeppelin, telles que les jetons à brûler, les instantanés, le contrôle d'accès, les jetons pausables, la fonctionnalité de permis, les votes et la menthe flash.

Déclarations d'importation de contrats

Les déclarations d'importation au début du contrat permettent d'intégrer le code de la bibliothèque de contrats d'OpenZeppelin :

  • ERC20.sol est le contrat de base pour les jetons ERC20.
  • ERC20Burnable.sol ajoute la possibilité pour les détenteurs de jetons de détruire leurs propres jetons.
  • ERC20Snapshot.sol permet de créer des instantanés des soldes de jetons.
  • AccessControl.sol est un module contractuel permettant de gérer l'accès à certaines fonctionnalités.
  • Pausable.sol ajoute la possibilité de mettre en pause et d'annuler les transferts de jetons.
  • ERC20Permit.sol permet aux détenteurs de dépenser les jetons des utilisateurs par le biais de permis.
  • ERC20Votes.sol ajoute des capacités de vote au jeton.
  • ERC20FlashMint.sol permet de frapper des jetons en flash.

Déclaration du contrat LearnCoin

Le contrat LearnCoin hérite des contrats OpenZeppelin importés. Cela signifie qu'il disposera de toutes les méthodes et propriétés de ces contrats.

Déclarations de rôle

SNAPSHOT_ROLE et PAUSER_ROLE sont des valeurs constantes (créées à l'aide de la fonction de hachage keccak256 ) qui représentent des rôles spécifiques pour le contrôle d'accès au sein du contrat.

La fonction constructeur

Lorsque le contrat LearnCoin est déployé, la fonction constructeur est appelée. Il définit le nom et le symbole du jeton, accorde au compte de déploiement (msg.sender) les rôles admin, snapshot et pauser, et frappe une première quantité de jetons pour le compte de déploiement.

Fonctions supplémentaires

L'instantané, la pause et l'annulation de la pause sont des fonctions qui permettent aux comptes ayant les rôles correspondants d'effectuer certaines actions. snapshot permet de réaliser un instantané, pause et unpause permettent d'arrêter et de redémarrer les transferts de jetons.

Remplacements

Les fonctions _beforeTokenTransfer, _afterTokenTransfer, _mint et _burn sont des fonctions internes qui sont surchargées à partir des contrats parents. Ils mettent en œuvre une logique personnalisée pour le contrat LearnCoin.

  • _beforeTokenTransfer: Cette fonction est appelée avant tout transfert de jetons. Il garantit que les transferts de jetons ne sont pas interrompus.
  • _afterTokenTransfer: Cette fonction est appelée après tout transfert de jetons. Il s'agit d'une fonction vide ici, mais elle peut être utilisée pour une logique personnalisée qui doit se produire juste après les transferts.
  • _mint: Cette fonction crée de nouveaux jetons et les attribue à un compte donné.
  • _burn: Cette fonction détruit les jetons d'un compte donné.

Conclusion

Il s'agit d'une présentation rapide de votre contrat LearnCoin. Une fois le contrat déployé, vous êtes prêt à interagir avec lui, ce que nous verrons dans la prochaine leçon.

Exclusão de responsabilidade
* O investimento em criptomoedas envolve riscos significativos. Prossiga com cuidado. O curso não pretende ser um conselho de investimento.
* O curso é criado pelo autor que se juntou ao Gate Learn. Qualquer opinião partilhada pelo autor não representa o Gate Learn.