BNB Price: $620.67 (+3.48%)
 

Overview

Max Total Supply

10,000GCOW

Holders

9,799

Market

Price

$0.00 @ 0.000000 BNB

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.003824689172445602 GCOW

Value
$0.00
0x92b57d08a523434cc7b487d406ab363c1a0a7fc3
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
Token

Compiler Version
v0.8.27+commit.40a35a09

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
File 1 of 5 : GCOW.sol
// SPDX-License-Identifier: MIT
pragma solidity =0.8.27;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "./Interface.sol";

contract TokenDistributor {
    constructor(address token) {
        // Approve the maximum possible amount to the deployer for distribution operations
        TransferHelper.safeApprove(token, msg.sender, type(uint256).max);
    }
}

interface IPool {
    function processLotteryEntry(address user, uint256 amount) external;
    function batchProcessLotteryResultsWhenBurn() external;
    function batchProcessLotteryResultsWhenTrade() external;
    function paused() external view returns (bool);
}

contract Token is IERC20, Ownable {
    string private _name;
    string private _symbol;
    uint256 private _decimals;
    uint256 private _totalSupply;

    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;

    mapping(address => bool) public isExcludedFromFee;
    mapping(address => bool) public isLiquidityPair;
    mapping(address => bool) public isSwapRouter;

    uint256 private constant MAX = type(uint256).max;
    address public constant DEAD_ADDRESS = 0x000000000000000000000000000000000000dEaD;
    address public constant ZERO_ADDRESS = 0x0000000000000000000000000000000000000000;

    address public immutable cowTokenAddress;
    address public immutable usdtAddress;
    address public immutable currencyAddr;

    uint256 public transferFee;
    uint256 public buyRewardFee;
    uint256 public sellRewardFee;

    uint256 public startTradeTimestamp;
    address public immutable mainPairAddr;
    
    // uint256 public addLiquidityFee;
    uint256 public immutable removeLiquidityFee;
    address public immutable wethAddress;
    uint256 public startLPTimestamp;
    uint256 public immutable maxAmountToJoinLottery;

    uint256 public minValue2AddLp2GetDividendValue;

    uint256 public gasForProcessing;

    bool public constant strictCheck = true;

    bool private inSwap;

    TokenDistributor public tokenDistributor;
    ISwapRouter public immutable swapRouter;
    uint256 public immutable removeLpBurnInterval;

    IDividendTracker public dividendTracker;
    struct UserInfo {
        uint256 preLpAmount;
        uint256 lpAmount;
    }
    mapping(address => UserInfo) public _userInfo;
    IPool public pool;

    modifier onlyPool() {
        require(msg.sender == address(pool), "Only pool can call this function");
        _;
    }

    mapping(address => address) public _inviter;
    mapping(address => address[]) public _binders;
    mapping(address => mapping(address => bool)) public _pendingBind;

    uint256[] public invitorRewardPercentList = [50, 30, 20];

    event FailedSwap(uint256 value);

    event ProcessedDividendTracker(uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic, uint256 gas, address indexed processor);

    event UserLpAmountChangedWhenAddLp(
        address user,
        uint256 beforePreLpAmount,
        uint256 beforeLpAmount,
        uint256 preLpAmount,
        uint256 lpAmount
    );
    event UserLpAmountChangedWhenRemoveLp(
        address user,
        uint256 preLpAmount,
        uint256 lpAmount
    );
    
    event cantBindCa(address caAddr);
    event bindSuccessful(
        address indexed i,
        address indexed u,
        uint256 timestamp
    );

    event pendingBind(
        address indexed s,
        address indexed x,
        uint256 timestamp
    );

    event NotEnough2AddLp2GetDividendValue(address indexed user, uint256 addLpTokenValue, uint256 minValue2AddLp2GetDividendValue);

    constructor() Ownable(msg.sender) {
        _name       = "GameCow";
        _symbol     = "GCOW";
        _decimals   = 18;
        _totalSupply = 10_000 * 10 ** 18;

        buyRewardFee = 200;
        sellRewardFee = 200;

        require(block.chainid == 56 || block.chainid == 97, "chain id not supported");
        usdtAddress             = block.chainid == 56 ? 0x55d398326f99059fF775485246999027B3197955 : 0xaB1a4d4f1D656d2450692D237fdD6C7f9146e814;
        cowTokenAddress         = block.chainid == 56 ? 0x7aAAA5B10f97321345ACd76945083141bE1C5631 : 0x7E4388f5868aB7E02BC5e5772688f76c6E462161;
        address swapRouterAddr  = block.chainid == 56 ? 0x10ED43C718714eb63d5aA57B78B54704E256024E : 0xD99D1c33F9fC3444f8101754aBC46c52416550D1;
        currencyAddr            = cowTokenAddress;

        address receiveAddr     = address(0x50f8f9b66859d0Dd0de4a05aB22dd7d0c0865A1D);

        require(currencyAddr < address(this),"currency address cannot be greater than token address");

        swapRouter = ISwapRouter(swapRouterAddr);
        isSwapRouter[swapRouterAddr] = true;

        address swapPair = ISwapFactory(swapRouter.factory()).createPair(address(this), currencyAddr);
        mainPairAddr = swapPair;
        isLiquidityPair[swapPair] = true;

        _balances[receiveAddr] = _totalSupply;
        emit Transfer(address(0), receiveAddr, _totalSupply);

        isExcludedFromFee[receiveAddr] = true;
        isExcludedFromFee[address(this)] = true;
        isExcludedFromFee[owner()] = true;
        isExcludedFromFee[DEAD_ADDRESS] = true;

        tokenDistributor = new TokenDistributor(currencyAddr);

        _approve(address(this), address(swapRouterAddr), MAX);
        TransferHelper.safeApprove(address(currencyAddr), address(swapRouterAddr), MAX);

        wethAddress = swapRouter.WETH();

        // user add lp after launch still burn
        removeLiquidityFee = 10000;

        // enough long to remove prelp burn
        removeLpBurnInterval = 99999999 days;

        // 10 usdt to get dividend
        minValue2AddLp2GetDividendValue = 10 * 10 ** 18;
        
        // transfer 3%
        transferFee = 300;

        // 1 token
        maxAmountToJoinLottery = 1 ether;
    }

    function initDividendTracker(address _dividendTrackerAddress) public onlyOwner {
        require(address(dividendTracker) == address(0), "dividendTracker already initialized");
        dividendTracker = IDividendTracker(_dividendTrackerAddress);
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(ZERO_ADDRESS);
        dividendTracker.excludeFromDividends(DEAD_ADDRESS);
        dividendTracker.excludeFromDividends(address(swapRouter));
        dividendTracker.excludeFromDividends(mainPairAddr);
        gasForProcessing = 500_000;
    }

    function handleWinner(address winner, uint256 sendAmount) external onlyPool returns(uint256, uint256, uint256){
        uint256 realAmount = sendAmount;
        if (realAmount * 2 > balanceOf(DEAD_ADDRESS)) {
            // not enough token
            return (0, 0, 0);
        }
        uint256 toWinnerAmount = realAmount * 196 / 100;
        uint256 toLpRewardAmount = realAmount * 2 / 100;
        uint256 toInviterAmount = realAmount * 1 / 100;

        // cost + profit
        _basicTransfer(DEAD_ADDRESS, address(winner), toWinnerAmount);
        

        if (address(dividendTracker) != address(0) && dividendTracker.totalSupply() > 0) {
            _basicTransfer(DEAD_ADDRESS, address(dividendTracker), toLpRewardAmount);
            dividendTracker.distributeDividends(toLpRewardAmount);
        }else{
            // This makes it easy to check the quantity; otherwise
            // it's impossible to determine whether dividends have been successfully allocated.
            _basicTransfer(DEAD_ADDRESS, DEAD_ADDRESS, toLpRewardAmount);
        }

        uint256 inviterAmount;
        uint256 totalShare = getInvitorTotalShare();
        address current = winner;
        uint256 perInviteAmount = toInviterAmount;
        if (totalShare > 0){
            for (uint256 i; i < invitorRewardPercentList.length; ++i) {
                address __inviter = _inviter[current];

                if (address(0) == __inviter) {
                    __inviter = DEAD_ADDRESS;
                }

                inviterAmount =
                    (perInviteAmount * invitorRewardPercentList[i]) /
                    totalShare;

                _basicTransfer(DEAD_ADDRESS, __inviter, inviterAmount);
                current = __inviter;
            }
        }

        return (realAmount, toWinnerAmount, toLpRewardAmount);

    }

    /**
     * @notice Returns the token symbol
     * @return The symbol of the token
     */
    function symbol() external view returns (string memory) {
        return _symbol;
    }

    /**
     * @notice Returns the token name
     * @return The name of the token
     */
    function name() external view returns (string memory) {
        return _name;
    }

    /**
     * @notice Returns the token decimals
     * @return The number of decimals used by the token
     */
    function decimals() external view returns (uint8) {
        return uint8(_decimals);
    }

    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    function transfer(
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    function allowance(
        address owner,
        address spender
    ) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(
        address spender,
        uint256 amount
    ) public override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        _transfer(sender, recipient, amount);
        if (_allowances[sender][msg.sender] != MAX) {
            _allowances[sender][msg.sender] =
                _allowances[sender][msg.sender] -
                amount;
        }
        return true;
    }

    function _approve(address owner, address spender, uint256 amount) private {
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _basicTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (bool) {
        _balances[sender] -= amount;
        _balances[recipient] += amount;
        emit Transfer(sender, recipient, amount);
        return true;
    }

    function getTokenUsdtValue(uint256 tokenAmount) public view returns(uint256) {
        address[] memory path = new address[](4);
        path[0] = address(this);
        path[1] = currencyAddr;
        path[2] = wethAddress;
        path[3] = usdtAddress;
        try swapRouter.getAmountsOut(tokenAmount, path) returns (uint256[] memory amountsOut) {
            return amountsOut[3];
        } catch {
            return 0;
        }
    }
    

    function addOrRemove(
        address from,
        address to,
        uint256 amount
    )
        internal
        view
        returns (uint256 addLPLiquidity, uint256 removeLPLiquidity)
    {
        if (isLiquidityPair[to] && isSwapRouter[msg.sender] && from == tx.origin) {
            uint256 addAmount = amount;
            addLPLiquidity = _isAddLiquidity(to, addAmount);
        }

        if (isLiquidityPair[from]) {
            removeLPLiquidity = _isRemoveLiquidity(from, amount);
        }
    }

    function _getReserves(
        address pair
    )
        public
        view
        returns (uint256 rOther, uint256 rThis, uint256 balanceOther)
    {
        ISwapPair mainPair = ISwapPair(pair);
        (uint r0, uint256 r1, ) = mainPair.getReserves();

        address tokenOther = mainPair.token0() == address(this)
            ? mainPair.token1()
            : mainPair.token0();
        if (tokenOther < address(this)) {
            rOther = r0;
            rThis = r1;
        } else {
            rOther = r1;
            rThis = r0;
        }

        balanceOther = IERC20(tokenOther).balanceOf(pair);
    }

    function _isAddLiquidity(
        address pair,
        uint256 amount
    ) private view returns (uint256 liquidity) {
        (uint256 rOther, uint256 rThis, uint256 balanceOther) = _getReserves(
            pair
        );
        uint256 amountOther;
        if (rOther > 0 && rThis > 0) {
            amountOther = (amount * rOther) / rThis;
        }
        // isAddLP
        // cow transfer 2% fee, avoid judgment errors caused by loss of precision
        if ((balanceOther * 100 / 98) + 3  >= rOther + amountOther) {
            (liquidity, ) = calLiquidity(
                pair,
                balanceOther,
                amount,
                rOther,
                rThis
            );
        }

    }

    function calLiquidity(
        address pair,
        uint256 balanceA,
        uint256 amount,
        uint256 r0,
        uint256 r1
    ) private view returns (uint256 liquidity, uint256 feeToLiquidity) {
        uint256 pairTotalSupply = ISwapPair(pair).totalSupply();
        address feeTo = ISwapFactory(swapRouter.factory()).feeTo();
        bool feeOn = feeTo != address(0);
        uint256 _kLast = ISwapPair(pair).kLast();
        if (feeOn) {
            if (_kLast != 0) {
                uint256 rootK = Math.sqrt(r0 * r1);
                uint256 rootKLast = Math.sqrt(_kLast);
                if (rootK > rootKLast) {
                    uint256 numerator;
                    uint256 denominator;
                    if (
                        address(swapRouter) ==
                        address(0x10ED43C718714eb63d5aA57B78B54704E256024E)
                    ) {
                        // BSC Pancake
                        numerator = pairTotalSupply * (rootK - rootKLast) * 8;
                        denominator = rootK * 17 + (rootKLast * 8);
                    } else if (
                        address(swapRouter) ==
                        address(0xD99D1c33F9fC3444f8101754aBC46c52416550D1)
                    ) {
                        //BSC testnet Pancake
                        numerator = pairTotalSupply * (rootK - rootKLast);
                        denominator = rootK * 3 + rootKLast;
                    } else {
                        //SushiSwap,UniSwap,OK Cherry Swap
                        numerator = pairTotalSupply * (rootK - rootKLast);
                        denominator = rootK * 5 + rootKLast;
                    }
                    feeToLiquidity = numerator / denominator;
                    if (feeToLiquidity > 0) pairTotalSupply += feeToLiquidity;
                }
            }
        }
        uint256 amount0 = balanceA - r0;
        if (pairTotalSupply == 0) {
            if (amount0 > 0) {
                liquidity = Math.sqrt(amount0 * amount) - 1000;
            }
        } else {
            liquidity = Math.min(
                (amount0 * pairTotalSupply) / r0,
                (amount * pairTotalSupply) / r1
            );
        }
    }

    function _isRemoveLiquidity(
        address pair,
        uint256 amount
    ) internal view returns (uint256 liquidity) {
        (uint256 rOther, uint256 rThis, uint256 balanceOther) = _getReserves(
            pair
        );
        //isRemoveLP
        if (balanceOther <= rOther) {
            liquidity =
                (amount * ISwapPair(pair).totalSupply()) /
                (balanceOf(pair) - amount);
        } else if (strictCheck) {
            // buy
            uint256 amountOther;
            if (rOther > 0 && rThis > 0) {
                amountOther = (amount * rOther) / (rThis - amount);
                require(balanceOther >= amountOther + rOther);
            }
        }
    }


    function isStartTrade() internal view returns (bool) {
        return startTradeTimestamp > 0 && block.timestamp >= startTradeTimestamp;
    }

    function setPool(address newPool) external onlyOwner {
        require(address(pool) == address(0), "pool already set");
        pool = IPool(newPool);
    }

    function getUserInfo(
        address account
    )
        public
        view
        returns (uint256 lpBalance, uint256 lpAmount, uint256 userLpAmount, uint256 preLpAmount)
    {
        lpBalance = IERC20(mainPairAddr).balanceOf(account);
        userLpAmount = _userInfo[account].lpAmount;
        preLpAmount = _userInfo[account].preLpAmount;
        lpAmount = userLpAmount + preLpAmount;
    }

    function multiUpdateLPAmountByLP(address[] memory accounts, bool isPre) external onlyOwner {
        UserInfo storage userInfo;
        for (uint256 i; i < accounts.length; i++) {
            userInfo = _userInfo[accounts[i]];
            if (isPre){
                userInfo.preLpAmount = IERC20(mainPairAddr).balanceOf(accounts[i]) + 1;
            }else{
                userInfo.lpAmount = IERC20(mainPairAddr).balanceOf(accounts[i]) + 1;
            }
            dividendTracker.setBalance(payable(accounts[i]), userInfo.lpAmount + userInfo.preLpAmount);
        }
    }

    function processDividendTracker(uint256 gas) external {
        (
            uint256 iterations,
            uint256 claims,
            uint256 lastProcessedIndex
        ) = dividendTracker.process(gas);
        emit ProcessedDividendTracker(
            iterations,
            claims,
            lastProcessedIndex,
            false,
            gas,
            tx.origin
        );
    }

    function claim() external {
        dividendTracker.processAccount(payable(msg.sender), false);
    }

    function setInvitorRewardPercentList(
        uint256[] calldata newValue
    ) public onlyOwner {
        invitorRewardPercentList = new uint256[](newValue.length);
        for (uint256 i = 0; i < newValue.length; i++) {
            invitorRewardPercentList[i] = newValue[i];
        }
        require(getInvitorTotalShare() <= 10000 - buyRewardFee - sellRewardFee - transferFee, "invitor reward percent list is not valid");
    }

    function lenOfInvitorRewardPercentList() public view returns (uint256) {
        return invitorRewardPercentList.length;
    }

    function getInvitorTotalShare() public view returns(uint256){
        uint256 totalShare;
        for (uint256 i; i < invitorRewardPercentList.length; i++) {
            totalShare += invitorRewardPercentList[i];
        }
        return totalShare;
    }


    function _transfer(address from, address to, uint256 amount) private {

        if (inSwap) {
            _basicTransfer(from, to, amount);
            return;
        }

        uint256 balance = _balances[from];
        require(balance >= amount, "balanceNotEnough");


        if (to == DEAD_ADDRESS && !isExcludedFromFee[from] && msg.sender == tx.origin) {
            require(address(pool) != address(0), "pool not set");
            require(amount <= maxAmountToJoinLottery, "exceed max amount");

            if (pool.paused()) {
                _basicTransfer(from, DEAD_ADDRESS, amount);
                return;
            }

            pool.processLotteryEntry(from, amount);

            try pool.batchProcessLotteryResultsWhenBurn() {} catch { emit FailedSwap(1); }

            _basicTransfer(from, DEAD_ADDRESS, amount);
            return;
        }

        bool takeFee;
        bool isRemove;
        bool isAdd;

        (uint256 addLPLiquidity, uint256 removeLPLiquidity) = addOrRemove(
            from,
            to,
            amount
        );

        // must currency + token, otherwise the LP will be lost
        if (addLPLiquidity > 0 && !isExcludedFromFee[from]) {
            isAdd = true;
            UserInfo storage userInfo = _userInfo[from];
            if (!isStartTrade()) {
                userInfo.preLpAmount += addLPLiquidity;
                emit UserLpAmountChangedWhenAddLp(
                    from, 
                    userInfo.preLpAmount - addLPLiquidity, 
                    userInfo.lpAmount,
                    userInfo.preLpAmount,
                    userInfo.lpAmount
                );
            } else {
                userInfo.lpAmount += addLPLiquidity;
                emit UserLpAmountChangedWhenAddLp(
                    from, 
                    userInfo.preLpAmount, 
                    userInfo.lpAmount - addLPLiquidity,
                    userInfo.preLpAmount,
                    userInfo.lpAmount
                );
            }
            uint256 addLpTokenValue = getTokenUsdtValue(amount);
            // if you dont want check value, set minValue2AddLp2GetDividendValue to 1 wei
            if (minValue2AddLp2GetDividendValue > 0 && addLpTokenValue >= minValue2AddLp2GetDividendValue) {
                dividendTracker.setBalance(payable(from), userInfo.lpAmount + userInfo.preLpAmount);
            }else{
                emit NotEnough2AddLp2GetDividendValue(from, addLpTokenValue, minValue2AddLp2GetDividendValue);
            }
        }

        if (removeLPLiquidity > 0) {
            isRemove = true;
        }

        bool isExcludedFromFeeTransfer = isExcludedFromFee[from] || isExcludedFromFee[to];
        bool isSwapTransfer = isLiquidityPair[from] || isLiquidityPair[to];

        // user can't add other lp before start trade
        if (!isStartTrade()) {
            if (
                !isExcludedFromFeeTransfer &&
                !isSwapTransfer
            ) {
                require(!isContract(to), "can't add other lp before start trade");
            }
        }

        if (isSwapTransfer && !isExcludedFromFeeTransfer) {
            if (!isStartTrade()){
                require(
                    startLPTimestamp > 0 && isAdd, "lp cant be added"
                );
            }

            // still hold 1 wei token when sell all token
            if (!isAdd && isLiquidityPair[to]) {
                if (amount == balanceOf(from)) {
                    amount -= 1;
                }
            }

            if (!isAdd && !isRemove) takeFee = true; // just swap fee
        }

        _tokenTransfer(
            from,
            to,
            amount,
            takeFee,
            !isSwapTransfer,
            isAdd,
            isRemove,
            removeLPLiquidity
        );

        // process dividend tracker when swap, when transfer, no need to trigger dividends to save gas
        if (!inSwap && isSwapTransfer) {
            uint256 gas = gasForProcessing;
            inSwap = true;

            try dividendTracker.process(gas) returns (
                uint256 iterations,
                uint256 claims,
                uint256 lastProcessedIndex
            ) {
                emit ProcessedDividendTracker(
                    iterations,
                    claims,
                    lastProcessedIndex,
                    true,
                    gas,
                    tx.origin
                );
            } catch {}

            inSwap = false;
        }
    }

    function _distributeRefReward(address sender, uint256 perInviteAmount, address _current, uint256 totalShare) private {

        address current = _current;
        uint256 inviterAmount;
        if (totalShare > 0){
            for (uint256 i; i < invitorRewardPercentList.length; ++i) {
                address __inviter = _inviter[current];

                if (address(0) == __inviter) {
                    __inviter = DEAD_ADDRESS;
                }

                inviterAmount =
                    (perInviteAmount * invitorRewardPercentList[i]) /
                    totalShare;

                _takeTransfer(sender, __inviter, inviterAmount);
                current = __inviter;
            }
        }

    }

    function min(uint256 a, uint256 b) public pure returns (uint256) {
        return a < b ? a : b;
    }

    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 tAmount,
        bool takeFee,
        bool isTransfer,
        bool isAdd,
        bool isRemove,
        uint256 removeLPLiquidity
    ) private {
        _balances[sender] -= tAmount;
        uint256 feeAmount;
        
        if (takeFee) {

            if (isLiquidityPair[sender] || isLiquidityPair[recipient]) {
                //invitor reward
                address current;
                if (isLiquidityPair[sender]) {
                    current = recipient;
                } else {
                    current = sender;
                }

                uint256 totalShare = getInvitorTotalShare();
                uint256 perInviteAmount = (tAmount * totalShare) / 10000;
                feeAmount += perInviteAmount;

                _distributeRefReward(sender, perInviteAmount, current, totalShare);

            }

            bool isSell = isLiquidityPair[recipient];
            uint256 swapFee;
            // uint256 burnFee;
            if (isSell) {
                swapFee = sellRewardFee;
            } else {
                swapFee = buyRewardFee;
            }
            
            uint256 swapFeeAmount = (tAmount * swapFee) / 10000;

            if (swapFeeAmount > 0) {
                feeAmount += swapFeeAmount;

                if (address(dividendTracker) != address(0) && dividendTracker.totalSupply() > 0) {
                    _takeTransfer(sender, address(dividendTracker), swapFeeAmount);
                    dividendTracker.distributeDividends(swapFeeAmount);
                }else{
                    _takeTransfer(sender, DEAD_ADDRESS, swapFeeAmount);
                }
            }
        }

        if (isTransfer) {
            address from = sender;
            address to = recipient;
            if (isContract(to)) {
                emit cantBindCa(to);
            } else if (isContract(from)) {
                emit cantBindCa(from);
            }else{
                if (address(0) == _inviter[to] && tAmount > 0 && from != to && !isExcludedFromFee[to]) {
                    _pendingBind[from][to] = true;
                    emit pendingBind(from, to, block.timestamp);
                }

                if (address(0) == _inviter[from] && tAmount > 0 && from != to) {
                    if (_pendingBind[to][from] && _binders[from].length == 0) {
                        if (to != address(0)) {
                            _inviter[from] = to;
                            _binders[to].push(from);
                            emit bindSuccessful(to, from, block.timestamp);
                        }
                    }
                }
            }
        }


        bool isExcludedFromFeeTransfer = isExcludedFromFee[sender] || isExcludedFromFee[recipient];

        // transfer free
        if (isTransfer && !isExcludedFromFeeTransfer) {
            uint256 transferFeeAmount;
            transferFeeAmount = (tAmount * transferFee) / 10000;

            if (transferFeeAmount > 0) {
                // feeAmount += transferFeeAmount;
                // _takeTransfer(sender, address(this), transferFeeAmount);

                address current;
                // If 'from' is the contract address, then it is assumed to be the LP contract.
                if (isContract(sender)) {
                    current = recipient;
                } else {
                    current = sender;
                }

                uint256 totalShare = getInvitorTotalShare();
                feeAmount += transferFeeAmount;
                _distributeRefReward(sender, transferFeeAmount / 3, current, totalShare);

                if (address(dividendTracker) != address(0) && dividendTracker.totalSupply() > 0) {
                    _takeTransfer(sender, address(dividendTracker), transferFeeAmount * 2 / 3);
                    dividendTracker.distributeDividends(transferFeeAmount * 2 / 3);
                }else{
                    _takeTransfer(sender, DEAD_ADDRESS, transferFeeAmount * 2 / 3);
                }
            }
        }

        if (isAdd && !isExcludedFromFeeTransfer) {
            // free
        }

        if (isRemove && !isExcludedFromFeeTransfer) {
            UserInfo storage userInfo = _userInfo[recipient];

            // already remove prelp burn 
            bool isWithinRemoveLpBurnDays = isStartTrade() && block.timestamp < startTradeTimestamp + removeLpBurnInterval;
            
            if (userInfo.preLpAmount >= removeLPLiquidity) {
                userInfo.preLpAmount -= removeLPLiquidity;
                uint256 removeFeeAmt = isWithinRemoveLpBurnDays ? (tAmount - feeAmount) : 0;
                feeAmount += removeFeeAmt;
                _takeTransfer(sender, DEAD_ADDRESS, removeFeeAmt);
            } else {
                uint256 removeLpBurnAmount = (userInfo.preLpAmount * tAmount) / removeLPLiquidity;
                if (isWithinRemoveLpBurnDays && removeLpBurnAmount > 0) {
                    uint256 _tempfeeAmount = min(tAmount - feeAmount, removeLpBurnAmount);
                    feeAmount += _tempfeeAmount;
                    _takeTransfer(sender, DEAD_ADDRESS, _tempfeeAmount);
                }
                // uint256 restLp = removeLPLiquidity - userInfo.preLpAmount;
                userInfo.lpAmount -= (removeLPLiquidity - userInfo.preLpAmount);
                userInfo.preLpAmount = 0;
                // uint256 _tempvalue = tAmount - (isWithinRemoveLpBurnDays ? removeLpBurnAmount : 0);
                uint256 removeLpFeeAmount = ((tAmount - (isWithinRemoveLpBurnDays ? removeLpBurnAmount : 0)) * removeLiquidityFee) / 10000;
                if (removeLpFeeAmount > 0) {
                    uint256 _tempfeeAmount =  min(tAmount - feeAmount, removeLpFeeAmount);
                    feeAmount += _tempfeeAmount;
                    _takeTransfer(sender, DEAD_ADDRESS, _tempfeeAmount);
                }
            }
            dividendTracker.setBalance(payable(recipient), userInfo.lpAmount + userInfo.preLpAmount);

            emit UserLpAmountChangedWhenRemoveLp(
                recipient, 
                userInfo.preLpAmount,
                userInfo.lpAmount
            );
        }

        _takeTransfer(sender, recipient, tAmount - feeAmount);

        if (!isExcludedFromFeeTransfer){
            try pool.batchProcessLotteryResultsWhenTrade() {} catch { emit FailedSwap(2); }
        }

    }

    function _takeTransfer(
        address sender,
        address to,
        uint256 tAmount
    ) private {
        _balances[to] += tAmount;
        emit Transfer(sender, to, tAmount);
    }

    function isContract(address _addr) private view returns (bool) {
        return _addr.code.length > 25; // contract code length > 25 bytes, exclude eip7702 address
    }

    function startLP() external onlyOwner {
        require(0 == startLPTimestamp, "startedAddLP");
        startLPTimestamp = block.timestamp;
    }

    function stopLP() external onlyOwner {
        startLPTimestamp = 0;
    }

    function launch() external onlyOwner {
        require(0 == startTradeTimestamp, "already open");
        startTradeTimestamp = block.timestamp;
    }

    function setStartTradeTimestamp(uint256 newValue) external onlyOwner {
        require(newValue > block.timestamp, "new value must be greater than current timestamp");
        startTradeTimestamp = newValue;
    }

    function shutdown() external onlyOwner {
        require(startTradeTimestamp > 0, "already shutdown");
        startTradeTimestamp = 0;
    }

    function setGasForProcessing(uint256 newValue) external onlyOwner {
        require(newValue >= 300000 && newValue <= 2000000, "gas for processing must be between 300000 and 2000000");
        gasForProcessing = newValue;
    }

    function setMinValue2AddLp2GetDividendValue(uint256 newValue) external onlyOwner {
        minValue2AddLp2GetDividendValue = newValue;
    }

    function multiSetIsExcludedFromFee(
        address[] calldata addresses,
        bool status
    ) external onlyOwner {
        for (uint256 i; i < addresses.length; i++) {
            isExcludedFromFee[addresses[i]] = status;
        }
    }
    
    receive() external payable {}
}

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

