S Price: $0.531779 (-10.92%)

Token

Tech (TECH)

Overview

Max Total Supply

10,000,000,000 TECH

Holders

1

Total Transfers

-

Market

Price

$0.00 @ 0.000000 S

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
DeployyyyerToken

Compiler Version
v0.8.25+commit.b61c2a91

Optimization Enabled:
Yes with 800 runs

Other Settings:
paris EvmVersion
File 1 of 4 : DeployyyyerToken.sol
// SPDX-License-Identifier: MIT
/*********************************************************************************************\
* Deployyyyer Memes: https://deployyyyer.fun
* Deployyyyer: https://deployyyyer.io
* Twitter: https://x.com/deployyyyer
* Telegram: https://t.me/Deployyyyer
/*********************************************************************************************/

pragma solidity ^0.8.23; 
import {IStaking} from "../interfaces/IStaking.sol";
import {StakingPool} from "./StakingPool.sol";

library SafeCall {
    /**
     * @notice Perform a low level call without copying any returndata
     *
     * @param _target   Address to call
     * @param _gas      Amount of gas to pass to the call
     * @param _value    Amount of value to pass to the call
     * @param _calldata Calldata to pass to the call
     */
    function call(
        address _target,
        uint256 _gas,
        uint256 _value,
        bytes memory _calldata
    ) internal returns (bool) {
        bool _success;
        assembly {
            _success := call(
                _gas, // gas
                _target, // recipient
                _value, // ether value
                add(_calldata, 0x20), // inloc
                mload(_calldata), // inlen
                0, // outloc
                0 // outlen
            )
        }
        return _success;
    }
}


interface IHelper {
	function isValidRouter(address router) external view returns (bool);
}


interface IERC20 {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address _owner) external view returns (uint256 balance);

    function transferFrom(
        address _from,
        address _to,
        uint256 _value
    ) external returns (bool success);

    function transfer(address _to, uint256 _value) external returns (bool success);

    function approve(address _spender, uint256 _value) external returns (bool success);

    function allowance(address _owner, address _spender) external view returns (uint256 remaining);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed ownerAddress, address indexed spender, uint256 value);
}

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

}

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

interface ITeamFinanceLocker {
    function lockToken(
        address _tokenAddress,
        address _withdrawalAddress,
        uint256 _amount,
        uint256 _unlockTime,
        bool _mintNFT, 
        address referrer
    ) external payable returns (uint256 _id);
}


