Exercício – Escrever um contrato do token ERC20
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.
- Abra o arquivo truffle-config.js e pesquise a linha
solc
. - 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 comopragma solidity ^0.8.0;
. - Salve o arquivo.
- No Visual Studio Code, selecione Terminal>Novo Terminal para abrir uma janela de terminal.
- 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 queganache-cli
está escutando em 127.0.0.1:8545, a localização da porta padrão definido no seu arquivo truffle-config.js. - Clique com o botão direito do mouse na janela do terminal e selecione Novo Terminal.
- 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.