ETH Price: $2,926.60 (-7.30%)
Gas: 8 Gwei

Contract

0xCd9C7C57A2d1468686C2D141530F7b70e771C05a
 
Transaction Hash
Method
Block
From
To
Value
Harvest190690892024-01-23 11:31:59163 days ago1706009519IN
Accel: Seed Vesting
0 ETH0.0017255119.26533442
Harvest178320542023-08-03 4:21:47337 days ago1691036507IN
Accel: Seed Vesting
0 ETH0.0018946821.15406643
Harvest169996432023-04-07 22:44:47454 days ago1680907487IN
Accel: Seed Vesting
0 ETH0.0020031122.36463333
Harvest167491842023-03-03 16:31:35489 days ago1677861095IN
Accel: Seed Vesting
0 ETH0.0031958535.68158256
Harvest166714212023-02-20 18:04:47500 days ago1676916287IN
Accel: Seed Vesting
0 ETH0.0045067650.31784486
Harvest166713402023-02-20 17:48:23500 days ago1676915303IN
Accel: Seed Vesting
0 ETH0.0036789741.07561972
Harvest166502682023-02-17 18:41:59503 days ago1676659319IN
Accel: Seed Vesting
0 ETH0.003898543.52658199
Harvest165727352023-02-06 22:28:47514 days ago1675722527IN
Accel: Seed Vesting
0 ETH0.0017414527.74120286
Harvest165727312023-02-06 22:27:59514 days ago1675722479IN
Accel: Seed Vesting
0 ETH0.0022661425.30134611
Harvest165240462023-01-31 3:13:23521 days ago1675134803IN
Accel: Seed Vesting
0 ETH0.001191318.97730127
Harvest165240442023-01-31 3:12:59521 days ago1675134779IN
Accel: Seed Vesting
0 ETH0.0016665718.60719995
Harvest164978362023-01-27 11:24:59524 days ago1674818699IN
Accel: Seed Vesting
0 ETH0.0014080415.72070012
Harvest164862172023-01-25 20:27:35526 days ago1674678455IN
Accel: Seed Vesting
0 ETH0.0023481426.21696382
Harvest164711762023-01-23 18:03:59528 days ago1674497039IN
Accel: Seed Vesting
0 ETH0.0029551440.77978274
Harvest164663862023-01-23 2:02:11529 days ago1674439331IN
Accel: Seed Vesting
0 ETH0.0006812516.48047895
Harvest164663842023-01-23 2:01:47529 days ago1674439307IN
Accel: Seed Vesting
0 ETH0.0015806817.64828478
Harvest164660812023-01-23 1:00:47529 days ago1674435647IN
Accel: Seed Vesting
0 ETH0.0009253214.74034958
Harvest164660702023-01-23 0:58:35529 days ago1674435515IN
Accel: Seed Vesting
0 ETH0.0013307114.85737814
Harvest164653682023-01-22 22:36:59529 days ago1674427019IN
Accel: Seed Vesting
0 ETH0.0014096415.73859008
Harvest164645172023-01-22 19:45:23529 days ago1674416723IN
Accel: Seed Vesting
0 ETH0.0012283516.95072562
Harvest164642632023-01-22 18:53:59529 days ago1674413639IN
Accel: Seed Vesting
0 ETH0.0015011316.76004936
Harvest164639782023-01-22 17:56:47529 days ago1674410207IN
Accel: Seed Vesting
0 ETH0.0005905115.08522931
Harvest164639782023-01-22 17:56:47529 days ago1674410207IN
Accel: Seed Vesting
0 ETH0.0013511215.08522931
Harvest164627082023-01-22 13:41:47529 days ago1674394907IN
Accel: Seed Vesting
0 ETH0.0012324717.00764222
Harvest164619272023-01-22 11:05:23529 days ago1674385523IN
Accel: Seed Vesting
0 ETH0.0014547616.24242622
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
190690892024-01-23 11:31:59163 days ago1706009519
Accel: Seed Vesting
0.01913274 ETH
178320542023-08-03 4:21:47337 days ago1691036507
Accel: Seed Vesting
0.04995798 ETH
169996432023-04-07 22:44:47454 days ago1680907487
Accel: Seed Vesting
0.00706371 ETH
167491842023-03-03 16:31:35489 days ago1677861095
Accel: Seed Vesting
0.01645938 ETH
166714212023-02-20 18:04:47500 days ago1676916287
Accel: Seed Vesting
0.03204168 ETH
166713402023-02-20 17:48:23500 days ago1676915303
Accel: Seed Vesting
0.06744175 ETH
166502682023-02-17 18:41:59503 days ago1676659319
Accel: Seed Vesting
0.02928964 ETH
165727312023-02-06 22:27:59514 days ago1675722479
Accel: Seed Vesting
0.0757606 ETH
165240442023-01-31 3:12:59521 days ago1675134779
Accel: Seed Vesting
0.00833288 ETH
164978362023-01-27 11:24:59524 days ago1674818699
Accel: Seed Vesting
0.0273705 ETH
164862172023-01-25 20:27:35526 days ago1674678455
Accel: Seed Vesting
0.01146287 ETH
164711762023-01-23 18:03:59528 days ago1674497039
Accel: Seed Vesting
0.04049407 ETH
164663842023-01-23 2:01:47529 days ago1674439307
Accel: Seed Vesting
0.04391099 ETH
164660702023-01-23 0:58:35529 days ago1674435515
Accel: Seed Vesting
0.02731119 ETH
164653682023-01-22 22:36:59529 days ago1674427019
Accel: Seed Vesting
0.00969357 ETH
164645172023-01-22 19:45:23529 days ago1674416723
Accel: Seed Vesting
0.00842662 ETH
164642632023-01-22 18:53:59529 days ago1674413639
Accel: Seed Vesting
0.41160734 ETH
164639782023-01-22 17:56:47529 days ago1674410207
Accel: Seed Vesting
0.04767354 ETH
164627082023-01-22 13:41:47529 days ago1674394907
Accel: Seed Vesting
0.07369611 ETH
164619272023-01-22 11:05:23529 days ago1674385523
Accel: Seed Vesting
0.00927046 ETH
164598812023-01-22 4:13:23530 days ago1674360803
Accel: Seed Vesting
0.01818977 ETH
164595502023-01-22 3:06:59530 days ago1674356819
Accel: Seed Vesting
0.12106213 ETH
164594882023-01-22 2:54:23530 days ago1674356063
Accel: Seed Vesting
0.01672418 ETH
164584362023-01-21 23:22:47530 days ago1674343367
Accel: Seed Vesting
0.02218899 ETH
164576382023-01-21 20:42:35530 days ago1674333755
Accel: Seed Vesting
0.03067592 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SwapContract

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-25
*/

// SPDX-License-Identifier: MIT
// 84 71 32 64 84 104 101 71 104 111 115 116 68 101 118 
// ASCII

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

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

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

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

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

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}


