Na última lição, implantamos nosso contrato LearnCoin no Goerli Testnet. Nesta lição, exploraremos detalhadamente as funcionalidades do contrato LearnCoin e explicaremos o que cada parte faz.
Este é o contrato completo do nosso LearnCoin
Python 
 // Identificador de licença SPDX: Nenhum 
 solidez do pragma ^0.8.9; 
 importar "@openzeppelin/contracts/token/ERC20/ERC20.sol";
importar "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
importar "@openzeppelin/contracts/token/ERC20/extensions/ERC20Snapshot.sol";
importar "@openzeppelin/contracts/access/AccessControl.sol";
importar "@openzeppelin/contracts/security/Pausable.sol";
importar "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol";
importar "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";
importar "@openzeppelin/contracts/token/ERC20/extensions/ERC20FlashMint.sol";
contrato LearnCoin é ERC20, ERC20Burnable, ERC20Snapshot, AccessControl, Pausable, ERC20Permit, ERC20Votes, ERC20FlashMint { 
 bytes32 constante pública SNAPSHOT_ROLE = keccak256("SNAPSHOT_ROLE"); 
 bytes32 constante pública PAUSER_ROLE = keccak256("PAUSER_ROLE"); 
 construtor() ERC20("Aprender Moeda", "LC") ERC20Permit("Aprender Moeda") {
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _grantRole(SNAPSHOT_ROLE, msg.sender);
        _grantRole(PAUSER_ROLE, msg.sender);
        _mint(msg.sender, 21000000 * 10 ** decimals());
    }
    função snapshot() public onlyRole(SNAPSHOT_ROLE) {
        _snapshot();
    }
    função 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);
    }
    // As seguintes funções são substituições exigido pelo Solidity.
    função _afterTokenTransfer (endereço de, endereço para, quantidade uint256) 
 substituição interna 
 (ERC20, ERC20Votes)
    {
        super._afterTokenTransfer(from, to, amount);
    }
    função _mint (endereço para, quantidade uint256) 
 substituição interna 
 (ERC20, ERC20Votes)
    {
        super._mint(to, amount);
    }
    função _burn (endereço da conta, valor uint256) 
 substituição interna 
 (ERC20, ERC20Votes)
    {
        super._burn(account, amount);
    }
}
O contrato que você implantou é um contrato de token ERC20 denominado LearnCoin. Inclui vários recursos da biblioteca de contratos do OpenZeppelin, como tokens queimáveis, instantâneos, controle de acesso, tokens pausáveis, funcionalidade de permissão, votos e flash mint.
As instruções de importação no início do contrato extraem código da biblioteca de contratos do OpenZeppelin:
ERC20.sol é o contrato base para tokens ERC20.ERC20Burnable.sol adiciona a capacidade dos detentores de tokens destruirem seus próprios tokens.ERC20Snapshot.sol permite a criação de instantâneos de saldos de tokens.AccessControl.sol é um módulo de contrato para gerenciar o acesso a determinadas funcionalidades.Pausable.sol adiciona a capacidade de pausar e retomar transferências de token.ERC20Permit.sol permite que os titulares gastem os tokens do usuário por meio de licenças.ERC20Votes.sol adiciona recursos de votação ao token.ERC20FlashMint.sol permite a cunhagem flash de tokens.O contrato LearnCoin é herdado dos contratos importados do OpenZeppelin. Isso significa que terá todos os métodos e propriedades desses contratos.
SNAPSHOT_ROLE e PAUSER_ROLE são valores constantes (criados usando a função hash keccak256 ) que representam funções específicas para controle de acesso dentro do contrato.
Quando o contrato LearnCoin é implantado, a função construtora é chamada. Ele define o nome e o símbolo do token, concede à conta de implantação (msg.sender) as funções de administrador, instantâneo e pausador e fornece um suprimento inicial de tokens para a conta de implantação.
snapshot, pause e unpause são funções que permitem que contas com as funções correspondentes executem determinadas ações. snapshot permite que um snapshot seja feito, pause e unpause permite parar e reiniciar transferências de token.
As funções _beforeTokenTransfer, _afterTokenTransfer, _mint e _burn são funções internas substituídas dos contratos pai. Eles implementam lógica personalizada para o contrato LearnCoin.
_beforeTokenTransfer: Esta função é chamada antes de qualquer transferência de tokens. Ele garante que as transferências de token não sejam pausadas._afterTokenTransfer: Esta função é chamada após qualquer transferência de tokens. É uma função vazia aqui, mas pode ser usada para lógica personalizada que deve acontecer logo após as transferências._mint: Esta função cria novos tokens e os atribui a uma determinada conta._burn: Esta função destrói tokens de uma determinada conta.Esta foi uma rápida visão geral do seu contrato LearnCoin . Com o contrato implantado, você está pronto para interagir com ele, o que abordaremos na próxima lição.