ETH Price: $2,072.16 (+11.88%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Accept Ownership215774462025-01-08 4:44:35413 days ago1736311475IN
0x9397c190...Cd9F0d01D
0 ETH0.000169635.65478105
Withdraw194049522024-03-10 13:20:23717 days ago1710076823IN
0x9397c190...Cd9F0d01D
0 ETH0.0045820840.46670183
Reward Claim193626712024-03-04 15:24:11723 days ago1709565851IN
0x9397c190...Cd9F0d01D
0 ETH0.0066082292.99102081
Withdraw193626682024-03-04 15:23:35723 days ago1709565815IN
0x9397c190...Cd9F0d01D
0 ETH0.0104078891.91727177
Withdraw191314672024-02-01 5:20:47755 days ago1706764847IN
0x9397c190...Cd9F0d01D
0 ETH0.0012880317.66460137
Reward Claim191314632024-02-01 5:19:59755 days ago1706764799IN
0x9397c190...Cd9F0d01D
0 ETH0.0016359417.49619178
Withdraw180805772023-09-06 23:07:59903 days ago1694041679IN
0x9397c190...Cd9F0d01D
0 ETH0.0009949211.04978088
Reward Claim176059662023-07-02 11:16:11969 days ago1688296571IN
0x9397c190...Cd9F0d01D
0 ETH0.0007394814.40909231
Reward Claim To176059552023-07-02 11:13:59969 days ago1688296439IN
0x9397c190...Cd9F0d01D
0 ETH0.0007951314.53494272
Withdraw175001302023-06-17 14:29:23984 days ago1687012163IN
0x9397c190...Cd9F0d01D
0 ETH0.001383615.36657066
Reward Claim175001132023-06-17 14:25:59984 days ago1687011959IN
0x9397c190...Cd9F0d01D
0 ETH0.0012181516.37234995
Withdraw169045482023-03-25 12:42:111068 days ago1679748131IN
0x9397c190...Cd9F0d01D
0 ETH0.0018223520.23942508
Reward Claim167748422023-03-07 7:08:231086 days ago1678172903IN
0x9397c190...Cd9F0d01D
0 ETH0.0016852821.87458813
Withdraw167714332023-03-06 19:37:591087 days ago1678131479IN
0x9397c190...Cd9F0d01D
0 ETH0.003103534.46810679
Reward Claim167714252023-03-06 19:36:231087 days ago1678131383IN
0x9397c190...Cd9F0d01D
0 ETH0.002964738.48117585
Withdraw164820092023-01-25 6:21:111127 days ago1674627671IN
0x9397c190...Cd9F0d01D
0 ETH0.0013964115.51090274
Deposit164731442023-01-24 0:39:471128 days ago1674520787IN
0x9397c190...Cd9F0d01D
0 ETH0.0017169315.11297253
Withdraw164702872023-01-23 15:05:231129 days ago1674486323IN
0x9397c190...Cd9F0d01D
0 ETH0.0039476143.84285706
Reward Claim164604352023-01-22 6:04:231130 days ago1674367463IN
0x9397c190...Cd9F0d01D
0 ETH0.0011849815.9991936
Reward Claim164559552023-01-21 15:04:471131 days ago1674313487IN
0x9397c190...Cd9F0d01D
0 ETH0.0015523716.60245354
Withdraw163884062023-01-12 4:42:231140 days ago1673498543IN
0x9397c190...Cd9F0d01D
0 ETH0.0015245916.93243407
Reward Claim161520012022-12-10 4:45:351173 days ago1670647535IN
0x9397c190...Cd9F0d01D
0 ETH0.001212315.73538133
Reward Claim161329492022-12-07 12:53:351176 days ago1670417615IN
0x9397c190...Cd9F0d01D
0 ETH0.000949713.36433185
Withdraw161329462022-12-07 12:52:591176 days ago1670417579IN
0x9397c190...Cd9F0d01D
0 ETH0.0016276614.37470881
Withdraw161096282022-12-04 6:22:351179 days ago1670134955IN
0x9397c190...Cd9F0d01D
0 ETH0.001075311.33958031
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BFCETHSushiSwapReward

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, BSD-3-Clause license
/**
 *Submitted for verification at Etherscan.io on 2021-09-06
*/

// File: contracts/module/safeMath.sol

// SPDX-License-Identifier: BSD-3-Clause
pragma solidity 0.6.12;

/**
 * @title BiFi's safe-math Contract
 * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo)
 */
contract safeMathModule {
    uint256 constant one = 1 ether;

    function expDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        return safeDiv( safeMul(a, one), b);
    }
    function expMul(uint256 a, uint256 b) internal pure returns (uint256) {
        return safeDiv( safeMul(a, b), one);
    }
    function safeAdd(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addtion overflow");
        return c;
    }
    function safeSub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(a >= b, "SafeMath: subtraction overflow");
        return a - b;
    }
    function safeMul(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;
    }
    function safeDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return (a/b);
    }
}

// File: contracts/ERC20.sol

pragma solidity 0.6.12;

/**
 * @title BiFi's ERC20 Mockup Contract
 * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo)
 */
contract ERC20 {
    string symbol;
    string name;
    uint8 decimals = 18;
    uint256 public totalSupply = 1000 * 1e9 * 1e18; // token amount: 1000 Bilions

    // Owner of this contract
    address public owner;

    // Balances for each account
    mapping(address => uint256) balances;

    // Owner of account approves the transfer of an amount to another account
    mapping(address => mapping (address => uint256)) allowed;

    // Functions with this modifier can only be executed by the owner
    modifier onlyOwner() {
        require(msg.sender == owner, "only owner");
        _;
    }

    event Transfer(address, address, uint256);
    event Approval(address, address, uint256);

    // Constructor
    constructor (string memory _name, string memory _symbol) public {

        owner = msg.sender;

        name = _name;
        symbol = _symbol;
        balances[msg.sender] = totalSupply;
    }

    // What is the balance of a particular account?
    function balanceOf(address _owner) public view returns (uint256 balance) {
        return balances[_owner];
    }

    // Transfer the balance from owner's account to another account
    function transfer(address _to, uint256 _amount) public returns (bool success) {

        require(balances[msg.sender] >= _amount, "insuficient sender's balance");
        require(_amount > 0, "requested amount must be positive");
        require(balances[_to] + _amount > balances[_to], "receiver's balance overflows");

        balances[msg.sender] -= _amount;
        balances[_to] += _amount;
        emit Transfer(msg.sender, _to, _amount);
        return true;
    }

    // Send _value amount of tokens from address _from to address _to
    // The transferFrom method is used for a withdraw workflow, allowing contracts to send
    // tokens on your behalf, for example to "deposit" to a contract address and/or to charge
    // fees in sub-currencies; the command should fail unless the _from account has
    // deliberately authorized the sender of the message via some mechanism; we propose
    // these standardized APIs for approval:
    function transferFrom(address _from, address _to,uint256 _amount) public returns (bool success) {

        require(balances[_from] >= _amount, "insuficient sender's balance");
        require(allowed[_from][msg.sender] >= _amount, "not allowed transfer");
        require(_amount > 0, "requested amount must be positive");
        require(balances[_to] + _amount > balances[_to], "receiver's balance overflows");

        balances[_from] -= _amount;
        allowed[_from][msg.sender] -= _amount;
        balances[_to] += _amount;
        emit Transfer(_from, _to, _amount);

        return true;
    }

    // Allow _spender to withdraw from your account, multiple times, up to the _value amount.
    // If this function is called again it overwrites the current allowance with _value.
    function approve(address _spender, uint256 _amount) public returns (bool success) {
        allowed[msg.sender][_spender] = _amount;
        emit Approval(msg.sender, _spender, _amount);
        return true;
    }

    function allowance(address _owner, address _spender) public view returns (uint256 remaining) {
        return allowed[_owner][_spender];
    }
}

contract BFCtoken is ERC20 {
    constructor() public ERC20 ("Bifrost", "BFC") {}
}

contract LPtoken is ERC20 {
    constructor() public ERC20 ("BFC-ETH", "LP") {}
}

contract BiFitoken is ERC20 {
    constructor() public ERC20 ("BiFi", "BiFi") {}
}

// File: contracts/module/storageModule.sol

pragma solidity 0.6.12;


/**
 * @title BiFi's Reward Distribution Storage Contract
 * @notice Define the basic Contract State
 * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo)
 */
contract storageModule {
    address public owner;
    address public pendingOwner;

    bool public claimLock;
    bool public withdrawLock;

    uint256 public rewardPerBlock;
    uint256 public decrementUnitPerBlock;
    uint256 public rewardLane;

    uint256 public lastBlockNum;
    uint256 public totalDeposited;

    ERC20 public lpErc; ERC20 public rewardErc;

    mapping(address => Account) public accounts;

    uint256 public passedPoint;
    RewardVelocityPoint[] public registeredPoints;

    struct Account {
        uint256 deposited;
        uint256 pointOnLane;
        uint256 rewardAmount;
    }

    struct RewardVelocityPoint {
        uint256 blockNumber;
        uint256 rewardPerBlock;
        uint256 decrementUnitPerBlock;
    }

    struct UpdateRewardLaneModel {
        uint256 len; uint256 tmpBlockDelta;

        uint256 memPassedPoint; uint256 tmpPassedPoint;

        uint256 memThisBlockNum;
        uint256 memLastBlockNum; uint256 tmpLastBlockNum;

        uint256 memTotalDeposit;

        uint256 memRewardLane; uint256 tmpRewardLane;
        uint256 memRewardPerBlock; uint256 tmpRewardPerBlock;

        uint256 memDecrementUnitPerBlock; uint256 tmpDecrementUnitPerBlock;
    }
}

// File: contracts/module/eventModule.sol

pragma solidity 0.6.12;

/**
 * @title BiFi's Reward Distribution Event Contract
 * @notice Define the service Events
 * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo)
 */
contract eventModule {
    /// @dev Events for user actions
    event Deposit(address userAddr, uint256 amount, uint256 userDeposit, uint256 totalDeposit);
    event Withdraw(address userAddr, uint256 amount, uint256 userDeposit, uint256 totalDeposit);
    event Claim(address userAddr, uint256 amount);
    event UpdateRewardParams(uint256 atBlockNumber, uint256 rewardPerBlock, uint256 decrementUnitPerBlock);

    /// @dev Events for admin actions below

    /// @dev Contracts Access Control
    event ClaimLock(bool lock);
    event WithdrawLock(bool lock);
    event OwnershipTransfer(address from, address to);

    /// @dev Distribution Model Parameter editer
    event SetRewardParams(uint256 rewardPerBlock, uint256 decrementUnitPerBlock);
    event RegisterRewardParams(uint256 atBlockNumber, uint256 rewardPerBlock, uint256 decrementUnitPerBlock);
    event DeleteRegisterRewardParams(uint256 index, uint256 atBlockNumber, uint256 rewardPerBlock, uint256 decrementUnitPerBlock, uint256 arrayLen);
}

// File: contracts/module/internalModule.sol

pragma solidity 0.6.12;




/**
 * @title BiFi's Reward Distribution Internal Contract
 * @notice Implement the basic functions for staking and reward distribution
 * @dev All functions are internal.
 * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo)
 */
