false
true
0

Contract Address Details

0x00212AeebB678f138a2C79638180B2522200BEfa

Contract Name
LiquidityMining
Creator
0x74ef70–d501ed at 0x721b88–806525
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
Fetching transactions...
Transfers
Fetching transfers...
Gas Used
Fetching gas used...
Last Balance Update
26347950
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been partially verified via Sourcify. View contract in Sourcify repository
Contract name:
LiquidityMining




Optimization enabled
true
Compiler version
v0.7.0+commit.9e61f92b




Optimization runs
200
EVM Version
istanbul




Verified at
2026-04-22T01:58:59.274740Z

Constructor Arguments

000000000000000000000000e63983b5fade429ec052d1b365826c4bc5fcb1980000000000000000000000007c23ac2e8da915d4f422cf710f4767faa0c332fa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c58aa9000000000000000000000000fa7bd9fee90745189b99b95aff42ce681c58cb490000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000232800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000030
              

LiquidityMining.sol

//SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

contract LiquidityMining {

    address private constant UNISWAP_V2_FACTORY = 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f;

    address private constant UNISWAP_V2_ROUTER = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

    address private WETH_ADDRESS = IUniswapV2Router(UNISWAP_V2_ROUTER).WETH();

    address[] private TOKENS;

    mapping(uint256 => uint256) private _totalPoolAmount;

    uint256[] private TIME_WINDOWS;

    uint256[] private REWARD_MULTIPLIERS;

    uint256[] private REWARD_DIVIDERS;

    uint256[] private REWARD_SPLIT_TRANCHES;

    address private _doubleProxy;

    address private _mainTokenAddress;

    address private _rewardTokenAddress;

    struct StakeInfo {
        address sender;
        uint256 poolPosition;
        uint256 firstAmount;
        uint256 secondAmount;
        uint256 poolAmount;
        uint256 reward;
        uint256 endBlock;
        uint256[] partialRewardBlockTimes;
        uint256 splittedReward;
    }

    uint256 private _startBlock;
    uint256 private _endBlock;

    mapping(uint256 => mapping(uint256 => StakeInfo)) private _stakeInfo;
    mapping(uint256 => uint256) private _stakeInfoLength;

    event Staked(address indexed sender, uint256 indexed tier, uint256 indexed poolPosition, uint256 firstAmount, uint256 secondAmount, uint256 poolAmount, uint256 reward, uint256 endBlock, uint256[] partialRewardBlockTimes, uint256 splittedReward);
    event Withdrawn(address sender, address indexed receiver, uint256 indexed tier, uint256 indexed poolPosition, uint256 firstAmount, uint256 secondAmount, uint256 poolAmount, uint256 reward);
    event PartialWithdrawn(address sender, address indexed receiver, uint256 indexed tier, uint256 reward);

    event Unlocked(address indexed receiver, uint256 indexed tier, uint256 position, uint256 indexed poolPosition, uint256 firstAmount, uint256 secondAmount, uint256 poolAmount, uint256 reward);
    event Flushed(address indexed receiver, uint256 indexed tier, uint256 position, uint256 indexed poolPosition, uint256 firstAmount, uint256 secondAmount, uint256 poolAmount, uint256 reward);

    constructor(address mainTokenAddress, address rewardTokenAddress, uint256 startBlock, uint256 endBlock, address doubleProxy, address[] memory tokens, uint256[] memory timeWindows, uint256[] memory rewardMultipliers, uint256[] memory rewardDividers, uint256[] memory rewardSplitTranches) {

        _mainTokenAddress = mainTokenAddress;

        _rewardTokenAddress = rewardTokenAddress;

        _startBlock = startBlock;

        _endBlock = endBlock;

        _doubleProxy = doubleProxy;

        _initArrays(tokens, timeWindows, rewardMultipliers, rewardDividers, rewardSplitTranches);
    }

    function _initArrays(address[] memory tokens, uint256[] memory timeWindows, uint256[] memory rewardMultipliers, uint256[] memory rewardDividers, uint256[] memory rewardSplitTranches) private {

        for(uint256 i = 0; i < tokens.length; i++) {
            TOKENS.push(tokens[i]);
        }

        assert(timeWindows.length == rewardMultipliers.length && rewardMultipliers.length == rewardDividers.length && rewardDividers.length == rewardSplitTranches.length);
        for(uint256 i = 0; i < timeWindows.length; i++) {
            TIME_WINDOWS.push(timeWindows[i]);
        }

        for(uint256 i = 0; i < rewardMultipliers.length; i++) {
            REWARD_MULTIPLIERS.push(rewardMultipliers[i]);
        }

        for(uint256 i = 0; i < rewardDividers.length; i++) {
            REWARD_DIVIDERS.push(rewardDividers[i]);
        }

        for(uint256 i = 0; i < rewardSplitTranches.length; i++) {
            REWARD_SPLIT_TRANCHES.push(rewardSplitTranches[i]);
        }
    }

    function doubleProxy() public view returns(address) {
        return _doubleProxy;
    }

    function tokenAddress() public view returns(address) {
        return _mainTokenAddress;
    }

    function rewardTokenAddress() public view returns(address) {
        return _rewardTokenAddress;
    }

    function tokens() public view returns(address[] memory) {
        return TOKENS;
    }

    function tierData() public view returns(uint256[] memory, uint256[] memory, uint256[] memory, uint256[] memory) {
        return (TIME_WINDOWS, REWARD_MULTIPLIERS, REWARD_DIVIDERS, REWARD_SPLIT_TRANCHES);
    }

    function startBlock() public view returns(uint256) {
        return _startBlock;
    }

    function endBlock() public view returns(uint256) {
        return _endBlock;
    }

    function totalPoolAmount(uint256 poolPosition) public view returns(uint256) {
        return _totalPoolAmount[poolPosition];
    }

    function setDoubleProxy(address newDoubleProxy) public {
        require(IMVDFunctionalitiesManager(IMVDProxy(IDoubleProxy(_doubleProxy).proxy()).getMVDFunctionalitiesManagerAddress()).isAuthorizedFunctionality(msg.sender), "Unauthorized Action!");
        _doubleProxy = newDoubleProxy;
    }

    function stake(uint256 tier, uint256 poolPosition, uint256 originalFirstAmount, uint256 firstAmountMin, uint256 value, uint256 secondAmountMin) public payable {
        require(block.number >= _startBlock, "Staking is still not available");
        require(block.number < _endBlock, "Staking has reached end block");
        require(poolPosition < TOKENS.length, "Unknown Pool");
        require(tier < TIME_WINDOWS.length, "Unknown tier");

        require(originalFirstAmount > 0, "First amount must be greater than 0");

        uint256 originalSecondAmount = TOKENS[poolPosition] == WETH_ADDRESS ? msg.value : value;
        require(originalSecondAmount > 0, "Second amount must be greater than 0");

        IMVDProxy proxy = IMVDProxy(IDoubleProxy(_doubleProxy).proxy());

        _transferTokensAndCheckAllowance(_mainTokenAddress, originalFirstAmount);
        _transferTokensAndCheckAllowance(TOKENS[poolPosition], originalSecondAmount);

        address secondToken = TOKENS[poolPosition];

        (uint256 firstAmount, uint256 secondAmount, uint256 poolAmount) = _createPoolToken(originalFirstAmount, firstAmountMin, originalSecondAmount, secondAmountMin, _mainTokenAddress, secondToken);

        _totalPoolAmount[poolPosition] += poolAmount;

        (uint256 minCap,, uint256 remainingToStake) = getStakingInfo(tier);
        require(firstAmount >= minCap, "Amount to stake is less than the current min cap");
        require(firstAmount <= remainingToStake, "Amount to stake must be less than the current remaining one");

        calculateRewardAndAddStakingPosition(tier, poolPosition, firstAmount, secondAmount, poolAmount, proxy);
    }

    function getStakingInfo(uint256 tier) public view returns(uint256 minCap, uint256 hardCap, uint256 remainingToStake) {
        (minCap, hardCap) = getStakingCap(tier);
        remainingToStake = hardCap;
        uint256 length = _stakeInfoLength[tier];
        for(uint256 i = 0; i < length; i++) {
            if(_stakeInfo[tier][i].endBlock > block.number) {
                remainingToStake -= _stakeInfo[tier][i].firstAmount;
            }
        }
    }

    function getStakingCap(uint256 tier) public view returns(uint256, uint256) {
        IStateHolder stateHolder = IStateHolder(IMVDProxy(IDoubleProxy(_doubleProxy).proxy()).getStateHolderAddress());
        string memory tierString = _toString(tier);
        string memory addressString = _toLowerCase(_toString(address(this)));
        return (
            stateHolder.getUint256(string(abi.encodePacked("staking.", addressString, ".tiers[", tierString, "].minCap"))),
            stateHolder.getUint256(string(abi.encodePacked("staking.", addressString, ".tiers[", tierString, "].hardCap")))
        );
    }

    function _transferTokensAndCheckAllowance(address tokenAddr, uint256 value) private {
        if(tokenAddr == WETH_ADDRESS) {
            return;
        }
        IERC20 token = IERC20(tokenAddr);
        token.transferFrom(msg.sender, address(this), value);
        if(token.allowance(address(this), UNISWAP_V2_ROUTER) <= value) {
            token.approve(UNISWAP_V2_ROUTER, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        }
    }

    function _createPoolToken(uint256 originalFirstAmount, uint256 firstAmountMin, uint256 originalSecondAmount, uint256 secondAmountMin, address firstToken, address secondToken) private returns(uint256 firstAmount, uint256 secondAmount, uint256 poolAmount) {
        if(secondToken == WETH_ADDRESS) {
            (firstAmount, secondAmount, poolAmount) = IUniswapV2Router(UNISWAP_V2_ROUTER).addLiquidityETH{value: originalSecondAmount}(
                firstToken,
                originalFirstAmount,
                firstAmountMin,
                secondAmountMin,
                address(this),
                block.timestamp + 1000
            );
        } else {
            (firstAmount, secondAmount, poolAmount) = IUniswapV2Router(UNISWAP_V2_ROUTER).addLiquidity(
                firstToken,
                secondToken,
                originalFirstAmount,
                originalSecondAmount,
                firstAmountMin,
                secondAmountMin,
                address(this),
                block.timestamp + 1000
            );
        }
        if(firstAmount < originalFirstAmount) {
            IERC20(firstToken).transfer(msg.sender, originalFirstAmount - firstAmount);
        }
        if(secondAmount < originalSecondAmount) {
            if(secondToken == WETH_ADDRESS) {
                payable(msg.sender).transfer(originalSecondAmount - secondAmount);
            } else {
                IERC20(secondToken).transfer(msg.sender, originalSecondAmount - secondAmount);
            }
        }
    }

    function calculateRewardAndAddStakingPosition(uint256 tier, uint256 poolPosition, uint256 firstAmount, uint256 secondAmount, uint256 poolAmount, IMVDProxy proxy) private {
        uint256 partialRewardSingleBlockTime = TIME_WINDOWS[tier] / REWARD_SPLIT_TRANCHES[tier];
        uint256[] memory partialRewardBlockTimes = new uint256[](REWARD_SPLIT_TRANCHES[tier]);
        if(partialRewardBlockTimes.length > 0) {
            partialRewardBlockTimes[0] = block.number + partialRewardSingleBlockTime;
            for(uint256 i = 1; i < partialRewardBlockTimes.length; i++) {
                partialRewardBlockTimes[i] = partialRewardBlockTimes[i - 1] + partialRewardSingleBlockTime;
            }
        }
        uint256 reward = firstAmount * REWARD_MULTIPLIERS[tier] / REWARD_DIVIDERS[tier];
        StakeInfo memory stakeInfo = StakeInfo(msg.sender, poolPosition, firstAmount, secondAmount, poolAmount, reward, block.number + TIME_WINDOWS[tier], partialRewardBlockTimes, reward / REWARD_SPLIT_TRANCHES[tier]);
        _add(tier, stakeInfo);
        proxy.submit("liquidityMiningTransfer", abi.encode(address(0), 0, reward, _rewardTokenAddress));
        emit Staked(msg.sender, tier, poolPosition, firstAmount, secondAmount, poolAmount, reward, stakeInfo.endBlock, partialRewardBlockTimes, stakeInfo.splittedReward);
    }

    function _add(uint256 tier, StakeInfo memory element) private returns(uint256, uint256) {
        _stakeInfo[tier][_stakeInfoLength[tier]] = element;
        _stakeInfoLength[tier] = _stakeInfoLength[tier] + 1;
        return (element.reward, element.endBlock);
    }

    function _remove(uint256 tier, uint256 i) private {
        if(_stakeInfoLength[tier] <= i) {
            return;
        }
        _stakeInfoLength[tier] = _stakeInfoLength[tier] - 1;
        if(_stakeInfoLength[tier] > i) {
            _stakeInfo[tier][i] = _stakeInfo[tier][_stakeInfoLength[tier]];
        }
        delete _stakeInfo[tier][_stakeInfoLength[tier]];
    }

    function length(uint256 tier) public view returns(uint256) {
        return _stakeInfoLength[tier];
    }

    function stakeInfo(uint256 tier, uint256 position) public view returns(
        address,
        uint256,
        uint256,
        uint256,
        uint256,
        uint256,
        uint256,
        uint256[] memory,
        uint256
    ) {
        StakeInfo memory tierStakeInfo = _stakeInfo[tier][position];
        return(
            tierStakeInfo.sender,
            tierStakeInfo.poolPosition,
            tierStakeInfo.firstAmount,
            tierStakeInfo.secondAmount,
            tierStakeInfo.poolAmount,
            tierStakeInfo.reward,
            tierStakeInfo.endBlock,
            tierStakeInfo.partialRewardBlockTimes,
            tierStakeInfo.splittedReward
        );
    }

    function partialReward(uint256 tier, uint256 position) public {
        StakeInfo memory tierStakeInfo = _stakeInfo[tier][position];
        require(tierStakeInfo.sender != address(0), "Unknown Position!");
        if(block.number >= tierStakeInfo.endBlock) {
            return withdraw(tier, position);
        }
        require(tierStakeInfo.reward > 0, "No more reward for this staking position");
        uint256 reward = 0;
        for(uint256 i = 0; i < tierStakeInfo.partialRewardBlockTimes.length; i++) {
            if(tierStakeInfo.partialRewardBlockTimes[i] > 0 && block.number >= tierStakeInfo.partialRewardBlockTimes[i]) {
                reward += tierStakeInfo.splittedReward;
                tierStakeInfo.partialRewardBlockTimes[i] = 0;
            }
        }
        reward = reward > tierStakeInfo.reward ? tierStakeInfo.reward : reward;
        require(reward > 0, "No reward to redeem");
        IERC20 token = IERC20(_rewardTokenAddress);
        token.transfer(tierStakeInfo.sender, reward);
        tierStakeInfo.reward = tierStakeInfo.reward - reward;
        _stakeInfo[tier][position] = tierStakeInfo;
        emit PartialWithdrawn(msg.sender, tierStakeInfo.sender, tier, reward);
    }

    function withdraw(uint256 tier, uint256 position) public {
        StakeInfo memory tierStakeInfo = _stakeInfo[tier][position];
        require(tierStakeInfo.sender != address(0), "Unknown Position!");
        require(block.number >= tierStakeInfo.endBlock, "Cannot actually withdraw this position");
        IERC20 token = IERC20(_rewardTokenAddress);
        if(tierStakeInfo.reward > 0) {
            token.transfer(tierStakeInfo.sender, tierStakeInfo.reward);
        }
        token = IERC20(IUniswapV2Factory(UNISWAP_V2_FACTORY).getPair(_mainTokenAddress, TOKENS[tierStakeInfo.poolPosition]));
        token.transfer(tierStakeInfo.sender, tierStakeInfo.poolAmount);
        _totalPoolAmount[tierStakeInfo.poolPosition] = _totalPoolAmount[tierStakeInfo.poolPosition] - tierStakeInfo.poolAmount;
        emit Withdrawn(msg.sender, tierStakeInfo.sender, tier, tierStakeInfo.poolPosition, tierStakeInfo.firstAmount, tierStakeInfo.secondAmount, tierStakeInfo.poolAmount, tierStakeInfo.reward);
        _remove(tier, position);
    }

    function unlock(uint256 tier, uint256 position) public {
        StakeInfo memory tierStakeInfo = _stakeInfo[tier][position];
        require(tierStakeInfo.sender != address(0), "Unknown Position!");
        require(msg.sender == tierStakeInfo.sender, "Unlock can be done only by position owner");
        if(block.number >= tierStakeInfo.endBlock) {
            return withdraw(tier, position);
        }
        IMVDProxy proxy = IMVDProxy(IDoubleProxy(_doubleProxy).proxy());
        address walletAddress = proxy.getMVDWalletAddress();
        uint256 reward = 0;
        for(uint256 i = 0; i < tierStakeInfo.partialRewardBlockTimes.length; i++) {
            if(tierStakeInfo.partialRewardBlockTimes[i] == 0) {
                reward += tierStakeInfo.splittedReward;
            }
        }
        IERC20 token = IERC20(_rewardTokenAddress);
        if(reward > 0) {
            token.transferFrom(tierStakeInfo.sender, walletAddress, reward);
        }
        token.transfer(walletAddress, tierStakeInfo.reward);
        token = IERC20(IUniswapV2Factory(UNISWAP_V2_FACTORY).getPair(_mainTokenAddress, TOKENS[tierStakeInfo.poolPosition]));
        token.transfer(tierStakeInfo.sender, tierStakeInfo.poolAmount);
        _totalPoolAmount[tierStakeInfo.poolPosition] = _totalPoolAmount[tierStakeInfo.poolPosition] - tierStakeInfo.poolAmount;
        emit Unlocked(tierStakeInfo.sender, tier, position, tierStakeInfo.poolPosition, tierStakeInfo.firstAmount, tierStakeInfo.secondAmount, tierStakeInfo.poolAmount, tierStakeInfo.reward + reward);
        _remove(tier, position);
    }

    function flushToDFO(uint256 tier, uint256 position) public {
        StakeInfo memory tierStakeInfo = _stakeInfo[tier][position];
        require(tierStakeInfo.sender != address(0), "Unknown Position!");
        require(msg.sender == tierStakeInfo.sender, "Flush can be done only by position owner");
        IMVDProxy proxy = IMVDProxy(IDoubleProxy(_doubleProxy).proxy());
        address walletAddress = proxy.getMVDWalletAddress();
        uint256 reward = 0;
        for(uint256 i = 0; i < tierStakeInfo.partialRewardBlockTimes.length; i++) {
            if(tierStakeInfo.partialRewardBlockTimes[i] > 0 && block.number >= tierStakeInfo.partialRewardBlockTimes[i]) {
                reward += tierStakeInfo.splittedReward;
                tierStakeInfo.partialRewardBlockTimes[i] = 0;
            }
        }
        reward = reward > tierStakeInfo.reward ? tierStakeInfo.reward : reward;
        IERC20 token = IERC20(_rewardTokenAddress);
        if(reward > 0) {
            token.transfer(tierStakeInfo.sender, reward);
        }
        if(tierStakeInfo.reward - reward > 0) {
            token.transfer(walletAddress, tierStakeInfo.reward - reward);
        }
        token = IERC20(IUniswapV2Factory(UNISWAP_V2_FACTORY).getPair(_mainTokenAddress, TOKENS[tierStakeInfo.poolPosition]));
        token.transfer(walletAddress, tierStakeInfo.poolAmount);
        _totalPoolAmount[tierStakeInfo.poolPosition] = _totalPoolAmount[tierStakeInfo.poolPosition] - tierStakeInfo.poolAmount;
        emit Flushed(tierStakeInfo.sender, tier, position, tierStakeInfo.poolPosition, tierStakeInfo.firstAmount, tierStakeInfo.secondAmount, tierStakeInfo.poolAmount, tierStakeInfo.reward + reward);
        _remove(tier, position);
    }

    function _toString(uint _i) private pure returns(string memory) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len - 1;
        while (_i != 0) {
            bstr[k--] = byte(uint8(48 + _i % 10));
            _i /= 10;
        }
        return string(bstr);
    }

    function _toString(address _addr) private pure returns(string memory) {
        bytes32 value = bytes32(uint256(_addr));
        bytes memory alphabet = "0123456789abcdef";

        bytes memory str = new bytes(42);
        str[0] = '0';
        str[1] = 'x';
        for (uint i = 0; i < 20; i++) {
            str[2+i*2] = alphabet[uint(uint8(value[i + 12] >> 4))];
            str[3+i*2] = alphabet[uint(uint8(value[i + 12] & 0x0f))];
        }
        return string(str);
    }

    function _toLowerCase(string memory str) private pure returns(string memory) {
        bytes memory bStr = bytes(str);
        for (uint i = 0; i < bStr.length; i++) {
            bStr[i] = bStr[i] >= 0x41 && bStr[i] <= 0x5A ? bytes1(uint8(bStr[i]) + 0x20) : bStr[i];
        }
        return string(bStr);
    }
}

