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.
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.
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.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.
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.
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.
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.
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é.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.
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.
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.
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.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.
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.
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.
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.
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é.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.