Recentemente, tenho revisado meus conhecimentos sobre Solidity para consolidar detalhes e escrever um "Curso Rápido de Solidity". Este curso é destinado a iniciantes (programadores experientes podem procurar outras fontes), e eu pretendo adicionar de 1 a 3 aulas por semana.
Siga-me no Twitter: @0xAA_Science
Junte-se à comunidade WTF Scientists, onde você pode encontrar informações sobre como entrar no nosso grupo do Discord: Link
Todo o código e tutorial estão disponíveis no meu GitHub (obteremos um certificado de curso com 1024 estrelas e um NFT comunitário com 2048 estrelas): github.com/AmazingAng/WTF-Solidity
No último tutorial, aprendemos sobre o padrão de token ERC20. Nesta aula, vamos aprender sobre contratos inteligentes de faucet ERC20. Neste contrato, os usuários podem receber tokens ERC20 gratuitos.
Assim como você vai a uma torneira para beber água quando está com sede, você também pode ir a um "faucet de tokens" para receber tokens gratuitos quando deseja. Um faucet de tokens é um site/aplicativo que permite aos usuários receber tokens gratuitos.
O primeiro exemplo de faucet de tokens foi o faucet de Bitcoin (BTC): hoje, um BTC custa cerca de $30.000, mas em 2010, o preço de um BTC era menos de $0.1 e havia poucos detentores. Para aumentar sua base de usuários, Gavin Andresen, da comunidade do Bitcoin, criou o faucet de Bitcoin, permitindo que outras pessoas recebessem BTC gratuitamente. Muitos foram atraídos por esta oportunidade, e uma parte dessas pessoas se tornaram entusiastas do Bitcoin. O Bitcoin faucet distribuiu mais de 19.700 BTC, que atualmente valem cerca de $600 milhões!
Neste exemplo, vamos implementar uma versão simplificada de um faucet ERC20. A lógica é simples: transferimos alguns tokens ERC20 para o contrato do faucet e os usuários podem solicitar 100 unidades desses tokens através da função requestToken()
, com cada endereço podendo solicitar apenas uma vez.
Vamos definir 3 variáveis de estado no contrato do faucet:
amountAllowed
define a quantidade de tokens que cada pessoa pode receber a cada solicitação (pode ser menos que 100 devido à divisão decimal dos tokens).tokenContract
registra o endereço do contrato dos tokens ERC20 distribuídos.requestedAddress
mantém o registro dos endereços que solicitaram tokens.
uint256 public amountAllowed = 100; // Receber 100 unidades de token por solicitação
address public tokenContract; // Endereço do contrato dos tokens
mapping(address => bool) public requestedAddress; // Registro de endereços que solicitaram tokens
No contrato do faucet, definimos um evento SendToken
, que registra o endereço e a quantidade de tokens solicitados a cada transferência, quando a função requestTokens()
é chamada.
// Evento de envio de token
event SendToken(address indexed Receiver, uint256 indexed Amount);
O contrato possui apenas duas funções:
- Construtor: inicializa a variável de estado
tokenContract
, definindo o endereço do contrato dos tokens ERC20 a serem distribuídos.
// Definir o contrato ERC20 ao implantar
constructor(address _tokenContract) {
tokenContract = _tokenContract; // definir contrato de token
}
- Função
requestTokens()
: os usuários podem chamar essa função para receber tokens ERC20.
// Função para os usuários receberem tokens
function requestTokens() external {
require(requestedAddress[msg.sender] == false, "Não é possível solicitar várias vezes!"); // cada endereço só pode solicitar uma vez
IERC20 token = IERC20(tokenContract); // cria o objeto do contrato IERC20
require(token.balanceOf(address(this)) >= amountAllowed, "Faucet Vazio!"); // o faucet está vazio
token.transfer(msg.sender, amountAllowed); // enviar tokens
requestedAddress[msg.sender] = true; // registrar o endereço que solicitou
emit SendToken(msg.sender, amountAllowed); // emite o evento SendToken
}
-
Primeiro, implantamos o contrato dos tokens ERC20, com nome e símbolo
WTF
, e criamos 10.000 unidades de tokens usando a funçãomint
. -
Em seguida, implantamos o contrato do faucet, passando o endereço do contrato dos tokens ERC20 como parâmetro de inicialização.
-
Usamos a função
transfer()
do contrato dos tokens ERC20 para transferir 10.000 unidades de tokens para o endereço do contrato do faucet. -
Em uma nova conta, chamamos a função
requestTokens()
do contrato do faucet para receber os tokens. Podemos ver o eventoSendToken
sendo emitido no console. -
Usando a função
balanceOf
no contrato dos tokens ERC20, verificamos o saldo da conta que recebeu os tokens do faucet, que agora é de 100 unidades. A solicitação foi bem-sucedida!
Nesta aula, exploramos a história dos faucets de tokens e o contrato de faucet ERC20. Onde você acha que será o próximo faucet de Bitcoin?