contract internalModule is storageModule, eventModule, safeMathModule {
    /**
     * @notice Deposit the Contribution Tokens
     * @param userAddr The user address of the Contribution Tokens
     * @param amount The amount of the Contribution Tokens
     */
    function _deposit(address userAddr, uint256 amount) internal {
        Account memory user = accounts[userAddr];
        uint256 totalDeposit = totalDeposited;

        user.deposited = safeAdd(user.deposited, amount);
        accounts[userAddr].deposited = user.deposited;
        totalDeposit = safeAdd(totalDeposited, amount);
        totalDeposited = totalDeposit;

        if(amount > 0) {
            /// @dev transfer the Contribution Toknes to this contract.
            emit Deposit(userAddr, amount, user.deposited, totalDeposit);
            require( lpErc.transferFrom(msg.sender, address(this), amount), "token error" );
        }
    }

    /**
     * @notice Withdraw the Contribution Tokens
     * @param userAddr The user address of the Contribution Tokens
     * @param amount The amount of the Contribution Tokens
     */
    function _withdraw(address userAddr, uint256 amount) internal {
        Account memory user = accounts[userAddr];
        uint256 totalDeposit = totalDeposited;
        require(user.deposited >= amount, "not enough user Deposit");

        user.deposited = safeSub(user.deposited, amount);
        accounts[userAddr].deposited = user.deposited;
        totalDeposit = safeSub(totalDeposited, amount);
        totalDeposited = totalDeposit;

        if(amount > 0) {
            /// @dev transfer the Contribution Tokens from this contact.
            emit Withdraw(userAddr, amount, user.deposited, totalDeposit);
            require( lpErc.transfer(userAddr, amount), "token error" );
        }
    }

    /**
     * @notice Calculate current reward
     * @dev This function is called whenever the balance of the Contribution
       Tokens of the user.
     * @param userAddr The user address of the Contribution and Reward Tokens
     */
    function _redeemAll(address userAddr) internal {
        Account memory user = accounts[userAddr];

        uint256 newRewardLane = _updateRewardLane();

        uint256 distance = safeSub(newRewardLane, user.pointOnLane);
        uint256 rewardAmount = expMul(user.deposited, distance);

        if(user.pointOnLane != newRewardLane) accounts[userAddr].pointOnLane = newRewardLane;
        if(rewardAmount != 0) accounts[userAddr].rewardAmount = safeAdd(user.rewardAmount, rewardAmount);
    }

    /**
     * @notice Claim the Reward Tokens
     * @dev Transfer all reward the user has earned at once.
     * @param userAddr The user address of the Reward Tokens
     */
    function _rewardClaim(address userAddr) internal {
        Account memory user = accounts[userAddr];

        if(user.rewardAmount != 0) {
            uint256 amount = user.rewardAmount;
            accounts[userAddr].rewardAmount = 0;

            /// @dev transfer the Reward Tokens from this contract.
            emit Claim(userAddr, amount);
            require(rewardErc.transfer(userAddr, amount), "token error" );
        }
    }

    /**
     * @notice Update the reward lane value upto ths currnet moment (block)
     * @dev This function should care the "reward velocity points," at which the
       parameters of reward distribution are changed.
     * @return The current (calculated) reward lane value
     */
    function _updateRewardLane() internal returns (uint256) {
        /// @dev Set up memory variables used for calculation temporarily.
        UpdateRewardLaneModel memory vars;

        vars.len = registeredPoints.length;
        vars.memTotalDeposit = totalDeposited;

        vars.tmpPassedPoint = vars.memPassedPoint = passedPoint;

        vars.memThisBlockNum = block.number;
        vars.tmpLastBlockNum = vars.memLastBlockNum = lastBlockNum;

        vars.tmpRewardLane = vars.memRewardLane = rewardLane;
        vars.tmpRewardPerBlock = vars.memRewardPerBlock = rewardPerBlock;
        vars.tmpDecrementUnitPerBlock = vars.memDecrementUnitPerBlock = decrementUnitPerBlock;

        for(uint256 i=vars.memPassedPoint; i<vars.len; i++) {
            RewardVelocityPoint memory point = registeredPoints[i];

            /**
             * @dev Check whether this reward velocity point is valid and has
               not applied yet.
             */
            if(vars.tmpLastBlockNum < point.blockNumber && point.blockNumber <= vars.memThisBlockNum) {
                vars.tmpPassedPoint = i+1;
                /// @dev Update the reward lane with the tmp variables
                vars.tmpBlockDelta = safeSub(point.blockNumber, vars.tmpLastBlockNum);
                (vars.tmpRewardLane, vars.tmpRewardPerBlock) =
                _calcNewRewardLane(
                    vars.tmpRewardLane,
                    vars.memTotalDeposit,
                    vars.tmpRewardPerBlock,
                    vars.tmpDecrementUnitPerBlock,
                    vars.tmpBlockDelta);

                /// @dev Update the tmp variables with this reward velocity point.
                vars.tmpLastBlockNum = point.blockNumber;
                vars.tmpRewardPerBlock = point.rewardPerBlock;
                vars.tmpDecrementUnitPerBlock = point.decrementUnitPerBlock;
                /**
                 * @dev Notify the update of the parameters (by passing the
                   reward velocity points)
                 */
                emit UpdateRewardParams(point.blockNumber, point.rewardPerBlock, point.decrementUnitPerBlock);
            } else {
                /// @dev sorted array, exit eariler without accessing future points.
                break;
            }
        }

        /**
         * @dev Update the reward lane for the remained period between the
           latest velocity point and this moment (block)
         */
        if( vars.tmpLastBlockNum < vars.memThisBlockNum ) {
            vars.tmpBlockDelta = safeSub(vars.memThisBlockNum, vars.tmpLastBlockNum);
            vars.tmpLastBlockNum = vars.memThisBlockNum;
            (vars.tmpRewardLane, vars.tmpRewardPerBlock) =
            _calcNewRewardLane(
                vars.tmpRewardLane,
                vars.memTotalDeposit,
                vars.tmpRewardPerBlock,
                vars.tmpDecrementUnitPerBlock,
                vars.tmpBlockDelta);
        }

        /**
         * @dev Update the reward lane parameters with the tmp variables.
         */
        if(vars.memLastBlockNum != vars.tmpLastBlockNum) lastBlockNum = vars.tmpLastBlockNum;
        if(vars.memPassedPoint != vars.tmpPassedPoint) passedPoint = vars.tmpPassedPoint;
        if(vars.memRewardLane != vars.tmpRewardLane) rewardLane = vars.tmpRewardLane;
        if(vars.memRewardPerBlock != vars.tmpRewardPerBlock) rewardPerBlock = vars.tmpRewardPerBlock;
        if(vars.memDecrementUnitPerBlock != vars.tmpDecrementUnitPerBlock) decrementUnitPerBlock = vars.tmpDecrementUnitPerBlock;

        return vars.tmpRewardLane;
    }

    /**
     * @notice Calculate a new reward lane value with the given parameters
     * @param _rewardLane The previous reward lane value
     * @param _totalDeposit Thte total deposit amount of the Contribution Tokens
     * @param _rewardPerBlock The reward token amount per a block
     * @param _decrementUnitPerBlock The decerement amount of the reward token per a block
     */
    function _calcNewRewardLane(
        uint256 _rewardLane,
        uint256 _totalDeposit,
        uint256 _rewardPerBlock,
        uint256 _decrementUnitPerBlock,
        uint256 delta) internal pure returns (uint256, uint256) {
            uint256 executableDelta;
            if(_decrementUnitPerBlock != 0) {
                executableDelta = safeDiv(_rewardPerBlock, _decrementUnitPerBlock);
                if(delta > executableDelta) delta = executableDelta;
                else executableDelta = 0;
            }

            uint256 distance;
            if(_totalDeposit != 0) {
                distance = expMul( _sequencePartialSumAverage(_rewardPerBlock, delta, _decrementUnitPerBlock), safeMul( expDiv(one, _totalDeposit), delta) );
                _rewardLane = safeAdd(_rewardLane, distance);
            }

            if(executableDelta != 0) _rewardPerBlock = 0;
            else _rewardPerBlock = _getNewRewardPerBlock(_rewardPerBlock, _decrementUnitPerBlock, delta);

            return (_rewardLane, _rewardPerBlock);
    }

    /**
     * @notice Register a new reward velocity point
     * @dev We assume that reward velocity points are stored in order of block
       number. Namely, registerPoints is always a sorted array.
     * @param _blockNumber The block number for the point.
     * @param _rewardPerBlock The reward token amount per a block
     * @param _decrementUnitPerBlock The decerement amount of the reward token per a block
     */
    function _registerRewardVelocity(uint256 _blockNumber, uint256 _rewardPerBlock, uint256 _decrementUnitPerBlock) internal {
        RewardVelocityPoint memory varPoint = RewardVelocityPoint(_blockNumber, _rewardPerBlock, _decrementUnitPerBlock);
        emit RegisterRewardParams(_blockNumber, _rewardPerBlock, _decrementUnitPerBlock);
        registeredPoints.push(varPoint);
    }

    /**
     * @notice Delete a existing reward velocity point
     * @dev We assume that reward velocity points are stored in order of block
       number. Namely, registerPoints is always a sorted array.
     * @param _index The index number of deleting point in state array.
     */
    function _deleteRegisteredRewardVelocity(uint256 _index) internal {
        uint256 len = registeredPoints.length;
        require(len != 0 && _index < len, "error: no elements in registeredPoints");

        RewardVelocityPoint memory point = registeredPoints[_index];
        emit DeleteRegisterRewardParams(_index, point.blockNumber, point.rewardPerBlock, point.decrementUnitPerBlock, len-1);
        for(uint256 i=_index; i<len-1; i++) {
            registeredPoints[i] = registeredPoints[i+1];
        }
        registeredPoints.pop();
     }

    /**
     * @notice Set paramaters for the reward distribution
     * @param _rewardPerBlock The reward token amount per a block
     * @param _decrementUnitPerBlock The decerement amount of the reward token per a block
     */
    function _setParams(uint256 _rewardPerBlock, uint256 _decrementUnitPerBlock) internal {
        emit SetRewardParams(_rewardPerBlock, _decrementUnitPerBlock);
        rewardPerBlock = _rewardPerBlock;
        decrementUnitPerBlock = _decrementUnitPerBlock;
    }

    /**
     * @return the avaerage of the RewardLance of the inactive (i.e., no-action)
       periods.
    */
    function _sequencePartialSumAverage(uint256 a, uint256 n, uint256 d) internal pure returns (uint256) {
        /**
        @dev return Sn / n,
                where Sn = ( (n{2*a + (n-1)d}) / 2 )
            == ( (2na + (n-1)d) / 2 ) / n
            caveat: use safeSub() to avoid the case that d is negative
        */
        if (n > 0)
            return safeDiv(safeSub( safeMul(2,a), safeMul( safeSub(n,1), d) ), 2);
        else
            return 0;
    }

    function _getNewRewardPerBlock(uint256 before, uint256 dec, uint256 delta) internal pure returns (uint256) {
        return safeSub(before, safeMul(dec, delta));
    }

    function _setClaimLock(bool lock) internal {
        emit ClaimLock(lock);
        claimLock = lock;
    }

    function _setWithdrawLock(bool lock) internal {
        emit WithdrawLock(lock);
        withdrawLock = lock;
    }

    function _setOwner(address newOwner) internal {
        require(newOwner != address(0), "owner zero address");
        emit OwnershipTransfer(owner, newOwner);
        owner = newOwner;
    }

    function _setPendingOwner(address _pendingOwner) internal {
        require(_pendingOwner != address(0), "pending owner zero address");
        pendingOwner = _pendingOwner;
    }
}

// File: contracts/module/viewModule.sol

pragma solidity 0.6.12;


/**
 * @title BiFi's Reward Distribution View Contract
 * @notice Implements the view functions for support front-end
 * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo)
 */
contract viewModule is internalModule {
    function marketInformation(uint256 _fromBlockNumber, uint256 _toBlockNumber) external view returns (
        uint256 rewardStartBlockNumber,
        uint256 distributedAmount,
        uint256 totalDeposit,
        uint256 poolRate
        )
    {
        if(rewardPerBlock == 0) rewardStartBlockNumber = registeredPoints[0].blockNumber;
        else rewardStartBlockNumber = registeredPoints[0].blockNumber;

        distributedAmount = _redeemAllView(address(0));

        totalDeposit = totalDeposited;

        poolRate = getPoolRate(address(0), _fromBlockNumber, _toBlockNumber);

        return (
            rewardStartBlockNumber,
            distributedAmount,
            totalDeposit,
            poolRate
        );
    }

    function userInformation(address userAddr, uint256 _fromBlockNumber, uint256 _toBlockNumber) external view returns (
        uint256 stakedTokenAmount,
        uint256 rewardStartBlockNumber,
        uint256 claimStartBlockNumber,
        uint256 earnedTokenAmount,
        uint256 poolRate
        )
    {
        Account memory user = accounts[userAddr];

        stakedTokenAmount = user.deposited;

        if(rewardPerBlock == 0) rewardStartBlockNumber = registeredPoints[0].blockNumber;
        else rewardStartBlockNumber = registeredPoints[0].blockNumber;

        earnedTokenAmount = _redeemAllView(userAddr);

        poolRate = getPoolRate(userAddr, _fromBlockNumber, _toBlockNumber);

        return (stakedTokenAmount, rewardStartBlockNumber, claimStartBlockNumber, earnedTokenAmount, poolRate);
    }

    function modelInfo() external view returns (uint256, uint256, uint256, uint256, uint256) {
        return (rewardPerBlock, decrementUnitPerBlock, rewardLane, lastBlockNum, totalDeposited);
    }

    function getParams() external view returns (uint256, uint256, uint256, uint256) {
        return (rewardPerBlock, rewardLane, lastBlockNum, totalDeposited);
    }

    function getRegisteredPointLength() external view returns (uint256) {
        return registeredPoints.length;
    }

    function getRegisteredPoint(uint256 index) external view returns (uint256, uint256, uint256) {
        RewardVelocityPoint memory point = registeredPoints[index];
        return (point.blockNumber, point.rewardPerBlock, point.decrementUnitPerBlock);
    }

    function userInfo(address userAddr) external view returns (uint256, uint256, uint256) {
        Account memory user = accounts[userAddr];
        uint256 earnedRewardAmount = _redeemAllView(userAddr);

        return (user.deposited, user.pointOnLane, earnedRewardAmount);
    }

    function distributionInfo() external view returns (uint256, uint256, uint256) {
        uint256 totalDistributedRewardAmount_now = _distributedRewardAmountView();
        return (rewardPerBlock, decrementUnitPerBlock, totalDistributedRewardAmount_now);
    }

    function _distributedRewardAmountView() internal view returns (uint256) {
        return _redeemAllView( address(0) );
    }

    function _redeemAllView(address userAddr) internal view returns (uint256) {
        Account memory user;
        uint256 newRewardLane;
        if( userAddr != address(0) ) {
            user = accounts[userAddr];
            newRewardLane = _updateRewardLaneView(lastBlockNum);
        } else {
            user = Account(totalDeposited, 0, 0);
            newRewardLane = _updateRewardLaneView(0);
        }

        uint256 distance = safeSub(newRewardLane, user.pointOnLane);
        uint256 rewardAmount = expMul(user.deposited, distance);

        return safeAdd(user.rewardAmount, rewardAmount);
    }

    function _updateRewardLaneView(uint256 fromBlockNumber) internal view returns (uint256) {
        /// @dev Set up memory variables used for calculation temporarily.
        UpdateRewardLaneModel memory vars;

        vars.len = registeredPoints.length;
        vars.memTotalDeposit = totalDeposited;

        if(fromBlockNumber == 0){
            vars.tmpPassedPoint = vars.memPassedPoint = 0;

            vars.memThisBlockNum = block.number;
            vars.tmpLastBlockNum = vars.memLastBlockNum = 0;
            vars.tmpRewardLane = vars.memRewardLane = 0;
            vars.tmpRewardPerBlock = vars.memRewardPerBlock = 0;
            vars.tmpDecrementUnitPerBlock = vars.memDecrementUnitPerBlock = 0;
        } else {
            vars.tmpPassedPoint = vars.memPassedPoint = passedPoint;
            vars.memThisBlockNum = block.number;
            vars.tmpLastBlockNum = vars.memLastBlockNum = fromBlockNumber;

            vars.tmpRewardLane = vars.memRewardLane = rewardLane;
            vars.tmpRewardPerBlock = vars.memRewardPerBlock = rewardPerBlock;
            vars.tmpDecrementUnitPerBlock = vars.memDecrementUnitPerBlock = decrementUnitPerBlock;
        }

        for(uint256 i=vars.memPassedPoint; i<vars.len; i++) {
            RewardVelocityPoint memory point = registeredPoints[i];
            /**
             * @dev Check whether this reward velocity point is valid and has
               not applied yet.
             */
            if(vars.tmpLastBlockNum < point.blockNumber && point.blockNumber <= vars.memThisBlockNum) {
                vars.tmpPassedPoint = i+1;
                /// @dev Update the reward lane with the tmp variables
                vars.tmpBlockDelta = safeSub(point.blockNumber, vars.tmpLastBlockNum);
                (vars.tmpRewardLane, vars.tmpRewardPerBlock) =
                _calcNewRewardLane(
                    vars.tmpRewardLane,
                    vars.memTotalDeposit,
                    vars.tmpRewardPerBlock,
                    vars.tmpDecrementUnitPerBlock,
                    vars.tmpBlockDelta);

                /// @dev Update the tmp variables with this reward velocity point.
                vars.tmpLastBlockNum = point.blockNumber;
                vars.tmpRewardPerBlock = point.rewardPerBlock;
                vars.tmpDecrementUnitPerBlock = point.decrementUnitPerBlock;
                /**
                 * @dev Notify the update of the parameters (by passing the
                   reward velocity points)
                 */
            } else {
                /// @dev sorted array, exit eariler without accessing future points.
                break;
            }
        }

        /**
         * @dev Update the reward lane for the remained period between the
           latest velocity point and this moment (block)
         */
        if(vars.memThisBlockNum > vars.tmpLastBlockNum) {
            vars.tmpBlockDelta = safeSub(vars.memThisBlockNum, vars.tmpLastBlockNum);
            vars.tmpLastBlockNum = vars.memThisBlockNum;
            (vars.tmpRewardLane, vars.tmpRewardPerBlock) =
            _calcNewRewardLane(
                vars.tmpRewardLane,
                vars.memTotalDeposit,
                vars.tmpRewardPerBlock,
                vars.tmpDecrementUnitPerBlock,
                vars.tmpBlockDelta);
        }
        return vars.tmpRewardLane;
    }
    /**
     * @notice Get The rewardPerBlock of user in suggested period(see params)
     * @param userAddr The Address of user, 0 for total
     * @param fromBlockNumber calculation start block number
     * @param toBlockNumber calculation end block number
     * @notice this function calculate based on current contract state
     */
    function getPoolRate(address userAddr, uint256 fromBlockNumber, uint256 toBlockNumber) internal view returns (uint256) {
        UpdateRewardLaneModel memory vars;

        vars.len = registeredPoints.length;
        vars.memTotalDeposit = totalDeposited;

        vars.tmpLastBlockNum = vars.memLastBlockNum = fromBlockNumber;
        (vars.memPassedPoint, vars.memRewardPerBlock, vars.memDecrementUnitPerBlock) = getParamsByBlockNumber(fromBlockNumber);
        vars.tmpPassedPoint = vars.memPassedPoint;
        vars.tmpRewardPerBlock = vars.memRewardPerBlock;
        vars.tmpDecrementUnitPerBlock = vars.memDecrementUnitPerBlock;

        vars.memThisBlockNum = toBlockNumber;
        vars.tmpRewardLane = vars.memRewardLane = 0;

        for(uint256 i=vars.memPassedPoint; i<vars.len; i++) {
            RewardVelocityPoint memory point = registeredPoints[i];

            if(vars.tmpLastBlockNum < point.blockNumber && point.blockNumber <= vars.memThisBlockNum) {
                vars.tmpPassedPoint = i+1;
                vars.tmpBlockDelta = safeSub(point.blockNumber, vars.tmpLastBlockNum);
                (vars.tmpRewardLane, vars.tmpRewardPerBlock) =
                _calcNewRewardLane(
                    vars.tmpRewardLane,
                    vars.memTotalDeposit,
                    vars.tmpRewardPerBlock,
                    vars.tmpDecrementUnitPerBlock,
                    vars.tmpBlockDelta);

                vars.tmpLastBlockNum = point.blockNumber;
                vars.tmpRewardPerBlock = point.rewardPerBlock;
                vars.tmpDecrementUnitPerBlock = point.decrementUnitPerBlock;

            } else {
                break;
            }
        }

        if(vars.memThisBlockNum > vars.tmpLastBlockNum) {
            vars.tmpBlockDelta = safeSub(vars.memThisBlockNum, vars.tmpLastBlockNum);
            vars.tmpLastBlockNum = vars.memThisBlockNum;
            (vars.tmpRewardLane, vars.tmpRewardPerBlock) =
            _calcNewRewardLane(
                vars.tmpRewardLane,
                vars.memTotalDeposit,
                vars.tmpRewardPerBlock,
                vars.tmpDecrementUnitPerBlock,
                vars.tmpBlockDelta);
        }

        Account memory user;
        if( userAddr != address(0) ) user = accounts[userAddr];
        else user = Account(vars.memTotalDeposit, 0, 0);

        return safeDiv(expMul(user.deposited, vars.tmpRewardLane), safeSub(toBlockNumber, fromBlockNumber));
    }

    function getParamsByBlockNumber(uint256 _blockNumber) internal view returns (uint256, uint256, uint256) {
        uint256 _rewardPerBlock; uint256 _decrement;
        uint256 i;

        uint256 tmpthisPoint;

        uint256 pointLength = registeredPoints.length;
        if( pointLength > 0 ) {
            for(i = 0; i < pointLength; i++) {
                RewardVelocityPoint memory point = registeredPoints[i];
                if(_blockNumber >= point.blockNumber && 0 != point.blockNumber) {
                    tmpthisPoint = i;
                    _rewardPerBlock = point.rewardPerBlock;
                    _decrement = point.decrementUnitPerBlock;
                } else if( 0 == point.blockNumber ) continue;
                else break;
            }
        }
        RewardVelocityPoint memory point = registeredPoints[tmpthisPoint];
        _rewardPerBlock = point.rewardPerBlock;
        _decrement = point.decrementUnitPerBlock;
        if(_blockNumber > point.blockNumber) {
            _rewardPerBlock = safeSub(_rewardPerBlock, safeMul(_decrement, safeSub(_blockNumber, point.blockNumber) ) );
        }
        return (i, _rewardPerBlock, _decrement);
    }

    function getUserPoolRate(address userAddr, uint256 fromBlockNumber, uint256 toBlockNumber) external view returns (uint256) {
        return getPoolRate(userAddr, fromBlockNumber, toBlockNumber);
    }

    function getModelPoolRate(uint256 fromBlockNumber, uint256 toBlockNumber) external view returns (uint256) {
        return getPoolRate(address(0), fromBlockNumber, toBlockNumber);
    }
}

