ETH Price: $1,972.71 (+0.56%)
 

Overview

Max Total Supply

100,000,000 ENX

Holders

1,787 ( -0.056%)

Transfers

-
729 ( 171.00%)

Market

Price

$0.03 @ 0.000017 ETH (+6.88%)

Onchain Market Cap

-

Circulating Supply Market Cap

$2,057,656.09

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

A quantum-proof privacy layer powered by military-grade, proprietary technology: Randomized Adaptive Virtual Infrastructure Defense (RAVID).

Market

Volume (24H):$80,862.25
Market Capitalization:$2,057,656.09
Circulating Supply:62,328,227.00 ENX
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ENIGMA

Compiler Version
v0.8.30+commit.73712a01

Optimization Enabled:
Yes with 200 runs

Other Settings:
cancun EvmVersion
File 1 of 9 : ENIGMA.sol
// SPDX-License-Identifier: MIT
//
// Enigma Protocol
//
// https://www.engma.io
// https://x.com/engma_io
//
//
pragma solidity 0.8.30;

// OpenZeppelin imports
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";

// Uniswap V2 Router interface
interface IUniswapV2Router {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}

// Uniswap V2 Factory interface
interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
}

/**
 * @title ENIGMA
 * @dev ERC20 token
 */
contract ENIGMA is IERC20, IERC20Metadata, Ownable, ReentrancyGuard {
    using Address for address payable;
    using SafeERC20 for IERC20;
    
    // Token state
    mapping(address => uint256) private _tokenBalances;
    mapping(address => mapping(address => uint256)) private _tokenAllowances;
    
    uint256 private _tokenSupply;
    string private _tokenName;
    string private _tokenSymbol;
    uint8 private constant TOKEN_DECIMALS = 18;
    
    // Tax configuration
    struct TaxSettings {
        uint256 purchaseTax;
        uint256 saleTax;
        uint256 movementTax;
        bool settingsLocked;
    }
    
    struct RevenueAllocation {
        address payable primaryWallet;
        address payable secondaryWallet;
        address payable tertiaryWallet;
        uint256 primaryShare;
        uint256 secondaryShare;
        uint256 tertiaryShare;
    }
    
    // Core settings
    TaxSettings public taxSettings;
    RevenueAllocation public revenueAllocation;
    
    bool public hasReachedMaxTax;
    bool public launchTaxActivated;
    
    // Exemption tracking
    mapping(address => bool) private _isTaxExempt;
    mapping(address => bool) private _isAMMPair;
    
    // Bot protection
    mapping(address => bool) private _isBot;
    bool public botProtectionActive = true;
    
    // DEX configuration
    IUniswapV2Router public immutable swapRouter;
    address public immutable mainPair;
    address public immutable wrappedNative;
    
    // Trading controls
    bool public tradingEnabled;
    bool public liquidityEstablished;
    uint256 public launchTimestamp;
    
    // Holder restrictions
    bool public holderLimitsActive = true;
    uint256 public maxTokensPerWallet;
    mapping(address => bool) private _isLimitExempt;
    
    // Conversion parameters
    uint256 public swapThreshold;
    uint256 private maxSwapAmount;
    
    // Protection mechanisms
    bool private inSwapProcess;
    uint256 public swapExecutionCount;
    uint256 public lastSwapBlock;
    uint256 public maxSwapsPerBlock = 8;
    
    // Safety limits
    uint256 public maxSwapCap;
    
    // Tax constants
    uint256 public constant MAX_TAX_LIMIT = 500; // 5%
    uint256 public constant TAX_DENOMINATOR = 10000; // 100%
    uint256 public constant LAUNCH_PURCHASE_TAX = 2500; // 25%
    uint256 public constant LAUNCH_SALE_TAX = 3000; // 30%

    // Vesting contract integration
    address public constant VESTING_CONTRACT_UNICRYPT = 0xDba68f07d1b7Ca219f78ae8582C213d975c25cAf;
    address public constant VESTING_CONTRACT_SABLIER = 0xcF8ce57fa442ba50aCbC57147a62aD03873FfA73;

    // Ownership renunciation with timelock
    uint256 public renounceInitiatedAt;
    uint256 public constant RENOUNCE_DELAY = 2 hours;
    bool public renounceInitiated;
    
    // Access modifiers
    modifier validAddress(address addr) {
        require(addr != address(0), "Invalid address");
        _;
    }
    
    modifier lockSwap {
        inSwapProcess = true;
        _;
        inSwapProcess = false;
    }
    
    // Events
    event TradingActivated(uint256 timestamp);
    event LaunchFeesActivated(uint256 buyFee, uint256 sellFee, uint256 timestamp);
    event FeeRatesModified(uint256 buyFee, uint256 sellFee, uint256 transferFee);
    event DistributionUpdated(address primaryWallet, address secondaryWallet, address tertiaryWallet, uint256 primaryShare, uint256 secondaryShare, uint256 tertiaryShare);
    event FeeConversionExecuted(uint256 tokensProcessed, uint256 ethGenerated);
    event FeeConfigurationLocked();
    event HoldingLimitUpdated(uint256 newLimit);
    event LimitationsDeactivated();
    event ExemptionStatusChanged(address account, bool exempt);
    event SafeguardUpdated(uint256 newConversionCap);
    event SafeguardTriggered(uint256 requestedAmount, uint256 actualAmount);
    event MaximumFeeLimitReached(uint256 timestamp, string message);
    event ConversionLimitUpdated(uint256 maxConversions);
    event LiquidityConfirmed(uint256 timestamp);
    event OwnershipRenounceInitiated(uint256 timestamp, uint256 effectiveAt);
    event OwnershipRenounceCancelled(uint256 timestamp);
    event OwnershipRenounced(uint256 timestamp);
    event BotStatusUpdated(address indexed account, bool status);
    event BotProtectionDeactivated(uint256 timestamp);
    
    constructor(
        string memory tokenName,
        string memory tokenSymbol,
        uint256 initialSupply,
        address primaryTaxReceiver,
        address secondaryTaxReceiver,
        address tertiaryTaxReceiver,
        address routerAddress
    ) Ownable(msg.sender) 
      validAddress(primaryTaxReceiver) 
      validAddress(secondaryTaxReceiver)
      validAddress(tertiaryTaxReceiver)
      validAddress(routerAddress) {
        
        _tokenName = tokenName;
        _tokenSymbol = tokenSymbol;
        _tokenSupply = initialSupply * 10**TOKEN_DECIMALS;
        
        // Initialize tax configuration
        taxSettings = TaxSettings({
            purchaseTax: 0,
            saleTax: 0,
            movementTax: 0,
            settingsLocked: false
        });
        
        revenueAllocation = RevenueAllocation({
            primaryWallet: payable(primaryTaxReceiver),
            secondaryWallet: payable(secondaryTaxReceiver),
            tertiaryWallet: payable(tertiaryTaxReceiver),
            primaryShare: 3333,  // 33.33%
            secondaryShare: 3333, // 33.33%
            tertiaryShare: 3334   // 33.34%
        });
        
        // Initialize phase tracking
        hasReachedMaxTax = false;
        launchTaxActivated = false;
        
        // Configure DEX
        IUniswapV2Router router = IUniswapV2Router(routerAddress);
        swapRouter = router;
        wrappedNative = router.WETH();
        
        mainPair = IUniswapV2Factory(router.factory()).createPair(address(this), wrappedNative);
        _isAMMPair[mainPair] = true;
        
        // Configure swap parameters
        swapThreshold = _tokenSupply / 2000; // 0.05%
        maxSwapAmount = _tokenSupply / 200; // 0.5%
        
        // Set swap safety cap
        maxSwapCap = _tokenSupply / 100; // 1% max per swap
        
        // Initialize holder limit at 2%
        maxTokensPerWallet = _tokenSupply * 2 / 100;
        
        // Set tax exemptions
        _isTaxExempt[owner()] = true;
        _isTaxExempt[address(this)] = true;
        _isTaxExempt[address(router)] = true;
        
        // Set limit exemptions
        _isLimitExempt[owner()] = true;
        _isLimitExempt[address(this)] = true;
        _isLimitExempt[address(router)] = true;
        _isLimitExempt[mainPair] = true;
        _isLimitExempt[address(0xdead)] = true;
        _isLimitExempt[VESTING_CONTRACT_UNICRYPT] = true;
        _isLimitExempt[VESTING_CONTRACT_SABLIER] = true;

        // exempt project reserves
        _isLimitExempt[0x933360218aff0156Fa6B93B8870Af38E386D32a3] = true;
        _isLimitExempt[0xbf47b99E5EBF680a8c30FCa1756ad6320669DEED] = true;
        _isLimitExempt[0x8273f01c08Bc32b92884F32465517C937b202d0f] = true;
        _isLimitExempt[0xe4788b2afbBdc1373D4ED5181B38ae508A1eCaea] = true;
        
        // Mint total supply to owner
        _tokenBalances[owner()] = _tokenSupply;
        emit Transfer(address(0), owner(), _tokenSupply);
        
        // Pre-approve router for efficient swaps
        _approveTokens(address(this), address(router), type(uint256).max);
    }
    
    // ERC20 implementation
    function name() public view override returns (string memory) {
        return _tokenName;
    }
    
    function symbol() public view override returns (string memory) {
        return _tokenSymbol;
    }
    
    function decimals() public pure override returns (uint8) {
        return TOKEN_DECIMALS;
    }
    
    function totalSupply() public view override returns (uint256) {
        return _tokenSupply;
    }
    
    function balanceOf(address account) public view override returns (uint256) {
        return _tokenBalances[account];
    }
    
    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _executeTransfer(_msgSender(), recipient, amount);
        return true;
    }
    
    function allowance(address owner, address spender) public view override returns (uint256) {
        return _tokenAllowances[owner][spender];
    }
    
    function approve(address spender, uint256 amount) public override returns (bool) {
        _approveTokens(_msgSender(), spender, amount);
        return true;
    }
    
    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        uint256 currentAllowance = _tokenAllowances[sender][_msgSender()];
        require(currentAllowance >= amount, "Transfer amount exceeds allowance");
        
        _executeTransfer(sender, recipient, amount);
        _approveTokens(sender, _msgSender(), currentAllowance - amount);
        
        return true;
    }
    

    // Internal approval mechanism

    function _approveTokens(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "Approve from zero address");
        require(spender != address(0), "Approve to zero address");
        
        _tokenAllowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
    

    // Core transfer logic with tax

    function _executeTransfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "Transfer from zero address");
        require(recipient != address(0), "Transfer to zero address");
        require(amount > 0, "Transfer amount must be positive");
        require(_tokenBalances[sender] >= amount, "Insufficient balance");
        
        // Bot protection check - flagged addresses can only send to owner or dead wallet
        if (botProtectionActive && _isBot[sender]) {
            require(
                recipient == owner() || recipient == address(0xdead),
                "Bot restriction active"
            );
        }
        
        bool shouldApplyTax = _checkIfTaxable(sender, recipient);
        
        // Process tax on sells
        if (shouldApplyTax && _isAMMPair[recipient]) {
            _processSwapIfNeeded();
        }
        
        uint256 finalAmount = amount;
        
        if (shouldApplyTax) {
            uint256 taxAmount = _calculateTax(sender, recipient, amount);
            if (taxAmount > 0) {
                finalAmount = amount - taxAmount;
                _tokenBalances[sender] -= taxAmount;
                _tokenBalances[address(this)] += taxAmount;
                emit Transfer(sender, address(this), taxAmount);
            }
        }
        
        // Validate holder limits
        if (holderLimitsActive && !_isLimitExempt[recipient]) {
            _enforceHolderLimits(recipient, finalAmount);
        }
        
        _tokenBalances[sender] -= finalAmount;
        _tokenBalances[recipient] += finalAmount;
        emit Transfer(sender, recipient, finalAmount);
        
        // Monitor for initial liquidity
        if (!liquidityEstablished && recipient == mainPair) {
            _detectLiquidityAddition();
        }
    }
    

    // Detect initial liquidity

    function _detectLiquidityAddition() internal {
        if (!liquidityEstablished) {
            uint256 pairBalance = _tokenBalances[mainPair];
            if (pairBalance > _tokenSupply / 5000) { 
                liquidityEstablished = true;
                emit LiquidityConfirmed(block.timestamp);
            }
        }
    }
    

    // Check recipient doesn't exceed holder limits

    function _enforceHolderLimits(address recipient, uint256 amount) internal view {
        if (!_isLimitExempt[recipient]) {
            require(
                _tokenBalances[recipient] + amount <= maxTokensPerWallet,
                "Transfer exceeds maximum holding limit"
            );
        }
    }
    

    // Determine if taxes apply

    function _checkIfTaxable(address sender, address recipient) internal view returns (bool) {
        return !_isTaxExempt[sender] && !_isTaxExempt[recipient] && tradingEnabled;
    }
    

    // Calculate tax amount

    function _calculateTax(address sender, address recipient, uint256 amount) internal view returns (uint256) {
        uint256 applicableTax = 0;
        
        if (_isAMMPair[sender]) {
            // Purchase transaction
            applicableTax = taxSettings.purchaseTax;
        } else if (_isAMMPair[recipient]) {
            // Sale transaction
            applicableTax = taxSettings.saleTax;
        } else {
            // Transfer transaction
            applicableTax = taxSettings.movementTax;
        }
        
        return (amount * applicableTax) / TAX_DENOMINATOR;
    }
    

    // Handle tax conversion

    function _processSwapIfNeeded() internal {
        uint256 contractBalance = balanceOf(address(this));
        
        if (!inSwapProcess && contractBalance > swapThreshold) {
            
            // Reset counter on new block
            if (block.number > lastSwapBlock) {
                swapExecutionCount = 0;
            }
            
            // Limit swaps per block
            if (swapExecutionCount >= maxSwapsPerBlock) {
                return; 
            }
            
            uint256 tokensToSwap = _determineSwapAmount(contractBalance);
            
            _swapTokensForETH(tokensToSwap);
            
            uint256 contractETH = address(this).balance;
            if (contractETH > 0) {
                _allocateRevenue(contractETH);
                emit FeeConversionExecuted(tokensToSwap, contractETH);
            }
            
            swapExecutionCount++;
            lastSwapBlock = block.number;
        }
    }
    

    // Calculate swap amount

    function _determineSwapAmount(uint256 contractBalance) internal view returns (uint256) {
        uint256 swapAmount = contractBalance;
        
        // Apply maximum swap limit
        if (swapAmount > maxSwapAmount) {
            swapAmount = maxSwapAmount;
        }
        
        // Apply safety cap
        if (swapAmount > maxSwapCap) {
            swapAmount = maxSwapCap;
        }
        
        return swapAmount;
    }
    

    // Convert tokens to ETH

    function _swapTokensForETH(uint256 tokenAmount) internal lockSwap {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = wrappedNative;
        
        try swapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp + 300
        ) {
            // Swap successful
        } catch {
            // Swap failed
        }
    }
    

    // Distribute tax

    function _allocateRevenue(uint256 ethAmount) internal {
        uint256 primaryAmount = (ethAmount * revenueAllocation.primaryShare) / 10000;  
        uint256 secondaryAmount = (ethAmount * revenueAllocation.secondaryShare) / 10000;
        uint256 tertiaryAmount = ethAmount - primaryAmount - secondaryAmount;
        
        if (primaryAmount > 0) {
            revenueAllocation.primaryWallet.sendValue(primaryAmount);
        }
        
        if (secondaryAmount > 0) {
            revenueAllocation.secondaryWallet.sendValue(secondaryAmount);
        }
        
        if (tertiaryAmount > 0) {
            revenueAllocation.tertiaryWallet.sendValue(tertiaryAmount);
        }
    }
    
    // Administrative functions
    

    // Activate trading

    function enableTrading() external onlyOwner {
        require(!tradingEnabled, "Trading is already active");
        require(liquidityEstablished, "Liquidity must be established first");
        tradingEnabled = true;
        launchTimestamp = block.timestamp;
        emit TradingActivated(block.timestamp);
    }
    

    // Activate launch tax

    function activateLaunchTax() external onlyOwner {
        require(!launchTaxActivated, "Launch tax already active");
        require(!taxSettings.settingsLocked, "Fee structure is locked");
        
        // Apply launch tax rates
        taxSettings.purchaseTax = LAUNCH_PURCHASE_TAX;
        taxSettings.saleTax = LAUNCH_SALE_TAX;
        taxSettings.movementTax = 0;
        
        // Enter reduction phase
        hasReachedMaxTax = false;
        launchTaxActivated = true;
        
        emit LaunchFeesActivated(LAUNCH_PURCHASE_TAX, LAUNCH_SALE_TAX, block.timestamp);
        emit FeeRatesModified(LAUNCH_PURCHASE_TAX, LAUNCH_SALE_TAX, 0);
    }
    

    // Manually mark liquidity as established

    function setLiquidityEstablished() external onlyOwner {
        liquidityEstablished = true;
    }
    

    // Update tax rates

    function updateFeeRates(
        uint256 newBuyFee,
        uint256 newSellFee,
        uint256 newTransferFee
    ) external onlyOwner {
        require(!taxSettings.settingsLocked, "Fee structure is locked");
        require(newTransferFee <= MAX_TAX_LIMIT, "Transfer fee exceeds maximum");
        
        if (hasReachedMaxTax) {
            // Flexible phase - can adjust freely within limits
            require(newBuyFee <= MAX_TAX_LIMIT, "Buy fee exceeds maximum");
            require(newSellFee <= MAX_TAX_LIMIT, "Sell fee exceeds maximum");
        } else {
            // Reduction phase - can only decrease
            require(newBuyFee <= taxSettings.purchaseTax, "Can only reduce buy fee");
            require(newSellFee <= taxSettings.saleTax, "Can only reduce sell fee");
            
            // Check transition to flexible phase
            if (newBuyFee <= MAX_TAX_LIMIT && newSellFee <= MAX_TAX_LIMIT) {
                hasReachedMaxTax = true;
                emit MaximumFeeLimitReached(block.timestamp, "Fee reduction complete - flexible mode activated");
            }
        }
        
        // Apply new rates
        taxSettings.purchaseTax = newBuyFee;
        taxSettings.saleTax = newSellFee;
        taxSettings.movementTax = newTransferFee;
        
        emit FeeRatesModified(newBuyFee, newSellFee, newTransferFee);
    }
    

    // Permanently lock tax config

    function lockFeeConfiguration() external onlyOwner {
        taxSettings.settingsLocked = true;
        emit FeeConfigurationLocked();
    }
    

    // Update revenue allocation settings

    function updateDistribution(
        address newPrimaryWallet,
        address newSecondaryWallet,
        address newTertiaryWallet,
        uint256 newPrimaryShare,
        uint256 newSecondaryShare,
        uint256 newTertiaryShare
    ) external onlyOwner 
      validAddress(newPrimaryWallet) 
      validAddress(newSecondaryWallet)
      validAddress(newTertiaryWallet) {
        require(newPrimaryShare + newSecondaryShare + newTertiaryShare == 10000, "Shares must total 100%");
        
        revenueAllocation.primaryWallet = payable(newPrimaryWallet);
        revenueAllocation.secondaryWallet = payable(newSecondaryWallet);
        revenueAllocation.tertiaryWallet = payable(newTertiaryWallet);
        revenueAllocation.primaryShare = newPrimaryShare;
        revenueAllocation.secondaryShare = newSecondaryShare;
        revenueAllocation.tertiaryShare = newTertiaryShare;
        
        emit DistributionUpdated(
            newPrimaryWallet, 
            newSecondaryWallet,
            newTertiaryWallet,
            newPrimaryShare, 
            newSecondaryShare,
            newTertiaryShare
        );
    }
    

    // Update safety mechanism

    function updateConversionSafeguard(uint256 newConversionCap) external onlyOwner {
        require(newConversionCap >= _tokenSupply / 5000, "Minimum 0.02% required");
        require(newConversionCap <= _tokenSupply / 20, "Maximum 5% allowed");
        
        maxSwapCap = newConversionCap;
        emit SafeguardUpdated(newConversionCap);
    }
    

    // Update MEV protection params

    function updateConversionLimit(uint256 _maxConversions) external onlyOwner {
        require(_maxConversions >= 1 && _maxConversions <= 15, "Invalid conversion limit");
        maxSwapsPerBlock = _maxConversions;
        emit ConversionLimitUpdated(_maxConversions);
    }
    

    // Update holder limit exemption

    function setLimitExemption(address account, bool exempt) external onlyOwner validAddress(account) {
        _isLimitExempt[account] = exempt;
        emit ExemptionStatusChanged(account, exempt);
    }
    

    // Update maximum holding amount

    function updateMaximumHolding(uint256 newMaximum) external onlyOwner {
        require(newMaximum >= _tokenSupply / 500, "Minimum 0.2% required");
        maxTokensPerWallet = newMaximum;
        emit HoldingLimitUpdated(newMaximum);
    }
    

    // Permanently remove all holder limits

    function deactivateLimitations() external onlyOwner {
        require(holderLimitsActive, "Limitations already inactive");
        holderLimitsActive = false;
        emit LimitationsDeactivated();
    }
    

    // Set tax exemption status

    function setFeeExemption(address account, bool exempt) external onlyOwner validAddress(account) {
        _isTaxExempt[account] = exempt;
    }
    

    // Set market pair status

    function setMarketPair(address pair, bool isPair) external onlyOwner validAddress(pair) {
        _isAMMPair[pair] = isPair;
    }
    

    // Update swap parameters

    function updateConversionSettings(uint256 newTrigger, uint256 newMaximum) external onlyOwner {
        require(newTrigger > 0, "Trigger must be positive");
        require(newMaximum >= newTrigger, "Maximum must exceed trigger");
        
        swapThreshold = newTrigger;
        maxSwapAmount = newMaximum;
    }
    

    // Manual tax conversion

    function manualConversion() external onlyOwner nonReentrant {
        _processSwapIfNeeded();
    }
    

    // Emergency ETH recovery

    function recoverETH() external onlyOwner nonReentrant {
        uint256 balance = address(this).balance;
        require(balance > 0, "No ETH to recover");
        
        payable(owner()).sendValue(balance);
    }
    
    
    // Emergency token recovery

    function recoverTokens(address tokenAddress, uint256 amount) external onlyOwner nonReentrant {
        require(tokenAddress != address(this), "Cannot recover own tokens");
        
        IERC20(tokenAddress).safeTransfer(owner(), amount);
    }
    
    // Bot Protection Functions
    
    function manageBots(address account, bool status) external onlyOwner validAddress(account) {
        require(botProtectionActive, "Bot protection permanently deactivated");
        _isBot[account] = status;
        emit BotStatusUpdated(account, status);
    }
    
    function deactivateBotLimits() external onlyOwner {
        require(botProtectionActive, "Bot protection already deactivated");
        botProtectionActive = false;
        emit BotProtectionDeactivated(block.timestamp);
    }
    
    // Ownership Renunciation Functions
    
    function initiateOwnershipRenounce() external onlyOwner {
        require(!renounceInitiated, "Renounce already initiated");
        
        renounceInitiated = true;
        renounceInitiatedAt = block.timestamp;
        
        emit OwnershipRenounceInitiated(block.timestamp, block.timestamp + RENOUNCE_DELAY);
    }
    

    function cancelOwnershipRenounce() external onlyOwner {
        require(renounceInitiated, "Renounce not initiated");
        
        renounceInitiated = false;
        renounceInitiatedAt = 0;
        
        emit OwnershipRenounceCancelled(block.timestamp);
    }
    

    function finalizeOwnershipRenounce() external onlyOwner {
        require(renounceInitiated, "Renounce not initiated");
        require(
            block.timestamp >= renounceInitiatedAt + RENOUNCE_DELAY,
            "Timelock period not elapsed"
        );
        
        emit OwnershipRenounced(block.timestamp);
        
        // Call OpenZeppelin's renounceOwnership which sets owner to address(0)
        renounceOwnership();
    }
    

    // Get ownership renunciation status
  
    function getOwnershipRenounceStatus() external view returns (
        bool initiated,
        uint256 initiatedAt,
        uint256 canRenounceAt,
        uint256 timeRemaining
    ) {
        uint256 canRenounce = renounceInitiated ? renounceInitiatedAt + RENOUNCE_DELAY : 0;
        uint256 remaining = 0;
        
        if (renounceInitiated && block.timestamp < canRenounce) {
            remaining = canRenounce - block.timestamp;
        }
        
        return (
            renounceInitiated,
            renounceInitiatedAt,
            canRenounce,
            remaining
        );
    }
    
    // View functions
    
    function isFeeExempt(address account) external view returns (bool) {
        return _isTaxExempt[account];
    }
    
    function isLimitExempt(address account) external view returns (bool) {
        return _isLimitExempt[account];
    }
    
    function isMarketPair(address pair) external view returns (bool) {
        return _isAMMPair[pair];
    }
    

    function isBot(address account) external view returns (bool) {
        return botProtectionActive && _isBot[account];
    }
    

    function getBotProtectionStatus() external view returns (bool active, string memory status) {
        if (botProtectionActive) {
            return (true, "Bot protection active - flagged addresses restricted");
        } else {
            return (false, "Bot protection permanently deactivated - all addresses can trade freely");
        }
    }
    
    function getTaxRates() external view returns (uint256 buyTax, uint256 sellTax, uint256 transferTax) {
        return (taxSettings.purchaseTax, taxSettings.saleTax, taxSettings.movementTax);
    }

    function hasLiquidityBeenAdded() external view returns (bool) {
        return liquidityEstablished;
    }
    

    // Return allocation config

    function getDistribution() external view returns (
        address primary, 
        address secondary,
        address tertiary,
        uint256 primaryShare, 
        uint256 secondaryShare,
        uint256 tertiaryShare
    ) {
        return (
            revenueAllocation.primaryWallet, 
            revenueAllocation.secondaryWallet,
            revenueAllocation.tertiaryWallet,
            revenueAllocation.primaryShare, 
            revenueAllocation.secondaryShare,
            revenueAllocation.tertiaryShare
        );
    }
    
    function getLimitationStatus() external view returns (bool active, uint256 maximum) {
        return (holderLimitsActive, maxTokensPerWallet);
    }
    
    function getSafeguardStatus() external view returns (uint256 cap, uint256 lastBlock) {
        return (maxSwapCap, lastSwapBlock);
    }
    
    function getConversionSettings() external view returns (uint256 trigger, uint256 maximum) {
        return (swapThreshold, maxSwapAmount);
    }
    

    // Return tax phase info

    function getFeePhaseStatus() external view returns (bool reachedMaximum, string memory phase) {
        if (hasReachedMaxTax) {
            return (true, "Flexible Phase: Fees adjustable within 0-5% range");
        } else {
            return (false, "Reduction Phase: Fees can only be decreased to 5%");
        }
    }
    

    // Return launch tax activation info

    function getLaunchTaxStatus() external view returns (bool activated, uint256 launchBuyFee, uint256 launchSellFee) {
        return (launchTaxActivated, LAUNCH_PURCHASE_TAX, LAUNCH_SALE_TAX);
    }
    
 
    // Returns swap stats for MEV monitoring
  
    function getConversionStats() external view returns (
        uint256 currentCount,
        uint256 currentBlock,
        uint256 lastBlock,
        bool canConvert
    ) {
        bool canConvertNow = (block.number > lastSwapBlock) || (swapExecutionCount < maxSwapsPerBlock);
        return (swapExecutionCount, block.number, lastSwapBlock, canConvertNow);
    }
    
    // Receive ETH
    receive() external payable {}
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * The initial owner is set to the address provided by the deployer. This can
 * later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol)

