Aula 118: Implementando Funções de Token
Nesta aula, exploraremos como implementar várias funções de token em um contrato inteligente usando Solidity. Essas funções são essenciais para qualquer token ERC20, permitindo que você gerencie saldos, transferências e permissões de tokens de maneira eficaz.
O que é um Token ERC20?
ERC20 é uma interface padrão para tokens ERC, e define um conjunto de regras que todos os tokens Ethereum devem seguir. Isso permite que diferentes tokens interajam de maneira transparente com carteiras, exchanges descentralizadas e outros contratos inteligentes. Algumas funções principais do padrão ERC20 incluem:
transfer()
: Transferir tokens do endereço do remetente para outro endereço.approve()
: Permitir que outro endereço gaste uma certa quantidade de tokens em nome do remetente.transferFrom()
: Transferir tokens de um endereço para outro em nome do endereço aprovado.balanceOf()
: Recuperar o saldo de um endereço específico.
Implementação Básica de um Token ERC20
Vamos criar um contrato de token ERC20 simples. Abaixo está o código para uma implementação básica, que inclui as funções essenciais descritas acima.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SimpleToken {
string public name = "SimpleToken";
string public symbol = "STK";
uint8 public decimals = 18;
uint256 totalSupply;
mapping(address => uint256) private balances;
mapping(address => mapping(address => uint256)) private allowances;
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
constructor(uint256 _initialSupply) {
totalSupply = _initialSupply * 10 ** uint256(decimals);
balances[msg.sender] = totalSupply; // Atribui o total de tokens ao endereço do criador do contrato
}
function balanceOf(address _owner) public view returns (uint256) {
return balances[_owner];
}
function transfer(address _to, uint256 _value) public returns (bool) {
require(_to != address(0), "Endereço inválido");
require(balances[msg.sender] >= _value, "Saldo insuficiente");
balances[msg.sender] -= _value;
balances[_to] += _value;
emit Transfer(msg.sender, _to, _value);
return true;
}
function approve(address _spender, uint256 _value) public returns (bool) {
allowances[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
require(_from != address(0), "Endereço inválido");
require(_to != address(0), "Endereço inválido");
require(balances[_from] >= _value, "Saldo insuficiente");
require(allowances[_from][msg.sender] >= _value, "Permissão excedida");
balances[_from] -= _value;
balances[_to] += _value;
allowances[_from][msg.sender] -= _value;
emit Transfer(_from, _to, _value);
return true;
}
function allowance(address _owner, address _spender) public view returns (uint256) {
return allowances[_owner][_spender];
}
}
Explicação das Funções
-
Construtor: O construtor inicializa o nome do token, símbolo, casas decimais e a oferta inicial. Ele atribui a oferta total ao endereço do criador do contrato.
-
balanceOf(): Esta função retorna o saldo de um determinado endereço.
-
transfer(): Esta função permite que o remetente transfira tokens para outro endereço. Ela verifica se o endereço do destinatário é válido e se o remetente possui saldo suficiente.
-
approve(): Esta função permite que o proprietário dos tokens aprove um gastador para gastar tokens em seu nome.
-
transferFrom(): Esta função permite que o gastador transfira tokens da conta do proprietário para outra conta. Ela assegura que o proprietário possui tokens suficientes e que o gastador foi aprovado para transferir a quantidade especificada.
-
allowance(): Esta função retorna o número de tokens restantes que o gastador está autorizado a gastar em nome do proprietário.
Testando a Implementação
Para testar as funcionalidades do token, você pode usar um ambiente de desenvolvimento como Remix, Truffle ou Hardhat. Implemente o contrato e chame as funções usando diferentes endereços para garantir que tudo funcione como esperado.
Conclusão
Nesta aula, abordamos como implementar as funções básicas de um token ERC20 em Solidity. Compreender essas funções é crucial para construir aplicações descentralizadas mais complexas. Essa implementação simples fornece uma base que pode ser expandida com mais funcionalidades, como mintagem, queima ou pausa de transferências, conforme necessário.