// File: contracts/module/externalModule.sol

pragma solidity 0.6.12;


/**
 * @title BiFi's Reward Distribution External Contract
 * @notice Implements the service actions.
 * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo)
 */
contract externalModule is viewModule {
    modifier onlyOwner() {
        require(msg.sender == owner, "onlyOwner: external function access control!");
        _;
    }
    modifier checkClaimLocked() {
        require(!claimLock, "error: claim Locked");
        _;
    }
    modifier checkWithdrawLocked() {
        require(!withdrawLock, "error: withdraw Locked");
        _;
    }

    /**
     * @notice Set the Deposit-Token address
     * @param erc20Addr The address of Deposit Token
     */
    function setERC(address erc20Addr) external onlyOwner {
        lpErc = ERC20(erc20Addr);
    }

    /**
     * @notice Set the Contribution-Token address
     * @param erc20Addr The address of Contribution Token
     */
    function setRE(address erc20Addr) external onlyOwner {
        rewardErc = ERC20(erc20Addr);
    }

    /**
     * @notice Set the reward distribution parameters instantly
     */
    function setParam(uint256 _rewardPerBlock, uint256 _decrementUnitPerBlock) onlyOwner external {
        _setParams(_rewardPerBlock, _decrementUnitPerBlock);
    }

    /**
     * @notice Terminate Contract Distribution
     */
    function modelFinish(uint256 amount) external onlyOwner {
        if( amount != 0) {
            require( rewardErc.transfer(owner, amount), "token error" );
        }
        else {
            require( rewardErc.transfer(owner, rewardErc.balanceOf(address(this))), "token error" );
        }
        delete totalDeposited;
        delete rewardPerBlock;
        delete decrementUnitPerBlock;
        delete rewardLane;
        delete totalDeposited;
        delete registeredPoints;
    }

    /**
     * @notice Transfer the Remaining Contribution Tokens
     */
    function retrieveRewardAmount(uint256 amount) external onlyOwner {
        if( amount != 0) {
            require( rewardErc.transfer(owner, amount), "token error");
        }
        else {
            require( rewardErc.transfer(owner, rewardErc.balanceOf(address(this))), "token error");
        }
    }

    /**
     * @notice Deposit the Contribution Tokens
     * @param amount The amount of the Contribution Tokens
     */
    function deposit(uint256 amount) external {
        address userAddr = msg.sender;
        _redeemAll(userAddr);
        _deposit(userAddr, amount);
    }

    /**
     * @notice Deposit the Contribution Tokens to target user
     * @param userAddr The target user
     * @param amount The amount of the Contribution Tokens
     */
    function depositTo(address userAddr, uint256 amount) external {
        _redeemAll(userAddr);
        _deposit(userAddr, amount);
    }

    /**
     * @notice Withdraw the Contribution Tokens
     * @param amount The amount of the Contribution Tokens
     */
    function withdraw(uint256 amount) checkWithdrawLocked external {
        address userAddr = msg.sender;
        _redeemAll(userAddr);
        _withdraw(userAddr, amount);
    }

    /**
     * @notice Claim the Reward Tokens
     * @dev Transfer all reward the user has earned at once.
     */
    function rewardClaim() checkClaimLocked external {
        address userAddr = msg.sender;
        _redeemAll(userAddr);
        _rewardClaim(userAddr);
    }
    /**
     * @notice Claim the Reward Tokens
     * @param userAddr The targetUser
     * @dev Transfer all reward the target user has earned at once.
     */
    function rewardClaimTo(address userAddr) checkClaimLocked external {
        _redeemAll(userAddr);
        _rewardClaim(userAddr);
    }

    /// @dev Set locks & access control
    function setClaimLock(bool lock) onlyOwner external {
        _setClaimLock(lock);
    }
    function setWithdrawLock(bool lock) onlyOwner external {
        _setWithdrawLock(lock);
    }

    function ownershipTransfer(address newPendingOwner) onlyOwner external {
        _setPendingOwner(newPendingOwner);
    }

    function acceptOwnership() external {
        address sender = msg.sender;
        require(sender == pendingOwner, "msg.sender != pendingOwner");
        _setOwner(sender);
    }

    /**
     * @notice Register a new future reward velocity point
     */
    function registerRewardVelocity(uint256 _blockNumber, uint256 _rewardPerBlock, uint256 _decrementUnitPerBlock) onlyOwner public {
        require(_blockNumber > block.number, "new Reward params should register earlier");
        require(registeredPoints.length == 0 || _blockNumber > registeredPoints[registeredPoints.length-1].blockNumber, "Earilier velocity points are already set.");
        _registerRewardVelocity(_blockNumber, _rewardPerBlock, _decrementUnitPerBlock);
    }
    function deleteRegisteredRewardVelocity(uint256 _index) onlyOwner external {
        require(_index >= passedPoint, "Reward velocity point already passed.");
        _deleteRegisteredRewardVelocity(_index);
    }

    /**
     * @notice Set the reward distribution parameters
     */
    function setRewardVelocity(uint256 _rewardPerBlock, uint256 _decrementUnitPerBlock) onlyOwner external {
        _updateRewardLane();
        _setParams(_rewardPerBlock, _decrementUnitPerBlock);
    }
}

// File: contracts/DistributionModelV3.sol

pragma solidity 0.6.12;


/**
 * @title BiFi's Reward Distribution Contract
 * @notice Implements voting process along with vote delegation
 * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo)
 */
contract DistributionModelV3 is externalModule {
    constructor(address _owner, address _lpErc, address _rewardErc) public {
        owner = _owner;
        lpErc = ERC20(_lpErc);
        rewardErc = ERC20(_rewardErc);
        lastBlockNum = block.number;
    }
}

contract BFCModel is DistributionModelV3 {
    constructor(address _owner, address _lpErc, address _rewardErc, uint256 _start)
    DistributionModelV3(_owner, _lpErc, _rewardErc) public {
        /*
        _start: parameter start block nubmer
        0x3935413a1cdd90ff: fixed point(1e18) reward per blocks
        0x62e9bea75f: fixed point(1e18) decrement per blocks
        */
        _registerRewardVelocity(_start, 0x3935413a1cdd90ff, 0x62e9bea75f);
    }
}

contract BFCETHModel is DistributionModelV3 {
    constructor(address _owner, address _lpErc, address _rewardErc, uint256 _start)
    DistributionModelV3(_owner, _lpErc, _rewardErc) public {
        /*
        _start: parameter start block nubmer
        0xe4d505786b744b3f: fixed point(1e18) reward per blocks
        0x18ba6fb966b: fixed point(1e18) decrement per blocks
        */
        _registerRewardVelocity(_start, 0xe4d505786b744b3f, 0x18ba6fb966b);
    }
}

contract BiFiETHModel is DistributionModelV3 {
    constructor(address _owner, address _lpErc, address _rewardErc, uint256 _start)
    DistributionModelV3(_owner, _lpErc, _rewardErc) public {
        /*
        _start: parameter start block nubmer
        0x11e0a46e285a68955: fixed point(1e18) reward per blocks
        0x1ee90ba90c4: fixed point(1e18) decrement per blocks
        */
        _registerRewardVelocity(_start, 0x11e0a46e285a68955, 0x1ee90ba90c4);
    }
}

// File: contracts/SRD_SushiSwap.sol

pragma solidity 0.6.12;


contract BFCETHSushiSwapReward is DistributionModelV3 {
    constructor(uint256 start, uint256 reward_per_block, uint256 dec_per_block)
        DistributionModelV3(
            0x359903041dE93c69828F911aeB0BE29CC9ccc58b, //ower
            0x281Df7fc89294C84AfA2A21FfEE8f6807F9C9226, //swap_pool_token(BFCETH_Sushi)
            0x2791BfD60D232150Bff86b39B7146c0eaAA2BA81  //reward_token(bifi)
        ) public {
        _registerRewardVelocity(start, reward_per_block, dec_per_block);
        pendingOwner = msg.sender;
    }
}

