ETH Price: $2,607.33 (-2.16%)

Contract

0x3E880c804Eca680D64C0Ae5cD1D88cF74F0D5eb7
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Reward Claim195683042024-04-02 13:06:59181 days ago1712063219IN
0x3E880c80...74F0D5eb7
0 ETH0.0067002371.65793349
Withdraw194756332024-03-20 11:32:47194 days ago1710934367IN
0x3E880c80...74F0D5eb7
0 ETH0.0032401335.98550368
Reward Claim194756272024-03-20 11:31:35194 days ago1710934295IN
0x3E880c80...74F0D5eb7
0 ETH0.0020107326.09890455
Withdraw193257412024-02-28 11:30:23215 days ago1709119823IN
0x3E880c80...74F0D5eb7
0 ETH0.0049177443.43110525
Withdraw193173882024-02-27 7:26:35216 days ago1709018795IN
0x3E880c80...74F0D5eb7
0 ETH0.0035408439.32528956
Reward Claim193172982024-02-27 7:08:35216 days ago1709017715IN
0x3E880c80...74F0D5eb7
0 ETH0.0038909942.52310153
Withdraw192723942024-02-21 0:10:47222 days ago1708474247IN
0x3E880c80...74F0D5eb7
0 ETH0.0032397635.98141608
Reward Claim192483522024-02-17 15:04:59226 days ago1708182299IN
0x3E880c80...74F0D5eb7
0 ETH0.0017425222.61760022
Withdraw187234062023-12-05 23:24:59299 days ago1701818699IN
0x3E880c80...74F0D5eb7
0 ETH0.0047560752.82179193
Reward Claim187232912023-12-05 23:01:59299 days ago1701817319IN
0x3E880c80...74F0D5eb7
0 ETH0.0041884154.36459472
Withdraw186378902023-11-24 0:05:59311 days ago1700784359IN
0x3E880c80...74F0D5eb7
0 ETH0.0020103617.75455708
Withdraw185293562023-11-08 19:34:35326 days ago1699472075IN
0x3E880c80...74F0D5eb7
0 ETH0.0040859745.37958218
Reward Claim185293532023-11-08 19:33:59326 days ago1699472039IN
0x3E880c80...74F0D5eb7
0 ETH0.0036544447.43380561
Withdraw184086952023-10-22 22:04:47343 days ago1698012287IN
0x3E880c80...74F0D5eb7
0 ETH0.000784338.710909
Reward Claim184086262023-10-22 21:50:59343 days ago1698011459IN
0x3E880c80...74F0D5eb7
0 ETH0.000592387.68906491
Withdraw184058622023-10-22 12:33:11344 days ago1697977991IN
0x3E880c80...74F0D5eb7
0 ETH0.000674177.48750905
Reward Claim184058362023-10-22 12:27:47344 days ago1697977667IN
0x3E880c80...74F0D5eb7
0 ETH0.000516316.70169544
Withdraw183253452023-10-11 6:13:23355 days ago1697004803IN
0x3E880c80...74F0D5eb7
0 ETH0.000624996.94131722
Reward Claim183253262023-10-11 6:09:35355 days ago1697004575IN
0x3E880c80...74F0D5eb7
0 ETH0.000535645.72864534
Withdraw182247112023-09-27 4:26:47369 days ago1695788807IN
0x3E880c80...74F0D5eb7
0 ETH0.000630977.00776124
Withdraw181884782023-09-22 2:40:47374 days ago1695350447IN
0x3E880c80...74F0D5eb7
0 ETH0.000716317.9555556
Reward Claim180805702023-09-06 23:06:35389 days ago1694041595IN
0x3E880c80...74F0D5eb7
0 ETH0.0007684510.81369383
Withdraw180805682023-09-06 23:06:11389 days ago1694041571IN
0x3E880c80...74F0D5eb7
0 ETH0.0012384210.93713386
Reward Claim180754872023-09-06 5:59:11390 days ago1693979951IN
0x3E880c80...74F0D5eb7
0 ETH0.0010413911.1375561
Withdraw179994502023-08-26 14:31:11401 days ago1693060271IN
0x3E880c80...74F0D5eb7
0 ETH0.0013264614.73194247
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BiFiETHSushiSwapReward

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, BSD-3-Clause license

Contract Source Code (Solidity)

