WEB3DEV

Cover image for Tutorial de Solidity: Token de Taxa Simples
Fatima Lima
Fatima Lima

Posted on

Tutorial de Solidity: Token de Taxa Simples

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!

Image description

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
Enter fullscreen mode Exit fullscreen mode

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.

  1. Ele deve definir o endereço do fundo na implantação.
  2. 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)]
               )
           })
       })
    })
Enter fullscreen mode Exit fullscreen mode

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.deploycom 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);
       }
    }
Enter fullscreen mode Exit fullscreen mode

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

Esse artigo foi escrito por Cyrille e traduzido por Fátima Lima. O original pode ser lido aqui.

Top comments (0)