pragma solidity ^0.8.20;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant NOT_ENTERED = 1;
    uint256 private constant ENTERED = 2;

    uint256 private _status;

    /**
     * @dev Unauthorized reentrant call.
     */
    error ReentrancyGuardReentrantCall();

    constructor() {
        _status = NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be NOT_ENTERED
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

        // Any calls to nonReentrant after this point will fail
        _status = ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == ENTERED;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)

pragma solidity ^0.8.20;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev The ETH balance of the account is not enough to perform the operation.
     */
    error AddressInsufficientBalance(address account);

    /**
     * @dev There's no code at `target` (it is not a contract).
     */
    error AddressEmptyCode(address target);

    /**
     * @dev A call to an address target failed. The target may have reverted.
     */
    error FailedInnerCall();

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        if (address(this).balance < amount) {
            revert AddressInsufficientBalance(address(this));
        }

        (bool success, ) = recipient.call{value: amount}("");
        if (!success) {
            revert FailedInnerCall();
        }
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason or custom error, it is bubbled
     * up by this function (like regular Solidity function calls). However, if
     * the call reverted with no returned reason, this function reverts with a
     * {FailedInnerCall} error.
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        if (address(this).balance < value) {
            revert AddressInsufficientBalance(address(this));
        }
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
     * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an
     * unsuccessful call.
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata
    ) internal view returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            // only check if target is a contract if the call was successful and the return data is empty
            // otherwise we already know that it was a contract
            if (returndata.length == 0 && target.code.length == 0) {
                revert AddressEmptyCode(target);
            }
            return returndata;
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
     * revert reason or with a default {FailedInnerCall} error.
     */
    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            return returndata;
        }
    }

    /**
     * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.
     */
    function _revert(bytes memory returndata) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert FailedInnerCall();
        }
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.20;