/**
 *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

[{"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"}]

60806040523480156200001157600080fd5b5060405162002f3438038062002f34833981810160405260608110156200003757600080fd5b5080516020820151604090920151600080546001600160a01b031990811673359903041de93c69828f911aeb0be29cc9ccc58b17909155600780548216730bec54c89a7d9f15c4e7faa8d47adedf374462ed17905560088054909116732791bfd60d232150bff86b39b7146c0eaaa2ba8117905543600555909190620000bf838383620000da565b5050600180546001600160a01b0319163317905550620001fe565b620000e4620001dd565b60405180606001604052808581526020018481526020018381525090507f1fdf2820867a17742112aebea1dc9d50d73c902c1e5e2ac7f03b0b11e697adb384848460405180848152602001838152602001828152602001935050505060405180910390a1600b805460018101825560009190915281517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db960039092029182015560208201517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba8201556040909101517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb90910155505050565b60405180606001604052806000815260200160008152602001600081525090565b612d26806200020e6000396000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c80635e5c06e211610146578063b8b1bf99116100c3578063e04bfd8111610087578063e04bfd811461064d578063e30c397814610655578063f4bb1b211461065d578063f71a16131461067a578063ff50abdc14610699578063ffaad6a5146106a157610253565b8063b8b1bf99146105f2578063ca6702cc146105fa578063cabac91c14610602578063d3a417a21461061f578063d48ab3081461064557610253565b806379ba50971161010a57806379ba5097146105a05780638ae39cac146105a85780638da5cb5b146105b05780639091038a146105b8578063b6b55f25146105d557610253565b80635e5c06e2146104f85780635e615a6b1461051e5780636409f9211461054c57806369cddfe514610554578063744f31d71461057d57610253565b80633237a68e116101d45780634959e729116101985780634959e7291461047d5780634f7f399b14610485578063534caae5146104a257806359f2ea07146104aa5780635c388ca6146104dc57610253565b80633237a68e146103fe578063327bc7b11461042457806334a551911461042c578063368990421461045257806336f2fa681461045a57610253565b80631959a0021161021b5780631959a0021461033d5780631eb804db1461038157806323c6a5021461039e5780632e1a7d4d146103c25780633011113a146103df57610253565b8063046a360e1461025857806309ce91ad1461028d5780630e8f7f31146102b557806310dc7f471461031257806315d0c28414610335575b600080fd5b61027b6004803603604081101561026e57600080fd5b50803590602001356106cd565b60408051918252519081900360200190f35b6102b3600480360360208110156102a357600080fd5b50356001600160a01b03166106e4565b005b6102e7600480360360608110156102cb57600080fd5b506001600160a01b03813516906020810135906040013561074f565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102b36004803603604081101561032857600080fd5b5080359060200135610818565b61027b610878565b6103636004803603602081101561035357600080fd5b50356001600160a01b031661087e565b60408051938452602084019290925282820152519081900360600190f35b6102b36004803603602081101561039757600080fd5b50356108e7565b6103a661097d565b604080516001600160a01b039092168252519081900360200190f35b6102b3600480360360208110156103d857600080fd5b503561098c565b6102b3600480360360208110156103f557600080fd5b503515156109f8565b6102b36004803603602081101561041457600080fd5b50356001600160a01b0316610a4a565b61027b610ab1565b6102b36004803603602081101561044257600080fd5b50356001600160a01b0316610ab7565b61027b610b22565b6102b36004803603604081101561047057600080fd5b5080359060200135610b28565b6102e7610b7b565b6102b36004803603602081101561049b57600080fd5b5035610b91565b61027b610e0d565b61027b600480360360608110156104c057600080fd5b506001600160a01b038135169060208101359060400135610e13565b6104e4610e2a565b604080519115158252519081900360200190f35b6103636004803603602081101561050e57600080fd5b50356001600160a01b0316610e3a565b610526610e5b565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6102b3610e6d565b6102b36004803603606081101561056a57600080fd5b5080359060208101359060400135610ecc565b6105266004803603604081101561059357600080fd5b5080359060200135610fcf565b6102b3611052565b61027b6110bc565b6103a66110c2565b6102b3600480360360208110156105ce57600080fd5b50356110d1565b6102b3600480360360208110156105eb57600080fd5b503561132b565b6104e461133f565b61027b61134f565b6103636004803603602081101561061857600080fd5b5035611355565b6102b36004803603602081101561063557600080fd5b50356001600160a01b0316611385565b6103636113d7565b6103a66113f8565b6103a6611407565b6103636004803603602081101561067357600080fd5b5035611416565b6102b36004803603602081101561069057600080fd5b50351515611477565b61027b6114c9565b6102b3600480360360408110156106b757600080fd5b506001600160a01b0381351690602001356114cf565b60006106db600084846114e2565b90505b92915050565b6000546001600160a01b0316331461072d5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b600080600080600061075f612b2f565b506001600160a01b0388166000908152600960209081526040918290208251606081018452815480825260018301549382019390935260029182015493810193909352549096506107d157600b6000815481106107b857fe5b90600052602060002090600302016000015494506107f4565b600b6000815481106107df57fe5b90600052602060002090600302016000015494505b6107fd8961175c565b925061080a8989896114e2565b915050939792965093509350565b6000546001600160a01b031633146108615760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b610869611839565b506108748282611ad3565b5050565b60045481565b600080600061088b612b2f565b506001600160a01b03841660009081526009602090815260408083208151606081018352815481526001820154938101939093526002015490820152906108d18661175c565b8251602090930151929792965094509092505050565b6000546001600160a01b031633146109305760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b600a548110156109715760405162461bcd60e51b8152600401808060200182810382526025815260200180612c776025913960400191505060405180910390fd5b61097a81611b19565b50565b6008546001600160a01b031681565b600154600160a81b900460ff16156109e4576040805162461bcd60e51b8152602060048201526016602482015275195c9c9bdc8e881dda5d1a191c985dc8131bd8dad95960521b604482015290519081900360640190fd5b336109ee81611ca8565b6108748183611d7d565b6000546001600160a01b03163314610a415760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b61097a81611f7b565b600154600160a01b900460ff1615610a9f576040805162461bcd60e51b8152602060048201526013602482015272195c9c9bdc8e8818db185a5b48131bd8dad959606a1b604482015290519081900360640190fd5b610aa881611ca8565b61097a81611fce565b600a5481565b6000546001600160a01b03163314610b005760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60055481565b6000546001600160a01b03163314610b715760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b6108748282611ad3565b6002546003546004546005546006549091929394565b6000546001600160a01b03163314610bda5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b8015610cad57600854600080546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919093169263a9059cbb9260448083019360209390929083900390910190829087803b158015610c3d57600080fd5b505af1158015610c51573d6000803e3d6000fd5b505050506040513d6020811015610c6757600080fd5b5051610ca8576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b610deb565b600854600054604080516370a0823160e01b815230600482015290516001600160a01b039384169363a9059cbb93169184916370a0823191602480820192602092909190829003018186803b158015610d0557600080fd5b505afa158015610d19573d6000803e3d6000fd5b505050506040513d6020811015610d2f57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b158015610d8057600080fd5b505af1158015610d94573d6000803e3d6000fd5b505050506040513d6020811015610daa57600080fd5b5051610deb576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b6000600681905560028190556003819055600481905561097a90600b90612b50565b60035481565b6000610e208484846114e2565b90505b9392505050565b600154600160a81b900460ff1681565b60096020526000908152604090208054600182015460029092015490919083565b60025460045460055460065490919293565b600154600160a01b900460ff1615610ec2576040805162461bcd60e51b8152602060048201526013602482015272195c9c9bdc8e8818db185a5b48131bd8dad959606a1b604482015290519081900360640190fd5b33610aa881611ca8565b6000546001600160a01b03163314610f155760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b438311610f535760405162461bcd60e51b8152600401808060200182810382526029815260200180612c076029913960400191505060405180910390fd5b600b541580610f845750600b80546000198101908110610f6f57fe5b90600052602060002090600302016000015483115b610fbf5760405162461bcd60e51b8152600401808060200182810382526029815260200180612c9c6029913960400191505060405180910390fd5b610fca838383612139565b505050565b6000806000806002546000141561100757600b600081548110610fee57fe5b906000526020600020906003020160000154935061102a565b600b60008154811061101557fe5b90600052602060002090600302016000015493505b611034600061175c565b92506006549150611047600087876114e2565b905092959194509250565b60015433906001600160a01b031681146110b3576040805162461bcd60e51b815260206004820152601a60248201527f6d73672e73656e64657220213d2070656e64696e674f776e6572000000000000604482015290519081900360640190fd5b61097a8161223a565b60025481565b6000546001600160a01b031681565b6000546001600160a01b0316331461111a5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b80156111ed57600854600080546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919093169263a9059cbb9260448083019360209390929083900390910190829087803b15801561117d57600080fd5b505af1158015611191573d6000803e3d6000fd5b505050506040513d60208110156111a757600080fd5b50516111e8576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b61097a565b600854600054604080516370a0823160e01b815230600482015290516001600160a01b039384169363a9059cbb93169184916370a0823191602480820192602092909190829003018186803b15801561124557600080fd5b505afa158015611259573d6000803e3d6000fd5b505050506040513d602081101561126f57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b1580156112c057600080fd5b505af11580156112d4573d6000803e3d6000fd5b505050506040513d60208110156112ea57600080fd5b505161097a576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b3361133581611ca8565b61087481836122f4565b600154600160a01b900460ff1681565b600b5490565b600b818154811061136257fe5b600091825260209091206003909102018054600182015460029092015490925083565b6000546001600160a01b031633146113ce5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b61097a8161242f565b6000806000806113e56124ac565b6002546003549095509350915050909192565b6007546001600160a01b031681565b6001546001600160a01b031681565b6000806000611423612b2f565b600b858154811061143057fe5b600091825260209182902060408051606081018252600393909302909101805480845260018201549484018590526002909101549290910182905297919650945092505050565b6000546001600160a01b031633146114c05760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b61097a816124bd565b60065481565b6114d882611ca8565b61087482826122f4565b60006114ec612b71565b600b54815260065460e082015260a0810184905260c0810184905261151084612510565b6101808401819052610140840182905260408401839052606084018390526101608401919091526101a083015260808201849052600061010083018190526101208301525b815181101561164c57611566612b2f565b600b828154811061157357fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518360c001511080156115c857506080830151815111155b1561163d57600182016060840152805160c08401516115e79190612661565b6020840181905261012084015160e08501516101608601516101a087015161160e946126be565b6101608501908152610120850191909152815160c08501526020820151905260408101516101a0840152611643565b5061164c565b50600101611555565b508060c00151816080015111156116ad5761166f81608001518260c00151612661565b60208201819052608082015160c083015261012082015160e08301516101608401516101a08501516116a0946126be565b6101608301526101208201525b6116b5612b2f565b6001600160a01b0386161561170957506001600160a01b038516600090815260096020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915261172d565b60405180606001604052808360e00151815260200160008152602001600081525090505b6117526117438260000151846101200151612759565b61174d8688612661565b612772565b9695505050505050565b6000611766612b2f565b60006001600160a01b038416156117d95760096000856001600160a01b03166001600160a01b03168152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201548152505091506117d26005546127d9565b9050611807565b60405180606001604052806006548152602001600081526020016000815250915061180460006127d9565b90505b6000611817828460200151612661565b90506000611829846000015183612759565b9050611752846040015182612a0c565b6000611843612b71565b600b54815260065460e0820152600a54604082018190526060820181905243608083015260055460a0830181905260c08301526004546101008301819052610120830152600254610140830181905261016083015260035461018083018190526101a08301525b81518110156119e7576118bb612b2f565b600b82815481106118c857fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518360c0015110801561191d57506080830151815111155b156119d857600182016060840152805160c084015161193c9190612661565b6020840181905261012084015160e08501516101608601516101a0870151611963946126be565b6101608501908152610120850191909152815160c085015260208083018051909252604083810180516101a088015284519351905182519485529284015282810191909152517fc2d5f9e666d2dd7e740ece9acaf1b93ce48894cbc0336d693410badb7c40aead9181900360600190a16119de565b506119e7565b506001016118aa565b5080608001518160c001511015611a4857611a0a81608001518260c00151612661565b60208201819052608082015160c083015261012082015160e08301516101608401516101a0850151611a3b946126be565b6101608301526101208201525b8060c001518160a0015114611a605760c08101516005555b8060600151816040015114611a78576060810151600a555b80610120015181610100015114611a93576101208101516004555b80610160015181610140015114611aae576101608101516002555b806101a0015181610180015114611ac9576101a08101516003555b6101200151905090565b604080518381526020810183905281517fbfc739097487a2d01d113d21aef3ef3d22331f56d3273bc4907d61407e5b0856929181900390910190a1600291909155600355565b600b548015801590611b2a57508082105b611b655760405162461bcd60e51b8152600401808060200182810382526026815260200180612c306026913960400191505060405180910390fd5b611b6d612b2f565b600b8381548110611b7a57fe5b6000918252602091829020604080516060808201835260039094029092018054808452600182015484870181905260029092015484840181905283518a81529687019190915285830191909152928401929092526000198501608084015290519092507f543ba8eaac0e28f58eb335897e63175861579bc16306e05ab5936084c1f074919181900360a00190a1825b60018303811015611c7257600b8160010181548110611c2457fe5b9060005260206000209060030201600b8281548110611c3f57fe5b60009182526020909120825460039092020190815560018083015481830155600292830154929091019190915501611c09565b50600b805480611c7e57fe5b60008281526020812060036000199093019283020181815560018101829055600201559055505050565b611cb0612b2f565b506001600160a01b0381166000908152600960209081526040808320815160608101835281548152600182015493810193909352600201549082015290611cf5611839565b90506000611d07828460200151612661565b90506000611d19846000015183612759565b905082846020015114611d45576001600160a01b03851660009081526009602052604090206001018390555b8015611d7657611d59846040015182612a0c565b6001600160a01b0386166000908152600960205260409020600201555b5050505050565b611d85612b2f565b506001600160a01b038216600090815260096020908152604091829020825160608101845281548082526001830154938201939093526002909101549281019290925260065490831115611e20576040805162461bcd60e51b815260206004820152601760248201527f6e6f7420656e6f7567682075736572204465706f736974000000000000000000604482015290519081900360640190fd5b8151611e2c9084612661565b8083526001600160a01b038516600090815260096020526040902055600654611e559084612661565b600681905590508215611f75578151604080516001600160a01b0387168152602081018690528082019290925260608201839052517f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca949181900360800190a16007546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018790529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015611f0a57600080fd5b505af1158015611f1e573d6000803e3d6000fd5b505050506040513d6020811015611f3457600080fd5b5051611f75576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b50505050565b60408051821515815290517f24e8043bbab505bf23b3d9b569ad2dc34a6a563516daca26e3ad818b40c14f659181900360200190a160018054911515600160a81b0260ff60a81b19909216919091179055565b611fd6612b2f565b506001600160a01b038116600090815260096020908152604091829020825160608101845281548152600182015492810192909252600201549181018290529015610874576040808201516001600160a01b0384166000818152600960209081528482206002019190915583519182528101829052825191927f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d492918290030190a16008546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156120ce57600080fd5b505af11580156120e2573d6000803e3d6000fd5b505050506040513d60208110156120f857600080fd5b5051610fca576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b612141612b2f565b60405180606001604052808581526020018481526020018381525090507f1fdf2820867a17742112aebea1dc9d50d73c902c1e5e2ac7f03b0b11e697adb384848460405180848152602001838152602001828152602001935050505060405180910390a1600b805460018101825560009190915281517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db960039092029182015560208201517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba8201556040909101517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb90910155505050565b6001600160a01b03811661228a576040805162461bcd60e51b81526020600482015260126024820152716f776e6572207a65726f206164647265737360701b604482015290519081900360640190fd5b600054604080516001600160a01b039283168152918316602083015280517f22500af037c600dd7b720644ab6e358635085601d9ac508ad83eb2d6b2d729ca9281900390910190a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b6122fc612b2f565b506001600160a01b03821660009081526009602090815260409182902082516060810184528154808252600183015493820193909352600290910154928101929092526006549061234d9084612a0c565b8083526001600160a01b0385166000908152600960205260409020556006546123769084612a0c565b600681905590508215611f75578151604080516001600160a01b0387168152602081018690528082019290925260608201839052517f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e9181900360800190a1600754604080516323b872dd60e01b81523360048201523060248201526044810186905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015611f0a57600080fd5b6001600160a01b03811661248a576040805162461bcd60e51b815260206004820152601a60248201527f70656e64696e67206f776e6572207a65726f2061646472657373000000000000604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60006124b8600061175c565b905090565b60408051821515815290517f4d23c25ea752bd74a0dfa4a88c011a2c7bf8713a06a6b1028feb1fd277746c4f9181900360200190a160018054911515600160a01b0260ff60a01b19909216919091179055565b600b5460009081908190819081908190819080156125d157600092505b808310156125d15761253d612b2f565b600b848154811061254a57fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518a101580156125975750805115155b156125b25783925080602001519550806040015194506125c4565b80516125be57506125c6565b506125d1565b505b60019092019161252d565b6125d9612b2f565b600b83815481106125e657fe5b600091825260209182902060408051606081018252600390930290910180548084526001820154948401859052600290910154918301829052929850965091508a11156126505761264d86612648876126438e8660000151612661565b612a66565b612661565b95505b509198939750919550919350505050565b6000818310156126b8576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000808084156126e8576126d28686612772565b9050808411156126e4578093506126e8565b5060005b6000871561272d5761271e6126fe888789612abf565b612719612713670de0b6b3a76400008c612b02565b88612a66565b612759565b905061272a8982612a0c565b98505b811561273c576000965061274a565b612747878787612b1f565b96505b50969794965093945050505050565b60006106db6127688484612a66565b670de0b6b3a76400005b60008082116127c8576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816127d157fe5b049392505050565b60006127e3612b71565b600b54815260065460e08201528261284c576000604082018190526060820181905243608083015260a0820181905260c08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a08201526128a3565b600a5460408201819052606082015243608082015260a0810183905260c081018390526004546101008201819052610120820152600254610140820181905261016082015260035461018082018190526101a08201525b60408101515b81518110156129a0576128ba612b2f565b600b82815481106128c757fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518360c0015110801561291c57506080830151815111155b1561299157600182016060840152805160c084015161293b9190612661565b6020840181905261012084015160e08501516101608601516101a0870151612962946126be565b6101608501908152610120850191909152815160c08501526020820151905260408101516101a0840152612997565b506129a0565b506001016128a9565b508060c0015181608001511115612a01576129c381608001518260c00151612661565b60208201819052608082015160c083015261012082015160e08301516101608401516101a08501516129f4946126be565b6101608301526101208201525b610120015192915050565b6000828201838110156106db576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a2061646474696f6e206f766572666c6f77000000000000604482015290519081900360640190fd5b600082612a75575060006106de565b82820282848281612a8257fe5b04146106db5760405162461bcd60e51b8152600401808060200182810382526021815260200180612c566021913960400191505060405180910390fd5b60008215612afa57612af3612aec612ad8600287612a66565b612648612ae6876001612661565b86612a66565b6002612772565b9050610e23565b506000610e23565b60006106db612b1984670de0b6b3a7640000612a66565b83612772565b6000610e20846126488585612a66565b60405180606001604052806000815260200160008152602001600081525090565b508054600082556003029060005260206000209081019061097a9190612be0565b604051806101c0016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b80821115612c02576000808255600182018190556002820155600301612be1565b509056fe6e65772052657761726420706172616d732073686f756c64207265676973746572206561726c6965726572726f723a206e6f20656c656d656e747320696e2072656769737465726564506f696e7473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775265776172642076656c6f6369747920706f696e7420616c7265616479207061737365642e456172696c6965722076656c6f6369747920706f696e74732061726520616c7265616479207365742e6f6e6c794f776e65723a2065787465726e616c2066756e6374696f6e2061636365737320636f6e74726f6c21a264697066735822122021babed0a4f44fde9e273c13ec79dba290a3e3c1b22383ae6858613919fe0b4064736f6c634300060c00330000000000000000000000000000000000000000000000000000000000c860a6000000000000000000000000000000000000000000000000f266650863a748e5000000000000000000000000000000000000000000000000000001ee90ba90c4

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102535760003560e01c80635e5c06e211610146578063b8b1bf99116100c3578063e04bfd8111610087578063e04bfd811461064d578063e30c397814610655578063f4bb1b211461065d578063f71a16131461067a578063ff50abdc14610699578063ffaad6a5146106a157610253565b8063b8b1bf99146105f2578063ca6702cc146105fa578063cabac91c14610602578063d3a417a21461061f578063d48ab3081461064557610253565b806379ba50971161010a57806379ba5097146105a05780638ae39cac146105a85780638da5cb5b146105b05780639091038a146105b8578063b6b55f25146105d557610253565b80635e5c06e2146104f85780635e615a6b1461051e5780636409f9211461054c57806369cddfe514610554578063744f31d71461057d57610253565b80633237a68e116101d45780634959e729116101985780634959e7291461047d5780634f7f399b14610485578063534caae5146104a257806359f2ea07146104aa5780635c388ca6146104dc57610253565b80633237a68e146103fe578063327bc7b11461042457806334a551911461042c578063368990421461045257806336f2fa681461045a57610253565b80631959a0021161021b5780631959a0021461033d5780631eb804db1461038157806323c6a5021461039e5780632e1a7d4d146103c25780633011113a146103df57610253565b8063046a360e1461025857806309ce91ad1461028d5780630e8f7f31146102b557806310dc7f471461031257806315d0c28414610335575b600080fd5b61027b6004803603604081101561026e57600080fd5b50803590602001356106cd565b60408051918252519081900360200190f35b6102b3600480360360208110156102a357600080fd5b50356001600160a01b03166106e4565b005b6102e7600480360360608110156102cb57600080fd5b506001600160a01b03813516906020810135906040013561074f565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102b36004803603604081101561032857600080fd5b5080359060200135610818565b61027b610878565b6103636004803603602081101561035357600080fd5b50356001600160a01b031661087e565b60408051938452602084019290925282820152519081900360600190f35b6102b36004803603602081101561039757600080fd5b50356108e7565b6103a661097d565b604080516001600160a01b039092168252519081900360200190f35b6102b3600480360360208110156103d857600080fd5b503561098c565b6102b3600480360360208110156103f557600080fd5b503515156109f8565b6102b36004803603602081101561041457600080fd5b50356001600160a01b0316610a4a565b61027b610ab1565b6102b36004803603602081101561044257600080fd5b50356001600160a01b0316610ab7565b61027b610b22565b6102b36004803603604081101561047057600080fd5b5080359060200135610b28565b6102e7610b7b565b6102b36004803603602081101561049b57600080fd5b5035610b91565b61027b610e0d565b61027b600480360360608110156104c057600080fd5b506001600160a01b038135169060208101359060400135610e13565b6104e4610e2a565b604080519115158252519081900360200190f35b6103636004803603602081101561050e57600080fd5b50356001600160a01b0316610e3a565b610526610e5b565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6102b3610e6d565b6102b36004803603606081101561056a57600080fd5b5080359060208101359060400135610ecc565b6105266004803603604081101561059357600080fd5b5080359060200135610fcf565b6102b3611052565b61027b6110bc565b6103a66110c2565b6102b3600480360360208110156105ce57600080fd5b50356110d1565b6102b3600480360360208110156105eb57600080fd5b503561132b565b6104e461133f565b61027b61134f565b6103636004803603602081101561061857600080fd5b5035611355565b6102b36004803603602081101561063557600080fd5b50356001600160a01b0316611385565b6103636113d7565b6103a66113f8565b6103a6611407565b6103636004803603602081101561067357600080fd5b5035611416565b6102b36004803603602081101561069057600080fd5b50351515611477565b61027b6114c9565b6102b3600480360360408110156106b757600080fd5b506001600160a01b0381351690602001356114cf565b60006106db600084846114e2565b90505b92915050565b6000546001600160a01b0316331461072d5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b600080600080600061075f612b2f565b506001600160a01b0388166000908152600960209081526040918290208251606081018452815480825260018301549382019390935260029182015493810193909352549096506107d157600b6000815481106107b857fe5b90600052602060002090600302016000015494506107f4565b600b6000815481106107df57fe5b90600052602060002090600302016000015494505b6107fd8961175c565b925061080a8989896114e2565b915050939792965093509350565b6000546001600160a01b031633146108615760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b610869611839565b506108748282611ad3565b5050565b60045481565b600080600061088b612b2f565b506001600160a01b03841660009081526009602090815260408083208151606081018352815481526001820154938101939093526002015490820152906108d18661175c565b8251602090930151929792965094509092505050565b6000546001600160a01b031633146109305760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b600a548110156109715760405162461bcd60e51b8152600401808060200182810382526025815260200180612c776025913960400191505060405180910390fd5b61097a81611b19565b50565b6008546001600160a01b031681565b600154600160a81b900460ff16156109e4576040805162461bcd60e51b8152602060048201526016602482015275195c9c9bdc8e881dda5d1a191c985dc8131bd8dad95960521b604482015290519081900360640190fd5b336109ee81611ca8565b6108748183611d7d565b6000546001600160a01b03163314610a415760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b61097a81611f7b565b600154600160a01b900460ff1615610a9f576040805162461bcd60e51b8152602060048201526013602482015272195c9c9bdc8e8818db185a5b48131bd8dad959606a1b604482015290519081900360640190fd5b610aa881611ca8565b61097a81611fce565b600a5481565b6000546001600160a01b03163314610b005760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60055481565b6000546001600160a01b03163314610b715760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b6108748282611ad3565b6002546003546004546005546006549091929394565b6000546001600160a01b03163314610bda5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b8015610cad57600854600080546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919093169263a9059cbb9260448083019360209390929083900390910190829087803b158015610c3d57600080fd5b505af1158015610c51573d6000803e3d6000fd5b505050506040513d6020811015610c6757600080fd5b5051610ca8576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b610deb565b600854600054604080516370a0823160e01b815230600482015290516001600160a01b039384169363a9059cbb93169184916370a0823191602480820192602092909190829003018186803b158015610d0557600080fd5b505afa158015610d19573d6000803e3d6000fd5b505050506040513d6020811015610d2f57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b158015610d8057600080fd5b505af1158015610d94573d6000803e3d6000fd5b505050506040513d6020811015610daa57600080fd5b5051610deb576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b6000600681905560028190556003819055600481905561097a90600b90612b50565b60035481565b6000610e208484846114e2565b90505b9392505050565b600154600160a81b900460ff1681565b60096020526000908152604090208054600182015460029092015490919083565b60025460045460055460065490919293565b600154600160a01b900460ff1615610ec2576040805162461bcd60e51b8152602060048201526013602482015272195c9c9bdc8e8818db185a5b48131bd8dad959606a1b604482015290519081900360640190fd5b33610aa881611ca8565b6000546001600160a01b03163314610f155760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b438311610f535760405162461bcd60e51b8152600401808060200182810382526029815260200180612c076029913960400191505060405180910390fd5b600b541580610f845750600b80546000198101908110610f6f57fe5b90600052602060002090600302016000015483115b610fbf5760405162461bcd60e51b8152600401808060200182810382526029815260200180612c9c6029913960400191505060405180910390fd5b610fca838383612139565b505050565b6000806000806002546000141561100757600b600081548110610fee57fe5b906000526020600020906003020160000154935061102a565b600b60008154811061101557fe5b90600052602060002090600302016000015493505b611034600061175c565b92506006549150611047600087876114e2565b905092959194509250565b60015433906001600160a01b031681146110b3576040805162461bcd60e51b815260206004820152601a60248201527f6d73672e73656e64657220213d2070656e64696e674f776e6572000000000000604482015290519081900360640190fd5b61097a8161223a565b60025481565b6000546001600160a01b031681565b6000546001600160a01b0316331461111a5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b80156111ed57600854600080546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919093169263a9059cbb9260448083019360209390929083900390910190829087803b15801561117d57600080fd5b505af1158015611191573d6000803e3d6000fd5b505050506040513d60208110156111a757600080fd5b50516111e8576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b61097a565b600854600054604080516370a0823160e01b815230600482015290516001600160a01b039384169363a9059cbb93169184916370a0823191602480820192602092909190829003018186803b15801561124557600080fd5b505afa158015611259573d6000803e3d6000fd5b505050506040513d602081101561126f57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b1580156112c057600080fd5b505af11580156112d4573d6000803e3d6000fd5b505050506040513d60208110156112ea57600080fd5b505161097a576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b3361133581611ca8565b61087481836122f4565b600154600160a01b900460ff1681565b600b5490565b600b818154811061136257fe5b600091825260209091206003909102018054600182015460029092015490925083565b6000546001600160a01b031633146113ce5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b61097a8161242f565b6000806000806113e56124ac565b6002546003549095509350915050909192565b6007546001600160a01b031681565b6001546001600160a01b031681565b6000806000611423612b2f565b600b858154811061143057fe5b600091825260209182902060408051606081018252600393909302909101805480845260018201549484018590526002909101549290910182905297919650945092505050565b6000546001600160a01b031633146114c05760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b61097a816124bd565b60065481565b6114d882611ca8565b61087482826122f4565b60006114ec612b71565b600b54815260065460e082015260a0810184905260c0810184905261151084612510565b6101808401819052610140840182905260408401839052606084018390526101608401919091526101a083015260808201849052600061010083018190526101208301525b815181101561164c57611566612b2f565b600b828154811061157357fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518360c001511080156115c857506080830151815111155b1561163d57600182016060840152805160c08401516115e79190612661565b6020840181905261012084015160e08501516101608601516101a087015161160e946126be565b6101608501908152610120850191909152815160c08501526020820151905260408101516101a0840152611643565b5061164c565b50600101611555565b508060c00151816080015111156116ad5761166f81608001518260c00151612661565b60208201819052608082015160c083015261012082015160e08301516101608401516101a08501516116a0946126be565b6101608301526101208201525b6116b5612b2f565b6001600160a01b0386161561170957506001600160a01b038516600090815260096020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915261172d565b60405180606001604052808360e00151815260200160008152602001600081525090505b6117526117438260000151846101200151612759565b61174d8688612661565b612772565b9695505050505050565b6000611766612b2f565b60006001600160a01b038416156117d95760096000856001600160a01b03166001600160a01b03168152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201548152505091506117d26005546127d9565b9050611807565b60405180606001604052806006548152602001600081526020016000815250915061180460006127d9565b90505b6000611817828460200151612661565b90506000611829846000015183612759565b9050611752846040015182612a0c565b6000611843612b71565b600b54815260065460e0820152600a54604082018190526060820181905243608083015260055460a0830181905260c08301526004546101008301819052610120830152600254610140830181905261016083015260035461018083018190526101a08301525b81518110156119e7576118bb612b2f565b600b82815481106118c857fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518360c0015110801561191d57506080830151815111155b156119d857600182016060840152805160c084015161193c9190612661565b6020840181905261012084015160e08501516101608601516101a0870151611963946126be565b6101608501908152610120850191909152815160c085015260208083018051909252604083810180516101a088015284519351905182519485529284015282810191909152517fc2d5f9e666d2dd7e740ece9acaf1b93ce48894cbc0336d693410badb7c40aead9181900360600190a16119de565b506119e7565b506001016118aa565b5080608001518160c001511015611a4857611a0a81608001518260c00151612661565b60208201819052608082015160c083015261012082015160e08301516101608401516101a0850151611a3b946126be565b6101608301526101208201525b8060c001518160a0015114611a605760c08101516005555b8060600151816040015114611a78576060810151600a555b80610120015181610100015114611a93576101208101516004555b80610160015181610140015114611aae576101608101516002555b806101a0015181610180015114611ac9576101a08101516003555b6101200151905090565b604080518381526020810183905281517fbfc739097487a2d01d113d21aef3ef3d22331f56d3273bc4907d61407e5b0856929181900390910190a1600291909155600355565b600b548015801590611b2a57508082105b611b655760405162461bcd60e51b8152600401808060200182810382526026815260200180612c306026913960400191505060405180910390fd5b611b6d612b2f565b600b8381548110611b7a57fe5b6000918252602091829020604080516060808201835260039094029092018054808452600182015484870181905260029092015484840181905283518a81529687019190915285830191909152928401929092526000198501608084015290519092507f543ba8eaac0e28f58eb335897e63175861579bc16306e05ab5936084c1f074919181900360a00190a1825b60018303811015611c7257600b8160010181548110611c2457fe5b9060005260206000209060030201600b8281548110611c3f57fe5b60009182526020909120825460039092020190815560018083015481830155600292830154929091019190915501611c09565b50600b805480611c7e57fe5b60008281526020812060036000199093019283020181815560018101829055600201559055505050565b611cb0612b2f565b506001600160a01b0381166000908152600960209081526040808320815160608101835281548152600182015493810193909352600201549082015290611cf5611839565b90506000611d07828460200151612661565b90506000611d19846000015183612759565b905082846020015114611d45576001600160a01b03851660009081526009602052604090206001018390555b8015611d7657611d59846040015182612a0c565b6001600160a01b0386166000908152600960205260409020600201555b5050505050565b611d85612b2f565b506001600160a01b038216600090815260096020908152604091829020825160608101845281548082526001830154938201939093526002909101549281019290925260065490831115611e20576040805162461bcd60e51b815260206004820152601760248201527f6e6f7420656e6f7567682075736572204465706f736974000000000000000000604482015290519081900360640190fd5b8151611e2c9084612661565b8083526001600160a01b038516600090815260096020526040902055600654611e559084612661565b600681905590508215611f75578151604080516001600160a01b0387168152602081018690528082019290925260608201839052517f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca949181900360800190a16007546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018790529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015611f0a57600080fd5b505af1158015611f1e573d6000803e3d6000fd5b505050506040513d6020811015611f3457600080fd5b5051611f75576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b50505050565b60408051821515815290517f24e8043bbab505bf23b3d9b569ad2dc34a6a563516daca26e3ad818b40c14f659181900360200190a160018054911515600160a81b0260ff60a81b19909216919091179055565b611fd6612b2f565b506001600160a01b038116600090815260096020908152604091829020825160608101845281548152600182015492810192909252600201549181018290529015610874576040808201516001600160a01b0384166000818152600960209081528482206002019190915583519182528101829052825191927f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d492918290030190a16008546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156120ce57600080fd5b505af11580156120e2573d6000803e3d6000fd5b505050506040513d60208110156120f857600080fd5b5051610fca576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b612141612b2f565b60405180606001604052808581526020018481526020018381525090507f1fdf2820867a17742112aebea1dc9d50d73c902c1e5e2ac7f03b0b11e697adb384848460405180848152602001838152602001828152602001935050505060405180910390a1600b805460018101825560009190915281517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db960039092029182015560208201517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba8201556040909101517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb90910155505050565b6001600160a01b03811661228a576040805162461bcd60e51b81526020600482015260126024820152716f776e6572207a65726f206164647265737360701b604482015290519081900360640190fd5b600054604080516001600160a01b039283168152918316602083015280517f22500af037c600dd7b720644ab6e358635085601d9ac508ad83eb2d6b2d729ca9281900390910190a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b6122fc612b2f565b506001600160a01b03821660009081526009602090815260409182902082516060810184528154808252600183015493820193909352600290910154928101929092526006549061234d9084612a0c565b8083526001600160a01b0385166000908152600960205260409020556006546123769084612a0c565b600681905590508215611f75578151604080516001600160a01b0387168152602081018690528082019290925260608201839052517f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e9181900360800190a1600754604080516323b872dd60e01b81523360048201523060248201526044810186905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015611f0a57600080fd5b6001600160a01b03811661248a576040805162461bcd60e51b815260206004820152601a60248201527f70656e64696e67206f776e6572207a65726f2061646472657373000000000000604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60006124b8600061175c565b905090565b60408051821515815290517f4d23c25ea752bd74a0dfa4a88c011a2c7bf8713a06a6b1028feb1fd277746c4f9181900360200190a160018054911515600160a01b0260ff60a01b19909216919091179055565b600b5460009081908190819081908190819080156125d157600092505b808310156125d15761253d612b2f565b600b848154811061254a57fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518a101580156125975750805115155b156125b25783925080602001519550806040015194506125c4565b80516125be57506125c6565b506125d1565b505b60019092019161252d565b6125d9612b2f565b600b83815481106125e657fe5b600091825260209182902060408051606081018252600390930290910180548084526001820154948401859052600290910154918301829052929850965091508a11156126505761264d86612648876126438e8660000151612661565b612a66565b612661565b95505b509198939750919550919350505050565b6000818310156126b8576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000808084156126e8576126d28686612772565b9050808411156126e4578093506126e8565b5060005b6000871561272d5761271e6126fe888789612abf565b612719612713670de0b6b3a76400008c612b02565b88612a66565b612759565b905061272a8982612a0c565b98505b811561273c576000965061274a565b612747878787612b1f565b96505b50969794965093945050505050565b60006106db6127688484612a66565b670de0b6b3a76400005b60008082116127c8576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816127d157fe5b049392505050565b60006127e3612b71565b600b54815260065460e08201528261284c576000604082018190526060820181905243608083015260a0820181905260c08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a08201526128a3565b600a5460408201819052606082015243608082015260a0810183905260c081018390526004546101008201819052610120820152600254610140820181905261016082015260035461018082018190526101a08201525b60408101515b81518110156129a0576128ba612b2f565b600b82815481106128c757fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518360c0015110801561291c57506080830151815111155b1561299157600182016060840152805160c084015161293b9190612661565b6020840181905261012084015160e08501516101608601516101a0870151612962946126be565b6101608501908152610120850191909152815160c08501526020820151905260408101516101a0840152612997565b506129a0565b506001016128a9565b508060c0015181608001511115612a01576129c381608001518260c00151612661565b60208201819052608082015160c083015261012082015160e08301516101608401516101a08501516129f4946126be565b6101608301526101208201525b610120015192915050565b6000828201838110156106db576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a2061646474696f6e206f766572666c6f77000000000000604482015290519081900360640190fd5b600082612a75575060006106de565b82820282848281612a8257fe5b04146106db5760405162461bcd60e51b8152600401808060200182810382526021815260200180612c566021913960400191505060405180910390fd5b60008215612afa57612af3612aec612ad8600287612a66565b612648612ae6876001612661565b86612a66565b6002612772565b9050610e23565b506000610e23565b60006106db612b1984670de0b6b3a7640000612a66565b83612772565b6000610e20846126488585612a66565b60405180606001604052806000815260200160008152602001600081525090565b508054600082556003029060005260206000209081019061097a9190612be0565b604051806101c0016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b80821115612c02576000808255600182018190556002820155600301612be1565b509056fe6e65772052657761726420706172616d732073686f756c64207265676973746572206561726c6965726572726f723a206e6f20656c656d656e747320696e2072656769737465726564506f696e7473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775265776172642076656c6f6369747920706f696e7420616c7265616479207061737365642e456172696c6965722076656c6f6369747920706f696e74732061726520616c7265616479207365742e6f6e6c794f776e65723a2065787465726e616c2066756e6374696f6e2061636365737320636f6e74726f6c21a264697066735822122021babed0a4f44fde9e273c13ec79dba290a3e3c1b22383ae6858613919fe0b4064736f6c634300060c0033

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

0000000000000000000000000000000000000000000000000000000000c860a6000000000000000000000000000000000000000000000000f266650863a748e5000000000000000000000000000000000000000000000000000001ee90ba90c4

-----Decoded View---------------
Arg [0] : start (uint256): 13131942
Arg [1] : reward_per_block (uint256): 17466759291509098725
Arg [2] : dec_per_block (uint256): 2124141990084

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000c860a6
Arg [1] : 000000000000000000000000000000000000000000000000f266650863a748e5
Arg [2] : 000000000000000000000000000000000000000000000000000001ee90ba90c4


Deployed Bytecode Sourcemap

40532:520: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://21babed0a4f44fde9e273c13ec79dba290a3e3c1b22383ae6858613919fe0b40

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.