Na última lição, implantamos o nosso contrato LearnCoin na 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;
import " @openzeppelin /contracts/token/ERC20/ERC20.sol";
importar " @openzeppelin /contracts/token/ERC20/Extensions/ERC20Burnable.sol";
importar " @openzeppelin /contracts/token/ERC20/Extensions/ERC20Snapshot.sol";
import " @openzeppelin /contracts/access/accesscontrol.sol";
import " @openzeppelin /contracts/security/pausable.sol";
import " @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, ERC20Permits, ERC20Votos, ERC20FlashMint {
 bytes32 constante pública SNAPSHOT_ROLE = keccak256 (SNAPSHOT_ROLE); " "
 bytes32 constante pública PAUSER_ROLE = keccak256 (PAUSER_ROLE); " "
 construtor () ERC20 ("Learn Coin", " LC") ERC20Permitt (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();
    }
    função unpause () public onlyRole (PAUSER_ROLE) {
        _unpause();
    }
    função _beforTokenTransfer (endereço de, endereço para, valor uint256)
 interno
 Quando não está em pausa
 substituir (ERC20, ERC20Snapshot)
    {
        super._beforeTokenTransfer(from, to, amount);
    }
    //As seguintes funções são substituições exigidas pelo Solidity.
    função _AfterTokenTransfer (endereço de, endereço para, valor uint256)
 interno
 substituir (ERC20, ERC20 votos)
    {
        super._afterTokenTransfer(from, to, amount);
    }
    função _mint (endereço para, valor uint256)
 interno
 substituir (ERC20, ERC20 votos)
    {
        super._mint(to, amount);
    }
    função _burn (conta de endereço, valor uint256)
 interno
 substituir (ERC20, ERC20 votos)
    {
        super._burn(account, amount);
    }
}
O contrato que implementou é um contrato de token ERC20 chamado LearnCoin. Inclui várias funcionalidades da biblioteca de contratos do OpenZeppelin, tais como tokens queimáveis, instantâneos, controlo de acesso, tokens pausáveis, funcionalidade de permissão, votos e flash mint.
As declarações de importação no início do contrato extraem o código da biblioteca de contratos do OpenZeppelin:
ERC20.sol é o contrato base para os tokens ERC20.ERC20Burnable.sol adiciona a capacidade dos detentores de tokens destruírem os 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 gerir o acesso a determinadas funcionalidades.Pausable.sol adiciona a capacidade de pausar e não pausar transferências de token.ERC20Permit.sol permite que os titulares gastem os tokens do utilizador através de autorizações.ERC20Votes.sol adiciona capacidades de votação ao token.ERC20FlashMint.sol permite a cunelagem flash de tokens.O contrato LearnCoin herda dos contratos OpenZeppelin importados. Isto 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 o controlo de acesso dentro do contrato.
Quando o contrato da LearnCoin é implementado, a função de construtor chama-se. Define o nome e o símbolo do token, concede à conta de implantação (msg.sender) as funções de administrador, instantâneo e pauser e cunha 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. instantâneo permite que um instantâneo seja feito, pausar e não pausar permitem parar e reiniciar as transferências de token.
As funções _ForeTokenTransfer, _AfterTokenTransfer, _mint e _burn são funções internas que são substituídas dos contratos-pai. Implementam lógica personalizada para o contrato da LearnCoin.
_befeTokenTransfer: Esta função é chamada antes de qualquer transferência de tokens. Garante que as transferências de tokens 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 atribui-os 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 implementado, agora está pronto para interagir com ele, o que abordamos na próxima lição.