ERC20: O que é, como funciona e como criar seu token na prática

ERC20: O que é, como funciona e como criar seu token na prática

O padrão ERC‑20 é a espinha dorsal da maioria dos tokens que circulam no ecossistema Ethereum. Desde a sua introdução em 2015, ele permite que desenvolvedores criem ativos digitais interoperáveis, facilitando trocas, integrações com exchanges e o desenvolvimento de aplicações descentralizadas (dApps). Neste artigo, vamos explorar em profundidade o que é o ERC‑20, seu histórico, a arquitetura técnica, vantagens, limitações e, passo a passo, como você pode criar seu próprio token usando Solidity.

Principais Pontos

  • ERC‑20 é um padrão de smart contract que define funções básicas para tokens fungíveis.
  • Foi proposto por Fabian Vogelsteller e Vitalik Buterin em 2015.
  • Facilita a interoperabilidade entre wallets, exchanges e dApps.
  • Possui funções essenciais: totalSupply, balanceOf, transfer, approve, allowance e transferFrom.
  • Limitações incluem falta de controle de eventos de queima e ausência de extensões nativas para funcionalidades avançadas.

O que é o ERC‑20?

ERC‑20 (Ethereum Request for Comments 20) é um standard interface para tokens fungíveis criados na blockchain Ethereum. Um token fungível tem unidades intercambiáveis – assim como reais ou dólares – ao contrário de tokens não‑fungíveis (NFTs) que são únicos. O padrão define um conjunto de funções e eventos que um contrato inteligente deve implementar para ser reconhecido como um token ERC‑20 pelos principais softwares da rede.

Histórico e origem

Em novembro de 2015, o desenvolvedor Fabian Vogelsteller enviou a proposta ERC‑20 ao Ethereum Improvement Proposal (EIP) 20. A ideia era padronizar a forma como os tokens eram criados e gerenciados, evitando a necessidade de escrever códigos diferentes para cada novo ativo. A proposta foi rapidamente aceita, e o primeiro token a adotar o padrão foi o MKR, seguido pelo OMG. Desde então, milhares de tokens – como USDT, USDC, LINK e UNI – utilizam o ERC‑20.

Como funciona o padrão ERC‑20

O contrato ERC‑20 deve implementar seis funções obrigatórias e três eventos opcionais. Cada função tem um propósito específico:

Funções obrigatórias

  1. totalSupply(): retorna o número total de tokens em circulação.
  2. balanceOf(address account): devolve o saldo de tokens de um endereço específico.
  3. transfer(address recipient, uint256 amount): move tokens da conta que chama a função para outra conta.
  4. allowance(address owner, address spender): indica quanto o spender está autorizado a gastar em nome do owner.
  5. approve(address spender, uint256 amount): concede ao spender permissão para gastar até amount tokens.
  6. transferFrom(address sender, address recipient, uint256 amount): permite que o spender transfira tokens de sender para recipient usando a autorização prévia.

Eventos opcionais

  • Transfer(address indexed from, address indexed to, uint256 value): disparado sempre que tokens são transferidos.
  • Approval(address indexed owner, address indexed spender, uint256 value): disparado quando approve é chamada.

Essas funções garantem que todas as carteiras (wallets), exchanges e dApps possam interagir com qualquer token ERC‑20 de forma padronizada, sem precisar de adaptações específicas.

Arquitetura técnica detalhada

Um contrato ERC‑20 típico contém três componentes principais:

  1. Mapeamento de saldos: mapping(address => uint256) private _balances; armazena o número de tokens de cada endereço.
  2. Mapeamento de autorizações: mapping(address => mapping(address => uint256)) private _allowances; controla quanto cada endereço pode gastar em nome de outro.
  3. Variável de totalSupply: uint256 private _totalSupply; registra a quantidade total de tokens emitidos.

Além disso, o contrato deve implementar verificações de segurança, como overflow (usando SafeMath ou a verificação nativa do Solidity ^0.8.0) e proteção contra ataques de reentrancy nas funções de transferência.

Principais usos e tokens populares

Tokens ERC‑20 são usados em diversos cenários:

  • Stablecoins: USDT, USDC, BUSD – moedas digitais atreladas ao dólar.
  • Governança: UNI (Uniswap), COMP (Compound) – dão direitos de voto em protocolos DeFi.
  • Utility tokens: LINK (Chainlink) – pagam por serviços de oráculo.
  • Fundraising: ICOs e IEOs utilizam ERC‑20 para distribuir tokens aos investidores.

Esses ativos são negociados em quase todas as exchanges centralizadas (CEX) e descentralizadas (DEX) que suportam Ethereum.