contract BiFiETHSushiSwapReward is DistributionModelV3 {
    constructor(uint256 start, uint256 reward_per_block, uint256 dec_per_block)
    DistributionModelV3(
        0x359903041dE93c69828F911aeB0BE29CC9ccc58b, //owner
        0x0beC54c89a7d9F15C4e7fAA8d47ADEdF374462eD, //swap_pool_token(BiFiETH_Sushi)
        0x2791BfD60D232150Bff86b39B7146c0eaAA2BA81  //reward_token(bifi)
    ) public {
        _registerRewardVelocity(start, reward_per_block, dec_per_block);
        pendingOwner = msg.sender;
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"reward_per_block","type":"uint256"},{"internalType":"uint256","name":"dec_per_block","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"lock","type":"bool"}],"name":"ClaimLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"atBlockNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"decrementUnitPerBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"arrayLen","type":"uint256"}],"name":"DeleteRegisterRewardParams","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userDeposit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalDeposit","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"atBlockNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"decrementUnitPerBlock","type":"uint256"}],"name":"RegisterRewardParams","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"decrementUnitPerBlock","type":"uint256"}],"name":"SetRewardParams","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"atBlockNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"decrementUnitPerBlock","type":"uint256"}],"name":"UpdateRewardParams","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userDeposit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalDeposit","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"lock","type":"bool"}],"name":"WithdrawLock","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"accounts","outputs":[{"internalType":"uint256","name":"deposited","type":"uint256"},{"internalType":"uint256","name":"pointOnLane","type":"uint256"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decrementUnitPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"deleteRegisteredRewardVelocity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributionInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fromBlockNumber","type":"uint256"},{"internalType":"uint256","name":"toBlockNumber","type":"uint256"}],"name":"getModelPoolRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getParams","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRegisteredPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRegisteredPointLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"uint256","name":"fromBlockNumber","type":"uint256"},{"internalType":"uint256","name":"toBlockNumber","type":"uint256"}],"name":"getUserPoolRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastBlockNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpErc","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fromBlockNumber","type":"uint256"},{"internalType":"uint256","name":"_toBlockNumber","type":"uint256"}],"name":"marketInformation","outputs":[{"internalType":"uint256","name":"rewardStartBlockNumber","type":"uint256"},{"internalType":"uint256","name":"distributedAmount","type":"uint256"},{"internalType":"uint256","name":"totalDeposit","type":"uint256"},{"internalType":"uint256","name":"poolRate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"modelFinish","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"modelInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"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":"newPendingOwner","type":"address"}],"name":"ownershipTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"passedPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_blockNumber","type":"uint256"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"_decrementUnitPerBlock","type":"uint256"}],"name":"registerRewardVelocity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"registeredPoints","outputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"decrementUnitPerBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"retrieveRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"}],"name":"rewardClaimTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardErc","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardLane","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"lock","type":"bool"}],"name":"setClaimLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Addr","type":"address"}],"name":"setERC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"_decrementUnitPerBlock","type":"uint256"}],"name":"setParam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Addr","type":"address"}],"name":"setRE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"_decrementUnitPerBlock","type":"uint256"}],"name":"setRewardVelocity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"lock","type":"bool"}],"name":"setWithdrawLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"uint256","name":"_fromBlockNumber","type":"uint256"},{"internalType":"uint256","name":"_toBlockNumber","type":"uint256"}],"name":"userInformation","outputs":[{"internalType":"uint256","name":"stakedTokenAmount","type":"uint256"},{"internalType":"uint256","name":"rewardStartBlockNumber","type":"uint256"},{"internalType":"uint256","name":"claimStartBlockNumber","type":"uint256"},{"internalType":"uint256","name":"earnedTokenAmount","type":"uint256"},{"internalType":"uint256","name":"poolRate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162002f3438038062002f34833981810160405260608110156200003757600080fd5b5080516020820151604090920151600080546001600160a01b031990811673359903041de93c69828f911aeb0be29cc9ccc58b1790915560078054821673281df7fc89294c84afa2a21ffee8f6807f9c922617905560088054909116732791bfd60d232150bff86b39b7146c0eaaa2ba8117905543600555909190620000bf838383620000da565b5050600180546001600160a01b0319163317905550620001fe565b620000e4620001dd565b60405180606001604052808581526020018481526020018381525090507f1fdf2820867a17742112aebea1dc9d50d73c902c1e5e2ac7f03b0b11e697adb384848460405180848152602001838152602001828152602001935050505060405180910390a1600b805460018101825560009190915281517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db960039092029182015560208201517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba8201556040909101517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb90910155505050565b60405180606001604052806000815260200160008152602001600081525090565b612d26806200020e6000396000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c80635e5c06e211610146578063b8b1bf99116100c3578063e04bfd8111610087578063e04bfd811461064d578063e30c397814610655578063f4bb1b211461065d578063f71a16131461067a578063ff50abdc14610699578063ffaad6a5146106a157610253565b8063b8b1bf99146105f2578063ca6702cc146105fa578063cabac91c14610602578063d3a417a21461061f578063d48ab3081461064557610253565b806379ba50971161010a57806379ba5097146105a05780638ae39cac146105a85780638da5cb5b146105b05780639091038a146105b8578063b6b55f25146105d557610253565b80635e5c06e2146104f85780635e615a6b1461051e5780636409f9211461054c57806369cddfe514610554578063744f31d71461057d57610253565b80633237a68e116101d45780634959e729116101985780634959e7291461047d5780634f7f399b14610485578063534caae5146104a257806359f2ea07146104aa5780635c388ca6146104dc57610253565b80633237a68e146103fe578063327bc7b11461042457806334a551911461042c578063368990421461045257806336f2fa681461045a57610253565b80631959a0021161021b5780631959a0021461033d5780631eb804db1461038157806323c6a5021461039e5780632e1a7d4d146103c25780633011113a146103df57610253565b8063046a360e1461025857806309ce91ad1461028d5780630e8f7f31146102b557806310dc7f471461031257806315d0c28414610335575b600080fd5b61027b6004803603604081101561026e57600080fd5b50803590602001356106cd565b60408051918252519081900360200190f35b6102b3600480360360208110156102a357600080fd5b50356001600160a01b03166106e4565b005b6102e7600480360360608110156102cb57600080fd5b506001600160a01b03813516906020810135906040013561074f565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102b36004803603604081101561032857600080fd5b5080359060200135610818565b61027b610878565b6103636004803603602081101561035357600080fd5b50356001600160a01b031661087e565b60408051938452602084019290925282820152519081900360600190f35b6102b36004803603602081101561039757600080fd5b50356108e7565b6103a661097d565b604080516001600160a01b039092168252519081900360200190f35b6102b3600480360360208110156103d857600080fd5b503561098c565b6102b3600480360360208110156103f557600080fd5b503515156109f8565b6102b36004803603602081101561041457600080fd5b50356001600160a01b0316610a4a565b61027b610ab1565b6102b36004803603602081101561044257600080fd5b50356001600160a01b0316610ab7565b61027b610b22565b6102b36004803603604081101561047057600080fd5b5080359060200135610b28565b6102e7610b7b565b6102b36004803603602081101561049b57600080fd5b5035610b91565b61027b610e0d565b61027b600480360360608110156104c057600080fd5b506001600160a01b038135169060208101359060400135610e13565b6104e4610e2a565b604080519115158252519081900360200190f35b6103636004803603602081101561050e57600080fd5b50356001600160a01b0316610e3a565b610526610e5b565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6102b3610e6d565b6102b36004803603606081101561056a57600080fd5b5080359060208101359060400135610ecc565b6105266004803603604081101561059357600080fd5b5080359060200135610fcf565b6102b3611052565b61027b6110bc565b6103a66110c2565b6102b3600480360360208110156105ce57600080fd5b50356110d1565b6102b3600480360360208110156105eb57600080fd5b503561132b565b6104e461133f565b61027b61134f565b6103636004803603602081101561061857600080fd5b5035611355565b6102b36004803603602081101561063557600080fd5b50356001600160a01b0316611385565b6103636113d7565b6103a66113f8565b6103a6611407565b6103636004803603602081101561067357600080fd5b5035611416565b6102b36004803603602081101561069057600080fd5b50351515611477565b61027b6114c9565b6102b3600480360360408110156106b757600080fd5b506001600160a01b0381351690602001356114cf565b60006106db600084846114e2565b90505b92915050565b6000546001600160a01b0316331461072d5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b600080600080600061075f612b2f565b506001600160a01b0388166000908152600960209081526040918290208251606081018452815480825260018301549382019390935260029182015493810193909352549096506107d157600b6000815481106107b857fe5b90600052602060002090600302016000015494506107f4565b600b6000815481106107df57fe5b90600052602060002090600302016000015494505b6107fd8961175c565b925061080a8989896114e2565b915050939792965093509350565b6000546001600160a01b031633146108615760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b610869611839565b506108748282611ad3565b5050565b60045481565b600080600061088b612b2f565b506001600160a01b03841660009081526009602090815260408083208151606081018352815481526001820154938101939093526002015490820152906108d18661175c565b8251602090930151929792965094509092505050565b6000546001600160a01b031633146109305760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b600a548110156109715760405162461bcd60e51b8152600401808060200182810382526025815260200180612c776025913960400191505060405180910390fd5b61097a81611b19565b50565b6008546001600160a01b031681565b600154600160a81b900460ff16156109e4576040805162461bcd60e51b8152602060048201526016602482015275195c9c9bdc8e881dda5d1a191c985dc8131bd8dad95960521b604482015290519081900360640190fd5b336109ee81611ca8565b6108748183611d7d565b6000546001600160a01b03163314610a415760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b61097a81611f7b565b600154600160a01b900460ff1615610a9f576040805162461bcd60e51b8152602060048201526013602482015272195c9c9bdc8e8818db185a5b48131bd8dad959606a1b604482015290519081900360640190fd5b610aa881611ca8565b61097a81611fce565b600a5481565b6000546001600160a01b03163314610b005760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60055481565b6000546001600160a01b03163314610b715760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b6108748282611ad3565b6002546003546004546005546006549091929394565b6000546001600160a01b03163314610bda5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b8015610cad57600854600080546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919093169263a9059cbb9260448083019360209390929083900390910190829087803b158015610c3d57600080fd5b505af1158015610c51573d6000803e3d6000fd5b505050506040513d6020811015610c6757600080fd5b5051610ca8576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b610deb565b600854600054604080516370a0823160e01b815230600482015290516001600160a01b039384169363a9059cbb93169184916370a0823191602480820192602092909190829003018186803b158015610d0557600080fd5b505afa158015610d19573d6000803e3d6000fd5b505050506040513d6020811015610d2f57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b158015610d8057600080fd5b505af1158015610d94573d6000803e3d6000fd5b505050506040513d6020811015610daa57600080fd5b5051610deb576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b6000600681905560028190556003819055600481905561097a90600b90612b50565b60035481565b6000610e208484846114e2565b90505b9392505050565b600154600160a81b900460ff1681565b60096020526000908152604090208054600182015460029092015490919083565b60025460045460055460065490919293565b600154600160a01b900460ff1615610ec2576040805162461bcd60e51b8152602060048201526013602482015272195c9c9bdc8e8818db185a5b48131bd8dad959606a1b604482015290519081900360640190fd5b33610aa881611ca8565b6000546001600160a01b03163314610f155760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b438311610f535760405162461bcd60e51b8152600401808060200182810382526029815260200180612c076029913960400191505060405180910390fd5b600b541580610f845750600b80546000198101908110610f6f57fe5b90600052602060002090600302016000015483115b610fbf5760405162461bcd60e51b8152600401808060200182810382526029815260200180612c9c6029913960400191505060405180910390fd5b610fca838383612139565b505050565b6000806000806002546000141561100757600b600081548110610fee57fe5b906000526020600020906003020160000154935061102a565b600b60008154811061101557fe5b90600052602060002090600302016000015493505b611034600061175c565b92506006549150611047600087876114e2565b905092959194509250565b60015433906001600160a01b031681146110b3576040805162461bcd60e51b815260206004820152601a60248201527f6d73672e73656e64657220213d2070656e64696e674f776e6572000000000000604482015290519081900360640190fd5b61097a8161223a565b60025481565b6000546001600160a01b031681565b6000546001600160a01b0316331461111a5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b80156111ed57600854600080546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919093169263a9059cbb9260448083019360209390929083900390910190829087803b15801561117d57600080fd5b505af1158015611191573d6000803e3d6000fd5b505050506040513d60208110156111a757600080fd5b50516111e8576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b61097a565b600854600054604080516370a0823160e01b815230600482015290516001600160a01b039384169363a9059cbb93169184916370a0823191602480820192602092909190829003018186803b15801561124557600080fd5b505afa158015611259573d6000803e3d6000fd5b505050506040513d602081101561126f57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b1580156112c057600080fd5b505af11580156112d4573d6000803e3d6000fd5b505050506040513d60208110156112ea57600080fd5b505161097a576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b3361133581611ca8565b61087481836122f4565b600154600160a01b900460ff1681565b600b5490565b600b818154811061136257fe5b600091825260209091206003909102018054600182015460029092015490925083565b6000546001600160a01b031633146113ce5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b61097a8161242f565b6000806000806113e56124ac565b6002546003549095509350915050909192565b6007546001600160a01b031681565b6001546001600160a01b031681565b6000806000611423612b2f565b600b858154811061143057fe5b600091825260209182902060408051606081018252600393909302909101805480845260018201549484018590526002909101549290910182905297919650945092505050565b6000546001600160a01b031633146114c05760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b61097a816124bd565b60065481565b6114d882611ca8565b61087482826122f4565b60006114ec612b71565b600b54815260065460e082015260a0810184905260c0810184905261151084612510565b6101808401819052610140840182905260408401839052606084018390526101608401919091526101a083015260808201849052600061010083018190526101208301525b815181101561164c57611566612b2f565b600b828154811061157357fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518360c001511080156115c857506080830151815111155b1561163d57600182016060840152805160c08401516115e79190612661565b6020840181905261012084015160e08501516101608601516101a087015161160e946126be565b6101608501908152610120850191909152815160c08501526020820151905260408101516101a0840152611643565b5061164c565b50600101611555565b508060c00151816080015111156116ad5761166f81608001518260c00151612661565b60208201819052608082015160c083015261012082015160e08301516101608401516101a08501516116a0946126be565b6101608301526101208201525b6116b5612b2f565b6001600160a01b0386161561170957506001600160a01b038516600090815260096020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915261172d565b60405180606001604052808360e00151815260200160008152602001600081525090505b6117526117438260000151846101200151612759565b61174d8688612661565b612772565b9695505050505050565b6000611766612b2f565b60006001600160a01b038416156117d95760096000856001600160a01b03166001600160a01b03168152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201548152505091506117d26005546127d9565b9050611807565b60405180606001604052806006548152602001600081526020016000815250915061180460006127d9565b90505b6000611817828460200151612661565b90506000611829846000015183612759565b9050611752846040015182612a0c565b6000611843612b71565b600b54815260065460e0820152600a54604082018190526060820181905243608083015260055460a0830181905260c08301526004546101008301819052610120830152600254610140830181905261016083015260035461018083018190526101a08301525b81518110156119e7576118bb612b2f565b600b82815481106118c857fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518360c0015110801561191d57506080830151815111155b156119d857600182016060840152805160c084015161193c9190612661565b6020840181905261012084015160e08501516101608601516101a0870151611963946126be565b6101608501908152610120850191909152815160c085015260208083018051909252604083810180516101a088015284519351905182519485529284015282810191909152517fc2d5f9e666d2dd7e740ece9acaf1b93ce48894cbc0336d693410badb7c40aead9181900360600190a16119de565b506119e7565b506001016118aa565b5080608001518160c001511015611a4857611a0a81608001518260c00151612661565b60208201819052608082015160c083015261012082015160e08301516101608401516101a0850151611a3b946126be565b6101608301526101208201525b8060c001518160a0015114611a605760c08101516005555b8060600151816040015114611a78576060810151600a555b80610120015181610100015114611a93576101208101516004555b80610160015181610140015114611aae576101608101516002555b806101a0015181610180015114611ac9576101a08101516003555b6101200151905090565b604080518381526020810183905281517fbfc739097487a2d01d113d21aef3ef3d22331f56d3273bc4907d61407e5b0856929181900390910190a1600291909155600355565b600b548015801590611b2a57508082105b611b655760405162461bcd60e51b8152600401808060200182810382526026815260200180612c306026913960400191505060405180910390fd5b611b6d612b2f565b600b8381548110611b7a57fe5b6000918252602091829020604080516060808201835260039094029092018054808452600182015484870181905260029092015484840181905283518a81529687019190915285830191909152928401929092526000198501608084015290519092507f543ba8eaac0e28f58eb335897e63175861579bc16306e05ab5936084c1f074919181900360a00190a1825b60018303811015611c7257600b8160010181548110611c2457fe5b9060005260206000209060030201600b8281548110611c3f57fe5b60009182526020909120825460039092020190815560018083015481830155600292830154929091019190915501611c09565b50600b805480611c7e57fe5b60008281526020812060036000199093019283020181815560018101829055600201559055505050565b611cb0612b2f565b506001600160a01b0381166000908152600960209081526040808320815160608101835281548152600182015493810193909352600201549082015290611cf5611839565b90506000611d07828460200151612661565b90506000611d19846000015183612759565b905082846020015114611d45576001600160a01b03851660009081526009602052604090206001018390555b8015611d7657611d59846040015182612a0c565b6001600160a01b0386166000908152600960205260409020600201555b5050505050565b611d85612b2f565b506001600160a01b038216600090815260096020908152604091829020825160608101845281548082526001830154938201939093526002909101549281019290925260065490831115611e20576040805162461bcd60e51b815260206004820152601760248201527f6e6f7420656e6f7567682075736572204465706f736974000000000000000000604482015290519081900360640190fd5b8151611e2c9084612661565b8083526001600160a01b038516600090815260096020526040902055600654611e559084612661565b600681905590508215611f75578151604080516001600160a01b0387168152602081018690528082019290925260608201839052517f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca949181900360800190a16007546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018790529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015611f0a57600080fd5b505af1158015611f1e573d6000803e3d6000fd5b505050506040513d6020811015611f3457600080fd5b5051611f75576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b50505050565b60408051821515815290517f24e8043bbab505bf23b3d9b569ad2dc34a6a563516daca26e3ad818b40c14f659181900360200190a160018054911515600160a81b0260ff60a81b19909216919091179055565b611fd6612b2f565b506001600160a01b038116600090815260096020908152604091829020825160608101845281548152600182015492810192909252600201549181018290529015610874576040808201516001600160a01b0384166000818152600960209081528482206002019190915583519182528101829052825191927f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d492918290030190a16008546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156120ce57600080fd5b505af11580156120e2573d6000803e3d6000fd5b505050506040513d60208110156120f857600080fd5b5051610fca576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b612141612b2f565b60405180606001604052808581526020018481526020018381525090507f1fdf2820867a17742112aebea1dc9d50d73c902c1e5e2ac7f03b0b11e697adb384848460405180848152602001838152602001828152602001935050505060405180910390a1600b805460018101825560009190915281517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db960039092029182015560208201517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba8201556040909101517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb90910155505050565b6001600160a01b03811661228a576040805162461bcd60e51b81526020600482015260126024820152716f776e6572207a65726f206164647265737360701b604482015290519081900360640190fd5b600054604080516001600160a01b039283168152918316602083015280517f22500af037c600dd7b720644ab6e358635085601d9ac508ad83eb2d6b2d729ca9281900390910190a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b6122fc612b2f565b506001600160a01b03821660009081526009602090815260409182902082516060810184528154808252600183015493820193909352600290910154928101929092526006549061234d9084612a0c565b8083526001600160a01b0385166000908152600960205260409020556006546123769084612a0c565b600681905590508215611f75578151604080516001600160a01b0387168152602081018690528082019290925260608201839052517f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e9181900360800190a1600754604080516323b872dd60e01b81523360048201523060248201526044810186905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015611f0a57600080fd5b6001600160a01b03811661248a576040805162461bcd60e51b815260206004820152601a60248201527f70656e64696e67206f776e6572207a65726f2061646472657373000000000000604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60006124b8600061175c565b905090565b60408051821515815290517f4d23c25ea752bd74a0dfa4a88c011a2c7bf8713a06a6b1028feb1fd277746c4f9181900360200190a160018054911515600160a01b0260ff60a01b19909216919091179055565b600b5460009081908190819081908190819080156125d157600092505b808310156125d15761253d612b2f565b600b848154811061254a57fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518a101580156125975750805115155b156125b25783925080602001519550806040015194506125c4565b80516125be57506125c6565b506125d1565b505b60019092019161252d565b6125d9612b2f565b600b83815481106125e657fe5b600091825260209182902060408051606081018252600390930290910180548084526001820154948401859052600290910154918301829052929850965091508a11156126505761264d86612648876126438e8660000151612661565b612a66565b612661565b95505b509198939750919550919350505050565b6000818310156126b8576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000808084156126e8576126d28686612772565b9050808411156126e4578093506126e8565b5060005b6000871561272d5761271e6126fe888789612abf565b612719612713670de0b6b3a76400008c612b02565b88612a66565b612759565b905061272a8982612a0c565b98505b811561273c576000965061274a565b612747878787612b1f565b96505b50969794965093945050505050565b60006106db6127688484612a66565b670de0b6b3a76400005b60008082116127c8576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816127d157fe5b049392505050565b60006127e3612b71565b600b54815260065460e08201528261284c576000604082018190526060820181905243608083015260a0820181905260c08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a08201526128a3565b600a5460408201819052606082015243608082015260a0810183905260c081018390526004546101008201819052610120820152600254610140820181905261016082015260035461018082018190526101a08201525b60408101515b81518110156129a0576128ba612b2f565b600b82815481106128c757fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518360c0015110801561291c57506080830151815111155b1561299157600182016060840152805160c084015161293b9190612661565b6020840181905261012084015160e08501516101608601516101a0870151612962946126be565b6101608501908152610120850191909152815160c08501526020820151905260408101516101a0840152612997565b506129a0565b506001016128a9565b508060c0015181608001511115612a01576129c381608001518260c00151612661565b60208201819052608082015160c083015261012082015160e08301516101608401516101a08501516129f4946126be565b6101608301526101208201525b610120015192915050565b6000828201838110156106db576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a2061646474696f6e206f766572666c6f77000000000000604482015290519081900360640190fd5b600082612a75575060006106de565b82820282848281612a8257fe5b04146106db5760405162461bcd60e51b8152600401808060200182810382526021815260200180612c566021913960400191505060405180910390fd5b60008215612afa57612af3612aec612ad8600287612a66565b612648612ae6876001612661565b86612a66565b6002612772565b9050610e23565b506000610e23565b60006106db612b1984670de0b6b3a7640000612a66565b83612772565b6000610e20846126488585612a66565b60405180606001604052806000815260200160008152602001600081525090565b508054600082556003029060005260206000209081019061097a9190612be0565b604051806101c0016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b80821115612c02576000808255600182018190556002820155600301612be1565b509056fe6e65772052657761726420706172616d732073686f756c64207265676973746572206561726c6965726572726f723a206e6f20656c656d656e747320696e2072656769737465726564506f696e7473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775265776172642076656c6f6369747920706f696e7420616c7265616479207061737365642e456172696c6965722076656c6f6369747920706f696e74732061726520616c7265616479207365742e6f6e6c794f776e65723a2065787465726e616c2066756e6374696f6e2061636365737320636f6e74726f6c21a2646970667358221220c2b32496faa8464174a0d689ba91471dadd9a72f3911c93918c971809b2949a264736f6c634300060c00330000000000000000000000000000000000000000000000000000000000c860a5000000000000000000000000000000000000000000000000c01b14f09ade25600000000000000000000000000000000000000000000000000000018ba6fb966b

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102535760003560e01c80635e5c06e211610146578063b8b1bf99116100c3578063e04bfd8111610087578063e04bfd811461064d578063e30c397814610655578063f4bb1b211461065d578063f71a16131461067a578063ff50abdc14610699578063ffaad6a5146106a157610253565b8063b8b1bf99146105f2578063ca6702cc146105fa578063cabac91c14610602578063d3a417a21461061f578063d48ab3081461064557610253565b806379ba50971161010a57806379ba5097146105a05780638ae39cac146105a85780638da5cb5b146105b05780639091038a146105b8578063b6b55f25146105d557610253565b80635e5c06e2146104f85780635e615a6b1461051e5780636409f9211461054c57806369cddfe514610554578063744f31d71461057d57610253565b80633237a68e116101d45780634959e729116101985780634959e7291461047d5780634f7f399b14610485578063534caae5146104a257806359f2ea07146104aa5780635c388ca6146104dc57610253565b80633237a68e146103fe578063327bc7b11461042457806334a551911461042c578063368990421461045257806336f2fa681461045a57610253565b80631959a0021161021b5780631959a0021461033d5780631eb804db1461038157806323c6a5021461039e5780632e1a7d4d146103c25780633011113a146103df57610253565b8063046a360e1461025857806309ce91ad1461028d5780630e8f7f31146102b557806310dc7f471461031257806315d0c28414610335575b600080fd5b61027b6004803603604081101561026e57600080fd5b50803590602001356106cd565b60408051918252519081900360200190f35b6102b3600480360360208110156102a357600080fd5b50356001600160a01b03166106e4565b005b6102e7600480360360608110156102cb57600080fd5b506001600160a01b03813516906020810135906040013561074f565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102b36004803603604081101561032857600080fd5b5080359060200135610818565b61027b610878565b6103636004803603602081101561035357600080fd5b50356001600160a01b031661087e565b60408051938452602084019290925282820152519081900360600190f35b6102b36004803603602081101561039757600080fd5b50356108e7565b6103a661097d565b604080516001600160a01b039092168252519081900360200190f35b6102b3600480360360208110156103d857600080fd5b503561098c565b6102b3600480360360208110156103f557600080fd5b503515156109f8565b6102b36004803603602081101561041457600080fd5b50356001600160a01b0316610a4a565b61027b610ab1565b6102b36004803603602081101561044257600080fd5b50356001600160a01b0316610ab7565b61027b610b22565b6102b36004803603604081101561047057600080fd5b5080359060200135610b28565b6102e7610b7b565b6102b36004803603602081101561049b57600080fd5b5035610b91565b61027b610e0d565b61027b600480360360608110156104c057600080fd5b506001600160a01b038135169060208101359060400135610e13565b6104e4610e2a565b604080519115158252519081900360200190f35b6103636004803603602081101561050e57600080fd5b50356001600160a01b0316610e3a565b610526610e5b565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6102b3610e6d565b6102b36004803603606081101561056a57600080fd5b5080359060208101359060400135610ecc565b6105266004803603604081101561059357600080fd5b5080359060200135610fcf565b6102b3611052565b61027b6110bc565b6103a66110c2565b6102b3600480360360208110156105ce57600080fd5b50356110d1565b6102b3600480360360208110156105eb57600080fd5b503561132b565b6104e461133f565b61027b61134f565b6103636004803603602081101561061857600080fd5b5035611355565b6102b36004803603602081101561063557600080fd5b50356001600160a01b0316611385565b6103636113d7565b6103a66113f8565b6103a6611407565b6103636004803603602081101561067357600080fd5b5035611416565b6102b36004803603602081101561069057600080fd5b50351515611477565b61027b6114c9565b6102b3600480360360408110156106b757600080fd5b506001600160a01b0381351690602001356114cf565b60006106db600084846114e2565b90505b92915050565b6000546001600160a01b0316331461072d5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b600080600080600061075f612b2f565b506001600160a01b0388166000908152600960209081526040918290208251606081018452815480825260018301549382019390935260029182015493810193909352549096506107d157600b6000815481106107b857fe5b90600052602060002090600302016000015494506107f4565b600b6000815481106107df57fe5b90600052602060002090600302016000015494505b6107fd8961175c565b925061080a8989896114e2565b915050939792965093509350565b6000546001600160a01b031633146108615760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b610869611839565b506108748282611ad3565b5050565b60045481565b600080600061088b612b2f565b506001600160a01b03841660009081526009602090815260408083208151606081018352815481526001820154938101939093526002015490820152906108d18661175c565b8251602090930151929792965094509092505050565b6000546001600160a01b031633146109305760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b600a548110156109715760405162461bcd60e51b8152600401808060200182810382526025815260200180612c776025913960400191505060405180910390fd5b61097a81611b19565b50565b6008546001600160a01b031681565b600154600160a81b900460ff16156109e4576040805162461bcd60e51b8152602060048201526016602482015275195c9c9bdc8e881dda5d1a191c985dc8131bd8dad95960521b604482015290519081900360640190fd5b336109ee81611ca8565b6108748183611d7d565b6000546001600160a01b03163314610a415760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b61097a81611f7b565b600154600160a01b900460ff1615610a9f576040805162461bcd60e51b8152602060048201526013602482015272195c9c9bdc8e8818db185a5b48131bd8dad959606a1b604482015290519081900360640190fd5b610aa881611ca8565b61097a81611fce565b600a5481565b6000546001600160a01b03163314610b005760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60055481565b6000546001600160a01b03163314610b715760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b6108748282611ad3565b6002546003546004546005546006549091929394565b6000546001600160a01b03163314610bda5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b8015610cad57600854600080546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919093169263a9059cbb9260448083019360209390929083900390910190829087803b158015610c3d57600080fd5b505af1158015610c51573d6000803e3d6000fd5b505050506040513d6020811015610c6757600080fd5b5051610ca8576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b610deb565b600854600054604080516370a0823160e01b815230600482015290516001600160a01b039384169363a9059cbb93169184916370a0823191602480820192602092909190829003018186803b158015610d0557600080fd5b505afa158015610d19573d6000803e3d6000fd5b505050506040513d6020811015610d2f57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b158015610d8057600080fd5b505af1158015610d94573d6000803e3d6000fd5b505050506040513d6020811015610daa57600080fd5b5051610deb576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b6000600681905560028190556003819055600481905561097a90600b90612b50565b60035481565b6000610e208484846114e2565b90505b9392505050565b600154600160a81b900460ff1681565b60096020526000908152604090208054600182015460029092015490919083565b60025460045460055460065490919293565b600154600160a01b900460ff1615610ec2576040805162461bcd60e51b8152602060048201526013602482015272195c9c9bdc8e8818db185a5b48131bd8dad959606a1b604482015290519081900360640190fd5b33610aa881611ca8565b6000546001600160a01b03163314610f155760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b438311610f535760405162461bcd60e51b8152600401808060200182810382526029815260200180612c076029913960400191505060405180910390fd5b600b541580610f845750600b80546000198101908110610f6f57fe5b90600052602060002090600302016000015483115b610fbf5760405162461bcd60e51b8152600401808060200182810382526029815260200180612c9c6029913960400191505060405180910390fd5b610fca838383612139565b505050565b6000806000806002546000141561100757600b600081548110610fee57fe5b906000526020600020906003020160000154935061102a565b600b60008154811061101557fe5b90600052602060002090600302016000015493505b611034600061175c565b92506006549150611047600087876114e2565b905092959194509250565b60015433906001600160a01b031681146110b3576040805162461bcd60e51b815260206004820152601a60248201527f6d73672e73656e64657220213d2070656e64696e674f776e6572000000000000604482015290519081900360640190fd5b61097a8161223a565b60025481565b6000546001600160a01b031681565b6000546001600160a01b0316331461111a5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b80156111ed57600854600080546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919093169263a9059cbb9260448083019360209390929083900390910190829087803b15801561117d57600080fd5b505af1158015611191573d6000803e3d6000fd5b505050506040513d60208110156111a757600080fd5b50516111e8576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b61097a565b600854600054604080516370a0823160e01b815230600482015290516001600160a01b039384169363a9059cbb93169184916370a0823191602480820192602092909190829003018186803b15801561124557600080fd5b505afa158015611259573d6000803e3d6000fd5b505050506040513d602081101561126f57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b1580156112c057600080fd5b505af11580156112d4573d6000803e3d6000fd5b505050506040513d60208110156112ea57600080fd5b505161097a576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b3361133581611ca8565b61087481836122f4565b600154600160a01b900460ff1681565b600b5490565b600b818154811061136257fe5b600091825260209091206003909102018054600182015460029092015490925083565b6000546001600160a01b031633146113ce5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b61097a8161242f565b6000806000806113e56124ac565b6002546003549095509350915050909192565b6007546001600160a01b031681565b6001546001600160a01b031681565b6000806000611423612b2f565b600b858154811061143057fe5b600091825260209182902060408051606081018252600393909302909101805480845260018201549484018590526002909101549290910182905297919650945092505050565b6000546001600160a01b031633146114c05760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b61097a816124bd565b60065481565b6114d882611ca8565b61087482826122f4565b60006114ec612b71565b600b54815260065460e082015260a0810184905260c0810184905261151084612510565b6101808401819052610140840182905260408401839052606084018390526101608401919091526101a083015260808201849052600061010083018190526101208301525b815181101561164c57611566612b2f565b600b828154811061157357fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518360c001511080156115c857506080830151815111155b1561163d57600182016060840152805160c08401516115e79190612661565b6020840181905261012084015160e08501516101608601516101a087015161160e946126be565b6101608501908152610120850191909152815160c08501526020820151905260408101516101a0840152611643565b5061164c565b50600101611555565b508060c00151816080015111156116ad5761166f81608001518260c00151612661565b60208201819052608082015160c083015261012082015160e08301516101608401516101a08501516116a0946126be565b6101608301526101208201525b6116b5612b2f565b6001600160a01b0386161561170957506001600160a01b038516600090815260096020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915261172d565b60405180606001604052808360e00151815260200160008152602001600081525090505b6117526117438260000151846101200151612759565b61174d8688612661565b612772565b9695505050505050565b6000611766612b2f565b60006001600160a01b038416156117d95760096000856001600160a01b03166001600160a01b03168152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201548152505091506117d26005546127d9565b9050611807565b60405180606001604052806006548152602001600081526020016000815250915061180460006127d9565b90505b6000611817828460200151612661565b90506000611829846000015183612759565b9050611752846040015182612a0c565b6000611843612b71565b600b54815260065460e0820152600a54604082018190526060820181905243608083015260055460a0830181905260c08301526004546101008301819052610120830152600254610140830181905261016083015260035461018083018190526101a08301525b81518110156119e7576118bb612b2f565b600b82815481106118c857fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518360c0015110801561191d57506080830151815111155b156119d857600182016060840152805160c084015161193c9190612661565b6020840181905261012084015160e08501516101608601516101a0870151611963946126be565b6101608501908152610120850191909152815160c085015260208083018051909252604083810180516101a088015284519351905182519485529284015282810191909152517fc2d5f9e666d2dd7e740ece9acaf1b93ce48894cbc0336d693410badb7c40aead9181900360600190a16119de565b506119e7565b506001016118aa565b5080608001518160c001511015611a4857611a0a81608001518260c00151612661565b60208201819052608082015160c083015261012082015160e08301516101608401516101a0850151611a3b946126be565b6101608301526101208201525b8060c001518160a0015114611a605760c08101516005555b8060600151816040015114611a78576060810151600a555b80610120015181610100015114611a93576101208101516004555b80610160015181610140015114611aae576101608101516002555b806101a0015181610180015114611ac9576101a08101516003555b6101200151905090565b604080518381526020810183905281517fbfc739097487a2d01d113d21aef3ef3d22331f56d3273bc4907d61407e5b0856929181900390910190a1600291909155600355565b600b548015801590611b2a57508082105b611b655760405162461bcd60e51b8152600401808060200182810382526026815260200180612c306026913960400191505060405180910390fd5b611b6d612b2f565b600b8381548110611b7a57fe5b6000918252602091829020604080516060808201835260039094029092018054808452600182015484870181905260029092015484840181905283518a81529687019190915285830191909152928401929092526000198501608084015290519092507f543ba8eaac0e28f58eb335897e63175861579bc16306e05ab5936084c1f074919181900360a00190a1825b60018303811015611c7257600b8160010181548110611c2457fe5b9060005260206000209060030201600b8281548110611c3f57fe5b60009182526020909120825460039092020190815560018083015481830155600292830154929091019190915501611c09565b50600b805480611c7e57fe5b60008281526020812060036000199093019283020181815560018101829055600201559055505050565b611cb0612b2f565b506001600160a01b0381166000908152600960209081526040808320815160608101835281548152600182015493810193909352600201549082015290611cf5611839565b90506000611d07828460200151612661565b90506000611d19846000015183612759565b905082846020015114611d45576001600160a01b03851660009081526009602052604090206001018390555b8015611d7657611d59846040015182612a0c565b6001600160a01b0386166000908152600960205260409020600201555b5050505050565b611d85612b2f565b506001600160a01b038216600090815260096020908152604091829020825160608101845281548082526001830154938201939093526002909101549281019290925260065490831115611e20576040805162461bcd60e51b815260206004820152601760248201527f6e6f7420656e6f7567682075736572204465706f736974000000000000000000604482015290519081900360640190fd5b8151611e2c9084612661565b8083526001600160a01b038516600090815260096020526040902055600654611e559084612661565b600681905590508215611f75578151604080516001600160a01b0387168152602081018690528082019290925260608201839052517f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca949181900360800190a16007546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018790529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015611f0a57600080fd5b505af1158015611f1e573d6000803e3d6000fd5b505050506040513d6020811015611f3457600080fd5b5051611f75576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b50505050565b60408051821515815290517f24e8043bbab505bf23b3d9b569ad2dc34a6a563516daca26e3ad818b40c14f659181900360200190a160018054911515600160a81b0260ff60a81b19909216919091179055565b611fd6612b2f565b506001600160a01b038116600090815260096020908152604091829020825160608101845281548152600182015492810192909252600201549181018290529015610874576040808201516001600160a01b0384166000818152600960209081528482206002019190915583519182528101829052825191927f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d492918290030190a16008546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156120ce57600080fd5b505af11580156120e2573d6000803e3d6000fd5b505050506040513d60208110156120f857600080fd5b5051610fca576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b612141612b2f565b60405180606001604052808581526020018481526020018381525090507f1fdf2820867a17742112aebea1dc9d50d73c902c1e5e2ac7f03b0b11e697adb384848460405180848152602001838152602001828152602001935050505060405180910390a1600b805460018101825560009190915281517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db960039092029182015560208201517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba8201556040909101517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb90910155505050565b6001600160a01b03811661228a576040805162461bcd60e51b81526020600482015260126024820152716f776e6572207a65726f206164647265737360701b604482015290519081900360640190fd5b600054604080516001600160a01b039283168152918316602083015280517f22500af037c600dd7b720644ab6e358635085601d9ac508ad83eb2d6b2d729ca9281900390910190a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b6122fc612b2f565b506001600160a01b03821660009081526009602090815260409182902082516060810184528154808252600183015493820193909352600290910154928101929092526006549061234d9084612a0c565b8083526001600160a01b0385166000908152600960205260409020556006546123769084612a0c565b600681905590508215611f75578151604080516001600160a01b0387168152602081018690528082019290925260608201839052517f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e9181900360800190a1600754604080516323b872dd60e01b81523360048201523060248201526044810186905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015611f0a57600080fd5b6001600160a01b03811661248a576040805162461bcd60e51b815260206004820152601a60248201527f70656e64696e67206f776e6572207a65726f2061646472657373000000000000604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60006124b8600061175c565b905090565b60408051821515815290517f4d23c25ea752bd74a0dfa4a88c011a2c7bf8713a06a6b1028feb1fd277746c4f9181900360200190a160018054911515600160a01b0260ff60a01b19909216919091179055565b600b5460009081908190819081908190819080156125d157600092505b808310156125d15761253d612b2f565b600b848154811061254a57fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518a101580156125975750805115155b156125b25783925080602001519550806040015194506125c4565b80516125be57506125c6565b506125d1565b505b60019092019161252d565b6125d9612b2f565b600b83815481106125e657fe5b600091825260209182902060408051606081018252600390930290910180548084526001820154948401859052600290910154918301829052929850965091508a11156126505761264d86612648876126438e8660000151612661565b612a66565b612661565b95505b509198939750919550919350505050565b6000818310156126b8576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000808084156126e8576126d28686612772565b9050808411156126e4578093506126e8565b5060005b6000871561272d5761271e6126fe888789612abf565b612719612713670de0b6b3a76400008c612b02565b88612a66565b612759565b905061272a8982612a0c565b98505b811561273c576000965061274a565b612747878787612b1f565b96505b50969794965093945050505050565b60006106db6127688484612a66565b670de0b6b3a76400005b60008082116127c8576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816127d157fe5b049392505050565b60006127e3612b71565b600b54815260065460e08201528261284c576000604082018190526060820181905243608083015260a0820181905260c08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a08201526128a3565b600a5460408201819052606082015243608082015260a0810183905260c081018390526004546101008201819052610120820152600254610140820181905261016082015260035461018082018190526101a08201525b60408101515b81518110156129a0576128ba612b2f565b600b82815481106128c757fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518360c0015110801561291c57506080830151815111155b1561299157600182016060840152805160c084015161293b9190612661565b6020840181905261012084015160e08501516101608601516101a0870151612962946126be565b6101608501908152610120850191909152815160c08501526020820151905260408101516101a0840152612997565b506129a0565b506001016128a9565b508060c0015181608001511115612a01576129c381608001518260c00151612661565b60208201819052608082015160c083015261012082015160e08301516101608401516101a08501516129f4946126be565b6101608301526101208201525b610120015192915050565b6000828201838110156106db576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a2061646474696f6e206f766572666c6f77000000000000604482015290519081900360640190fd5b600082612a75575060006106de565b82820282848281612a8257fe5b04146106db5760405162461bcd60e51b8152600401808060200182810382526021815260200180612c566021913960400191505060405180910390fd5b60008215612afa57612af3612aec612ad8600287612a66565b612648612ae6876001612661565b86612a66565b6002612772565b9050610e23565b506000610e23565b60006106db612b1984670de0b6b3a7640000612a66565b83612772565b6000610e20846126488585612a66565b60405180606001604052806000815260200160008152602001600081525090565b508054600082556003029060005260206000209081019061097a9190612be0565b604051806101c0016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b80821115612c02576000808255600182018190556002820155600301612be1565b509056fe6e65772052657761726420706172616d732073686f756c64207265676973746572206561726c6965726572726f723a206e6f20656c656d656e747320696e2072656769737465726564506f696e7473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775265776172642076656c6f6369747920706f696e7420616c7265616479207061737365642e456172696c6965722076656c6f6369747920706f696e74732061726520616c7265616479207365742e6f6e6c794f776e65723a2065787465726e616c2066756e6374696f6e2061636365737320636f6e74726f6c21a2646970667358221220c2b32496faa8464174a0d689ba91471dadd9a72f3911c93918c971809b2949a264736f6c634300060c0033

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

0000000000000000000000000000000000000000000000000000000000c860a5000000000000000000000000000000000000000000000000c01b14f09ade25600000000000000000000000000000000000000000000000000000018ba6fb966b

-----Decoded View---------------
Arg [0] : start (uint256): 13131941
Arg [1] : reward_per_block (uint256): 13842680903276307808
Arg [2] : dec_per_block (uint256): 1699313587819

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000c860a5
Arg [1] : 000000000000000000000000000000000000000000000000c01b14f09ade2560
Arg [2] : 0000000000000000000000000000000000000000000000000000018ba6fb966b


Deployed Bytecode Sourcemap

39991:537:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32231:187;;;;;;;;;;;;;;;;-1:-1:-1;32231:187:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;33201:97;;;;;;;;;;;;;;;;-1:-1:-1;33201:97:0;-1:-1:-1;;;;;33201:97:0;;:::i;:::-;;21580:834;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21580:834:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37732:203;;;;;;;;;;;;;;;;-1:-1:-1;37732:203:0;;;;;;;:::i;5582:25::-;;;:::i;23189:283::-;;;;;;;;;;;;;;;;-1:-1:-1;23189:283:0;-1:-1:-1;;;;;23189:283:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;37436:215;;;;;;;;;;;;;;;;-1:-1:-1;37436:215:0;;:::i;5708:22::-;;;:::i;:::-;;;;-1:-1:-1;;;;;5708:22:0;;;;;;;;;;;;;;35518:180;;;;;;;;;;;;;;;;-1:-1:-1;35518:180:0;;:::i;36443:96::-;;;;;;;;;;;;;;;;-1:-1:-1;36443:96:0;;;;:::i;36159:139::-;;;;;;;;;;;;;;;;-1:-1:-1;36159:139:0;-1:-1:-1;;;;;36159:139:0;;:::i;5791:26::-;;;:::i;33434:100::-;;;;;;;;;;;;;;;;-1:-1:-1;33434:100:0;-1:-1:-1;;;;;33434:100:0;;:::i;5616:27::-;;;:::i;33625:164::-;;;;;;;;;;;;;;;;-1:-1:-1;33625:164:0;;;;;;;:::i;22422:196::-;;;:::i;33863:503::-;;;;;;;;;;;;;;;;-1:-1:-1;33863:503:0;;:::i;5539:36::-;;;:::i;32021:202::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32021:202:0;;;;;;;;;;;;;:::i;5470:24::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;5739:43;;;;;;;;;;;;;;;;-1:-1:-1;5739:43:0;-1:-1:-1;;;;;5739:43:0;;:::i;22626:164::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35826:161;;;:::i;36946:484::-;;;;;;;;;;;;;;;;-1:-1:-1;36946:484:0;;;;;;;;;;;;:::i;20818:754::-;;;;;;;;;;;;;;;;-1:-1:-1;20818:754:0;;;;;;;:::i;36678:182::-;;;:::i;5503:29::-;;;:::i;5379:20::-;;;:::i;34451:313::-;;;;;;;;;;;;;;;;-1:-1:-1;34451:313:0;;:::i;34898:158::-;;;;;;;;;;;;;;;;-1:-1:-1;34898:158:0;;:::i;5442:21::-;;;:::i;22798:117::-;;;:::i;5824:45::-;;;;;;;;;;;;;;;;-1:-1:-1;5824:45:0;;:::i;36547:123::-;;;;;;;;;;;;;;;;-1:-1:-1;36547:123:0;-1:-1:-1;;;;;36547:123:0;;:::i;23480:261::-;;;:::i;5688:18::-;;;:::i;5406:27::-;;;:::i;22923:258::-;;;;;;;;;;;;;;;;-1:-1:-1;22923:258:0;;:::i;36347:90::-;;;;;;;;;;;;;;;;-1:-1:-1;36347:90:0;;;;:::i;5650:29::-;;;:::i;35245:138::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35245:138:0;;;;;;;;:::i;32231:187::-;32328:7;32355:55;32375:1;32379:15;32396:13;32355:11;:55::i;:::-;32348:62;;32231:187;;;;;:::o;33201:97::-;32778:5;;-1:-1:-1;;;;;32778:5:0;32764:10;:19;32756:76;;;;-1:-1:-1;;;32756:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33266:5:::1;:24:::0;;-1:-1:-1;;;;;;33266:24:0::1;-1:-1:-1::0;;;;;33266:24:0;;;::::1;::::0;;;::::1;::::0;;33201:97::o;21580:834::-;21706:25;21742:30;21783:29;21823:25;21859:16;21903:19;;:::i;:::-;-1:-1:-1;;;;;;21925:18:0;;;;;;:8;:18;;;;;;;;;21903:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22006:14;21903:40;;-1:-1:-1;22003:152:0;;22052:16;22069:1;22052:19;;;;;;;;;;;;;;;;;;:31;;;22027:56;;22003:152;;;22124:16;22141:1;22124:19;;;;;;;;;;;;;;;;;;:31;;;22099:56;;22003:152;22188:24;22203:8;22188:14;:24::i;:::-;22168:44;;22236:55;22248:8;22258:16;22276:14;22236:11;:55::i;:::-;22225:66;;22304:102;21580:834;;;;;;;;;:::o;37732:203::-;32778:5;;-1:-1:-1;;;;;32778:5:0;32764:10;:19;32756:76;;;;-1:-1:-1;;;32756:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37846:19:::1;:17;:19::i;:::-;;37876:51;37887:15;37904:22;37876:10;:51::i;:::-;37732:203:::0;;:::o;5582:25::-;;;;:::o;23189:283::-;23248:7;23257;23266;23286:19;;:::i;:::-;-1:-1:-1;;;;;;23308:18:0;;;;;;:8;:18;;;;;;;;23286:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23366:24;23317:8;23366:14;:24::i;:::-;23411:14;;23427:16;;;;;23411:14;;23427:16;;-1:-1:-1;23427:16:0;-1:-1:-1;23189:283:0;;-1:-1:-1;;;23189:283:0:o;37436:215::-;32778:5;;-1:-1:-1;;;;;32778:5:0;32764:10;:19;32756:76;;;;-1:-1:-1;;;32756:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37540:11:::1;;37530:6;:21;;37522:71;;;;-1:-1:-1::0;;;37522:71:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37604:39;37636:6;37604:31;:39::i;:::-;37436:215:::0;:::o;5708:22::-;;;-1:-1:-1;;;;;5708:22:0;;:::o;35518:180::-;33016:12;;-1:-1:-1;;;33016:12:0;;;;33015:13;33007:48;;;;;-1:-1:-1;;;33007:48:0;;;;;;;;;;;;-1:-1:-1;;;33007:48:0;;;;;;;;;;;;;;;35611:10:::1;35632:20;35611:10:::0;35632::::1;:20::i;:::-;35663:27;35673:8;35683:6;35663:9;:27::i;36443:96::-:0;32778:5;;-1:-1:-1;;;;;32778:5:0;32764:10;:19;32756:76;;;;-1:-1:-1;;;32756:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36509:22:::1;36526:4;36509:16;:22::i;36159:139::-:0;32906:9;;-1:-1:-1;;;32906:9:0;;;;32905:10;32897:42;;;;;-1:-1:-1;;;32897:42:0;;;;;;;;;;;;-1:-1:-1;;;32897:42:0;;;;;;;;;;;;;;;36237:20:::1;36248:8;36237:10;:20::i;:::-;36268:22;36281:8;36268:12;:22::i;5791:26::-:0;;;;:::o;33434:100::-;32778:5;;-1:-1:-1;;;;;32778:5:0;32764:10;:19;32756:76;;;;-1:-1:-1;;;32756:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33498:9:::1;:28:::0;;-1:-1:-1;;;;;;33498:28:0::1;-1:-1:-1::0;;;;;33498:28:0;;;::::1;::::0;;;::::1;::::0;;33434:100::o;5616:27::-;;;;:::o;33625:164::-;32778:5;;-1:-1:-1;;;;;32778:5:0;32764:10;:19;32756:76;;;;-1:-1:-1;;;32756:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33730:51:::1;33741:15;33758:22;33730:10;:51::i;22422:196::-:0;22530:14;;22546:21;;22569:10;;22581:12;;22595:14;;22422:196;;;;;:::o;33863:503::-;32778:5;;-1:-1:-1;;;;;32778:5:0;32764:10;:19;32756:76;;;;-1:-1:-1;;;32756:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33934:11;;33930:232:::1;;33971:9;::::0;::::1;33990:5:::0;;33971:33:::1;::::0;;-1:-1:-1;;;33971:33:0;;-1:-1:-1;;;;;33990:5:0;;::::1;33971:33;::::0;::::1;::::0;;;;;;;;;:9;;;::::1;::::0;:18:::1;::::0;:33;;;;;::::1;::::0;;;;;;;;;;;;;:9;:33;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33971:33:0;33962:59:::1;;;::::0;;-1:-1:-1;;;33962:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33962:59:0;;;;;;;;;;;;;::::1;;33930:232;;;34072:9;::::0;::::1;34091:5:::0;34098:34:::1;::::0;;-1:-1:-1;;;34098:34:0;;34126:4:::1;34098:34;::::0;::::1;::::0;;;-1:-1:-1;;;;;34072:9:0;;::::1;::::0;:18:::1;::::0;34091:5:::1;::::0;34072:9;;34098:19:::1;::::0;:34;;;;;::::1;::::0;;;;;;;;;34072:9;34098:34;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34098:34:0;34072:61:::1;::::0;;-1:-1:-1;;;;;;34072:61:0::1;::::0;;;;;;-1:-1:-1;;;;;34072:61:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;34098:34:::1;::::0;34072:61;;;;;;;-1:-1:-1;34072:61:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34072:61:0;34063:87:::1;;;::::0;;-1:-1:-1;;;34063:87:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34063:87:0;;;;;;;;;;;;;::::1;;34172:21;34179:14;34172:21:::0;;;34211:14:::1;34204:21:::0;;;34243::::1;34236:28:::0;;;-1:-1:-1;34275:17:0;;;34335:23:::1;::::0;34342:16:::1;::::0;34335:23:::1;:::i;5539:36::-:0;;;;:::o;32021:202::-;32135:7;32162:53;32174:8;32184:15;32201:13;32162:11;:53::i;:::-;32155:60;;32021:202;;;;;;:::o;5470:24::-;;;-1:-1:-1;;;5470:24:0;;;;;:::o;5739:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22626:164::-;22725:14;;22741:10;;22753:12;;22767:14;;22626:164;;;;:::o;35826:161::-;32906:9;;-1:-1:-1;;;32906:9:0;;;;32905:10;32897:42;;;;;-1:-1:-1;;;32897:42:0;;;;;;;;;;;;-1:-1:-1;;;32897:42:0;;;;;;;;;;;;;;;35905:10:::1;35926:20;35905:10:::0;35926::::1;:20::i;36946:484::-:0;32778:5;;-1:-1:-1;;;;;32778:5:0;32764:10;:19;32756:76;;;;-1:-1:-1;;;32756:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37108:12:::1;37093;:27;37085:81;;;;-1:-1:-1::0;;;37085:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37185:16;:23:::0;:28;;:102:::1;;-1:-1:-1::0;37232:16:0::1;37249:23:::0;;-1:-1:-1;;37249:25:0;;;37232:43;::::1;;;;;;;;;;;;;;;:55;;;37217:12;:70;37185:102;37177:156;;;;-1:-1:-1::0;;;37177:156:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37344:78;37368:12;37382:15;37399:22;37344:23;:78::i;:::-;36946:484:::0;;;:::o;20818:754::-;20928:30;20969:25;21005:20;21036:16;21083:14;;21101:1;21083:19;21080:152;;;21129:16;21146:1;21129:19;;;;;;;;;;;;;;;;;;:31;;;21104:56;;21080:152;;;21201:16;21218:1;21201:19;;;;;;;;;;;;;;;;;;:31;;;21176:56;;21080:152;21265:26;21288:1;21265:14;:26::i;:::-;21245:46;;21319:14;;21304:29;;21357:57;21377:1;21381:16;21399:14;21357:11;:57::i;:::-;21346:68;;20818:754;;;;;;;:::o;36678:182::-;36781:12;;36742:10;;-1:-1:-1;;;;;36781:12:0;36771:22;;36763:61;;;;;-1:-1:-1;;;36763:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36835:17;36845:6;36835:9;:17::i;5503:29::-;;;;:::o;5379:20::-;;;-1:-1:-1;;;;;5379:20:0;;:::o;34451:313::-;32778:5;;-1:-1:-1;;;;;32778:5:0;32764:10;:19;32756:76;;;;-1:-1:-1;;;32756:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34531:11;;34527:230:::1;;34568:9;::::0;::::1;34587:5:::0;;34568:33:::1;::::0;;-1:-1:-1;;;34568:33:0;;-1:-1:-1;;;;;34587:5:0;;::::1;34568:33;::::0;::::1;::::0;;;;;;;;;:9;;;::::1;::::0;:18:::1;::::0;:33;;;;;::::1;::::0;;;;;;;;;;;;;:9;:33;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34568:33:0;34559:58:::1;;;::::0;;-1:-1:-1;;;34559:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34559:58:0;;;;;;;;;;;;;::::1;;34527:230;;;34668:9;::::0;::::1;34687:5:::0;34694:34:::1;::::0;;-1:-1:-1;;;34694:34:0;;34722:4:::1;34694:34;::::0;::::1;::::0;;;-1:-1:-1;;;;;34668:9:0;;::::1;::::0;:18:::1;::::0;34687:5:::1;::::0;34668:9;;34694:19:::1;::::0;:34;;;;;::::1;::::0;;;;;;;;;34668:9;34694:34;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34694:34:0;34668:61:::1;::::0;;-1:-1:-1;;;;;;34668:61:0::1;::::0;;;;;;-1:-1:-1;;;;;34668:61:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;34694:34:::1;::::0;34668:61;;;;;;;-1:-1:-1;34668:61:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34668:61:0;34659:86:::1;;;::::0;;-1:-1:-1;;;34659:86:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34659:86:0;;;;;;;;;;;;;::::1;34898:158:::0;34970:10;34991:20;34970:10;34991;:20::i;:::-;35022:26;35031:8;35041:6;35022:8;:26::i;5442:21::-;;;-1:-1:-1;;;5442:21:0;;;;;:::o;22798:117::-;22884:16;:23;22798:117;:::o;5824:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5824:45:0;:::o;36547:123::-;32778:5;;-1:-1:-1;;;;;32778:5:0;32764:10;:19;32756:76;;;;-1:-1:-1;;;32756:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36629:33:::1;36646:15;36629:16;:33::i;23480:261::-:0;23531:7;23540;23549;23569:40;23612:30;:28;:30::i;:::-;23661:14;;23677:21;;23661:14;;-1:-1:-1;23677:21:0;-1:-1:-1;23569:73:0;-1:-1:-1;;23480:261:0;;;:::o;5688:18::-;;;-1:-1:-1;;;;;5688:18:0;;:::o;5406:27::-;;;-1:-1:-1;;;;;5406:27:0;;:::o;22923:258::-;22989:7;22998;23007;23027:32;;:::i;:::-;23062:16;23079:5;23062:23;;;;;;;;;;;;;;;;;23027:58;;;;;;;;23062:23;;;;;;;;23027:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23027:58:0;-1:-1:-1;22923:258:0;-1:-1:-1;;;22923:258:0:o;36347:90::-;32778:5;;-1:-1:-1;;;;;32778:5:0;32764:10;:19;32756:76;;;;-1:-1:-1;;;32756:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36410:19:::1;36424:4;36410:13;:19::i;5650:29::-:0;;;;:::o;35245:138::-;35318:20;35329:8;35318:10;:20::i;:::-;35349:26;35358:8;35368:6;35349:8;:26::i;28295:2508::-;28405:7;28425:33;;:::i;:::-;28482:16;:23;28471:34;;28539:14;;28516:20;;;:37;28589:20;;;:38;;;28566:20;;;:61;;;28717:39;28612:15;28717:22;:39::i;:::-;28684:29;;;28638:118;;;28660:22;;;28638:118;;;28639:19;;;28638:118;;;28767:19;;;:41;;;28819:22;;;:47;;;;28877:29;;;:61;28951:20;;;:36;;;-1:-1:-1;;29019:18:0;;:22;;;-1:-1:-1;28998:18:0;;:43;29054:962;29091:8;;29089:10;;29054:962;;;29121:32;;:::i;:::-;29156:16;29173:1;29156:19;;;;;;;;;;;;;;;;;;29121:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29218:5;:17;;;29195:4;:20;;;:40;:85;;;;-1:-1:-1;29260:20:0;;;;29239:17;;:41;;29195:85;29192:813;;;29325:1;29323:3;;29301:19;;;:25;29374:17;;29393:20;;;;29366:48;;29374:17;29366:7;:48::i;:::-;29345:18;;;:69;;;29538:18;;;;29579:20;;;;29622:22;;;;29667:29;;;;29497:241;;:18;:241::i;:::-;29454:22;;;29433:305;;;29434:18;;;29433:305;;;;29782:17;;29759:20;;;:40;29843:20;;;;29818:45;;-1:-1:-1;29914:27:0;;;29882:29;;;:59;29192:813;;;29984:5;;;29192:813;-1:-1:-1;29101:3:0;;29054:962;;;;30054:4;:20;;;30031:4;:20;;;:43;30028:501;;;30112:51;30120:4;:20;;;30142:4;:20;;;30112:7;:51::i;:::-;30091:18;;;:72;;;30201:20;;;;30178;;;:43;30333:18;;;;30370:20;;;;30409:22;;;;30450:29;;;;30296:221;;:18;:221::i;:::-;30257:22;;;30236:281;30237:18;;;30236:281;30028:501;30541:19;;:::i;:::-;-1:-1:-1;;;;;30575:22:0;;;30571:112;;-1:-1:-1;;;;;;30607:18:0;;;;;;:8;:18;;;;;;;;;30600:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30571:112;;;30648:35;;;;;;;;30656:4;:20;;;30648:35;;;;30678:1;30648:35;;;;30681:1;30648:35;;;30641:42;;30571:112;30703:92;30711:42;30718:4;:14;;;30734:4;:18;;;30711:6;:42::i;:::-;30755:39;30763:13;30778:15;30755:7;:39::i;:::-;30703:7;:92::i;:::-;30696:99;28295:2508;-1:-1:-1;;;;;;28295:2508:0:o;23883:623::-;23948:7;23968:19;;:::i;:::-;23998:21;-1:-1:-1;;;;;24034:22:0;;;24030:271;;24081:8;:18;24090:8;-1:-1:-1;;;;;24081:18:0;-1:-1:-1;;;;;24081:18:0;;;;;;;;;;;;24074:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24130:35;24152:12;;24130:21;:35::i;:::-;24114:51;;24030:271;;;24205:29;;;;;;;;24213:14;;24205:29;;;;24229:1;24205:29;;;;24232:1;24205:29;;;24198:36;;24265:24;24287:1;24265:21;:24::i;:::-;24249:40;;24030:271;24313:16;24332:40;24340:13;24355:4;:16;;;24332:7;:40::i;:::-;24313:59;;24383:20;24406:32;24413:4;:14;;;24429:8;24406:6;:32::i;:::-;24383:55;;24458:40;24466:4;:17;;;24485:12;24458:7;:40::i;11769:3658::-;11816:7;11912:33;;:::i;:::-;11969:16;:23;11958:34;;12026:14;;12003:20;;;:37;12097:11;;12075:19;;;:33;;;12053:19;;;:55;;;12144:12;-1:-1:-1;12121:20:0;;:35;12213:12;;-1:-1:-1;12190:20:0;;:35;;;12167:20;;;:58;12280:10;;12259:18;;;:31;;;12238:18;;;:52;12351:14;;12326:22;;;:39;;;12301:22;;;:64;12440:21;;12408:29;;;:53;;;12376:29;;;:85;12474:1623;12511:8;;12509:10;;12474:1623;;;12541:32;;:::i;:::-;12576:16;12593:1;12576:19;;;;;;;;;;;;;;;;;;12541:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12784:5;:17;;;12761:4;:20;;;:40;:85;;;;-1:-1:-1;12826:20:0;;;;12805:17;;:41;;12761:85;12758:1328;;;12891:1;12889:3;;12867:19;;;:25;13012:17;;13031:20;;;;13004:48;;13012:17;13004:7;:48::i;:::-;12983:18;;;:69;;;13176:18;;;;13217:20;;;;13260:22;;;;13305:29;;;;13135:241;;:18;:241::i;:::-;13092:22;;;13071:305;;;13072:18;;;13071:305;;;;13504:17;;13481:20;;;:40;13565:20;;;;;;13540:45;;;-1:-1:-1;13636:27:0;;;;;13604:29;;;:59;13869:17;;13888:20;;13910:27;;13850:88;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13850:88:0;;;12758:1328;;;14065:5;;;12758:1328;-1:-1:-1;12521:3:0;;12474:1623;;;;14296:4;:20;;;14273:4;:20;;;:43;14269:503;;;14355:51;14363:4;:20;;;14385:4;:20;;;14355:7;:51::i;:::-;14334:18;;;:72;;;14444:20;;;;14421;;;:43;14576:18;;;;14613:20;;;;14652:22;;;;14693:29;;;;14539:221;;:18;:221::i;:::-;14500:22;;;14479:281;14480:18;;;14479:281;14269:503;14912:4;:20;;;14888:4;:20;;;:44;14885:84;;14949:20;;;;14934:12;:35;14885:84;15006:4;:19;;;14983:4;:19;;;:42;14980:80;;15041:19;;;;15027:11;:33;14980:80;15096:4;:18;;;15074:4;:18;;;:40;15071:76;;15129:18;;;;15116:10;:31;15071:76;15187:4;:22;;;15161:4;:22;;;:48;15158:92;;15228:22;;;;15211:14;:39;15158:92;15297:4;:29;;;15264:4;:29;;;:62;15261:120;;15352:29;;;;15328:21;:53;15261:120;15401:18;;;;-1:-1:-1;11769:3658:0;:::o;18824:266::-;18926:56;;;;;;;;;;;;;;;;;;;;;;;;;18993:14;:32;;;;19036:21;:46;18824:266::o;18023:557::-;18114:16;:23;18156:8;;;;;:24;;;18177:3;18168:6;:12;18156:24;18148:75;;;;-1:-1:-1;;;18148:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18236:32;;:::i;:::-;18271:16;18288:6;18271:24;;;;;;;;;;;;;;;;;18236:59;;;;;;;;;18271:24;;;;;;;18236:59;;;;;;;;;;;;;;;;;;;;;;;;;;18311:111;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18416:5:0;;18311:111;;;;;;18236:59;;-1:-1:-1;18311:111:0;;;;;;;;;18447:6;18433:106;18461:1;18457:3;:5;18455:1;:7;18433:106;;;18506:16;18523:1;18525;18523:3;18506:21;;;;;;;;;;;;;;;;;;18484:16;18501:1;18484:19;;;;;;;;;;;;;;;;:43;;:19;;;;;:43;;;;;;;;;;;;;;;;;;;;;;;;;18464:3;18433:106;;;;18549:16;:22;;;;;;;;;;;;;;;-1:-1:-1;;18549:22:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18023:557:0:o;10328:504::-;10386:19;;:::i;:::-;-1:-1:-1;;;;;;10408:18:0;;;;;;:8;:18;;;;;;;;10386:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10463:19;:17;:19::i;:::-;10439:43;;10495:16;10514:40;10522:13;10537:4;:16;;;10514:7;:40::i;:::-;10495:59;;10565:20;10588:32;10595:4;:14;;;10611:8;10588:6;:32::i;:::-;10565:55;;10656:13;10636:4;:16;;;:33;10633:84;;-1:-1:-1;;;;;10671:18:0;;;;;;:8;:18;;;;;:30;;:46;;;10633:84;10731:17;;10728:96;;10784:40;10792:4;:17;;;10811:12;10784:7;:40::i;:::-;-1:-1:-1;;;;;10750:18:0;;;;;;:8;:18;;;;;:31;;:74;10728:96;10328:504;;;;;:::o;9360:716::-;9433:19;;:::i;:::-;-1:-1:-1;;;;;;9455:18:0;;;;;;:8;:18;;;;;;;;;9433:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9507:14;;;9540:24;-1:-1:-1;9540:24:0;9532:60;;;;;-1:-1:-1;;;9532:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9630:14;;9622:31;;9646:6;9622:7;:31::i;:::-;9605:48;;;-1:-1:-1;;;;;9664:18:0;;9605:14;9664:18;;;:8;:18;;;;;:45;9743:14;;9735:31;;9759:6;9735:7;:31::i;:::-;9777:14;:29;;;9720:46;-1:-1:-1;9822:10:0;;9819:250;;9955:14;;9928:56;;;-1:-1:-1;;;;;9928:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10008:5;;:32;;;-1:-1:-1;;;10008:32:0;;-1:-1:-1;;;;;10008:32:0;;;;;;;;;;;;;;;:5;;;;;:14;;:32;;;;;;;;;;;;;;:5;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10008:32:0;9999:58;;;;;-1:-1:-1;;;9999:58:0;;;;;;;;;;;;-1:-1:-1;;;9999:58:0;;;;;;;;;;;;;;;9360:716;;;;:::o;19989:118::-;20051:18;;;;;;;;;;;;;;;;;;;20080:12;:19;;;;;-1:-1:-1;;;20080:19:0;-1:-1:-1;;;;20080:19:0;;;;;;;;;19989:118::o;11022:448::-;11082:19;;:::i;:::-;-1:-1:-1;;;;;;11104:18:0;;;;;;:8;:18;;;;;;;;;11082:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11138:22;11135:328;;11194:17;;;;;-1:-1:-1;;;;;11226:18:0;;11177:14;11226:18;;;:8;:18;;;;;;;:31;;:35;;;;11352:23;;;;;;;;;;;;11194:17;;11352:23;;;;;;;;;11398:9;;:36;;;-1:-1:-1;;;11398:36:0;;-1:-1:-1;;;;;11398:36:0;;;;;;;;;;;;;;;:9;;;;;:18;;:36;;;;;;;;;;;;;;:9;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11398:36:0;11390:61;;;;;-1:-1:-1;;;11390:61:0;;;;;;;;;;;;-1:-1:-1;;;11390:61:0;;;;;;;;;;;;;;17338:385;17470:35;;:::i;:::-;17508:74;;;;;;;;17528:12;17508:74;;;;17542:15;17508:74;;;;17559:22;17508:74;;;17470:112;;17598:75;17619:12;17633:15;17650:22;17598:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17684:16;:31;;;;;;;-1:-1:-1;17684:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17338:385:0:o;20115:195::-;-1:-1:-1;;;;;20180:22:0;;20172:53;;;;;-1:-1:-1;;;20172:53:0;;;;;;;;;;;;-1:-1:-1;;;20172:53:0;;;;;;;;;;;;;;;20259:5;;20241:34;;;-1:-1:-1;;;;;20259:5:0;;;20241:34;;;;;;;;;;;;;;;;;;;;;20286:5;:16;;-1:-1:-1;;;;;;20286:16:0;-1:-1:-1;;;;;20286:16:0;;;;;;;;;;20115:195::o;8494:663::-;8566:19;;:::i;:::-;-1:-1:-1;;;;;;8588:18:0;;;;;;:8;:18;;;;;;;;;8566:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8640:14;;;8684:31;;8708:6;8684:7;:31::i;:::-;8667:48;;;-1:-1:-1;;;;;8726:18:0;;8667:14;8726:18;;;:8;:18;;;;;:45;8805:14;;8797:31;;8821:6;8797:7;:31::i;:::-;8839:14;:29;;;8782:46;-1:-1:-1;8884:10:0;;8881:269;;9015:14;;8989:55;;;-1:-1:-1;;;;;8989:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9068:5;;:53;;;-1:-1:-1;;;9068:53:0;;9087:10;9068:53;;;;9107:4;9068:53;;;;;;;;;;;;-1:-1:-1;;;;;9068:5:0;;;;:18;;:53;;;;;;;;;;;;;;;:5;;:53;;;;;;;;;;20318:182;-1:-1:-1;;;;;20395:27:0;;20387:66;;;;;-1:-1:-1;;;20387:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20464:12;:28;;-1:-1:-1;;;;;;20464:28:0;-1:-1:-1;;;;;20464:28:0;;;;;;;;;;20318:182::o;23749:126::-;23812:7;23839:28;23863:1;23839:14;:28::i;:::-;23832:35;;23749:126;:::o;19872:109::-;19931:15;;;;;;;;;;;;;;;;;;;19957:9;:16;;;;;-1:-1:-1;;;19957:16:0;-1:-1:-1;;;;19957:16:0;;;;;;;;;19872:109::o;30811:1202::-;31057:16;:23;30888:7;;;;;;;;;;;;;;31095:15;;31091:508;;31136:1;31132:5;;31128:460;31143:11;31139:1;:15;31128:460;;;31180:32;;:::i;:::-;31215:16;31232:1;31215:19;;;;;;;;;;;;;;;;;;31180:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31272:5;:17;;;31256:12;:33;;:59;;;;-1:-1:-1;31298:17:0;;31293:22;;31256:59;31253:319;;;31355:1;31340:16;;31397:5;:20;;;31379:38;;31453:5;:27;;;31440:40;;31253:319;;;31515:17;;31506:66;;31535:8;;;31506:66;31567:5;;;31506:66;31128:460;;31156:3;;;;;31128:460;;;31609:32;;:::i;:::-;31644:16;31661:12;31644:30;;;;;;;;;;;;;;;;;31609:65;;;;;;;;31644:30;;;;;;;31609:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31609:65:0;-1:-1:-1;31609:65:0;-1:-1:-1;31788:32:0;;31785:171;;;31855:89;31863:15;31880:62;31888:10;31900:40;31908:12;31922:5;:17;;;31900:7;:40::i;:::-;31880:7;:62::i;:::-;31855:7;:89::i;:::-;31837:107;;31785:171;-1:-1:-1;31974:1:0;;31977:15;;-1:-1:-1;31994:10:0;;-1:-1:-1;30811:1202:0;;-1:-1:-1;;;;30811:1202:0:o;743:162::-;805:7;838:1;833;:6;;825:49;;;;;-1:-1:-1;;;825:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;892:5:0;;;743:162::o;15828:1067::-;16041:7;;;16115:27;;16112:246;;16181:48;16189:15;16206:22;16181:7;:48::i;:::-;16163:66;;16259:15;16251:5;:23;16248:94;;;16284:15;16276:23;;16248:94;;;-1:-1:-1;16341:1:0;16248:94;16374:16;16408:18;;16405:261;;16458:129;16466:74;16493:15;16510:5;16517:22;16466:26;:74::i;:::-;16542:43;16551:26;279:7;16563:13;16551:6;:26::i;:::-;16579:5;16542:7;:43::i;:::-;16458:6;:129::i;:::-;16447:140;;16620:30;16628:11;16641:8;16620:7;:30::i;:::-;16606:44;;16405:261;16685:20;;16682:151;;16725:1;16707:19;;16682:151;;;16764:69;16786:15;16803:22;16827:5;16764:21;:69::i;:::-;16746:87;;16682:151;-1:-1:-1;16858:11:0;;16871:15;;-1:-1:-1;15828:1067:0;;-1:-1:-1;;;;;15828:1067:0:o;425:124::-;486:7;513:28;522:13;530:1;533;522:7;:13::i;:::-;279:7;1144:157;1206:7;1238:1;1234;:5;1226:44;;;;;-1:-1:-1;;;1226:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1291:1;1289;:3;;;;;;;1144:157;-1:-1:-1;;;1144:157:0:o;24514:3429::-;24593:7;24689:33;;:::i;:::-;24746:16;:23;24735:34;;24803:14;;24780:20;;;:37;24833:20;24830:876;;24913:1;24891:19;;;:23;;;24869:19;;;:45;;;24954:12;24931:20;;;:35;25004:20;;;:24;;;24981:20;;;:47;;;25064:18;;;:22;;;25043:18;;;:43;;;25126:22;;;:26;;;25101:22;;;:51;;;25199:29;;;:33;;;25167:29;;;:65;24830:876;;;25309:11;;25287:19;;;:33;;;25265:19;;;:55;25358:12;25335:20;;;:35;25408:20;;;:38;;;25385:20;;;:61;;;25505:10;;25484:18;;;:31;;;25463:18;;;:52;25580:14;;25555:22;;;:39;;;25530:22;;;:64;25673:21;;25641:29;;;:53;;;25609:29;;;:85;24830:876;25732:19;;;;25718:1509;25755:8;;25753:10;;25718:1509;;;25785:32;;:::i;:::-;25820:16;25837:1;25820:19;;;;;;;;;;;;;;;;;;25785:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26026:5;:17;;;26003:4;:20;;;:40;:85;;;;-1:-1:-1;26068:20:0;;;;26047:17;;:41;;26003:85;26000:1216;;;26133:1;26131:3;;26109:19;;;:25;26254:17;;26273:20;;;;26246:48;;26254:17;26246:7;:48::i;:::-;26225:18;;;:69;;;26418:18;;;;26459:20;;;;26502:22;;;;26547:29;;;;26377:241;;:18;:241::i;:::-;26334:22;;;26313:305;;;26314:18;;;26313:305;;;;26746:17;;26723:20;;;:40;26807:20;;;;26782:45;;-1:-1:-1;26878:27:0;;;26846:29;;;:59;26000:1216;;;27195:5;;;26000:1216;-1:-1:-1;25765:3:0;;25718:1509;;;;27425:4;:20;;;27402:4;:20;;;:43;27399:501;;;27483:51;27491:4;:20;;;27513:4;:20;;;27483:7;:51::i;:::-;27462:18;;;:72;;;27572:20;;;;27549;;;:43;27704:18;;;;27741:20;;;;27780:22;;;;27821:29;;;;27667:221;;:18;:221::i;:::-;27628:22;;;27607:281;27608:18;;;27607:281;27399:501;27917:18;;;;24514:3429;-1:-1:-1;;24514:3429:0:o;555:182::-;617:7;649:5;;;673:6;;;;665:45;;;;;-1:-1:-1;;;665:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;911:227;973:7;996:6;993:23;;-1:-1:-1;1013:1:0;1006:8;;993:23;1038:5;;;1042:1;1038;:5;:1;1064:3;;;;;1063:10;1054:57;;;;-1:-1:-1;;;1054:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19214:473;19306:7;19553:5;;19549:130;;19580:62;19588:50;19597:12;19605:1;19607;19597:7;:12::i;:::-;19611:25;19620:12;19628:1;19630;19620:7;:12::i;:::-;19634:1;19611:7;:25::i;19588:50::-;19640:1;19580:7;:62::i;:::-;19573:69;;;;19549:130;-1:-1:-1;19678:1:0;19671:8;;295:124;356:7;383:28;392:15;400:1;279:7;392;:15::i;:::-;409:1;383:7;:28::i;19695:169::-;19793:7;19820:36;19828:6;19836:19;19844:3;19849:5;19836:7;:19::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://c2b32496faa8464174a0d689ba91471dadd9a72f3911c93918c971809b2949a2

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.