import {IERC20} from "../IERC20.sol";
import {IERC20Permit} from "../extensions/IERC20Permit.sol";
import {Address} from "../../../utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    /**
     * @dev An operation with an ERC20 token failed.
     */
    error SafeERC20FailedOperation(address token);

    /**
     * @dev Indicates a failed `decreaseAllowance` request.
     */
    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);

    /**
     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
    }

    /**
     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
     */
    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
    }

    /**
     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 oldAllowance = token.allowance(address(this), spender);
        forceApprove(token, spender, oldAllowance + value);
    }

    /**
     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no
     * value, non-reverting calls are assumed to be successful.
     */
    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
        unchecked {
            uint256 currentAllowance = token.allowance(address(this), spender);
            if (currentAllowance < requestedDecrease) {
                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
            }
            forceApprove(token, spender, currentAllowance - requestedDecrease);
        }
    }

    /**
     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
     * to be set to zero before setting it to a non-zero value, such as USDT.
     */
    function forceApprove(IERC20 token, address spender, uint256 value) internal {
        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));

        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
            _callOptionalReturn(token, approvalCall);
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data);
        if (returndata.length != 0 && !abi.decode(returndata, (bool))) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     *
     * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
     */
    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false
        // and not revert is the subcall reverts.

        (bool success, bytes memory returndata) = address(token).call(data);
        return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;

import {IERC20} from "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 *
 * ==== Security Considerations
 *
 * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature
 * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be
 * considered as an intention to spend the allowance in any specific way. The second is that because permits have
 * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should
 * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be
 * generally recommended is:
 *
 * ```solidity
 * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
 *     try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}
 *     doThing(..., value);
 * }
 *
 * function doThing(..., uint256 value) public {
 *     token.safeTransferFrom(msg.sender, address(this), value);
 *     ...
 * }
 * ```
 *
 * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of
 * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also
 * {SafeERC20-safeTransferFrom}).
 *
 * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so
 * contracts should have entry points that don't rely on permit.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     *
     * CAUTION: See Security Considerations above.
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