/// @title DeployyyyerToken 
/// @notice Contains methods related to ERC20
/// @dev 
contract DeployyyyerToken is IERC20 {
    address owner_; 
    uint256 minLiq;
    uint256 lockerId;
    address teamFinanceLocker;

    mapping(address => bool)  isExTxLimit; //is excluded from transaction limit
    mapping(address => bool)  isExWaLimit; //is excluded from wallet limit
    mapping (address => uint256)  balances; //ERC20 balance
    mapping (address => mapping (address => uint256))  allowances; //ERC20 balance

    address payable taxWallet; //tax wallet for the token
    address payable deployyyyerCa; //deployyyyer contract address

    
    // Reduction Rules
    uint256  buyCount; 

    uint256 initTaxType; //0-time,1-buyCount,2-hybrid,3-none
    //interval*1, lastIntEnd+(interval*2), lastIntEnd+(interval*3)
    uint256 initInterval; //seconds 0-1 hour(if 1m: 1m, 3m, 6m, 10m)
    uint256 countInterval; //0-100 

    //current taxes
    uint256  taxBuy; 
    uint256  maxBuyTax; //40%
    uint256  minBuyTax; //0

    uint256  taxSell; 
    uint256  maxSellTax; //40%
    uint256  minSellTax; //0

    uint256  tradingOpened;

    // Token Information
    uint8   decimals_;
    uint256   tTotal;
    string   name_;
    string   symbol_;

    // Contract Swap Rules 
    uint256 lastSwapBlock;
    uint256 preventSwap; //50            
    uint256  taxSwapThreshold; //0.1%
    uint256  maxTaxSwap; //1%
    uint256  maxWallet; //1%
    uint256  maxTx;

    IUniswapV2Router02  uniswapV2Router;
    address  uniswapV2Pair;
    
    bool  tradingOpen; //true if liquidity pool is created
    bool  inSwap;
    bool  walletLimited;
    bool isFreeTier;
    bool isBurnt;
    bool isRetrieved;
    uint256 lockPeriod_;
    uint256 stakingShare;
    address stakingContract;

    uint256 lastSwap;


    bool liquidityOpen;
    uint256 halfLp;
    uint256 lpTax;
    event TradingEnabled(address pair, uint256 liq, uint256 lockPeriod, bool isBurnt, address router);
	event TaxMade(uint256 amount);
    event TaxGiven(uint256 amount);
    event StakingMade(uint256 amount);
    event ExternalLocked(uint256 id, uint256 lockPeriod);
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    
    event IncreasedLimits(uint256 maxWallet, uint256 maxTx);
    event LockUpdated(uint256 ldays);
    event LockRetrieved();
    event SocialsSet(string telegram, string twitter, string website);
    event LpBurnt();
    event StakingLaunched(address stakingPool, address owner, uint256 share);
    event StakingShareIncreased(uint256 share);
    event StakingArgs(IStaking.StakingParams params);

    struct InitParams {
        address owner;
        address taxWallet;
        address teamFinanceLocker;
        uint256 minLiq; 
        uint256 supply;
        uint256 initTaxType; //0-time,1-buyCount,2-hybrid
        uint256 initInterval; //seconds 0-1 hour(if 1m: 1m, 3m, 6m, 10m)
        uint256 countInterval; //0-100 
        uint256  maxBuyTax; //40%
        uint256  minBuyTax; //0
        uint256  maxSellTax; //40%
        uint256  minSellTax; //0
        uint256 lpTax;
        uint256 maxWallet;
        uint256 maxTx;
        uint256 preventSwap;
        uint256 maxSwap;
        uint256 taxSwapThreshold;
        string  name;
        string  symbol;
        bool isFreeTier;
    }


    struct LPDetails {
        address pair;
        uint256 buycount;
        uint256 taxBuy;
        uint256 taxSell;
        uint256 lockDays;
        bool isBurnt;
        uint256 tradingOpened;
        bool walletLimited;
        address stakingContract; //address(0) backward comp
        uint256 stakingShare; //external lock id here
        uint256 maxTx;
        uint256 maxWallet;
        address router;
        address presale; //address(0) backward comp
    }

    //reentrancy lock
    modifier lockTheSwap {
        inSwap = true;
        _;
        inSwap = false;
    }

    /// @notice Constructor of Diamond Proxy for a launched token
    constructor(InitParams memory params) {
        owner_ = params.owner;
        emit OwnershipTransferred(address(0), owner_);
        teamFinanceLocker = params.teamFinanceLocker;
        // adding ERC165 data

        deployyyyerCa = payable(msg.sender);
 
        minLiq = params.minLiq;
        taxBuy = params.maxBuyTax; //20%
        maxBuyTax = params.maxBuyTax;
        minBuyTax = params.minBuyTax;

        taxSell = params.maxSellTax; //20%
        maxSellTax = params.maxSellTax;
        minSellTax = params.minSellTax;
        lpTax = params.lpTax;
        
        initTaxType = params.initTaxType;
        initInterval = params.initInterval;
        countInterval = params.countInterval;

        // Reduction Rules
        buyCount = 0; 
        isFreeTier = params.isFreeTier;
    

        // Token Information
        decimals_ = 18;

        taxWallet = payable(params.taxWallet);
        
        name_ = params.name;
        symbol_ = params.symbol;
        tTotal = params.supply;

        // Contract Swap Rules            
        taxSwapThreshold = params.taxSwapThreshold; //0.1%
        maxTaxSwap = params.maxSwap; //1%
        walletLimited = true;
        
        
        maxWallet = tTotal * params.maxWallet / 10000;  //1% (allow 1 - 100)
        maxTx = tTotal * params.maxTx / 10000;
        if (params.maxWallet == 10000 && params.maxTx == 10000) {
            walletLimited = false;
        }
        emit IncreasedLimits(params.maxWallet, params.maxTx);
        balances[address(this)] = tTotal;
        emit Transfer(address(0), address(this), tTotal);

        preventSwap = params.preventSwap;

    } 


    /// @notice Create liquidity pool and start trading for the token
    /// @dev
    function startTrading(uint256 lockPeriod, bool shouldBurn, address router) external payable  {
        require(msg.sender == owner_, "o");
        require(!tradingOpen, "1");
        require(address(this).balance >= minLiq, "2");
        if(!shouldBurn) {
            require(lockPeriod >= 14);
        } 
        
        tradingOpen = true;

        uint256 maxTxTemp = maxTx;
        uint256 maxWalletTemp = maxWallet;
        bool walletLimitedTemp = walletLimited;
        
        if(walletLimited == true) {
            maxTx = tTotal;
            maxWallet = tTotal;
            walletLimited = false;
        }
        

        isExTxLimit[address(this)] = true;
        isExTxLimit[owner_] = true;
        isExTxLimit[address(0x000000000000000000000000000000000000dEaD)] = true;

        isExWaLimit[address(this)] = true;
        isExWaLimit[owner_] = true;
        isExWaLimit[address(0x000000000000000000000000000000000000dEaD)] = true;
        
        //0x000000000000000000000000000000000000dEaD or address(0)
        address liqOwner = address(this);
        if(shouldBurn) {
            liqOwner = address(0);
            isBurnt = true;
        } else {
            lockPeriod_ = lockPeriod;
            isBurnt = false;
        }

        uint256 liqBalance = balances[address(this)];
        tradingOpened = block.timestamp;
        
        require(IHelper(deployyyyerCa).isValidRouter(router));
        uniswapV2Router = IUniswapV2Router02(router);
        allowances[address(this)][address(uniswapV2Router)] = tTotal;
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
        isExWaLimit[address(uniswapV2Pair)] = true;
        isExTxLimit[address(uniswapV2Pair)] = true;
        isExTxLimit[address(uniswapV2Router)] = true;
        isExWaLimit[address(uniswapV2Router)] = true;
        
        
        emit TradingEnabled(uniswapV2Pair, address(this).balance, lockPeriod_, shouldBurn, address(uniswapV2Router));
        require(IERC20(uniswapV2Pair).approve(address(uniswapV2Router), type(uint).max), "3");
        
        uniswapV2Router.addLiquidityETH{value: address(this).balance}(address(this),liqBalance,0,0,liqOwner,block.timestamp+60);
        liquidityOpen = true;
        
        if(walletLimitedTemp == true) {
            maxTx = maxTxTemp;
            maxWallet = maxWalletTemp;
            walletLimited = true;
        }

    }
    /*
    function lockOnTeamFinance(uint256 lps, bool ref) external payable  {
        require(msg.sender ==  owner_ && isBurnt == false && isRetrieved == false && tradingOpen == true && lps >= 3600 * 24 * 14, "o");
        //require(isBurnt == false && isRetrieved == false && tradingOpen == true, "lt");
        //require(lps >= 3600 * 24 * 14, "ls");
        uint256 lpBalance = IERC20(uniswapV2Pair).balanceOf(address(this));
        IERC20(uniswapV2Pair).approve(teamFinanceLocker, lpBalance);
        lockerId = ITeamFinanceLocker(teamFinanceLocker).lockToken{value: msg.value}(uniswapV2Pair, msg.sender, lpBalance, block.timestamp + lps, false, ref?address(deployyyyerCa):address(0));
        isRetrieved = true;
        emit ExternalLocked(lockerId, lps);
        //emit ExternalLocked(lockPeriodSec);
    }
    */

    /// @notice Burn the liquidity pool tokens of the token
    function burnLP() external  {
        require(msg.sender == owner_, "o");
        require(!isBurnt && !isRetrieved && tradingOpen, "a"); 
        isBurnt = true;
        emit LpBurnt();
        require(IERC20(uniswapV2Pair).transfer(address(0x000000000000000000000000000000000000dEaD), IERC20(   uniswapV2Pair).balanceOf(address(this))), "o2");        
    }

    /// @notice Get lp lock period remaining
    /// @return lpldays lock days remaining 
    function getLockleft() private view returns (uint256) {
        if(!tradingOpen) {
            return 0;
        }
        //time traversed in days
        uint256 tt = ((block.timestamp - tradingOpened)/86400);
        if (tt > lockPeriod_) {
            return 0;
        } else {
            return lockPeriod_ - tt;
        }

    }
    
    /// @notice Extend LP lock
    /// @dev should not be already retrieved or burnt
    /// @param ldays no of days to extend
    function extendLock(uint256 ldays) external  {
        require(msg.sender == owner_, "o");
        require(!isRetrieved && !isBurnt && tradingOpen, "a");
        //expired lock 
        if((tradingOpened + (lockPeriod_*86400)) < block.timestamp) {
            lockPeriod_ = (block.timestamp - tradingOpened)/86400;
        }
        lockPeriod_ += ldays; 
        emit LockUpdated(lockPeriod_);
        
    }
    
    /// @notice Retrieve LP tokens
    /// @dev should not be already retrieved or burnt
    function retrieveLock() external  {
        require(msg.sender == owner_, "o");
        require(!isRetrieved && !isBurnt && tradingOpen, "a");
        if((tradingOpened + (lockPeriod_*60*60*24)) < block.timestamp) {
            isRetrieved = true;
            
            uint256 bal = IERC20(uniswapV2Pair).balanceOf(address(this));
            emit LockRetrieved();
            require(IERC20(uniswapV2Pair).transfer(msg.sender, bal), "b");
            
        }
    }

    function increaseLimits(uint256 maxwallet, uint256 maxtx) external {
        require(msg.sender ==  owner_ && walletLimited, "o");
        //require(walletLimited);
        require(tTotal * maxwallet / 10000 >= maxWallet && maxwallet <= 10000, "a");
        require(tTotal * maxtx / 10000 >= maxTx && maxtx <= 10000, "b");
        maxWallet = tTotal * maxwallet / 10000;   
        maxTx = tTotal * maxtx / 10000;
        
        if (maxwallet == 10000 && maxtx == 10000) {
            walletLimited = false;
        }

        emit IncreasedLimits(maxwallet, maxtx);
    }

    ///@dev Returns the name of the token.
    function name() external view override returns (string memory) {
        return name_;
    }

    ///@dev Returns the symbol of the token, usually a shorter version of name.
    function symbol() external view override returns (string memory) {
        return symbol_;
    }

    ///@dev Returns the number of decimals used to get its user representation.
    function decimals() external view override returns (uint8) {
        return decimals_;
    }

    ///@dev Returns the value of tokens in existence.
    function totalSupply() public view override returns (uint256) {
        return tTotal;
    }

    ///@dev Returns the value of tokens owned by account.
    function balanceOf(address account) public view override returns (uint256) {
        return balances[account];
    }

    ///@dev Moves a amount of tokens from the caller's account to receipient.
    function transfer(address recipient, uint256 amount) external override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    ///@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
    function allowance(address owner, address spender) external view override returns (uint256) {
        return allowances[owner][spender];
    }

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's token   
     *
     * 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 amount) external override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    /**
     * @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 sender, address recipient, uint256 amount) public override returns (bool) {
        require(amount <= allowances[sender][msg.sender], "25");
        _approve(sender, msg.sender,allowances[sender][msg.sender] - amount);
        _transfer(sender, recipient, amount);
        return true;
    }
    
    function _approve(address _owner, address _spender, uint256 _amount) private {
        require(_owner != address(0));
        require(_spender != address(0));
        allowances[_owner][_spender] = _amount;
        emit Approval(_owner, _spender, _amount);
    }

    /// @notice sets tax for the trade
    /// @dev 
    function _setTax(bool isBuy) private {
        uint256 maxTax;
        uint256 minTax;
        uint256 tax;
        if(isBuy) {
            maxTax = maxBuyTax;
            minTax = minBuyTax;
            tax = taxBuy;
        } else {
            maxTax = maxSellTax;
            minTax = minSellTax;
            tax = taxSell;
        }

        if(tax != minTax) {
            if(initTaxType == 0) {
                if (block.timestamp >= (tradingOpened + (initInterval))) {
                    tax = minTax; 
                }
                else if (block.timestamp >= (tradingOpened + (initInterval/2))) {
                    tax = minTax + (maxTax - minTax)/4;
                }
                else if (block.timestamp >= (tradingOpened + (initInterval/4))) {
                    tax = minTax + ((maxTax - minTax)/2);
                }
                else {       
                    tax = maxTax; 
                }        
                  
            } else if(initTaxType == 1) {
                if (buyCount > (countInterval)) {
                    tax = minTax; 
                } else {       
                    tax = maxTax; 
                } 
                //this is forced after 2hrs
                if(block.timestamp >= (tradingOpened + 7200)) {
                    tax = minTax;
                }      

            } else if(initTaxType == 2){
                if (buyCount > (countInterval) || block.timestamp >= (tradingOpened + (initInterval))) {
                    tax = minTax; 
                }
                else if (buyCount > (countInterval/2) || block.timestamp >= (tradingOpened + (initInterval/2))) {
                    tax = minTax + (maxTax - minTax)/4;
                }
                else if (buyCount > (countInterval/4) || block.timestamp >= (tradingOpened + (initInterval/4))) {
                    tax = minTax + ((maxTax - minTax)/2);
                }
                else {       
                    tax = maxTax; 
                }        
            // } else if(   initTaxType == 3) { //check block number}        
                
            } else {
                tax = minTax; 
            }

            if(isBuy) {
                   taxBuy = tax;
            } else {
                   taxSell = tax;
            }
        }

    }

    /// @notice internal method of transfer
    /// @dev 
    function _transfer(address from, address to, uint256 amount) private {
        require(from != address(0) && to != address(0));
        //require(to != address(0));
        //require(amount > 0); //compliance erc20
        require(balances[from] >= amount, "66");
        uint256 taxAmount=0;
        
        if (tradingOpen &&  walletLimited && !isExTxLimit[from] && !isExTxLimit[to])
            require(maxTx >= amount, "30");
        if (tradingOpen && walletLimited && !isExWaLimit[to])
            require((balances[to] + amount) <= maxWallet, "31");
         
        if (from != owner_ && to != owner_ && liquidityOpen == true) {
            if (from == uniswapV2Pair && to != address(uniswapV2Router)) {
            	//buy from uniswap, only if amount > 0
                buyCount++;
                _setTax(true);

            	taxAmount = amount * taxBuy / 100;
                //console.log("_setTaxDone");
                
                
            }
            if(to == uniswapV2Pair && from!= address(this)) {
            	//sell from uniswap
                _setTax(false);
                taxAmount = amount * taxSell / 100;    
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        bool swapped = false;
        if (!inSwap && to == uniswapV2Pair && from!= address(this) && contractTokenBalance > 0 && buyCount > preventSwap) {
            //we swap only on sell to uniswap pool
            if(contractTokenBalance > taxSwapThreshold || ((block.timestamp - tradingOpened) > (86400) && minBuyTax == 0 && minSellTax == 0)) {
                if(block.number > lastSwapBlock) {
                    if(contractTokenBalance < maxTaxSwap) {
                        swapTokensForEth(contractTokenBalance);
                    }
                    else {
                        swapTokensForEth(maxTaxSwap);
                    }
                    sendETHToFee(address(this).balance);
                    swapped = true;
                    lastSwapBlock = block.number;
                }
            }
        }

        if(taxAmount > 0) {
            balances[address(this)] = balances[address(this)] + (taxAmount);
            emit Transfer(from, address(this), taxAmount);
        }

        //from can be taxWallet
        balances[from] = balances[from] - amount;
        balances[to] = balances[to] + amount - taxAmount;
        emit Transfer(from, to, amount - taxAmount);
        
        if(swapped) {
            //everything else is taken care, anything left is for token's tax wallet
            //this call needs to be safe from reverts, consuming all gas and return bombs
            bool ttax = SafeCall.call(taxWallet, 100000, address(this).balance, "");
            if(ttax)
                emit TaxMade(address(this).balance);
        }

    }

    /// @notice swaps tokens from tax into eth
    /// @dev this is nonrentrant using lockTheSwap
    function swapTokensForEth(uint256 tokenAmount) private lockTheSwap {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        if(lpTax > 0) { 
            halfLp = tokenAmount * lpTax / 200;  
            tokenAmount -= halfLp; 
            lastSwap = tokenAmount;
        }

        _approve(address(this), address(uniswapV2Router), tokenAmount);
           uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    /// @notice sends the eth to respective tax wallets 
    /// @dev 
    function sendETHToFee(uint256 amount) private {  
        uint256 da = 0;
        uint256 ethLpShare = 0;
        uint256 spshare = 0;
        uint256 halfLpTemp;
        //s.isFreeTier && 
        if(isFreeTier == true && ((block.timestamp - tradingOpened) < (86400*90))) {     
            da = amount * 10 / 100;
            emit TaxGiven(da);
            (bool stax, ) =  deployyyyerCa.call{value: da}("");
            require(stax, "99");
        }
        if(lpTax > 0 && halfLp > 0) {
            //newly added liquidity is also locked
            //address liqOwner = address(this);
            
            //we should also be keeping half of lp in tokens, so that u add equal amount of eth and token to lp
            ethLpShare = halfLp * amount / lastSwap;
            halfLpTemp = halfLp;
            halfLp = 0;
            lastSwap = 0;
            _approve(address(this), address(uniswapV2Router), halfLpTemp);
            uniswapV2Router.addLiquidityETH{ value: ethLpShare }(
                address(this),
                halfLpTemp,
                0,
                0,
                address(this),
                block.timestamp + 60
            );

            
        }
        if(stakingContract != address(0)) {
            spshare = (amount - da - ethLpShare) * stakingShare / 100;
            //stakingContract is safe since its our own! 
            (bool sent, ) = stakingContract.call{value: spshare}("");
            require(sent, "s9");
            emit StakingMade(spshare);
        }
    }

    /// @notice recovers eth to tax wallet if any
    /// @dev 
    function recoverEth() private {
        //blocked while trading is disabled
        if(!inSwap && tradingOpen) { 
            uint256 contractETHBalance = address(this).balance;
            if(contractETHBalance > 0) {
                sendETHToFee(contractETHBalance);
                (bool ttax, ) = taxWallet.call{value: address(this).balance}("");
                if(ttax)
                    emit TaxMade(address(this).balance);
            }
        }

    }

    /// @notice rescues any erc20 tokens sent to contract, also recovers eth to tax wallet if any
    /// @dev trying to rescue own token or own lp tokens will revert
    function rescueERC20(address _address) external {
        //block pulling out lp
        require(_address != uniswapV2Pair); 
        require(_address != address(this));
        
        require(IERC20(_address).transfer(taxWallet, IERC20(_address).balanceOf(address(this))), "r");
        recoverEth();
    }
    
    /// @notice Set the address of the new owner of the contract
    /// @param _newOwner The address of the new owner of the contract
    function transferOwnership(address _newOwner) external {
        require(msg.sender == owner_, "o");
        emit OwnershipTransferred(owner_, _newOwner);
        //isExTxLimit[owner_] = false;
        //isExWaLimit[owner_] = false;
        owner_ = _newOwner;
        isExTxLimit[owner_] = true;
        isExWaLimit[owner_] = true;
        
    }
    
    /// @notice Get the address of the owner
    /// @return The address of the owner.
    function owner() public view returns (address) {
        //address _owner = owner_;
        return owner_;
    }
    

    /// @notice Get liquidity pool details of the token
    /// @return IOwnership.LPDetails
    /// @dev 
    function getLPDetails() external view returns (LPDetails memory) {
        return LPDetails(uniswapV2Pair, buyCount, taxBuy, taxSell, getLockleft(), isBurnt, tradingOpened, walletLimited, stakingContract, stakingShare, maxTx, maxWallet, address(uniswapV2Router), address(0));
    }


    /// @notice increase revenue share to staking pool for the token
    /// @dev 
    function increaseStakingShare(uint256 share) external {
        require(msg.sender == owner_ && stakingShare > 0 && share > 0, "o");
        //staking pool is live
        //require(stakingShare > 0 && share > 0);
        stakingShare += share;
        require(stakingShare <= 100, "os");
        emit StakingShareIncreased(stakingShare);
    }

    /// @notice launch staking pool for the token
    /// @dev 
    function launchStaking(uint256 share, IStaking.StakingParams memory params) external {
        require(msg.sender == owner_, "o");
        require(stakingShare == 0 && share > 0 && share <= 100, "y");
        //require(stakingShare == 0, "o12");
        require(params.withdrawTimeout >= 2 days && params.withdrawTimeout < 10 days, "z");
        stakingShare = share;
        params.owner = msg.sender;
        
        StakingPool stakingPool = new StakingPool(params);
        isExTxLimit[address(stakingPool)] = true;
        isExWaLimit[address(stakingPool)] = true;
        emit StakingLaunched(address(stakingPool), msg.sender, stakingShare);
        emit StakingArgs(params);
        stakingContract = payable(address(stakingPool));

    }
    
    /// @notice receive eth
    receive() external payable {}

}

File 2 of 4 : IERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;


interface IERC20 {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address _owner) external view returns (uint256 balance);

    function transferFrom(
        address _from,
        address _to,
        uint256 _value
    ) external returns (bool success);

    function transfer(address _to, uint256 _value) external returns (bool success);

    function approve(address _spender, uint256 _value) external returns (bool success);

    function allowance(address _owner, address _spender) external view returns (uint256 remaining);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 3 of 4 : IStaking.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

interface IStaking {
    struct StakingParams {
            address owner;
            uint256 withdrawTimeout;
        }
    struct StakingDetails {
        uint256 claimable;
        uint256 withdrawable;
        uint256 unstakedAmount;
        uint256 totalRewards;
        uint256 timeToWithdraw;
        uint256 stakedAmount;
    }
    function transferOwnership(address _newOwner) external;
    function owner() external view returns (address);
    function rescueERC20(address _address) external;
    function stake(uint256 _amount) external;
    function unstake(uint256 _amount) external;
    function restake() external;
    function withdraw() external;
    function claimRewards() external;
    //function refreshPool() external;
    function getUserDetails(address) external view returns (StakingDetails memory);
}

File 4 of 4 : StakingPool.sol
// SPDX-License-Identifier: MIT
/*********************************************************************************************\
* Deployyyyer Memes: https://deployyyyer.fun
* Deployyyyer: https://deployyyyer.io
* Twitter: https://x.com/deployyyyer
* Telegram: https://t.me/Deployyyyer
/*********************************************************************************************/

