Exercício – Escrever um contrato do token ERC20

Concluído

Agora que temos um projeto básico configurado, vamos criar um contrato de token usando o padrão de token ERC20 no OpenZeppelin.

Criar o contrato de token

Vamos criar um contrato de token para recompensar mineradores por terem criados blocos no blockchain.

Para começar, abra o projeto Token20 no Visual Studio Code. Quando o projeto estiver aberto, no Explorer, clique com o botão direito do mouse na pasta contratos e selecione Novo Arquivo. Salve o nome do arquivo como ERC20MinerReward.sol. Cole o seguinte código nesse contrato:

// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract ERC20MinerReward is ERC20 {

    event LogNewAlert(string description, address indexed _from, uint256 _n);

    constructor() public ERC20("MinerReward", "MRW") {}

    function _reward() public {
        _mint(block.coinbase, 20);
        emit LogNewAlert('_rewarded', block.coinbase, block.number);
    }
}

Compreender o código

Agora, vamos examinar as partes deste contrato.

Primeiro, importamos o contrato do OpenZeppelin que desejamos usar após a diretiva pragma. A cadeia de caracteres import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; permite que o contrato localize a definição de contrato ERC20 que usaremos no nosso contrato.

Em seguida, definimos um evento chamado LogNewAlert, que será emitido ou chamado posteriormente no contrato.

O construtor define um novo token ERC20 chamado MinerReward usando o símbolo MRW. Quando um contrato for criado, esse novo token será gerado.

Quando a função reward for chamada, o minerador do bloco atual, block.coinbase, receberá 20 tokens de MRW para realizar a mineração desse bloco e um evento será emitido.

Criar o contrato

Depois de salvar o arquivo de contrato, você estará pronto para criar o contrato. Vamos usar a CLI do Ganache como o seu blockchain pessoal para desenvolvimento. Usaremos o Truffle para executar o build.

  1. Abra o arquivo truffle-config.js e pesquise a linha solc.
  2. Na seção solc, verifique se o valor da versão é 0.8.11 ou maior. Esse número de versão é necessário porque os contratos do OpenZeppelin especificam a diretiva pragma como pragma solidity ^0.8.0;.
  3. Salve o arquivo.
  4. No Visual Studio Code, selecione Terminal>Novo Terminal para abrir uma janela de terminal.
  5. No terminal, insira ganache-cli para iniciar a CLI do Ganache. As informações de aproximadamente dez contas são geradas para testes, seguidas pelas chaves privadas da conta e outros metadados sobre o servidor de desenvolvimento. A última linha informa que ganache-cli está escutando em 127.0.0.1:8545, a localização da porta padrão definido no seu arquivo truffle-config.js.
  6. Clique com o botão direito do mouse na janela do terminal e selecione Novo Terminal.
  7. Na nova janela do terminal, insira truffle build.

As mensagens do compilador semelhantes à seguinte saída devem aparecer na janela do terminal:

$ truffle build
No build configuration found. Preparing to compile contracts.

Compiling your contracts...
===========================
√ Fetching solc version list from solc-bin. Attempt #1
√ Downloading compiler. Attempt #1.
> Compiling @openzeppelin\contracts\token\ERC20\ERC20.sol
> Compiling @openzeppelin\contracts\token\ERC20\IERC20.sol
> Compiling @openzeppelin\contracts\token\ERC20\extensions\IERC20Metadata.sol
> Compiling @openzeppelin\contracts\utils\Context.sol
> Compiling .\contracts\ERC20MinerReward.sol
> Compiling .\contracts\Migrations.sol
> Artifacts written to /Users/username/Projects/Token20/build/contracts
> Compiled successfully using:
   - solc: 0.8.11+commit.d7f03943.Emscripten.clang

Observe que, além dos contratos definidos na pasta de contratos, os contratos em @openzeppelin/contracts também são compilados. Certifique-se de que o build tenha sido concluído com êxito antes de prosseguir.

Conclusão

Este exemplo é uma implementação básica e direta de um token ERC20. Você pode ver como é fácil escrever os próprios contratos de token que herdam funções e eventos de um padrão de token ERC definido.

É importante lembrar que o termo token é simplesmente uma metáfora. Ele se refere aos ativos ou direitos de acesso que são gerenciados coletivamente por uma rede de computadores ou por uma rede de blockchain. Os tokens são um item importante para incorporar à sua rede de blockchain.

Para se familiarizar mais com tokens, explore os outros contratos de token que estão disponíveis no OpenZeppelin. Tente criar os próprios contratos de token.