Settings
{
  "remappings": [
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "cancun",
  "viaIR": true
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"address","name":"primaryTaxReceiver","type":"address"},{"internalType":"address","name":"secondaryTaxReceiver","type":"address"},{"internalType":"address","name":"tertiaryTaxReceiver","type":"address"},{"internalType":"address","name":"routerAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"BotProtectionDeactivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"BotStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxConversions","type":"uint256"}],"name":"ConversionLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"primaryWallet","type":"address"},{"indexed":false,"internalType":"address","name":"secondaryWallet","type":"address"},{"indexed":false,"internalType":"address","name":"tertiaryWallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"primaryShare","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"secondaryShare","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tertiaryShare","type":"uint256"}],"name":"DistributionUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"exempt","type":"bool"}],"name":"ExemptionStatusChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"FeeConfigurationLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensProcessed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethGenerated","type":"uint256"}],"name":"FeeConversionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"buyFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transferFee","type":"uint256"}],"name":"FeeRatesModified","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"HoldingLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"buyFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"LaunchFeesActivated","type":"event"},{"anonymous":false,"inputs":[],"name":"LimitationsDeactivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"LiquidityConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"MaximumFeeLimitReached","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"OwnershipRenounceCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"effectiveAt","type":"uint256"}],"name":"OwnershipRenounceInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requestedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"actualAmount","type":"uint256"}],"name":"SafeguardTriggered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newConversionCap","type":"uint256"}],"name":"SafeguardUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TradingActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"LAUNCH_PURCHASE_TAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LAUNCH_SALE_TAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TAX_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RENOUNCE_DELAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TAX_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VESTING_CONTRACT_SABLIER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VESTING_CONTRACT_UNICRYPT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activateLaunchTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"botProtectionActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelOwnershipRenounce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deactivateBotLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deactivateLimitations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finalizeOwnershipRenounce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBotProtectionStatus","outputs":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"string","name":"status","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getConversionSettings","outputs":[{"internalType":"uint256","name":"trigger","type":"uint256"},{"internalType":"uint256","name":"maximum","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getConversionStats","outputs":[{"internalType":"uint256","name":"currentCount","type":"uint256"},{"internalType":"uint256","name":"currentBlock","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"},{"internalType":"bool","name":"canConvert","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDistribution","outputs":[{"internalType":"address","name":"primary","type":"address"},{"internalType":"address","name":"secondary","type":"address"},{"internalType":"address","name":"tertiary","type":"address"},{"internalType":"uint256","name":"primaryShare","type":"uint256"},{"internalType":"uint256","name":"secondaryShare","type":"uint256"},{"internalType":"uint256","name":"tertiaryShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFeePhaseStatus","outputs":[{"internalType":"bool","name":"reachedMaximum","type":"bool"},{"internalType":"string","name":"phase","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLaunchTaxStatus","outputs":[{"internalType":"bool","name":"activated","type":"bool"},{"internalType":"uint256","name":"launchBuyFee","type":"uint256"},{"internalType":"uint256","name":"launchSellFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLimitationStatus","outputs":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"uint256","name":"maximum","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwnershipRenounceStatus","outputs":[{"internalType":"bool","name":"initiated","type":"bool"},{"internalType":"uint256","name":"initiatedAt","type":"uint256"},{"internalType":"uint256","name":"canRenounceAt","type":"uint256"},{"internalType":"uint256","name":"timeRemaining","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSafeguardStatus","outputs":[{"internalType":"uint256","name":"cap","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxRates","outputs":[{"internalType":"uint256","name":"buyTax","type":"uint256"},{"internalType":"uint256","name":"sellTax","type":"uint256"},{"internalType":"uint256","name":"transferTax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasLiquidityBeenAdded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasReachedMaxTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holderLimitsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initiateOwnershipRenounce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isLimitExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"isMarketPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSwapBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTaxActivated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityEstablished","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockFeeConfiguration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mainPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"manageBots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualConversion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxSwapCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSwapsPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokensPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceInitiated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceInitiatedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revenueAllocation","outputs":[{"internalType":"address payable","name":"primaryWallet","type":"address"},{"internalType":"address payable","name":"secondaryWallet","type":"address"},{"internalType":"address payable","name":"tertiaryWallet","type":"address"},{"internalType":"uint256","name":"primaryShare","type":"uint256"},{"internalType":"uint256","name":"secondaryShare","type":"uint256"},{"internalType":"uint256","name":"tertiaryShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setFeeExemption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setLimitExemption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setLiquidityEstablished","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"isPair","type":"bool"}],"name":"setMarketPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapExecutionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxSettings","outputs":[{"internalType":"uint256","name":"purchaseTax","type":"uint256"},{"internalType":"uint256","name":"saleTax","type":"uint256"},{"internalType":"uint256","name":"movementTax","type":"uint256"},{"internalType":"bool","name":"settingsLocked","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxConversions","type":"uint256"}],"name":"updateConversionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newConversionCap","type":"uint256"}],"name":"updateConversionSafeguard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTrigger","type":"uint256"},{"internalType":"uint256","name":"newMaximum","type":"uint256"}],"name":"updateConversionSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPrimaryWallet","type":"address"},{"internalType":"address","name":"newSecondaryWallet","type":"address"},{"internalType":"address","name":"newTertiaryWallet","type":"address"},{"internalType":"uint256","name":"newPrimaryShare","type":"uint256"},{"internalType":"uint256","name":"newSecondaryShare","type":"uint256"},{"internalType":"uint256","name":"newTertiaryShare","type":"uint256"}],"name":"updateDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBuyFee","type":"uint256"},{"internalType":"uint256","name":"newSellFee","type":"uint256"},{"internalType":"uint256","name":"newTransferFee","type":"uint256"}],"name":"updateFeeRates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaximum","type":"uint256"}],"name":"updateMaximumHolding","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wrappedNative","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e0806040523461075e57613857803803809161001c82856109dd565b8339810160e08282031261075e5781516001600160401b03811161075e5781610046918401610a00565b602083015190916001600160401b03821161075e57610066918401610a00565b9160408101519061007960608201610a55565b9161008660808301610a55565b9061009f60c061009860a08601610a55565b9401610a55565b9333156109ca575f8054336001600160a01b0319821681178355916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a360018055600160ff196015541617601555600160ff1960175416176017556008601f5560018060a01b031691610121831515610a69565b6001600160a01b031692610136841515610a69565b6001600160a01b03169361014b851515610a69565b6001600160a01b0316958615956101628715610a69565b8051906001600160401b0382116107ed5760055490600182811c921680156109c0575b60208310146108e05781601f84931161096f575b50602090601f8311600114610909575f926108fe575b50508160011b915f199060031b1c1916176005555b8051906001600160401b0382116107ed5760065490600182811c921680156108f4575b60208310146108e05781601f849311610872575b50602090601f831160011461080c575f92610801575b50508160011b915f199060031b1c1916176006555b670de0b6b3a7640000810290808204670de0b6b3a7640000149015171561071857600455604051608081016001600160401b038111828210176107ed575f9160609160405282815282602082015282604082015201525f6007555f6008555f60095560ff19600a5416600a5560405160c0810181811060018060401b038211176107ed57610d069160a091604052838152846020820152856040820152610d056060820152610d056080820152015260018060a01b0319600b541617600b5560018060a01b0319600c541617600c5560018060a01b0319600d541617600d55610d05600e55610d05600f55610d0660105561ffff1960115416601155816080526040516315ab88c960e31b8152602081600481865afa90811561076a575f916107b3575b5060c05260405163c45a015560e01b8152602081600481865afa90811561076a575f91610775575b5060c0516040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291602091839160449183915f91165af190811561076a575f9161072c575b508060a05260018060a01b0316805f52601360205260405f20600160ff198254161790556004546107d08104601a5560c88104601b55606481046020558060011b908082046002149015171561071857606490046018555f80546001600160a01b0390811682526012602090815260408084208054600160ff199182168117909255308087528387208054831684179055898752838720805483168417905586548616875260198552838720805483168417905586528286208054821683179055888652828620805482168317905595855281852080548716821790557fc73b1d6eda13a615b81c31830292dbbbf5fbb07f472982e223002bd83d5c3dc480548716821790557f1eb066d87b72060d3d3bdb4cc32f81ad9029ddffeed6c5a0a52ba94ba0f3375780548716821790557f3bdb5f5b34701d11bdb7eacdfbf43ff547fc5df898f52d8ea62e4efd03dae49480548716821790557f266d3165628366953508d24e45bcc6109e01db5ed73ab9459223510a6d7b51c280548716821790557fd4ea5e2214274dc877954bb8f8fca2048124ef4b45a615afd054fd9422323efb80548716821790557fea84929eb66d7c3618b0d6ac81e31a8fd9b75e9f45366e196c6c91858cac46a180548716821790557f8a430533214e460237ecd6ca55f1bedc0723ac90ebf08459f7ed2a5981eef1ef805490961617909455600454835483168452600282528484208190558354945190815293909116927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a330156106d35761068e57305f52600360205260405f20815f5260205260405f205f1990556040515f1981527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203092a3604051612daf9081610aa882396080518181816108420152612b02015260a051818181610d52015281816125fe015261267f015260c05181818161063c0152612ad10152f35b60405162461bcd60e51b815260206004820152601760248201527f417070726f766520746f207a65726f20616464726573730000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601960248201527f417070726f76652066726f6d207a65726f2061646472657373000000000000006044820152606490fd5b634e487b7160e01b5f52601160045260245ffd5b90506020813d602011610762575b81610747602093836109dd565b8101031261075e5761075890610a55565b5f6103b7565b5f80fd5b3d915061073a565b6040513d5f823e3d90fd5b90506020813d6020116107ab575b81610790602093836109dd565b8101031261075e5760206107a45f92610a55565b9150610372565b3d9150610783565b90506020813d6020116107e5575b816107ce602093836109dd565b8101031261075e576107df90610a55565b5f61034a565b3d91506107c1565b634e487b7160e01b5f52604160045260245ffd5b015190505f80610211565b60065f9081528281209350601f198516905b81811061085a5750908460019594939210610842575b505050811b01600655610226565b01515f1960f88460031b161c191690555f8080610834565b9293602060018192878601518155019501930161081e565b60065f529091507ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f601f840160051c810191602085106108d6575b90601f859493920160051c01905b8181106108c857506101fb565b5f81558493506001016108bb565b90915081906108ad565b634e487b7160e01b5f52602260045260245ffd5b91607f16916101e7565b015190505f806101af565b60055f9081528281209350601f198516905b818110610957575090846001959493921061093f575b505050811b016005556101c4565b01515f1960f88460031b161c191690555f8080610931565b9293602060018192878601518155019501930161091b565b90915060055f5260205f20601f840160051c810191602085106109b6575b90601f859493920160051c01905b8181106109a85750610199565b5f815584935060010161099b565b909150819061098d565b91607f1691610185565b631e4fbdf760e01b5f525f60045260245ffd5b601f909101601f19168101906001600160401b038211908210176107ed57604052565b81601f8201121561075e578051906001600160401b0382116107ed5760405192610a34601f8401601f1916602001856109dd565b8284526020838301011161075e57815f9260208093018386015e8301015290565b51906001600160a01b038216820361075e57565b15610a7057565b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606490fdfe6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c806302b3baf714611f2c5780630445b66714611f0f5780630614117a14611e9a578063069c9fae14611d7b57806306fdde0314611cc057806307accb6614611ca4578063095ea7b314611c7e5780631178957314611b715780631179882e14611b55578063160b6d6914611af857806318160ddd14611adb5780631cced51b14611a7b5780631e4c6adb14611a5257806321cd3a60146107c057806323b872dd1461199457806323c4253b14611948578063260d86421461188a57806328952c37146117035780632a61ff9a1461141a57806331392fcb146113dc578063313ce567146113c1578063322f6de41461139f5780633bbac5791461134e5780633ce7fe51146113325780633ecad271146112f55780633f4218e0146112b857806341d8fdf514611293578063431c63a91461127b5780634463c1b2146111fd578063469132ce146111e05780634ada218b146111bb578063553c99fa14611199578063591f09eb1461117c5780635b6663fd146110cf5780635e1d8f591461101a57806364d2681414610fec57806364dd60fe14610f5657806365cf7c9b14610f3957806367df0f9a14610f1c57806370a0823114610ee4578063715018a614610ec4578063751fd17914610e7a57806379ee967c14610d9e5780637e70c8c814610d8157806385af30c514610d3d57806386d0ada814610d0f5780638a8c523c14610c0a5780638da5cb5b14610be35780639426d2d914610bbf57806395d89b4114610ab75780639679266914610a9a578063a3ed1cfc14610a6c578063a51c9ace14610a50578063a9059cbb14610a1f578063a9cc4d08146109d4578063aea348aa146109b2578063b0c150af14610975578063b8a7d10814610944578063b94820b414610919578063bcdaa54b146108bb578063c16dd4a414610871578063c31c9c071461082d578063caf67b5714610801578063cff812aa146107e5578063d033aae5146107c0578063d33b86f31461072e578063dd62ed3e146106de578063e69342c9146106a9578063e71b23331461068d578063e94457c31461066b578063eb6d3a1114610627578063efb7b7cb14610603578063efe23e8614610529578063f2fde38b146104a4578063fb79bb681461040d5763fffa40dd0361000e5734610409575f3660031901126104095761037a61232b565b60155460ff8116156103b95760ff19166015557f0d858a4f0c83da3468fbbf223c07b328590b6abb80fe865406b6ea5f92ac15ff6020604051428152a1005b60405162461bcd60e51b815260206004820152602260248201527f426f742070726f74656374696f6e20616c726561647920646561637469766174604482015261195960f21b6064820152608490fd5b5f80fd5b346104095760203660031901126104095760043561042961232b565b6101f4600454048110610467576020817f84fc38d1161276e5c238cae9048c3566815ce68e35ebc8d75e2d78a5127c3aa592601855604051908152a1005b60405162461bcd60e51b8152602060048201526015602482015274135a5b9a5b5d5b480c0b8c89481c995c5d5a5c9959605a1b6044820152606490fd5b34610409576020366003190112610409576104bd611fde565b6104c561232b565b6001600160a01b03168015610516575f80546001600160a01b03198116831782556001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3005b631e4fbdf760e01b5f525f60045260245ffd5b34610409576105373661204a565b9061054061232b565b6001600160a01b03169061055582151561215a565b60ff60155416156105af5760207f066e0c23b9ae0bb92a88e9b0985bb7d85fce062730057312b99a9e243fde5ee191835f52601482526105a48160405f209060ff801983541691151516179055565b6040519015158152a2005b60405162461bcd60e51b815260206004820152602660248201527f426f742070726f74656374696f6e207065726d616e656e746c792064656163746044820152651a5d985d195960d21b6064820152608490fd5b34610409575f366003190112610409576040602054601e5482519182526020820152f35b34610409575f366003190112610409576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610409575f36600319011261040957602060ff601154166040519015158152f35b34610409575f366003190112610409576020604051611c208152f35b34610409575f36600319011261040957606060ff60115460081c1660405190151581526109c46020820152610bb86040820152f35b34610409576040366003190112610409576106f7611fde565b6106ff611ff4565b6001600160a01b039182165f908152600360209081526040808320949093168252928352819020549051908152f35b34610409575f3660031901126104095760225460ff1680156107b75760215490611c2082018092116107a3576080915b5f90828061079a575b610788575b6021546040519315158452602084015260408301526060820152f35b9050610794428261214d565b9061076c565b50804210610767565b634e487b7160e01b5f52601160045260245ffd5b6080905f61075e565b34610409575f36600319011261040957602060ff60155460101c166040519015158152f35b34610409575f3660031901126104095760206040516109c48152f35b34610409575f36600319011261040957610819612271565b906108296040519283928361202e565b0390f35b34610409575f366003190112610409576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610409576100186108823661204a565b9061088b61232b565b6001600160a01b031661089f81151561215a565b5f52601360205260405f209060ff801983541691151516179055565b34610409575f366003190112610409576108d361232b565b6022546108e260ff8216612079565b60ff19166022555f6021557fe93e99d362449e9573ae25730e6f6eff71fc2b1b5486a29295d061e0bdfa833c6020604051428152a1005b34610409575f3660031901126104095761093161232b565b6015805462ff0000191662010000179055005b34610409575f3660031901126104095760075460085460095460408051938452602084019290925290820152606090f35b34610409576020366003190112610409576001600160a01b03610996611fde565b165f526019602052602060ff60405f2054166040519015158152f35b34610409575f36600319011261040957602060ff601554166040519015158152f35b34610409575f366003190112610409576109ec61232b565b600160ff19600a541617600a557f3d29721bcbd84f0eb7c679d1c0875b92dabfd6c238353f8d09eac6c3ac0c4f215f80a1005b3461040957604036600319011261040957610a45610a3b611fde565b60243590336124e9565b602060405160018152f35b34610409575f3660031901126104095760206040516127108152f35b34610409575f36600319011261040957602060405173cf8ce57fa442ba50acbc57147a62ad03873ffa738152f35b34610409575f366003190112610409576020601f54604051908152f35b34610409575f366003190112610409576040515f6006548060011c90600181168015610bb5575b602083108114610ba157828552908115610b7d5750600114610b1f575b61082983610b0b818503826120cb565b60405191829160208352602083019061200a565b91905060065f527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f915f905b808210610b6357509091508101602001610b0b610afb565b919260018160209254838588010152019101909291610b4b565b60ff191660208086019190915291151560051b84019091019150610b0b9050610afb565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610ade565b34610409575f366003190112610409576040601a54601b5482519182526020820152f35b34610409575f366003190112610409575f546040516001600160a01b039091168152602090f35b34610409575f36600319011261040957610c2261232b565b60155460ff8160081c16610cca5760ff8160101c1615610c79576101009061ff00191617601555426016557fd15516581de850be0c78749799d4ea7e2c98b7712f730dc1f6731b29651e15ba6020604051428152a1005b60405162461bcd60e51b815260206004820152602360248201527f4c6971756964697479206d7573742062652065737461626c69736865642066696044820152621c9cdd60ea1b6064820152608490fd5b60405162461bcd60e51b815260206004820152601960248201527f54726164696e6720697320616c726561647920616374697665000000000000006044820152606490fd5b34610409575f36600319011261040957610d2761232b565b610d2f612351565b610d37612a43565b60018055005b34610409575f366003190112610409576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610409575f366003190112610409576020601d54604051908152f35b3461040957602036600319011261040957600435610dba61232b565b60045461138881048210610e3c57601490048111610e02576020817f22b1193d7139c308983ce8dbe4efca430cb53c56ece2b8f34a300f03d9d66e08928255604051908152a1005b60405162461bcd60e51b815260206004820152601260248201527113585e1a5b5d5b480d4948185b1b1bddd95960721b6044820152606490fd5b60405162461bcd60e51b8152602060048201526016602482015275135a5b9a5b5d5b480c0b8c0c89481c995c5d5a5c995960521b6044820152606490fd5b3461040957610018610e8b3661204a565b90610e9461232b565b6001600160a01b0316610ea881151561215a565b5f52601260205260405f209060ff801983541691151516179055565b34610409575f36600319011261040957610edc61232b565b610018612a04565b34610409576020366003190112610409576001600160a01b03610f05611fde565b165f526002602052602060405f2054604051908152f35b34610409575f366003190112610409576020602154604051908152f35b34610409575f366003190112610409576020601654604051908152f35b34610409575f36600319011261040957610f6e61232b565b60175460ff811615610fa75760ff19166017557fb9eab3a54066471a0b601f34de529a4aba0e964778a849236c48464b619bc6195f80a1005b60405162461bcd60e51b815260206004820152601c60248201527f4c696d69746174696f6e7320616c726561647920696e616374697665000000006044820152606490fd5b34610409575f36600319011261040957602060405173dba68f07d1b7ca219f78ae8582c213d975c25caf8152f35b34610409575f3660031901126104095761103261232b565b60225460ff811661108a5760019060ff19161760225542602155611c2042018042116107a35760407f70edb0008b0033e7ad9480799b6dbdbb0375d73b6a83a94db4f02231f32ece4e918151904282526020820152a1005b60405162461bcd60e51b815260206004820152601a60248201527f52656e6f756e636520616c726561647920696e697469617465640000000000006044820152606490fd5b34610409576020366003190112610409576004356110eb61232b565b600181101580611171575b1561112c576020817f2a07306762369a0a6201970cf8f362080ffc18e2f304f186587460c3cfcb4bb692601f55604051908152a1005b60405162461bcd60e51b815260206004820152601860248201527f496e76616c696420636f6e76657273696f6e206c696d697400000000000000006044820152606490fd5b50600f8111156110f6565b34610409575f366003190112610409576020601e54604051908152f35b34610409575f36600319011261040957602060ff601754166040519015158152f35b34610409575f36600319011261040957602060ff60155460081c166040519015158152f35b34610409575f366003190112610409576020601854604051908152f35b34610409577f9543841f85a7b3bdb94910b0677a8a258374b6bddc910fc5d16b11940ab1ecab604061122e3661204a565b9061123761232b565b6001600160a01b03169061124c82151561215a565b815f52601960205261126c81845f209060ff801983541691151516179055565b825191825215156020820152a1005b34610409575f36600319011261040957610819612198565b34610409575f36600319011261040957602060ff60115460081c166040519015158152f35b34610409576020366003190112610409576001600160a01b036112d9611fde565b165f526012602052602060ff60405f2054166040519015158152f35b34610409576020366003190112610409576001600160a01b03611316611fde565b165f526013602052602060ff60405f2054166040519015158152f35b34610409575f3660031901126104095760206040516101f48152f35b3461040957602036600319011261040957611367611fde565b60ff6015541680611380575b6020906040519015158152f35b5060018060a01b03165f526014602052602060ff60405f205416611373565b34610409575f36600319011261040957602060ff602254166040519015158152f35b34610409575f36600319011261040957602060405160128152f35b34610409575f36600319011261040957600754600854600954600a546040805194855260208501939093529183015260ff1615156060820152608090f35b346104095760603660031901126104095760443560243560043561143c61232b565b61144b60ff600a541615612101565b6101f483116116be5760115460ff81161561155157506101f4811161150c576101f482116114c7576114c27f3df3aece49f46a771f2f3e812e2fbf42b7cf283415dc8be206fc78bf01c5d19a935b826007558360085580600955604051938493846040919493926060820195825260208201520152565b0390a1005b60405162461bcd60e51b815260206004820152601860248201527f53656c6c206665652065786365656473206d6178696d756d00000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527f427579206665652065786365656473206d6178696d756d0000000000000000006044820152606490fd5b6007548211611679576008548311611634577f3df3aece49f46a771f2f3e812e2fbf42b7cf283415dc8be206fc78bf01c5d19a936114c2916101f484111580611628575b6115a0575b50611499565b60019060ff1916176011557f90af161b25909a141b9a01021e25521ae99456f571d29fdf6d06f211354450a260a060405142815260406020820152603060408201527f46656520726564756374696f6e20636f6d706c657465202d20666c657869626c60608201526f19481b5bd919481858dd1a5d985d195960821b6080820152a18561159a565b506101f4851115611595565b60405162461bcd60e51b815260206004820152601860248201527f43616e206f6e6c79207265647563652073656c6c2066656500000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527f43616e206f6e6c792072656475636520627579206665650000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f5472616e73666572206665652065786365656473206d6178696d756d000000006044820152606490fd5b346104095760c03660031901126104095761171c611fde565b611724611ff4565b6044356001600160a01b03811692908381036104095760a43560843560643561174b61232b565b6001600160a01b0385169361176185151561215a565b6001600160a01b0387169761177789151561215a565b61178281151561215a565b6127106117988661179387876120be565b6120be565b0361184c577f6a05c06b158afbcef31aa40bd0089e9278f523a4c9c6d580213536ac062b1231986114c2966001600160601b0360a01b600b541617600b556001600160601b0360a01b600c541617600c556001600160601b0360a01b600d541617600d5581600e5582600f5583601055604051968796879260a094919796959260c0850198600180881b03168552600180871b03166020850152600180861b03166040840152606083015260808201520152565b60405162461bcd60e51b8152602060048201526016602482015275536861726573206d75737420746f74616c203130302560501b6044820152606490fd5b34610409576040366003190112610409576024356004356118a961232b565b8015611903578082106118be57601a55601b55005b60405162461bcd60e51b815260206004820152601b60248201527f4d6178696d756d206d75737420657863656564207472696767657200000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601860248201527f54726967676572206d75737420626520706f73697469766500000000000000006044820152606490fd5b34610409575f36600319011261040957601e548043118015611987575b601d546040805191825243602083015281019290925215156060820152608090f35b50601d54601f5411611965565b34610409576060366003190112610409576119ad611fde565b6119b5611ff4565b6001600160a01b0382165f9081526003602090815260408083203384529091529020549190604435808410611a0357610a45936119f6826119fb94866124e9565b61214d565b9033906123fc565b60405162461bcd60e51b815260206004820152602160248201527f5472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636044820152606560f81b6064820152608490fd5b34610409575f36600319011261040957604060ff60175416601854825191151582526020820152f35b34610409575f36600319011261040957600b54600c54600d54600e54600f54601054604080516001600160a01b039788168152958716602087015295909316948401949094526060830152608082019290925260a081019190915260c090f35b34610409575f366003190112610409576020600454604051908152f35b34610409575f36600319011261040957600b54600c54600d54600e54600f54601054604080516001600160a01b039788168152958716602087015293909516928401929092526060830152608082015260a081019190915260c090f35b34610409575f366003190112610409576020604051610bb88152f35b34610409575f36600319011261040957611b8961232b565b60115460ff8160081c16611c395761010090611baa60ff600a541615612101565b6109c4600755610bb86008555f60095561ffff1916176011557fda8ff0f79d9adcb8200cdf564f456d60593e04d3f2cef5645fc5402ee6800d6760606040516109c48152610bb86020820152426040820152a17f3df3aece49f46a771f2f3e812e2fbf42b7cf283415dc8be206fc78bf01c5d19a60606040516109c48152610bb860208201525f6040820152a1005b60405162461bcd60e51b815260206004820152601960248201527f4c61756e63682074617820616c726561647920616374697665000000000000006044820152606490fd5b3461040957604036600319011261040957610a45611c9a611fde565b60243590336123fc565b34610409575f3660031901126104095760208054604051908152f35b34610409575f366003190112610409576040515f6005548060011c90600181168015611d71575b602083108114610ba157828552908115610b7d5750600114611d135761082983610b0b818503826120cb565b91905060055f527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0915f905b808210611d5757509091508101602001610b0b610afb565b919260018160209254838588010152019101909291611d3f565b91607f1691611ce7565b3461040957604036600319011261040957611d94611fde565b611d9c61232b565b611da4612351565b6001600160a01b0316308114611e5557611e065f8060018060a01b03815416604051602081019163a9059cbb60e01b83526024820152602435604482015260448152611df16064826120cb565b519082865af1611dff612371565b9083612d2a565b8051908115159182611e31575b5050611e1f5760018055005b635274afe760e01b5f5260045260245ffd5b81925090602091810103126104095760200151801590811503610409578280611e13565b60405162461bcd60e51b815260206004820152601960248201527f43616e6e6f74207265636f766572206f776e20746f6b656e73000000000000006044820152606490fd5b34610409575f36600319011261040957611eb261232b565b611eba612351565b478015611ed6575f54610d3791906001600160a01b03166123b0565b60405162461bcd60e51b815260206004820152601160248201527027379022aa24103a37903932b1b7bb32b960791b6044820152606490fd5b34610409575f366003190112610409576020601a54604051908152f35b34610409575f36600319011261040957611f4461232b565b611f5260ff60225416612079565b602154611c2081018091116107a3574210611f99577f7738dc8b7a10a5636dceada812073a582b717ce047d82cd0e4918662b2e7c7736020604051428152a1610edc61232b565b60405162461bcd60e51b815260206004820152601b60248201527f54696d656c6f636b20706572696f64206e6f7420656c617073656400000000006044820152606490fd5b600435906001600160a01b038216820361040957565b602435906001600160a01b038216820361040957565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b604090612047939215158152816020820152019061200a565b90565b6040906003190112610409576004356001600160a01b0381168103610409579060243580151581036104095790565b1561208057565b60405162461bcd60e51b815260206004820152601660248201527514995b9bdd5b98d9481b9bdd081a5b9a5d1a585d195960521b6044820152606490fd5b919082018092116107a357565b90601f8019910116810190811067ffffffffffffffff8211176120ed57604052565b634e487b7160e01b5f52604160045260245ffd5b1561210857565b60405162461bcd60e51b815260206004820152601760248201527f46656520737472756374757265206973206c6f636b65640000000000000000006044820152606490fd5b919082039182116107a357565b1561216157565b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606490fd5b60155460ff16156121fe576001906040516121b46060826120cb565b603481527f426f742070726f74656374696f6e20616374697665202d20666c6167676564206020820152731859191c995cdcd95cc81c995cdd1c9a58dd195960621b604082015290565b5f9060405161220e6080826120cb565b604781527f426f742070726f74656374696f6e207065726d616e656e746c7920646561637460208201527f697661746564202d20616c6c206164647265737365732063616e20747261646560408201526620667265656c7960c81b606082015290565b60115460ff16156122d45760019060405161228d6060826120cb565b603181527f466c657869626c652050686173653a20466565732061646a75737461626c652060208201527077697468696e20302d35252072616e676560781b604082015290565b5f906040516122e46060826120cb565b603181527f526564756374696f6e2050686173653a20466565732063616e206f6e6c792062602082015270652064656372656173656420746f20352560781b604082015290565b5f546001600160a01b0316330361233e57565b63118cdaa760e01b5f523360045260245ffd5b600260015414612362576002600155565b633ee5aeb560e01b5f5260045ffd5b3d156123ab573d9067ffffffffffffffff82116120ed57604051916123a0601f8201601f1916602001846120cb565b82523d5f602084013e565b606090565b8147106123e9575f918291829182916001600160a01b03165af16123d2612371565b50156123da57565b630a12f52160e11b5f5260045ffd5b63cd78605960e01b5f523060045260245ffd5b6001600160a01b03169081156124a4576001600160a01b031691821561245f5760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591835f526003825260405f20855f5282528060405f2055604051908152a3565b60405162461bcd60e51b815260206004820152601760248201527f417070726f766520746f207a65726f20616464726573730000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601960248201527f417070726f76652066726f6d207a65726f2061646472657373000000000000006044820152606490fd5b6001600160a01b0316919082156129bf576001600160a01b031691821561297a57811561293657805f5260026020528160405f2054106128fa57601554839260ff8216806128e4575b612878575b825f52601260205260ff60405f20541615918261285f575b82612851575b50818061283b575b61282e575b8091612754575b5060ff601754168061273d575b6126b0575b60207fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91835f526002825260405f206125b582825461214d565b9055845f526002825260405f206125cd8282546120be565b9055604051908152a36015549060ff8260101c16158091819261267d575b506125f4575050565b6125fc575b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165f90815260026020526040902054600454611388900410156125f957620100009062ff00001916176015557fa498c9eb5ae11804841330295db8e91fbbc7d515ef50f0ef32c3109a054d32d06020604051428152a1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161490505f6125eb565b825f52601960205260ff60405f20541661257b57915f5260026020526126da8260405f20546120be565b601854106126e957829161257b565b60405162461bcd60e51b815260206004820152602660248201527f5472616e736665722065786365656473206d6178696d756d20686f6c64696e67604482015265081b1a5b5a5d60d21b6064820152608490fd5b50825f52601960205260ff60405f20541615612576565b825f52601360205260ff60405f2054165f146127fc5761271061277a6007545b83612d17565b049081612788575b50612569565b819250906127959161214d565b90825f52600260205260405f206127ad82825461214d565b9055305f52600260205260405f206127c68282546120be565b9055604051908152827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203093a35f80612782565b835f52601360205260ff60405f2054165f146128205761271061277a600854612774565b61271061277a600954612774565b612836612a43565b612562565b50835f52601360205260ff60405f20541661255d565b60081c60ff1691505f612555565b9150835f52601260205260ff60405f205416159161254f565b5f549093506001600160a01b0316841480156128d9575b1561289b578392612537565b60405162461bcd60e51b8152602060048201526016602482015275426f74207265737472696374696f6e2061637469766560501b6044820152606490fd5b5061dead841461288f565b50825f52601460205260ff60405f205416612532565b60405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606490fd5b606460405162461bcd60e51b815260206004820152602060248201527f5472616e7366657220616d6f756e74206d75737420626520706f7369746976656044820152fd5b60405162461bcd60e51b815260206004820152601860248201527f5472616e7366657220746f207a65726f206164647265737300000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601a60248201527f5472616e736665722066726f6d207a65726f20616464726573730000000000006044820152606490fd5b5f80546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3565b5f305f52600260205260405f2054601c5460ff81161580612d0c575b612a6857505050565b601e544311612d03575b601d54601f541115612cfe57601b54808311612cf6575b50602054808311612ced575b5060ff1916600117601c55604051612aae6060826120cb565b60028152602081016040368237815115612cd957308152815160011015612cd9577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811660408401527f000000000000000000000000000000000000000000000000000000000000000016904261012c81019081106107a357823b1561040957929060405193849263791ac94760e01b845260a48401908760048601525f602486015260a060448601525180915260c4840192905f5b818110612cb7575050505f838195938193306064840152608483015203925af1612ca2575b5060ff19601c5416601c554780612bd3575b5050601d54905f198214612bbf5750600101601d5543601e55565b634e487b7160e01b81526011600452602490fd5b7faf4e88398a0e1b285c35d078e99a9a51fa19ac78f06ea698acc12cac61254f5d91604091612710612c07600e5483612d17565b04612710612c17600f5484612d17565b04612c26816119f6848661214d565b9180612c86575b5080612c6a575b5080612c4e575b5082519182526020820152a15f80612ba4565b600d54612c6491906001600160a01b03166123b0565b5f612c3b565b600c54612c8091906001600160a01b03166123b0565b5f612c34565b600b54612c9c91906001600160a01b03166123b0565b5f612c2d565b612caf9192505f906120cb565b5f905f612b92565b82516001600160a01b0316855287955060209485019490920191600101612b6d565b634e487b7160e01b5f52603260045260245ffd5b91506001612a95565b91505f612a89565b505050565b5f601d55612a72565b50601a548211612a5f565b818102929181159184041417156107a357565b90612d3f57508051156123da57805190602001fd5b81511580612d70575b612d50575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b15612d4856fea26469706673582212200b58ca396884b1419cf4cc520ad8ede4aeefb26dd6398f380a3f60bd4726048e64736f6c634300081e003300000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000005f5e1000000000000000000000000002e78a696e3b9ecaa08d5f9127921dc0ff7b3b0d00000000000000000000000002e78a696e3b9ecaa08d5f9127921dc0ff7b3b0d00000000000000000000000002e78a696e3b9ecaa08d5f9127921dc0ff7b3b0d00000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000000000000000000000000000000000000000000006456e69676d6100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003454e580000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c806302b3baf714611f2c5780630445b66714611f0f5780630614117a14611e9a578063069c9fae14611d7b57806306fdde0314611cc057806307accb6614611ca4578063095ea7b314611c7e5780631178957314611b715780631179882e14611b55578063160b6d6914611af857806318160ddd14611adb5780631cced51b14611a7b5780631e4c6adb14611a5257806321cd3a60146107c057806323b872dd1461199457806323c4253b14611948578063260d86421461188a57806328952c37146117035780632a61ff9a1461141a57806331392fcb146113dc578063313ce567146113c1578063322f6de41461139f5780633bbac5791461134e5780633ce7fe51146113325780633ecad271146112f55780633f4218e0146112b857806341d8fdf514611293578063431c63a91461127b5780634463c1b2146111fd578063469132ce146111e05780634ada218b146111bb578063553c99fa14611199578063591f09eb1461117c5780635b6663fd146110cf5780635e1d8f591461101a57806364d2681414610fec57806364dd60fe14610f5657806365cf7c9b14610f3957806367df0f9a14610f1c57806370a0823114610ee4578063715018a614610ec4578063751fd17914610e7a57806379ee967c14610d9e5780637e70c8c814610d8157806385af30c514610d3d57806386d0ada814610d0f5780638a8c523c14610c0a5780638da5cb5b14610be35780639426d2d914610bbf57806395d89b4114610ab75780639679266914610a9a578063a3ed1cfc14610a6c578063a51c9ace14610a50578063a9059cbb14610a1f578063a9cc4d08146109d4578063aea348aa146109b2578063b0c150af14610975578063b8a7d10814610944578063b94820b414610919578063bcdaa54b146108bb578063c16dd4a414610871578063c31c9c071461082d578063caf67b5714610801578063cff812aa146107e5578063d033aae5146107c0578063d33b86f31461072e578063dd62ed3e146106de578063e69342c9146106a9578063e71b23331461068d578063e94457c31461066b578063eb6d3a1114610627578063efb7b7cb14610603578063efe23e8614610529578063f2fde38b146104a4578063fb79bb681461040d5763fffa40dd0361000e5734610409575f3660031901126104095761037a61232b565b60155460ff8116156103b95760ff19166015557f0d858a4f0c83da3468fbbf223c07b328590b6abb80fe865406b6ea5f92ac15ff6020604051428152a1005b60405162461bcd60e51b815260206004820152602260248201527f426f742070726f74656374696f6e20616c726561647920646561637469766174604482015261195960f21b6064820152608490fd5b5f80fd5b346104095760203660031901126104095760043561042961232b565b6101f4600454048110610467576020817f84fc38d1161276e5c238cae9048c3566815ce68e35ebc8d75e2d78a5127c3aa592601855604051908152a1005b60405162461bcd60e51b8152602060048201526015602482015274135a5b9a5b5d5b480c0b8c89481c995c5d5a5c9959605a1b6044820152606490fd5b34610409576020366003190112610409576104bd611fde565b6104c561232b565b6001600160a01b03168015610516575f80546001600160a01b03198116831782556001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3005b631e4fbdf760e01b5f525f60045260245ffd5b34610409576105373661204a565b9061054061232b565b6001600160a01b03169061055582151561215a565b60ff60155416156105af5760207f066e0c23b9ae0bb92a88e9b0985bb7d85fce062730057312b99a9e243fde5ee191835f52601482526105a48160405f209060ff801983541691151516179055565b6040519015158152a2005b60405162461bcd60e51b815260206004820152602660248201527f426f742070726f74656374696f6e207065726d616e656e746c792064656163746044820152651a5d985d195960d21b6064820152608490fd5b34610409575f366003190112610409576040602054601e5482519182526020820152f35b34610409575f366003190112610409576040517f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03168152602090f35b34610409575f36600319011261040957602060ff601154166040519015158152f35b34610409575f366003190112610409576020604051611c208152f35b34610409575f36600319011261040957606060ff60115460081c1660405190151581526109c46020820152610bb86040820152f35b34610409576040366003190112610409576106f7611fde565b6106ff611ff4565b6001600160a01b039182165f908152600360209081526040808320949093168252928352819020549051908152f35b34610409575f3660031901126104095760225460ff1680156107b75760215490611c2082018092116107a3576080915b5f90828061079a575b610788575b6021546040519315158452602084015260408301526060820152f35b9050610794428261214d565b9061076c565b50804210610767565b634e487b7160e01b5f52601160045260245ffd5b6080905f61075e565b34610409575f36600319011261040957602060ff60155460101c166040519015158152f35b34610409575f3660031901126104095760206040516109c48152f35b34610409575f36600319011261040957610819612271565b906108296040519283928361202e565b0390f35b34610409575f366003190112610409576040517f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03168152602090f35b34610409576100186108823661204a565b9061088b61232b565b6001600160a01b031661089f81151561215a565b5f52601360205260405f209060ff801983541691151516179055565b34610409575f366003190112610409576108d361232b565b6022546108e260ff8216612079565b60ff19166022555f6021557fe93e99d362449e9573ae25730e6f6eff71fc2b1b5486a29295d061e0bdfa833c6020604051428152a1005b34610409575f3660031901126104095761093161232b565b6015805462ff0000191662010000179055005b34610409575f3660031901126104095760075460085460095460408051938452602084019290925290820152606090f35b34610409576020366003190112610409576001600160a01b03610996611fde565b165f526019602052602060ff60405f2054166040519015158152f35b34610409575f36600319011261040957602060ff601554166040519015158152f35b34610409575f366003190112610409576109ec61232b565b600160ff19600a541617600a557f3d29721bcbd84f0eb7c679d1c0875b92dabfd6c238353f8d09eac6c3ac0c4f215f80a1005b3461040957604036600319011261040957610a45610a3b611fde565b60243590336124e9565b602060405160018152f35b34610409575f3660031901126104095760206040516127108152f35b34610409575f36600319011261040957602060405173cf8ce57fa442ba50acbc57147a62ad03873ffa738152f35b34610409575f366003190112610409576020601f54604051908152f35b34610409575f366003190112610409576040515f6006548060011c90600181168015610bb5575b602083108114610ba157828552908115610b7d5750600114610b1f575b61082983610b0b818503826120cb565b60405191829160208352602083019061200a565b91905060065f527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f915f905b808210610b6357509091508101602001610b0b610afb565b919260018160209254838588010152019101909291610b4b565b60ff191660208086019190915291151560051b84019091019150610b0b9050610afb565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610ade565b34610409575f366003190112610409576040601a54601b5482519182526020820152f35b34610409575f366003190112610409575f546040516001600160a01b039091168152602090f35b34610409575f36600319011261040957610c2261232b565b60155460ff8160081c16610cca5760ff8160101c1615610c79576101009061ff00191617601555426016557fd15516581de850be0c78749799d4ea7e2c98b7712f730dc1f6731b29651e15ba6020604051428152a1005b60405162461bcd60e51b815260206004820152602360248201527f4c6971756964697479206d7573742062652065737461626c69736865642066696044820152621c9cdd60ea1b6064820152608490fd5b60405162461bcd60e51b815260206004820152601960248201527f54726164696e6720697320616c726561647920616374697665000000000000006044820152606490fd5b34610409575f36600319011261040957610d2761232b565b610d2f612351565b610d37612a43565b60018055005b34610409575f366003190112610409576040517f000000000000000000000000f18eafb2c1805bc6dc2585be61b1ea6bd2247e946001600160a01b03168152602090f35b34610409575f366003190112610409576020601d54604051908152f35b3461040957602036600319011261040957600435610dba61232b565b60045461138881048210610e3c57601490048111610e02576020817f22b1193d7139c308983ce8dbe4efca430cb53c56ece2b8f34a300f03d9d66e08928255604051908152a1005b60405162461bcd60e51b815260206004820152601260248201527113585e1a5b5d5b480d4948185b1b1bddd95960721b6044820152606490fd5b60405162461bcd60e51b8152602060048201526016602482015275135a5b9a5b5d5b480c0b8c0c89481c995c5d5a5c995960521b6044820152606490fd5b3461040957610018610e8b3661204a565b90610e9461232b565b6001600160a01b0316610ea881151561215a565b5f52601260205260405f209060ff801983541691151516179055565b34610409575f36600319011261040957610edc61232b565b610018612a04565b34610409576020366003190112610409576001600160a01b03610f05611fde565b165f526002602052602060405f2054604051908152f35b34610409575f366003190112610409576020602154604051908152f35b34610409575f366003190112610409576020601654604051908152f35b34610409575f36600319011261040957610f6e61232b565b60175460ff811615610fa75760ff19166017557fb9eab3a54066471a0b601f34de529a4aba0e964778a849236c48464b619bc6195f80a1005b60405162461bcd60e51b815260206004820152601c60248201527f4c696d69746174696f6e7320616c726561647920696e616374697665000000006044820152606490fd5b34610409575f36600319011261040957602060405173dba68f07d1b7ca219f78ae8582c213d975c25caf8152f35b34610409575f3660031901126104095761103261232b565b60225460ff811661108a5760019060ff19161760225542602155611c2042018042116107a35760407f70edb0008b0033e7ad9480799b6dbdbb0375d73b6a83a94db4f02231f32ece4e918151904282526020820152a1005b60405162461bcd60e51b815260206004820152601a60248201527f52656e6f756e636520616c726561647920696e697469617465640000000000006044820152606490fd5b34610409576020366003190112610409576004356110eb61232b565b600181101580611171575b1561112c576020817f2a07306762369a0a6201970cf8f362080ffc18e2f304f186587460c3cfcb4bb692601f55604051908152a1005b60405162461bcd60e51b815260206004820152601860248201527f496e76616c696420636f6e76657273696f6e206c696d697400000000000000006044820152606490fd5b50600f8111156110f6565b34610409575f366003190112610409576020601e54604051908152f35b34610409575f36600319011261040957602060ff601754166040519015158152f35b34610409575f36600319011261040957602060ff60155460081c166040519015158152f35b34610409575f366003190112610409576020601854604051908152f35b34610409577f9543841f85a7b3bdb94910b0677a8a258374b6bddc910fc5d16b11940ab1ecab604061122e3661204a565b9061123761232b565b6001600160a01b03169061124c82151561215a565b815f52601960205261126c81845f209060ff801983541691151516179055565b825191825215156020820152a1005b34610409575f36600319011261040957610819612198565b34610409575f36600319011261040957602060ff60115460081c166040519015158152f35b34610409576020366003190112610409576001600160a01b036112d9611fde565b165f526012602052602060ff60405f2054166040519015158152f35b34610409576020366003190112610409576001600160a01b03611316611fde565b165f526013602052602060ff60405f2054166040519015158152f35b34610409575f3660031901126104095760206040516101f48152f35b3461040957602036600319011261040957611367611fde565b60ff6015541680611380575b6020906040519015158152f35b5060018060a01b03165f526014602052602060ff60405f205416611373565b34610409575f36600319011261040957602060ff602254166040519015158152f35b34610409575f36600319011261040957602060405160128152f35b34610409575f36600319011261040957600754600854600954600a546040805194855260208501939093529183015260ff1615156060820152608090f35b346104095760603660031901126104095760443560243560043561143c61232b565b61144b60ff600a541615612101565b6101f483116116be5760115460ff81161561155157506101f4811161150c576101f482116114c7576114c27f3df3aece49f46a771f2f3e812e2fbf42b7cf283415dc8be206fc78bf01c5d19a935b826007558360085580600955604051938493846040919493926060820195825260208201520152565b0390a1005b60405162461bcd60e51b815260206004820152601860248201527f53656c6c206665652065786365656473206d6178696d756d00000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527f427579206665652065786365656473206d6178696d756d0000000000000000006044820152606490fd5b6007548211611679576008548311611634577f3df3aece49f46a771f2f3e812e2fbf42b7cf283415dc8be206fc78bf01c5d19a936114c2916101f484111580611628575b6115a0575b50611499565b60019060ff1916176011557f90af161b25909a141b9a01021e25521ae99456f571d29fdf6d06f211354450a260a060405142815260406020820152603060408201527f46656520726564756374696f6e20636f6d706c657465202d20666c657869626c60608201526f19481b5bd919481858dd1a5d985d195960821b6080820152a18561159a565b506101f4851115611595565b60405162461bcd60e51b815260206004820152601860248201527f43616e206f6e6c79207265647563652073656c6c2066656500000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527f43616e206f6e6c792072656475636520627579206665650000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f5472616e73666572206665652065786365656473206d6178696d756d000000006044820152606490fd5b346104095760c03660031901126104095761171c611fde565b611724611ff4565b6044356001600160a01b03811692908381036104095760a43560843560643561174b61232b565b6001600160a01b0385169361176185151561215a565b6001600160a01b0387169761177789151561215a565b61178281151561215a565b6127106117988661179387876120be565b6120be565b0361184c577f6a05c06b158afbcef31aa40bd0089e9278f523a4c9c6d580213536ac062b1231986114c2966001600160601b0360a01b600b541617600b556001600160601b0360a01b600c541617600c556001600160601b0360a01b600d541617600d5581600e5582600f5583601055604051968796879260a094919796959260c0850198600180881b03168552600180871b03166020850152600180861b03166040840152606083015260808201520152565b60405162461bcd60e51b8152602060048201526016602482015275536861726573206d75737420746f74616c203130302560501b6044820152606490fd5b34610409576040366003190112610409576024356004356118a961232b565b8015611903578082106118be57601a55601b55005b60405162461bcd60e51b815260206004820152601b60248201527f4d6178696d756d206d75737420657863656564207472696767657200000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601860248201527f54726967676572206d75737420626520706f73697469766500000000000000006044820152606490fd5b34610409575f36600319011261040957601e548043118015611987575b601d546040805191825243602083015281019290925215156060820152608090f35b50601d54601f5411611965565b34610409576060366003190112610409576119ad611fde565b6119b5611ff4565b6001600160a01b0382165f9081526003602090815260408083203384529091529020549190604435808410611a0357610a45936119f6826119fb94866124e9565b61214d565b9033906123fc565b60405162461bcd60e51b815260206004820152602160248201527f5472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636044820152606560f81b6064820152608490fd5b34610409575f36600319011261040957604060ff60175416601854825191151582526020820152f35b34610409575f36600319011261040957600b54600c54600d54600e54600f54601054604080516001600160a01b039788168152958716602087015295909316948401949094526060830152608082019290925260a081019190915260c090f35b34610409575f366003190112610409576020600454604051908152f35b34610409575f36600319011261040957600b54600c54600d54600e54600f54601054604080516001600160a01b039788168152958716602087015293909516928401929092526060830152608082015260a081019190915260c090f35b34610409575f366003190112610409576020604051610bb88152f35b34610409575f36600319011261040957611b8961232b565b60115460ff8160081c16611c395761010090611baa60ff600a541615612101565b6109c4600755610bb86008555f60095561ffff1916176011557fda8ff0f79d9adcb8200cdf564f456d60593e04d3f2cef5645fc5402ee6800d6760606040516109c48152610bb86020820152426040820152a17f3df3aece49f46a771f2f3e812e2fbf42b7cf283415dc8be206fc78bf01c5d19a60606040516109c48152610bb860208201525f6040820152a1005b60405162461bcd60e51b815260206004820152601960248201527f4c61756e63682074617820616c726561647920616374697665000000000000006044820152606490fd5b3461040957604036600319011261040957610a45611c9a611fde565b60243590336123fc565b34610409575f3660031901126104095760208054604051908152f35b34610409575f366003190112610409576040515f6005548060011c90600181168015611d71575b602083108114610ba157828552908115610b7d5750600114611d135761082983610b0b818503826120cb565b91905060055f527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0915f905b808210611d5757509091508101602001610b0b610afb565b919260018160209254838588010152019101909291611d3f565b91607f1691611ce7565b3461040957604036600319011261040957611d94611fde565b611d9c61232b565b611da4612351565b6001600160a01b0316308114611e5557611e065f8060018060a01b03815416604051602081019163a9059cbb60e01b83526024820152602435604482015260448152611df16064826120cb565b519082865af1611dff612371565b9083612d2a565b8051908115159182611e31575b5050611e1f5760018055005b635274afe760e01b5f5260045260245ffd5b81925090602091810103126104095760200151801590811503610409578280611e13565b60405162461bcd60e51b815260206004820152601960248201527f43616e6e6f74207265636f766572206f776e20746f6b656e73000000000000006044820152606490fd5b34610409575f36600319011261040957611eb261232b565b611eba612351565b478015611ed6575f54610d3791906001600160a01b03166123b0565b60405162461bcd60e51b815260206004820152601160248201527027379022aa24103a37903932b1b7bb32b960791b6044820152606490fd5b34610409575f366003190112610409576020601a54604051908152f35b34610409575f36600319011261040957611f4461232b565b611f5260ff60225416612079565b602154611c2081018091116107a3574210611f99577f7738dc8b7a10a5636dceada812073a582b717ce047d82cd0e4918662b2e7c7736020604051428152a1610edc61232b565b60405162461bcd60e51b815260206004820152601b60248201527f54696d656c6f636b20706572696f64206e6f7420656c617073656400000000006044820152606490fd5b600435906001600160a01b038216820361040957565b602435906001600160a01b038216820361040957565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b604090612047939215158152816020820152019061200a565b90565b6040906003190112610409576004356001600160a01b0381168103610409579060243580151581036104095790565b1561208057565b60405162461bcd60e51b815260206004820152601660248201527514995b9bdd5b98d9481b9bdd081a5b9a5d1a585d195960521b6044820152606490fd5b919082018092116107a357565b90601f8019910116810190811067ffffffffffffffff8211176120ed57604052565b634e487b7160e01b5f52604160045260245ffd5b1561210857565b60405162461bcd60e51b815260206004820152601760248201527f46656520737472756374757265206973206c6f636b65640000000000000000006044820152606490fd5b919082039182116107a357565b1561216157565b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606490fd5b60155460ff16156121fe576001906040516121b46060826120cb565b603481527f426f742070726f74656374696f6e20616374697665202d20666c6167676564206020820152731859191c995cdcd95cc81c995cdd1c9a58dd195960621b604082015290565b5f9060405161220e6080826120cb565b604781527f426f742070726f74656374696f6e207065726d616e656e746c7920646561637460208201527f697661746564202d20616c6c206164647265737365732063616e20747261646560408201526620667265656c7960c81b606082015290565b60115460ff16156122d45760019060405161228d6060826120cb565b603181527f466c657869626c652050686173653a20466565732061646a75737461626c652060208201527077697468696e20302d35252072616e676560781b604082015290565b5f906040516122e46060826120cb565b603181527f526564756374696f6e2050686173653a20466565732063616e206f6e6c792062602082015270652064656372656173656420746f20352560781b604082015290565b5f546001600160a01b0316330361233e57565b63118cdaa760e01b5f523360045260245ffd5b600260015414612362576002600155565b633ee5aeb560e01b5f5260045ffd5b3d156123ab573d9067ffffffffffffffff82116120ed57604051916123a0601f8201601f1916602001846120cb565b82523d5f602084013e565b606090565b8147106123e9575f918291829182916001600160a01b03165af16123d2612371565b50156123da57565b630a12f52160e11b5f5260045ffd5b63cd78605960e01b5f523060045260245ffd5b6001600160a01b03169081156124a4576001600160a01b031691821561245f5760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591835f526003825260405f20855f5282528060405f2055604051908152a3565b60405162461bcd60e51b815260206004820152601760248201527f417070726f766520746f207a65726f20616464726573730000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601960248201527f417070726f76652066726f6d207a65726f2061646472657373000000000000006044820152606490fd5b6001600160a01b0316919082156129bf576001600160a01b031691821561297a57811561293657805f5260026020528160405f2054106128fa57601554839260ff8216806128e4575b612878575b825f52601260205260ff60405f20541615918261285f575b82612851575b50818061283b575b61282e575b8091612754575b5060ff601754168061273d575b6126b0575b60207fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91835f526002825260405f206125b582825461214d565b9055845f526002825260405f206125cd8282546120be565b9055604051908152a36015549060ff8260101c16158091819261267d575b506125f4575050565b6125fc575b50565b7f000000000000000000000000f18eafb2c1805bc6dc2585be61b1ea6bd2247e946001600160a01b03165f90815260026020526040902054600454611388900410156125f957620100009062ff00001916176015557fa498c9eb5ae11804841330295db8e91fbbc7d515ef50f0ef32c3109a054d32d06020604051428152a1565b7f000000000000000000000000f18eafb2c1805bc6dc2585be61b1ea6bd2247e946001600160a01b03161490505f6125eb565b825f52601960205260ff60405f20541661257b57915f5260026020526126da8260405f20546120be565b601854106126e957829161257b565b60405162461bcd60e51b815260206004820152602660248201527f5472616e736665722065786365656473206d6178696d756d20686f6c64696e67604482015265081b1a5b5a5d60d21b6064820152608490fd5b50825f52601960205260ff60405f20541615612576565b825f52601360205260ff60405f2054165f146127fc5761271061277a6007545b83612d17565b049081612788575b50612569565b819250906127959161214d565b90825f52600260205260405f206127ad82825461214d565b9055305f52600260205260405f206127c68282546120be565b9055604051908152827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203093a35f80612782565b835f52601360205260ff60405f2054165f146128205761271061277a600854612774565b61271061277a600954612774565b612836612a43565b612562565b50835f52601360205260ff60405f20541661255d565b60081c60ff1691505f612555565b9150835f52601260205260ff60405f205416159161254f565b5f549093506001600160a01b0316841480156128d9575b1561289b578392612537565b60405162461bcd60e51b8152602060048201526016602482015275426f74207265737472696374696f6e2061637469766560501b6044820152606490fd5b5061dead841461288f565b50825f52601460205260ff60405f205416612532565b60405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606490fd5b606460405162461bcd60e51b815260206004820152602060248201527f5472616e7366657220616d6f756e74206d75737420626520706f7369746976656044820152fd5b60405162461bcd60e51b815260206004820152601860248201527f5472616e7366657220746f207a65726f206164647265737300000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601a60248201527f5472616e736665722066726f6d207a65726f20616464726573730000000000006044820152606490fd5b5f80546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3565b5f305f52600260205260405f2054601c5460ff81161580612d0c575b612a6857505050565b601e544311612d03575b601d54601f541115612cfe57601b54808311612cf6575b50602054808311612ced575b5060ff1916600117601c55604051612aae6060826120cb565b60028152602081016040368237815115612cd957308152815160011015612cd9577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0390811660408401527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d16904261012c81019081106107a357823b1561040957929060405193849263791ac94760e01b845260a48401908760048601525f602486015260a060448601525180915260c4840192905f5b818110612cb7575050505f838195938193306064840152608483015203925af1612ca2575b5060ff19601c5416601c554780612bd3575b5050601d54905f198214612bbf5750600101601d5543601e55565b634e487b7160e01b81526011600452602490fd5b7faf4e88398a0e1b285c35d078e99a9a51fa19ac78f06ea698acc12cac61254f5d91604091612710612c07600e5483612d17565b04612710612c17600f5484612d17565b04612c26816119f6848661214d565b9180612c86575b5080612c6a575b5080612c4e575b5082519182526020820152a15f80612ba4565b600d54612c6491906001600160a01b03166123b0565b5f612c3b565b600c54612c8091906001600160a01b03166123b0565b5f612c34565b600b54612c9c91906001600160a01b03166123b0565b5f612c2d565b612caf9192505f906120cb565b5f905f612b92565b82516001600160a01b0316855287955060209485019490920191600101612b6d565b634e487b7160e01b5f52603260045260245ffd5b91506001612a95565b91505f612a89565b505050565b5f601d55612a72565b50601a548211612a5f565b818102929181159184041417156107a357565b90612d3f57508051156123da57805190602001fd5b81511580612d70575b612d50575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b15612d4856fea26469706673582212200b58ca396884b1419cf4cc520ad8ede4aeefb26dd6398f380a3f60bd4726048e64736f6c634300081e0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000005f5e1000000000000000000000000002e78a696e3b9ecaa08d5f9127921dc0ff7b3b0d00000000000000000000000002e78a696e3b9ecaa08d5f9127921dc0ff7b3b0d00000000000000000000000002e78a696e3b9ecaa08d5f9127921dc0ff7b3b0d00000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000000000000000000000000000000000000000000006456e69676d6100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003454e580000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : tokenName (string): Enigma
Arg [1] : tokenSymbol (string): ENX
Arg [2] : initialSupply (uint256): 100000000
Arg [3] : primaryTaxReceiver (address): 0x2e78a696e3B9eCaa08d5f9127921Dc0Ff7B3B0D0
Arg [4] : secondaryTaxReceiver (address): 0x2e78a696e3B9eCaa08d5f9127921Dc0Ff7B3B0D0
Arg [5] : tertiaryTaxReceiver (address): 0x2e78a696e3B9eCaa08d5f9127921Dc0Ff7B3B0D0
Arg [6] : routerAddress (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 0000000000000000000000000000000000000000000000000000000005f5e100
Arg [3] : 0000000000000000000000002e78a696e3b9ecaa08d5f9127921dc0ff7b3b0d0
Arg [4] : 0000000000000000000000002e78a696e3b9ecaa08d5f9127921dc0ff7b3b0d0
Arg [5] : 0000000000000000000000002e78a696e3b9ecaa08d5f9127921dc0ff7b3b0d0
Arg [6] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [8] : 456e69676d610000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [10] : 454e580000000000000000000000000000000000000000000000000000000000


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.