pragma solidity ^0.8.20;

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity >=0.4.16;

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.20;

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

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

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

File 5 of 5 : Interface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library Math {
    function min(uint x, uint y) internal pure returns (uint z) {
        z = x < y ? x : y;
    }

    function sqrt(uint y) internal pure returns (uint z) {
        if (y > 3) {
            z = y;
            uint x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}

interface ISwapRouter {
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);
}

interface ISwapFactory {
    function createPair(
        address tokenA,
        address tokenB
    ) external returns (address pair);
    function getPair(
        address tokenA,
        address tokenB
    ) external view returns (address pair);
    function feeTo() external view returns (address);
}

interface ISwapPair {
    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function balanceOf(address account) external view returns (uint256);
    function kLast() external view returns (uint);
    function totalSupply() external view returns (uint256);
}

interface IWETH {
    function deposit() external payable;
    function withdraw(uint) external;
}


interface DividendPayingTokenOptionalInterface {
    function withdrawableDividendOf(
        address _owner
    ) external view returns (uint256);

    function withdrawnDividendOf(
        address _owner
    ) external view returns (uint256);

    function accumulativeDividendOf(
        address _owner
    ) external view returns (uint256);
}

interface DividendPayingTokenInterface {
    function dividendOf(address _owner) external view returns (uint256);

    function withdrawDividend() external;

    event DividendsDistributed(address indexed from, uint256 weiAmount);

    event DividendWithdrawn(address indexed to, uint256 weiAmount);
}


library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}


library IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint256) values;
        mapping(address => uint256) indexOf;
        mapping(address => bool) inserted;
    }

    function get(Map storage map, address key) public view returns (uint256) {
        return map.values[key];
    }

    function getIndexOfKey(
        Map storage map,
        address key
    ) public view returns (int256) {
        if (!map.inserted[key]) {
            return -1;
        }
        return int256(map.indexOf[key]);
    }

    function getKeyAtIndex(
        Map storage map,
        uint256 index
    ) public view returns (address) {
        return map.keys[index];
    }

    function size(Map storage map) public view returns (uint256) {
        return map.keys.length;
    }

    function set(Map storage map, address key, uint256 val) public {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(Map storage map, address key) public {
        if (!map.inserted[key]) {
            return;
        }

        delete map.inserted[key];
        delete map.values[key];

        uint256 index = map.indexOf[key];
        uint256 lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

        map.indexOf[lastKey] = index;
        delete map.indexOf[key];

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

/**
 * @title SafeMathInt
 * @dev Math operations for int256 with overflow safety checks.
 */
library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }

    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

/**
 * @title SafeMathUint
 * @dev Math operations with safety checks that revert on error
 */
library SafeMathUint {
    function toInt256Safe(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        require(b >= 0);
        return b;
    }
}


// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
    }
}