interface IMVDProxy {
    function getStateHolderAddress() external view returns(address);
    function getMVDWalletAddress() external view returns(address);
    function getMVDFunctionalitiesManagerAddress() external view returns(address);
    function submit(string calldata codeName, bytes calldata data) external payable returns(bytes memory returnData);
}

interface IStateHolder {
    function setUint256(string calldata name, uint256 value) external returns(uint256);
    function getUint256(string calldata name) external view returns(uint256);
    function getBool(string calldata varName) external view returns (bool);
    function clear(string calldata varName) external returns(string memory oldDataType, bytes memory oldVal);
}

interface IMVDFunctionalitiesManager {
    function isAuthorizedFunctionality(address functionality) external view returns(bool);
}

interface IERC20 {
    function balanceOf(address account) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
}

interface IUniswapV2Router {
    function WETH() external pure returns (address);
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}

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

interface IDoubleProxy {
    function proxy() external view returns(address);
}
        

Compiler Settings

{"remappings":[],"optimizer":{"runs":200,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"istanbul","compilationTarget":{"LiquidityMining.sol":"LiquidityMining"}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"mainTokenAddress","internalType":"address"},{"type":"address","name":"rewardTokenAddress","internalType":"address"},{"type":"uint256","name":"startBlock","internalType":"uint256"},{"type":"uint256","name":"endBlock","internalType":"uint256"},{"type":"address","name":"doubleProxy","internalType":"address"},{"type":"address[]","name":"tokens","internalType":"address[]"},{"type":"uint256[]","name":"timeWindows","internalType":"uint256[]"},{"type":"uint256[]","name":"rewardMultipliers","internalType":"uint256[]"},{"type":"uint256[]","name":"rewardDividers","internalType":"uint256[]"},{"type":"uint256[]","name":"rewardSplitTranches","internalType":"uint256[]"}]},{"type":"event","name":"Flushed","inputs":[{"type":"address","name":"receiver","internalType":"address","indexed":true},{"type":"uint256","name":"tier","internalType":"uint256","indexed":true},{"type":"uint256","name":"position","internalType":"uint256","indexed":false},{"type":"uint256","name":"poolPosition","internalType":"uint256","indexed":true},{"type":"uint256","name":"firstAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"secondAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"poolAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"reward","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"PartialWithdrawn","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":false},{"type":"address","name":"receiver","internalType":"address","indexed":true},{"type":"uint256","name":"tier","internalType":"uint256","indexed":true},{"type":"uint256","name":"reward","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Staked","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":true},{"type":"uint256","name":"tier","internalType":"uint256","indexed":true},{"type":"uint256","name":"poolPosition","internalType":"uint256","indexed":true},{"type":"uint256","name":"firstAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"secondAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"poolAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"reward","internalType":"uint256","indexed":false},{"type":"uint256","name":"endBlock","internalType":"uint256","indexed":false},{"type":"uint256[]","name":"partialRewardBlockTimes","internalType":"uint256[]","indexed":false},{"type":"uint256","name":"splittedReward","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Unlocked","inputs":[{"type":"address","name":"receiver","internalType":"address","indexed":true},{"type":"uint256","name":"tier","internalType":"uint256","indexed":true},{"type":"uint256","name":"position","internalType":"uint256","indexed":false},{"type":"uint256","name":"poolPosition","internalType":"uint256","indexed":true},{"type":"uint256","name":"firstAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"secondAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"poolAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"reward","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Withdrawn","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":false},{"type":"address","name":"receiver","internalType":"address","indexed":true},{"type":"uint256","name":"tier","internalType":"uint256","indexed":true},{"type":"uint256","name":"poolPosition","internalType":"uint256","indexed":true},{"type":"uint256","name":"firstAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"secondAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"poolAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"reward","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"doubleProxy","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"endBlock","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"flushToDFO","inputs":[{"type":"uint256","name":"tier","internalType":"uint256"},{"type":"uint256","name":"position","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"getStakingCap","inputs":[{"type":"uint256","name":"tier","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"minCap","internalType":"uint256"},{"type":"uint256","name":"hardCap","internalType":"uint256"},{"type":"uint256","name":"remainingToStake","internalType":"uint256"}],"name":"getStakingInfo","inputs":[{"type":"uint256","name":"tier","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"length","inputs":[{"type":"uint256","name":"tier","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"partialReward","inputs":[{"type":"uint256","name":"tier","internalType":"uint256"},{"type":"uint256","name":"position","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"rewardTokenAddress","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDoubleProxy","inputs":[{"type":"address","name":"newDoubleProxy","internalType":"address"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"stake","inputs":[{"type":"uint256","name":"tier","internalType":"uint256"},{"type":"uint256","name":"poolPosition","internalType":"uint256"},{"type":"uint256","name":"originalFirstAmount","internalType":"uint256"},{"type":"uint256","name":"firstAmountMin","internalType":"uint256"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"uint256","name":"secondAmountMin","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256[]","name":"","internalType":"uint256[]"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"stakeInfo","inputs":[{"type":"uint256","name":"tier","internalType":"uint256"},{"type":"uint256","name":"position","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"startBlock","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"},{"type":"uint256[]","name":"","internalType":"uint256[]"},{"type":"uint256[]","name":"","internalType":"uint256[]"},{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"tierData","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"tokenAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"","internalType":"address[]"}],"name":"tokens","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalPoolAmount","inputs":[{"type":"uint256","name":"poolPosition","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unlock","inputs":[{"type":"uint256","name":"tier","internalType":"uint256"},{"type":"uint256","name":"position","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"uint256","name":"tier","internalType":"uint256"},{"type":"uint256","name":"position","internalType":"uint256"}]}]
              

Contract Creation Code

Verify & Publish
0x608060408190526315ab88c960e31b8152737a250d5630b4cf539739df2c5dacb4c659f2488d9063ad5c46489060849060209060048186803b1580156200004557600080fd5b505afa1580156200005a573d6000803e3d6000fd5b505050506040513d60208110156200007157600080fd5b5051600080546001600160a01b0319166001600160a01b039092169190911790553480156200009f57600080fd5b5060405162003f5238038062003f528339818101604052610140811015620000c657600080fd5b815160208301516040808501516060860151608087015160a0880180519451969895979396929591949293820192846401000000008211156200010857600080fd5b9083019060208201858111156200011e57600080fd5b82518660208202830111640100000000821117156200013c57600080fd5b82525081516020918201928201910280838360005b838110156200016b57818101518382015260200162000151565b50505050905001604052602001805160405193929190846401000000008211156200019557600080fd5b908301906020820185811115620001ab57600080fd5b8251866020820283011164010000000082111715620001c957600080fd5b82525081516020918201928201910280838360005b83811015620001f8578181015183820152602001620001de565b50505050905001604052602001805160405193929190846401000000008211156200022257600080fd5b9083019060208201858111156200023857600080fd5b82518660208202830111640100000000821117156200025657600080fd5b82525081516020918201928201910280838360005b83811015620002855781810151838201526020016200026b565b5050505090500160405260200180516040519392919084640100000000821115620002af57600080fd5b908301906020820185811115620002c557600080fd5b8251866020820283011164010000000082111715620002e357600080fd5b82525081516020918201928201910280838360005b8381101562000312578181015183820152602001620002f8565b50505050905001604052602001805160405193929190846401000000008211156200033c57600080fd5b9083019060208201858111156200035257600080fd5b82518660208202830111640100000000821117156200037057600080fd5b82525081516020918201928201910280838360005b838110156200039f57818101518382015260200162000385565b50505050919091016040525050600880546001600160a01b03808f166001600160a01b031992831617909255600980548e8416908316179055600a8c9055600b8b905560078054928b169290911691909117905550620004059050858585858562000415565b50505050505050505050620005cb565b60005b8551811015620004775760018682815181106200043157fe5b60209081029190910181015182546001808201855560009485529290932090920180546001600160a01b0319166001600160a01b03909316929092179091550162000418565b50825184511480156200048b575081518351145b801562000499575080518251145b620004a057fe5b60005b8451811015620004e8576003858281518110620004bc57fe5b6020908102919091018101518254600181810185556000948552929093209092019190915501620004a3565b5060005b8351811015620005315760048482815181106200050557fe5b6020908102919091018101518254600181810185556000948552929093209092019190915501620004ec565b5060005b82518110156200057a5760058382815181106200054e57fe5b602090810291909101810151825460018181018555600094855292909320909201919091550162000535565b5060005b8151811015620005c35760068282815181106200059757fe5b60209081029190910181015182546001818101855560009485529290932090920191909155016200057e565b505050505050565b61397780620005db6000396000f3fe6080604052600436106101095760003560e01c80639d63848a11610095578063cbd99d0311610064578063cbd99d03146104ed578063dd58d9d514610520578063e9c4aa6a14610563578063f39d3c49146105ab578063fdd56605146105db57610109565b80639d63848a146104195780639d76ea581461047e578063a6b8c16a14610493578063aa8b99d2146104c357610109565b806348cd4cb1116100dc57806348cd4cb1146101c25780634eb9b592146101d7578063590c2a8b146101ec5780635bfadb24146102b15780635de3326c146102e157610109565b8063083c63231461010e578063125f9e3314610135578063167e478114610166578063441a3e7014610190575b600080fd5b34801561011a57600080fd5b50610123610616565b60408051918252519081900360200190f35b34801561014157600080fd5b5061014a61061c565b604080516001600160a01b039092168252519081900360200190f35b34801561017257600080fd5b506101236004803603602081101561018957600080fd5b503561062b565b34801561019c57600080fd5b506101c0600480360360408110156101b357600080fd5b5080359060200135610640565b005b3480156101ce57600080fd5b50610123610a44565b3480156101e357600080fd5b5061014a610a4a565b3480156101f857600080fd5b5061021c6004803603604081101561020f57600080fd5b5080359060200135610a59565b604051808a6001600160a01b0316815260200189815260200188815260200187815260200186815260200185815260200184815260200180602001838152602001828103825284818151815260200191508051906020019060200280838360005b8381101561029557818101518382015260200161027d565b505050509050019a505050505050505050505060405180910390f35b3480156102bd57600080fd5b506101c0600480360360408110156102d457600080fd5b5080359060200135610b8c565b3480156102ed57600080fd5b506102f6611187565b6040518080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b8381101561034257818101518382015260200161032a565b50505050905001858103845288818151815260200191508051906020019060200280838360005b83811015610381578181015183820152602001610369565b50505050905001858103835287818151815260200191508051906020019060200280838360005b838110156103c05781810151838201526020016103a8565b50505050905001858103825286818151815260200191508051906020019060200280838360005b838110156103ff5781810151838201526020016103e7565b505050509050019850505050505050505060405180910390f35b34801561042557600080fd5b5061042e6112eb565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561046a578181015183820152602001610452565b505050509050019250505060405180910390f35b34801561048a57600080fd5b5061014a61134d565b34801561049f57600080fd5b506101c0600480360360408110156104b657600080fd5b508035906020013561135c565b3480156104cf57600080fd5b50610123600480360360208110156104e657600080fd5b503561199a565b3480156104f957600080fd5b506101c06004803603602081101561051057600080fd5b50356001600160a01b03166119ac565b34801561052c57600080fd5b5061054a6004803603602081101561054357600080fd5b5035611b72565b6040805192835260208301919091528051918290030190f35b34801561056f57600080fd5b5061058d6004803603602081101561058657600080fd5b503561200c565b60408051938452602084019290925282820152519081900360600190f35b3480156105b757600080fd5b506101c0600480360360408110156105ce57600080fd5b5080359060200135612092565b6101c0600480360360c08110156105f157600080fd5b5080359060208101359060408101359060608101359060808101359060a00135612472565b600b5490565b6009546001600160a01b031690565b6000818152600260205260409020545b919050565b6106486136da565b6000838152600c6020908152604080832085845282529182902082516101208101845281546001600160a01b031681526001820154818401526002820154818501526003820154606082015260048201546080820152600582015460a0820152600682015460c08201526007820180548551818602810186019096528086529194929360e0860193929083018282801561070157602002820191906000526020600020905b8154815260200190600101908083116106ed575b50505091835250506008919091015460209091015280519091506001600160a01b0316610769576040805162461bcd60e51b8152602060048201526011602482015270556e6b6e6f776e20506f736974696f6e2160781b604482015290519081900360640190fd5b8060c001514310156107ac5760405162461bcd60e51b81526004018080602001828103825260268152602001806138a56026913960400191505060405180910390fd5b60095460a08201516001600160a01b03909116901561085157806001600160a01b031663a9059cbb83600001518460a001516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561082457600080fd5b505af1158015610838573d6000803e3d6000fd5b505050506040513d602081101561084e57600080fd5b50505b600854602083015160018054735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9363e6a43905936001600160a01b039091169291811061088e57fe5b60009182526020918290200154604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015293909116602484015251604480840193829003018186803b1580156108e457600080fd5b505afa1580156108f8573d6000803e3d6000fd5b505050506040513d602081101561090e57600080fd5b5051825160808401516040805163a9059cbb60e01b81526001600160a01b0393841660048201526024810192909252519293509083169163a9059cbb916044808201926020929091908290030181600087803b15801561096d57600080fd5b505af1158015610981573d6000803e3d6000fd5b505050506040513d602081101561099757600080fd5b50506080808301805160208581018051600090815260028352604080822054835183529181902094909103909355518651838801516060808a0151965160a0808c01518851338152978801949094528688019890985290850152958301959095529151919388936001600160a01b03909116927fec4d7fc8319e44dfa849ab87f565622b9cf848ce9959568c3066615ce9e2ef149281900390910190a4610a3e8484612826565b50505050565b600a5490565b6007546001600160a01b031690565b600080600080600080600060606000610a706136da565b60008c8152600c602090815260408083208e845282529182902082516101208101845281546001600160a01b031681526001820154818401526002820154818501526003820154606082015260048201546080820152600582015460a0820152600682015460c08201526007820180548551818602810186019096528086529194929360e08601939290830182828015610b2957602002820191906000526020600020905b815481526020019060010190808311610b15575b505050505081526020016008820154815250509050806000015181602001518260400151836060015184608001518560a001518660c001518760e00151886101000151995099509950995099509950995099509950509295985092959850929598565b610b946136da565b6000838152600c6020908152604080832085845282529182902082516101208101845281546001600160a01b031681526001820154818401526002820154818501526003820154606082015260048201546080820152600582015460a0820152600682015460c08201526007820180548551818602810186019096528086529194929360e08601939290830182828015610c4d57602002820191906000526020600020905b815481526020019060010190808311610c39575b50505091835250506008919091015460209091015280519091506001600160a01b0316610cb5576040805162461bcd60e51b8152602060048201526011602482015270556e6b6e6f776e20506f736974696f6e2160781b604482015290519081900360640190fd5b80516001600160a01b03163314610cfd5760405162461bcd60e51b815260040180806020018281038252602981526020018061387c6029913960400191505060405180910390fd5b8060c001514310610d1857610d128383610640565b50611183565b6007546040805163ec55688960e01b815290516000926001600160a01b03169163ec556889916004808301926020929190829003018186803b158015610d5d57600080fd5b505afa158015610d71573d6000803e3d6000fd5b505050506040513d6020811015610d8757600080fd5b5051604080516331c6903d60e01b815290519192506000916001600160a01b038416916331c6903d916004808301926020929190829003018186803b158015610dcf57600080fd5b505afa158015610de3573d6000803e3d6000fd5b505050506040513d6020811015610df957600080fd5b505190506000805b8460e0015151811015610e41578460e001518181518110610e1e57fe5b602002602001015160001415610e3957846101000151820191505b600101610e01565b506009546001600160a01b03168115610ede578451604080516323b872dd60e01b81526001600160a01b0392831660048201528583166024820152604481018590529051918316916323b872dd916064808201926020929091908290030181600087803b158015610eb157600080fd5b505af1158015610ec5573d6000803e3d6000fd5b505050506040513d6020811015610edb57600080fd5b50505b806001600160a01b031663a9059cbb848760a001516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610f3957600080fd5b505af1158015610f4d573d6000803e3d6000fd5b505050506040513d6020811015610f6357600080fd5b5050600854602086015160018054735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9363e6a43905936001600160a01b0390911692918110610fa257fe5b60009182526020918290200154604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015293909116602484015251604480840193829003018186803b158015610ff857600080fd5b505afa15801561100c573d6000803e3d6000fd5b505050506040513d602081101561102257600080fd5b5051855160808701516040805163a9059cbb60e01b81526001600160a01b0393841660048201526024810192909252519293509083169163a9059cbb916044808201926020929091908290030181600087803b15801561108157600080fd5b505af1158015611095573d6000803e3d6000fd5b505050506040513d60208110156110ab57600080fd5b81019080805190602001909291905050505084608001516002600087602001518152602001908152602001600020540360026000876020015181526020019081526020016000208190555084602001518786600001516001600160a01b03167f7cbd9649881e2e080f1eebfe980ccc4f8c52dcff4cc4b94ba7fd3831a4208aa58989604001518a606001518b60800151898d60a0015101604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a461117d8787612826565b50505050505b5050565b6060806060806003600460056006838054806020026020016040519081016040528092919081815260200182805480156111e057602002820191906000526020600020905b8154815260200190600101908083116111cc575b505050505093508280548060200260200160405190810160405280929190818152602001828054801561123257602002820191906000526020600020905b81548152602001906001019080831161121e575b505050505092508180548060200260200160405190810160405280929190818152602001828054801561128457602002820191906000526020600020905b815481526020019060010190808311611270575b50505050509150808054806020026020016040519081016040528092919081815260200182805480156112d657602002820191906000526020600020905b8154815260200190600101908083116112c2575b50505050509050935093509350935090919293565b6060600180548060200260200160405190810160405280929190818152602001828054801561134357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611325575b5050505050905090565b6008546001600160a01b031690565b6113646136da565b6000838152600c6020908152604080832085845282529182902082516101208101845281546001600160a01b031681526001820154818401526002820154818501526003820154606082015260048201546080820152600582015460a0820152600682015460c08201526007820180548551818602810186019096528086529194929360e0860193929083018282801561141d57602002820191906000526020600020905b815481526020019060010190808311611409575b50505091835250506008919091015460209091015280519091506001600160a01b0316611485576040805162461bcd60e51b8152602060048201526011602482015270556e6b6e6f776e20506f736974696f6e2160781b604482015290519081900360640190fd5b80516001600160a01b031633146114cd5760405162461bcd60e51b815260040180806020018281038252602881526020018061382c6028913960400191505060405180910390fd5b6007546040805163ec55688960e01b815290516000926001600160a01b03169163ec556889916004808301926020929190829003018186803b15801561151257600080fd5b505afa158015611526573d6000803e3d6000fd5b505050506040513d602081101561153c57600080fd5b5051604080516331c6903d60e01b815290519192506000916001600160a01b038416916331c6903d916004808301926020929190829003018186803b15801561158457600080fd5b505afa158015611598573d6000803e3d6000fd5b505050506040513d60208110156115ae57600080fd5b505190506000805b8460e00151518110156116375760008560e0015182815181106115d557fe5b602002602001015111801561160157508460e0015181815181106115f557fe5b60200260200101514310155b1561162f578461010001518201915060008560e00151828151811061162257fe5b6020026020010181815250505b6001016115b6565b508360a001518111611649578061164f565b8360a001515b6009549091506001600160a01b031681156116ec57806001600160a01b031663a9059cbb8660000151846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156116bf57600080fd5b505af11580156116d3573d6000803e3d6000fd5b505050506040513d60208110156116e957600080fd5b50505b60a08501518290031561178357806001600160a01b031663a9059cbb84848860a00151036040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561175657600080fd5b505af115801561176a573d6000803e3d6000fd5b505050506040513d602081101561178057600080fd5b50505b600854602086015160018054735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9363e6a43905936001600160a01b03909116929181106117c057fe5b60009182526020918290200154604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015293909116602484015251604480840193829003018186803b15801561181657600080fd5b505afa15801561182a573d6000803e3d6000fd5b505050506040513d602081101561184057600080fd5b505160808601516040805163a9059cbb60e01b81526001600160a01b038781166004830152602482019390935290519293509083169163a9059cbb916044808201926020929091908290030181600087803b15801561189e57600080fd5b505af11580156118b2573d6000803e3d6000fd5b505050506040513d60208110156118c857600080fd5b81019080805190602001909291905050505084608001516002600087602001518152602001908152602001600020540360026000876020015181526020019081526020016000208190555084602001518786600001516001600160a01b03167fcd8847f12db1ff729f1b63807b063a343f7180ebc4045920aa25434447bdd14a8989604001518a606001518b60800151898d60a0015101604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a461117d8787612826565b6000908152600d602052604090205490565b600760009054906101000a90046001600160a01b03166001600160a01b031663ec5568896040518163ffffffff1660e01b815260040160206040518083038186803b1580156119fa57600080fd5b505afa158015611a0e573d6000803e3d6000fd5b505050506040513d6020811015611a2457600080fd5b505160408051633380ac3560e11b815290516001600160a01b0390921691636701586a91600480820192602092909190829003018186803b158015611a6857600080fd5b505afa158015611a7c573d6000803e3d6000fd5b505050506040513d6020811015611a9257600080fd5b5051604080516318c8e99960e11b815233600482015290516001600160a01b0390921691633191d33291602480820192602092909190829003018186803b158015611adc57600080fd5b505afa158015611af0573d6000803e3d6000fd5b505050506040513d6020811015611b0657600080fd5b5051611b50576040805162461bcd60e51b8152602060048201526014602482015273556e617574686f72697a656420416374696f6e2160601b604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000806000600760009054906101000a90046001600160a01b03166001600160a01b031663ec5568896040518163ffffffff1660e01b815260040160206040518083038186803b158015611bc557600080fd5b505afa158015611bd9573d6000803e3d6000fd5b505050506040513d6020811015611bef57600080fd5b50516040805163ba83c16f60e01b815290516001600160a01b039092169163ba83c16f91600480820192602092909190829003018186803b158015611c3357600080fd5b505afa158015611c47573d6000803e3d6000fd5b505050506040513d6020811015611c5d57600080fd5b505190506060611c6c85612970565b90506060611c81611c7c30612a48565b612bbb565b9050826001600160a01b0316630bb687e3828460405160200180806739ba30b5b4b7339760c11b81525060080183805190602001908083835b60208310611cd95780518252601f199092019160209182019101611cba565b51815160209384036101000a6000190180199092169116179052662e74696572735b60c81b919093019081528451600790910192850191508083835b60208310611d345780518252601f199092019160209182019101611d15565b6001836020036101000a038019825116818451168082178552505050505050905001806705d2e6d696e4361760c41b815250600801925050506040516020818303038152906040526040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611dc8578181015183820152602001611db0565b50505050905090810190601f168015611df55780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015611e1257600080fd5b505afa158015611e26573d6000803e3d6000fd5b505050506040513d6020811015611e3c57600080fd5b50516040516739ba30b5b4b7339760c11b602082810191825284516001600160a01b03881693630bb687e39387938993919260280191908501908083835b60208310611e995780518252601f199092019160209182019101611e7a565b51815160209384036101000a6000190180199092169116179052662e74696572735b60c81b919093019081528451600790910192850191508083835b60208310611ef45780518252601f199092019160209182019101611ed5565b6001836020036101000a038019825116818451168082178552505050505050905001806805d2e686172644361760bc1b815250600901925050506040516020818303038152906040526040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611f89578181015183820152602001611f71565b50505050905090810190601f168015611fb65780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015611fd357600080fd5b505afa158015611fe7573d6000803e3d6000fd5b505050506040513d6020811015611ffd57600080fd5b50519095509350505050915091565b600080600061201a84611b72565b6000868152600d60205260408120549295509093508392505b81811015612089576000868152600c60209081526040808320848452909152902060060154431015612081576000868152600c60209081526040808320848452909152902060020154909203915b600101612033565b50509193909250565b61209a6136da565b6000838152600c6020908152604080832085845282529182902082516101208101845281546001600160a01b031681526001820154818401526002820154818501526003820154606082015260048201546080820152600582015460a0820152600682015460c08201526007820180548551818602810186019096528086529194929360e0860193929083018282801561215357602002820191906000526020600020905b81548152602001906001019080831161213f575b50505091835250506008919091015460209091015280519091506001600160a01b03166121bb576040805162461bcd60e51b8152602060048201526011602482015270556e6b6e6f776e20506f736974696f6e2160781b604482015290519081900360640190fd5b8060c0015143106121d057610d128383610640565b60008160a00151116122135760405162461bcd60e51b81526004018080602001828103825260288152602001806138546028913960400191505060405180910390fd5b6000805b8260e00151518110156122985760008360e00151828151811061223657fe5b602002602001015111801561226257508260e00151818151811061225657fe5b60200260200101514310155b15612290578261010001518201915060008360e00151828151811061228357fe5b6020026020010181815250505b600101612217565b508160a0015181116122aa57806122b0565b8160a001515b9050600081116122fd576040805162461bcd60e51b81526020600482015260136024820152724e6f2072657761726420746f2072656465656d60681b604482015290519081900360640190fd5b60095482516040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810185905290519190921691829163a9059cbb916044808201926020929091908290030181600087803b15801561235857600080fd5b505af115801561236c573d6000803e3d6000fd5b505050506040513d602081101561238257600080fd5b505060a08301805183900381526000868152600c60209081526040808320888452825291829020865181546001600160a01b0319166001600160a01b0390911617815581870151600182015591860151600283015560608601516003830155608086015160048301559151600582015560c0850151600682015560e08501518051869361241692600785019291019061372f565b50610100919091015160089091015582516040805133815260208101859052815188936001600160a01b0316927f5777300364834e2d145b85cee28a0d45c4be04f1c7c24116ec72a6b5c839631b928290030190a35050505050565b600a544310156124c9576040805162461bcd60e51b815260206004820152601e60248201527f5374616b696e67206973207374696c6c206e6f7420617661696c61626c650000604482015290519081900360640190fd5b600b54431061251f576040805162461bcd60e51b815260206004820152601d60248201527f5374616b696e6720686173207265616368656420656e6420626c6f636b000000604482015290519081900360640190fd5b6001548510612564576040805162461bcd60e51b815260206004820152600c60248201526b155b9adb9bdddb88141bdbdb60a21b604482015290519081900360640190fd5b60035486106125a9576040805162461bcd60e51b815260206004820152600c60248201526b2ab735b737bbb7103a34b2b960a11b604482015290519081900360640190fd5b600084116125e85760405162461bcd60e51b81526004018080602001828103825260238152602001806138cb6023913960400191505060405180910390fd5b60008054600180546001600160a01b03909216918890811061260657fe5b6000918252602090912001546001600160a01b0316146126265782612628565b345b9050600081116126695760405162461bcd60e51b815260040180806020018281038252602481526020018061391e6024913960400191505060405180910390fd5b6007546040805163ec55688960e01b815290516000926001600160a01b03169163ec556889916004808301926020929190829003018186803b1580156126ae57600080fd5b505afa1580156126c2573d6000803e3d6000fd5b505050506040513d60208110156126d857600080fd5b50516008549091506126f3906001600160a01b031687612c8d565b61271e6001888154811061270357fe5b6000918252602090912001546001600160a01b031683612c8d565b60006001888154811061272d57fe5b60009182526020822001546008546001600160a01b0391821693508291829161275f918c918c918a918c911689612e56565b60008e81526002602052604081208054830190559295509093509150806127858e61200c565b9250509150818510156127c95760405162461bcd60e51b81526004018080602001828103825260308152602001806138ee6030913960400191505060405180910390fd5b808511156128085760405162461bcd60e51b815260040180806020018281038252603b8152602001806137f1603b913960400191505060405180910390fd5b6128168e8e8787878c61316b565b5050505050505050505050505050565b6000828152600d6020526040902054811061284057611183565b6000828152600d60205260409020805460001901908190558110156128fc576000828152600c60209081526040808320600d83528184205484529091528082208383529120815481546001600160a01b0319166001600160a01b03909116178155600180830154908201556002808301549082015560038083015490820155600480830154908201556005808301549082015560068083015490820155600780830180546128f1928401919061377a565b506008918201549101555b6000828152600c60209081526040808320600d8352818420548452909152812080546001600160a01b03191681556001810182905560028101829055600381018290556004810182905560058101829055600681018290559061296260078301826137ba565b600882016000905550505050565b60608161299557506040805180820190915260018152600360fc1b602082015261063b565b8160005b81156129ad57600101600a82049150612999565b60608167ffffffffffffffff811180156129c657600080fd5b506040519080825280601f01601f1916602001820160405280156129f1576020820181803683370190505b50905060001982015b8515612a3f57600a860660300160f81b82828060019003935081518110612a1d57fe5b60200101906001600160f81b031916908160001a905350600a860495506129fa565b50949350505050565b604080518082018252601081526f181899199a1a9b1b9c1cb0b131b232b360811b60208201528151602a80825260608281019094526001600160a01b03851692918491602082018180368337019050509050600360fc1b81600081518110612aac57fe5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612ad557fe5b60200101906001600160f81b031916908160001a90535060005b6014811015612a3f578260048583600c0160208110612b0a57fe5b1a60f81b6001600160f81b031916901c60f81c60ff1681518110612b2a57fe5b602001015160f81c60f81b828260020260020181518110612b4757fe5b60200101906001600160f81b031916908160001a905350828482600c0160208110612b6e57fe5b825191901a600f16908110612b7f57fe5b602001015160f81c60f81b828260020260030181518110612b9c57fe5b60200101906001600160f81b031916908160001a905350600101612aef565b60608160005b8151811015612c8657604160f81b828281518110612bdb57fe5b01602001516001600160f81b03191610801590612c165750605a60f81b828281518110612c0457fe5b01602001516001600160f81b03191611155b612c3a57818181518110612c2657fe5b01602001516001600160f81b031916612c5b565b818181518110612c4657fe5b602001015160f81c60f81b60f81c60200160f81b5b828281518110612c6757fe5b60200101906001600160f81b031916908160001a905350600101612bc1565b5092915050565b6000546001600160a01b0383811691161415612ca857611183565b604080516323b872dd60e01b815233600482015230602482015260448101839052905183916001600160a01b038316916323b872dd916064808201926020929091908290030181600087803b158015612d0057600080fd5b505af1158015612d14573d6000803e3d6000fd5b505050506040513d6020811015612d2a57600080fd5b505060408051636eb1769f60e11b8152306004820152737a250d5630b4cf539739df2c5dacb4c659f2488d6024820152905183916001600160a01b0384169163dd62ed3e91604480820192602092909190829003018186803b158015612d8f57600080fd5b505afa158015612da3573d6000803e3d6000fd5b505050506040513d6020811015612db957600080fd5b505111612e51576040805163095ea7b360e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d6004820152600019602482015290516001600160a01b0383169163095ea7b39160448083019260209291908290030181600087803b158015612e2457600080fd5b505af1158015612e38573d6000803e3d6000fd5b505050506040513d6020811015612e4e57600080fd5b50505b505050565b60008054819081906001600160a01b0385811691161415612f3a576040805163f305d71960e01b81526001600160a01b0387166004820152602481018b9052604481018a9052606481018890523060848201526103e8420160a48201529051737a250d5630b4cf539739df2c5dacb4c659f2488d9163f305d719918a9160c48082019260609290919082900301818588803b158015612ef457600080fd5b505af1158015612f08573d6000803e3d6000fd5b50505050506040513d6060811015612f1f57600080fd5b5080516020820151604090920151909450909250905061300b565b6040805162e8e33760e81b81526001600160a01b03878116600483015286166024820152604481018b905260648101899052608481018a905260a481018890523060c48201526103e8420160e48201529051737a250d5630b4cf539739df2c5dacb4c659f2488d9163e8e33700916101048083019260609291908290030181600087803b158015612fca57600080fd5b505af1158015612fde573d6000803e3d6000fd5b505050506040513d6060811015612ff457600080fd5b508051602082015160409092015190945090925090505b88831015613090576040805163a9059cbb60e01b8152336004820152848b03602482015290516001600160a01b0387169163a9059cbb9160448083019260209291908290030181600087803b15801561306357600080fd5b505af1158015613077573d6000803e3d6000fd5b505050506040513d602081101561308d57600080fd5b50505b8682101561315f576000546001600160a01b03858116911614156130e257604051339083890380156108fc02916000818181858888f193505050501580156130dc573d6000803e3d6000fd5b5061315f565b6040805163a9059cbb60e01b8152336004820152838903602482015290516001600160a01b0386169163a9059cbb9160448083019260209291908290030181600087803b15801561313257600080fd5b505af1158015613146573d6000803e3d6000fd5b505050506040513d602081101561315c57600080fd5b50505b96509650969350505050565b60006006878154811061317a57fe5b90600052602060002001546003888154811061319257fe5b9060005260206000200154816131a457fe5b0490506060600688815481106131b657fe5b906000526020600020015467ffffffffffffffff811180156131d757600080fd5b50604051908082528060200260200182016040528015613201578160200160208202803683370190505b5080519091501561326d578143018160008151811061321c57fe5b602090810291909101015260015b815181101561326b578282600183038151811061324357fe5b60200260200101510182828151811061325857fe5b602090810291909101015260010161322a565b505b60006005898154811061327c57fe5b906000526020600020015460048a8154811061329457fe5b90600052602060002001548802816132a857fe5b0490506132b36136da565b604051806101200160405280336001600160a01b031681526020018a815260200189815260200188815260200187815260200183815260200160038c815481106132f957fe5b90600052602060002001544301815260200184815260200160068c8154811061331e57fe5b9060005260206000200154848161333157fe5b04905290506133408a8261360f565b50506009546040805160006020808301829052828401829052606083018790526001600160a01b0394851660808085019190915284518085038201815260a08501808752639e813f1f60e01b905260a48501958652601760e48601527f6c69717569646974794d696e696e675472616e7366657200000000000000000061010486015260c4850191825280516101248601528051968c1696639e813f1f9691959194859461014490930192870191908190849084905b8381101561340e5781810151838201526020016133f6565b50505050905090810190601f16801561343b5780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b15801561345b57600080fd5b505af115801561346f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561349857600080fd5b81019080805160405193929190846401000000008211156134b857600080fd5b9083019060208201858111156134cd57600080fd5b82516401000000008111828201881017156134e757600080fd5b82525081516020918201929091019080838360005b838110156135145781810151838201526020016134fc565b50505050905090810190601f1680156135415780820380516001836020036101000a031916815260200191505b5060405250505050888a336001600160a01b03167f904bffde498b5f8b9c482208599445964bca8e5fe0837abba34df545d09aed428b8b8b888860c001518b8a61010001516040518088815260200187815260200186815260200185815260200184815260200180602001838152602001828103825284818151815260200191508051906020019060200280838360005b838110156135ea5781810151838201526020016135d2565b505050509050019850505050505050505060405180910390a450505050505050505050565b6000828152600c60209081526040808320600d83528184205484528252808320845181546001600160a01b0319166001600160a01b03909116178155848301516001820155908401516002820155606084015160038201556080840151600482015560a0840151600582015560c0840151600682015560e0840151805184938693926136a4926007850192919091019061372f565b50610100919091015160089091015550506000918252600d60205260409091208054600101905560a081015160c0909101519091565b60405180610120016040528060006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001600081525090565b82805482825590600052602060002090810192821561376a579160200282015b8281111561376a57825182559160200191906001019061374f565b506137769291506137db565b5090565b82805482825590600052602060002090810192821561376a5760005260206000209182015b8281111561376a57825482559160010191906001019061379f565b50805460008255906000526020600020908101906137d891906137db565b50565b5b8082111561377657600081556001016137dc56fe416d6f756e7420746f207374616b65206d757374206265206c657373207468616e207468652063757272656e742072656d61696e696e67206f6e65466c7573682063616e20626520646f6e65206f6e6c7920627920706f736974696f6e206f776e65724e6f206d6f72652072657761726420666f722074686973207374616b696e6720706f736974696f6e556e6c6f636b2063616e20626520646f6e65206f6e6c7920627920706f736974696f6e206f776e657243616e6e6f742061637475616c6c79207769746864726177207468697320706f736974696f6e466972737420616d6f756e74206d7573742062652067726561746572207468616e2030416d6f756e7420746f207374616b65206973206c657373207468616e207468652063757272656e74206d696e206361705365636f6e6420616d6f756e74206d7573742062652067726561746572207468616e2030a264697066735822122026a912235e77b97974fbbb034d20e13040d614f71fe7068d99cd5e45fa405efb64736f6c63430007000033000000000000000000000000e63983b5fade429ec052d1b365826c4bc5fcb1980000000000000000000000007c23ac2e8da915d4f422cf710f4767faa0c332fa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c58aa9000000000000000000000000fa7bd9fee90745189b99b95aff42ce681c58cb490000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000232800000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000030

Deployed ByteCode

0x6080604052600436106101095760003560e01c80639d63848a11610095578063cbd99d0311610064578063cbd99d03146104ed578063dd58d9d514610520578063e9c4aa6a14610563578063f39d3c49146105ab578063fdd56605146105db57610109565b80639d63848a146104195780639d76ea581461047e578063a6b8c16a14610493578063aa8b99d2146104c357610109565b806348cd4cb1116100dc57806348cd4cb1146101c25780634eb9b592146101d7578063590c2a8b146101ec5780635bfadb24146102b15780635de3326c146102e157610109565b8063083c63231461010e578063125f9e3314610135578063167e478114610166578063441a3e7014610190575b600080fd5b34801561011a57600080fd5b50610123610616565b60408051918252519081900360200190f35b34801561014157600080fd5b5061014a61061c565b604080516001600160a01b039092168252519081900360200190f35b34801561017257600080fd5b506101236004803603602081101561018957600080fd5b503561062b565b34801561019c57600080fd5b506101c0600480360360408110156101b357600080fd5b5080359060200135610640565b005b3480156101ce57600080fd5b50610123610a44565b3480156101e357600080fd5b5061014a610a4a565b3480156101f857600080fd5b5061021c6004803603604081101561020f57600080fd5b5080359060200135610a59565b604051808a6001600160a01b0316815260200189815260200188815260200187815260200186815260200185815260200184815260200180602001838152602001828103825284818151815260200191508051906020019060200280838360005b8381101561029557818101518382015260200161027d565b505050509050019a505050505050505050505060405180910390f35b3480156102bd57600080fd5b506101c0600480360360408110156102d457600080fd5b5080359060200135610b8c565b3480156102ed57600080fd5b506102f6611187565b6040518080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b8381101561034257818101518382015260200161032a565b50505050905001858103845288818151815260200191508051906020019060200280838360005b83811015610381578181015183820152602001610369565b50505050905001858103835287818151815260200191508051906020019060200280838360005b838110156103c05781810151838201526020016103a8565b50505050905001858103825286818151815260200191508051906020019060200280838360005b838110156103ff5781810151838201526020016103e7565b505050509050019850505050505050505060405180910390f35b34801561042557600080fd5b5061042e6112eb565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561046a578181015183820152602001610452565b505050509050019250505060405180910390f35b34801561048a57600080fd5b5061014a61134d565b34801561049f57600080fd5b506101c0600480360360408110156104b657600080fd5b508035906020013561135c565b3480156104cf57600080fd5b50610123600480360360208110156104e657600080fd5b503561199a565b3480156104f957600080fd5b506101c06004803603602081101561051057600080fd5b50356001600160a01b03166119ac565b34801561052c57600080fd5b5061054a6004803603602081101561054357600080fd5b5035611b72565b6040805192835260208301919091528051918290030190f35b34801561056f57600080fd5b5061058d6004803603602081101561058657600080fd5b503561200c565b60408051938452602084019290925282820152519081900360600190f35b3480156105b757600080fd5b506101c0600480360360408110156105ce57600080fd5b5080359060200135612092565b6101c0600480360360c08110156105f157600080fd5b5080359060208101359060408101359060608101359060808101359060a00135612472565b600b5490565b6009546001600160a01b031690565b6000818152600260205260409020545b919050565b6106486136da565b6000838152600c6020908152604080832085845282529182902082516101208101845281546001600160a01b031681526001820154818401526002820154818501526003820154606082015260048201546080820152600582015460a0820152600682015460c08201526007820180548551818602810186019096528086529194929360e0860193929083018282801561070157602002820191906000526020600020905b8154815260200190600101908083116106ed575b50505091835250506008919091015460209091015280519091506001600160a01b0316610769576040805162461bcd60e51b8152602060048201526011602482015270556e6b6e6f776e20506f736974696f6e2160781b604482015290519081900360640190fd5b8060c001514310156107ac5760405162461bcd60e51b81526004018080602001828103825260268152602001806138a56026913960400191505060405180910390fd5b60095460a08201516001600160a01b03909116901561085157806001600160a01b031663a9059cbb83600001518460a001516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561082457600080fd5b505af1158015610838573d6000803e3d6000fd5b505050506040513d602081101561084e57600080fd5b50505b600854602083015160018054735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9363e6a43905936001600160a01b039091169291811061088e57fe5b60009182526020918290200154604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015293909116602484015251604480840193829003018186803b1580156108e457600080fd5b505afa1580156108f8573d6000803e3d6000fd5b505050506040513d602081101561090e57600080fd5b5051825160808401516040805163a9059cbb60e01b81526001600160a01b0393841660048201526024810192909252519293509083169163a9059cbb916044808201926020929091908290030181600087803b15801561096d57600080fd5b505af1158015610981573d6000803e3d6000fd5b505050506040513d602081101561099757600080fd5b50506080808301805160208581018051600090815260028352604080822054835183529181902094909103909355518651838801516060808a0151965160a0808c01518851338152978801949094528688019890985290850152958301959095529151919388936001600160a01b03909116927fec4d7fc8319e44dfa849ab87f565622b9cf848ce9959568c3066615ce9e2ef149281900390910190a4610a3e8484612826565b50505050565b600a5490565b6007546001600160a01b031690565b600080600080600080600060606000610a706136da565b60008c8152600c602090815260408083208e845282529182902082516101208101845281546001600160a01b031681526001820154818401526002820154818501526003820154606082015260048201546080820152600582015460a0820152600682015460c08201526007820180548551818602810186019096528086529194929360e08601939290830182828015610b2957602002820191906000526020600020905b815481526020019060010190808311610b15575b505050505081526020016008820154815250509050806000015181602001518260400151836060015184608001518560a001518660c001518760e00151886101000151995099509950995099509950995099509950509295985092959850929598565b610b946136da565b6000838152600c6020908152604080832085845282529182902082516101208101845281546001600160a01b031681526001820154818401526002820154818501526003820154606082015260048201546080820152600582015460a0820152600682015460c08201526007820180548551818602810186019096528086529194929360e08601939290830182828015610c4d57602002820191906000526020600020905b815481526020019060010190808311610c39575b50505091835250506008919091015460209091015280519091506001600160a01b0316610cb5576040805162461bcd60e51b8152602060048201526011602482015270556e6b6e6f776e20506f736974696f6e2160781b604482015290519081900360640190fd5b80516001600160a01b03163314610cfd5760405162461bcd60e51b815260040180806020018281038252602981526020018061387c6029913960400191505060405180910390fd5b8060c001514310610d1857610d128383610640565b50611183565b6007546040805163ec55688960e01b815290516000926001600160a01b03169163ec556889916004808301926020929190829003018186803b158015610d5d57600080fd5b505afa158015610d71573d6000803e3d6000fd5b505050506040513d6020811015610d8757600080fd5b5051604080516331c6903d60e01b815290519192506000916001600160a01b038416916331c6903d916004808301926020929190829003018186803b158015610dcf57600080fd5b505afa158015610de3573d6000803e3d6000fd5b505050506040513d6020811015610df957600080fd5b505190506000805b8460e0015151811015610e41578460e001518181518110610e1e57fe5b602002602001015160001415610e3957846101000151820191505b600101610e01565b506009546001600160a01b03168115610ede578451604080516323b872dd60e01b81526001600160a01b0392831660048201528583166024820152604481018590529051918316916323b872dd916064808201926020929091908290030181600087803b158015610eb157600080fd5b505af1158015610ec5573d6000803e3d6000fd5b505050506040513d6020811015610edb57600080fd5b50505b806001600160a01b031663a9059cbb848760a001516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610f3957600080fd5b505af1158015610f4d573d6000803e3d6000fd5b505050506040513d6020811015610f6357600080fd5b5050600854602086015160018054735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9363e6a43905936001600160a01b0390911692918110610fa257fe5b60009182526020918290200154604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015293909116602484015251604480840193829003018186803b158015610ff857600080fd5b505afa15801561100c573d6000803e3d6000fd5b505050506040513d602081101561102257600080fd5b5051855160808701516040805163a9059cbb60e01b81526001600160a01b0393841660048201526024810192909252519293509083169163a9059cbb916044808201926020929091908290030181600087803b15801561108157600080fd5b505af1158015611095573d6000803e3d6000fd5b505050506040513d60208110156110ab57600080fd5b81019080805190602001909291905050505084608001516002600087602001518152602001908152602001600020540360026000876020015181526020019081526020016000208190555084602001518786600001516001600160a01b03167f7cbd9649881e2e080f1eebfe980ccc4f8c52dcff4cc4b94ba7fd3831a4208aa58989604001518a606001518b60800151898d60a0015101604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a461117d8787612826565b50505050505b5050565b6060806060806003600460056006838054806020026020016040519081016040528092919081815260200182805480156111e057602002820191906000526020600020905b8154815260200190600101908083116111cc575b505050505093508280548060200260200160405190810160405280929190818152602001828054801561123257602002820191906000526020600020905b81548152602001906001019080831161121e575b505050505092508180548060200260200160405190810160405280929190818152602001828054801561128457602002820191906000526020600020905b815481526020019060010190808311611270575b50505050509150808054806020026020016040519081016040528092919081815260200182805480156112d657602002820191906000526020600020905b8154815260200190600101908083116112c2575b50505050509050935093509350935090919293565b6060600180548060200260200160405190810160405280929190818152602001828054801561134357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611325575b5050505050905090565b6008546001600160a01b031690565b6113646136da565b6000838152600c6020908152604080832085845282529182902082516101208101845281546001600160a01b031681526001820154818401526002820154818501526003820154606082015260048201546080820152600582015460a0820152600682015460c08201526007820180548551818602810186019096528086529194929360e0860193929083018282801561141d57602002820191906000526020600020905b815481526020019060010190808311611409575b50505091835250506008919091015460209091015280519091506001600160a01b0316611485576040805162461bcd60e51b8152602060048201526011602482015270556e6b6e6f776e20506f736974696f6e2160781b604482015290519081900360640190fd5b80516001600160a01b031633146114cd5760405162461bcd60e51b815260040180806020018281038252602881526020018061382c6028913960400191505060405180910390fd5b6007546040805163ec55688960e01b815290516000926001600160a01b03169163ec556889916004808301926020929190829003018186803b15801561151257600080fd5b505afa158015611526573d6000803e3d6000fd5b505050506040513d602081101561153c57600080fd5b5051604080516331c6903d60e01b815290519192506000916001600160a01b038416916331c6903d916004808301926020929190829003018186803b15801561158457600080fd5b505afa158015611598573d6000803e3d6000fd5b505050506040513d60208110156115ae57600080fd5b505190506000805b8460e00151518110156116375760008560e0015182815181106115d557fe5b602002602001015111801561160157508460e0015181815181106115f557fe5b60200260200101514310155b1561162f578461010001518201915060008560e00151828151811061162257fe5b6020026020010181815250505b6001016115b6565b508360a001518111611649578061164f565b8360a001515b6009549091506001600160a01b031681156116ec57806001600160a01b031663a9059cbb8660000151846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156116bf57600080fd5b505af11580156116d3573d6000803e3d6000fd5b505050506040513d60208110156116e957600080fd5b50505b60a08501518290031561178357806001600160a01b031663a9059cbb84848860a00151036040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561175657600080fd5b505af115801561176a573d6000803e3d6000fd5b505050506040513d602081101561178057600080fd5b50505b600854602086015160018054735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9363e6a43905936001600160a01b03909116929181106117c057fe5b60009182526020918290200154604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015293909116602484015251604480840193829003018186803b15801561181657600080fd5b505afa15801561182a573d6000803e3d6000fd5b505050506040513d602081101561184057600080fd5b505160808601516040805163a9059cbb60e01b81526001600160a01b038781166004830152602482019390935290519293509083169163a9059cbb916044808201926020929091908290030181600087803b15801561189e57600080fd5b505af11580156118b2573d6000803e3d6000fd5b505050506040513d60208110156118c857600080fd5b81019080805190602001909291905050505084608001516002600087602001518152602001908152602001600020540360026000876020015181526020019081526020016000208190555084602001518786600001516001600160a01b03167fcd8847f12db1ff729f1b63807b063a343f7180ebc4045920aa25434447bdd14a8989604001518a606001518b60800151898d60a0015101604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a461117d8787612826565b6000908152600d602052604090205490565b600760009054906101000a90046001600160a01b03166001600160a01b031663ec5568896040518163ffffffff1660e01b815260040160206040518083038186803b1580156119fa57600080fd5b505afa158015611a0e573d6000803e3d6000fd5b505050506040513d6020811015611a2457600080fd5b505160408051633380ac3560e11b815290516001600160a01b0390921691636701586a91600480820192602092909190829003018186803b158015611a6857600080fd5b505afa158015611a7c573d6000803e3d6000fd5b505050506040513d6020811015611a9257600080fd5b5051604080516318c8e99960e11b815233600482015290516001600160a01b0390921691633191d33291602480820192602092909190829003018186803b158015611adc57600080fd5b505afa158015611af0573d6000803e3d6000fd5b505050506040513d6020811015611b0657600080fd5b5051611b50576040805162461bcd60e51b8152602060048201526014602482015273556e617574686f72697a656420416374696f6e2160601b604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000806000600760009054906101000a90046001600160a01b03166001600160a01b031663ec5568896040518163ffffffff1660e01b815260040160206040518083038186803b158015611bc557600080fd5b505afa158015611bd9573d6000803e3d6000fd5b505050506040513d6020811015611bef57600080fd5b50516040805163ba83c16f60e01b815290516001600160a01b039092169163ba83c16f91600480820192602092909190829003018186803b158015611c3357600080fd5b505afa158015611c47573d6000803e3d6000fd5b505050506040513d6020811015611c5d57600080fd5b505190506060611c6c85612970565b90506060611c81611c7c30612a48565b612bbb565b9050826001600160a01b0316630bb687e3828460405160200180806739ba30b5b4b7339760c11b81525060080183805190602001908083835b60208310611cd95780518252601f199092019160209182019101611cba565b51815160209384036101000a6000190180199092169116179052662e74696572735b60c81b919093019081528451600790910192850191508083835b60208310611d345780518252601f199092019160209182019101611d15565b6001836020036101000a038019825116818451168082178552505050505050905001806705d2e6d696e4361760c41b815250600801925050506040516020818303038152906040526040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611dc8578181015183820152602001611db0565b50505050905090810190601f168015611df55780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015611e1257600080fd5b505afa158015611e26573d6000803e3d6000fd5b505050506040513d6020811015611e3c57600080fd5b50516040516739ba30b5b4b7339760c11b602082810191825284516001600160a01b03881693630bb687e39387938993919260280191908501908083835b60208310611e995780518252601f199092019160209182019101611e7a565b51815160209384036101000a6000190180199092169116179052662e74696572735b60c81b919093019081528451600790910192850191508083835b60208310611ef45780518252601f199092019160209182019101611ed5565b6001836020036101000a038019825116818451168082178552505050505050905001806805d2e686172644361760bc1b815250600901925050506040516020818303038152906040526040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611f89578181015183820152602001611f71565b50505050905090810190601f168015611fb65780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015611fd357600080fd5b505afa158015611fe7573d6000803e3d6000fd5b505050506040513d6020811015611ffd57600080fd5b50519095509350505050915091565b600080600061201a84611b72565b6000868152600d60205260408120549295509093508392505b81811015612089576000868152600c60209081526040808320848452909152902060060154431015612081576000868152600c60209081526040808320848452909152902060020154909203915b600101612033565b50509193909250565b61209a6136da565b6000838152600c6020908152604080832085845282529182902082516101208101845281546001600160a01b031681526001820154818401526002820154818501526003820154606082015260048201546080820152600582015460a0820152600682015460c08201526007820180548551818602810186019096528086529194929360e0860193929083018282801561215357602002820191906000526020600020905b81548152602001906001019080831161213f575b50505091835250506008919091015460209091015280519091506001600160a01b03166121bb576040805162461bcd60e51b8152602060048201526011602482015270556e6b6e6f776e20506f736974696f6e2160781b604482015290519081900360640190fd5b8060c0015143106121d057610d128383610640565b60008160a00151116122135760405162461bcd60e51b81526004018080602001828103825260288152602001806138546028913960400191505060405180910390fd5b6000805b8260e00151518110156122985760008360e00151828151811061223657fe5b602002602001015111801561226257508260e00151818151811061225657fe5b60200260200101514310155b15612290578261010001518201915060008360e00151828151811061228357fe5b6020026020010181815250505b600101612217565b508160a0015181116122aa57806122b0565b8160a001515b9050600081116122fd576040805162461bcd60e51b81526020600482015260136024820152724e6f2072657761726420746f2072656465656d60681b604482015290519081900360640190fd5b60095482516040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810185905290519190921691829163a9059cbb916044808201926020929091908290030181600087803b15801561235857600080fd5b505af115801561236c573d6000803e3d6000fd5b505050506040513d602081101561238257600080fd5b505060a08301805183900381526000868152600c60209081526040808320888452825291829020865181546001600160a01b0319166001600160a01b0390911617815581870151600182015591860151600283015560608601516003830155608086015160048301559151600582015560c0850151600682015560e08501518051869361241692600785019291019061372f565b50610100919091015160089091015582516040805133815260208101859052815188936001600160a01b0316927f5777300364834e2d145b85cee28a0d45c4be04f1c7c24116ec72a6b5c839631b928290030190a35050505050565b600a544310156124c9576040805162461bcd60e51b815260206004820152601e60248201527f5374616b696e67206973207374696c6c206e6f7420617661696c61626c650000604482015290519081900360640190fd5b600b54431061251f576040805162461bcd60e51b815260206004820152601d60248201527f5374616b696e6720686173207265616368656420656e6420626c6f636b000000604482015290519081900360640190fd5b6001548510612564576040805162461bcd60e51b815260206004820152600c60248201526b155b9adb9bdddb88141bdbdb60a21b604482015290519081900360640190fd5b60035486106125a9576040805162461bcd60e51b815260206004820152600c60248201526b2ab735b737bbb7103a34b2b960a11b604482015290519081900360640190fd5b600084116125e85760405162461bcd60e51b81526004018080602001828103825260238152602001806138cb6023913960400191505060405180910390fd5b60008054600180546001600160a01b03909216918890811061260657fe5b6000918252602090912001546001600160a01b0316146126265782612628565b345b9050600081116126695760405162461bcd60e51b815260040180806020018281038252602481526020018061391e6024913960400191505060405180910390fd5b6007546040805163ec55688960e01b815290516000926001600160a01b03169163ec556889916004808301926020929190829003018186803b1580156126ae57600080fd5b505afa1580156126c2573d6000803e3d6000fd5b505050506040513d60208110156126d857600080fd5b50516008549091506126f3906001600160a01b031687612c8d565b61271e6001888154811061270357fe5b6000918252602090912001546001600160a01b031683612c8d565b60006001888154811061272d57fe5b60009182526020822001546008546001600160a01b0391821693508291829161275f918c918c918a918c911689612e56565b60008e81526002602052604081208054830190559295509093509150806127858e61200c565b9250509150818510156127c95760405162461bcd60e51b81526004018080602001828103825260308152602001806138ee6030913960400191505060405180910390fd5b808511156128085760405162461bcd60e51b815260040180806020018281038252603b8152602001806137f1603b913960400191505060405180910390fd5b6128168e8e8787878c61316b565b5050505050505050505050505050565b6000828152600d6020526040902054811061284057611183565b6000828152600d60205260409020805460001901908190558110156128fc576000828152600c60209081526040808320600d83528184205484529091528082208383529120815481546001600160a01b0319166001600160a01b03909116178155600180830154908201556002808301549082015560038083015490820155600480830154908201556005808301549082015560068083015490820155600780830180546128f1928401919061377a565b506008918201549101555b6000828152600c60209081526040808320600d8352818420548452909152812080546001600160a01b03191681556001810182905560028101829055600381018290556004810182905560058101829055600681018290559061296260078301826137ba565b600882016000905550505050565b60608161299557506040805180820190915260018152600360fc1b602082015261063b565b8160005b81156129ad57600101600a82049150612999565b60608167ffffffffffffffff811180156129c657600080fd5b506040519080825280601f01601f1916602001820160405280156129f1576020820181803683370190505b50905060001982015b8515612a3f57600a860660300160f81b82828060019003935081518110612a1d57fe5b60200101906001600160f81b031916908160001a905350600a860495506129fa565b50949350505050565b604080518082018252601081526f181899199a1a9b1b9c1cb0b131b232b360811b60208201528151602a80825260608281019094526001600160a01b03851692918491602082018180368337019050509050600360fc1b81600081518110612aac57fe5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612ad557fe5b60200101906001600160f81b031916908160001a90535060005b6014811015612a3f578260048583600c0160208110612b0a57fe5b1a60f81b6001600160f81b031916901c60f81c60ff1681518110612b2a57fe5b602001015160f81c60f81b828260020260020181518110612b4757fe5b60200101906001600160f81b031916908160001a905350828482600c0160208110612b6e57fe5b825191901a600f16908110612b7f57fe5b602001015160f81c60f81b828260020260030181518110612b9c57fe5b60200101906001600160f81b031916908160001a905350600101612aef565b60608160005b8151811015612c8657604160f81b828281518110612bdb57fe5b01602001516001600160f81b03191610801590612c165750605a60f81b828281518110612c0457fe5b01602001516001600160f81b03191611155b612c3a57818181518110612c2657fe5b01602001516001600160f81b031916612c5b565b818181518110612c4657fe5b602001015160f81c60f81b60f81c60200160f81b5b828281518110612c6757fe5b60200101906001600160f81b031916908160001a905350600101612bc1565b5092915050565b6000546001600160a01b0383811691161415612ca857611183565b604080516323b872dd60e01b815233600482015230602482015260448101839052905183916001600160a01b038316916323b872dd916064808201926020929091908290030181600087803b158015612d0057600080fd5b505af1158015612d14573d6000803e3d6000fd5b505050506040513d6020811015612d2a57600080fd5b505060408051636eb1769f60e11b8152306004820152737a250d5630b4cf539739df2c5dacb4c659f2488d6024820152905183916001600160a01b0384169163dd62ed3e91604480820192602092909190829003018186803b158015612d8f57600080fd5b505afa158015612da3573d6000803e3d6000fd5b505050506040513d6020811015612db957600080fd5b505111612e51576040805163095ea7b360e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d6004820152600019602482015290516001600160a01b0383169163095ea7b39160448083019260209291908290030181600087803b158015612e2457600080fd5b505af1158015612e38573d6000803e3d6000fd5b505050506040513d6020811015612e4e57600080fd5b50505b505050565b60008054819081906001600160a01b0385811691161415612f3a576040805163f305d71960e01b81526001600160a01b0387166004820152602481018b9052604481018a9052606481018890523060848201526103e8420160a48201529051737a250d5630b4cf539739df2c5dacb4c659f2488d9163f305d719918a9160c48082019260609290919082900301818588803b158015612ef457600080fd5b505af1158015612f08573d6000803e3d6000fd5b50505050506040513d6060811015612f1f57600080fd5b5080516020820151604090920151909450909250905061300b565b6040805162e8e33760e81b81526001600160a01b03878116600483015286166024820152604481018b905260648101899052608481018a905260a481018890523060c48201526103e8420160e48201529051737a250d5630b4cf539739df2c5dacb4c659f2488d9163e8e33700916101048083019260609291908290030181600087803b158015612fca57600080fd5b505af1158015612fde573d6000803e3d6000fd5b505050506040513d6060811015612ff457600080fd5b508051602082015160409092015190945090925090505b88831015613090576040805163a9059cbb60e01b8152336004820152848b03602482015290516001600160a01b0387169163a9059cbb9160448083019260209291908290030181600087803b15801561306357600080fd5b505af1158015613077573d6000803e3d6000fd5b505050506040513d602081101561308d57600080fd5b50505b8682101561315f576000546001600160a01b03858116911614156130e257604051339083890380156108fc02916000818181858888f193505050501580156130dc573d6000803e3d6000fd5b5061315f565b6040805163a9059cbb60e01b8152336004820152838903602482015290516001600160a01b0386169163a9059cbb9160448083019260209291908290030181600087803b15801561313257600080fd5b505af1158015613146573d6000803e3d6000fd5b505050506040513d602081101561315c57600080fd5b50505b96509650969350505050565b60006006878154811061317a57fe5b90600052602060002001546003888154811061319257fe5b9060005260206000200154816131a457fe5b0490506060600688815481106131b657fe5b906000526020600020015467ffffffffffffffff811180156131d757600080fd5b50604051908082528060200260200182016040528015613201578160200160208202803683370190505b5080519091501561326d578143018160008151811061321c57fe5b602090810291909101015260015b815181101561326b578282600183038151811061324357fe5b60200260200101510182828151811061325857fe5b602090810291909101015260010161322a565b505b60006005898154811061327c57fe5b906000526020600020015460048a8154811061329457fe5b90600052602060002001548802816132a857fe5b0490506132b36136da565b604051806101200160405280336001600160a01b031681526020018a815260200189815260200188815260200187815260200183815260200160038c815481106132f957fe5b90600052602060002001544301815260200184815260200160068c8154811061331e57fe5b9060005260206000200154848161333157fe5b04905290506133408a8261360f565b50506009546040805160006020808301829052828401829052606083018790526001600160a01b0394851660808085019190915284518085038201815260a08501808752639e813f1f60e01b905260a48501958652601760e48601527f6c69717569646974794d696e696e675472616e7366657200000000000000000061010486015260c4850191825280516101248601528051968c1696639e813f1f9691959194859461014490930192870191908190849084905b8381101561340e5781810151838201526020016133f6565b50505050905090810190601f16801561343b5780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b15801561345b57600080fd5b505af115801561346f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561349857600080fd5b81019080805160405193929190846401000000008211156134b857600080fd5b9083019060208201858111156134cd57600080fd5b82516401000000008111828201881017156134e757600080fd5b82525081516020918201929091019080838360005b838110156135145781810151838201526020016134fc565b50505050905090810190601f1680156135415780820380516001836020036101000a031916815260200191505b5060405250505050888a336001600160a01b03167f904bffde498b5f8b9c482208599445964bca8e5fe0837abba34df545d09aed428b8b8b888860c001518b8a61010001516040518088815260200187815260200186815260200185815260200184815260200180602001838152602001828103825284818151815260200191508051906020019060200280838360005b838110156135ea5781810151838201526020016135d2565b505050509050019850505050505050505060405180910390a450505050505050505050565b6000828152600c60209081526040808320600d83528184205484528252808320845181546001600160a01b0319166001600160a01b03909116178155848301516001820155908401516002820155606084015160038201556080840151600482015560a0840151600582015560c0840151600682015560e0840151805184938693926136a4926007850192919091019061372f565b50610100919091015160089091015550506000918252600d60205260409091208054600101905560a081015160c0909101519091565b60405180610120016040528060006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001600081525090565b82805482825590600052602060002090810192821561376a579160200282015b8281111561376a57825182559160200191906001019061374f565b506137769291506137db565b5090565b82805482825590600052602060002090810192821561376a5760005260206000209182015b8281111561376a57825482559160010191906001019061379f565b50805460008255906000526020600020908101906137d891906137db565b50565b5b8082111561377657600081556001016137dc56fe416d6f756e7420746f207374616b65206d757374206265206c657373207468616e207468652063757272656e742072656d61696e696e67206f6e65466c7573682063616e20626520646f6e65206f6e6c7920627920706f736974696f6e206f776e65724e6f206d6f72652072657761726420666f722074686973207374616b696e6720706f736974696f6e556e6c6f636b2063616e20626520646f6e65206f6e6c7920627920706f736974696f6e206f776e657243616e6e6f742061637475616c6c79207769746864726177207468697320706f736974696f6e466972737420616d6f756e74206d7573742062652067726561746572207468616e2030416d6f756e7420746f207374616b65206973206c657373207468616e207468652063757272656e74206d696e206361705365636f6e6420616d6f756e74206d7573742062652067726561746572207468616e2030a264697066735822122026a912235e77b97974fbbb034d20e13040d614f71fe7068d99cd5e45fa405efb64736f6c63430007000033