SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
23.11.2024

Lição 117: Visão Geral do Padrão ERC20

O padrão ERC20 é um padrão fundamental de token na blockchain Ethereum. Ele define um conjunto comum de regras que todos os tokens Ethereum devem seguir, facilitando a criação e o uso de tokens em todo o ecossistema Ethereum. Nesta lição, exploraremos as principais características do padrão ERC20, suas funções e forneceremos um código de exemplo para uma implementação básica de token ERC20.

Principais Características do ERC20

O padrão ERC20 traz várias características essenciais, incluindo:

  1. Interoperabilidade: Qualquer token que siga o padrão ERC20 pode ser usado em qualquer carteira ou dApp que suporte tokens ERC20.
  2. Descentralização: Tokens criados utilizando o padrão ERC20 são descentralizados e governados por contratos inteligentes que operam na rede Ethereum.
  3. Transferibilidade: Os usuários podem transferir facilmente tokens entre diferentes contas.

Funções Principais do ERC20

Um token ERC20 geralmente inclui as seguintes funções principais:

  1. totalSupply: Retorna o fornecimento total do token.
  2. balanceOf: Retorna o saldo de uma conta específica.
  3. transfer: Transfere tokens da conta do remetente para a conta de um destinatário.
  4. approve: Permite que um gastador retire tokens da conta do proprietário várias vezes, até que um determinado limite seja atingido.
  5. transferFrom: Transfere tokens de uma conta para outra em nome de um detentor de tokens.
  6. allowance: Verifica o número restante de tokens que um gastador pode retirar da conta do proprietário.

Implementação Básica do Token ERC20

Abaixo está um exemplo simples de uma implementação de token ERC20 em Solidity.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SimpleERC20 {
    string public name = "SimpleERC20";
    string public symbol = "SERC20";
    uint8 public decimals = 18;
    uint256 private _totalSupply;

    mapping(address => uint256) private balances;
    mapping(address => mapping(address => uint256)) private allowed;

    constructor(uint256 initialSupply) {
        _totalSupply = initialSupply * (10 ** uint256(decimals));
        balances[msg.sender] = _totalSupply;
    }

    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view returns (uint256) {
        return balances[account];
    }

    function transfer(address recipient, uint256 amount) public returns (bool) {
        require(recipient != address(0), "Transferência para o endereço zero não é permitida");
        require(balances[msg.sender] >= amount, "Saldo insuficiente");

        balances[msg.sender] -= amount;
        balances[recipient] += amount;
        emit Transfer(msg.sender, recipient, amount);
        return true;
    }

    function approve(address spender, uint256 amount) public returns (bool) {
        allowed[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public returns (bool) {
        require(sender != address(0), "Transferência do endereço zero não é permitida");
        require(recipient != address(0), "Transferência para o endereço zero não é permitida");
        require(balances[sender] >= amount, "Saldo insuficiente");
        require(allowed[sender][msg.sender] >= amount, "Limite excedido");

        balances[sender] -= amount;
        balances[recipient] += amount;
        allowed[sender][msg.sender] -= amount;
        emit Transfer(sender, recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view returns (uint256) {
        return allowed[owner][spender];
    }

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

Explicação do Código

  1. Variáveis de Estado: O contrato define o nome, símbolo, casas decimais e o fornecimento total do token. Também mantém duas mapeações para saldos e permissões.

  2. Construtor: O construtor inicializa o fornecimento do token e o atribui ao endereço que implementa o contrato.

  3. Funções ERC20:

    • totalSupply: Retorna o fornecimento total do token.
    • balanceOf: Retorna o saldo de um endereço específico.
    • transfer: Facilita a transferência de tokens do remetente para um destinatário.
    • approve: Concede permissão a um gastador para retirar uma quantidade especificada da conta do remetente.
    • transferFrom: Permite que um gastador transfira tokens de um usuário para outro dentro dos limites aprovados.
    • allowance: Mostra a quantidade restante que um gastador pode retirar da conta de um proprietário específico.
  4. Eventos: Os eventos Transfer e Approval são emitidos para garantir transparência nas transações.

Conclusão

Compreender o padrão ERC20 é essencial para qualquer pessoa que deseje desenvolver aplicativos descentralizados na Ethereum, pois estabelece uma maneira padrão para os tokens interagirem dentro do ecossistema. O exemplo fornecido ilustra como é fácil criar seu próprio token ERC20 seguindo este padrão, permitindo que você se concentre na lógica de seu aplicativo sem se preocupar com problemas de compatibilidade.

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!