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);
}
}
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;
}
}
¡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)
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
¿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.
Muchas gracias voy a revisarlo
Hola, como estas? donde me puedo comunicar contigo para poder terminar un proyecto que tengo a medias?
Gracias
Hola, por favor manda un correo con todos los detalles a mi asistente: emely@filosofiacodigo.com
estos mecanismos antiballenas pueden ser aplicados a una DAO?
Gracias perdon las molestias!!
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.
ummm max wallet se podria aplicar a opensea? opesea Aplica Routers?
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