interface IDividendTracker {
    function totalSupply() external view returns (uint256);
    // function claimDividendTrackerToken(address token, address to, uint256 amount) external;
    function setMinimumTokenBalanceForDividends(uint256 newValue) external;
    function setClaimWait(uint256 newValue) external;
    function setBalance(address payable account,uint256 newBalance) external;
    function process(uint256 gas) external returns (uint256, uint256, uint256);
    function processAccount(
        address payable account,
        bool automatic
    ) external returns (bool);
    function excludeFromDividends(address account) external;
    function distributeDividends(uint256 amount) external;
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"FailedSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"addLpTokenValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minValue2AddLp2GetDividendValue","type":"uint256"}],"name":"NotEnough2AddLp2GetDividendValue","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"beforePreLpAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"beforeLpAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"preLpAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpAmount","type":"uint256"}],"name":"UserLpAmountChangedWhenAddLp","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"preLpAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpAmount","type":"uint256"}],"name":"UserLpAmountChangedWhenRemoveLp","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"i","type":"address"},{"indexed":true,"internalType":"address","name":"u","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"bindSuccessful","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"caAddr","type":"address"}],"name":"cantBindCa","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"s","type":"address"},{"indexed":true,"internalType":"address","name":"x","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"pendingBind","type":"event"},{"inputs":[],"name":"DEAD_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZERO_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_binders","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"_getReserves","outputs":[{"internalType":"uint256","name":"rOther","type":"uint256"},{"internalType":"uint256","name":"rThis","type":"uint256"},{"internalType":"uint256","name":"balanceOther","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_inviter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"_pendingBind","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_userInfo","outputs":[{"internalType":"uint256","name":"preLpAmount","type":"uint256"},{"internalType":"uint256","name":"lpAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyRewardFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cowTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currencyAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract IDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInvitorTotalShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"getTokenUsdtValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getUserInfo","outputs":[{"internalType":"uint256","name":"lpBalance","type":"uint256"},{"internalType":"uint256","name":"lpAmount","type":"uint256"},{"internalType":"uint256","name":"userLpAmount","type":"uint256"},{"internalType":"uint256","name":"preLpAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"winner","type":"address"},{"internalType":"uint256","name":"sendAmount","type":"uint256"}],"name":"handleWinner","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dividendTrackerAddress","type":"address"}],"name":"initDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"invitorRewardPercentList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isLiquidityPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSwapRouter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lenOfInvitorRewardPercentList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mainPairAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAmountToJoinLottery","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"}],"name":"min","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"minValue2AddLp2GetDividendValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"status","type":"bool"}],"name":"multiSetIsExcludedFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"isPre","type":"bool"}],"name":"multiUpdateLPAmountByLP","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":[],"name":"pool","outputs":[{"internalType":"contract IPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLpBurnInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellRewardFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"newValue","type":"uint256[]"}],"name":"setInvitorRewardPercentList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMinValue2AddLp2GetDividendValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPool","type":"address"}],"name":"setPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setStartTradeTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shutdown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startLPTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTradeTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stopLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"strictCheck","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract ISwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenDistributor","outputs":[{"internalType":"contract TokenDistributor","name":"","type":"address"}],"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":[],"name":"transferFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdtAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wethAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

61020060405260326101a0908152601e6101c05260146101e0526100279060189060036107aa565b5034801561003457600080fd5b50338061005c57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b610065816105de565b5060408051808201909152600781526647616d65436f7760c81b602082015260019061009190826108b8565b5060408051808201909152600481526347434f5760e01b60208201526002906100ba90826108b8565b50601260035569021e19e0c9bab240000060045560c8600b819055600c5560384614806100e75750466061145b6101335760405162461bcd60e51b815260206004820152601660248201527f636861696e206964206e6f7420737570706f72746564000000000000000000006044820152606401610053565b466038146101555773ab1a4d4f1d656d2450692d237fdd6c7f9146e81461016b565b7355d398326f99059ff775485246999027b31979555b6001600160a01b031660a0526038461461019957737e4388f5868ab7e02bc5e5772688f76c6e4621616101af565b737aaaa5b10f97321345acd76945083141be1c56315b6001600160a01b03166080526000603846146101df5773d99d1c33f9fc3444f8101754abc46c52416550d16101f5565b7310ed43c718714eb63d5aa57b78b54704e256024e5b6080516001600160a01b031660c08190529091507350f8f9b66859d0dd0de4a05ab22dd7d0c0865a1d9030116102935760405162461bcd60e51b815260206004820152603560248201527f63757272656e637920616464726573732063616e6e6f7420626520677265617460448201527f6572207468616e20746f6b656e206164647265737300000000000000000000006064820152608401610053565b6001600160a01b0382166101608190526000818152600960209081526040808320805460ff19166001179055805163c45a015560e01b8152905192939263c45a0155926004808401939192918290030181865afa1580156102f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061031c9190610976565b60c0516040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af115801561036d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103919190610976565b6001600160a01b0381811660e08190526000908152600860209081526040808320805460ff1916600117905560045493871680845260058352818420859055905193845293945090917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36001600160a01b03821660009081526007602081905260408083208054600160ff19918216811790925530855291842080549092168117909155916104526000546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff1995861617905561dead905260079091527fb0c2646e02af70b79e3fe9277b98373379f54150e4e26b2b5650139f7a75a65d805490921660011790915560c05190516104c2906107fa565b6001600160a01b039091168152602001604051809103906000f0801580156104ee573d6000803e3d6000fd5b50601180546001600160a01b039290921661010002610100600160a81b0319909216919091179055610523308460001961062e565b60c051610533908460001961068f565b610160516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610574573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105989190610976565b6001600160a01b031661012052505061271061010052506507dba8202e8061018052678ac7230489e80000600f5561012c600a55670de0b6b3a7640000610140526109f7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b17905291516000928392908716916106eb91906109a6565b6000604051808303816000865af19150503d8060008114610728576040519150601f19603f3d011682016040523d82523d6000602084013e61072d565b606091505b509150915081801561075757508051158061075757508080602001905181019061075791906109d5565b6107a35760405162461bcd60e51b815260206004820152601e60248201527f5472616e7366657248656c7065723a20415050524f56455f4641494c454400006044820152606401610053565b5050505050565b8280548282559060005260206000209081019282156107ea579160200282015b828111156107ea578251829060ff169055916020019190600101906107ca565b506107f6929150610807565b5090565b61022f8061502483390190565b5b808211156107f65760008155600101610808565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168061084657607f821691505b60208210810361086657634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156108b357806000526020600020601f840160051c810160208510156108935750805b601f840160051c820191505b818110156107a3576000815560010161089f565b505050565b81516001600160401b038111156108d1576108d161081c565b6108e5816108df8454610832565b8461086c565b6020601f82116001811461091957600083156109015750848201515b600019600385901b1c1916600184901b1784556107a3565b600084815260208120601f198516915b828110156109495787850151825560209485019460019092019101610929565b50848210156109675786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60006020828403121561098857600080fd5b81516001600160a01b038116811461099f57600080fd5b9392505050565b6000825160005b818110156109c757602081860181015185830152016109ad565b506000920191825250919050565b6000602082840312156109e757600080fd5b8151801515811461099f57600080fd5b60805160a05160c05160e0516101005161012051610140516101605161018051614554610ad060003960008181610b260152613489015260008181610be401528181610f2b0152818161140601528181613ae801528181613c9d0152613d2a0152600081816109dc01526123e60152600081816106fa015261135b015260008181610bb001526135a901526000818161096d01528181610faa015281816116a60152818161176d01526119400152600081816106460152611307015260008181610a8c01526113af01526000610a2e01526145546000f3fe6080604052600436106103bc5760003560e01c80635a1fe42f116101f2578063992db38f1161010d578063b5028e23116100a0578063dd62ed3e1161006f578063dd62ed3e14610c3c578063de0aad5314610c82578063f2fde38b14610c98578063fc0e74d114610cb857600080fd5b8063b5028e2314610b7e578063bfc3137e14610b9e578063c31c9c0714610bd2578063ccdbd42414610c0657600080fd5b8063a9059cbb116100dc578063a9059cbb14610af4578063ac0c850814610b14578063acb2ad6f14610b48578063b340364f14610b5e57600080fd5b8063992db38f14610a655780639ab4a44514610a7a5780639c1b8af514610aae578063a1bc910f14610ac457600080fd5b8063715018a61161018557806386b0e8051161015457806386b0e805146109ca5780638da5cb5b146109fe5780639145b1c414610a1c57806395d89b4114610a5057600080fd5b8063715018a6146109265780637ae2b5c71461093b578063847164851461095b578063850ea0da1461098f57600080fd5b80636386c1c7116101c15780636386c1c7146108475780636f17d61114610887578063700bb191146108d057806370a08231146108f057600080fd5b80635a1fe42f146107c15780635b1d8067146107e15780635c25c30e146107f75780635c9a05b81461081757600080fd5b80632e8474d5116102e25780634e6fd6c411610275578063538ba4f911610244578063538ba4f91461074c57806358877f611461076157806358c3dd2b146107815780635960e46d146107a157600080fd5b80634e6fd6c4146106bd5780634e71d92d146106d35780634f0e0ef3146106e85780635342acb41461071c57600080fd5b8063395a81e7116102b1578063395a81e7146106345780634437152a14610668578063474b46d8146106885780634b656b241461069d57600080fd5b80632e8474d5146105a2578063302fa653146105b7578063313ce567146105f2578063324cd3c91461061457600080fd5b806315bfa3c61161035a57806318d128551161032957806318d128551461052d578063214b20de1461054257806323b872dd146105625780632c1f52161461058257600080fd5b806315bfa3c6146104a557806316f0115b146104bb57806318160ddd146104f357806318a6bc321461050857600080fd5b806306fdde031161039657806306fdde0314610428578063095ea7b31461044a5780630b4575571461047a5780630cfe2f3f1461048f57600080fd5b806301339c21146103c8578063017df7f2146103df57806306b16e94146103ff57600080fd5b366103c357005b600080fd5b3480156103d457600080fd5b506103dd610ccd565b005b3480156103eb57600080fd5b506103dd6103fa366004613f29565b610d1f565b34801561040b57600080fd5b50610415600d5481565b6040519081526020015b60405180910390f35b34801561043457600080fd5b5061043d61101b565b60405161041f9190613f46565b34801561045657600080fd5b5061046a610465366004613f94565b6110ad565b604051901515815260200161041f565b34801561048657600080fd5b506104156110c4565b34801561049b57600080fd5b50610415600b5481565b3480156104b157600080fd5b50610415600f5481565b3480156104c757600080fd5b506014546104db906001600160a01b031681565b6040516001600160a01b03909116815260200161041f565b3480156104ff57600080fd5b50600454610415565b34801561051457600080fd5b506011546104db9061010090046001600160a01b031681565b34801561053957600080fd5b506103dd61110d565b34801561054e57600080fd5b506103dd61055d366004613fc0565b61111c565b34801561056e57600080fd5b5061046a61057d366004613fd9565b611129565b34801561058e57600080fd5b506012546104db906001600160a01b031681565b3480156105ae57600080fd5b5061046a600181565b3480156105c357600080fd5b5061046a6105d236600461401a565b601760209081526000928352604080842090915290825290205460ff1681565b3480156105fe57600080fd5b5060035460405160ff909116815260200161041f565b34801561062057600080fd5b506103dd61062f366004613fc0565b6111c0565b34801561064057600080fd5b506104db7f000000000000000000000000000000000000000000000000000000000000000081565b34801561067457600080fd5b506103dd610683366004613f29565b611235565b34801561069457600080fd5b50601854610415565b3480156106a957600080fd5b506104156106b8366004613fc0565b6112ab565b3480156106c957600080fd5b506104db61dead81565b3480156106df57600080fd5b506103dd6114ae565b3480156106f457600080fd5b506104db7f000000000000000000000000000000000000000000000000000000000000000081565b34801561072857600080fd5b5061046a610737366004613f29565b60076020526000908152604090205460ff1681565b34801561075857600080fd5b506104db600081565b34801561076d57600080fd5b506103dd61077c3660046140b8565b611526565b34801561078d57600080fd5b5061041561079c366004613fc0565b61159b565b3480156107ad57600080fd5b506103dd6107bc366004613fc0565b6115bc565b3480156107cd57600080fd5b506103dd6107dc36600461417a565b611649565b3480156107ed57600080fd5b50610415600e5481565b34801561080357600080fd5b506104db610812366004613f94565b6118e0565b34801561082357600080fd5b5061046a610832366004613f29565b60086020526000908152604090205460ff1681565b34801561085357600080fd5b50610867610862366004613f29565b611918565b60408051948552602085019390935291830152606082015260800161041f565b34801561089357600080fd5b506108bb6108a2366004613f29565b6013602052600090815260409020805460019091015482565b6040805192835260208301919091520161041f565b3480156108dc57600080fd5b506103dd6108eb366004613fc0565b6119e4565b3480156108fc57600080fd5b5061041561090b366004613f29565b6001600160a01b031660009081526005602052604090205490565b34801561093257600080fd5b506103dd611ab6565b34801561094757600080fd5b50610415610956366004614230565b611aca565b34801561096757600080fd5b506104db7f000000000000000000000000000000000000000000000000000000000000000081565b34801561099b57600080fd5b506109af6109aa366004613f94565b611ae2565b6040805193845260208401929092529082015260600161041f565b3480156109d657600080fd5b506104157f000000000000000000000000000000000000000000000000000000000000000081565b348015610a0a57600080fd5b506000546001600160a01b03166104db565b348015610a2857600080fd5b506104db7f000000000000000000000000000000000000000000000000000000000000000081565b348015610a5c57600080fd5b5061043d611dbc565b348015610a7157600080fd5b506103dd611dcb565b348015610a8657600080fd5b506104db7f000000000000000000000000000000000000000000000000000000000000000081565b348015610aba57600080fd5b5061041560105481565b348015610ad057600080fd5b5061046a610adf366004613f29565b60096020526000908152604090205460ff1681565b348015610b0057600080fd5b5061046a610b0f366004613f94565b611e18565b348015610b2057600080fd5b506104157f000000000000000000000000000000000000000000000000000000000000000081565b348015610b5457600080fd5b50610415600a5481565b348015610b6a57600080fd5b506109af610b79366004613f29565b611e25565b348015610b8a57600080fd5b506103dd610b99366004614252565b61208a565b348015610baa57600080fd5b506104157f000000000000000000000000000000000000000000000000000000000000000081565b348015610bde57600080fd5b506104db7f000000000000000000000000000000000000000000000000000000000000000081565b348015610c1257600080fd5b506104db610c21366004613f29565b6015602052600090815260409020546001600160a01b031681565b348015610c4857600080fd5b50610415610c5736600461401a565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b348015610c8e57600080fd5b50610415600c5481565b348015610ca457600080fd5b506103dd610cb3366004613f29565b6121ca565b348015610cc457600080fd5b506103dd612205565b610cd5612259565b600d5415610d195760405162461bcd60e51b815260206004820152600c60248201526b30b63932b0b23c9037b832b760a11b60448201526064015b60405180910390fd5b42600d55565b610d27612259565b6012546001600160a01b031615610d8c5760405162461bcd60e51b815260206004820152602360248201527f6469766964656e64547261636b657220616c726561647920696e697469616c696044820152621e995960ea1b6064820152608401610d10565b601280546001600160a01b0319166001600160a01b03831690811790915560405163031e79db60e41b8152600481018290526331e79db090602401600060405180830381600087803b158015610de157600080fd5b505af1158015610df5573d6000803e3d6000fd5b505060125460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015610e3e57600080fd5b505af1158015610e52573d6000803e3d6000fd5b505060125460405163031e79db60e41b8152600060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015610e9c57600080fd5b505af1158015610eb0573d6000803e3d6000fd5b505060125460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015610efb57600080fd5b505af1158015610f0f573d6000803e3d6000fd5b505060125460405163031e79db60e41b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015290911692506331e79db09150602401600060405180830381600087803b158015610f7a57600080fd5b505af1158015610f8e573d6000803e3d6000fd5b505060125460405163031e79db60e41b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015290911692506331e79db09150602401600060405180830381600087803b158015610ff957600080fd5b505af115801561100d573d6000803e3d6000fd5b50506207a120601055505050565b60606001805461102a90614294565b80601f016020809104026020016040519081016040528092919081815260200182805461105690614294565b80156110a35780601f10611078576101008083540402835291602001916110a3565b820191906000526020600020905b81548152906001019060200180831161108657829003601f168201915b5050505050905090565b60006110ba338484612286565b5060015b92915050565b60008060005b60185481101561110757601881815481106110e7576110e76142c8565b9060005260206000200154826110fd91906142f4565b91506001016110ca565b50919050565b611115612259565b6000600e55565b611124612259565b600f55565b60006111368484846122e8565b6001600160a01b0384166000908152600660209081526040808320338452909152902054600019146111b6576001600160a01b0384166000908152600660209081526040808320338452909152902054611191908390614307565b6001600160a01b03851660009081526006602090815260408083203384529091529020555b5060019392505050565b6111c8612259565b4281116112305760405162461bcd60e51b815260206004820152603060248201527f6e65772076616c7565206d7573742062652067726561746572207468616e206360448201526f0757272656e742074696d657374616d760841b6064820152608401610d10565b600d55565b61123d612259565b6014546001600160a01b0316156112895760405162461bcd60e51b815260206004820152601060248201526f1c1bdbdb08185b1c9958591e481cd95d60821b6044820152606401610d10565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b60408051600480825260a082019092526000918291906020820160808036833701905050905030816000815181106112e5576112e56142c8565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611339576113396142c8565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160028151811061138d5761138d6142c8565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000000000000000000000000000000000000000000000816003815181106113e1576113e16142c8565b6001600160a01b03928316602091820292909201015260405163d06ca61f60e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063d06ca61f9061143f908690859060040161431a565b600060405180830381865afa92505050801561147d57506040513d6000823e601f3d908101601f1916820160405261147a9190810190614372565b60015b61148a5750600092915050565b8060038151811061149d5761149d6142c8565b602002602001015192505050919050565b60125460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af11580156114ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115239190614408565b50565b61152e612259565b60005b82811015611595578160076000868685818110611550576115506142c8565b90506020020160208101906115659190613f29565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600101611531565b50505050565b601881815481106115ab57600080fd5b600091825260209091200154905081565b6115c4612259565b620493e081101580156115da5750621e84808111155b6116445760405162461bcd60e51b815260206004820152603560248201527f67617320666f722070726f63657373696e67206d7573742062652062657477656044820152740656e2033303030303020616e64203230303030303605c1b6064820152608401610d10565b601055565b611651612259565b6000805b83518110156115955760136000858381518110611674576116746142c8565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000209150821561176b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a082318583815181106116e5576116e56142c8565b60200260200101516040518263ffffffff1660e01b815260040161171891906001600160a01b0391909116815260200190565b602060405180830381865afa158015611735573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117599190614425565b6117649060016142f4565b8255611831565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a082318583815181106117ac576117ac6142c8565b60200260200101516040518263ffffffff1660e01b81526004016117df91906001600160a01b0391909116815260200190565b602060405180830381865afa1580156117fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118209190614425565b61182b9060016142f4565b60018301555b60125484516001600160a01b039091169063e30443bc9086908490811061185a5761185a6142c8565b60200260200101518460000154856001015461187691906142f4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156118bc57600080fd5b505af11580156118d0573d6000803e3d6000fd5b5050600190920191506116559050565b601660205281600052604060002081815481106118fc57600080fd5b6000918252602090912001546001600160a01b03169150829050565b6040516370a0823160e01b81526001600160a01b0382811660048301526000918291829182917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ab9190614425565b6001600160a01b038616600090815260136020526040902060018101549054919550925090506119db81836142f4565b92509193509193565b6012546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611a37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5b919061443e565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b611abe612259565b611ac86000612b67565b565b6000818310611ad95781611adb565b825b9392505050565b601454600090819081906001600160a01b03163314611b435760405162461bcd60e51b815260206004820181905260248201527f4f6e6c7920706f6f6c2063616e2063616c6c20746869732066756e6374696f6e6044820152606401610d10565b61dead60005260056020527f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba548490611b7d82600261446c565b1115611b9457600080600093509350935050611db5565b60006064611ba38360c461446c565b611bad9190614483565b905060006064611bbe84600261446c565b611bc89190614483565b905060006064611bd985600161446c565b611be39190614483565b9050611bf261dead8a85612bb7565b506012546001600160a01b031615801590611c785750601254604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa158015611c52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c769190614425565b115b15611cfb57601254611c979061dead906001600160a01b031684612bb7565b50601254604051633243c79160e01b8152600481018490526001600160a01b0390911690633243c79190602401600060405180830381600087803b158015611cde57600080fd5b505af1158015611cf2573d6000803e3d6000fd5b50505050611d0a565b611d0861dead8084612bb7565b505b600080611d156110c4565b90508a838215611da65760005b601854811015611da4576001600160a01b0380841660009081526015602052604081205490911690819003611d56575061dead5b8460188381548110611d6a57611d6a6142c8565b906000526020600020015484611d80919061446c565b611d8a9190614483565b9550611d9961dead8288612bb7565b509250600101611d22565b505b50959850939650919450505050505b9250925092565b60606002805461102a90614294565b611dd3612259565b600e5415611e125760405162461bcd60e51b815260206004820152600c60248201526b0737461727465644164644c560a41b6044820152606401610d10565b42600e55565b60006110ba3384846122e8565b600080600080849050600080826001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611e6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9391906144bc565b506001600160701b031691506001600160701b031691506000306001600160a01b0316846001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ef4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f189190614501565b6001600160a01b031614611f8d57836001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f889190614501565b611fef565b836001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fef9190614501565b9050306001600160a01b038216101561200d57829650819550612014565b8196508295505b6040516370a0823160e01b81526001600160a01b0389811660048301528216906370a0823190602401602060405180830381865afa15801561205a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207e9190614425565b96989597505050505050565b612092612259565b8067ffffffffffffffff8111156120ab576120ab61410f565b6040519080825280602002602001820160405280156120d4578160200160208202803683370190505b5080516120e991601891602090910190613eb4565b5060005b8181101561213557828282818110612107576121076142c8565b9050602002013560188281548110612121576121216142c8565b6000918252602090912001556001016120ed565b50600a54600c54600b5461214b90612710614307565b6121559190614307565b61215f9190614307565b6121676110c4565b11156121c65760405162461bcd60e51b815260206004820152602860248201527f696e7669746f72207265776172642070657263656e74206c697374206973206e6044820152671bdd081d985b1a5960c21b6064820152608401610d10565b5050565b6121d2612259565b6001600160a01b0381166121fc57604051631e4fbdf760e01b815260006004820152602401610d10565b61152381612b67565b61220d612259565b6000600d54116122525760405162461bcd60e51b815260206004820152601060248201526f30b63932b0b23c9039b43aba3237bbb760811b6044820152606401610d10565b6000600d55565b6000546001600160a01b03163314611ac85760405163118cdaa760e01b8152336004820152602401610d10565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60115460ff16156122fe57611595838383612bb7565b6001600160a01b0383166000908152600560205260409020548181101561235a5760405162461bcd60e51b815260206004820152601060248201526f0c4c2d8c2dcc6ca9cdee88adcdeeaced60831b6044820152606401610d10565b6001600160a01b03831661dead14801561238d57506001600160a01b03841660009081526007602052604090205460ff16155b801561239857503332145b156125e5576014546001600160a01b03166123e45760405162461bcd60e51b815260206004820152600c60248201526b1c1bdbdb081b9bdd081cd95d60a21b6044820152606401610d10565b7f00000000000000000000000000000000000000000000000000000000000000008211156124485760405162461bcd60e51b8152602060048201526011602482015270195e18d95959081b585e08185b5bdd5b9d607a1b6044820152606401610d10565b601460009054906101000a90046001600160a01b03166001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561249b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124bf9190614408565b156124d8576124d18461dead84612bb7565b5050505050565b6014546040516352b5677b60e11b81526001600160a01b038681166004830152602482018590529091169063a56acef690604401600060405180830381600087803b15801561252657600080fd5b505af115801561253a573d6000803e3d6000fd5b50505050601460009054906101000a90046001600160a01b03166001600160a01b031663e94eec966040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561258e57600080fd5b505af192505050801561259f575060015b6125d857604051600181527f83644ada0485c363aadd15d858d1380165d61512d4c2af82d8d579e89ec2ab019060200160405180910390a15b6124d18461dead84612bb7565b60008060008060006125f8898989612c6c565b9150915060008211801561262557506001600160a01b03891660009081526007602052604090205460ff16155b1561286b576001600160a01b03891660009081526013602052604090206001935061264e612d03565b6126dc578281600001600082825461266691906142f4565b909155505080547f713fc98c9fc53e66529bdd40e935eefc27a2d627f8ae82dac3d128b5dccecd5c908b9061269c908690614307565b60018401548454604080516001600160a01b03959095168552602085019390935283830182905260608401526080830152519081900360a00190a1612768565b828160010160008282546126f091906142f4565b9091555050805460018201547f713fc98c9fc53e66529bdd40e935eefc27a2d627f8ae82dac3d128b5dccecd5c918c9161272b908790614307565b84546001860154604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a00160405180910390a15b6000612773896112ab565b90506000600f541180156127895750600f548110155b1561281957601254825460018401546001600160a01b039092169163e30443bc918e916127b691906142f4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156127fc57600080fd5b505af1158015612810573d6000803e3d6000fd5b50505050612868565b8a6001600160a01b03167f2daa35b4ade993bf8c92c47c739178641b6b98a6cf0609273b16395d5e4623b682600f5460405161285f929190918252602082015260400190565b60405180910390a25b50505b801561287657600193505b6001600160a01b03891660009081526007602052604081205460ff16806128b557506001600160a01b03891660009081526007602052604090205460ff165b6001600160a01b038b166000908152600860205260408120549192509060ff16806128f857506001600160a01b038a1660009081526008602052604090205460ff165b9050612902612d03565b6129805781158015612912575080155b156129805760196001600160a01b038b163b11156129805760405162461bcd60e51b815260206004820152602560248201527f63616e277420616464206f74686572206c70206265666f726520737461727420604482015264747261646560d81b6064820152608401610d10565b80801561298b575081155b15612a5857612998612d03565b6129ea576000600e541180156129ab5750845b6129ea5760405162461bcd60e51b815260206004820152601060248201526f1b1c0818d85b9d08189948185919195960821b6044820152606401610d10565b84158015612a1057506001600160a01b038a1660009081526008602052604090205460ff165b15612a42576001600160a01b038b166000908152600560205260409020548903612a4257612a3f60018a614307565b98505b84158015612a4e575085155b15612a5857600196505b612a698b8b8b8a85158a8c8a612d1d565b60115460ff16158015612a795750805b15612b5a576010546011805460ff191660011790556012546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015612af8575060408051601f3d908101601f19168201909252612af59181019061443e565b60015b15612b4e5760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b506011805460ff191690555b5050505050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038316600090815260056020526040812080548391908390612be1908490614307565b90915550506001600160a01b03831660009081526005602052604081208054849290612c0e9084906142f4565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612c5a91815260200190565b60405180910390a35060019392505050565b6001600160a01b038216600090815260086020526040812054819060ff168015612ca557503360009081526009602052604090205460ff165b8015612cb957506001600160a01b03851632145b15612ccd5782612cc985826137cb565b9250505b6001600160a01b03851660009081526008602052604090205460ff1615612cfb57612cf8858461385a565b90505b935093915050565b600080600d54118015612d185750600d544210155b905090565b6001600160a01b03881660009081526005602052604081208054889290612d45908490614307565b90915550600090508515612f7a576001600160a01b03891660009081526008602052604090205460ff1680612d9257506001600160a01b03881660009081526008602052604090205460ff165b15612e05576001600160a01b03891660009081526008602052604081205460ff1615612dbf575087612dc2565b50885b6000612dcc6110c4565b90506000612710612ddd838c61446c565b612de79190614483565b9050612df381856142f4565b9350612e018c828585613972565b5050505b6001600160a01b03881660009081526008602052604081205460ff16908115612e315750600c54612e36565b50600b545b6000612710612e45838c61446c565b612e4f9190614483565b90508015612f7657612e6181856142f4565b6012549094506001600160a01b031615801590612ee95750601254604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa158015612ec3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee79190614425565b115b15612f6957601254612f06908d906001600160a01b031683613a07565b601254604051633243c79160e01b8152600481018390526001600160a01b0390911690633243c79190602401600060405180830381600087803b158015612f4c57600080fd5b505af1158015612f60573d6000803e3d6000fd5b50505050612f76565b612f768c61dead83613a07565b5050505b841561323257888860196001600160a01b0382163b1115612fd7576040516001600160a01b03821681527f8b44836fbe611fd088e1d7aad8db1283cacca11ba574d9ee965317a7de186557906020015b60405180910390a161322f565b60196001600160a01b0383163b1115613023576040516001600160a01b03831681527f8b44836fbe611fd088e1d7aad8db1283cacca11ba574d9ee965317a7de18655790602001612fca565b6001600160a01b038082166000908152601560205260409020541615801561304b5750600089115b80156130695750806001600160a01b0316826001600160a01b031614155b801561308e57506001600160a01b03811660009081526007602052604090205460ff16155b156130f8576001600160a01b03828116600081815260176020908152604080832094861680845294825291829020805460ff1916600117905590514281527f09e08c6f7101ba4fa7ea28d5d997b087fdf9b8818b9859b40a1e6a28c6d2837d910160405180910390a35b6001600160a01b03808316600090815260156020526040902054161580156131205750600089115b801561313e5750806001600160a01b0316826001600160a01b031614155b1561322f576001600160a01b0380821660009081526017602090815260408083209386168352929052205460ff16801561318e57506001600160a01b038216600090815260166020526040902054155b1561322f576001600160a01b0381161561322f576001600160a01b03828116600081815260156020908152604080832080546001600160a01b0319908116968816968717909155858452601683528184208054600181018255908552938390209093018054909316841790925590514281529192917fa8c50a298b4200fd02e706cf001585af8f63488dbd1a4e0e676ea02770a2e0f6910160405180910390a35b50505b6001600160a01b03891660009081526007602052604081205460ff168061327157506001600160a01b03891660009081526007602052604090205460ff165b905085801561327e575080155b15613443576000612710600a548a613296919061446c565b6132a09190614483565b9050801561344157600060196001600160a01b038d163b11156132c45750896132c7565b508a5b60006132d16110c4565b90506132dd83866142f4565b94506132f58d6132ee600386614483565b8484613972565b6012546001600160a01b03161580159061337a5750601254604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa158015613354573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133789190614425565b115b1561342a576012546133ad908e906001600160a01b0316600361339e87600261446c565b6133a89190614483565b613a07565b6012546001600160a01b0316633243c79160036133cb86600261446c565b6133d59190614483565b6040518263ffffffff1660e01b81526004016133f391815260200190565b600060405180830381600087803b15801561340d57600080fd5b505af1158015613421573d6000803e3d6000fd5b5050505061343e565b61343e8d61dead600361339e87600261446c565b50505b505b84801561344e575080155b5083801561345a575080155b15613711576001600160a01b038916600090815260136020526040812090613480612d03565b80156134b857507f0000000000000000000000000000000000000000000000000000000000000000600d546134b591906142f4565b42105b90508482600001541061351857848260000160008282546134d99190614307565b9091555060009050816134ed5760006134f7565b6134f7858c614307565b905061350381866142f4565b94506135128d61dead83613a07565b5061362b565b6000858b846000015461352b919061446c565b6135359190614483565b90508180156135445750600081115b1561357b57600061355e613558878e614307565b83611aca565b905061356a81876142f4565b95506135798e61dead83613a07565b505b82546135879087614307565b83600101600082825461359a9190614307565b909155505060008084556127107f0000000000000000000000000000000000000000000000000000000000000000846135d45760006135d6565b835b6135e0908f614307565b6135ea919061446c565b6135f49190614483565b9050801561362857600061360b613558888f614307565b905061361781886142f4565b96506136268f61dead83613a07565b505b50505b601254825460018401546001600160a01b039092169163e30443bc918e9161365391906142f4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561369957600080fd5b505af11580156136ad573d6000803e3d6000fd5b5050835460018501546040517fa1834d8fa1841c73173644b37f823b4f45c2bc3da2343961c141f5559f0d1aa8945061370693508f9291906001600160a01b039390931683526020830191909152604082015260600190565b60405180910390a150505b6137208a8a6133a8858c614307565b806137bf57601460009054906101000a90046001600160a01b03166001600160a01b031663fe9ac4156040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561377557600080fd5b505af1925050508015613786575060015b6137bf57604051600281527f83644ada0485c363aadd15d858d1380165d61512d4c2af82d8d579e89ec2ab019060200160405180910390a15b50505050505050505050565b6000806000806137da86611e25565b925092509250600080841180156137f15750600083115b1561380e5782613801858861446c565b61380b9190614483565b90505b61381881856142f4565b606261382584606461446c565b61382f9190614483565b61383a9060036142f4565b106138505761384c8783888787613a7b565b5094505b5050505092915050565b60008060008061386986611e25565b92509250925082811161391d5784613896876001600160a01b031660009081526005602052604090205490565b6138a09190614307565b866001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139029190614425565b61390c908761446c565b6139169190614483565b9350613969565b6000808411801561392e5750600083115b156138505761393d8684614307565b613947858861446c565b6139519190614483565b905061395d84826142f4565b82101561385057600080fd5b50505092915050565b81600082156139ff5760005b6018548110156139fd576001600160a01b03808416600090815260156020526040812054909116908190036139b2575061dead5b84601883815481106139c6576139c66142c8565b9060005260206000200154886139dc919061446c565b6139e69190614483565b92506139f3888285613a07565b925060010161397e565b505b505050505050565b6001600160a01b03821660009081526005602052604081208054839290613a2f9084906142f4565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516122db91815260200190565b6000806000876001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613abe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ae29190614425565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015613b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b689190614501565b6001600160a01b031663017e7e586040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ba5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bc99190614501565b90506000806001600160a01b0316826001600160a01b03161415905060008a6001600160a01b0316637464fc3d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c499190614425565b90508115613dcd578015613dcd576000613c6b613c66898b61446c565b613e4a565b90506000613c7883613e4a565b905080821115613dca576000807310ed43c718714eb63d5aa57b78b54704e256024d197f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031601613d1257613cd48385614307565b613cde908961446c565b613ce990600861446c565b9150613cf683600861446c565b613d0185601161446c565b613d0b91906142f4565b9050613da8565b73d99d1c33f9fc3444f8101754abc46c52416550d0197f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031601613d7957613d618385614307565b613d6b908961446c565b915082613d0185600361446c565b613d838385614307565b613d8d908961446c565b915082613d9b85600561446c565b613da591906142f4565b90505b613db28183614483565b98508815613dc757613dc489896142f4565b97505b50505b50505b6000613dd9898c614307565b905084600003613e0b578015613e06576103e8613df9613c668c8461446c565b613e039190614307565b96505b613e3b565b613e3889613e19878461446c565b613e239190614483565b89613e2e888e61446c565b6109569190614483565b96505b50505050509550959350505050565b60006003821115613ea55750806000613e64600283614483565b613e6f9060016142f4565b90505b8181101561110757905080600281613e8a8186614483565b613e9491906142f4565b613e9e9190614483565b9050613e72565b8115613eaf575060015b919050565b828054828255906000526020600020908101928215613eef579160200282015b82811115613eef578251825591602001919060010190613ed4565b50613efb929150613eff565b5090565b5b80821115613efb5760008155600101613f00565b6001600160a01b038116811461152357600080fd5b600060208284031215613f3b57600080fd5b8135611adb81613f14565b602081526000825180602084015260005b81811015613f745760208186018101516040868401015201613f57565b506000604082850101526040601f19601f83011684010191505092915050565b60008060408385031215613fa757600080fd5b8235613fb281613f14565b946020939093013593505050565b600060208284031215613fd257600080fd5b5035919050565b600080600060608486031215613fee57600080fd5b8335613ff981613f14565b9250602084013561400981613f14565b929592945050506040919091013590565b6000806040838503121561402d57600080fd5b823561403881613f14565b9150602083013561404881613f14565b809150509250929050565b60008083601f84011261406557600080fd5b50813567ffffffffffffffff81111561407d57600080fd5b6020830191508360208260051b850101111561409857600080fd5b9250929050565b801515811461152357600080fd5b8035613eaf8161409f565b6000806000604084860312156140cd57600080fd5b833567ffffffffffffffff8111156140e457600080fd5b6140f086828701614053565b90945092505060208401356141048161409f565b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561414e5761414e61410f565b604052919050565b600067ffffffffffffffff8211156141705761417061410f565b5060051b60200190565b6000806040838503121561418d57600080fd5b823567ffffffffffffffff8111156141a457600080fd5b8301601f810185136141b557600080fd5b80356141c86141c382614156565b614125565b8082825260208201915060208360051b8501019250878311156141ea57600080fd5b6020840193505b8284101561421557833561420481613f14565b8252602093840193909101906141f1565b945061422792505050602084016140ad565b90509250929050565b6000806040838503121561424357600080fd5b50508035926020909101359150565b6000806020838503121561426557600080fd5b823567ffffffffffffffff81111561427c57600080fd5b61428885828601614053565b90969095509350505050565b600181811c908216806142a857607f821691505b60208210810361110757634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b808201808211156110be576110be6142de565b818103818111156110be576110be6142de565b6000604082018483526040602084015280845180835260608501915060208601925060005b818110156143665783516001600160a01b031683526020938401939092019160010161433f565b50909695505050505050565b60006020828403121561438457600080fd5b815167ffffffffffffffff81111561439b57600080fd5b8201601f810184136143ac57600080fd5b80516143ba6141c382614156565b8082825260208201915060208360051b8501019250868311156143dc57600080fd5b6020840193505b828410156143fe5783518252602093840193909101906143e3565b9695505050505050565b60006020828403121561441a57600080fd5b8151611adb8161409f565b60006020828403121561443757600080fd5b5051919050565b60008060006060848603121561445357600080fd5b5050815160208301516040909301519094929350919050565b80820281158282048414176110be576110be6142de565b6000826144a057634e487b7160e01b600052601260045260246000fd5b500490565b80516001600160701b0381168114613eaf57600080fd5b6000806000606084860312156144d157600080fd5b6144da846144a5565b92506144e8602085016144a5565b9150604084015163ffffffff8116811461410457600080fd5b60006020828403121561451357600080fd5b8151611adb81613f1456fea264697066735822122081a1ad374489de477b13e2f96db8216a51ff8c003acf0f8c91db6d64ba9d431c64736f6c634300081b0033608060405234801561001057600080fd5b5060405161022f38038061022f83398101604081905261002f91610161565b61003c8133600019610042565b506101e2565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b179052915160009283929087169161009e9190610191565b6000604051808303816000865af19150503d80600081146100db576040519150601f19603f3d011682016040523d82523d6000602084013e6100e0565b606091505b509150915081801561010a57508051158061010a57508080602001905181019061010a91906101c0565b61015a5760405162461bcd60e51b815260206004820152601e60248201527f5472616e7366657248656c7065723a20415050524f56455f4641494c45440000604482015260640160405180910390fd5b5050505050565b60006020828403121561017357600080fd5b81516001600160a01b038116811461018a57600080fd5b9392505050565b6000825160005b818110156101b25760208186018101518583015201610198565b506000920191825250919050565b6000602082840312156101d257600080fd5b8151801515811461018a57600080fd5b603f806101f06000396000f3fe6080604052600080fdfea2646970667358221220bae21208190281d54f4a3cdf76e37e171cc0623a4b6204748b746f41c1a8d64264736f6c634300081b0033

Deployed Bytecode

0x6080604052600436106103bc5760003560e01c80635a1fe42f116101f2578063992db38f1161010d578063b5028e23116100a0578063dd62ed3e1161006f578063dd62ed3e14610c3c578063de0aad5314610c82578063f2fde38b14610c98578063fc0e74d114610cb857600080fd5b8063b5028e2314610b7e578063bfc3137e14610b9e578063c31c9c0714610bd2578063ccdbd42414610c0657600080fd5b8063a9059cbb116100dc578063a9059cbb14610af4578063ac0c850814610b14578063acb2ad6f14610b48578063b340364f14610b5e57600080fd5b8063992db38f14610a655780639ab4a44514610a7a5780639c1b8af514610aae578063a1bc910f14610ac457600080fd5b8063715018a61161018557806386b0e8051161015457806386b0e805146109ca5780638da5cb5b146109fe5780639145b1c414610a1c57806395d89b4114610a5057600080fd5b8063715018a6146109265780637ae2b5c71461093b578063847164851461095b578063850ea0da1461098f57600080fd5b80636386c1c7116101c15780636386c1c7146108475780636f17d61114610887578063700bb191146108d057806370a08231146108f057600080fd5b80635a1fe42f146107c15780635b1d8067146107e15780635c25c30e146107f75780635c9a05b81461081757600080fd5b80632e8474d5116102e25780634e6fd6c411610275578063538ba4f911610244578063538ba4f91461074c57806358877f611461076157806358c3dd2b146107815780635960e46d146107a157600080fd5b80634e6fd6c4146106bd5780634e71d92d146106d35780634f0e0ef3146106e85780635342acb41461071c57600080fd5b8063395a81e7116102b1578063395a81e7146106345780634437152a14610668578063474b46d8146106885780634b656b241461069d57600080fd5b80632e8474d5146105a2578063302fa653146105b7578063313ce567146105f2578063324cd3c91461061457600080fd5b806315bfa3c61161035a57806318d128551161032957806318d128551461052d578063214b20de1461054257806323b872dd146105625780632c1f52161461058257600080fd5b806315bfa3c6146104a557806316f0115b146104bb57806318160ddd146104f357806318a6bc321461050857600080fd5b806306fdde031161039657806306fdde0314610428578063095ea7b31461044a5780630b4575571461047a5780630cfe2f3f1461048f57600080fd5b806301339c21146103c8578063017df7f2146103df57806306b16e94146103ff57600080fd5b366103c357005b600080fd5b3480156103d457600080fd5b506103dd610ccd565b005b3480156103eb57600080fd5b506103dd6103fa366004613f29565b610d1f565b34801561040b57600080fd5b50610415600d5481565b6040519081526020015b60405180910390f35b34801561043457600080fd5b5061043d61101b565b60405161041f9190613f46565b34801561045657600080fd5b5061046a610465366004613f94565b6110ad565b604051901515815260200161041f565b34801561048657600080fd5b506104156110c4565b34801561049b57600080fd5b50610415600b5481565b3480156104b157600080fd5b50610415600f5481565b3480156104c757600080fd5b506014546104db906001600160a01b031681565b6040516001600160a01b03909116815260200161041f565b3480156104ff57600080fd5b50600454610415565b34801561051457600080fd5b506011546104db9061010090046001600160a01b031681565b34801561053957600080fd5b506103dd61110d565b34801561054e57600080fd5b506103dd61055d366004613fc0565b61111c565b34801561056e57600080fd5b5061046a61057d366004613fd9565b611129565b34801561058e57600080fd5b506012546104db906001600160a01b031681565b3480156105ae57600080fd5b5061046a600181565b3480156105c357600080fd5b5061046a6105d236600461401a565b601760209081526000928352604080842090915290825290205460ff1681565b3480156105fe57600080fd5b5060035460405160ff909116815260200161041f565b34801561062057600080fd5b506103dd61062f366004613fc0565b6111c0565b34801561064057600080fd5b506104db7f0000000000000000000000007aaaa5b10f97321345acd76945083141be1c563181565b34801561067457600080fd5b506103dd610683366004613f29565b611235565b34801561069457600080fd5b50601854610415565b3480156106a957600080fd5b506104156106b8366004613fc0565b6112ab565b3480156106c957600080fd5b506104db61dead81565b3480156106df57600080fd5b506103dd6114ae565b3480156106f457600080fd5b506104db7f000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c81565b34801561072857600080fd5b5061046a610737366004613f29565b60076020526000908152604090205460ff1681565b34801561075857600080fd5b506104db600081565b34801561076d57600080fd5b506103dd61077c3660046140b8565b611526565b34801561078d57600080fd5b5061041561079c366004613fc0565b61159b565b3480156107ad57600080fd5b506103dd6107bc366004613fc0565b6115bc565b3480156107cd57600080fd5b506103dd6107dc36600461417a565b611649565b3480156107ed57600080fd5b50610415600e5481565b34801561080357600080fd5b506104db610812366004613f94565b6118e0565b34801561082357600080fd5b5061046a610832366004613f29565b60086020526000908152604090205460ff1681565b34801561085357600080fd5b50610867610862366004613f29565b611918565b60408051948552602085019390935291830152606082015260800161041f565b34801561089357600080fd5b506108bb6108a2366004613f29565b6013602052600090815260409020805460019091015482565b6040805192835260208301919091520161041f565b3480156108dc57600080fd5b506103dd6108eb366004613fc0565b6119e4565b3480156108fc57600080fd5b5061041561090b366004613f29565b6001600160a01b031660009081526005602052604090205490565b34801561093257600080fd5b506103dd611ab6565b34801561094757600080fd5b50610415610956366004614230565b611aca565b34801561096757600080fd5b506104db7f0000000000000000000000003e2ef19ae4211c8808305306e84de715c636a13781565b34801561099b57600080fd5b506109af6109aa366004613f94565b611ae2565b6040805193845260208401929092529082015260600161041f565b3480156109d657600080fd5b506104157f0000000000000000000000000000000000000000000000000de0b6b3a764000081565b348015610a0a57600080fd5b506000546001600160a01b03166104db565b348015610a2857600080fd5b506104db7f0000000000000000000000007aaaa5b10f97321345acd76945083141be1c563181565b348015610a5c57600080fd5b5061043d611dbc565b348015610a7157600080fd5b506103dd611dcb565b348015610a8657600080fd5b506104db7f00000000000000000000000055d398326f99059ff775485246999027b319795581565b348015610aba57600080fd5b5061041560105481565b348015610ad057600080fd5b5061046a610adf366004613f29565b60096020526000908152604090205460ff1681565b348015610b0057600080fd5b5061046a610b0f366004613f94565b611e18565b348015610b2057600080fd5b506104157f000000000000000000000000000000000000000000000000000007dba8202e8081565b348015610b5457600080fd5b50610415600a5481565b348015610b6a57600080fd5b506109af610b79366004613f29565b611e25565b348015610b8a57600080fd5b506103dd610b99366004614252565b61208a565b348015610baa57600080fd5b506104157f000000000000000000000000000000000000000000000000000000000000271081565b348015610bde57600080fd5b506104db7f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e81565b348015610c1257600080fd5b506104db610c21366004613f29565b6015602052600090815260409020546001600160a01b031681565b348015610c4857600080fd5b50610415610c5736600461401a565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b348015610c8e57600080fd5b50610415600c5481565b348015610ca457600080fd5b506103dd610cb3366004613f29565b6121ca565b348015610cc457600080fd5b506103dd612205565b610cd5612259565b600d5415610d195760405162461bcd60e51b815260206004820152600c60248201526b30b63932b0b23c9037b832b760a11b60448201526064015b60405180910390fd5b42600d55565b610d27612259565b6012546001600160a01b031615610d8c5760405162461bcd60e51b815260206004820152602360248201527f6469766964656e64547261636b657220616c726561647920696e697469616c696044820152621e995960ea1b6064820152608401610d10565b601280546001600160a01b0319166001600160a01b03831690811790915560405163031e79db60e41b8152600481018290526331e79db090602401600060405180830381600087803b158015610de157600080fd5b505af1158015610df5573d6000803e3d6000fd5b505060125460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015610e3e57600080fd5b505af1158015610e52573d6000803e3d6000fd5b505060125460405163031e79db60e41b8152600060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015610e9c57600080fd5b505af1158015610eb0573d6000803e3d6000fd5b505060125460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015610efb57600080fd5b505af1158015610f0f573d6000803e3d6000fd5b505060125460405163031e79db60e41b81526001600160a01b037f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e8116600483015290911692506331e79db09150602401600060405180830381600087803b158015610f7a57600080fd5b505af1158015610f8e573d6000803e3d6000fd5b505060125460405163031e79db60e41b81526001600160a01b037f0000000000000000000000003e2ef19ae4211c8808305306e84de715c636a1378116600483015290911692506331e79db09150602401600060405180830381600087803b158015610ff957600080fd5b505af115801561100d573d6000803e3d6000fd5b50506207a120601055505050565b60606001805461102a90614294565b80601f016020809104026020016040519081016040528092919081815260200182805461105690614294565b80156110a35780601f10611078576101008083540402835291602001916110a3565b820191906000526020600020905b81548152906001019060200180831161108657829003601f168201915b5050505050905090565b60006110ba338484612286565b5060015b92915050565b60008060005b60185481101561110757601881815481106110e7576110e76142c8565b9060005260206000200154826110fd91906142f4565b91506001016110ca565b50919050565b611115612259565b6000600e55565b611124612259565b600f55565b60006111368484846122e8565b6001600160a01b0384166000908152600660209081526040808320338452909152902054600019146111b6576001600160a01b0384166000908152600660209081526040808320338452909152902054611191908390614307565b6001600160a01b03851660009081526006602090815260408083203384529091529020555b5060019392505050565b6111c8612259565b4281116112305760405162461bcd60e51b815260206004820152603060248201527f6e65772076616c7565206d7573742062652067726561746572207468616e206360448201526f0757272656e742074696d657374616d760841b6064820152608401610d10565b600d55565b61123d612259565b6014546001600160a01b0316156112895760405162461bcd60e51b815260206004820152601060248201526f1c1bdbdb08185b1c9958591e481cd95d60821b6044820152606401610d10565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b60408051600480825260a082019092526000918291906020820160808036833701905050905030816000815181106112e5576112e56142c8565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007aaaa5b10f97321345acd76945083141be1c563181600181518110611339576113396142c8565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c8160028151811061138d5761138d6142c8565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000055d398326f99059ff775485246999027b3197955816003815181106113e1576113e16142c8565b6001600160a01b03928316602091820292909201015260405163d06ca61f60e01b81527f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e9091169063d06ca61f9061143f908690859060040161431a565b600060405180830381865afa92505050801561147d57506040513d6000823e601f3d908101601f1916820160405261147a9190810190614372565b60015b61148a5750600092915050565b8060038151811061149d5761149d6142c8565b602002602001015192505050919050565b60125460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af11580156114ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115239190614408565b50565b61152e612259565b60005b82811015611595578160076000868685818110611550576115506142c8565b90506020020160208101906115659190613f29565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600101611531565b50505050565b601881815481106115ab57600080fd5b600091825260209091200154905081565b6115c4612259565b620493e081101580156115da5750621e84808111155b6116445760405162461bcd60e51b815260206004820152603560248201527f67617320666f722070726f63657373696e67206d7573742062652062657477656044820152740656e2033303030303020616e64203230303030303605c1b6064820152608401610d10565b601055565b611651612259565b6000805b83518110156115955760136000858381518110611674576116746142c8565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000209150821561176b577f0000000000000000000000003e2ef19ae4211c8808305306e84de715c636a1376001600160a01b03166370a082318583815181106116e5576116e56142c8565b60200260200101516040518263ffffffff1660e01b815260040161171891906001600160a01b0391909116815260200190565b602060405180830381865afa158015611735573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117599190614425565b6117649060016142f4565b8255611831565b7f0000000000000000000000003e2ef19ae4211c8808305306e84de715c636a1376001600160a01b03166370a082318583815181106117ac576117ac6142c8565b60200260200101516040518263ffffffff1660e01b81526004016117df91906001600160a01b0391909116815260200190565b602060405180830381865afa1580156117fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118209190614425565b61182b9060016142f4565b60018301555b60125484516001600160a01b039091169063e30443bc9086908490811061185a5761185a6142c8565b60200260200101518460000154856001015461187691906142f4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156118bc57600080fd5b505af11580156118d0573d6000803e3d6000fd5b5050600190920191506116559050565b601660205281600052604060002081815481106118fc57600080fd5b6000918252602090912001546001600160a01b03169150829050565b6040516370a0823160e01b81526001600160a01b0382811660048301526000918291829182917f0000000000000000000000003e2ef19ae4211c8808305306e84de715c636a13716906370a0823190602401602060405180830381865afa158015611987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ab9190614425565b6001600160a01b038616600090815260136020526040902060018101549054919550925090506119db81836142f4565b92509193509193565b6012546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611a37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5b919061443e565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b611abe612259565b611ac86000612b67565b565b6000818310611ad95781611adb565b825b9392505050565b601454600090819081906001600160a01b03163314611b435760405162461bcd60e51b815260206004820181905260248201527f4f6e6c7920706f6f6c2063616e2063616c6c20746869732066756e6374696f6e6044820152606401610d10565b61dead60005260056020527f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba548490611b7d82600261446c565b1115611b9457600080600093509350935050611db5565b60006064611ba38360c461446c565b611bad9190614483565b905060006064611bbe84600261446c565b611bc89190614483565b905060006064611bd985600161446c565b611be39190614483565b9050611bf261dead8a85612bb7565b506012546001600160a01b031615801590611c785750601254604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa158015611c52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c769190614425565b115b15611cfb57601254611c979061dead906001600160a01b031684612bb7565b50601254604051633243c79160e01b8152600481018490526001600160a01b0390911690633243c79190602401600060405180830381600087803b158015611cde57600080fd5b505af1158015611cf2573d6000803e3d6000fd5b50505050611d0a565b611d0861dead8084612bb7565b505b600080611d156110c4565b90508a838215611da65760005b601854811015611da4576001600160a01b0380841660009081526015602052604081205490911690819003611d56575061dead5b8460188381548110611d6a57611d6a6142c8565b906000526020600020015484611d80919061446c565b611d8a9190614483565b9550611d9961dead8288612bb7565b509250600101611d22565b505b50959850939650919450505050505b9250925092565b60606002805461102a90614294565b611dd3612259565b600e5415611e125760405162461bcd60e51b815260206004820152600c60248201526b0737461727465644164644c560a41b6044820152606401610d10565b42600e55565b60006110ba3384846122e8565b600080600080849050600080826001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611e6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9391906144bc565b506001600160701b031691506001600160701b031691506000306001600160a01b0316846001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ef4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f189190614501565b6001600160a01b031614611f8d57836001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f889190614501565b611fef565b836001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fef9190614501565b9050306001600160a01b038216101561200d57829650819550612014565b8196508295505b6040516370a0823160e01b81526001600160a01b0389811660048301528216906370a0823190602401602060405180830381865afa15801561205a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207e9190614425565b96989597505050505050565b612092612259565b8067ffffffffffffffff8111156120ab576120ab61410f565b6040519080825280602002602001820160405280156120d4578160200160208202803683370190505b5080516120e991601891602090910190613eb4565b5060005b8181101561213557828282818110612107576121076142c8565b9050602002013560188281548110612121576121216142c8565b6000918252602090912001556001016120ed565b50600a54600c54600b5461214b90612710614307565b6121559190614307565b61215f9190614307565b6121676110c4565b11156121c65760405162461bcd60e51b815260206004820152602860248201527f696e7669746f72207265776172642070657263656e74206c697374206973206e6044820152671bdd081d985b1a5960c21b6064820152608401610d10565b5050565b6121d2612259565b6001600160a01b0381166121fc57604051631e4fbdf760e01b815260006004820152602401610d10565b61152381612b67565b61220d612259565b6000600d54116122525760405162461bcd60e51b815260206004820152601060248201526f30b63932b0b23c9039b43aba3237bbb760811b6044820152606401610d10565b6000600d55565b6000546001600160a01b03163314611ac85760405163118cdaa760e01b8152336004820152602401610d10565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60115460ff16156122fe57611595838383612bb7565b6001600160a01b0383166000908152600560205260409020548181101561235a5760405162461bcd60e51b815260206004820152601060248201526f0c4c2d8c2dcc6ca9cdee88adcdeeaced60831b6044820152606401610d10565b6001600160a01b03831661dead14801561238d57506001600160a01b03841660009081526007602052604090205460ff16155b801561239857503332145b156125e5576014546001600160a01b03166123e45760405162461bcd60e51b815260206004820152600c60248201526b1c1bdbdb081b9bdd081cd95d60a21b6044820152606401610d10565b7f0000000000000000000000000000000000000000000000000de0b6b3a76400008211156124485760405162461bcd60e51b8152602060048201526011602482015270195e18d95959081b585e08185b5bdd5b9d607a1b6044820152606401610d10565b601460009054906101000a90046001600160a01b03166001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561249b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124bf9190614408565b156124d8576124d18461dead84612bb7565b5050505050565b6014546040516352b5677b60e11b81526001600160a01b038681166004830152602482018590529091169063a56acef690604401600060405180830381600087803b15801561252657600080fd5b505af115801561253a573d6000803e3d6000fd5b50505050601460009054906101000a90046001600160a01b03166001600160a01b031663e94eec966040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561258e57600080fd5b505af192505050801561259f575060015b6125d857604051600181527f83644ada0485c363aadd15d858d1380165d61512d4c2af82d8d579e89ec2ab019060200160405180910390a15b6124d18461dead84612bb7565b60008060008060006125f8898989612c6c565b9150915060008211801561262557506001600160a01b03891660009081526007602052604090205460ff16155b1561286b576001600160a01b03891660009081526013602052604090206001935061264e612d03565b6126dc578281600001600082825461266691906142f4565b909155505080547f713fc98c9fc53e66529bdd40e935eefc27a2d627f8ae82dac3d128b5dccecd5c908b9061269c908690614307565b60018401548454604080516001600160a01b03959095168552602085019390935283830182905260608401526080830152519081900360a00190a1612768565b828160010160008282546126f091906142f4565b9091555050805460018201547f713fc98c9fc53e66529bdd40e935eefc27a2d627f8ae82dac3d128b5dccecd5c918c9161272b908790614307565b84546001860154604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a00160405180910390a15b6000612773896112ab565b90506000600f541180156127895750600f548110155b1561281957601254825460018401546001600160a01b039092169163e30443bc918e916127b691906142f4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156127fc57600080fd5b505af1158015612810573d6000803e3d6000fd5b50505050612868565b8a6001600160a01b03167f2daa35b4ade993bf8c92c47c739178641b6b98a6cf0609273b16395d5e4623b682600f5460405161285f929190918252602082015260400190565b60405180910390a25b50505b801561287657600193505b6001600160a01b03891660009081526007602052604081205460ff16806128b557506001600160a01b03891660009081526007602052604090205460ff165b6001600160a01b038b166000908152600860205260408120549192509060ff16806128f857506001600160a01b038a1660009081526008602052604090205460ff165b9050612902612d03565b6129805781158015612912575080155b156129805760196001600160a01b038b163b11156129805760405162461bcd60e51b815260206004820152602560248201527f63616e277420616464206f74686572206c70206265666f726520737461727420604482015264747261646560d81b6064820152608401610d10565b80801561298b575081155b15612a5857612998612d03565b6129ea576000600e541180156129ab5750845b6129ea5760405162461bcd60e51b815260206004820152601060248201526f1b1c0818d85b9d08189948185919195960821b6044820152606401610d10565b84158015612a1057506001600160a01b038a1660009081526008602052604090205460ff165b15612a42576001600160a01b038b166000908152600560205260409020548903612a4257612a3f60018a614307565b98505b84158015612a4e575085155b15612a5857600196505b612a698b8b8b8a85158a8c8a612d1d565b60115460ff16158015612a795750805b15612b5a576010546011805460ff191660011790556012546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015612af8575060408051601f3d908101601f19168201909252612af59181019061443e565b60015b15612b4e5760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b506011805460ff191690555b5050505050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038316600090815260056020526040812080548391908390612be1908490614307565b90915550506001600160a01b03831660009081526005602052604081208054849290612c0e9084906142f4565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612c5a91815260200190565b60405180910390a35060019392505050565b6001600160a01b038216600090815260086020526040812054819060ff168015612ca557503360009081526009602052604090205460ff165b8015612cb957506001600160a01b03851632145b15612ccd5782612cc985826137cb565b9250505b6001600160a01b03851660009081526008602052604090205460ff1615612cfb57612cf8858461385a565b90505b935093915050565b600080600d54118015612d185750600d544210155b905090565b6001600160a01b03881660009081526005602052604081208054889290612d45908490614307565b90915550600090508515612f7a576001600160a01b03891660009081526008602052604090205460ff1680612d9257506001600160a01b03881660009081526008602052604090205460ff165b15612e05576001600160a01b03891660009081526008602052604081205460ff1615612dbf575087612dc2565b50885b6000612dcc6110c4565b90506000612710612ddd838c61446c565b612de79190614483565b9050612df381856142f4565b9350612e018c828585613972565b5050505b6001600160a01b03881660009081526008602052604081205460ff16908115612e315750600c54612e36565b50600b545b6000612710612e45838c61446c565b612e4f9190614483565b90508015612f7657612e6181856142f4565b6012549094506001600160a01b031615801590612ee95750601254604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa158015612ec3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee79190614425565b115b15612f6957601254612f06908d906001600160a01b031683613a07565b601254604051633243c79160e01b8152600481018390526001600160a01b0390911690633243c79190602401600060405180830381600087803b158015612f4c57600080fd5b505af1158015612f60573d6000803e3d6000fd5b50505050612f76565b612f768c61dead83613a07565b5050505b841561323257888860196001600160a01b0382163b1115612fd7576040516001600160a01b03821681527f8b44836fbe611fd088e1d7aad8db1283cacca11ba574d9ee965317a7de186557906020015b60405180910390a161322f565b60196001600160a01b0383163b1115613023576040516001600160a01b03831681527f8b44836fbe611fd088e1d7aad8db1283cacca11ba574d9ee965317a7de18655790602001612fca565b6001600160a01b038082166000908152601560205260409020541615801561304b5750600089115b80156130695750806001600160a01b0316826001600160a01b031614155b801561308e57506001600160a01b03811660009081526007602052604090205460ff16155b156130f8576001600160a01b03828116600081815260176020908152604080832094861680845294825291829020805460ff1916600117905590514281527f09e08c6f7101ba4fa7ea28d5d997b087fdf9b8818b9859b40a1e6a28c6d2837d910160405180910390a35b6001600160a01b03808316600090815260156020526040902054161580156131205750600089115b801561313e5750806001600160a01b0316826001600160a01b031614155b1561322f576001600160a01b0380821660009081526017602090815260408083209386168352929052205460ff16801561318e57506001600160a01b038216600090815260166020526040902054155b1561322f576001600160a01b0381161561322f576001600160a01b03828116600081815260156020908152604080832080546001600160a01b0319908116968816968717909155858452601683528184208054600181018255908552938390209093018054909316841790925590514281529192917fa8c50a298b4200fd02e706cf001585af8f63488dbd1a4e0e676ea02770a2e0f6910160405180910390a35b50505b6001600160a01b03891660009081526007602052604081205460ff168061327157506001600160a01b03891660009081526007602052604090205460ff165b905085801561327e575080155b15613443576000612710600a548a613296919061446c565b6132a09190614483565b9050801561344157600060196001600160a01b038d163b11156132c45750896132c7565b508a5b60006132d16110c4565b90506132dd83866142f4565b94506132f58d6132ee600386614483565b8484613972565b6012546001600160a01b03161580159061337a5750601254604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa158015613354573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133789190614425565b115b1561342a576012546133ad908e906001600160a01b0316600361339e87600261446c565b6133a89190614483565b613a07565b6012546001600160a01b0316633243c79160036133cb86600261446c565b6133d59190614483565b6040518263ffffffff1660e01b81526004016133f391815260200190565b600060405180830381600087803b15801561340d57600080fd5b505af1158015613421573d6000803e3d6000fd5b5050505061343e565b61343e8d61dead600361339e87600261446c565b50505b505b84801561344e575080155b5083801561345a575080155b15613711576001600160a01b038916600090815260136020526040812090613480612d03565b80156134b857507f000000000000000000000000000000000000000000000000000007dba8202e80600d546134b591906142f4565b42105b90508482600001541061351857848260000160008282546134d99190614307565b9091555060009050816134ed5760006134f7565b6134f7858c614307565b905061350381866142f4565b94506135128d61dead83613a07565b5061362b565b6000858b846000015461352b919061446c565b6135359190614483565b90508180156135445750600081115b1561357b57600061355e613558878e614307565b83611aca565b905061356a81876142f4565b95506135798e61dead83613a07565b505b82546135879087614307565b83600101600082825461359a9190614307565b909155505060008084556127107f0000000000000000000000000000000000000000000000000000000000002710846135d45760006135d6565b835b6135e0908f614307565b6135ea919061446c565b6135f49190614483565b9050801561362857600061360b613558888f614307565b905061361781886142f4565b96506136268f61dead83613a07565b505b50505b601254825460018401546001600160a01b039092169163e30443bc918e9161365391906142f4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561369957600080fd5b505af11580156136ad573d6000803e3d6000fd5b5050835460018501546040517fa1834d8fa1841c73173644b37f823b4f45c2bc3da2343961c141f5559f0d1aa8945061370693508f9291906001600160a01b039390931683526020830191909152604082015260600190565b60405180910390a150505b6137208a8a6133a8858c614307565b806137bf57601460009054906101000a90046001600160a01b03166001600160a01b031663fe9ac4156040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561377557600080fd5b505af1925050508015613786575060015b6137bf57604051600281527f83644ada0485c363aadd15d858d1380165d61512d4c2af82d8d579e89ec2ab019060200160405180910390a15b50505050505050505050565b6000806000806137da86611e25565b925092509250600080841180156137f15750600083115b1561380e5782613801858861446c565b61380b9190614483565b90505b61381881856142f4565b606261382584606461446c565b61382f9190614483565b61383a9060036142f4565b106138505761384c8783888787613a7b565b5094505b5050505092915050565b60008060008061386986611e25565b92509250925082811161391d5784613896876001600160a01b031660009081526005602052604090205490565b6138a09190614307565b866001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139029190614425565b61390c908761446c565b6139169190614483565b9350613969565b6000808411801561392e5750600083115b156138505761393d8684614307565b613947858861446c565b6139519190614483565b905061395d84826142f4565b82101561385057600080fd5b50505092915050565b81600082156139ff5760005b6018548110156139fd576001600160a01b03808416600090815260156020526040812054909116908190036139b2575061dead5b84601883815481106139c6576139c66142c8565b9060005260206000200154886139dc919061446c565b6139e69190614483565b92506139f3888285613a07565b925060010161397e565b505b505050505050565b6001600160a01b03821660009081526005602052604081208054839290613a2f9084906142f4565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516122db91815260200190565b6000806000876001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613abe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ae29190614425565b905060007f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015613b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b689190614501565b6001600160a01b031663017e7e586040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ba5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bc99190614501565b90506000806001600160a01b0316826001600160a01b03161415905060008a6001600160a01b0316637464fc3d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c499190614425565b90508115613dcd578015613dcd576000613c6b613c66898b61446c565b613e4a565b90506000613c7883613e4a565b905080821115613dca576000807310ed43c718714eb63d5aa57b78b54704e256024d197f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031601613d1257613cd48385614307565b613cde908961446c565b613ce990600861446c565b9150613cf683600861446c565b613d0185601161446c565b613d0b91906142f4565b9050613da8565b73d99d1c33f9fc3444f8101754abc46c52416550d0197f00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e6001600160a01b031601613d7957613d618385614307565b613d6b908961446c565b915082613d0185600361446c565b613d838385614307565b613d8d908961446c565b915082613d9b85600561446c565b613da591906142f4565b90505b613db28183614483565b98508815613dc757613dc489896142f4565b97505b50505b50505b6000613dd9898c614307565b905084600003613e0b578015613e06576103e8613df9613c668c8461446c565b613e039190614307565b96505b613e3b565b613e3889613e19878461446c565b613e239190614483565b89613e2e888e61446c565b6109569190614483565b96505b50505050509550959350505050565b60006003821115613ea55750806000613e64600283614483565b613e6f9060016142f4565b90505b8181101561110757905080600281613e8a8186614483565b613e9491906142f4565b613e9e9190614483565b9050613e72565b8115613eaf575060015b919050565b828054828255906000526020600020908101928215613eef579160200282015b82811115613eef578251825591602001919060010190613ed4565b50613efb929150613eff565b5090565b5b80821115613efb5760008155600101613f00565b6001600160a01b038116811461152357600080fd5b600060208284031215613f3b57600080fd5b8135611adb81613f14565b602081526000825180602084015260005b81811015613f745760208186018101516040868401015201613f57565b506000604082850101526040601f19601f83011684010191505092915050565b60008060408385031215613fa757600080fd5b8235613fb281613f14565b946020939093013593505050565b600060208284031215613fd257600080fd5b5035919050565b600080600060608486031215613fee57600080fd5b8335613ff981613f14565b9250602084013561400981613f14565b929592945050506040919091013590565b6000806040838503121561402d57600080fd5b823561403881613f14565b9150602083013561404881613f14565b809150509250929050565b60008083601f84011261406557600080fd5b50813567ffffffffffffffff81111561407d57600080fd5b6020830191508360208260051b850101111561409857600080fd5b9250929050565b801515811461152357600080fd5b8035613eaf8161409f565b6000806000604084860312156140cd57600080fd5b833567ffffffffffffffff8111156140e457600080fd5b6140f086828701614053565b90945092505060208401356141048161409f565b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561414e5761414e61410f565b604052919050565b600067ffffffffffffffff8211156141705761417061410f565b5060051b60200190565b6000806040838503121561418d57600080fd5b823567ffffffffffffffff8111156141a457600080fd5b8301601f810185136141b557600080fd5b80356141c86141c382614156565b614125565b8082825260208201915060208360051b8501019250878311156141ea57600080fd5b6020840193505b8284101561421557833561420481613f14565b8252602093840193909101906141f1565b945061422792505050602084016140ad565b90509250929050565b6000806040838503121561424357600080fd5b50508035926020909101359150565b6000806020838503121561426557600080fd5b823567ffffffffffffffff81111561427c57600080fd5b61428885828601614053565b90969095509350505050565b600181811c908216806142a857607f821691505b60208210810361110757634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b808201808211156110be576110be6142de565b818103818111156110be576110be6142de565b6000604082018483526040602084015280845180835260608501915060208601925060005b818110156143665783516001600160a01b031683526020938401939092019160010161433f565b50909695505050505050565b60006020828403121561438457600080fd5b815167ffffffffffffffff81111561439b57600080fd5b8201601f810184136143ac57600080fd5b80516143ba6141c382614156565b8082825260208201915060208360051b8501019250868311156143dc57600080fd5b6020840193505b828410156143fe5783518252602093840193909101906143e3565b9695505050505050565b60006020828403121561441a57600080fd5b8151611adb8161409f565b60006020828403121561443757600080fd5b5051919050565b60008060006060848603121561445357600080fd5b5050815160208301516040909301519094929350919050565b80820281158282048414176110be576110be6142de565b6000826144a057634e487b7160e01b600052601260045260246000fd5b500490565b80516001600160701b0381168114613eaf57600080fd5b6000806000606084860312156144d157600080fd5b6144da846144a5565b92506144e8602085016144a5565b9150604084015163ffffffff8116811461410457600080fd5b60006020828403121561451357600080fd5b8151611adb81613f1456fea264697066735822122081a1ad374489de477b13e2f96db8216a51ff8c003acf0f8c91db6d64ba9d431c64736f6c634300081b0033

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

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