DEV Community

Cover image for Max Wallet: Mecanismo antiballena para tu token
Ahmed Castro
Ahmed Castro

Posted on

Max Wallet: Mecanismo antiballena para tu token

Al momento de lanzamiento a la venta pública de un token ERC20 queremos que darle oprtunidad a una mayor cantidad de compradores. Poner un "Max wallet" nos ayuda a poner un límite a las ballenas y así tener un lanzamiento mas justo. En este video estudiaremos dos maneras de hacerlo, una básica y otra mas avanzada.

Antes de iniciar

Asegurate de instalar Metamask y agregar fondos de Rinkeby Testnet que puedes conseguir desde el Faucet. También necesitarás conectar tu wallet a Polygon Mainnet y conseguir MATIC desde algún exchange.

Max wallet fijo (Advertencia: ¡No lanzar este token!)

// SPDX-License-Identifier: MIT

pragma solidity 0.8.13;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract MyToken is ERC20
{ 
    uint public maxWalletAmount;
    address CREATOR;

    constructor () ERC20("My Token", "TKN")
    {
        CREATOR = msg.sender;
        _mint(msg.sender, 1000000 ether);
        maxWalletAmount = 1000 ether;
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint amount
    ) internal virtual override(ERC20)
    {
        require(to == CREATOR || balanceOf(to) + amount <= maxWalletAmount, "Max Wallet Limit Exceeds!");

        super._beforeTokenTransfer(from, to, amount);
    }
}
Enter fullscreen mode Exit fullscreen mode

Max wallet avanzado

Mejoras:

  • Automáticamente agregamos el par de liquidez como excepción
  • Se edita el max wallet amount como un porcentaje del supply con 2 dígitos para decimal
  • El owner puede editar los exentos

Recuerda ajustar la dirección del router dependiendo de tu network:

  • Polygon Quickswap: 0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff
  • Ethereum Uniswap V2: 0x10ED43C718714eb63d5aA57B78B54704E256024E
  • BSC Mainnet Pancake: 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
  • BSC Testnet Pancake: 0xD99D1c33F9fC3444f8101754aBC46c52416550D1
// SPDX-License-Identifier: MIT

pragma solidity 0.8.13;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";


interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface IUniswapV2Router02 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
}

contract MyToken is ERC20, Ownable
{ 
    uint public maxWalletAmount;
    mapping(address => bool) public isMaxTxExempt;
    address public pair;

    constructor () ERC20("My Token", "TKN")
    {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff);
        pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());

        isMaxTxExempt[msg.sender] = true;
        isMaxTxExempt[pair] = true;

        _mint(msg.sender, 1000000 ether);

        setMaxWalletPercentage(100);
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint amount
    ) internal virtual override(ERC20)
    {
        require(isMaxTxExempt[to] || balanceOf(to) + amount <= maxWalletAmount, "Max Wallet Limit Exceeds!");

        super._beforeTokenTransfer(from, to, amount);
    }

    function setMaxWalletPercentage(uint256 percentage) public onlyOwner {
        maxWalletAmount = (totalSupply() * percentage) / 10000;
    }

    function setMaxTxExempt(address account, bool value) external onlyOwner {
        isMaxTxExempt[account] = value;
    }
}
Enter fullscreen mode Exit fullscreen mode

¡Gracias por ver este tutorial!

Sígueme en dev.to y en Youtube para todo lo relacionado al desarrollo en Blockchain en Español.

Discussion (2)

Collapse
elcanaldearte1 profile image
El canal de Arte

Hola, como estas? donde me puedo comunicar contigo para poder terminar un proyecto que tengo a medias?
Gracias

Collapse
turupawn profile image
Ahmed Castro Author

Hola, por favor manda un correo con todos los detalles a mi asistente: emely@filosofiacodigo.com