pragma solidity ^0.8.23;

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

struct AppStorageStaking {
    address token;
    address owner;
    uint256 accRewardsPrecision;
    uint256 totalStakedAmount;
    uint256 withdrawTimeout;
    uint256 unallocatedETH;
    uint256 accRewardsPerShare;
    uint256 totalETHCollected;
    mapping(address => uint256) totalRewards;
    mapping(address => uint256) rewardDebt;
    mapping(address => uint256) stakedAmount;
    mapping(address => uint256) claimedAmount;
    mapping(address => uint256) claimableRewards;
    mapping(address => uint256) lastUnstakeTime;
    mapping(address => uint256) unstakedAmount;

}

contract Modifiers {
    AppStorageStaking internal s;
}
/// @title StakingPool
/// @dev 
contract StakingPool is IStaking, Modifiers {
    event Stake(address indexed user, uint256 amount);
    event Unstake(address indexed user, uint256 amount);
    event Withdraw(address indexed user, uint256 amount);
    event ClaimRewards(address indexed user, uint256 amount);
    event RewardsReceived(address indexed sender, uint256 amount, uint256 accRewardsPerShare);
    //event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor(IStaking.StakingParams memory params) {
        require(params.owner != address(0));
        s.owner = params.owner;
        //init appStorage 
        s.accRewardsPrecision = 1e18;  
        s.token = msg.sender;
        s.withdrawTimeout = params.withdrawTimeout;

    } 

    //tracking ownership in subgraph is not needed here, since ownership is unimportant
    /// @notice transfer ownership
    /// @dev
    function transferOwnership(address _newOwner) external override {
        require(msg.sender == s.owner);
        s.owner =  _newOwner;
    }
    
    /// @notice return owner address
    /// @dev
    function owner() external override view returns (address owner_) {
        owner_ = s.owner;
    }

    /// @notice rescue erc20 tokens from the contract
    /// @dev
    function rescueERC20(address _address) external {
        //only use of owner: as the rescue wallet! 
        bool ret = IERC20(_address).transfer(s.owner, IERC20(_address).balanceOf(address(this)));
        require(ret, "1");
    }

    /// @notice stake tokens
    /// @dev
    function stake(uint256 _amount) external override {
        uint256 pending = 0;
        require(_amount > 0);
        if (s.stakedAmount[msg.sender] > 0) {
            pending = ((s.stakedAmount[msg.sender] * s.accRewardsPerShare) / s.accRewardsPrecision) - s.rewardDebt[msg.sender];
        }

        uint256 unstakedAmount = s.unstakedAmount[msg.sender];
        if (unstakedAmount >= _amount) {
            s.unstakedAmount[msg.sender] -= _amount;
        } else {
            uint256 tokensNeeded = _amount - unstakedAmount;
            s.unstakedAmount[msg.sender] = 0;
            //requires staking contract to be approved by user
        	require(IERC20(s.token).transferFrom(msg.sender, address(this), tokensNeeded), "2");
        }
        
        s.stakedAmount[msg.sender] += _amount;
        s.rewardDebt[msg.sender] = s.stakedAmount[msg.sender] * s.accRewardsPerShare / s.accRewardsPrecision; 
        s.totalStakedAmount += _amount;

        if(pending > 0) {
            s.claimableRewards[msg.sender] += pending;
        }
        
        emit Stake(msg.sender, _amount);
    }

    /// @notice unstake staked tokens
    /// @dev
    function unstake(uint256 _amount) external override {
        require(_amount > 0 && s.stakedAmount[msg.sender] >= _amount, "3"); 
        uint256 pending = ((s.stakedAmount[msg.sender] * s.accRewardsPerShare) / s.accRewardsPrecision) - s.rewardDebt[msg.sender];
        s.stakedAmount[msg.sender] -= _amount;
        s.lastUnstakeTime[msg.sender] = block.timestamp;
        s.unstakedAmount[msg.sender] += _amount;

        s.rewardDebt[msg.sender] = s.stakedAmount[msg.sender] * s.accRewardsPerShare / s.accRewardsPrecision;
        s.totalStakedAmount -= _amount;

        if(pending > 0) {
            s.claimableRewards[msg.sender] += pending;
        }

        emit Unstake(msg.sender, _amount);
    }

    /// @notice restake unstaked tokens
    /// @dev
    function restake() external override {
        uint256 pending = 0;
        uint256 amountToRestake = s.unstakedAmount[msg.sender];
        require(amountToRestake > 0, "4"); 
        //allocateRewards();
        if (s.stakedAmount[msg.sender] > 0) {
            pending = ((s.stakedAmount[msg.sender] * s.accRewardsPerShare) / s.accRewardsPrecision) - s.rewardDebt[msg.sender];
        }

        s.unstakedAmount[msg.sender] = 0;
        s.stakedAmount[msg.sender] += amountToRestake;
        s.rewardDebt[msg.sender] = s.stakedAmount[msg.sender] * s.accRewardsPerShare / s.accRewardsPrecision;
        s.totalStakedAmount += amountToRestake;

        if(pending > 0) {
            s.claimableRewards[msg.sender] += pending;
        }
        emit Stake(msg.sender, amountToRestake);
    }

    /// @notice withdraw unstaked tokens
    /// @dev
    function withdraw() external override {
        uint256 toWithdraw = s.unstakedAmount[msg.sender];
        require(toWithdraw > 0, "5");
        require(block.timestamp >= s.lastUnstakeTime[msg.sender] + s.withdrawTimeout, "6");
        s.unstakedAmount[msg.sender] = 0;
        emit Withdraw(msg.sender, toWithdraw);
        require(IERC20(s.token).transfer(msg.sender, toWithdraw), "7");
        
    }

    /// @notice claim rewards in eth
    /// @dev
    function claimRewards() external override {
        s.claimableRewards[msg.sender] += ((s.stakedAmount[msg.sender] * s.accRewardsPerShare) / s.accRewardsPrecision) - s.rewardDebt[msg.sender];
        uint256 claimable = s.claimableRewards[msg.sender];
        require(claimable > 0, "8");
        s.rewardDebt[msg.sender] = s.stakedAmount[msg.sender] * s.accRewardsPerShare / s.accRewardsPrecision;
        uint256 amount = address(this).balance > claimable ? claimable : address(this).balance;
        s.claimableRewards[msg.sender] -= amount;
        s.claimedAmount[msg.sender] += amount; 
        emit ClaimRewards(msg.sender, amount);
        (bool sent,) = payable(msg.sender).call{value: amount}("");
        require(sent, "9");
        
    }
    
    /// @notice get details related to the user
    /// @dev
    function getUserDetails(address _user) external view returns (IStaking.StakingDetails memory) {
    	uint256 withdrawable = 0;
    	uint256 timeToWithdraw = 0;
    	uint256 claimable = s.claimableRewards[_user] + ((s.stakedAmount[_user] * s.accRewardsPerShare) / s.accRewardsPrecision) - s.rewardDebt[_user];
    	
    	if (block.timestamp >= s.lastUnstakeTime[_user] + s.withdrawTimeout) {
            withdrawable = s.unstakedAmount[_user];
        } else {
        	timeToWithdraw = block.timestamp - s.lastUnstakeTime[_user] + s.withdrawTimeout;
        }

        return IStaking.StakingDetails(claimable, withdrawable, s.unstakedAmount[_user], s.totalRewards[_user], timeToWithdraw, s.stakedAmount[_user]);
    }

    /// @notice receive
    /// @dev staing rewards in eth, sets accRewardsPerShare
    receive() external payable {
        uint256 amount = msg.value;
        require(amount > 0, "r");
        s.totalRewards[msg.sender] += amount;
        s.totalETHCollected += amount;
        if (s.totalStakedAmount == 0) {
            s.unallocatedETH += amount;
        } else {
            s.accRewardsPerShare += ((amount+s.unallocatedETH) * s.accRewardsPrecision) / s.totalStakedAmount;  
            s.unallocatedETH = 0;         
        }
        emit RewardsReceived(msg.sender, amount, s.accRewardsPerShare);
    }

}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 800
  },
  "evmVersion": "paris",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"taxWallet","type":"address"},{"internalType":"address","name":"teamFinanceLocker","type":"address"},{"internalType":"uint256","name":"minLiq","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"initTaxType","type":"uint256"},{"internalType":"uint256","name":"initInterval","type":"uint256"},{"internalType":"uint256","name":"countInterval","type":"uint256"},{"internalType":"uint256","name":"maxBuyTax","type":"uint256"},{"internalType":"uint256","name":"minBuyTax","type":"uint256"},{"internalType":"uint256","name":"maxSellTax","type":"uint256"},{"internalType":"uint256","name":"minSellTax","type":"uint256"},{"internalType":"uint256","name":"lpTax","type":"uint256"},{"internalType":"uint256","name":"maxWallet","type":"uint256"},{"internalType":"uint256","name":"maxTx","type":"uint256"},{"internalType":"uint256","name":"preventSwap","type":"uint256"},{"internalType":"uint256","name":"maxSwap","type":"uint256"},{"internalType":"uint256","name":"taxSwapThreshold","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"bool","name":"isFreeTier","type":"bool"}],"internalType":"struct DeployyyyerToken.InitParams","name":"params","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"ownerAddress","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":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockPeriod","type":"uint256"}],"name":"ExternalLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxWallet","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxTx","type":"uint256"}],"name":"IncreasedLimits","type":"event"},{"anonymous":false,"inputs":[],"name":"LockRetrieved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"ldays","type":"uint256"}],"name":"LockUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"LpBurnt","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":"string","name":"telegram","type":"string"},{"indexed":false,"internalType":"string","name":"twitter","type":"string"},{"indexed":false,"internalType":"string","name":"website","type":"string"}],"name":"SocialsSet","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"withdrawTimeout","type":"uint256"}],"indexed":false,"internalType":"struct IStaking.StakingParams","name":"params","type":"tuple"}],"name":"StakingArgs","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"stakingPool","type":"address"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"share","type":"uint256"}],"name":"StakingLaunched","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakingMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"share","type":"uint256"}],"name":"StakingShareIncreased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TaxGiven","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TaxMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"liq","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockPeriod","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isBurnt","type":"bool"},{"indexed":false,"internalType":"address","name":"router","type":"address"}],"name":"TradingEnabled","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":[{"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":"burnLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ldays","type":"uint256"}],"name":"extendLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getLPDetails","outputs":[{"components":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"uint256","name":"buycount","type":"uint256"},{"internalType":"uint256","name":"taxBuy","type":"uint256"},{"internalType":"uint256","name":"taxSell","type":"uint256"},{"internalType":"uint256","name":"lockDays","type":"uint256"},{"internalType":"bool","name":"isBurnt","type":"bool"},{"internalType":"uint256","name":"tradingOpened","type":"uint256"},{"internalType":"bool","name":"walletLimited","type":"bool"},{"internalType":"address","name":"stakingContract","type":"address"},{"internalType":"uint256","name":"stakingShare","type":"uint256"},{"internalType":"uint256","name":"maxTx","type":"uint256"},{"internalType":"uint256","name":"maxWallet","type":"uint256"},{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"presale","type":"address"}],"internalType":"struct DeployyyyerToken.LPDetails","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxwallet","type":"uint256"},{"internalType":"uint256","name":"maxtx","type":"uint256"}],"name":"increaseLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"share","type":"uint256"}],"name":"increaseStakingShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"share","type":"uint256"},{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"withdrawTimeout","type":"uint256"}],"internalType":"struct IStaking.StakingParams","name":"params","type":"tuple"}],"name":"launchStaking","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"_address","type":"address"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"retrieveLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lockPeriod","type":"uint256"},{"internalType":"bool","name":"shouldBurn","type":"bool"},{"internalType":"address","name":"router","type":"address"}],"name":"startTrading","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b5060405161457a38038061457a83398101604081905261002f916103d0565b8051600080546001600160a01b0319166001600160a01b0390921691821781556040517f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36040810151600380546001600160a01b039283166001600160a01b031991821617909155600980548216331790556060830151600155610100830151600e819055600f556101208301516010556101408301516011819055601290815561016084015160135561018084015160275560a0840151600b5560c0840151600c5560e0840151600d556000600a5561028084015160208054911515600160b81b0260ff60b81b199092169190911781556015805460ff19169092179091558301516008805491909316911617905561024081015160179061015690826105d9565b5061026081015160189061016a90826105d9565b5060808101516016819055610220820151601b55610200820151601c556020805460ff60b01b1916600160b01b1790556101a0820151612710916101ae9190610698565b6101b891906106c3565b601d556101c0810151601654612710916101d191610698565b6101db91906106c3565b601e556101a08101516127101480156101fa5750806101c00151612710145b1561020d576020805460ff60b01b191690555b7f3e470cf1ec3767d0209f5128c840997ff9b70dfe0da263b3f94eb114a05d9327816101a00151826101c00151604051610251929190918252602082015260400190565b60405180910390a160165430600081815260066020908152604080832085905551938452919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36101e00151601a556106e5565b634e487b7160e01b600052604160045260246000fd5b6040516102a081016001600160401b03811182821017156102ea576102ea6102b1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610318576103186102b1565b604052919050565b80516001600160a01b038116811461033757600080fd5b919050565b600082601f83011261034d57600080fd5b81516001600160401b03811115610366576103666102b1565b602061037a601f8301601f191682016102f0565b828152858284870101111561038e57600080fd5b60005b838110156103ac578581018301518282018401528201610391565b506000928101909101919091529392505050565b8051801515811461033757600080fd5b6000602082840312156103e257600080fd5b81516001600160401b03808211156103f957600080fd5b908301906102a0828603121561040e57600080fd5b6104166102c7565b61041f83610320565b815261042d60208401610320565b602082015261043e60408401610320565b6040820152606083810151908201526080808401519082015260a0808401519082015260c0808401519082015260e08084015190820152610100808401519082015261012080840151908201526101408084015190820152610160808401519082015261018080840151908201526101a080840151908201526101c080840151908201526101e080840151908201526102008084015190820152610220808401519082015261024080840151838111156104f757600080fd5b6105038882870161033c565b828401525050610260808401518381111561051d57600080fd5b6105298882870161033c565b828401525050610280915061053f8284016103c0565b91810191909152949350505050565b600181811c9082168061056257607f821691505b60208210810361058257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156105d4576000816000526020600020601f850160051c810160208610156105b15750805b601f850160051c820191505b818110156105d0578281556001016105bd565b5050505b505050565b81516001600160401b038111156105f2576105f26102b1565b61060681610600845461054e565b84610588565b602080601f83116001811461063b57600084156106235750858301515b600019600386901b1c1916600185901b1785556105d0565b600085815260208120601f198616915b8281101561066a5788860151825594840194600190910190840161064b565b50858210156106885787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820281158282048414176106bd57634e487b7160e01b600052601160045260246000fd5b92915050565b6000826106e057634e487b7160e01b600052601260045260246000fd5b500490565b613e86806106f46000396000f3fe6080604052600436106101635760003560e01c806370a08231116100c0578063af66394d11610074578063db7c4dda11610059578063db7c4dda146103ac578063dd62ed3e146103bf578063f2fde38b1461040557600080fd5b8063af66394d1461036c578063ccec37161461038c57600080fd5b80638da5cb5b116100a55780638da5cb5b1461030f57806395d89b4114610337578063a9059cbb1461034c57600080fd5b806370a08231146102b957806378f8484b146102ef57600080fd5b806323b872dd1161011757806344ee3a1c116100fc57806344ee3a1c146102625780634839c8b3146102825780635c89dfe11461029757600080fd5b806323b872dd14610220578063313ce5671461024057600080fd5b80630b45260e116101485780630b45260e146101ca57806318160ddd146101e157806320ffb26d1461020057600080fd5b806306fdde031461016f578063095ea7b31461019a57600080fd5b3661016a57005b600080fd5b34801561017b57600080fd5b50610184610425565b6040516101919190612816565b60405180910390f35b3480156101a657600080fd5b506101ba6101b536600461287a565b6104b7565b6040519015158152602001610191565b3480156101d657600080fd5b506101df6104ce565b005b3480156101ed57600080fd5b506016545b604051908152602001610191565b34801561020c57600080fd5b506101df61021b3660046128a6565b6106d0565b34801561022c57600080fd5b506101ba61023b3660046128bf565b6107b5565b34801561024c57600080fd5b5060155460405160ff9091168152602001610191565b34801561026e57600080fd5b506101df61027d3660046128a6565b61085d565b34801561028e57600080fd5b506101df610993565b3480156102a357600080fd5b506102ac610be1565b6040516101919190612900565b3480156102c557600080fd5b506101f26102d43660046129c6565b6001600160a01b031660009081526006602052604090205490565b3480156102fb57600080fd5b506101df61030a3660046129ea565b610d2e565b34801561031b57600080fd5b506000546040516001600160a01b039091168152602001610191565b34801561034357600080fd5b50610184610edd565b34801561035857600080fd5b506101ba61036736600461287a565b610eec565b34801561037857600080fd5b506101df610387366004612a0c565b610ef9565b34801561039857600080fd5b506101df6103a73660046129c6565b61110d565b6101df6103ba366004612a9c565b61125b565b3480156103cb57600080fd5b506101f26103da366004612ade565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b34801561041157600080fd5b506101df6104203660046129c6565b61190c565b60606017805461043490612b17565b80601f016020809104026020016040519081016040528092919081815260200182805461046090612b17565b80156104ad5780601f10610482576101008083540402835291602001916104ad565b820191906000526020600020905b81548152906001019060200180831161049057829003601f168201915b5050505050905090565b60006104c43384846119d8565b5060015b92915050565b6000546001600160a01b031633146105115760405162461bcd60e51b81526020600482015260016024820152606f60f81b60448201526064015b60405180910390fd5b602054600160c01b900460ff161580156105355750602054600160c81b900460ff16155b801561054a5750602054600160a01b900460ff165b61057a5760405162461bcd60e51b81526020600482015260016024820152606160f81b6044820152606401610508565b6020805460ff60c01b1916600160c01b1790556040517fc43e780723fe0e2a85c0bd4291955d83cac42c6036fd8bf58b10463d3f9f1ae890600090a16020546040516370a0823160e01b81523060048201526001600160a01b039091169063a9059cbb9061dead9083906370a0823190602401602060405180830381865afa15801561060a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062e9190612b51565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610679573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069d9190612b6a565b6106ce5760405162461bcd60e51b8152602060048201526002602482015261379960f11b6044820152606401610508565b565b6000546001600160a01b0316331480156106ec57506000602254115b80156106f85750600081115b6107285760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b806022600082825461073a9190612b9d565b9091555050602254606410156107775760405162461bcd60e51b81526020600482015260026024820152616f7360f01b6044820152606401610508565b7fcc5d343fa3728e63489d08b6f42d710f12e9126dec83f9b9a9fa74b7e54d22416022546040516107aa91815260200190565b60405180910390a150565b6001600160a01b038316600090815260076020908152604080832033845290915281205482111561080d5760405162461bcd60e51b8152602060048201526002602482015261323560f01b6044820152606401610508565b6001600160a01b038416600090815260076020908152604080832033808552925290912054610848918691610843908690612bb0565b6119d8565b610853848484611a5f565b5060019392505050565b6000546001600160a01b0316331461089b5760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b602054600160c81b900460ff161580156108bf5750602054600160c01b900460ff16155b80156108d45750602054600160a01b900460ff165b6109045760405162461bcd60e51b81526020600482015260016024820152606160f81b6044820152606401610508565b42602154620151806109169190612bc3565b6014546109239190612b9d565b101561094957620151806014544261093b9190612bb0565b6109459190612bda565b6021555b806021600082825461095b9190612b9d565b90915550506021546040519081527fa7b24c66dd3269a292a60b3facdbb8f3e7557d1e19e64d99e0d6ee7250be63ad906020016107aa565b6000546001600160a01b031633146109d15760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b602054600160c81b900460ff161580156109f55750602054600160c01b900460ff16155b8015610a0a5750602054600160a01b900460ff165b610a3a5760405162461bcd60e51b81526020600482015260016024820152606160f81b6044820152606401610508565b42602154603c610a4a9190612bc3565b610a5590603c612bc3565b610a60906018612bc3565b601454610a6d9190612b9d565b10156106ce5760208054600160c81b7fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff8216179091556040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0d9190612b51565b6040519091507faf0fe1663cb7e005c807c426024d6b7bedd6fea7b9df02852418932d71cd78bd90600090a160205460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303816000875af1158015610b8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bae9190612b6a565b610bde5760405162461bcd60e51b81526020600482015260016024820152603160f91b6044820152606401610508565b50565b610c7b604051806101c0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000151581526020016000815260200160001515815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b604080516101c081018252602080546001600160a01b03168252600a5490820152600e5491810191909152601154606082015260808101610cba611fca565b81526020805460ff600160c01b820481161515928401929092526014546040840152600160b01b900416151560608201526023546001600160a01b03908116608083015260225460a0830152601e5460c0830152601d5460e0830152601f5416610100820152600061012090910152919050565b6000546001600160a01b031633148015610d515750602054600160b01b900460ff165b610d815760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b601d5461271083601654610d959190612bc3565b610d9f9190612bda565b10158015610daf57506127108211155b610ddf5760405162461bcd60e51b81526020600482015260016024820152606160f81b6044820152606401610508565b601e5461271082601654610df39190612bc3565b610dfd9190612bda565b10158015610e0d57506127108111155b610e3d5760405162461bcd60e51b81526020600482015260016024820152603160f91b6044820152606401610508565b61271082601654610e4e9190612bc3565b610e589190612bda565b601d5560165461271090610e6d908390612bc3565b610e779190612bda565b601e5561271082148015610e8c575080612710145b15610e9f576020805460ff60b01b191690555b60408051838152602081018390527f3e470cf1ec3767d0209f5128c840997ff9b70dfe0da263b3f94eb114a05d932791015b60405180910390a15050565b60606018805461043490612b17565b60006104c4338484611a5f565b6000546001600160a01b03163314610f375760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b602254158015610f475750600082115b8015610f54575060648211155b610f845760405162461bcd60e51b81526020600482015260016024820152607960f81b6044820152606401610508565b6202a300816020015110158015610fa15750620d2f008160200151105b610fd15760405162461bcd60e51b81526020600482015260016024820152603d60f91b6044820152606401610508565b60228290553381526040516000908290610fea90612809565b81516001600160a01b0316815260209182015191810191909152604001604051809103906000f080158015611023573d6000803e3d6000fd5b506001600160a01b03811660008181526004602090815260408083208054600160ff199182168117909255600584529382902080549094161790925560225482519384523391840191909152908201529091507fc718bf738f6d7cb0af735b17552ef9e5f1857d1719d7f882b8780ea2f08b3e7f9060600160405180910390a16040805183516001600160a01b03168152602080850151908201527f8bdc63644658897d37c2cff731dd7a8898394f85b3c9d9b4b7879390385d4c26910160405180910390a1602380546001600160a01b0319166001600160a01b03929092169190911790555050565b6020546001600160a01b039081169082160361112857600080fd5b306001600160a01b0382160361113d57600080fd5b6008546040516370a0823160e01b81523060048201526001600160a01b038381169263a9059cbb9291169083906370a0823190602401602060405180830381865afa158015611190573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b49190612b51565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156111ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112239190612b6a565b6112535760405162461bcd60e51b81526020600482015260016024820152603960f91b6044820152606401610508565b610bde61202a565b6000546001600160a01b031633146112995760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b602054600160a01b900460ff16156112d75760405162461bcd60e51b81526020600482015260016024820152603160f81b6044820152606401610508565b60015447101561130d5760405162461bcd60e51b81526020600482015260016024820152601960f91b6044820152606401610508565b8161132057600e83101561132057600080fd5b602080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790819055601e54601d549091600160b01b900460ff1680151560010361138557601654601e819055601d556020805460ff60b01b191690555b3060008181526004602090815260408083208054600160ff19918216811790925584546001600160a01b03908116865283862080548316841790557f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd80548316841790558686526005909452828520805482168317905584549093168452908320805483168217905561dead9092527f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba80549091169091179055851561146057506020805460ff60c01b1916600160c01b1790556000611473565b60218790556020805460ff60c01b191690555b30600090815260066020526040908190205442601455600954915163a992664760e01b81526001600160a01b0388811660048301529192919091169063a992664790602401602060405180830381865afa1580156114d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f99190612b6a565b61150257600080fd5b601f80546001600160a01b0319166001600160a01b03888116918217835560165430600090815260076020908152604080832095835294815290849020919091559254825163c45a015560e01b8152925191169263c45a015592600480820193918290030181865afa15801561157c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a09190612bfc565b6001600160a01b031663c9c6539630601f60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611602573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116269190612bfc565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611673573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116979190612bfc565b602080546001600160a01b0319166001600160a01b039283169081178255600090815260058083526040808320805460ff199081166001908117909255855487168552600486528285208054821683179055601f80548816865283862080548316841790558054881686529386529382902080549094161790925582546021549154835191861682524794820194909452918201528915156060820152911660808201527f0157a1a09a393e0b2567e699c9fafaa987dd8440f4b66795e9667d8749d7239e9060a00160405180910390a1602054601f5460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af11580156117be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e29190612b6a565b6118125760405162461bcd60e51b81526020600482015260016024820152603360f81b6044820152606401610508565b601f546001600160a01b031663f305d7194730846000808861183542603c612b9d565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af11580156118a2573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906118c79190612c19565b50506025805460ff191660019081179091558415159003905061190257601e859055601d8490556020805460ff60b01b1916600160b01b1790555b5050505050505050565b6000546001600160a01b0316331461194a5760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392831690811782558152600460209081526040808320805460ff1990811660019081179092558454909516845260059092529091208054909216179055565b6001600160a01b0383166119eb57600080fd5b6001600160a01b0382166119fe57600080fd5b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831615801590611a7f57506001600160a01b03821615155b611a8857600080fd5b6001600160a01b038316600090815260066020526040902054811115611ad55760405162461bcd60e51b81526020600482015260026024820152611b1b60f11b6044820152606401610508565b602054600090600160a01b900460ff168015611afa5750602054600160b01b900460ff165b8015611b1f57506001600160a01b03841660009081526004602052604090205460ff16155b8015611b4457506001600160a01b03831660009081526004602052604090205460ff16155b15611b805781601e541015611b805760405162461bcd60e51b8152602060048201526002602482015261033360f41b6044820152606401610508565b602054600160a01b900460ff168015611ba25750602054600160b01b900460ff165b8015611bc757506001600160a01b03831660009081526005602052604090205460ff16155b15611c2657601d546001600160a01b038416600090815260066020526040902054611bf3908490612b9d565b1115611c265760405162461bcd60e51b8152602060048201526002602482015261333160f01b6044820152606401610508565b6000546001600160a01b03858116911614801590611c5257506000546001600160a01b03848116911614155b8015611c65575060255460ff1615156001145b15611d28576020546001600160a01b038581169116148015611c955750601f546001600160a01b03848116911614155b15611cd657600a8054906000611caa83612c47565b9190505550611cb960016120f2565b6064600e5483611cc99190612bc3565b611cd39190612bda565b90505b6020546001600160a01b038481169116148015611cfc57506001600160a01b0384163014155b15611d2857611d0b60006120f2565b606460115483611d1b9190612bc3565b611d259190612bda565b90505b30600090815260066020526040812054602054909150600090600160a81b900460ff16158015611d6557506020546001600160a01b038681169116145b8015611d7a57506001600160a01b0386163014155b8015611d865750600082115b8015611d955750601a54600a54115b15611e1357601b54821180611dd057506201518060145442611db79190612bb0565b118015611dc45750601054155b8015611dd05750601354155b15611e1357601954431115611e1357601c54821015611df757611df2826122f4565b611e02565b611e02601c546122f4565b611e0b476124b3565b504360195560015b8215611e8e5730600090815260066020526040902054611e34908490612b9d565b30600081815260066020526040908190209290925590516001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611e859087815260200190565b60405180910390a35b6001600160a01b038616600090815260066020526040902054611eb2908590612bb0565b6001600160a01b0380881660009081526006602052604080822093909355908716815220548390611ee4908690612b9d565b611eee9190612bb0565b6001600160a01b0380871660008181526006602052604090209290925587167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611f388688612bb0565b60405190815260200160405180910390a38015611fc2576000611f84600860009054906101000a90046001600160a01b0316620186a047604051806020016040528060008152506127ef565b90508015611fc0576040514781527f2488b4123934dca0dca56f8f7005a71c0a52e2c9158fe31ac31869efe776d6eb9060200160405180910390a15b505b505050505050565b602054600090600160a01b900460ff16611fe45750600090565b60006201518060145442611ff89190612bb0565b6120029190612bda565b905060215481111561201657600091505090565b806021546120249190612bb0565b91505090565b602054600160a81b900460ff1615801561204d5750602054600160a01b900460ff165b156106ce57478015610bde57612062816124b3565b6008546040516000916001600160a01b03169047908381818185875af1925050503d80600081146120af576040519150601f19603f3d011682016040523d82523d6000602084013e6120b4565b606091505b5050905080156120ee576040514781527f2488b4123934dca0dca56f8f7005a71c0a52e2c9158fe31ac31869efe776d6eb90602001610ed1565b5050565b6000806000831561211157600f5492506010549150600e549050612121565b6012549250601354915060115490505b8181146122ee57600b546000036121ce57600c546014546121429190612b9d565b421061214f5750806122d8565b6002600c5461215e9190612bda565b60145461216b9190612b9d565b421061219857600461217d8385612bb0565b6121879190612bda565b6121919083612b9d565b90506122d8565b6004600c546121a79190612bda565b6014546121b49190612b9d565b42106121c657600261217d8385612bb0565b50815b6122d8565b600b5460010361220a57600d54600a5411156121eb5750806121ee565b50815b6014546121fd90611c20612b9d565b42106121c95750806122d8565b600b546002036122d557600d54600a5411806122355750600c546014546122319190612b9d565b4210155b156122415750806122d8565b6002600d546122509190612bda565b600a54118061227a57506002600c546122699190612bda565b6014546122769190612b9d565b4210155b1561228b57600461217d8385612bb0565b6004600d5461229a9190612bda565b600a5411806122c457506004600c546122b39190612bda565b6014546122c09190612b9d565b4210155b156121c657600261217d8385612bb0565b50805b83156122e857600e8190556122ee565b60118190555b50505050565b6020805460ff60a81b1916600160a81b1781556040805160028082526060820183526000939192909183019080368337019050509050308160008151811061233e5761233e612c60565b6001600160a01b03928316602091820292909201810191909152601f54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612397573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123bb9190612bfc565b816001815181106123ce576123ce612c60565b6001600160a01b03909216602092830291909101909101526027541561241f5760c8602754836123fe9190612bc3565b6124089190612bda565b60268190556124179083612bb0565b602481905591505b601f546124379030906001600160a01b0316846119d8565b601f5460405163791ac94760e01b81526001600160a01b039091169063791ac94790612470908590600090869030904290600401612c76565b600060405180830381600087803b15801561248a57600080fd5b505af115801561249e573d6000803e3d6000fd5b50506020805460ff60a81b1916905550505050565b600080600080602060179054906101000a900460ff161515600115151480156124eb57506276a700601454426124e99190612bb0565b105b156125cc5760646124fd86600a612bc3565b6125079190612bda565b93507f27becf433f6eafb15520b27cdc27123fc4bb3ab578777db9f713bd54da1611a68460405161253a91815260200190565b60405180910390a16009546040516000916001600160a01b03169086908381818185875af1925050503d806000811461258f576040519150601f19603f3d011682016040523d82523d6000602084013e612594565b606091505b50509050806125ca5760405162461bcd60e51b8152602060048201526002602482015261393960f01b6044820152606401610508565b505b60006027541180156125e057506000602654115b156126e657602454856026546125f69190612bc3565b6126009190612bda565b60268054600091829055602491909155601f54919450915061262d9030906001600160a01b0316836119d8565b601f546001600160a01b031663f305d7198430846000808361265042603c612b9d565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af11580156126bd573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126e29190612c19565b5050505b6023546001600160a01b0316156127e857602254606490846127088789612bb0565b6127129190612bb0565b61271c9190612bc3565b6127269190612bda565b6023546040519193506000916001600160a01b039091169084908381818185875af1925050503d8060008114612778576040519150601f19603f3d011682016040523d82523d6000602084013e61277d565b606091505b50509050806127b35760405162461bcd60e51b8152602060048201526002602482015261733960f01b6044820152606401610508565b6040518381527f3392b75a0721e4605be82daf22af3b927da9086deccc7dbb947b37bf895d3deb9060200160405180910390a1505b5050505050565b600080600080845160208601878a8af19695505050505050565b61116780612cea83390190565b60006020808352835180602085015260005b8181101561284457858101830151858201604001528201612828565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610bde57600080fd5b6000806040838503121561288d57600080fd5b823561289881612865565b946020939093013593505050565b6000602082840312156128b857600080fd5b5035919050565b6000806000606084860312156128d457600080fd5b83356128df81612865565b925060208401356128ef81612865565b929592945050506040919091013590565b81516001600160a01b031681526101c081016020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015161294d60a084018215159052565b5060c083015160c083015260e083015161296b60e084018215159052565b50610100838101516001600160a01b0390811691840191909152610120808501519084015261014080850151908401526101608085015190840152610180808501518216908401526101a09384015116929091019190915290565b6000602082840312156129d857600080fd5b81356129e381612865565b9392505050565b600080604083850312156129fd57600080fd5b50508035926020909101359150565b6000808284036060811215612a2057600080fd5b833592506040601f1982011215612a3657600080fd5b506040516040810181811067ffffffffffffffff82111715612a6857634e487b7160e01b600052604160045260246000fd5b6040526020840135612a7981612865565b81526040939093013560208401525092909150565b8015158114610bde57600080fd5b600080600060608486031215612ab157600080fd5b833592506020840135612ac381612a8e565b91506040840135612ad381612865565b809150509250925092565b60008060408385031215612af157600080fd5b8235612afc81612865565b91506020830135612b0c81612865565b809150509250929050565b600181811c90821680612b2b57607f821691505b602082108103612b4b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215612b6357600080fd5b5051919050565b600060208284031215612b7c57600080fd5b81516129e381612a8e565b634e487b7160e01b600052601160045260246000fd5b808201808211156104c8576104c8612b87565b818103818111156104c8576104c8612b87565b80820281158282048414176104c8576104c8612b87565b600082612bf757634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215612c0e57600080fd5b81516129e381612865565b600080600060608486031215612c2e57600080fd5b8351925060208401519150604084015190509250925092565b600060018201612c5957612c59612b87565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600060a08201878352602087602085015260a0604085015281875180845260c08601915060208901935060005b81811015612cc85784516001600160a01b031683529383019391830191600101612ca3565b50506001600160a01b0396909616606085015250505060800152939250505056fe608060405234801561001057600080fd5b5060405161116738038061116783398101604081905261002f91610086565b80516001600160a01b031661004357600080fd5b8051600180546001600160a01b039092166001600160a01b0319928316179055670de0b6b3a76400006002556000805490911633179055602001516004556100f7565b60006040828403121561009857600080fd5b604080519081016001600160401b03811182821017156100c857634e487b7160e01b600052604160045260246000fd5b60405282516001600160a01b03811681146100e257600080fd5b81526020928301519281019290925250919050565b611061806101066000396000f3fe60806040526004361061009a5760003560e01c80638da5cb5b11610069578063cc3d967b1161004e578063cc3d967b1461027b578063ccec3716146102e7578063f2fde38b1461030757600080fd5b80638da5cb5b1461022e578063a694fc3a1461025b57600080fd5b80632e17de78146101cd578063372500ab146101ef5780633ccfd60b146102045780634f91440d1461021957600080fd5b366101c85734806100d65760405162461bcd60e51b81526020600482015260016024820152603960f91b60448201526064015b60405180910390fd5b33600090815260086020526040812080548392906100f5908490610f42565b90915550506007805482919060009061010f908490610f42565b909155505060035460000361013e5780600060050160008282546101339190610f42565b909155506101829050565b6003546002546005546101519084610f42565b61015b9190610f5b565b6101659190610f72565b60068054600090610177908490610f42565b909155505060006005555b60065460405133917f731185b941ee4773f1c8f1cf0c22be2c6b4eaeb0075fbb4c524ac1f80ad391f3916101be91858252602082015260400190565b60405180910390a2005b600080fd5b3480156101d957600080fd5b506101ed6101e8366004610f94565b610327565b005b3480156101fb57600080fd5b506101ed6104ca565b34801561021057600080fd5b506101ed6106c0565b34801561022557600080fd5b506101ed610845565b34801561023a57600080fd5b506001546040516001600160a01b0390911681526020015b60405180910390f35b34801561026757600080fd5b506101ed610276366004610f94565b6109c2565b34801561028757600080fd5b5061029b610296366004610fad565b610c17565b6040516102529190600060c082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015292915050565b3480156102f357600080fd5b506101ed610302366004610fad565b610da1565b34801561031357600080fd5b506101ed610322366004610fad565b610edb565b6000811180156103465750336000908152600a60205260409020548111155b6103765760405162461bcd60e51b81526020600482015260016024820152603360f81b60448201526064016100cd565b33600090815260096020908152604080832054600254600654600a9094529184205490926103a391610f5b565b6103ad9190610f72565b6103b79190610fdd565b336000908152600a60205260408120805492935084929091906103db908490610fdd565b9091555050336000908152600d60209081526040808320429055600e9091528120805484929061040c908490610f42565b9091555050600254600654336000908152600a60205260409020546104319190610f5b565b61043b9190610f72565b3360009081526009602052604081209190915560038054849290610460908490610fdd565b9091555050801561049057336000908152600c60205260408120805483929061048a908490610f42565b90915550505b60405182815233907f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd906020015b60405180910390a25050565b33600090815260096020908152604080832054600254600654600a909452919093205490916104f891610f5b565b6105029190610f72565b61050c9190610fdd565b336000908152600c60205260408120805490919061052b908490610f42565b9091555050336000908152600c6020526040902054806105715760405162461bcd60e51b81526020600482015260016024820152600760fb1b60448201526064016100cd565b600254600654336000908152600a60205260409020546105919190610f5b565b61059b9190610f72565b336000908152600960205260408120919091554782106105bb57476105bd565b815b336000908152600c60205260408120805492935083929091906105e1908490610fdd565b9091555050336000908152600b602052604081208054839290610605908490610f42565b909155505060405181815233907f1f89f96333d3133000ee447473151fa9606543368f02271c9d95ae14f13bcc679060200160405180910390a2604051600090339083908381818185875af1925050503d8060008114610681576040519150601f19603f3d011682016040523d82523d6000602084013e610686565b606091505b50509050806106bb5760405162461bcd60e51b81526020600482015260016024820152603960f81b60448201526064016100cd565b505050565b336000908152600e6020526040902054806107015760405162461bcd60e51b81526020600482015260016024820152603560f81b60448201526064016100cd565b600454336000908152600d602052604090205461071e9190610f42565b4210156107515760405162461bcd60e51b81526020600482015260016024820152601b60f91b60448201526064016100cd565b336000818152600e602052604080822091909155517f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906107959084815260200190565b60405180910390a260005460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303816000875af11580156107ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108129190610ff0565b6108425760405162461bcd60e51b81526020600482015260016024820152603760f81b60448201526064016100cd565b50565b336000908152600e6020526040812054806108865760405162461bcd60e51b81526020600482015260016024820152600d60fa1b60448201526064016100cd565b336000908152600a6020526040902054156108e05733600090815260096020908152604080832054600254600654600a909452919093205490916108c991610f5b565b6108d39190610f72565b6108dd9190610fdd565b91505b336000908152600e60209081526040808320839055600a9091528120805483929061090c908490610f42565b9091555050600254600654336000908152600a60205260409020546109319190610f5b565b61093b9190610f72565b3360009081526009602052604081209190915560038054839290610960908490610f42565b9091555050811561099057336000908152600c60205260408120805484929061098a908490610f42565b90915550505b60405181815233907febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a906020016104be565b60008082116109d057600080fd5b336000908152600a602052604090205415610a2a5733600090815260096020908152604080832054600254600654600a90945291909320549091610a1391610f5b565b610a1d9190610f72565b610a279190610fdd565b90505b336000908152600e6020526040902054828110610a6b57336000908152600e602052604081208054859290610a60908490610fdd565b90915550610b3a9050565b6000610a778285610fdd565b336000818152600e6020526040808220829055905490516323b872dd60e01b81526004810192909252306024830152604482018390529192506001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015610ae4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b089190610ff0565b610b385760405162461bcd60e51b81526020600482015260016024820152601960f91b60448201526064016100cd565b505b336000908152600a602052604081208054859290610b59908490610f42565b9091555050600254600654336000908152600a6020526040902054610b7e9190610f5b565b610b889190610f72565b3360009081526009602052604081209190915560038054859290610bad908490610f42565b90915550508115610bdd57336000908152600c602052604081208054849290610bd7908490610f42565b90915550505b60405183815233907febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a9060200160405180910390a2505050565b610c506040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b038216600090815260096020908152604080832054600254600654600a909452918420548493849391610c8a9190610f5b565b610c949190610f72565b6001600160a01b0387166000908152600c6020526040902054610cb79190610f42565b610cc19190610fdd565b6004546001600160a01b0387166000908152600d6020526040902054919250610ce991610f42565b4210610d0f576001600160a01b0385166000908152600e60205260409020549250610d42565b6004546001600160a01b0386166000908152600d6020526040902054610d359042610fdd565b610d3f9190610f42565b91505b6040805160c0810182529182526020808301949094526001600160a01b039095166000818152600e855286812054838801528181526008855286812054606084015260808301939093528252600a909252929092205460a08301525090565b6001546040516370a0823160e01b81523060048201526000916001600160a01b038481169263a9059cbb92919091169083906370a0823190602401602060405180830381865afa158015610df9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1d9190611012565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610e80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea49190610ff0565b905080610ed75760405162461bcd60e51b81526020600482015260016024820152603160f81b60448201526064016100cd565b5050565b6001546001600160a01b03163314610ef257600080fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b634e487b7160e01b600052601160045260246000fd5b80820180821115610f5557610f55610f2c565b92915050565b8082028115828204841417610f5557610f55610f2c565b600082610f8f57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215610fa657600080fd5b5035919050565b600060208284031215610fbf57600080fd5b81356001600160a01b0381168114610fd657600080fd5b9392505050565b81810381811115610f5557610f55610f2c565b60006020828403121561100257600080fd5b81518015158114610fd657600080fd5b60006020828403121561102457600080fd5b505191905056fea26469706673582212201be65b40cb7776d62b638c878f0e41b37b004cbd039f7d54b20da61e3c9965eb64736f6c63430008190033a264697066735822122046423ee4c935bdced56258cde1f3d1fb2bf342aa964757dcbe6d6e2f64a4fcdf64736f6c63430008190033000000000000000000000000000000000000000000000000000000000000002000000000000000000000000064029afab65a7a2f00ca908d2e866d3d0b6c1e5e00000000000000000000000064029afab65a7a2f00ca908d2e866d3d0b6c1e5e0000000000000000000000004f0fd563be89ec8c3e7d595bf3639128c0a7c33a000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000204fce5e3e2502611000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000e1000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000052b7d2dcc80cd2e4000000000000000000000000000000000000000000000000084595161401484a00000000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004546563680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045445434800000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101635760003560e01c806370a08231116100c0578063af66394d11610074578063db7c4dda11610059578063db7c4dda146103ac578063dd62ed3e146103bf578063f2fde38b1461040557600080fd5b8063af66394d1461036c578063ccec37161461038c57600080fd5b80638da5cb5b116100a55780638da5cb5b1461030f57806395d89b4114610337578063a9059cbb1461034c57600080fd5b806370a08231146102b957806378f8484b146102ef57600080fd5b806323b872dd1161011757806344ee3a1c116100fc57806344ee3a1c146102625780634839c8b3146102825780635c89dfe11461029757600080fd5b806323b872dd14610220578063313ce5671461024057600080fd5b80630b45260e116101485780630b45260e146101ca57806318160ddd146101e157806320ffb26d1461020057600080fd5b806306fdde031461016f578063095ea7b31461019a57600080fd5b3661016a57005b600080fd5b34801561017b57600080fd5b50610184610425565b6040516101919190612816565b60405180910390f35b3480156101a657600080fd5b506101ba6101b536600461287a565b6104b7565b6040519015158152602001610191565b3480156101d657600080fd5b506101df6104ce565b005b3480156101ed57600080fd5b506016545b604051908152602001610191565b34801561020c57600080fd5b506101df61021b3660046128a6565b6106d0565b34801561022c57600080fd5b506101ba61023b3660046128bf565b6107b5565b34801561024c57600080fd5b5060155460405160ff9091168152602001610191565b34801561026e57600080fd5b506101df61027d3660046128a6565b61085d565b34801561028e57600080fd5b506101df610993565b3480156102a357600080fd5b506102ac610be1565b6040516101919190612900565b3480156102c557600080fd5b506101f26102d43660046129c6565b6001600160a01b031660009081526006602052604090205490565b3480156102fb57600080fd5b506101df61030a3660046129ea565b610d2e565b34801561031b57600080fd5b506000546040516001600160a01b039091168152602001610191565b34801561034357600080fd5b50610184610edd565b34801561035857600080fd5b506101ba61036736600461287a565b610eec565b34801561037857600080fd5b506101df610387366004612a0c565b610ef9565b34801561039857600080fd5b506101df6103a73660046129c6565b61110d565b6101df6103ba366004612a9c565b61125b565b3480156103cb57600080fd5b506101f26103da366004612ade565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b34801561041157600080fd5b506101df6104203660046129c6565b61190c565b60606017805461043490612b17565b80601f016020809104026020016040519081016040528092919081815260200182805461046090612b17565b80156104ad5780601f10610482576101008083540402835291602001916104ad565b820191906000526020600020905b81548152906001019060200180831161049057829003601f168201915b5050505050905090565b60006104c43384846119d8565b5060015b92915050565b6000546001600160a01b031633146105115760405162461bcd60e51b81526020600482015260016024820152606f60f81b60448201526064015b60405180910390fd5b602054600160c01b900460ff161580156105355750602054600160c81b900460ff16155b801561054a5750602054600160a01b900460ff165b61057a5760405162461bcd60e51b81526020600482015260016024820152606160f81b6044820152606401610508565b6020805460ff60c01b1916600160c01b1790556040517fc43e780723fe0e2a85c0bd4291955d83cac42c6036fd8bf58b10463d3f9f1ae890600090a16020546040516370a0823160e01b81523060048201526001600160a01b039091169063a9059cbb9061dead9083906370a0823190602401602060405180830381865afa15801561060a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062e9190612b51565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610679573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069d9190612b6a565b6106ce5760405162461bcd60e51b8152602060048201526002602482015261379960f11b6044820152606401610508565b565b6000546001600160a01b0316331480156106ec57506000602254115b80156106f85750600081115b6107285760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b806022600082825461073a9190612b9d565b9091555050602254606410156107775760405162461bcd60e51b81526020600482015260026024820152616f7360f01b6044820152606401610508565b7fcc5d343fa3728e63489d08b6f42d710f12e9126dec83f9b9a9fa74b7e54d22416022546040516107aa91815260200190565b60405180910390a150565b6001600160a01b038316600090815260076020908152604080832033845290915281205482111561080d5760405162461bcd60e51b8152602060048201526002602482015261323560f01b6044820152606401610508565b6001600160a01b038416600090815260076020908152604080832033808552925290912054610848918691610843908690612bb0565b6119d8565b610853848484611a5f565b5060019392505050565b6000546001600160a01b0316331461089b5760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b602054600160c81b900460ff161580156108bf5750602054600160c01b900460ff16155b80156108d45750602054600160a01b900460ff165b6109045760405162461bcd60e51b81526020600482015260016024820152606160f81b6044820152606401610508565b42602154620151806109169190612bc3565b6014546109239190612b9d565b101561094957620151806014544261093b9190612bb0565b6109459190612bda565b6021555b806021600082825461095b9190612b9d565b90915550506021546040519081527fa7b24c66dd3269a292a60b3facdbb8f3e7557d1e19e64d99e0d6ee7250be63ad906020016107aa565b6000546001600160a01b031633146109d15760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b602054600160c81b900460ff161580156109f55750602054600160c01b900460ff16155b8015610a0a5750602054600160a01b900460ff165b610a3a5760405162461bcd60e51b81526020600482015260016024820152606160f81b6044820152606401610508565b42602154603c610a4a9190612bc3565b610a5590603c612bc3565b610a60906018612bc3565b601454610a6d9190612b9d565b10156106ce5760208054600160c81b7fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff8216179091556040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0d9190612b51565b6040519091507faf0fe1663cb7e005c807c426024d6b7bedd6fea7b9df02852418932d71cd78bd90600090a160205460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303816000875af1158015610b8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bae9190612b6a565b610bde5760405162461bcd60e51b81526020600482015260016024820152603160f91b6044820152606401610508565b50565b610c7b604051806101c0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000151581526020016000815260200160001515815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b604080516101c081018252602080546001600160a01b03168252600a5490820152600e5491810191909152601154606082015260808101610cba611fca565b81526020805460ff600160c01b820481161515928401929092526014546040840152600160b01b900416151560608201526023546001600160a01b03908116608083015260225460a0830152601e5460c0830152601d5460e0830152601f5416610100820152600061012090910152919050565b6000546001600160a01b031633148015610d515750602054600160b01b900460ff165b610d815760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b601d5461271083601654610d959190612bc3565b610d9f9190612bda565b10158015610daf57506127108211155b610ddf5760405162461bcd60e51b81526020600482015260016024820152606160f81b6044820152606401610508565b601e5461271082601654610df39190612bc3565b610dfd9190612bda565b10158015610e0d57506127108111155b610e3d5760405162461bcd60e51b81526020600482015260016024820152603160f91b6044820152606401610508565b61271082601654610e4e9190612bc3565b610e589190612bda565b601d5560165461271090610e6d908390612bc3565b610e779190612bda565b601e5561271082148015610e8c575080612710145b15610e9f576020805460ff60b01b191690555b60408051838152602081018390527f3e470cf1ec3767d0209f5128c840997ff9b70dfe0da263b3f94eb114a05d932791015b60405180910390a15050565b60606018805461043490612b17565b60006104c4338484611a5f565b6000546001600160a01b03163314610f375760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b602254158015610f475750600082115b8015610f54575060648211155b610f845760405162461bcd60e51b81526020600482015260016024820152607960f81b6044820152606401610508565b6202a300816020015110158015610fa15750620d2f008160200151105b610fd15760405162461bcd60e51b81526020600482015260016024820152603d60f91b6044820152606401610508565b60228290553381526040516000908290610fea90612809565b81516001600160a01b0316815260209182015191810191909152604001604051809103906000f080158015611023573d6000803e3d6000fd5b506001600160a01b03811660008181526004602090815260408083208054600160ff199182168117909255600584529382902080549094161790925560225482519384523391840191909152908201529091507fc718bf738f6d7cb0af735b17552ef9e5f1857d1719d7f882b8780ea2f08b3e7f9060600160405180910390a16040805183516001600160a01b03168152602080850151908201527f8bdc63644658897d37c2cff731dd7a8898394f85b3c9d9b4b7879390385d4c26910160405180910390a1602380546001600160a01b0319166001600160a01b03929092169190911790555050565b6020546001600160a01b039081169082160361112857600080fd5b306001600160a01b0382160361113d57600080fd5b6008546040516370a0823160e01b81523060048201526001600160a01b038381169263a9059cbb9291169083906370a0823190602401602060405180830381865afa158015611190573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b49190612b51565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156111ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112239190612b6a565b6112535760405162461bcd60e51b81526020600482015260016024820152603960f91b6044820152606401610508565b610bde61202a565b6000546001600160a01b031633146112995760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b602054600160a01b900460ff16156112d75760405162461bcd60e51b81526020600482015260016024820152603160f81b6044820152606401610508565b60015447101561130d5760405162461bcd60e51b81526020600482015260016024820152601960f91b6044820152606401610508565b8161132057600e83101561132057600080fd5b602080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790819055601e54601d549091600160b01b900460ff1680151560010361138557601654601e819055601d556020805460ff60b01b191690555b3060008181526004602090815260408083208054600160ff19918216811790925584546001600160a01b03908116865283862080548316841790557f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd80548316841790558686526005909452828520805482168317905584549093168452908320805483168217905561dead9092527f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba80549091169091179055851561146057506020805460ff60c01b1916600160c01b1790556000611473565b60218790556020805460ff60c01b191690555b30600090815260066020526040908190205442601455600954915163a992664760e01b81526001600160a01b0388811660048301529192919091169063a992664790602401602060405180830381865afa1580156114d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f99190612b6a565b61150257600080fd5b601f80546001600160a01b0319166001600160a01b03888116918217835560165430600090815260076020908152604080832095835294815290849020919091559254825163c45a015560e01b8152925191169263c45a015592600480820193918290030181865afa15801561157c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a09190612bfc565b6001600160a01b031663c9c6539630601f60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611602573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116269190612bfc565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611673573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116979190612bfc565b602080546001600160a01b0319166001600160a01b039283169081178255600090815260058083526040808320805460ff199081166001908117909255855487168552600486528285208054821683179055601f80548816865283862080548316841790558054881686529386529382902080549094161790925582546021549154835191861682524794820194909452918201528915156060820152911660808201527f0157a1a09a393e0b2567e699c9fafaa987dd8440f4b66795e9667d8749d7239e9060a00160405180910390a1602054601f5460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af11580156117be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e29190612b6a565b6118125760405162461bcd60e51b81526020600482015260016024820152603360f81b6044820152606401610508565b601f546001600160a01b031663f305d7194730846000808861183542603c612b9d565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af11580156118a2573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906118c79190612c19565b50506025805460ff191660019081179091558415159003905061190257601e859055601d8490556020805460ff60b01b1916600160b01b1790555b5050505050505050565b6000546001600160a01b0316331461194a5760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392831690811782558152600460209081526040808320805460ff1990811660019081179092558454909516845260059092529091208054909216179055565b6001600160a01b0383166119eb57600080fd5b6001600160a01b0382166119fe57600080fd5b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831615801590611a7f57506001600160a01b03821615155b611a8857600080fd5b6001600160a01b038316600090815260066020526040902054811115611ad55760405162461bcd60e51b81526020600482015260026024820152611b1b60f11b6044820152606401610508565b602054600090600160a01b900460ff168015611afa5750602054600160b01b900460ff165b8015611b1f57506001600160a01b03841660009081526004602052604090205460ff16155b8015611b4457506001600160a01b03831660009081526004602052604090205460ff16155b15611b805781601e541015611b805760405162461bcd60e51b8152602060048201526002602482015261033360f41b6044820152606401610508565b602054600160a01b900460ff168015611ba25750602054600160b01b900460ff165b8015611bc757506001600160a01b03831660009081526005602052604090205460ff16155b15611c2657601d546001600160a01b038416600090815260066020526040902054611bf3908490612b9d565b1115611c265760405162461bcd60e51b8152602060048201526002602482015261333160f01b6044820152606401610508565b6000546001600160a01b03858116911614801590611c5257506000546001600160a01b03848116911614155b8015611c65575060255460ff1615156001145b15611d28576020546001600160a01b038581169116148015611c955750601f546001600160a01b03848116911614155b15611cd657600a8054906000611caa83612c47565b9190505550611cb960016120f2565b6064600e5483611cc99190612bc3565b611cd39190612bda565b90505b6020546001600160a01b038481169116148015611cfc57506001600160a01b0384163014155b15611d2857611d0b60006120f2565b606460115483611d1b9190612bc3565b611d259190612bda565b90505b30600090815260066020526040812054602054909150600090600160a81b900460ff16158015611d6557506020546001600160a01b038681169116145b8015611d7a57506001600160a01b0386163014155b8015611d865750600082115b8015611d955750601a54600a54115b15611e1357601b54821180611dd057506201518060145442611db79190612bb0565b118015611dc45750601054155b8015611dd05750601354155b15611e1357601954431115611e1357601c54821015611df757611df2826122f4565b611e02565b611e02601c546122f4565b611e0b476124b3565b504360195560015b8215611e8e5730600090815260066020526040902054611e34908490612b9d565b30600081815260066020526040908190209290925590516001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611e859087815260200190565b60405180910390a35b6001600160a01b038616600090815260066020526040902054611eb2908590612bb0565b6001600160a01b0380881660009081526006602052604080822093909355908716815220548390611ee4908690612b9d565b611eee9190612bb0565b6001600160a01b0380871660008181526006602052604090209290925587167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611f388688612bb0565b60405190815260200160405180910390a38015611fc2576000611f84600860009054906101000a90046001600160a01b0316620186a047604051806020016040528060008152506127ef565b90508015611fc0576040514781527f2488b4123934dca0dca56f8f7005a71c0a52e2c9158fe31ac31869efe776d6eb9060200160405180910390a15b505b505050505050565b602054600090600160a01b900460ff16611fe45750600090565b60006201518060145442611ff89190612bb0565b6120029190612bda565b905060215481111561201657600091505090565b806021546120249190612bb0565b91505090565b602054600160a81b900460ff1615801561204d5750602054600160a01b900460ff165b156106ce57478015610bde57612062816124b3565b6008546040516000916001600160a01b03169047908381818185875af1925050503d80600081146120af576040519150601f19603f3d011682016040523d82523d6000602084013e6120b4565b606091505b5050905080156120ee576040514781527f2488b4123934dca0dca56f8f7005a71c0a52e2c9158fe31ac31869efe776d6eb90602001610ed1565b5050565b6000806000831561211157600f5492506010549150600e549050612121565b6012549250601354915060115490505b8181146122ee57600b546000036121ce57600c546014546121429190612b9d565b421061214f5750806122d8565b6002600c5461215e9190612bda565b60145461216b9190612b9d565b421061219857600461217d8385612bb0565b6121879190612bda565b6121919083612b9d565b90506122d8565b6004600c546121a79190612bda565b6014546121b49190612b9d565b42106121c657600261217d8385612bb0565b50815b6122d8565b600b5460010361220a57600d54600a5411156121eb5750806121ee565b50815b6014546121fd90611c20612b9d565b42106121c95750806122d8565b600b546002036122d557600d54600a5411806122355750600c546014546122319190612b9d565b4210155b156122415750806122d8565b6002600d546122509190612bda565b600a54118061227a57506002600c546122699190612bda565b6014546122769190612b9d565b4210155b1561228b57600461217d8385612bb0565b6004600d5461229a9190612bda565b600a5411806122c457506004600c546122b39190612bda565b6014546122c09190612b9d565b4210155b156121c657600261217d8385612bb0565b50805b83156122e857600e8190556122ee565b60118190555b50505050565b6020805460ff60a81b1916600160a81b1781556040805160028082526060820183526000939192909183019080368337019050509050308160008151811061233e5761233e612c60565b6001600160a01b03928316602091820292909201810191909152601f54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612397573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123bb9190612bfc565b816001815181106123ce576123ce612c60565b6001600160a01b03909216602092830291909101909101526027541561241f5760c8602754836123fe9190612bc3565b6124089190612bda565b60268190556124179083612bb0565b602481905591505b601f546124379030906001600160a01b0316846119d8565b601f5460405163791ac94760e01b81526001600160a01b039091169063791ac94790612470908590600090869030904290600401612c76565b600060405180830381600087803b15801561248a57600080fd5b505af115801561249e573d6000803e3d6000fd5b50506020805460ff60a81b1916905550505050565b600080600080602060179054906101000a900460ff161515600115151480156124eb57506276a700601454426124e99190612bb0565b105b156125cc5760646124fd86600a612bc3565b6125079190612bda565b93507f27becf433f6eafb15520b27cdc27123fc4bb3ab578777db9f713bd54da1611a68460405161253a91815260200190565b60405180910390a16009546040516000916001600160a01b03169086908381818185875af1925050503d806000811461258f576040519150601f19603f3d011682016040523d82523d6000602084013e612594565b606091505b50509050806125ca5760405162461bcd60e51b8152602060048201526002602482015261393960f01b6044820152606401610508565b505b60006027541180156125e057506000602654115b156126e657602454856026546125f69190612bc3565b6126009190612bda565b60268054600091829055602491909155601f54919450915061262d9030906001600160a01b0316836119d8565b601f546001600160a01b031663f305d7198430846000808361265042603c612b9d565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af11580156126bd573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126e29190612c19565b5050505b6023546001600160a01b0316156127e857602254606490846127088789612bb0565b6127129190612bb0565b61271c9190612bc3565b6127269190612bda565b6023546040519193506000916001600160a01b039091169084908381818185875af1925050503d8060008114612778576040519150601f19603f3d011682016040523d82523d6000602084013e61277d565b606091505b50509050806127b35760405162461bcd60e51b8152602060048201526002602482015261733960f01b6044820152606401610508565b6040518381527f3392b75a0721e4605be82daf22af3b927da9086deccc7dbb947b37bf895d3deb9060200160405180910390a1505b5050505050565b600080600080845160208601878a8af19695505050505050565b61116780612cea83390190565b60006020808352835180602085015260005b8181101561284457858101830151858201604001528201612828565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610bde57600080fd5b6000806040838503121561288d57600080fd5b823561289881612865565b946020939093013593505050565b6000602082840312156128b857600080fd5b5035919050565b6000806000606084860312156128d457600080fd5b83356128df81612865565b925060208401356128ef81612865565b929592945050506040919091013590565b81516001600160a01b031681526101c081016020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015161294d60a084018215159052565b5060c083015160c083015260e083015161296b60e084018215159052565b50610100838101516001600160a01b0390811691840191909152610120808501519084015261014080850151908401526101608085015190840152610180808501518216908401526101a09384015116929091019190915290565b6000602082840312156129d857600080fd5b81356129e381612865565b9392505050565b600080604083850312156129fd57600080fd5b50508035926020909101359150565b6000808284036060811215612a2057600080fd5b833592506040601f1982011215612a3657600080fd5b506040516040810181811067ffffffffffffffff82111715612a6857634e487b7160e01b600052604160045260246000fd5b6040526020840135612a7981612865565b81526040939093013560208401525092909150565b8015158114610bde57600080fd5b600080600060608486031215612ab157600080fd5b833592506020840135612ac381612a8e565b91506040840135612ad381612865565b809150509250925092565b60008060408385031215612af157600080fd5b8235612afc81612865565b91506020830135612b0c81612865565b809150509250929050565b600181811c90821680612b2b57607f821691505b602082108103612b4b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215612b6357600080fd5b5051919050565b600060208284031215612b7c57600080fd5b81516129e381612a8e565b634e487b7160e01b600052601160045260246000fd5b808201808211156104c8576104c8612b87565b818103818111156104c8576104c8612b87565b80820281158282048414176104c8576104c8612b87565b600082612bf757634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215612c0e57600080fd5b81516129e381612865565b600080600060608486031215612c2e57600080fd5b8351925060208401519150604084015190509250925092565b600060018201612c5957612c59612b87565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600060a08201878352602087602085015260a0604085015281875180845260c08601915060208901935060005b81811015612cc85784516001600160a01b031683529383019391830191600101612ca3565b50506001600160a01b0396909616606085015250505060800152939250505056fe608060405234801561001057600080fd5b5060405161116738038061116783398101604081905261002f91610086565b80516001600160a01b031661004357600080fd5b8051600180546001600160a01b039092166001600160a01b0319928316179055670de0b6b3a76400006002556000805490911633179055602001516004556100f7565b60006040828403121561009857600080fd5b604080519081016001600160401b03811182821017156100c857634e487b7160e01b600052604160045260246000fd5b60405282516001600160a01b03811681146100e257600080fd5b81526020928301519281019290925250919050565b611061806101066000396000f3fe60806040526004361061009a5760003560e01c80638da5cb5b11610069578063cc3d967b1161004e578063cc3d967b1461027b578063ccec3716146102e7578063f2fde38b1461030757600080fd5b80638da5cb5b1461022e578063a694fc3a1461025b57600080fd5b80632e17de78146101cd578063372500ab146101ef5780633ccfd60b146102045780634f91440d1461021957600080fd5b366101c85734806100d65760405162461bcd60e51b81526020600482015260016024820152603960f91b60448201526064015b60405180910390fd5b33600090815260086020526040812080548392906100f5908490610f42565b90915550506007805482919060009061010f908490610f42565b909155505060035460000361013e5780600060050160008282546101339190610f42565b909155506101829050565b6003546002546005546101519084610f42565b61015b9190610f5b565b6101659190610f72565b60068054600090610177908490610f42565b909155505060006005555b60065460405133917f731185b941ee4773f1c8f1cf0c22be2c6b4eaeb0075fbb4c524ac1f80ad391f3916101be91858252602082015260400190565b60405180910390a2005b600080fd5b3480156101d957600080fd5b506101ed6101e8366004610f94565b610327565b005b3480156101fb57600080fd5b506101ed6104ca565b34801561021057600080fd5b506101ed6106c0565b34801561022557600080fd5b506101ed610845565b34801561023a57600080fd5b506001546040516001600160a01b0390911681526020015b60405180910390f35b34801561026757600080fd5b506101ed610276366004610f94565b6109c2565b34801561028757600080fd5b5061029b610296366004610fad565b610c17565b6040516102529190600060c082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015292915050565b3480156102f357600080fd5b506101ed610302366004610fad565b610da1565b34801561031357600080fd5b506101ed610322366004610fad565b610edb565b6000811180156103465750336000908152600a60205260409020548111155b6103765760405162461bcd60e51b81526020600482015260016024820152603360f81b60448201526064016100cd565b33600090815260096020908152604080832054600254600654600a9094529184205490926103a391610f5b565b6103ad9190610f72565b6103b79190610fdd565b336000908152600a60205260408120805492935084929091906103db908490610fdd565b9091555050336000908152600d60209081526040808320429055600e9091528120805484929061040c908490610f42565b9091555050600254600654336000908152600a60205260409020546104319190610f5b565b61043b9190610f72565b3360009081526009602052604081209190915560038054849290610460908490610fdd565b9091555050801561049057336000908152600c60205260408120805483929061048a908490610f42565b90915550505b60405182815233907f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd906020015b60405180910390a25050565b33600090815260096020908152604080832054600254600654600a909452919093205490916104f891610f5b565b6105029190610f72565b61050c9190610fdd565b336000908152600c60205260408120805490919061052b908490610f42565b9091555050336000908152600c6020526040902054806105715760405162461bcd60e51b81526020600482015260016024820152600760fb1b60448201526064016100cd565b600254600654336000908152600a60205260409020546105919190610f5b565b61059b9190610f72565b336000908152600960205260408120919091554782106105bb57476105bd565b815b336000908152600c60205260408120805492935083929091906105e1908490610fdd565b9091555050336000908152600b602052604081208054839290610605908490610f42565b909155505060405181815233907f1f89f96333d3133000ee447473151fa9606543368f02271c9d95ae14f13bcc679060200160405180910390a2604051600090339083908381818185875af1925050503d8060008114610681576040519150601f19603f3d011682016040523d82523d6000602084013e610686565b606091505b50509050806106bb5760405162461bcd60e51b81526020600482015260016024820152603960f81b60448201526064016100cd565b505050565b336000908152600e6020526040902054806107015760405162461bcd60e51b81526020600482015260016024820152603560f81b60448201526064016100cd565b600454336000908152600d602052604090205461071e9190610f42565b4210156107515760405162461bcd60e51b81526020600482015260016024820152601b60f91b60448201526064016100cd565b336000818152600e602052604080822091909155517f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906107959084815260200190565b60405180910390a260005460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303816000875af11580156107ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108129190610ff0565b6108425760405162461bcd60e51b81526020600482015260016024820152603760f81b60448201526064016100cd565b50565b336000908152600e6020526040812054806108865760405162461bcd60e51b81526020600482015260016024820152600d60fa1b60448201526064016100cd565b336000908152600a6020526040902054156108e05733600090815260096020908152604080832054600254600654600a909452919093205490916108c991610f5b565b6108d39190610f72565b6108dd9190610fdd565b91505b336000908152600e60209081526040808320839055600a9091528120805483929061090c908490610f42565b9091555050600254600654336000908152600a60205260409020546109319190610f5b565b61093b9190610f72565b3360009081526009602052604081209190915560038054839290610960908490610f42565b9091555050811561099057336000908152600c60205260408120805484929061098a908490610f42565b90915550505b60405181815233907febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a906020016104be565b60008082116109d057600080fd5b336000908152600a602052604090205415610a2a5733600090815260096020908152604080832054600254600654600a90945291909320549091610a1391610f5b565b610a1d9190610f72565b610a279190610fdd565b90505b336000908152600e6020526040902054828110610a6b57336000908152600e602052604081208054859290610a60908490610fdd565b90915550610b3a9050565b6000610a778285610fdd565b336000818152600e6020526040808220829055905490516323b872dd60e01b81526004810192909252306024830152604482018390529192506001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015610ae4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b089190610ff0565b610b385760405162461bcd60e51b81526020600482015260016024820152601960f91b60448201526064016100cd565b505b336000908152600a602052604081208054859290610b59908490610f42565b9091555050600254600654336000908152600a6020526040902054610b7e9190610f5b565b610b889190610f72565b3360009081526009602052604081209190915560038054859290610bad908490610f42565b90915550508115610bdd57336000908152600c602052604081208054849290610bd7908490610f42565b90915550505b60405183815233907febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a9060200160405180910390a2505050565b610c506040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b038216600090815260096020908152604080832054600254600654600a909452918420548493849391610c8a9190610f5b565b610c949190610f72565b6001600160a01b0387166000908152600c6020526040902054610cb79190610f42565b610cc19190610fdd565b6004546001600160a01b0387166000908152600d6020526040902054919250610ce991610f42565b4210610d0f576001600160a01b0385166000908152600e60205260409020549250610d42565b6004546001600160a01b0386166000908152600d6020526040902054610d359042610fdd565b610d3f9190610f42565b91505b6040805160c0810182529182526020808301949094526001600160a01b039095166000818152600e855286812054838801528181526008855286812054606084015260808301939093528252600a909252929092205460a08301525090565b6001546040516370a0823160e01b81523060048201526000916001600160a01b038481169263a9059cbb92919091169083906370a0823190602401602060405180830381865afa158015610df9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1d9190611012565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610e80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea49190610ff0565b905080610ed75760405162461bcd60e51b81526020600482015260016024820152603160f81b60448201526064016100cd565b5050565b6001546001600160a01b03163314610ef257600080fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b634e487b7160e01b600052601160045260246000fd5b80820180821115610f5557610f55610f2c565b92915050565b8082028115828204841417610f5557610f55610f2c565b600082610f8f57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215610fa657600080fd5b5035919050565b600060208284031215610fbf57600080fd5b81356001600160a01b0381168114610fd657600080fd5b9392505050565b81810381811115610f5557610f55610f2c565b60006020828403121561100257600080fd5b81518015158114610fd657600080fd5b60006020828403121561102457600080fd5b505191905056fea26469706673582212201be65b40cb7776d62b638c878f0e41b37b004cbd039f7d54b20da61e3c9965eb64736f6c63430008190033a264697066735822122046423ee4c935bdced56258cde1f3d1fb2bf342aa964757dcbe6d6e2f64a4fcdf64736f6c63430008190033

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