interface IERC20 {
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract SwapContract is Ownable {
    using SafeMath for uint256;

    IERC20 public tokenOutput;

    struct TokenInputInfo {
        address addr;
        uint256 rateInput;
        uint256 rateOutput;
    }
    mapping (uint256 => TokenInputInfo) public tokenInput;

    uint256 SEED_CLIFF = 30 days;
    uint256 SEED_RELEASE_EACH_MONTH = 833; // 8.33%
    struct VipVesting {
        uint256 totalBalance;
        uint256 totalClaimed;
        uint256 start;
        uint256 end;
        uint256 claimedCheckPoint;

        // To calculate Reward
        uint256 rewardTokenDebt;
        uint256 rewardEthDebt;
    }
    mapping (address => VipVesting) public vestingList;
    mapping (address => bool) public isBlacklistWallet;

    uint256 public totalTokenForSwapping;
    uint256 public totalTokenForSeed;
    uint256 public totalTokenForPublic;

    uint256 public soldAmountSeed        = 0;
    uint256 public soldAmountPublic      = 0;
    uint256 public soldTotal             = 0;

    uint256 public TYPE_SEED = 1;
    uint256 public TYPE_PUBLIC = 2;

    uint256 public MONTH = 30 days;

    bool public swapEnabled;

    constructor() {}    
    
    function startSwap(address outputToken) public onlyOwner{
        require(swapEnabled == false, "Swap already started");
        tokenOutput = IERC20(outputToken);
        swapEnabled = true;
    }

    function stopSwap() public onlyOwner {
        swapEnabled = false;
    }

    function addInputTokenForSwap(uint256 _id, address _inputToken, uint256 _inputRate, uint256 _outputRate)public onlyOwner{
        require(_id < 3);
        tokenInput[_id].addr = _inputToken;
        tokenInput[_id].rateInput = _inputRate;
        tokenInput[_id].rateOutput = _outputRate;
    }

    receive() external payable {
    }

    function setBlacklistWallet(address account, bool blacklisted) external onlyOwner {
        isBlacklistWallet[account] = blacklisted;
    }

    function addOutputTokenForSwap(uint256 amount) public{    
        tokenOutput.transferFrom(msg.sender, address(this), amount);
        totalTokenForSwapping = totalTokenForSwapping.add(amount);
    }

    function ownerWithdrawToken(address tokenAddress, uint256 amount) public onlyOwner{    
        if(tokenAddress == address(tokenOutput)){
            require(amount < totalTokenForSwapping.sub(soldTotal), "You're trying withdraw an amount that exceed availabe balance");
            totalTokenForSwapping = totalTokenForSwapping.sub(amount);
        }
        IERC20(tokenAddress).transfer(msg.sender, amount);
    }

    function getClaimableInVesting(address account) public view returns (uint256){
        VipVesting memory vestPlan = vestingList[account];

        //Already withdraw all
        if(vestPlan.totalClaimed >= vestPlan.totalBalance){
            return 0;
        }

        //No infor
        if(vestPlan.start == 0 || vestPlan.end == 0 || vestPlan.totalBalance == 0){
            return 0;
        }
        
        uint256 currentTime = block.timestamp;
        if(currentTime >= vestPlan.end){
            return vestPlan.totalBalance.sub(vestPlan.totalClaimed);
        }else if(currentTime < vestPlan.start + SEED_CLIFF){
            return 0;
        }else {
            uint256 currentCheckPoint = 1 + (currentTime - vestPlan.start - SEED_CLIFF) / MONTH;
            if(currentCheckPoint > vestPlan.claimedCheckPoint){
                uint256 claimable =  ((currentCheckPoint - vestPlan.claimedCheckPoint) * SEED_RELEASE_EACH_MONTH * vestPlan.totalBalance) / 10000;
                return claimable;
            }else
                return 0;
        }
    }

    function balanceRemainingInVesting(address account) public view returns(uint256){
        VipVesting memory vestPlan = vestingList[account];
        return vestPlan.totalBalance -  vestPlan.totalClaimed;
    }

    function withDrawFromVesting() public {
        VipVesting storage vestPlan = vestingList[msg.sender];

        uint256 claimableAmount = getClaimableInVesting(msg.sender);
        require(claimableAmount > 0, "There isn't token in vesting that's claimable at the moment");

        uint256 currentTime = block.timestamp;
        if(currentTime > vestPlan.end){
            currentTime = vestPlan.end;
        }
        
        vestPlan.claimedCheckPoint = 1 + (currentTime - vestPlan.start - SEED_CLIFF) / MONTH;
        vestPlan.totalClaimed = vestPlan.totalClaimed.add(claimableAmount);

        tokenOutput.transfer(msg.sender, claimableAmount);
    }

    function deposite(uint256 inputTokenId, uint256 inputAmount, uint256 buyType) public payable {
        require(inputTokenId < 3, "Invalid input token ID");
        require(isBlacklistWallet[msg.sender] == false, "You're in blacklist");
        require(swapEnabled, "Swap is not available");

        IERC20 inputToken = IERC20(tokenInput[inputTokenId].addr);

        uint256 numOutputToken = inputAmount.mul(tokenInput[inputTokenId].rateOutput).mul(10**tokenOutput.decimals()).div(tokenInput[inputTokenId].rateInput);
        if(buyType == TYPE_SEED)
            numOutputToken = numOutputToken.mul(3);
     
        require(numOutputToken < totalTokenForSwapping.sub(soldTotal), "Exceed avaialble token");

        inputToken.transferFrom(msg.sender, address(this), inputAmount.mul(10**inputToken.decimals()));
        soldTotal = soldTotal.add(numOutputToken);
        addingVestToken(msg.sender, numOutputToken, buyType);
    }

    function addingVestToken(address account, uint256 amount, uint256 vType) private {
        if(vType == TYPE_SEED){
            VipVesting storage vestPlan = vestingList[account];
            soldAmountSeed = soldAmountSeed.add(amount);
            vestPlan.totalBalance = vestPlan.totalBalance.add(amount);
            vestPlan.start = vestPlan.start == 0 ? block.timestamp : vestPlan.start;
            vestPlan.end = vestPlan.end == 0 ? block.timestamp + SEED_CLIFF + (10000 / SEED_RELEASE_EACH_MONTH) * MONTH : vestPlan.end;
        }else{
            soldAmountPublic = soldAmountPublic.add(amount);
            tokenOutput.transfer(account, amount);
            return;
        }
    }

    /*REWARD FOR VESTING*/
    address public rewardToken;
    uint256 public amountTokenForReward;
    uint256 public amountEthForReward;

    uint256 public totalRewardEthDistributed;
    uint256 public totalRewardTokenDistributed;

    uint256 public rewardTokenPerSecond;
    uint256 public rewardEthPerSecond;

    // Accrued token per share
    uint256 public accTokenPerShare;    
    // Accrued EHT per share
    uint256 public accEthPerShare;
    // The block number of the last pool update
    uint256 public lastRewardTime;
    // The precision factor
    uint256 public PRECISION_FACTOR = 10**12;

    bool public enableRewardSystem;

    function startRewardSystem(address _rewardToken) public onlyOwner{
        enableRewardSystem = true;
        rewardToken = _rewardToken;
        rewardTokenPerSecond = 0.05 ether;   // 0.65 token/block
        rewardEthPerSecond = 0.000004 ether; // 10 eth/month
        
        lastRewardTime = block.timestamp;
    }

    function setNewRewardToken(address _rewardToken)public onlyOwner{
        rewardToken = _rewardToken;
    }

    function setRewardTokenPerSecond(uint256 _rewardTokenPerSecond) public onlyOwner{
        rewardTokenPerSecond = _rewardTokenPerSecond;
    }

    function setRewardEthPerSecond(uint256 _rewardEthPerSecond) public onlyOwner{
        rewardEthPerSecond = _rewardEthPerSecond;
    }

    function addTokenForReward(uint256 amount) public {
        IERC20(rewardToken).transferFrom(msg.sender, address(this), amount);
        amountTokenForReward = amountTokenForReward.add(amount);
    }

    function addEthForReward() payable public {
        amountEthForReward = amountEthForReward.add(msg.value);
    }

     
    /*
     * Harvest reward
     */
    function harvest() public {
        _updatePool();
        VipVesting storage user = vestingList[msg.sender];

        if (user.totalBalance > 0) {
            uint256 pendingToken = user.totalBalance.mul(accTokenPerShare).div(PRECISION_FACTOR).sub(user.rewardTokenDebt);
            uint256 pendingEth = user.totalBalance.mul(accEthPerShare).div(PRECISION_FACTOR).sub(user.rewardEthDebt);
            if (pendingToken > 0) {
                IERC20(rewardToken).transfer( address(msg.sender), pendingToken);
            }
            if (pendingEth > 0) {
                payable(msg.sender).transfer(pendingEth);
            }
        }
        user.rewardTokenDebt = user.totalBalance.mul(accTokenPerShare).div(PRECISION_FACTOR);
        user.rewardEthDebt = user.totalBalance.mul(accEthPerShare).div(PRECISION_FACTOR);
    }

    /*
     * @notice View function to see pending reward on frontend.
     * @param _user: user address
     * @return Pending reward for a given user
     */
    function pendingReward(address _user) external view returns (uint256, uint256) {
        VipVesting storage user = vestingList[_user];
        uint256 pendingToken;
        uint256 pendingEth;
        
        if(enableRewardSystem ==  false){
            return (0, 0);
        }

        if (block.timestamp > lastRewardTime && soldAmountSeed != 0) {
            uint256 multiplier = _getMultiplier(lastRewardTime, block.timestamp);

            uint256 tokenReward = multiplier.mul(rewardTokenPerSecond);
            if(tokenReward > amountTokenForReward){
                tokenReward = amountTokenForReward;
            }
            uint256 adjustedTokenPerShare = accTokenPerShare.add(tokenReward.mul(PRECISION_FACTOR).div(soldAmountSeed));

            uint256 ethReward = multiplier.mul(rewardEthPerSecond);
            if(ethReward > amountEthForReward){
                ethReward = amountEthForReward;
            }
            uint256 adjustedEthPerShare = accEthPerShare.add(ethReward.mul(PRECISION_FACTOR).div(soldAmountSeed));

            pendingToken =  user.totalBalance.mul(adjustedTokenPerShare).div(PRECISION_FACTOR).sub(user.rewardTokenDebt);
            pendingEth =  user.totalBalance.mul(adjustedEthPerShare).div(PRECISION_FACTOR).sub(user.rewardEthDebt);
        } else {
            pendingToken = user.totalBalance.mul(accTokenPerShare).div(PRECISION_FACTOR).sub(user.rewardTokenDebt);
            pendingEth = user.totalBalance.mul(accEthPerShare).div(PRECISION_FACTOR).sub(user.rewardEthDebt);
        }

        return (pendingToken, pendingEth);
    }


    /*
     * @notice Update reward variables of the given pool to be up-to-date.
     */
    function _updatePool() internal {
        if (block.timestamp <= lastRewardTime) {
            return;
        }

        if (enableRewardSystem == false || soldAmountSeed == 0) {
            lastRewardTime = block.timestamp;
            return;
        }

        uint256 multiplier = _getMultiplier(lastRewardTime, block.timestamp);

        uint256 tokenReward = multiplier.mul(rewardTokenPerSecond);
        if(tokenReward > amountTokenForReward){
            tokenReward = amountTokenForReward;
        }
        accTokenPerShare = accTokenPerShare.add(tokenReward.mul(PRECISION_FACTOR).div(soldAmountSeed));
        amountTokenForReward = amountTokenForReward.sub(tokenReward);
        totalRewardTokenDistributed = totalRewardTokenDistributed.add(tokenReward);


        uint256 ethReward = multiplier.mul(rewardEthPerSecond);
        if(ethReward > amountEthForReward){
            ethReward = amountEthForReward;
        }
        accEthPerShare = accEthPerShare.add(ethReward.mul(PRECISION_FACTOR).div(soldAmountSeed));
        amountEthForReward = amountEthForReward.sub(ethReward);
        totalRewardEthDistributed = totalRewardEthDistributed.add(ethReward);

        lastRewardTime = block.timestamp;
    }

    /*
     * @notice Return reward multiplier over the given _from to _to block.
     * @param _from: block to start
     * @param _to: block to finish
     */
    function _getMultiplier(uint256 _from, uint256 _to) internal pure returns (uint256) {
            return _to.sub(_from);
    }


}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"MONTH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRECISION_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TYPE_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TYPE_SEED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accEthPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accTokenPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addEthForReward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address","name":"_inputToken","type":"address"},{"internalType":"uint256","name":"_inputRate","type":"uint256"},{"internalType":"uint256","name":"_outputRate","type":"uint256"}],"name":"addInputTokenForSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addOutputTokenForSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addTokenForReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"amountEthForReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amountTokenForReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceRemainingInVesting","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"inputTokenId","type":"uint256"},{"internalType":"uint256","name":"inputAmount","type":"uint256"},{"internalType":"uint256","name":"buyType","type":"uint256"}],"name":"deposite","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"enableRewardSystem","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getClaimableInVesting","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlacklistWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRewardTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerWithdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardEthPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardTokenPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"blacklisted","type":"bool"}],"name":"setBlacklistWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"}],"name":"setNewRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardEthPerSecond","type":"uint256"}],"name":"setRewardEthPerSecond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardTokenPerSecond","type":"uint256"}],"name":"setRewardTokenPerSecond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"soldAmountPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"soldAmountSeed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"soldTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"}],"name":"startRewardSystem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"outputToken","type":"address"}],"name":"startSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenInput","outputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"rateInput","type":"uint256"},{"internalType":"uint256","name":"rateOutput","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenOutput","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewardEthDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewardTokenDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokenForPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokenForSeed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokenForSwapping","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vestingList","outputs":[{"internalType":"uint256","name":"totalBalance","type":"uint256"},{"internalType":"uint256","name":"totalClaimed","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"uint256","name":"claimedCheckPoint","type":"uint256"},{"internalType":"uint256","name":"rewardTokenDebt","type":"uint256"},{"internalType":"uint256","name":"rewardEthDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withDrawFromVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405262278d006003556103416004556000600a556000600b556000600c556001600d556002600e5562278d00600f5564e8d4a51000601a5534801561004657600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061204f806100976000396000f3fe60806040526004361061028c5760003560e01c8063a4041cfd1161015a578063ce98d80a116100c1578063efb64d511161007a578063efb64d5114610744578063f1377164146107d6578063f2fde38b146107ec578063f40f0f521461080c578063f7c618c114610841578063fd33d0401461086657600080fd5b8063ce98d80a14610692578063d2a14151146106c2578063d5999a5c146106d8578063e4a09fe4146106ee578063ea5a3acb1461070e578063ee6ff5ec1461072e57600080fd5b8063b8e94b6311610113578063b8e94b63146105e6578063b8fe0bb014610606578063baa9da1514610626578063bfd021ce1461063c578063cae45ed01461065c578063ccd34cd51461067c57600080fd5b8063a4041cfd1461054f578063a64b1d5f14610565578063b41c9eda1461057b578063b633b3641461059b578063b80161b2146105b0578063b85a2901146105d057600080fd5b80637883a422116101fe5780638da5cb5b116101b75780638da5cb5b146104a95780638f662915146104db5780639231cf74146104f15780639f9fed9b146105075780639fa12f071461050f5780639faf205f1461052f57600080fd5b80637883a422146103c65780637b199de1146103db5780637df62b6f146103f1578063836d48301461045d57806384f1049214610473578063888ba1681461049357600080fd5b80634641257d116102505780634641257d14610325578063466e35811461033a578063685c020b146103645780636ddd171314610377578063715018a61461039157806375113939146103a657600080fd5b806307867b7d146102985780630bd3896e146102c15780630ec8a311146102d757806317d0fe76146102f9578063416ff12c1461030f57600080fd5b3661029357005b600080fd5b3480156102a457600080fd5b506102ae60185481565b6040519081526020015b60405180910390f35b3480156102cd57600080fd5b506102ae60115481565b3480156102e357600080fd5b506102f76102f2366004611dc3565b61087c565b005b34801561030557600080fd5b506102ae600d5481565b34801561031b57600080fd5b506102ae60075481565b34801561033157600080fd5b506102f761091e565b34801561034657600080fd5b50601b546103549060ff1681565b60405190151581526020016102b8565b6102f7610372366004611e15565b610aa1565b34801561038357600080fd5b506010546103549060ff1681565b34801561039d57600080fd5b506102f7610e0a565b3480156103b257600080fd5b506102f76103c1366004611dc3565b610e7e565b3480156103d257600080fd5b506102f7610ead565b3480156103e757600080fd5b506102ae60095481565b3480156103fd57600080fd5b5061043861040c366004611dc3565b60026020819052600091825260409091208054600182015491909201546001600160a01b039092169183565b604080516001600160a01b0390941684526020840192909252908201526060016102b8565b34801561046957600080fd5b506102ae600a5481565b34801561047f57600080fd5b506102f761048e366004611d7e565b61102d565b34801561049f57600080fd5b506102ae60125481565b3480156104b557600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016102b8565b3480156104e757600080fd5b506102ae60175481565b3480156104fd57600080fd5b506102ae60195481565b6102f7611186565b34801561051b57600080fd5b506102f761052a366004611dc3565b611198565b34801561053b57600080fd5b506102ae61054a366004611d2e565b6111c7565b34801561055b57600080fd5b506102ae60165481565b34801561057157600080fd5b506102ae60155481565b34801561058757600080fd5b506102f7610596366004611d48565b611342565b3480156105a757600080fd5b506102f7611397565b3480156105bc57600080fd5b506102f76105cb366004611d2e565b6113cd565b3480156105dc57600080fd5b506102ae600e5481565b3480156105f257600080fd5b506102f7610601366004611d2e565b611470565b34801561061257600080fd5b506102f7610621366004611dc3565b6114c2565b34801561063257600080fd5b506102ae600c5481565b34801561064857600080fd5b506102f7610657366004611ddb565b611560565b34801561066857600080fd5b506102f7610677366004611d2e565b6115d3565b34801561068857600080fd5b506102ae601a5481565b34801561069e57600080fd5b506103546106ad366004611d2e565b60066020526000908152604090205460ff1681565b3480156106ce57600080fd5b506102ae600b5481565b3480156106e457600080fd5b506102ae600f5481565b3480156106fa57600080fd5b506001546104c3906001600160a01b031681565b34801561071a57600080fd5b506102ae610729366004611d2e565b61164b565b34801561073a57600080fd5b506102ae60085481565b34801561075057600080fd5b506107a161075f366004611d2e565b60056020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154905087565b604080519788526020880196909652948601939093526060850191909152608084015260a083015260c082015260e0016102b8565b3480156107e257600080fd5b506102ae60135481565b3480156107f857600080fd5b506102f7610807366004611d2e565b6116c1565b34801561081857600080fd5b5061082c610827366004611d2e565b6117ab565b604080519283526020830191909152016102b8565b34801561084d57600080fd5b506010546104c39061010090046001600160a01b031681565b34801561087257600080fd5b506102ae60145481565b6010546040516323b872dd60e01b8152336004820152306024820152604481018390526101009091046001600160a01b0316906323b872dd90606401602060405180830381600087803b1580156108d257600080fd5b505af11580156108e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090a9190611da7565b506011546109189082611965565b60115550565b6109266119cd565b336000908152600560205260409020805415610a66576000610971826005015461096b601a546109656017548760000154611ada90919063ffffffff16565b90611b59565b90611bb4565b9050600061099c836006015461096b601a546109656018548860000154611ada90919063ffffffff16565b90508115610a2e5760105460405163a9059cbb60e01b8152336004820152602481018490526101009091046001600160a01b03169063a9059cbb90604401602060405180830381600087803b1580156109f457600080fd5b505af1158015610a08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2c9190611da7565b505b8015610a6357604051339082156108fc029083906000818181858888f19350505050158015610a61573d6000803e3d6000fd5b505b50505b601a546017548254610a7d92916109659190611ada565b6005820155601a546018548254610a9992916109659190611ada565b600690910155565b60038310610aef5760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081a5b9c1d5d081d1bdad95b88125160521b60448201526064015b60405180910390fd5b3360009081526006602052604090205460ff1615610b455760405162461bcd60e51b8152602060048201526013602482015272165bdd49dc99481a5b88189b1858dadb1a5cdd606a1b6044820152606401610ae6565b60105460ff16610b8f5760405162461bcd60e51b815260206004820152601560248201527453776170206973206e6f7420617661696c61626c6560581b6044820152606401610ae6565b600083815260026020908152604080832080546001918201549154835163313ce56760e01b815293516001600160a01b039283169695610c5995610965949093169263313ce5679260048083019392829003018186803b158015610bf257600080fd5b505afa158015610c06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2a9190611e40565b610c3590600a611f11565b60008981526002602081905260409091200154610c53908990611ada565b90611ada565b9050600d54831415610c7357610c70816003611ada565b90505b600c54600754610c8291611bb4565b8110610cc95760405162461bcd60e51b815260206004820152601660248201527522bc31b2b2b21030bb30b4b0b6313632903a37b5b2b760511b6044820152606401610ae6565b816001600160a01b03166323b872dd3330610d60866001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610d1657600080fd5b505afa158015610d2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4e9190611e40565b610d5990600a611f11565b8990611ada565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b158015610daf57600080fd5b505af1158015610dc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de79190611da7565b50600c54610df59082611965565b600c55610e03338285611c10565b5050505050565b6000546001600160a01b03163314610e345760405162461bcd60e51b8152600401610ae690611e61565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314610ea85760405162461bcd60e51b8152600401610ae690611e61565b601555565b33600081815260056020526040812091610ec6906111c7565b905060008111610f3e5760405162461bcd60e51b815260206004820152603b60248201527f54686572652069736e277420746f6b656e20696e2076657374696e672074686160448201527f74277320636c61696d61626c6520617420746865206d6f6d656e7400000000006064820152608401610ae6565b60038201544290811115610f53575060038201545b600f546003546002850154610f689084611fdb565b610f729190611fdb565b610f7c9190611eae565b610f87906001611e96565b60048401556001830154610f9b9083611965565b6001848101919091555460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044015b602060405180830381600087803b158015610fef57600080fd5b505af1158015611003573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110279190611da7565b50505050565b6000546001600160a01b031633146110575760405162461bcd60e51b8152600401610ae690611e61565b6001546001600160a01b038381169116141561110157600c5460075461107c91611bb4565b81106110f05760405162461bcd60e51b815260206004820152603d60248201527f596f7527726520747279696e6720776974686472617720616e20616d6f756e7460448201527f20746861742065786365656420617661696c6162652062616c616e63650000006064820152608401610ae6565b6007546110fd9082611bb4565b6007555b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb90604401602060405180830381600087803b15801561114957600080fd5b505af115801561115d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111819190611da7565b505050565b6012546111939034611965565b601255565b6000546001600160a01b031633146111c25760405162461bcd60e51b8152600401610ae690611e61565b601655565b6001600160a01b0381166000908152600560208181526040808420815160e0810183528154808252600183015494820185905260028301549382019390935260038201546060820152600482015460808201529381015460a08501526006015460c08401521161123a5750600092915050565b6040810151158061124d57506060810151155b8061125757508051155b156112655750600092915050565b60608101514290811061128a576020820151825161128291611bb4565b949350505050565b600354826040015161129c9190611e96565b8110156112ad575060009392505050565b6000600f546003548460400151846112c59190611fdb565b6112cf9190611fdb565b6112d99190611eae565b6112e4906001611e96565b90508260800151811115611337576000612710846000015160045486608001518561130f9190611fdb565b6113199190611fbc565b6113239190611fbc565b61132d9190611eae565b9695505050505050565b506000949350505050565b6000546001600160a01b0316331461136c5760405162461bcd60e51b8152600401610ae690611e61565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146113c15760405162461bcd60e51b8152600401610ae690611e61565b6010805460ff19169055565b6000546001600160a01b031633146113f75760405162461bcd60e51b8152600401610ae690611e61565b60105460ff16156114415760405162461bcd60e51b815260206004820152601460248201527314ddd85c08185b1c9958591e481cdd185c9d195960621b6044820152606401610ae6565b600180546001600160a01b0319166001600160a01b03929092169190911781556010805460ff19169091179055565b6000546001600160a01b0316331461149a5760405162461bcd60e51b8152600401610ae690611e61565b601080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd90606401602060405180830381600087803b15801561151457600080fd5b505af1158015611528573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154c9190611da7565b5060075461155a9082611965565b60075550565b6000546001600160a01b0316331461158a5760405162461bcd60e51b8152600401610ae690611e61565b6003841061159757600080fd5b600093845260026020819052604090942080546001600160a01b0319166001600160a01b03949094169390931783556001830191909155910155565b6000546001600160a01b031633146115fd5760405162461bcd60e51b8152600401610ae690611e61565b601b805460ff19166001179055601080546001600160a01b0390921661010002610100600160a81b031990921691909117905566b1a2bc2ec500006015556503a35294400060165542601955565b6001600160a01b0381166000908152600560208181526040808420815160e0810183528154808252600183015494820185905260028301549382019390935260038201546060820152600482015460808201529381015460a08501526006015460c08401526116ba9190611fdb565b9392505050565b6000546001600160a01b031633146116eb5760405162461bcd60e51b8152600401610ae690611e61565b6001600160a01b0381166117505760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ae6565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600560205260408120601b548291908290819060ff166117e257506000958695509350505050565b601954421180156117f45750600a5415155b1561190757600061180760195442611d06565b9050600061182060155483611ada90919063ffffffff16565b905060115481111561183157506011545b600061185a611851600a54610965601a5486611ada90919063ffffffff16565b60175490611965565b9050600061187360165485611ada90919063ffffffff16565b905060125481111561188457506012545b60006118ad6118a4600a54610965601a5486611ada90919063ffffffff16565b60185490611965565b90506118d4886005015461096b601a54610965878d60000154611ada90919063ffffffff16565b96506118fb886006015461096b601a54610965858d60000154611ada90919063ffffffff16565b9550505050505061195a565b61192e836005015461096b601a546109656017548860000154611ada90919063ffffffff16565b9150611957836006015461096b601a546109656018548860000154611ada90919063ffffffff16565b90505b909590945092505050565b6000806119728385611e96565b9050838110156119c45760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610ae6565b90505b92915050565b60195442116119d857565b601b5460ff1615806119ea5750600a54155b156119f55742601955565b6000611a0360195442611d06565b90506000611a1c60155483611ada90919063ffffffff16565b9050601154811115611a2d57506011545b611a4b611851600a54610965601a5485611ada90919063ffffffff16565b601755601154611a5b9082611bb4565b601155601454611a6b9082611965565b601455601654600090611a7f908490611ada565b9050601254811115611a9057506012545b611aae6118a4600a54610965601a5485611ada90919063ffffffff16565b601855601254611abe9082611bb4565b601255601354611ace9082611965565b60135550504260195550565b600082611ae9575060006119c7565b6000611af58385611fbc565b905082611b028583611eae565b146119c45760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610ae6565b6000808211611baa5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610ae6565b6119c48284611eae565b600082821115611c065760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610ae6565b6119c48284611fdb565b600d54811415611cbd576001600160a01b0383166000908152600560205260409020600a54611c3f9084611965565b600a558054611c4e9084611965565b8155600281015415611c64578060020154611c66565b425b6002820155600381015415611c7f578060030154611cb2565b600f54600454611c9190612710611eae565b611c9b9190611fbc565b600354611ca89042611e96565b611cb29190611e96565b600390910155505050565b600b54611cca9083611965565b600b5560015460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529091169063a9059cbb90604401610fd5565b60006119c48284611bb4565b80356001600160a01b0381168114611d2957600080fd5b919050565b600060208284031215611d3f578081fd5b6119c482611d12565b60008060408385031215611d5a578081fd5b611d6383611d12565b91506020830135611d7381612008565b809150509250929050565b60008060408385031215611d90578182fd5b611d9983611d12565b946020939093013593505050565b600060208284031215611db8578081fd5b81516119c481612008565b600060208284031215611dd4578081fd5b5035919050565b60008060008060808587031215611df0578182fd5b84359350611e0060208601611d12565b93969395505050506040820135916060013590565b600080600060608486031215611e29578283fd5b505081359360208301359350604090920135919050565b600060208284031215611e51578081fd5b815160ff811681146119c4578182fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611ea957611ea9611ff2565b500190565b600082611ec957634e487b7160e01b81526012600452602481fd5b500490565b600181815b80851115611f09578160001904821115611eef57611eef611ff2565b80851615611efc57918102915b93841c9390800290611ed3565b509250929050565b60006119c460ff841683600082611f2a575060016119c7565b81611f37575060006119c7565b8160018114611f4d5760028114611f5757611f73565b60019150506119c7565b60ff841115611f6857611f68611ff2565b50506001821b6119c7565b5060208310610133831016604e8410600b8410161715611f96575081810a6119c7565b611fa08383611ece565b8060001904821115611fb457611fb4611ff2565b029392505050565b6000816000190483118215151615611fd657611fd6611ff2565b500290565b600082821015611fed57611fed611ff2565b500390565b634e487b7160e01b600052601160045260246000fd5b801515811461201657600080fd5b5056fea2646970667358221220b9dd06ec83914d645c45940c7d6bcedb1a0b56f6dc9d5550575820be507577c364736f6c63430008040033

Deployed Bytecode

0x60806040526004361061028c5760003560e01c8063a4041cfd1161015a578063ce98d80a116100c1578063efb64d511161007a578063efb64d5114610744578063f1377164146107d6578063f2fde38b146107ec578063f40f0f521461080c578063f7c618c114610841578063fd33d0401461086657600080fd5b8063ce98d80a14610692578063d2a14151146106c2578063d5999a5c146106d8578063e4a09fe4146106ee578063ea5a3acb1461070e578063ee6ff5ec1461072e57600080fd5b8063b8e94b6311610113578063b8e94b63146105e6578063b8fe0bb014610606578063baa9da1514610626578063bfd021ce1461063c578063cae45ed01461065c578063ccd34cd51461067c57600080fd5b8063a4041cfd1461054f578063a64b1d5f14610565578063b41c9eda1461057b578063b633b3641461059b578063b80161b2146105b0578063b85a2901146105d057600080fd5b80637883a422116101fe5780638da5cb5b116101b75780638da5cb5b146104a95780638f662915146104db5780639231cf74146104f15780639f9fed9b146105075780639fa12f071461050f5780639faf205f1461052f57600080fd5b80637883a422146103c65780637b199de1146103db5780637df62b6f146103f1578063836d48301461045d57806384f1049214610473578063888ba1681461049357600080fd5b80634641257d116102505780634641257d14610325578063466e35811461033a578063685c020b146103645780636ddd171314610377578063715018a61461039157806375113939146103a657600080fd5b806307867b7d146102985780630bd3896e146102c15780630ec8a311146102d757806317d0fe76146102f9578063416ff12c1461030f57600080fd5b3661029357005b600080fd5b3480156102a457600080fd5b506102ae60185481565b6040519081526020015b60405180910390f35b3480156102cd57600080fd5b506102ae60115481565b3480156102e357600080fd5b506102f76102f2366004611dc3565b61087c565b005b34801561030557600080fd5b506102ae600d5481565b34801561031b57600080fd5b506102ae60075481565b34801561033157600080fd5b506102f761091e565b34801561034657600080fd5b50601b546103549060ff1681565b60405190151581526020016102b8565b6102f7610372366004611e15565b610aa1565b34801561038357600080fd5b506010546103549060ff1681565b34801561039d57600080fd5b506102f7610e0a565b3480156103b257600080fd5b506102f76103c1366004611dc3565b610e7e565b3480156103d257600080fd5b506102f7610ead565b3480156103e757600080fd5b506102ae60095481565b3480156103fd57600080fd5b5061043861040c366004611dc3565b60026020819052600091825260409091208054600182015491909201546001600160a01b039092169183565b604080516001600160a01b0390941684526020840192909252908201526060016102b8565b34801561046957600080fd5b506102ae600a5481565b34801561047f57600080fd5b506102f761048e366004611d7e565b61102d565b34801561049f57600080fd5b506102ae60125481565b3480156104b557600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016102b8565b3480156104e757600080fd5b506102ae60175481565b3480156104fd57600080fd5b506102ae60195481565b6102f7611186565b34801561051b57600080fd5b506102f761052a366004611dc3565b611198565b34801561053b57600080fd5b506102ae61054a366004611d2e565b6111c7565b34801561055b57600080fd5b506102ae60165481565b34801561057157600080fd5b506102ae60155481565b34801561058757600080fd5b506102f7610596366004611d48565b611342565b3480156105a757600080fd5b506102f7611397565b3480156105bc57600080fd5b506102f76105cb366004611d2e565b6113cd565b3480156105dc57600080fd5b506102ae600e5481565b3480156105f257600080fd5b506102f7610601366004611d2e565b611470565b34801561061257600080fd5b506102f7610621366004611dc3565b6114c2565b34801561063257600080fd5b506102ae600c5481565b34801561064857600080fd5b506102f7610657366004611ddb565b611560565b34801561066857600080fd5b506102f7610677366004611d2e565b6115d3565b34801561068857600080fd5b506102ae601a5481565b34801561069e57600080fd5b506103546106ad366004611d2e565b60066020526000908152604090205460ff1681565b3480156106ce57600080fd5b506102ae600b5481565b3480156106e457600080fd5b506102ae600f5481565b3480156106fa57600080fd5b506001546104c3906001600160a01b031681565b34801561071a57600080fd5b506102ae610729366004611d2e565b61164b565b34801561073a57600080fd5b506102ae60085481565b34801561075057600080fd5b506107a161075f366004611d2e565b60056020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154905087565b604080519788526020880196909652948601939093526060850191909152608084015260a083015260c082015260e0016102b8565b3480156107e257600080fd5b506102ae60135481565b3480156107f857600080fd5b506102f7610807366004611d2e565b6116c1565b34801561081857600080fd5b5061082c610827366004611d2e565b6117ab565b604080519283526020830191909152016102b8565b34801561084d57600080fd5b506010546104c39061010090046001600160a01b031681565b34801561087257600080fd5b506102ae60145481565b6010546040516323b872dd60e01b8152336004820152306024820152604481018390526101009091046001600160a01b0316906323b872dd90606401602060405180830381600087803b1580156108d257600080fd5b505af11580156108e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090a9190611da7565b506011546109189082611965565b60115550565b6109266119cd565b336000908152600560205260409020805415610a66576000610971826005015461096b601a546109656017548760000154611ada90919063ffffffff16565b90611b59565b90611bb4565b9050600061099c836006015461096b601a546109656018548860000154611ada90919063ffffffff16565b90508115610a2e5760105460405163a9059cbb60e01b8152336004820152602481018490526101009091046001600160a01b03169063a9059cbb90604401602060405180830381600087803b1580156109f457600080fd5b505af1158015610a08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2c9190611da7565b505b8015610a6357604051339082156108fc029083906000818181858888f19350505050158015610a61573d6000803e3d6000fd5b505b50505b601a546017548254610a7d92916109659190611ada565b6005820155601a546018548254610a9992916109659190611ada565b600690910155565b60038310610aef5760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081a5b9c1d5d081d1bdad95b88125160521b60448201526064015b60405180910390fd5b3360009081526006602052604090205460ff1615610b455760405162461bcd60e51b8152602060048201526013602482015272165bdd49dc99481a5b88189b1858dadb1a5cdd606a1b6044820152606401610ae6565b60105460ff16610b8f5760405162461bcd60e51b815260206004820152601560248201527453776170206973206e6f7420617661696c61626c6560581b6044820152606401610ae6565b600083815260026020908152604080832080546001918201549154835163313ce56760e01b815293516001600160a01b039283169695610c5995610965949093169263313ce5679260048083019392829003018186803b158015610bf257600080fd5b505afa158015610c06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2a9190611e40565b610c3590600a611f11565b60008981526002602081905260409091200154610c53908990611ada565b90611ada565b9050600d54831415610c7357610c70816003611ada565b90505b600c54600754610c8291611bb4565b8110610cc95760405162461bcd60e51b815260206004820152601660248201527522bc31b2b2b21030bb30b4b0b6313632903a37b5b2b760511b6044820152606401610ae6565b816001600160a01b03166323b872dd3330610d60866001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610d1657600080fd5b505afa158015610d2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4e9190611e40565b610d5990600a611f11565b8990611ada565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b158015610daf57600080fd5b505af1158015610dc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de79190611da7565b50600c54610df59082611965565b600c55610e03338285611c10565b5050505050565b6000546001600160a01b03163314610e345760405162461bcd60e51b8152600401610ae690611e61565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314610ea85760405162461bcd60e51b8152600401610ae690611e61565b601555565b33600081815260056020526040812091610ec6906111c7565b905060008111610f3e5760405162461bcd60e51b815260206004820152603b60248201527f54686572652069736e277420746f6b656e20696e2076657374696e672074686160448201527f74277320636c61696d61626c6520617420746865206d6f6d656e7400000000006064820152608401610ae6565b60038201544290811115610f53575060038201545b600f546003546002850154610f689084611fdb565b610f729190611fdb565b610f7c9190611eae565b610f87906001611e96565b60048401556001830154610f9b9083611965565b6001848101919091555460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044015b602060405180830381600087803b158015610fef57600080fd5b505af1158015611003573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110279190611da7565b50505050565b6000546001600160a01b031633146110575760405162461bcd60e51b8152600401610ae690611e61565b6001546001600160a01b038381169116141561110157600c5460075461107c91611bb4565b81106110f05760405162461bcd60e51b815260206004820152603d60248201527f596f7527726520747279696e6720776974686472617720616e20616d6f756e7460448201527f20746861742065786365656420617661696c6162652062616c616e63650000006064820152608401610ae6565b6007546110fd9082611bb4565b6007555b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb90604401602060405180830381600087803b15801561114957600080fd5b505af115801561115d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111819190611da7565b505050565b6012546111939034611965565b601255565b6000546001600160a01b031633146111c25760405162461bcd60e51b8152600401610ae690611e61565b601655565b6001600160a01b0381166000908152600560208181526040808420815160e0810183528154808252600183015494820185905260028301549382019390935260038201546060820152600482015460808201529381015460a08501526006015460c08401521161123a5750600092915050565b6040810151158061124d57506060810151155b8061125757508051155b156112655750600092915050565b60608101514290811061128a576020820151825161128291611bb4565b949350505050565b600354826040015161129c9190611e96565b8110156112ad575060009392505050565b6000600f546003548460400151846112c59190611fdb565b6112cf9190611fdb565b6112d99190611eae565b6112e4906001611e96565b90508260800151811115611337576000612710846000015160045486608001518561130f9190611fdb565b6113199190611fbc565b6113239190611fbc565b61132d9190611eae565b9695505050505050565b506000949350505050565b6000546001600160a01b0316331461136c5760405162461bcd60e51b8152600401610ae690611e61565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146113c15760405162461bcd60e51b8152600401610ae690611e61565b6010805460ff19169055565b6000546001600160a01b031633146113f75760405162461bcd60e51b8152600401610ae690611e61565b60105460ff16156114415760405162461bcd60e51b815260206004820152601460248201527314ddd85c08185b1c9958591e481cdd185c9d195960621b6044820152606401610ae6565b600180546001600160a01b0319166001600160a01b03929092169190911781556010805460ff19169091179055565b6000546001600160a01b0316331461149a5760405162461bcd60e51b8152600401610ae690611e61565b601080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd90606401602060405180830381600087803b15801561151457600080fd5b505af1158015611528573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154c9190611da7565b5060075461155a9082611965565b60075550565b6000546001600160a01b0316331461158a5760405162461bcd60e51b8152600401610ae690611e61565b6003841061159757600080fd5b600093845260026020819052604090942080546001600160a01b0319166001600160a01b03949094169390931783556001830191909155910155565b6000546001600160a01b031633146115fd5760405162461bcd60e51b8152600401610ae690611e61565b601b805460ff19166001179055601080546001600160a01b0390921661010002610100600160a81b031990921691909117905566b1a2bc2ec500006015556503a35294400060165542601955565b6001600160a01b0381166000908152600560208181526040808420815160e0810183528154808252600183015494820185905260028301549382019390935260038201546060820152600482015460808201529381015460a08501526006015460c08401526116ba9190611fdb565b9392505050565b6000546001600160a01b031633146116eb5760405162461bcd60e51b8152600401610ae690611e61565b6001600160a01b0381166117505760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ae6565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600560205260408120601b548291908290819060ff166117e257506000958695509350505050565b601954421180156117f45750600a5415155b1561190757600061180760195442611d06565b9050600061182060155483611ada90919063ffffffff16565b905060115481111561183157506011545b600061185a611851600a54610965601a5486611ada90919063ffffffff16565b60175490611965565b9050600061187360165485611ada90919063ffffffff16565b905060125481111561188457506012545b60006118ad6118a4600a54610965601a5486611ada90919063ffffffff16565b60185490611965565b90506118d4886005015461096b601a54610965878d60000154611ada90919063ffffffff16565b96506118fb886006015461096b601a54610965858d60000154611ada90919063ffffffff16565b9550505050505061195a565b61192e836005015461096b601a546109656017548860000154611ada90919063ffffffff16565b9150611957836006015461096b601a546109656018548860000154611ada90919063ffffffff16565b90505b909590945092505050565b6000806119728385611e96565b9050838110156119c45760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610ae6565b90505b92915050565b60195442116119d857565b601b5460ff1615806119ea5750600a54155b156119f55742601955565b6000611a0360195442611d06565b90506000611a1c60155483611ada90919063ffffffff16565b9050601154811115611a2d57506011545b611a4b611851600a54610965601a5485611ada90919063ffffffff16565b601755601154611a5b9082611bb4565b601155601454611a6b9082611965565b601455601654600090611a7f908490611ada565b9050601254811115611a9057506012545b611aae6118a4600a54610965601a5485611ada90919063ffffffff16565b601855601254611abe9082611bb4565b601255601354611ace9082611965565b60135550504260195550565b600082611ae9575060006119c7565b6000611af58385611fbc565b905082611b028583611eae565b146119c45760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610ae6565b6000808211611baa5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610ae6565b6119c48284611eae565b600082821115611c065760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610ae6565b6119c48284611fdb565b600d54811415611cbd576001600160a01b0383166000908152600560205260409020600a54611c3f9084611965565b600a558054611c4e9084611965565b8155600281015415611c64578060020154611c66565b425b6002820155600381015415611c7f578060030154611cb2565b600f54600454611c9190612710611eae565b611c9b9190611fbc565b600354611ca89042611e96565b611cb29190611e96565b600390910155505050565b600b54611cca9083611965565b600b5560015460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529091169063a9059cbb90604401610fd5565b60006119c48284611bb4565b80356001600160a01b0381168114611d2957600080fd5b919050565b600060208284031215611d3f578081fd5b6119c482611d12565b60008060408385031215611d5a578081fd5b611d6383611d12565b91506020830135611d7381612008565b809150509250929050565b60008060408385031215611d90578182fd5b611d9983611d12565b946020939093013593505050565b600060208284031215611db8578081fd5b81516119c481612008565b600060208284031215611dd4578081fd5b5035919050565b60008060008060808587031215611df0578182fd5b84359350611e0060208601611d12565b93969395505050506040820135916060013590565b600080600060608486031215611e29578283fd5b505081359360208301359350604090920135919050565b600060208284031215611e51578081fd5b815160ff811681146119c4578182fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611ea957611ea9611ff2565b500190565b600082611ec957634e487b7160e01b81526012600452602481fd5b500490565b600181815b80851115611f09578160001904821115611eef57611eef611ff2565b80851615611efc57918102915b93841c9390800290611ed3565b509250929050565b60006119c460ff841683600082611f2a575060016119c7565b81611f37575060006119c7565b8160018114611f4d5760028114611f5757611f73565b60019150506119c7565b60ff841115611f6857611f68611ff2565b50506001821b6119c7565b5060208310610133831016604e8410600b8410161715611f96575081810a6119c7565b611fa08383611ece565b8060001904821115611fb457611fb4611ff2565b029392505050565b6000816000190483118215151615611fd657611fd6611ff2565b500290565b600082821015611fed57611fed611ff2565b500390565b634e487b7160e01b600052601160045260246000fd5b801515811461201657600080fd5b5056fea2646970667358221220b9dd06ec83914d645c45940c7d6bcedb1a0b56f6dc9d5550575820be507577c364736f6c63430008040033

Deployed Bytecode Sourcemap

11338:12394:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18076:29;;;;;;;;;;;;;;;;;;;9106:25:1;;;9094:2;9079:18;18076:29:0;;;;;;;;17706:35;;;;;;;;;;;;;;;;19060:202;;;;;;;;;;-1:-1:-1;19060:202:0;;;;;:::i;:::-;;:::i;:::-;;12373:28;;;;;;;;;;;;;;;;12105:36;;;;;;;;;;;;;;;;19440:843;;;;;;;;;;;;;:::i;18275:30::-;;;;;;;;;;-1:-1:-1;18275:30:0;;;;;;;;;;;3864:14:1;;3857:22;3839:41;;3827:2;3812:18;18275:30:0;3794:92:1;15980:947:0;;;;;;:::i;:::-;;:::i;12486:23::-;;;;;;;;;;-1:-1:-1;12486:23:0;;;;;;;;2676:148;;;;;;;;;;;;;:::i;18766:143::-;;;;;;;;;;-1:-1:-1;18766:143:0;;;;;:::i;:::-;;:::i;15301:671::-;;;;;;;;;;;;;:::i;12187:34::-;;;;;;;;;;;;;;;;11563:53;;;;;;;;;;-1:-1:-1;11563:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11563:53:0;;;;;;;;;;-1:-1:-1;;;;;3569:32:1;;;3551:51;;3633:2;3618:18;;3611:34;;;;3661:18;;;3654:34;3539:2;3524:18;11563:53:0;3506:188:1;12230:40:0;;;;;;;;;;;;;;;;13553:422;;;;;;;;;;-1:-1:-1;13553:422:0;;;;;:::i;:::-;;:::i;17748:33::-;;;;;;;;;;;;;;;;2025:87;;;;;;;;;;-1:-1:-1;2071:7:0;2098:6;-1:-1:-1;;;;;2098:6:0;2025:87;;;-1:-1:-1;;;;;2646:32:1;;;2628:51;;2616:2;2601:18;2025:87:0;2583:102:1;18004:31:0;;;;;;;;;;;;;;;;18161:29;;;;;;;;;;;;;;;;19270:115;;;:::i;18917:135::-;;;;;;;;;;-1:-1:-1;18917:135:0;;;;;:::i;:::-;;:::i;13983:1090::-;;;;;;;;;;-1:-1:-1;13983:1090:0;;;;;:::i;:::-;;:::i;17930:33::-;;;;;;;;;;;;;;;;17888:35;;;;;;;;;;;;;;;;13193:141;;;;;;;;;;-1:-1:-1;13193:141:0;;;;;:::i;:::-;;:::i;12759:75::-;;;;;;;;;;;;;:::i;12550:201::-;;;;;;;;;;-1:-1:-1;12550:201:0;;;;;:::i;:::-;;:::i;12408:30::-;;;;;;;;;;;;;;;;18649:109;;;;;;;;;;-1:-1:-1;18649:109:0;;;;;:::i;:::-;;:::i;13342:203::-;;;;;;;;;;-1:-1:-1;13342:203:0;;;;;:::i;:::-;;:::i;12324:40::-;;;;;;;;;;;;;;;;12842:300;;;;;;;;;;-1:-1:-1;12842:300:0;;;;;:::i;:::-;;:::i;18314:327::-;;;;;;;;;;-1:-1:-1;18314:327:0;;;;;:::i;:::-;;:::i;18226:40::-;;;;;;;;;;;;;;;;12046:50;;;;;;;;;;-1:-1:-1;12046:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;12277:40;;;;;;;;;;;;;;;;12447:30;;;;;;;;;;;;;;;;11413:25;;;;;;;;;;-1:-1:-1;11413:25:0;;;;-1:-1:-1;;;;;11413:25:0;;;15081:212;;;;;;;;;;-1:-1:-1;15081:212:0;;;;;:::i;:::-;;:::i;12148:32::-;;;;;;;;;;;;;;;;11989:50;;;;;;;;;;-1:-1:-1;11989:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9710:25:1;;;9766:2;9751:18;;9744:34;;;;9794:18;;;9787:34;;;;9852:2;9837:18;;9830:34;;;;9895:3;9880:19;;9873:35;9939:3;9924:19;;9917:35;9983:3;9968:19;;9961:35;9697:3;9682:19;11989:50:0;9664:338:1;17790:40:0;;;;;;;;;;;;;;;;2979:244;;;;;;;;;;-1:-1:-1;2979:244:0;;;;;:::i;:::-;;:::i;20456:1614::-;;;;;;;;;;-1:-1:-1;20456:1614:0;;;;;:::i;:::-;;:::i;:::-;;;;9316:25:1;;;9372:2;9357:18;;9350:34;;;;9289:18;20456:1614:0;9271:119:1;17673:26:0;;;;;;;;;;-1:-1:-1;17673:26:0;;;;;;;-1:-1:-1;;;;;17673:26:0;;;17837:42;;;;;;;;;;;;;;;;19060:202;19128:11;;19121:67;;-1:-1:-1;;;19121:67:0;;19154:10;19121:67;;;2930:34:1;19174:4:0;2980:18:1;;;2973:43;3032:18;;;3025:34;;;19128:11:0;;;;-1:-1:-1;;;;;19128:11:0;;19121:32;;2865:18:1;;19121:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;19222:20:0;;:32;;19247:6;19222:24;:32::i;:::-;19199:20;:55;-1:-1:-1;19060:202:0:o;19440:843::-;19477:13;:11;:13::i;:::-;19539:10;19501:23;19527;;;:11;:23;;;;;19567:17;;:21;19563:527;;19605:20;19628:87;19694:4;:20;;;19628:61;19672:16;;19628:39;19650:16;;19628:4;:17;;;:21;;:39;;;;:::i;:::-;:43;;:61::i;:::-;:65;;:87::i;:::-;19605:110;;19730:18;19751:83;19815:4;:18;;;19751:59;19793:16;;19751:37;19773:14;;19751:4;:17;;;:21;;:37;;;;:::i;:83::-;19730:104;-1:-1:-1;19853:16:0;;19849:121;;19897:11;;19890:64;;-1:-1:-1;;;19890:64:0;;19928:10;19890:64;;;3244:51:1;3311:18;;;3304:34;;;19897:11:0;;;;-1:-1:-1;;;;;19897:11:0;;19890:28;;3217:18:1;;19890:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19849:121;19988:14;;19984:95;;20023:40;;20031:10;;20023:40;;;;;20052:10;;20023:40;;;;20052:10;20031;20023:40;;;;;;;;;;;;;;;;;;;;;19984:95;19563:527;;;20167:16;;20145;;20123:17;;:61;;20167:16;20123:39;;:17;:21;:39::i;:61::-;20100:20;;;:84;20258:16;;20238:14;;20216:17;;:59;;20258:16;20216:37;;:17;:21;:37::i;:59::-;20195:18;;;;:80;19440:843::o;15980:947::-;16107:1;16092:12;:16;16084:51;;;;-1:-1:-1;;;16084:51:0;;8381:2:1;16084:51:0;;;8363:21:1;8420:2;8400:18;;;8393:30;-1:-1:-1;;;8439:18:1;;;8432:52;8501:18;;16084:51:0;;;;;;;;;16172:10;16154:29;;;;:17;:29;;;;;;;;:38;16146:70;;;;-1:-1:-1;;;16146:70:0;;5429:2:1;16146:70:0;;;5411:21:1;5468:2;5448:18;;;5441:30;-1:-1:-1;;;5487:18:1;;;5480:49;5546:18;;16146:70:0;5401:169:1;16146:70:0;16235:11;;;;16227:45;;;;-1:-1:-1;;;16227:45:0;;8031:2:1;16227:45:0;;;8013:21:1;8070:2;8050:18;;;8043:30;-1:-1:-1;;;8089:18:1;;;8082:51;8150:18;;16227:45:0;8003:171:1;16227:45:0;16285:17;16312:24;;;:10;:24;;;;;;;;:29;;;16469:34;;;;16441:11;;:22;;-1:-1:-1;;;16441:22:0;;;;-1:-1:-1;;;;;16312:29:0;;;;16285:17;16380:124;;:84;;16441:11;;;;:20;;:22;;;;;16312:24;16441:22;;;;;:11;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16437:26;;:2;:26;:::i;:::-;16396:24;;;;:10;:24;;;;;;;;:35;;16380:52;;:11;;:15;:52::i;:::-;:56;;:84::i;:124::-;16355:149;;16529:9;;16518:7;:20;16515:76;;;16570:21;:14;16589:1;16570:18;:21::i;:::-;16553:38;;16515:76;16660:9;;16634:21;;:36;;:25;:36::i;:::-;16617:14;:53;16609:88;;;;-1:-1:-1;;;16609:88:0;;4315:2:1;16609:88:0;;;4297:21:1;4354:2;4334:18;;;4327:30;-1:-1:-1;;;4373:18:1;;;4366:52;4435:18;;16609:88:0;4287:172:1;16609:88:0;16710:10;-1:-1:-1;;;;;16710:23:0;;16734:10;16754:4;16761:42;16781:10;-1:-1:-1;;;;;16781:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16777:25;;:2;:25;:::i;:::-;16761:11;;:15;:42::i;:::-;16710:94;;-1:-1:-1;;;;;;16710:94:0;;;;;;;-1:-1:-1;;;;;2948:15:1;;;16710:94:0;;;2930:34:1;3000:15;;;;2980:18;;;2973:43;3032:18;;;3025:34;2865:18;;16710:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;16827:9:0;;:29;;16841:14;16827:13;:29::i;:::-;16815:9;:41;16867:52;16883:10;16895:14;16911:7;16867:15;:52::i;:::-;15980:947;;;;;:::o;2676:148::-;2071:7;2098:6;-1:-1:-1;;;;;2098:6:0;751:10;2245:23;2237:68;;;;-1:-1:-1;;;2237:68:0;;;;;;;:::i;:::-;2783:1:::1;2767:6:::0;;2746:40:::1;::::0;-1:-1:-1;;;;;2767:6:0;;::::1;::::0;2746:40:::1;::::0;2783:1;;2746:40:::1;2814:1;2797:19:::0;;-1:-1:-1;;;;;;2797:19:0::1;::::0;;2676:148::o;18766:143::-;2071:7;2098:6;-1:-1:-1;;;;;2098:6:0;751:10;2245:23;2237:68;;;;-1:-1:-1;;;2237:68:0;;;;;;;:::i;:::-;18857:20:::1;:44:::0;18766:143::o;15301:671::-;15392:10;15350:27;15380:23;;;:11;:23;;;;;;15442:33;;:21;:33::i;:::-;15416:59;;15512:1;15494:15;:19;15486:91;;;;-1:-1:-1;;;15486:91:0;;6893:2:1;15486:91:0;;;6875:21:1;6932:2;6912:18;;;6905:30;6971:34;6951:18;;;6944:62;7042:29;7022:18;;;7015:57;7089:19;;15486:91:0;6865:249:1;15486:91:0;15655:12;;;;15612:15;;15641:26;;15638:83;;;-1:-1:-1;15697:12:0;;;;15638:83;15820:5;;15806:10;;15789:14;;;;15775:28;;:11;:28;:::i;:::-;:41;;;;:::i;:::-;15774:51;;;;:::i;:::-;15770:55;;:1;:55;:::i;:::-;15741:26;;;:84;15860:21;;;;:42;;15886:15;15860:25;:42::i;:::-;15836:21;;;;:66;;;;15915:11;:49;;-1:-1:-1;;;15915:49:0;;15936:10;15915:49;;;3244:51:1;3311:18;;;3304:34;;;-1:-1:-1;;;;;15915:11:0;;;;:20;;3217:18:1;;15915:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15301:671;;;:::o;13553:422::-;2071:7;2098:6;-1:-1:-1;;;;;2098:6:0;751:10;2245:23;2237:68;;;;-1:-1:-1;;;2237:68:0;;;;;;;:::i;:::-;13677:11:::1;::::0;-1:-1:-1;;;;;13653:36:0;;::::1;13677:11:::0;::::1;13653:36;13650:258;;;13748:9;::::0;13722:21:::1;::::0;:36:::1;::::0;:25:::1;:36::i;:::-;13713:6;:45;13705:119;;;::::0;-1:-1:-1;;;13705:119:0;;8732:2:1;13705:119:0::1;::::0;::::1;8714:21:1::0;8771:2;8751:18;;;8744:30;8810:34;8790:18;;;8783:62;8881:31;8861:18;;;8854:59;8930:19;;13705:119:0::1;8704:251:1::0;13705:119:0::1;13863:21;::::0;:33:::1;::::0;13889:6;13863:25:::1;:33::i;:::-;13839:21;:57:::0;13650:258:::1;13918:49;::::0;-1:-1:-1;;;13918:49:0;;13948:10:::1;13918:49;::::0;::::1;3244:51:1::0;3311:18;;;3304:34;;;-1:-1:-1;;;;;13918:29:0;::::1;::::0;::::1;::::0;3217:18:1;;13918:49:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13553:422:::0;;:::o;19270:115::-;19344:18;;:33;;19367:9;19344:22;:33::i;:::-;19323:18;:54;19270:115::o;18917:135::-;2071:7;2098:6;-1:-1:-1;;;;;2098:6:0;751:10;2245:23;2237:68;;;;-1:-1:-1;;;2237:68:0;;;;;;;:::i;:::-;19004:18:::1;:40:::0;18917:135::o;13983:1090::-;-1:-1:-1;;;;;14100:20:0;;14052:7;14100:20;;;:11;:20;;;;;;;;14071:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14165:85:0;;-1:-1:-1;14237:1:0;;13983:1090;-1:-1:-1;;13983:1090:0:o;14165:85::-;14285:14;;;;:19;;:40;;-1:-1:-1;14308:12:0;;;;:17;14285:40;:70;;;-1:-1:-1;14329:21:0;;:26;14285:70;14282:109;;;-1:-1:-1;14378:1:0;;13983:1090;-1:-1:-1;;13983:1090:0:o;14282:109::-;14477:12;;;;14433:15;;14462:27;;14459:607;;14538:21;;;;14512;;:48;;:25;:48::i;:::-;14505:55;13983:1090;-1:-1:-1;;;;13983:1090:0:o;14459:607::-;14611:10;;14594:8;:14;;;:27;;;;:::i;:::-;14580:11;:41;14577:489;;;-1:-1:-1;14644:1:0;;13983:1090;-1:-1:-1;;;13983:1090:0:o;14577:489::-;14677:25;14755:5;;14741:10;;14724:8;:14;;;14710:11;:28;;;;:::i;:::-;:41;;;;:::i;:::-;14709:51;;;;:::i;:::-;14705:55;;:1;:55;:::i;:::-;14677:83;;14798:8;:26;;;14778:17;:46;14775:279;;;14844:17;14968:5;14943:8;:21;;;14917:23;;14887:8;:26;;;14867:17;:46;;;;:::i;:::-;14866:74;;;;:::i;:::-;:98;;;;:::i;:::-;14865:108;;;;:::i;:::-;14844:129;13983:1090;-1:-1:-1;;;;;;13983:1090:0:o;14775:279::-;-1:-1:-1;15053:1:0;;13983:1090;-1:-1:-1;;;;13983:1090:0:o;13193:141::-;2071:7;2098:6;-1:-1:-1;;;;;2098:6:0;751:10;2245:23;2237:68;;;;-1:-1:-1;;;2237:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13286:26:0;;;::::1;;::::0;;;:17:::1;:26;::::0;;;;:40;;-1:-1:-1;;13286:40:0::1;::::0;::::1;;::::0;;;::::1;::::0;;13193:141::o;12759:75::-;2071:7;2098:6;-1:-1:-1;;;;;2098:6:0;751:10;2245:23;2237:68;;;;-1:-1:-1;;;2237:68:0;;;;;;;:::i;:::-;12807:11:::1;:19:::0;;-1:-1:-1;;12807:19:0::1;::::0;;12759:75::o;12550:201::-;2071:7;2098:6;-1:-1:-1;;;;;2098:6:0;751:10;2245:23;2237:68;;;;-1:-1:-1;;;2237:68:0;;;;;;;:::i;:::-;12625:11:::1;::::0;::::1;;:20;12617:53;;;::::0;-1:-1:-1;;;12617:53:0;;7682:2:1;12617:53:0::1;::::0;::::1;7664:21:1::0;7721:2;7701:18;;;7694:30;-1:-1:-1;;;7740:18:1;;;7733:50;7800:18;;12617:53:0::1;7654:170:1::0;12617:53:0::1;12681:11;:33:::0;;-1:-1:-1;;;;;;12681:33:0::1;-1:-1:-1::0;;;;;12681:33:0;;;::::1;::::0;;;::::1;::::0;;12725:11:::1;:18:::0;;-1:-1:-1;;12725:18:0::1;::::0;;::::1;::::0;;12550:201::o;18649:109::-;2071:7;2098:6;-1:-1:-1;;;;;2098:6:0;751:10;2245:23;2237:68;;;;-1:-1:-1;;;2237:68:0;;;;;;;:::i;:::-;18724:11:::1;:26:::0;;-1:-1:-1;;;;;18724:26:0;;::::1;;;-1:-1:-1::0;;;;;;18724:26:0;;::::1;::::0;;;::::1;::::0;;18649:109::o;13342:203::-;13410:11;;:59;;-1:-1:-1;;;13410:59:0;;13435:10;13410:59;;;2930:34:1;13455:4:0;2980:18:1;;;2973:43;3032:18;;;3025:34;;;-1:-1:-1;;;;;13410:11:0;;;;:24;;2865:18:1;;13410:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;13504:21:0;;:33;;13530:6;13504:25;:33::i;:::-;13480:21;:57;-1:-1:-1;13342:203:0:o;12842:300::-;2071:7;2098:6;-1:-1:-1;;;;;2098:6:0;751:10;2245:23;2237:68;;;;-1:-1:-1;;;2237:68:0;;;;;;;:::i;:::-;12987:1:::1;12981:3;:7;12973:16;;;::::0;::::1;;13000:15;::::0;;;:10:::1;:15;::::0;;;;;;;:34;;-1:-1:-1;;;;;;13000:34:0::1;-1:-1:-1::0;;;;;13000:34:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;13045:25:0;::::1;:38:::0;;;;13094:26;::::1;:40:::0;12842:300::o;18314:327::-;2071:7;2098:6;-1:-1:-1;;;;;2098:6:0;751:10;2245:23;2237:68;;;;-1:-1:-1;;;2237:68:0;;;;;;;:::i;:::-;18390:18:::1;:25:::0;;-1:-1:-1;;18390:25:0::1;18411:4;18390:25;::::0;;18426:11:::1;:26:::0;;-1:-1:-1;;;;;18426:26:0;;::::1;18390:25;18426:26;-1:-1:-1::0;;;;;;18426:26:0;;::::1;::::0;;;::::1;::::0;;18486:10:::1;18463:20;:33:::0;18550:14:::1;18529:18;:35:::0;18618:15:::1;18601:14;:32:::0;18314:327::o;15081:212::-;-1:-1:-1;;;;;15201:20:0;;15153:7;15201:20;;;:11;:20;;;;;;;;15172:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15239:46;;15172:49;15239:46;:::i;:::-;15232:53;15081:212;-1:-1:-1;;;15081:212:0:o;2979:244::-;2071:7;2098:6;-1:-1:-1;;;;;2098:6:0;751:10;2245:23;2237:68;;;;-1:-1:-1;;;2237:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3068:22:0;::::1;3060:73;;;::::0;-1:-1:-1;;;3060:73:0;;4666:2:1;3060:73:0::1;::::0;::::1;4648:21:1::0;4705:2;4685:18;;;4678:30;4744:34;4724:18;;;4717:62;-1:-1:-1;;;4795:18:1;;;4788:36;4841:19;;3060:73:0::1;4638:228:1::0;3060:73:0::1;3170:6;::::0;;3149:38:::1;::::0;-1:-1:-1;;;;;3149:38:0;;::::1;::::0;3170:6;::::1;::::0;3149:38:::1;::::0;::::1;3198:6;:17:::0;;-1:-1:-1;;;;;;3198:17:0::1;-1:-1:-1::0;;;;;3198:17:0;;;::::1;::::0;;;::::1;::::0;;2979:244::o;20456:1614::-;-1:-1:-1;;;;;20572:18:0;;20517:7;20572:18;;;:11;:18;;;;;20674;;20517:7;;20572:18;20517:7;;;;20674:18;;20671:72;;-1:-1:-1;20726:1:0;;;;-1:-1:-1;20456:1614:0;-1:-1:-1;;;;20456:1614:0:o;20671:72::-;20777:14;;20759:15;:32;:55;;;;-1:-1:-1;20795:14:0;;:19;;20759:55;20755:1262;;;20831:18;20852:47;20867:14;;20883:15;20852:14;:47::i;:::-;20831:68;;20916:19;20938:36;20953:20;;20938:10;:14;;:36;;;;:::i;:::-;20916:58;;21006:20;;20992:11;:34;20989:107;;;-1:-1:-1;21060:20:0;;20989:107;21110:29;21142:75;21163:53;21201:14;;21163:33;21179:16;;21163:11;:15;;:33;;;;:::i;:53::-;21142:16;;;:20;:75::i;:::-;21110:107;;21234:17;21254:34;21269:18;;21254:10;:14;;:34;;;;:::i;:::-;21234:54;;21318:18;;21306:9;:30;21303:99;;;-1:-1:-1;21368:18:0;;21303:99;21416:27;21446:71;21465:51;21501:14;;21465:31;21479:16;;21465:9;:13;;:31;;;;:::i;:51::-;21446:14;;;:18;:71::i;:::-;21416:101;;21550:92;21621:4;:20;;;21550:66;21599:16;;21550:44;21572:21;21550:4;:17;;;:21;;:44;;;;:::i;:92::-;21534:108;;21671:88;21740:4;:18;;;21671:64;21718:16;;21671:42;21693:19;21671:4;:17;;;:21;;:42;;;;:::i;:88::-;21657:102;;20755:1262;;;;;;;;21807:87;21873:4;:20;;;21807:61;21851:16;;21807:39;21829:16;;21807:4;:17;;;:21;;:39;;;;:::i;:87::-;21792:102;;21922:83;21986:4;:18;;;21922:59;21964:16;;21922:37;21944:14;;21922:4;:17;;;:21;;:37;;;;:::i;:83::-;21909:96;;20755:1262;22037:12;;22051:10;;-1:-1:-1;20456:1614:0;-1:-1:-1;;;20456:1614:0:o;5936:179::-;5994:7;;6026:5;6030:1;6026;:5;:::i;:::-;6014:17;;6055:1;6050;:6;;6042:46;;;;-1:-1:-1;;;6042:46:0;;5073:2:1;6042:46:0;;;5055:21:1;5112:2;5092:18;;;5085:30;5151:29;5131:18;;;5124:57;5198:18;;6042:46:0;5045:177:1;6042:46:0;6106:1;-1:-1:-1;5936:179:0;;;;;:::o;22173:1250::-;22239:14;;22220:15;:33;22216:72;;22173:1250::o;22216:72::-;22304:18;;;;:27;;:50;;-1:-1:-1;22335:14:0;;:19;22304:50;22300:136;;;22388:15;22371:14;:32;22173:1250::o;22300:136::-;22448:18;22469:47;22484:14;;22500:15;22469:14;:47::i;:::-;22448:68;;22529:19;22551:36;22566:20;;22551:10;:14;;:36;;;;:::i;:::-;22529:58;;22615:20;;22601:11;:34;22598:99;;;-1:-1:-1;22665:20:0;;22598:99;22726:75;22747:53;22785:14;;22747:33;22763:16;;22747:11;:15;;:33;;;;:::i;22726:75::-;22707:16;:94;22835:20;;:37;;22860:11;22835:24;:37::i;:::-;22812:20;:60;22913:27;;:44;;22945:11;22913:31;:44::i;:::-;22883:27;:74;23007:18;;22972:17;;22992:34;;:10;;:14;:34::i;:::-;22972:54;;23052:18;;23040:9;:30;23037:91;;;-1:-1:-1;23098:18:0;;23037:91;23155:71;23174:51;23210:14;;23174:31;23188:16;;23174:9;:13;;:31;;;;:::i;23155:71::-;23138:14;:88;23258:18;;:33;;23281:9;23258:22;:33::i;:::-;23237:18;:54;23330:25;;:40;;23360:9;23330:29;:40::i;:::-;23302:25;:68;-1:-1:-1;;23400:15:0;23383:14;:32;-1:-1:-1;22173:1250:0:o;6815:220::-;6873:7;6897:6;6893:20;;-1:-1:-1;6912:1:0;6905:8;;6893:20;6924:9;6936:5;6940:1;6936;:5;:::i;:::-;6924:17;-1:-1:-1;6969:1:0;6960:5;6964:1;6924:17;6960:5;:::i;:::-;:10;6952:56;;;;-1:-1:-1;;;6952:56:0;;6491:2:1;6952:56:0;;;6473:21:1;6530:2;6510:18;;;6503:30;6569:34;6549:18;;;6542:62;-1:-1:-1;;;6620:18:1;;;6613:31;6661:19;;6952:56:0;6463:223:1;7513:153:0;7571:7;7603:1;7599;:5;7591:44;;;;-1:-1:-1;;;7591:44:0;;6136:2:1;7591:44:0;;;6118:21:1;6175:2;6155:18;;;6148:30;6214:28;6194:18;;;6187:56;6260:18;;7591:44:0;6108:176:1;7591:44:0;7653:5;7657:1;7653;:5;:::i;6398:158::-;6456:7;6489:1;6484;:6;;6476:49;;;;-1:-1:-1;;;6476:49:0;;5777:2:1;6476:49:0;;;5759:21:1;5816:2;5796:18;;;5789:30;5855:32;5835:18;;;5828:60;5905:18;;6476:49:0;5749:180:1;6476:49:0;6543:5;6547:1;6543;:5;:::i;16935:702::-;17039:9;;17030:5;:18;17027:603;;;-1:-1:-1;;;;;17094:20:0;;17064:27;17094:20;;;:11;:20;;;;;17146:14;;:26;;17165:6;17146:18;:26::i;:::-;17129:14;:43;17211:21;;:33;;17237:6;17211:25;:33::i;:::-;17187:57;;17276:14;;;;:19;:54;;17316:8;:14;;;17276:54;;;17298:15;17276:54;17259:14;;;:71;17360:12;;;;:17;:107;;17455:8;:12;;;17360:107;;;17447:5;;17420:23;;17412:31;;:5;:31;:::i;:::-;17411:41;;;;:::i;:::-;17398:10;;17380:28;;:15;:28;:::i;:::-;:72;;;;:::i;:::-;17345:12;;;;:122;13918:49:::1;13553:422:::0;;:::o;17027:603::-;17517:16;;:28;;17538:6;17517:20;:28::i;:::-;17498:16;:47;17560:11;;:37;;-1:-1:-1;;;17560:37:0;;-1:-1:-1;;;;;3262:32:1;;;17560:37:0;;;3244:51:1;3311:18;;;3304:34;;;17560:11:0;;;;:20;;3217:18:1;;17560:37:0;3199:145:1;23597:128:0;23672:7;23703:14;:3;23711:5;23703:7;:14::i;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:196::-;251:6;304:2;292:9;283:7;279:23;275:32;272:2;;;325:6;317;310:22;272:2;353:29;372:9;353:29;:::i;393:325::-;458:6;466;519:2;507:9;498:7;494:23;490:32;487:2;;;540:6;532;525:22;487:2;568:29;587:9;568:29;:::i;:::-;558:39;;647:2;636:9;632:18;619:32;660:28;682:5;660:28;:::i;:::-;707:5;697:15;;;477:241;;;;;:::o;723:264::-;791:6;799;852:2;840:9;831:7;827:23;823:32;820:2;;;873:6;865;858:22;820:2;901:29;920:9;901:29;:::i;:::-;891:39;977:2;962:18;;;;949:32;;-1:-1:-1;;;810:177:1:o;992:255::-;1059:6;1112:2;1100:9;1091:7;1087:23;1083:32;1080:2;;;1133:6;1125;1118:22;1080:2;1170:9;1164:16;1189:28;1211:5;1189:28;:::i;1252:190::-;1311:6;1364:2;1352:9;1343:7;1339:23;1335:32;1332:2;;;1385:6;1377;1370:22;1332:2;-1:-1:-1;1413:23:1;;1322:120;-1:-1:-1;1322:120:1:o;1447:401::-;1533:6;1541;1549;1557;1610:3;1598:9;1589:7;1585:23;1581:33;1578:2;;;1632:6;1624;1617:22;1578:2;1673:9;1660:23;1650:33;;1702:38;1736:2;1725:9;1721:18;1702:38;:::i;:::-;1568:280;;1692:48;;-1:-1:-1;;;;1787:2:1;1772:18;;1759:32;;1838:2;1823:18;1810:32;;1568:280::o;1853:326::-;1930:6;1938;1946;1999:2;1987:9;1978:7;1974:23;1970:32;1967:2;;;2020:6;2012;2005:22;1967:2;-1:-1:-1;;2048:23:1;;;2118:2;2103:18;;2090:32;;-1:-1:-1;2169:2:1;2154:18;;;2141:32;;1957:222;-1:-1:-1;1957:222:1:o;2184:293::-;2252:6;2305:2;2293:9;2284:7;2280:23;2276:32;2273:2;;;2326:6;2318;2311:22;2273:2;2363:9;2357:16;2413:4;2406:5;2402:16;2395:5;2392:27;2382:2;;2438:6;2430;2423:22;7119:356;7321:2;7303:21;;;7340:18;;;7333:30;7399:34;7394:2;7379:18;;7372:62;7466:2;7451:18;;7293:182::o;10007:128::-;10047:3;10078:1;10074:6;10071:1;10068:13;10065:2;;;10084:18;;:::i;:::-;-1:-1:-1;10120:9:1;;10055:80::o;10140:217::-;10180:1;10206;10196:2;;-1:-1:-1;;;10231:31:1;;10285:4;10282:1;10275:15;10313:4;10238:1;10303:15;10196:2;-1:-1:-1;10342:9:1;;10186:171::o;10362:422::-;10451:1;10494:5;10451:1;10508:270;10529:7;10519:8;10516:21;10508:270;;;10588:4;10584:1;10580:6;10576:17;10570:4;10567:27;10564:2;;;10597:18;;:::i;:::-;10647:7;10637:8;10633:22;10630:2;;;10667:16;;;;10630:2;10746:22;;;;10706:15;;;;10508:270;;;10512:3;10426:358;;;;;:::o;10789:140::-;10847:5;10876:47;10917:4;10907:8;10903:19;10897:4;10983:5;11013:8;11003:2;;-1:-1:-1;11054:1:1;11068:5;;11003:2;11102:4;11092:2;;-1:-1:-1;11139:1:1;11153:5;;11092:2;11184:4;11202:1;11197:59;;;;11270:1;11265:130;;;;11177:218;;11197:59;11227:1;11218:10;;11241:5;;;11265:130;11302:3;11292:8;11289:17;11286:2;;;11309:18;;:::i;:::-;-1:-1:-1;;11365:1:1;11351:16;;11380:5;;11177:218;;11479:2;11469:8;11466:16;11460:3;11454:4;11451:13;11447:36;11441:2;11431:8;11428:16;11423:2;11417:4;11414:12;11410:35;11407:77;11404:2;;;-1:-1:-1;11516:19:1;;;11548:5;;11404:2;11595:34;11620:8;11614:4;11595:34;:::i;:::-;11665:6;11661:1;11657:6;11653:19;11644:7;11641:32;11638:2;;;11676:18;;:::i;:::-;11714:20;;10993:747;-1:-1:-1;;;10993:747:1:o;11745:168::-;11785:7;11851:1;11847;11843:6;11839:14;11836:1;11833:21;11828:1;11821:9;11814:17;11810:45;11807:2;;;11858:18;;:::i;:::-;-1:-1:-1;11898:9:1;;11797:116::o;11918:125::-;11958:4;11986:1;11983;11980:8;11977:2;;;11991:18;;:::i;:::-;-1:-1:-1;12028:9:1;;11967:76::o;12048:127::-;12109:10;12104:3;12100:20;12097:1;12090:31;12140:4;12137:1;12130:15;12164:4;12161:1;12154:15;12180:118;12266:5;12259:13;12252:21;12245:5;12242:32;12232:2;;12288:1;12285;12278:12;12232:2;12222:76;:::o

Swarm Source

ipfs://b9dd06ec83914d645c45940c7d6bcedb1a0b56f6dc9d5550575820be507577c3

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

Seed vesting 12 months with 8.33% releasing monthly.

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.