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.

Top comments (9)

Collapse
 
casolucion profile image
casolucion

Hola, tiene un contenido que muestre como se puede bloquear un porcentaje del total de tokens de un proyecto? ejemplo bloquear en una Wallet el 60% del total de tokens a 1 año. muchas gracias

Collapse
 
turupawn profile image
Ahmed Castro

¿Te refieres a un timelock? Porque tengo este video: https://www.youtube.com/watch?v=RHT1JFExYv8&list=PLtBMv9K24Hn8_6AT6r9JRUfxsiNlo-xTH&index=7&t=67s donde lo explico.

Collapse
 
casolucion profile image
casolucion

Muchas gracias voy a revisarlo

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

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

Collapse
 
tukarozas profile image
TukaRozas

estos mecanismos antiballenas pueden ser aplicados a una DAO?
Gracias perdon las molestias!!

Collapse
 
turupawn profile image
Ahmed Castro

Es complicado aplicar un mecanismo antiballenas para una DAO tradicional, se me ocurre que una combinación entre Proof of personhood con votos cuadráticos podrían ayudar bastante.

Collapse
 
julio899 profile image
Julio Vinachi

ummm max wallet se podria aplicar a opensea? opesea Aplica Routers?

Collapse
 
turupawn profile image
Ahmed Castro

Podrías aplicar un max wallet sobre escribiendo la función transfer de los contratos de openzeppellin y no, opensea no tiene routers, pero hay protocolos nuevos que están implementando algo similar, te recomiendo sudoswap, que tiene piscinas de liquidez de NFTs y tokens y queda muy similar al router de uniswap