000000000000000000000000000000000000000000000000000000000000002000000000000000000000000064029afab65a7a2f00ca908d2e866d3d0b6c1e5e00000000000000000000000064029afab65a7a2f00ca908d2e866d3d0b6c1e5e0000000000000000000000004f0fd563be89ec8c3e7d595bf3639128c0a7c33a000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000204fce5e3e2502611000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000e1000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000052b7d2dcc80cd2e4000000000000000000000000000000000000000000000000084595161401484a00000000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004546563680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045445434800000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : params (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]

-----Encoded View---------------
26 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 00000000000000000000000064029afab65a7a2f00ca908d2e866d3d0b6c1e5e
Arg [2] : 00000000000000000000000064029afab65a7a2f00ca908d2e866d3d0b6c1e5e
Arg [3] : 0000000000000000000000004f0fd563be89ec8c3e7d595bf3639128c0a7c33a
Arg [4] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [5] : 0000000000000000000000000000000000000000204fce5e3e25026110000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000e10
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000028
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [17] : 00000000000000000000000000000000000000000052b7d2dcc80cd2e4000000
Arg [18] : 000000000000000000000000000000000000000000084595161401484a000000
Arg [19] : 00000000000000000000000000000000000000000000000000000000000002a0
Arg [20] : 00000000000000000000000000000000000000000000000000000000000002e0
Arg [21] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [22] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [23] : 5465636800000000000000000000000000000000000000000000000000000000
Arg [24] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [25] : 5445434800000000000000000000000000000000000000000000000000000000


[ 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.