Neste artigo, vamos nos aprofundar no mundo do Solidity criando um Simple Tax Token (token de taxa simples). Este tutorial o ajudará a entender os fundamentos da programação do Solidity e como criar contratos inteligentes. Ao final deste tutorial, você terá uma sólida compreensão do Solidity e será capaz de aplicar seu conhecimento para criar seus próprios contratos inteligentes.
Portanto, se você estiver pronto para iniciar sua jornada no empolgante mundo Solidity, vamos mergulhar de cabeça!
Foto por The New York Public Library no Unsplash
Configuração do ambiente
Para configurar seu ambiente de desenvolvimento, siga as instruções do Guia de Introdução ao Hardhat. Usaremos o Typescript para este projeto.
Depois de configurado, você pode instalar a biblioteca
@openzeppelin/contracts com o seguinte comando.
yarn add --dev @openzeppelin/contracts
Criação do Contrato de Token de Taxa Simples
Criaremos um contrato inteligente que implementa o padrão ERC-20. Nosso contrato inclui uma função tax, que deduz automaticamente uma porcentagem do valor do token de cada transação que ocorre na blockchain.
A taxa é coletada automaticamente e, em seguida, distribuída para um endereço (fundo) específico, como uma instituição de caridade ou um fundo de desenvolvimento.
Herdaremos contratos da biblioteca @openzeppelin/contracts para aumentar a segurança e a velocidade do processo de desenvolvimento.
Criaremos apenas dois testes para este tutorial.
- Ele deve definir o endereço do fundo na implantação.
- Ele deve transferir 5% para o endereço do fundo.
import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"
import { expect } from "chai"
import { ethers } from "hardhat"
describe("SimpleVoting", function () {
async function deploy() {
const [deployer, fund, target] = await ethers.getSigners()
const Contract = await ethers.getContractFactory("SimpleTax")
const contract = await Contract.deploy(fund.address)
await contract.deployed()
return { contract, deployer, fund, target }
}
describe("deployment", function () {
it("should set the fund address", async function () {
const { contract, fund } = await loadFixture(deploy)
expect(await contract.fund()).to.eq(fund.address)
})
})
describe("transfer", function () {
it("should transfer 5% to the fund's address", async function () {
const { contract, deployer, fund, target } = await loadFixture(deploy)
const amount = ethers.utils.parseEther("100")
await expect(contract.transfer(target.address, amount)).to.changeTokenBalances(contract,
[deployer, fund, target],
[amount.mul(-1), amount.mul(5).div(100), amount.mul(95).div(100)]
)
})
})
})
Em nosso contrato, teremos que fazer duas coisas.
fund
Em nosso construtor, adicionaremos um argumento para o fundo. Você pode ver na função deploy do nosso caso de teste que chamamos Contract.deploy
com o endereço do fundo como argumento. Em seguida, definiremos o fundo no contrato.
Se você observar a declaração do fundo no contrato, verá que ele é immutable
. Isso significa simplesmente que ele não pode ser alterado depois de inicializado.
_transfer
_transfer
é uma função interna que a função externa transfer
chama. Ela é responsável por alterar os saldos. É nessa função _transfer
que calculamos o valor que deve ser transferido para o destinatário e para o fundo.
No Solidity, não existem decimais, portanto, não podemos usar uma porcentagem fixa, ou seja, 5/100 = 0,05, pois esse número não existe no Solidity.
Em nosso caso de teste, estamos transferindo 100 tokens. Em Solidity, 100 é representado por 100000000000000000000. Dado o tamanho desse número, podemos dividi-lo por 100 e multiplicá-lo por 10.
Por último, mas não menos importante, chamamos a função super._transfer
(duas vezes). Isso significa chamar a função _transfer
declarada no contrato OpenZeppelin ERC20.sol. Nós a chamamos uma vez para transferir fundos para o destinatário e uma vez para transferir fundos para o fundo.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract SimpleTax is ERC20 {
address public immutable fund;
constructor(address fund_) ERC20("SimpleTax", "STX") {
_mint(msg.sender, 1000 * 10 ** decimals());
fund = fund_;
}
function _transfer(
address sender,
address recipient,
uint256 amount
) internal virtual override {
uint tax = (amount / 100) * 5; // 5% de taxa
super._transfer(sender, recipient, amount - tax);
super._transfer(sender, fund, tax);
}
}
Parabéns! Escrevemos um token de taxa simples em 25 linhas de código. Nada mal. O código está disponível no Github.
Produção
É importante observar que, para que esse contrato funcione corretamente em uma exchange descentralizada, precisaríamos adicionar uma lista de permissões (whitelist) para não tributar determinadas transferências que envolvam o par de liquidez. Falaremos mais sobre isso em um artigo futuro.
Se este artigo foi útil, junte-se ao nosso Telegram! É um espaço web3 para discutir ideias, criar projetos e ajudar a solucionar problemas de código.
Sou um fundador multidisciplinar, gerente de projetos, desenvolvedor de Solidity + React, marido e cozinheiro de família e amigos.
Tem uma ideia de projeto? Entre em contato comigo no Twitter ou junte-se ao Telegram.
Novo em negócios? Experimente bots de negociação de criptomoedas ou copy trading nas melhores exchanges de criptos.
Junte-se a Coinmonks no Canal do Telegram e no Canal do Youtube e obtenha diariamente notícias sobre criptomoedas
Leia também
- Free Crypto Signals | Crypto Trading Bots
- An ultimate guide to Leveraged Token
- 16 Best Folding Electric Bikes
- 28 Best Electric Bikes Review
- Top 3 Binance Futures Trading Bots
Esse artigo foi escrito por Cyrille e traduzido por Fátima Lima. O original pode ser lido aqui.
Top comments (0)