Vantagens do padrão ERC‑20

  • Interoperabilidade: qualquer wallet ou DEX que suporte ERC‑20 pode lidar com o token sem customizações.
  • Facilidade de desenvolvimento: bibliotecas como OpenZeppelin fornecem implementações prontas.
  • Liquidez: a ampla adoção cria mercados profundos e pares de negociação.
  • Transparência: todas as transações são públicas e auditáveis na blockchain.

Limitações e críticas ao ERC‑20

  • Falta de suporte nativo a queima (burn): é preciso implementar funções adicionais.
  • Não há mecanismo de pausa (pause) embutido: contratos vulneráveis podem ser pausados apenas por extensões.
  • Problemas de aprovação dupla: ataques de race condition podem ocorrer se o usuário não zerar a aprovação antes de mudar o valor.
  • Escalabilidade: transações de token competem por gás com outras operações da rede Ethereum.

Comparação com outros padrões (ERC‑721, ERC‑1155)

Enquanto ERC‑20 define tokens fungíveis, ERC‑721 trata de tokens não‑fungíveis (NFTs) e ERC‑1155 combina ambos, permitindo que um único contrato gerencie múltiplos tipos de ativos. A escolha do padrão depende do caso de uso: se você precisa de unidades indistintas, ERC‑20 é o caminho; se cada unidade tem atributos únicos, opte por ERC‑721 ou ERC‑1155.

Como criar seu próprio token ERC‑20

A seguir, um tutorial passo a passo usando Remix e a biblioteca OpenZeppelin:

Passo 1: Configurar o ambiente

  1. Acesse https://remix.ethereum.org e crie um novo arquivo MyToken.sol.
  2. No painel esquerdo, selecione a aba Solidity Compiler e escolha a versão ^0.8.20.

Passo 2: Importar a implementação padrão

pragma solidity ^0.8.20;

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

contract MyToken is ERC20, Ownable {
    constructor(uint256 initialSupply) ERC20("MyToken", "MTK") {
        _mint(msg.sender, initialSupply * 10 ** decimals());
    }

    function mint(address to, uint256 amount) external onlyOwner {
        _mint(to, amount);
    }

    function burn(uint256 amount) external {
        _burn(msg.sender, amount);
    }
}

Passo 3: Compilar e implantar

  1. Clique em Compile MyToken.sol. Se não houver erros, vá para a aba Deploy & Run Transactions.
  2. Selecione a conta que será a owner e insira o initialSupply (ex.: 1000000 para 1 milhão).
  3. Clique em Deploy. O contrato será publicado na rede de teste selecionada (por exemplo, Sepolia).

Passo 4: Verificar o contrato

Após a implantação, use o endereço gerado para consultar o contrato no Etherscan. As funções mint e burn já estão disponíveis, proporcionando controle de suprimento.

Segurança e melhores práticas

Mesmo com a robustez de OpenZeppelin, é essencial adotar boas práticas de segurança:

  • Utilize Solidity >=0.8.0: elimina a necessidade de SafeMath, pois o compilador já verifica overflow.
  • Proteja funções críticas com o modificador onlyOwner ou um sistema de governança.
  • Implemente a estratégia de aprovação dupla: antes de mudar o valor de allowance, primeiro defina para zero.
  • Teste extensivamente usando frameworks como Hardhat ou Truffle.
  • Audite o código com empresas especializadas ou use ferramentas automáticas como Slither.

Ferramentas e recursos úteis

Para quem deseja aprofundar-se no desenvolvimento de tokens ERC‑20, recomendamos:

FAQ – Perguntas Frequentes

Pergunta Resposta
É possível mudar o nome de um token ERC‑20 depois de criado? Sim, porém requer que o contrato inclua funções de atualização e que a maioria das wallets reconheça o novo nome via metadados.
Qual a diferença entre transfer e transferFrom? transfer move tokens diretamente do remetente que chama a função. transferFrom permite que um terceiro (spender) transfira tokens em nome do proprietário, usando a autorização prévia estabelecida por approve.
Tokens ERC‑20 consomem muito gás? Em média, uma transferência padrão custa cerca de 21.000 a 30.000 gas, o que equivale a aproximadamente R$0,30 a R$0,50 em taxas na rede principal (dependendo do preço do ETH).

Conclusão

O padrão ERC‑20 consolidou-se como o alicerce dos tokens fungíveis no ecossistema Ethereum, proporcionando interoperabilidade, liquidez e facilidade de desenvolvimento. Apesar de suas limitações – como a ausência de funções nativas de queima ou pausa – ele continua evoluindo através de extensões e boas práticas adotadas pela comunidade. Ao compreender a arquitetura técnica, as funções essenciais e as medidas de segurança, desenvolvedores brasileiros podem criar tokens robustos, integrar-se a exchanges e participar ativamente da revolução descentralizada. Se você está começando ou já tem experiência intermediária, dominar o ERC‑20 é um passo fundamental para projetar soluções inovadoras no universo cripto.