Entenda o contrato inteligente de token ERC-20
Um dos padrões de contrato inteligente mais significativos no Ethereum é conhecido como ERC-20, que surgiu como o padrão técnico usado para todos os contratos inteligentes na blockchain Ethereum para implementações de tokens fungíveis.
O ERC-20 define uma lista comum de regras a que todos os tokens fungíveis de Ethereum devem aderir. Consequentemente, este token padrão capacita os desenvolvedores de todos os tipos para prever com precisão como novos tokens funcionarão dentro do sistema Ethereum maior. Isto simplifica e facilita as tarefas dos desenvolvedores, porque eles podem prosseguir com o seu trabalho. sabendo que cada projeto novo não precisará ser feito toda vez que um novo token for lançado, contanto que o token siga as regras.
Veja aqui, apresentadas como uma interface, as funções que um ERC-20 deve implementar. Se você não tem certeza sobre o que é uma interface, confira nosso artigo sobre a programação OOP no Solidity(opens in a new tab).
1pragma solidity ^0.6.0;23interface IERC20 {45 function totalSupply() external view returns (uint256);6 function balanceOf(address account) external view returns (uint256);7 function allowance(address owner, address spender) external view returns (uint256);89 function transfer(address recipient, uint256 amount) external returns (bool);10 function approve(address spender, uint256 amount) external returns (bool);11 function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);121314 event Transfer(address indexed from, address indexed to, uint256 value);15 event Approval(address indexed owner, address indexed spender, uint256 value);16}Exibir tudoCopiar
Aqui está uma explicação detalhada da utilidade de cada função. Depois disso, apresentaremos uma implementação simples do token ERC-20.
Getters
1function totalSupply() external view returns (uint256);Copiar
Retorna a quantidade de tokens existentes. Esta função é um getter e não modifica o estado do contrato. Tenha em mente que não há "floats" em Solidity. Portanto, a maioria dos tokens adota 18 decimais e retorna a oferta total e outros resultados conforme seguido 1000000000000000000 por 1 token. Nem todos os tokens têm 18 decimais, e isso é algo que você realmente precisa estar atendo ao lidar com tokens.
1function balanceOf(address account) external view returns (uint256);Copiar
Retorna a quantidade de tokens pertencentes a um endereço (account
). Esta função é um getter e não modifica o estado do contrato.
1function allowance(address owner, address spender) external view returns (uint256);Copiar
O padrão ERC-20 permite que um endereço autorize outro endereço a recuperar tokens dele. Este getter retorna o número restante de tokens que o spender
terá permissão para gastar em nome do owner
. Esta função é um getter e não modifica o estado do contrato e deve retornar 0 por padrão.
Funções
1function transfer(address recipient, uint256 amount) external returns (bool);Copiar
Move amount
(a quantidade) de tokens do endereço de chamada da função (msg.sender
) para o endereço do destinatário. Esta função emite o evento de Transfer
definido mais tarde. Se a transferência foi possível, retorna verdadeiro.
1function approve(address spender, uint256 amount) external returns (bool);Copiar
Defina o valor allowance
the spender
que pode ser transferido a partir do saldo da função caller (msg.sender
). Esta função emite o evento de aprovação. A função retorna se o abono foi definido com sucesso.
1function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);Copiar
Move amount
de tokens do sender
para o recipient
usando o mecanismo de abono. o valor é então deduzido do abono do chamador. Esta função emite o evento Transfer
.
Eventos
1event Transfer(address indexed from, address indexed to, uint256 value);Copiar
Este evento é emitido quando a quantidade de tokens (valor) é enviada do endereço from
para o endereço to
.
No caso de criação de novos tokens, a transferência é geralmente do
endereço 0x00..0000, enquanto no caso de queima de tokens a transferência é para
0x00..0000.
1event Approval(address indexed owner, address indexed spender, uint256 value);Copiar
Este evento é emitido quando a quantidade de tokens (value
) é aprovada pelo owner
para ser usada pelo spender
.
Uma implementação básica de tokens ERC-20
Aqui está o código mais simples para basear seu token ERC-20:
1pragma solidity ^0.8.0;23interface IERC20 {45 function totalSupply() external view returns (uint256);6 function balanceOf(address account) external view returns (uint256);7 function allowance(address owner, address spender) external view returns (uint256);89 function transfer(address recipient, uint256 amount) external returns (bool);10 function approve(address spender, uint256 amount) external returns (bool);11 function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);121314 event Transfer(address indexed from, address indexed to, uint256 value);15 event Approval(address indexed owner, address indexed spender, uint256 value);16}171819contract ERC20Basic is IERC20 {2021 string public constant name = "ERC20Basic";22 string public constant symbol = "ERC";23 uint8 public constant decimals = 18;242526 mapping(address => uint256) balances;2728 mapping(address => mapping (address => uint256)) allowed;2930 uint256 totalSupply_ = 10 ether;313233 constructor() {34 balances[msg.sender] = totalSupply_;35 }3637 function totalSupply() public override view returns (uint256) {38 return totalSupply_;39 }4041 function balanceOf(address tokenOwner) public override view returns (uint256) {42 return balances[tokenOwner];43 }4445 function transfer(address receiver, uint256 numTokens) public override returns (bool) {46 require(numTokens <= balances[msg.sender]);47 balances[msg.sender] = balances[msg.sender]-numTokens;48 balances[receiver] = balances[receiver]+numTokens;49 emit Transfer(msg.sender, receiver, numTokens);50 return true;51 }5253 function approve(address delegate, uint256 numTokens) public override returns (bool) {54 allowed[msg.sender][delegate] = numTokens;55 emit Approval(msg.sender, delegate, numTokens);56 return true;57 }5859 function allowance(address owner, address delegate) public override view returns (uint) {60 return allowed[owner][delegate];61 }6263 function transferFrom(address owner, address buyer, uint256 numTokens) public override returns (bool) {64 require(numTokens <= balances[owner]);65 require(numTokens <= allowed[owner][msg.sender]);6667 balances[owner] = balances[owner]-numTokens;68 allowed[owner][msg.sender] = allowed[owner][msg.sender]-numTokens;69 balances[buyer] = balances[buyer]+numTokens;70 emit Transfer(owner, buyer, numTokens);71 return true;72 }73}Exibir tudoCopiar
Outra excelente implementação do padrão ERC-20 é a implementação OpenZeppelin ERC-20(opens in a new tab).
Última edição: @nhsz(opens in a new tab), 15 de agosto de 2023