ERC-20
O padrão ERC-20 é um padrão de tokens na blockchain do Ethereum que define um conjunto comum de regras para os tokens emitidos por meio de contratos inteligentes. Os tokens ERC-20 são ativos digitais que podem representar qualquer coisa, desde moedas virtuais até direitos de voto, passando por certificados de propriedade e muito mais. Esse padrão permite a interoperabilidade entre diferentes aplicativos e contratos no ecossistema Ethereum, facilitando aos desenvolvedores a implementação de tokens que funcionarão de maneira consistente em uma ampla gama de serviços e carteiras.
Um contrato inteligente ERC-20 deve implementar as seguintes funções e eventos:
Funções Requeridas:
totalSupply(): Retorna a quantidade total de tokens existentes.
balanceOf(address account): Mostra a quantidade de tokens que uma endereço especÃfico possui.
transfer(address recipient, uint256 amount): Permite que um endereço envie uma quantidade de tokens para outro.
allowance(address owner, address spender): Mostra a quantidade de tokens que o proprietário permite que outra direção gaste em seu nome.
approve(address spender, uint256 amount): Permite que um gastador retire tokens até um valor máximo.
transferFrom(address sender, address recipient, uint256 amount): Permite que um gastador transfira tokens em nome de outra direção, dentro do limite estabelecido por approve.
Eventos Requeridos:
Transfer(address indexed from, address indexed to, uint256 value): Deve ser emitido quando os tokens forem transferidos de uma direção para outra.
Approval(address indexed owner, address indexed spender, uint256 value): Deve ser emitido quando uma direção aprovar outra para gastar tokens em seu nome.
Aqui está um exemplo simplificado de um contrato ERC-20:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SimpleERC20Token {
string public constant name = "SimpleERC20Token";
string public constant symbol = "SET";
uint8 public constant decimals = 18;
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
mapping(address => uint256) balances;
mapping(address => mapping(address => uint256)) allowed;
uint256 totalSupply_;
constructor(uint256 total) {
totalSupply_ = total;
balances[msg.sender] = totalSupply_;
}
function totalSupply() public view returns (uint256) {
return totalSupply_;
}
function balanceOf(address tokenOwner) public view returns (uint256) {
return balances[tokenOwner];
}
function transfer(address receiver, uint256 numTokens) public returns (bool) {
require(numTokens <= balances[msg.sender]);
balances[msg.sender] = balances[msg.sender] - numTokens;
balances[receiver] = balances[receiver] + numTokens;
emit Transfer(msg.sender, receiver, numTokens);
return true;
}
function approve(address delegate, uint256 numTokens) public returns (bool) {
allowed[msg.sender][delegate] = numTokens;
emit Approval(msg.sender, delegate, numTokens);
return true;
}
function allowance(address owner, address delegate) public view returns (uint) {
return allowed[owner][delegate];
}
function transferFrom(address owner, address buyer, uint256 numTokens) public returns (bool) {
require(numTokens <= balances[owner]);
require(numTokens <= allowed[owner][msg.sender]);
balances[owner] = balances[owner] - numTokens;
allowed[owner][msg.sender] = allowed[owner][msg.sender] - numTokens;
balances[buyer] = balances[buyer] + numTokens;
emit Transfer(owner, buyer, numTokens);
return true;
}
}
Também pode ver a implementação da Open Zeppelin aqui: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol

Last updated