Max Wallet: Mecanismo antiballena para tu token
Tags: web3, blockchain, solidity, defi
Published: 2022-04-18 18:24:20

---
title: Max Wallet: Mecanismo antiballena para tu token
published: true
description: 
tags: web3,blockchain,solidity,DeFi
cover_image: https://dev-to-uploads.s3.amazonaws.com/uploads/articles/we4sbitobn78ow4awq42.png
---

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](https://metamask.io/) y agregar fondos de Rinkeby Testnet que puedes conseguir desde el [Faucet](https://rinkebyfaucet.io/). También necesitarás conectar tu wallet a [Polygon Mainnet](https://docs.polygon.technology/docs/develop/metamask/config-polygon-on-metamask/) y conseguir MATIC desde algún exchange.

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

```solidity
// 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);
    }
}
```

## 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`

```solidity
// 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;
    }
}
```

**¡Gracias por ver este tutorial!**

Sígueme en dev.to y en [Youtube](https://www.youtube.com/c/FilosofiaCodigo) para todo lo relacionado al desarrollo en Blockchain en Español.