Contract 0x44529A37a43Bab8aF2336698e31F2e4585ad7db6 1

 

Contract Overview

Multichain: veMULTI Reward
Balance:
0 Ether

EtherValue:
$0.00

Token:
Txn Hash
Method
Block
From
To
Value
0x297eb5a716d1f0c7f63c84c065d88052db4410c510c52aebed8304549d0a68f7Claim Reward(pending)2022-09-28 10:25:263 days 7 hrs ago0xefce38f31ebeb9637e85d3487595261fdf6ebeeb IN Multichain: veMULTI Reward0 Ether(Pending)(Pending)
0x6d715fc4c9c46386fc27ee95f4aff028974909e10d477420bbae99dd69b994beClaim Reward156530072022-10-01 11:26:596 hrs 38 mins agoENS Name 06119.eth IN  Multichain: veMULTI Reward0 Ether0.00399067 4.9195902
0x64fd5bd799d75fee675f4b971af2825e95c948a75ff9b7a56a8eb94dc35ba3c6Claim Reward156513702022-10-01 5:58:2312 hrs 6 mins ago0x019ad231648558a991288fc3a05011819a389d17 IN  Multichain: veMULTI Reward0 Ether0.00147751 6.91273745
0x02f1fb7290aa2b9f943917a2249d28cc3aaf73007aa89ce27b950258c30d67d1Claim Reward156507912022-10-01 4:01:3514 hrs 3 mins ago0x833393218cdd114a5883b66d6dd51562a89c4d54 IN  Multichain: veMULTI Reward0 Ether0.00081567 5.000001
0x917e34cf1b0f7a6a2385124cbf0f072c1f64dc13530e96b41449ad7d37737fbdClaim Reward156493852022-09-30 23:18:1118 hrs 47 mins agoENS Name hedgehog0x.eth IN  Multichain: veMULTI Reward0 Ether0.00211897 9.56043636
0xef182ad933cf3f136e3f86af4563ec6b381479ab9c2aa641d57ac5ba39512dddClaim Reward156492542022-09-30 22:51:5919 hrs 13 mins ago0x9642f4781e1e6673b1ad2dec31bc727993bf76ad IN  Multichain: veMULTI Reward0 Ether0.0016619 8
0x14d437ade8764bde1ced9d64beb90e4d9de8ed74b75da36f6293227b035890feClaim Reward156470152022-09-30 15:21:471 day 2 hrs ago0x7e96727232886f9f4f3217923c0f29c0c4ca9ac1 IN  Multichain: veMULTI Reward0 Ether0.00436795 21.35627146
0xfc6dbec3e55f0f1a95c62fbe41dd5ca22431809c687d050d0913da1d068cc23dClaim Reward156461982022-09-30 12:37:471 day 5 hrs ago0xcd14610e6ab9bdf20c674b1d6b47c4e4f4c641d8 IN  Multichain: veMULTI Reward0 Ether0.01466474 29.878852
0xe528928b5ae3b978e988133707fcd4a78062f46db4d161b548ed5593779d2b5cClaim Reward156444112022-09-30 6:38:111 day 11 hrs ago0xcbe1e74398706f23cc0ddf2eec3ed18602b93e5c IN  Multichain: veMULTI Reward0 Ether0.00033518 12.03017993
0x143e65de1d4276a9f2fdb1011ea4a6a530e192d251fac47cf8a4c776d75ed48fClaim Reward156443722022-09-30 6:30:231 day 11 hrs ago0x6af390c4588f4b221c70c498e46f270b36b76986 IN  Multichain: veMULTI Reward0 Ether0.00286896 10.19429659
0x7abe4370f8088a3ee90f30618c9e4533656a0815559769a60905e767902cf8c7Claim Reward156395162022-09-29 14:12:232 days 3 hrs ago0x8a71d2b7d3ca2aa535dcf689c66ac68fa36d5b5a IN  Multichain: veMULTI Reward0 Ether0.005721319.9
0xcd4dbe37d02e724dc4f2bcb11cadbc8ba25e88fec368bec12d86700699145af8Claim Reward156392832022-09-29 13:25:112 days 4 hrs ago0x8a71d2b7d3ca2aa535dcf689c66ac68fa36d5b5a IN  Multichain: veMULTI Reward0 Ether0.0057611820.05
0x7e05d89d831fbef152ea32703b45de52b9b020e364452e821528872765abd82cClaim Reward156388932022-09-29 12:06:232 days 5 hrs ago0xd7af4f3b97c30b77ee7ac96fae654dbf8db32207 IN  Multichain: veMULTI Reward0 Ether0.00212707 9.89826868
0xbb52c032f91396aea9eab2727ba6e103778fcf83233a903cd2d83036a61a9f98Claim Reward156374262022-09-29 7:11:232 days 10 hrs ago0xf9931ac59523f190aaf8f87ab2f795dc032983b7 IN  Multichain: veMULTI Reward0 Ether0.00528481 10.80975769
0x6979754fbaabeb036b5e501df25f06949e168db222fe0b81644c7c94b904f6e7Claim Reward156369812022-09-29 5:41:352 days 12 hrs ago0xd0c417aab37c6b3acf93da6036bfe29963c5b3d9 IN  Multichain: veMULTI Reward0 Ether0.00871829 8.36719497
0xc5a6f478278803f2bc07aa7e75c8df2a4c1d6efad656739ff95a09e1a7443de0Add Epoch156329572022-09-28 16:13:233 days 1 hr agoMultichain: Deployer 4 IN  Multichain: veMULTI Reward0 Ether0.00406328 20.50402904
0x0ec3fe6a3d01628ac2b8efb0c880ef5c1b662c1dc354ebff445de690cf3ccd16Claim Reward156309952022-09-28 9:38:593 days 8 hrs ago0x46bfa99b7d855f7cebb352023936d207d84c8e03 IN  Multichain: veMULTI Reward0 Ether0.0015798110
0x530475f109a79fc697fbafd1a47bef951d210be2ef9c34778468e8a540921dcbClaim Reward156294362022-09-28 4:25:473 days 13 hrs ago0xc3217766f902286dda561c201ca20e0958a437d7 IN  Multichain: veMULTI Reward0 Ether0.00645185 8.87056881
0xb682b2cc291cae6f234b39833263f1d6a0a7f7c6a22bb9cfb6c4df3b12c4211cClaim Reward156294302022-09-28 4:24:353 days 13 hrs ago0xc3217766f902286dda561c201ca20e0958a437d7 IN  Multichain: veMULTI Reward0 Ether0.00606866 8.15206596
0x0328403614ab50786d4a5a5ed5128ac6cec8dcaf8ef027ee9a5b093bd4318744Claim Reward156282612022-09-28 0:29:233 days 17 hrs ago0xf6aa90d1cf9cd2b405b8b775e3fb2029e310d675 IN  Multichain: veMULTI Reward0 Ether0.002004239.85704593
0x1662694d0582c78200590a2c820b582bf65768d78eb79efb8076b17701edbb3fClaim Reward156282592022-09-28 0:28:593 days 17 hrs ago0xf6aa90d1cf9cd2b405b8b775e3fb2029e310d675 IN  Multichain: veMULTI Reward0 Ether0.001956279.47220733
0x5187bf240f595e023aa9968bdc6e5bc4766ae3c33c98b918a33c7d6232018c3cClaim Reward156264912022-09-27 18:30:593 days 23 hrs ago0x806e94412e085f46ac4d30e3be9afd3ab550a522 IN  Multichain: veMULTI Reward0 Ether0.00658278 19.00177386
0x4f844ab901927e13db1c879793bcb40a5038f562df35ebf9069bb4ce8e960e89Claim Reward156264152022-09-27 18:15:353 days 23 hrs ago0x26c2c166c9ccbfd4978ef1179333659848134cc3 IN  Multichain: veMULTI Reward0 Ether0.0033211 21.39114782
0xc996ca2c940ce92a063928e9ceb88c136ac97948189c7b1dadb786f97a806c0aClaim Reward156254222022-09-27 14:55:594 days 3 hrs ago0x9925a3ccda6692f89dc73ede8ac9cdf494336699 IN  Multichain: veMULTI Reward0 Ether0.0062182 28.6550658
0x75aed554d007a38804a110fb4a8f529b8d4c199502b6ac52c3ef7417fb99308bClaim Reward156253862022-09-27 14:48:474 days 3 hrs ago0x9925a3ccda6692f89dc73ede8ac9cdf494336699 IN  Multichain: veMULTI Reward0 Ether0.00480384 22.13733693
[ Download CSV Export 

OVERVIEW

Staking MULTI to mint veMULTI NFT and get Multichain bridge fee rewards.

View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Reward

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-07
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.11;

interface IERC20 {
    function transfer(address recipient, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
}

library Address {
    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != 0x0 && codehash != accountHash);
    }
}

library SafeERC20 {
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function callOptionalReturn(IERC20 token, bytes memory data) private {
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

interface ve {
    function balanceOfAtNFT(uint _tokenId, uint _block) external view returns (uint);
    function balanceOfNFTAt(uint _tokenId, uint _t) external view returns (uint);
    function totalSupplyAt(uint _block) external view returns (uint);
    function totalSupplyAtT(uint t) external view returns (uint);
    function ownerOf(uint) external view returns (address);
    function create_lock(uint _value, uint _lock_duration) external returns (uint);
}

contract Reward {
    using SafeERC20 for IERC20;

    struct EpochInfo {
        uint startTime;
        uint endTime;
        uint rewardPerSecond; // totalReward * RewardMultiplier / (endBlock - startBlock)
        uint totalPower;
        uint startBlock;
    }

    /// @dev Ve nft
    address public immutable _ve;
    /// @dev reward erc20 token, USDT
    address public immutable rewardToken;
    /// @dev RewardMultiplier
    uint immutable RewardMultiplier = 10000000;
    /// @dev BlockMultiplier
    uint immutable BlockMultiplier = 1000000000000000000;

    /// @dev reward epochs.
    EpochInfo[] public epochInfo;

    /// @dev user's last claim time.
    mapping(uint => mapping(uint => uint)) public userLastClaimTime; // tokenId -> epoch id -> last claim timestamp\

    address public admin;
    address public pendingAdmin;

    modifier onlyAdmin() {
        require(msg.sender == admin);
        _;
    }

    event LogClaimReward(uint tokenId, uint reward);
    event LogAddEpoch(uint epochId, EpochInfo epochInfo);
    event LogAddEpoch(uint startTime, uint epochLength, uint epochCount, uint startEpochId);
    event LogTransferAdmin(address pendingAdmin);
    event LogAcceptAdmin(address admin);

    constructor (
        address _ve_,
        address rewardToken_
    ) {
        admin = msg.sender;
        _ve = _ve_;
        rewardToken = rewardToken_;
        // add init point
        addCheckpoint();
    }
    
    struct Point {
        uint256 ts;
        uint256 blk; // block
    }

    /// @dev list of checkpoints, used in getBlockByTime
    Point[] public point_history;
   
    /// @notice add checkpoint to point_history
    /// called in constructor, addEpoch, addEpochBatch and claimReward
    /// point_history increments without repetition, length always >= 1
    function addCheckpoint() internal {
        point_history.push(Point(block.timestamp, block.number));
    }
    
    /// @notice estimate last block number before given time
    /// @return blockNumber
    function getBlockByTime(uint _time) public view returns (uint) {
        // Binary search
        uint _min = 0;
        uint _max = point_history.length - 1; // asserting length >= 2
        for (uint i = 0; i < 128; ++i) {
            // Will be always enough for 128-bit numbers
            if (_min >= _max) {
                break;
            }
            uint _mid = (_min + _max + 1) / 2;
            if (point_history[_mid].ts <= _time) {
                _min = _mid;
            } else {
                _max = _mid - 1;
            }
        }

        Point memory point0 = point_history[_min];
        Point memory point1 = point_history[_min + 1];
        if (_time == point0.ts) {
            return point0.blk;
        }
        // asserting point0.blk < point1.blk, point0.ts < point1.ts
        uint block_slope; // dblock/dt
        block_slope = (BlockMultiplier * (point1.blk - point0.blk)) / (point1.ts - point0.ts);
        uint dblock = (block_slope * (_time - point0.ts)) / BlockMultiplier;
        return point0.blk + dblock;
    }

    function withdrawFee(uint amount) external onlyAdmin {
        IERC20(rewardToken).safeTransfer(admin, amount);
    }

    function transferAdmin(address _admin) external onlyAdmin {
        pendingAdmin = _admin;
        emit LogTransferAdmin(pendingAdmin);
    }

    function acceptAdmin() external {
        require(msg.sender == pendingAdmin);
        admin = pendingAdmin;
        pendingAdmin = address(0);
        emit LogAcceptAdmin(admin);
    }

    /// @notice add one epoch
    /// @return epochId
    /// @return accurateTotalReward
    function addEpoch(uint startTime, uint endTime, uint totalReward) external onlyAdmin returns(uint, uint) {
        assert(block.timestamp < endTime && startTime < endTime);
        if (epochInfo.length > 0) {
            require(epochInfo[epochInfo.length - 1].endTime <= startTime);
        }
        (uint epochId, uint accurateTotalReward) = _addEpoch(startTime, endTime, totalReward);
        uint lastPointTime = point_history[point_history.length - 1].ts;
        if (lastPointTime < block.timestamp) {
            addCheckpoint();
        }
        emit LogAddEpoch(epochId, epochInfo[epochId]);
        return (epochId, accurateTotalReward);
    }

    /// @notice add a batch of continuous epochs
    /// @return firstEpochId
    /// @return lastEpochId
    /// @return accurateTotalReward
    function addEpochBatch(uint startTime, uint epochLength, uint epochCount, uint totalReward) external onlyAdmin returns(uint, uint, uint) {
        require(block.timestamp < startTime + epochLength);
        if (epochInfo.length > 0) {
            require(epochInfo[epochInfo.length - 1].endTime <= startTime);
        }
        uint _reward = totalReward / epochCount;
        uint _epochId;
        uint accurateTR;
        uint _start = startTime;
        uint _end = _start + epochLength;
        for (uint i = 0; i < epochCount; i++) {
            (_epochId, accurateTR) = _addEpoch(_start, _end, _reward);
            _start = _end;
            _end = _start + epochLength;
        }
        uint lastPointTime = point_history[point_history.length - 1].ts;
        if (lastPointTime < block.timestamp) {
            addCheckpoint();
        }
        emit LogAddEpoch(startTime, epochLength, epochCount, _epochId + 1 - epochCount);
        return (_epochId + 1 - epochCount, _epochId, accurateTR * epochCount);
    }

    /// @notice add one epoch
    /// @return epochId
    /// @return accurateTotalReward
    function _addEpoch(uint startTime, uint endTime, uint totalReward) internal returns(uint, uint) {
        uint rewardPerSecond = totalReward * RewardMultiplier / (endTime - startTime);
        uint epochId = epochInfo.length;
        epochInfo.push(EpochInfo(startTime, endTime, rewardPerSecond, 1, 1));
        uint accurateTotalReward = (endTime - startTime) * rewardPerSecond / RewardMultiplier;
        return (epochId, accurateTotalReward);
    }

    /// @notice set epoch reward
    function updateEpochReward(uint epochId, uint totalReward) external onlyAdmin {
        require(block.timestamp < epochInfo[epochId].startTime);
        epochInfo[epochId].rewardPerSecond = totalReward * RewardMultiplier / (epochInfo[epochId].endTime - epochInfo[epochId].startTime);
    }

    /// @notice query pending reward by epoch
    /// @return pendingReward
    /// @return finished
    /// panic when block.timestamp < epoch.startTime
    function _pendingRewardSingle(uint tokenId, uint lastClaimTime, EpochInfo memory epoch) internal view returns (uint, bool) {
        uint last = lastClaimTime >= epoch.startTime ? lastClaimTime : epoch.startTime;
        if (last >= epoch.endTime) {
            return (0, true);
        }
        if (epoch.totalPower == 0) {
            return (0, true);
        }
        
        uint end = block.timestamp;
        bool finished = false;
        if (end > epoch.endTime) {
            end = epoch.endTime;
            finished = true;
        }

        uint power = ve(_ve).balanceOfAtNFT(tokenId, epoch.startBlock);
        
        uint reward = epoch.rewardPerSecond * (end - last) * power / (epoch.totalPower * RewardMultiplier);
        return (reward, finished);
    }

    function checkpointAndCheckEpoch(uint epochId) public {
        uint lastPointTime = point_history[point_history.length - 1].ts;
        if (lastPointTime < block.timestamp) {
            addCheckpoint();
        }
        checkEpoch(epochId);
    }

    function checkEpoch(uint epochId) internal {
        if (epochInfo[epochId].startBlock == 1) {
            epochInfo[epochId].startBlock = getBlockByTime(epochInfo[epochId].startTime);
        }
        if (epochInfo[epochId].totalPower == 1) {
            epochInfo[epochId].totalPower = ve(_ve).totalSupplyAt(epochInfo[epochId].startBlock);
        }
    }

    struct Interval {
        uint startEpoch;
        uint endEpoch;
    }

    struct IntervalReward {
        uint startEpoch;
        uint endEpoch;
        uint reward;
    }

    function claimRewardMany(uint[] calldata tokenIds, Interval[][] calldata intervals) public returns (uint[] memory rewards) {
        require(tokenIds.length == intervals.length, "length not equal");
        rewards = new uint[] (tokenIds.length);
        for (uint i = 0; i < tokenIds.length; i++) {
            rewards[i] = claimReward(tokenIds[i], intervals[i]);
        }
        return rewards;
    }

    function claimReward(uint tokenId, Interval[] calldata intervals) public returns (uint reward) {
        for (uint i = 0; i < intervals.length; i++) {
            reward += claimReward(tokenId, intervals[i].startEpoch, intervals[i].endEpoch);
        }
        return reward;
    }

    /// @notice claim reward in range
    function claimReward(uint tokenId, uint startEpoch, uint endEpoch) public returns (uint reward) {
        require(msg.sender == ve(_ve).ownerOf(tokenId));
        require(endEpoch < epochInfo.length, "claim out of range");
        EpochInfo memory epoch;
        uint lastPointTime = point_history[point_history.length - 1].ts;
        for (uint i = startEpoch; i <= endEpoch; i++) {
            epoch = epochInfo[i];
            if (block.timestamp < epoch.startTime) {
                break;
            }
            if (lastPointTime < epoch.startTime) {
                // this branch runs 0 or 1 time
                lastPointTime = block.timestamp;
                addCheckpoint();
            }
            checkEpoch(i);
            (uint reward_i, bool finished) = _pendingRewardSingle(tokenId, userLastClaimTime[tokenId][i], epochInfo[i]);
            if (reward_i > 0) {
                reward += reward_i;
                userLastClaimTime[tokenId][i] = block.timestamp;
            }
            if (!finished) {
                break;
            }
        }
        IERC20(rewardToken).safeTransfer(ve(_ve).ownerOf(tokenId), reward);
        emit LogClaimReward(tokenId, reward);
        return reward;
    }

    /// @notice get epoch by time
    function getEpochIdByTime(uint _time) view public returns (uint) {
        assert(epochInfo[0].startTime <= _time);
        if (_time > epochInfo[epochInfo.length - 1].startTime) {
            return epochInfo.length - 1;
        }
        // Binary search
        uint _min = 0;
        uint _max = epochInfo.length - 1; // asserting length >= 2
        for (uint i = 0; i < 128; ++i) {
            // Will be always enough for 128-bit numbers
            if (_min >= _max) {
                break;
            }
            uint _mid = (_min + _max + 1) / 2;
            if (epochInfo[_mid].startTime <= _time) {
                _min = _mid;
            } else {
                _max = _mid - 1;
            }
        }
        return _min;
    }

    /**
    External read functions
     */
    struct RewardInfo {
        uint epochId;
        uint reward;
    }

    uint constant MaxQueryLength = 50;

    /// @notice get epoch info
    /// @return startTime
    /// @return endTime
    /// @return totalReward
    function getEpochInfo(uint epochId) public view returns (uint, uint, uint) {
        if (epochId >= epochInfo.length) {
            return (0,0,0);
        }
        EpochInfo memory epoch = epochInfo[epochId];
        uint totalReward = (epoch.endTime - epoch.startTime) * epoch.rewardPerSecond / RewardMultiplier;
        return (epoch.startTime, epoch.endTime, totalReward);
    }

    function getCurrentEpochId() public view returns (uint) {
        uint currentEpochId = getEpochIdByTime(block.timestamp);
        return currentEpochId;
    }

    /// @notice only for external view functions
    /// Time beyond last checkpoint resulting in inconsistent estimated block number.
    function getBlockByTimeWithoutLastCheckpoint(uint _time) public view returns (uint) {
        if (point_history[point_history.length - 1].ts >= _time) {
            return getBlockByTime(_time);
        }
        Point memory point0 = point_history[point_history.length - 1];
        if (_time == point0.ts) {
            return point0.blk;
        }
        uint block_slope;
        block_slope = (BlockMultiplier * (block.number - point0.blk)) / (block.timestamp - point0.ts);
        uint dblock = (block_slope * (_time - point0.ts)) / BlockMultiplier;
        return point0.blk + dblock;
    }

    function getEpochStartBlock(uint epochId) public view returns (uint) {
        if (epochInfo[epochId].startBlock == 1) {
            return getBlockByTimeWithoutLastCheckpoint(epochInfo[epochId].startTime);
        }
        return epochInfo[epochId].startBlock;
    }

    function getEpochTotalPower(uint epochId) public view returns (uint) {
        if (epochInfo[epochId].totalPower == 1) {
            uint blk = getEpochStartBlock(epochId);
            if (blk > block.number) {
                return ve(_ve).totalSupplyAtT(epochInfo[epochId].startTime);
            }
            return ve(_ve).totalSupplyAt(blk);
        }
        return epochInfo[epochId].totalPower;
    }

    /// @notice get user's power at epochId
    function getUserPower(uint tokenId, uint epochId) view public returns (uint) {
        EpochInfo memory epoch = epochInfo[epochId];
        uint blk = getBlockByTimeWithoutLastCheckpoint(epoch.startTime);
        if (blk < block.number) {
            return ve(_ve).balanceOfAtNFT(tokenId, blk);
        }
        return ve(_ve).balanceOfNFTAt(tokenId, epochInfo[epochId].startTime);
    }

    /// @notice
    /// Current epoch reward is inaccurate
    /// because the checkpoint may not have been added.
    function getPendingRewardSingle(uint tokenId, uint epochId) public view returns (uint reward, bool finished) {
        if (epochId > getCurrentEpochId()) {
            return (0, false);
        }
        EpochInfo memory epoch = epochInfo[epochId];
        uint startBlock = getEpochStartBlock(epochId);
        uint totalPower = getEpochTotalPower(epochId);
        if (totalPower == 0) {
            return (0, true);
        }
        uint power = ve(_ve).balanceOfAtNFT(tokenId, startBlock);

        uint last = userLastClaimTime[tokenId][epochId];
        last = last >= epoch.startTime ? last : epoch.startTime;
        if (last >= epoch.endTime) {
            return (0, true);
        }
        
        uint end = block.timestamp;
        finished = false;
        if (end > epoch.endTime) {
            end = epoch.endTime;
            finished = true;
        }
        
        reward = epoch.rewardPerSecond * (end - last) * power / (totalPower * RewardMultiplier);
        return (reward, finished);
    }

    /// @notice get claimable reward
    function pendingReward(uint tokenId, uint start, uint end) public view returns (IntervalReward[] memory intervalRewards) {
        uint current = getCurrentEpochId();
        require(start <= end);
        if (end > current) {
            end = current;
        }
        RewardInfo[] memory rewards = new RewardInfo[](end - start + 1);
        for (uint i = start; i <= end; i++) {
            if (block.timestamp < epochInfo[i].startTime) {
                break;
            }
            (uint reward_i,) = getPendingRewardSingle(tokenId, i);
            rewards[i-start] = RewardInfo(i, reward_i);
        }

        // omit zero rewards and convert epoch list to intervals
        IntervalReward[] memory intervalRewards_0 = new IntervalReward[] (rewards.length);
        uint intv = 0;
        uint intvCursor = 0;
        uint sum = 0;
        for (uint i = 0; i < rewards.length; i++) {
            if (rewards[i].reward == 0) {
                if (i != intvCursor) {
                    intervalRewards_0[intv] = IntervalReward(rewards[intvCursor].epochId, rewards[i-1].epochId, sum);
                    intv++;
                    sum = 0;
                }
                intvCursor = i + 1;
                continue;
            }
            sum += rewards[i].reward;
        }
        if (sum > 0) {
            intervalRewards_0[intv] = IntervalReward(rewards[intvCursor].epochId, rewards[rewards.length-1].epochId, sum);
            intervalRewards = new IntervalReward[] (intv+1);
            // Copy interval array
            for (uint i = 0; i < intv+1; i++) {
                intervalRewards[i] = intervalRewards_0[i];
            }
        } else {
            intervalRewards = new IntervalReward[] (intv);
            // Copy interval array
            for (uint i = 0; i < intv; i++) {
                intervalRewards[i] = intervalRewards_0[i];
            }
        }
        
        return intervalRewards;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_ve_","type":"address"},{"internalType":"address","name":"rewardToken_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"}],"name":"LogAcceptAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"epochId","type":"uint256"},{"components":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"rewardPerSecond","type":"uint256"},{"internalType":"uint256","name":"totalPower","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"}],"indexed":false,"internalType":"struct Reward.EpochInfo","name":"epochInfo","type":"tuple"}],"name":"LogAddEpoch","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epochLength","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"epochCount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startEpochId","type":"uint256"}],"name":"LogAddEpoch","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"LogClaimReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pendingAdmin","type":"address"}],"name":"LogTransferAdmin","type":"event"},{"inputs":[],"name":"_ve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"totalReward","type":"uint256"}],"name":"addEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"epochLength","type":"uint256"},{"internalType":"uint256","name":"epochCount","type":"uint256"},{"internalType":"uint256","name":"totalReward","type":"uint256"}],"name":"addEpochBatch","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"epochId","type":"uint256"}],"name":"checkpointAndCheckEpoch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"uint256","name":"startEpoch","type":"uint256"},{"internalType":"uint256","name":"endEpoch","type":"uint256"}],"internalType":"struct Reward.Interval[]","name":"intervals","type":"tuple[]"}],"name":"claimReward","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"startEpoch","type":"uint256"},{"internalType":"uint256","name":"endEpoch","type":"uint256"}],"name":"claimReward","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"startEpoch","type":"uint256"},{"internalType":"uint256","name":"endEpoch","type":"uint256"}],"internalType":"struct Reward.Interval[][]","name":"intervals","type":"tuple[][]"}],"name":"claimRewardMany","outputs":[{"internalType":"uint256[]","name":"rewards","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"epochInfo","outputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"rewardPerSecond","type":"uint256"},{"internalType":"uint256","name":"totalPower","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"getBlockByTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"getBlockByTimeWithoutLastCheckpoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentEpochId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"getEpochIdByTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"epochId","type":"uint256"}],"name":"getEpochInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"epochId","type":"uint256"}],"name":"getEpochStartBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"epochId","type":"uint256"}],"name":"getEpochTotalPower","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"epochId","type":"uint256"}],"name":"getPendingRewardSingle","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"bool","name":"finished","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"epochId","type":"uint256"}],"name":"getUserPower","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"pendingReward","outputs":[{"components":[{"internalType":"uint256","name":"startEpoch","type":"uint256"},{"internalType":"uint256","name":"endEpoch","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"}],"internalType":"struct Reward.IntervalReward[]","name":"intervalRewards","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"point_history","outputs":[{"internalType":"uint256","name":"ts","type":"uint256"},{"internalType":"uint256","name":"blk","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"transferAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"epochId","type":"uint256"},{"internalType":"uint256","name":"totalReward","type":"uint256"}],"name":"updateEpochReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userLastClaimTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101006040526298968060c052670de0b6b3a764000060e0523480156200002557600080fd5b5060405162002e3138038062002e3183398101604081905262000048916200010f565b600280546001600160a01b031916331790556001600160a01b03828116608052811660a052620000ea6040805180820190915242815243602082019081526004805460018101825560009190915291517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b600290930292830155517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c90910155565b505062000147565b80516001600160a01b03811681146200010a57600080fd5b919050565b600080604083850312156200012357600080fd5b6200012e83620000f2565b91506200013e60208401620000f2565b90509250929050565b60805160a05160c05160e051612c2b62000206600039600081816110f50152818161112901528181611306015261133a0152600081816105830152818161067d01528181611cdb01528181612088015281816121b701526125110152600081816104580152818161170301526119d401526000818161034701528181610c7701528181610cf5015281816113b40152818161168601528181611bf701528181611e3801528181611f060152818161232f01526124980152612c2b6000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c8063777a6768116100f9578063c42d487611610097578063ee5c5d7511610071578063ee5c5d7514610420578063f4874b4314610433578063f7c618c114610453578063f851a4401461047a57600080fd5b8063c42d4876146103d2578063d1febfb9146103fa578063e752141b1461040d57600080fd5b8063a98fb345116100d3578063a98fb34514610371578063b56bff8914610399578063be357616146103ac578063c1f76dfd146103bf57600080fd5b8063777a6768146103175780638dd598fb14610342578063a29a839f1461036957600080fd5b80633894228e116101665780635b2cc6d7116101405780635b2cc6d7146102cb5780636fc9353f146102de5780637388e485146102f157806375829def1461030457600080fd5b80633894228e1461026a578063457fa640146102a55780634fcb1838146102b857600080fd5b80630e18b681146101ae578063135022c2146101b8578063205a4482146101eb57806326782247146101fe578063296daaac146102295780632d5dc77714610249575b600080fd5b6101b661048d565b005b6101cb6101c636600461279d565b610502565b604080519384526020840192909252908201526060015b60405180910390f35b6101b66101f93660046127b6565b6105dd565b600354610211906001600160a01b031681565b6040516001600160a01b0390911681526020016101e2565b61023c6102373660046127d8565b6106d8565b6040516101e29190612804565b61025c6102573660046127b6565b610bde565b6040519081526020016101e2565b61027d61027836600461279d565b610dba565b604080519586526020860194909452928401919091526060830152608082015260a0016101e2565b6101cb6102b336600461285d565b610dfb565b61025c6102c636600461288f565b610fb0565b61025c6102d936600461279d565b611023565b61025c6102ec36600461279d565b611187565b61025c6102ff3660046127d8565b61139b565b6101b6610312366004612923565b61176c565b61025c6103253660046127b6565b600160209081526000928352604080842090915290825290205481565b6102117f000000000000000000000000000000000000000000000000000000000000000081565b61025c6117d7565b61038461037f3660046127d8565b6117e3565b604080519283526020830191909152016101e2565b6101b66103a736600461279d565b611957565b6101b66103ba36600461279d565b6119ac565b61025c6103cd36600461279d565b611a00565b6103e56103e03660046127b6565b611b2a565b604080519283529015156020830152016101e2565b61038461040836600461279d565b611d3e565b61025c61041b36600461279d565b611d6c565b61025c61042e36600461279d565b611df3565b610446610441366004612985565b611f69565b6040516101e291906129f1565b6102117f000000000000000000000000000000000000000000000000000000000000000081565b600254610211906001600160a01b031681565b6003546001600160a01b031633146104a457600080fd5b60038054600280546001600160a01b0383166001600160a01b031991821681179092559091169091556040519081527f803a94fb89b71a5b6268fe4f2ebd6f3883e006a025caa59244b9db7b150cb16d9060200160405180910390a1565b6000805481908190841061051e575060009150819050806105d6565b600080858154811061053257610532612a35565b600091825260208083206040805160a08101825260059094029091018054808552600182015493850184905260028201549285018390526003820154606086015260049091015460808501529294507f00000000000000000000000000000000000000000000000000000000000000009290916105af9190612a61565b6105b99190612a78565b6105c39190612a97565b8251602090930151929550919350909150505b9193909250565b6002546001600160a01b031633146105f457600080fd5b6000828154811061060757610607612a35565b906000526020600020906005020160000154421061062457600080fd5b6000828154811061063757610637612a35565b9060005260206000209060050201600001546000838154811061065c5761065c612a35565b9060005260206000209060050201600101546106789190612a61565b6106a27f000000000000000000000000000000000000000000000000000000000000000083612a78565b6106ac9190612a97565b600083815481106106bf576106bf612a35565b9060005260206000209060050201600201819055505050565b606060006106e46117d7565b9050828411156106f357600080fd5b808311156106ff578092505b600061070b8585612a61565b610716906001612ab9565b67ffffffffffffffff81111561072e5761072e612ad1565b60405190808252806020026020018201604052801561077357816020015b604080518082019091526000808252602082015281526020019060019003908161074c5790505b509050845b848111610810576000818154811061079257610792612a35565b9060005260206000209060050201600001544210156107b057610810565b60006107bc8883611b2a565b5090506040518060400160405280838152602001828152508388846107e19190612a61565b815181106107f1576107f1612a35565b602002602001018190525050808061080890612ae7565b915050610778565b506000815167ffffffffffffffff81111561082d5761082d612ad1565b60405190808252806020026020018201604052801561088257816020015b61086f60405180606001604052806000815260200160008152602001600081525090565b81526020019060019003908161084b5790505b5090506000806000805b85518110156109a3578581815181106108a7576108a7612a35565b60200260200101516020015160001415610965578281146109535760405180606001604052808785815181106108df576108df612a35565b6020026020010151600001518152602001876001846108fe9190612a61565b8151811061090e5761090e612a35565b60200260200101516000015181526020018381525085858151811061093557610935612a35565b6020026020010181905250838061094b90612ae7565b945050600091505b61095e816001612ab9565b9250610991565b85818151811061097757610977612a35565b6020026020010151602001518261098e9190612ab9565b91505b8061099b81612ae7565b91505061088c565b508015610b095760405180606001604052808684815181106109c7576109c7612a35565b602002602001015160000151815260200186600188516109e79190612a61565b815181106109f7576109f7612a35565b602002602001015160000151815260200182815250848481518110610a1e57610a1e612a35565b6020908102919091010152610a34836001612ab9565b67ffffffffffffffff811115610a4c57610a4c612ad1565b604051908082528060200260200182016040528015610aa157816020015b610a8e60405180606001604052806000815260200160008152602001600081525090565b815260200190600190039081610a6a5790505b50965060005b610ab2846001612ab9565b811015610b0357848181518110610acb57610acb612a35565b6020026020010151888281518110610ae557610ae5612a35565b60200260200101819052508080610afb90612ae7565b915050610aa7565b50610bd1565b8267ffffffffffffffff811115610b2257610b22612ad1565b604051908082528060200260200182016040528015610b7757816020015b610b6460405180606001604052806000815260200160008152602001600081525090565b815260200190600190039081610b405790505b50965060005b83811015610bcf57848181518110610b9757610b97612a35565b6020026020010151888281518110610bb157610bb1612a35565b60200260200101819052508080610bc790612ae7565b915050610b7d565b505b5050505050509392505050565b60008060008381548110610bf457610bf4612a35565b90600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090506000610c508260000151611023565b905043811015610cf357604051638c2c9baf60e01b815260048101869052602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690638c2c9baf90604401602060405180830381865afa158015610cc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cea9190612b02565b92505050610db4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e0514aba8660008781548110610d3657610d36612a35565b9060005260206000209060050201600001546040518363ffffffff1660e01b8152600401610d6e929190918252602082015260400190565b602060405180830381865afa158015610d8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610daf9190612b02565b925050505b92915050565b60008181548110610dca57600080fd5b6000918252602090912060059091020180546001820154600283015460038401546004909401549294509092909185565b600254600090819081906001600160a01b03163314610e1957600080fd5b610e238688612ab9565b4210610e2e57600080fd5b60005415610e765760008054889190610e4990600190612a61565b81548110610e5957610e59612a35565b9060005260206000209060050201600101541115610e7657600080fd5b6000610e828686612a97565b90506000808981610e938b83612ab9565b905060005b8a811015610ed357610eab838388612075565b90955093509091508190610ebf8c83612ab9565b915080610ecb81612ae7565b915050610e98565b506004805460009190610ee890600190612a61565b81548110610ef857610ef8612a35565b906000526020600020906002020160000154905042811015610f1c57610f1c612204565b7ff9bf9b1fbc0efbb3b02e819ba4fe2f26b77d0184f24fe4a8cff08a70a3c8c9b38d8d8d80610f4c8a6001612ab9565b610f569190612a61565b60408051948552602085019390935291830152606082015260800160405180910390a18a610f85866001612ab9565b610f8f9190612a61565b85610f9a8d87612a78565b9850985098505050505050509450945094915050565b6000805b8281101561101b57610ffd85858584818110610fd257610fd2612a35565b90506040020160000135868685818110610fee57610fee612a35565b9050604002016020013561139b565b6110079083612ab9565b91508061101381612ae7565b915050610fb4565b509392505050565b60048054600091839161103890600190612a61565b8154811061104857611048612a35565b9060005260206000209060020201600001541061106857610db482611187565b600480546000919061107c90600190612a61565b8154811061108c5761108c612a35565b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050905080600001518314156110d1576020015192915050565b80516000906110e09042612a61565b60208301516110ef9043612a61565b611119907f0000000000000000000000000000000000000000000000000000000000000000612a78565b6111239190612a97565b905060007f00000000000000000000000000000000000000000000000000000000000000008360000151866111589190612a61565b6111629084612a78565b61116c9190612a97565b905080836020015161117e9190612ab9565b95945050505050565b6004546000908190819061119d90600190612a61565b905060005b608081101561122e578183106111b75761122e565b600060026111c58486612ab9565b6111d0906001612ab9565b6111da9190612a97565b905085600482815481106111f0576111f0612a35565b9060005260206000209060020201600001541161120f5780935061121d565b61121a600182612a61565b92505b5061122781612ae7565b90506111a2565b5060006004838154811061124457611244612a35565b9060005260206000209060020201604051806040016040529081600082015481526020016001820154815250509050600060048460016112849190612ab9565b8154811061129457611294612a35565b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050905081600001518614156112dc575060200151949350505050565b815181516000916112ec91612a61565b836020015183602001516113009190612a61565b61132a907f0000000000000000000000000000000000000000000000000000000000000000612a78565b6113349190612a97565b905060007f00000000000000000000000000000000000000000000000000000000000000008460000151896113699190612a61565b6113739084612a78565b61137d9190612a97565b905080846020015161138f9190612ab9565b98975050505050505050565b6040516331a9108f60e11b8152600481018490526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e90602401602060405180830381865afa158015611403573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114279190612b1b565b6001600160a01b0316336001600160a01b03161461144457600080fd5b600054821061148f5760405162461bcd60e51b8152602060048201526012602482015271636c61696d206f7574206f662072616e676560701b60448201526064015b60405180910390fd5b6114c16040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b60048054600091906114d590600190612a61565b815481106114e5576114e5612a35565b60009182526020909120600290910201549050845b84811161166b576000818154811061151457611514612a35565b90600052602060002090600502016040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050925082600001514210156115725761166b565b825182101561158657429150611586612204565b61158f8161227d565b600087815260016020908152604080832084845290915281205481548291611616918b91908490879081106115c6576115c6612a35565b90600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505061240b565b9092509050811561164a5761162b8287612ab9565b60008a8152600160209081526040808320878452909152902042905595505b8061165657505061166b565b5050808061166390612ae7565b9150506114fa565b506040516331a9108f60e11b81526004810187905261172a907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e90602401602060405180830381865afa1580156116d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f99190612b1b565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016908561257d565b60408051878152602081018590527f9c0a04cdb208c6c211f0db12243903fe3364cb963bf42762fdac05c8465def82910160405180910390a150509392505050565b6002546001600160a01b0316331461178357600080fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f57ec2a65eade8e3634214df34b708c94f610e83d1c82d2a61efbb168b42117539060200160405180910390a150565b600080610db442611a00565b60025460009081906001600160a01b031633146117ff57600080fd5b834210801561180d57508385105b61181957611819612b38565b60005415611861576000805486919061183490600190612a61565b8154811061184457611844612a35565b906000526020600020906005020160010154111561186157600080fd5b60008061186f878787612075565b915091506000600460016004805490506118899190612a61565b8154811061189957611899612a35565b9060005260206000209060020201600001549050428110156118bd576118bd612204565b7fbbc72d445eee4bd880864f55587d09ff44aa6bc2bc5546cf8e7cab7f8ae29a3083600085815481106118f2576118f2612a35565b9060005260206000209060050201604051611940929190918252805460208301526001810154604083015260028101546060830152600381015460808301526004015460a082015260c00190565b60405180910390a15090925090505b935093915050565b600480546000919061196b90600190612a61565b8154811061197b5761197b612a35565b90600052602060002090600202016000015490504281101561199f5761199f612204565b6119a88261227d565b5050565b6002546001600160a01b031633146119c357600080fd5b6002546119fd906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691168361257d565b50565b60008160008081548110611a1657611a16612a35565b9060005260206000209060050201600001541115611a3657611a36612b38565b60008054611a4690600190612a61565b81548110611a5657611a56612a35565b906000526020600020906005020160000154821115611a7e57600054610db490600190612a61565b600080548190611a9090600190612a61565b905060005b6080811015611b2157818310611aaa57611b21565b60006002611ab88486612ab9565b611ac3906001612ab9565b611acd9190612a97565b90508560008281548110611ae357611ae3612a35565b90600052602060002090600502016000015411611b0257809350611b10565b611b0d600182612a61565b92505b50611b1a81612ae7565b9050611a95565b50909392505050565b600080611b356117d7565b831115611b4757506000905080611d37565b6000808481548110611b5b57611b5b612a35565b90600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090506000611bb385611d6c565b90506000611bc086611df3565b905080611bd7576000600194509450505050611d37565b604051638c2c9baf60e01b815260048101889052602481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690638c2c9baf90604401602060405180830381865afa158015611c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c6a9190612b02565b60008981526001602090815260408083208b8452909152902054855191925090811015611c98578451611c9a565b805b905084602001518110611cb95760006001965096505050505050611d37565b6020850151600096504290811115611cd657506020850151600196505b611d007f000000000000000000000000000000000000000000000000000000000000000085612a78565b83611d0b8484612a61565b8860400151611d1a9190612a78565b611d249190612a78565b611d2e9190612a97565b97505050505050505b9250929050565b60048181548110611d4e57600080fd5b60009182526020909120600290910201805460019091015490915082565b6000808281548110611d8057611d80612a35565b90600052602060002090600502016004015460011415611dc757610db460008381548110611db057611db0612a35565b906000526020600020906005020160000154611023565b60008281548110611dda57611dda612a35565b9060005260206000209060050201600401549050919050565b6000808281548110611e0757611e07612a35565b90600052602060002090600502016003015460011415611f3d576000611e2c83611d6c565b905043811115611ef0577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637116c60c60008581548110611e7857611e78612a35565b9060005260206000209060050201600001546040518263ffffffff1660e01b8152600401611ea891815260200190565b602060405180830381865afa158015611ec5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee99190612b02565b9392505050565b604051630981b24d60e41b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063981b24d090602401611ea8565b60008281548110611f5057611f50612a35565b9060005260206000209060050201600301549050919050565b6060838214611fad5760405162461bcd60e51b815260206004820152601060248201526f1b195b99dd1a081b9bdd08195c5d585b60821b6044820152606401611486565b8367ffffffffffffffff811115611fc657611fc6612ad1565b604051908082528060200260200182016040528015611fef578160200160208202803683370190505b50905060005b8481101561206c5761203d86868381811061201257612012612a35565b9050602002013585858481811061202b5761202b612a35565b90506020028101906102c69190612b4e565b82828151811061204f5761204f612a35565b60209081029190910101528061206481612ae7565b915050611ff5565b50949350505050565b600080806120838686612a61565b6120ad7f000000000000000000000000000000000000000000000000000000000000000086612a78565b6120b79190612a97565b600080546040805160a0810182528a8152602081018a81529181018581526001606083018181526080840182815291860187558680529251600586027f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56381019190915593517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56485015590517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56584015590517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e566830155517f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e567909101559192507f0000000000000000000000000000000000000000000000000000000000000000836121e18a8a612a61565b6121eb9190612a78565b6121f59190612a97565b91989197509095505050505050565b6040805180820190915242815243602082019081526004805460018101825560009190915291517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b600290930292830155517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c90910155565b6000818154811061229057612290612a35565b90600052602060002090600502016004015460011415612300576122d7600082815481106122c0576122c0612a35565b906000526020600020906005020160000154611187565b600082815481106122ea576122ea612a35565b9060005260206000209060050201600401819055505b6000818154811061231357612313612a35565b906000526020600020906005020160030154600114156119fd577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663981b24d06000838154811061236f5761236f612a35565b9060005260206000209060050201600401546040518263ffffffff1660e01b815260040161239f91815260200190565b602060405180830381865afa1580156123bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e09190612b02565b600082815481106123f3576123f3612a35565b90600052602060002090600502016003018190555050565b60008060008360000151851015612423578351612425565b845b9050836020015181106124405760006001925092505061194f565b60608401516124575760006001925092505061194f565b60208401514290600090821115612472575050602084015160015b6080860151604051638c2c9baf60e01b8152600481018a905260248101919091526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690638c2c9baf90604401602060405180830381865afa1580156124e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250b9190612b02565b905060007f0000000000000000000000000000000000000000000000000000000000000000886060015161253f9190612a78565b8261254a8787612a61565b8a604001516125599190612a78565b6125639190612a78565b61256d9190612a97565b9a92995091975050505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526125cf9084906125d4565b505050565b6125e6826001600160a01b0316612761565b6126325760405162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e7472616374006044820152606401611486565b600080836001600160a01b03168360405161264d9190612b98565b6000604051808303816000865af19150503d806000811461268a576040519150601f19603f3d011682016040523d82523d6000602084013e61268f565b606091505b5091509150816126e15760405162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646044820152606401611486565b80511561275b57808060200190518101906126fc9190612bd3565b61275b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611486565b50505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906127955750808214155b949350505050565b6000602082840312156127af57600080fd5b5035919050565b600080604083850312156127c957600080fd5b50508035926020909101359150565b6000806000606084860312156127ed57600080fd5b505081359360208301359350604090920135919050565b602080825282518282018190526000919060409081850190868401855b828110156128505781518051855286810151878601528501518585015260609093019290850190600101612821565b5091979650505050505050565b6000806000806080858703121561287357600080fd5b5050823594602084013594506040840135936060013592509050565b6000806000604084860312156128a457600080fd5b83359250602084013567ffffffffffffffff808211156128c357600080fd5b818601915086601f8301126128d757600080fd5b8135818111156128e657600080fd5b8760208260061b85010111156128fb57600080fd5b6020830194508093505050509250925092565b6001600160a01b03811681146119fd57600080fd5b60006020828403121561293557600080fd5b8135611ee98161290e565b60008083601f84011261295257600080fd5b50813567ffffffffffffffff81111561296a57600080fd5b6020830191508360208260051b8501011115611d3757600080fd5b6000806000806040858703121561299b57600080fd5b843567ffffffffffffffff808211156129b357600080fd5b6129bf88838901612940565b909650945060208701359150808211156129d857600080fd5b506129e587828801612940565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b81811015612a2957835183529284019291840191600101612a0d565b50909695505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015612a7357612a73612a4b565b500390565b6000816000190483118215151615612a9257612a92612a4b565b500290565b600082612ab457634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115612acc57612acc612a4b565b500190565b634e487b7160e01b600052604160045260246000fd5b6000600019821415612afb57612afb612a4b565b5060010190565b600060208284031215612b1457600080fd5b5051919050565b600060208284031215612b2d57600080fd5b8151611ee98161290e565b634e487b7160e01b600052600160045260246000fd5b6000808335601e19843603018112612b6557600080fd5b83018035915067ffffffffffffffff821115612b8057600080fd5b6020019150600681901b3603821315611d3757600080fd5b6000825160005b81811015612bb95760208186018101518583015201612b9f565b81811115612bc8576000828501525b509190910192915050565b600060208284031215612be557600080fd5b81518015158114611ee957600080fdfea2646970667358221220831dccb666322ecf2b9da4d235b41c73abb5affeb2961e188643b03e7d85ee0664736f6c634300080b0033000000000000000000000000bba4115ecb1f811061ecb5a8dc8fcdee2748ceba000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48

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

000000000000000000000000bba4115ecb1f811061ecb5a8dc8fcdee2748ceba000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48

-----Decoded View---------------
Arg [0] : _ve_ (address): 0xbbA4115ecB1F811061eCb5A8DC8FcdEE2748ceBa
Arg [1] : rewardToken_ (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000bba4115ecb1f811061ecb5a8dc8fcdee2748ceba
Arg [1] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48


Deployed ByteCode Sourcemap

2204:17098:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5663:190;;;:::i;:::-;;13616:390;;;;;;:::i;:::-;;:::i;:::-;;;;401:25:1;;;457:2;442:18;;435:34;;;;485:18;;;478:34;389:2;374:18;13616:390:0;;;;;;;;8417:292;;;;;;:::i;:::-;;:::i;3046:27::-;;;;;-1:-1:-1;;;;;3046:27:0;;;;;;-1:-1:-1;;;;;940:32:1;;;922:51;;910:2;895:18;3046:27:0;776:203:1;17308:1991:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;15692:396::-;;;;;;:::i;:::-;;:::i;:::-;;;2313:25:1;;;2301:2;2286:18;15692:396:0;2167:177:1;2824:28:0;;;;;;:::i;:::-;;:::i;:::-;;;;2608:25:1;;;2664:2;2649:18;;2642:34;;;;2692:18;;;2685:34;;;;2750:2;2735:18;;2728:34;2793:3;2778:19;;2771:35;2595:3;2580:19;2824:28:0;2349:463:1;6775:1042:0;;;;;;:::i;:::-;;:::i;10930:286::-;;;;;;:::i;:::-;;:::i;14321:610::-;;;;;;:::i;:::-;;:::i;4291:1085::-;;;;;;:::i;:::-;;:::i;11263:1252::-;;;;;;:::i;:::-;;:::i;5511:144::-;;;;;;:::i;:::-;;:::i;2899:63::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;2507:28;;;;;14014:162;;;:::i;5954:667::-;;;;;;:::i;:::-;;:::i;:::-;;;;4485:25:1;;;4541:2;4526:18;;4519:34;;;;4458:18;5954:667:0;4311:248:1;9683:255:0;;;;;;:::i;:::-;;:::i;5384:119::-;;;;;;:::i;:::-;;:::i;12558:769::-;;;;;;:::i;:::-;;:::i;16214:1048::-;;;;;;:::i;:::-;;:::i;:::-;;;;4732:25:1;;;4800:14;;4793:22;4788:2;4773:18;;4766:50;4705:18;16214:1048:0;4564:258:1;3845:28:0;;;;;;:::i;:::-;;:::i;14939:273::-;;;;;;:::i;:::-;;:::i;15220:419::-;;;;;;:::i;:::-;;:::i;10511:411::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2581:36::-;;;;;3019:20;;;;;-1:-1:-1;;;;;3019:20:0;;;5663:190;5728:12;;-1:-1:-1;;;;;5728:12:0;5714:10;:26;5706:35;;;;;;5760:12;;;5752:5;:20;;-1:-1:-1;;;;;5760:12:0;;-1:-1:-1;;;;;;5752:20:0;;;;;;;;5783:25;;;;;;5824:21;;922:51:1;;;5824:21:0;;910:2:1;895:18;5824:21:0;;;;;;;5663:190::o;13616:390::-;13673:4;13717:16;;13673:4;;;;13706:27;;13702:74;;-1:-1:-1;13758:1:0;;-1:-1:-1;13758:1:0;;-1:-1:-1;13758:1:0;13750:14;;13702:74;13786:22;13811:9;13821:7;13811:18;;;;;;;;:::i;:::-;;;;;;;;;13786:43;;;;;;;;13811:18;;;;;;;13786:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13919:16:0;;13786:43;;13860:31;;13786:43;13860:31;:::i;:::-;13859:57;;;;:::i;:::-;:76;;;;:::i;:::-;13954:15;;13971:13;;;;;13954:15;;-1:-1:-1;13971:13:0;;-1:-1:-1;13840:95:0;;-1:-1:-1;;13616:390:0;;;;;;:::o;8417:292::-;3136:5;;-1:-1:-1;;;;;3136:5:0;3122:10;:19;3114:28;;;;;;8532:9:::1;8542:7;8532:18;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;8514:15;:46;8506:55;;;::::0;::::1;;8672:9;8682:7;8672:18;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;8643:9;8653:7;8643:18;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;;:57;;;;:::i;:::-;8609:30;8623:16;8609:11:::0;:30:::1;:::i;:::-;:92;;;;:::i;:::-;8572:9;8582:7;8572:18;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;:129;;;;8417:292:::0;;:::o;17308:1991::-;17388:39;17440:12;17455:19;:17;:19::i;:::-;17440:34;;17502:3;17493:5;:12;;17485:21;;;;;;17527:7;17521:3;:13;17517:59;;;17557:7;17551:13;;17517:59;17586:27;17633:11;17639:5;17633:3;:11;:::i;:::-;:15;;17647:1;17633:15;:::i;:::-;17616:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;17616:33:0;;;;;;;;;;;;;;;-1:-1:-1;17586:63:0;-1:-1:-1;17674:5:0;17660:273;17686:3;17681:1;:8;17660:273;;17733:9;17743:1;17733:12;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;;17715:15;:40;17711:86;;;17776:5;;17711:86;17812:13;17830:34;17853:7;17862:1;17830:22;:34::i;:::-;17811:53;;;17898:23;;;;;;;;17909:1;17898:23;;;;17912:8;17898:23;;;17879:7;17889:5;17887:1;:7;;;;:::i;:::-;17879:16;;;;;;;;:::i;:::-;;;;;;:42;;;;17696:237;17691:3;;;;;:::i;:::-;;;;17660:273;;;;18011:41;18077:7;:14;18055:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;18055:37:0;;;;;;;;;;;;;;;;;18011:81;;18103:9;18127:15;18157:8;18185:6;18180:452;18201:7;:14;18197:1;:18;18180:452;;;18241:7;18249:1;18241:10;;;;;;;;:::i;:::-;;;;;;;:17;;;18262:1;18241:22;18237:345;;;18293:10;18288:1;:15;18284:219;;18354:70;;;;;;;;18369:7;18377:10;18369:19;;;;;;;;:::i;:::-;;;;;;;:27;;;18354:70;;;;18398:7;18408:1;18406;:3;;;;:::i;:::-;18398:12;;;;;;;;:::i;:::-;;;;;;;:20;;;18354:70;;;;18420:3;18354:70;;;18328:17;18346:4;18328:23;;;;;;;;:::i;:::-;;;;;;:96;;;;18447:6;;;;;:::i;:::-;;;;18482:1;18476:7;;18284:219;18534:5;:1;18538;18534:5;:::i;:::-;18521:18;;18558:8;;18237:345;18603:7;18611:1;18603:10;;;;;;;;:::i;:::-;;;;;;;:17;;;18596:24;;;;;:::i;:::-;;;18180:452;18217:3;;;;:::i;:::-;;;;18180:452;;;-1:-1:-1;18646:7:0;;18642:607;;18696:83;;;;;;;;18711:7;18719:10;18711:19;;;;;;;;:::i;:::-;;;;;;;:27;;;18696:83;;;;18740:7;18763:1;18748:7;:14;:16;;;;:::i;:::-;18740:25;;;;;;;;:::i;:::-;;;;;;;:33;;;18696:83;;;;18775:3;18696:83;;;18670:17;18688:4;18670:23;;;;;;;;:::i;:::-;;;;;;;;;;:109;18834:6;:4;18839:1;18834:6;:::i;:::-;18812:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;18812:29:0;;;;;;;;;;;;;;;;;18794:47;;18897:6;18892:110;18913:6;:4;18918:1;18913:6;:::i;:::-;18909:1;:10;18892:110;;;18966:17;18984:1;18966:20;;;;;;;;:::i;:::-;;;;;;;18945:15;18961:1;18945:18;;;;;;;;:::i;:::-;;;;;;:41;;;;18921:3;;;;;:::i;:::-;;;;18892:110;;;;18642:607;;;19074:4;19052:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;19052:27:0;;;;;;;;;;;;;;;;;19034:45;;19135:6;19130:108;19151:4;19147:1;:8;19130:108;;;19202:17;19220:1;19202:20;;;;;;;;:::i;:::-;;;;;;;19181:15;19197:1;19181:18;;;;;;;;:::i;:::-;;;;;;:41;;;;19157:3;;;;;:::i;:::-;;;;19130:108;;;;18642:607;19269:22;;;;;;17308:1991;;;;;:::o;15692:396::-;15763:4;15780:22;15805:9;15815:7;15805:18;;;;;;;;:::i;:::-;;;;;;;;;;;15780:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15834:8;15845:52;15881:5;:15;;;15845:35;:52::i;:::-;15834:63;;15918:12;15912:3;:18;15908:94;;;15954:36;;-1:-1:-1;;;15954:36:0;;;;;4485:25:1;;;4526:18;;;4519:34;;;15957:3:0;-1:-1:-1;;;;;15954:22:0;;;;4458:18:1;;15954:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15947:43;;;;;;15908:94;16022:3;-1:-1:-1;;;;;16019:22:0;;16042:7;16051:9;16061:7;16051:18;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;16019:61;;;;;;;;;;;;;;;4485:25:1;;;4541:2;4526:18;;4519:34;4473:2;4458:18;;4311:248;16019:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16012:68;;;;15692:396;;;;;:::o;2824:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2824:28:0;;;;;:::o;6775:1042::-;3136:5;;6894:4;;;;;;-1:-1:-1;;;;;3136:5:0;3122:10;:19;3114:28;;;;;;6949:23:::1;6961:11:::0;6949:9;:23:::1;:::i;:::-;6931:15;:41;6923:50;;;::::0;::::1;;7007:1;6988:16:::0;:20;6984:114:::1;;7033:9;7043:16:::0;;7076:9;;7033;7043:20:::1;::::0;7062:1:::1;::::0;7043:20:::1;:::i;:::-;7033:31;;;;;;;;:::i;:::-;;;;;;;;;;;:39;;;:52;;7025:61;;;::::0;::::1;;7108:12;7123:24;7137:10:::0;7123:11;:24:::1;:::i;:::-;7108:39:::0;-1:-1:-1;7158:13:0::1;::::0;7222:9;7158:13;7254:20:::1;7263:11:::0;7222:9;7254:20:::1;:::i;:::-;7242:32;;7290:6;7285:192;7306:10;7302:1;:14;7285:192;;;7363:32;7373:6;7381:4;7387:7;7363:9;:32::i;:::-;7338:57:::0;;-1:-1:-1;7338:57:0;-1:-1:-1;7419:4:0;;-1:-1:-1;7419:4:0;;7445:20:::1;7454:11:::0;7419:4;7445:20:::1;:::i;:::-;7438:27:::0;-1:-1:-1;7318:3:0;::::1;::::0;::::1;:::i;:::-;;;;7285:192;;;-1:-1:-1::0;7508:13:0::1;7522:20:::0;;7487:18:::1;::::0;7508:13;7522:24:::1;::::0;7545:1:::1;::::0;7522:24:::1;:::i;:::-;7508:39;;;;;;;;:::i;:::-;;;;;;;;;;;:42;;;7487:63;;7581:15;7565:13;:31;7561:79;;;7613:15;:13;:15::i;:::-;7655:74;7667:9:::0;7678:11;7691:10;;7703:12:::1;:8:::0;7714:1:::1;7703:12;:::i;:::-;:25;;;;:::i;:::-;7655:74;::::0;;8283:25:1;;;8339:2;8324:18;;8317:34;;;;8367:18;;;8360:34;8425:2;8410:18;;8403:34;8270:3;8255:19;7655:74:0::1;;;;;;;7763:10:::0;7748:12:::1;:8:::0;7759:1:::1;7748:12;:::i;:::-;:25;;;;:::i;:::-;7775:8:::0;7785:23:::1;7798:10:::0;7785;:23:::1;:::i;:::-;7740:69;;;;;;;;;;;;6775:1042:::0;;;;;;;;:::o;10930:286::-;11012:11;;11036:149;11053:20;;;11036:149;;;11105:68;11117:7;11126:9;;11136:1;11126:12;;;;;;;:::i;:::-;;;;;;:23;;;11151:9;;11161:1;11151:12;;;;;;;:::i;:::-;;;;;;:21;;;11105:11;:68::i;:::-;11095:78;;;;:::i;:::-;;-1:-1:-1;11075:3:0;;;;:::i;:::-;;;;11036:149;;;;10930:286;;;;;:::o;14321:610::-;14420:13;14434:20;;14399:4;;14466:5;;14434:24;;14457:1;;14434:24;:::i;:::-;14420:39;;;;;;;;:::i;:::-;;;;;;;;;;;:42;;;:51;14416:112;;14495:21;14510:5;14495:14;:21::i;14416:112::-;14560:13;14574:20;;14538:19;;14560:13;14574:24;;14597:1;;14574:24;:::i;:::-;14560:39;;;;;;;;:::i;:::-;;;;;;;;;;;14538:61;;;;;;;;;;;;;;;;;;;;;;;;;;;14623:6;:9;;;14614:5;:18;14610:68;;;14656:10;;;;14321:610;-1:-1:-1;;14321:610:0:o;14610:68::-;14798:9;;14688:16;;14780:27;;:15;:27;:::i;:::-;14764:10;;;;14749:25;;:12;:25;:::i;:::-;14730:45;;:15;:45;:::i;:::-;14729:79;;;;:::i;:::-;14715:93;;14819:11;14871:15;14857:6;:9;;;14849:5;:17;;;;:::i;:::-;14834:33;;:11;:33;:::i;:::-;14833:53;;;;:::i;:::-;14819:67;;14917:6;14904;:10;;;:19;;;;:::i;:::-;14897:26;14321:610;-1:-1:-1;;;;;14321:610:0:o;4291:1085::-;4427:13;:20;4348:4;;;;;;4427:24;;4450:1;;4427:24;:::i;:::-;4415:36;;4492:6;4487:374;4508:3;4504:1;:7;4487:374;;;4603:4;4595;:12;4591:58;;4628:5;;4591:58;4663:9;4695:1;4676:11;4683:4;4676;:11;:::i;:::-;:15;;4690:1;4676:15;:::i;:::-;4675:21;;;;:::i;:::-;4663:33;;4741:5;4715:13;4729:4;4715:19;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;;:31;4711:139;;4774:4;4767:11;;4711:139;;;4826:8;4833:1;4826:4;:8;:::i;:::-;4819:15;;4711:139;-1:-1:-1;4513:3:0;;;:::i;:::-;;;4487:374;;;;4873:19;4895:13;4909:4;4895:19;;;;;;;;:::i;:::-;;;;;;;;;;;4873:41;;;;;;;;;;;;;;;;;;;;;;;;;;;4925:19;4947:13;4961:4;4968:1;4961:8;;;;:::i;:::-;4947:23;;;;;;;;:::i;:::-;;;;;;;;;;;4925:45;;;;;;;;;;;;;;;;;;;;;;;;;;;4994:6;:9;;;4985:5;:18;4981:68;;;-1:-1:-1;5027:10:0;;;;4291:1085;-1:-1:-1;;;;4291:1085:0:o;4981:68::-;5243:9;;5231;;5128:16;;5231:21;;;:::i;:::-;5215:6;:10;;;5202:6;:10;;;:23;;;;:::i;:::-;5183:43;;:15;:43;:::i;:::-;5182:71;;;;:::i;:::-;5168:85;;5264:11;5316:15;5302:6;:9;;;5294:5;:17;;;;:::i;:::-;5279:33;;:11;:33;:::i;:::-;5278:53;;;;:::i;:::-;5264:67;;5362:6;5349;:10;;;:19;;;;:::i;:::-;5342:26;4291:1085;-1:-1:-1;;;;;;;;4291:1085:0:o;11263:1252::-;11392:24;;-1:-1:-1;;;11392:24:0;;;;;2313:25:1;;;11346:11:0;;11395:3;-1:-1:-1;;;;;11392:15:0;;;;2286:18:1;;11392:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;11378:38:0;:10;-1:-1:-1;;;;;11378:38:0;;11370:47;;;;;;11447:9;:16;11436:27;;11428:58;;;;-1:-1:-1;;;11428:58:0;;8906:2:1;11428:58:0;;;8888:21:1;8945:2;8925:18;;;8918:30;-1:-1:-1;;;8964:18:1;;;8957:48;9022:18;;11428:58:0;;;;;;;;;11497:22;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11497:22:0;11551:13;11565:20;;11530:18;;11551:13;11565:24;;11588:1;;11565:24;:::i;:::-;11551:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:42;;-1:-1:-1;11618:10:0;11604:756;11635:8;11630:1;:13;11604:756;;11673:9;11683:1;11673:12;;;;;;;;:::i;:::-;;;;;;;;;;;11665:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11722:5;:15;;;11704;:33;11700:79;;;11758:5;;11700:79;11813:15;;11797:31;;11793:186;;;11914:15;11898:31;;11948:15;:13;:15::i;:::-;11993:13;12004:1;11993:10;:13::i;:::-;12022;12084:26;;;:17;:26;;;;;;;;:29;;;;;;;;;12115:12;;12022:13;;12054:74;;12075:7;;12084:29;12022:13;;12111:1;;12115:12;;;;;;:::i;:::-;;;;;;;;;;;12054:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:20;:74::i;:::-;12021:107;;-1:-1:-1;12021:107:0;-1:-1:-1;12147:12:0;;12143:137;;12180:18;12190:8;12180:18;;:::i;:::-;12217:26;;;;:17;:26;;;;;;;;:29;;;;;;;;12249:15;12217:47;;12180:18;-1:-1:-1;12143:137:0;12299:8;12294:55;;12328:5;;;;12294:55;11650:710;;11645:3;;;;;:::i;:::-;;;;11604:756;;;-1:-1:-1;12403:24:0;;-1:-1:-1;;;12403:24:0;;;;;2313:25:1;;;12370:66:0;;12406:3;-1:-1:-1;;;;;12403:15:0;;;;2286:18:1;;12403:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;12377:11:0;12370:32;;12429:6;12370:32;:66::i;:::-;12452:31;;;4485:25:1;;;4541:2;4526:18;;4519:34;;;12452:31:0;;4458:18:1;12452:31:0;;;;;;;12494:13;;11263:1252;;;;;:::o;5511:144::-;3136:5;;-1:-1:-1;;;;;3136:5:0;3122:10;:19;3114:28;;;;;;5580:12:::1;:21:::0;;-1:-1:-1;;;;;;5580:21:0::1;-1:-1:-1::0;;;;;5580:21:0;::::1;::::0;;::::1;::::0;;;5617:30:::1;::::0;922:51:1;;;5617:30:0::1;::::0;910:2:1;895:18;5617:30:0::1;;;;;;;5511:144:::0;:::o;14014:162::-;14064:4;14081:19;14103:33;14120:15;14103:16;:33::i;5954:667::-;3136:5;;6047:4;;;;-1:-1:-1;;;;;3136:5:0;3122:10;:19;3114:28;;;;;;6095:7:::1;6077:15;:25;:48;;;;;6118:7;6106:9;:19;6077:48;6070:56;;;;:::i;:::-;6160:1;6141:16:::0;:20;6137:114:::1;;6186:9;6196:16:::0;;6229:9;;6186;6196:20:::1;::::0;6215:1:::1;::::0;6196:20:::1;:::i;:::-;6186:31;;;;;;;;:::i;:::-;;;;;;;;;;;:39;;;:52;;6178:61;;;::::0;::::1;;6262:12;6276:24:::0;6304:42:::1;6314:9;6325:7;6334:11;6304:9;:42::i;:::-;6261:85;;;;6357:18;6378:13;6415:1;6392:13;:20;;;;:24;;;;:::i;:::-;6378:39;;;;;;;;:::i;:::-;;;;;;;;;;;:42;;;6357:63;;6451:15;6435:13;:31;6431:79;;;6483:15;:13;:15::i;:::-;6525:40;6537:7;6546:9;6556:7;6546:18;;;;;;;;:::i;:::-;;;;;;;;;;;6525:40;;;;;;9407:25:1::0;;;9468:13;;9463:2;9448:18;;9441:41;9536:4;9524:17;;9518:24;9513:2;9498:18;;9491:52;9597:4;9585:17;;9579:24;9574:2;9559:18;;9552:52;9659:4;9647:17;;9641:24;9635:3;9620:19;;9613:53;9721:4;9709:17;9703:24;9697:3;9682:19;;9675:53;9394:3;9379:19;;9183:551;6525:40:0::1;;;;;;;;-1:-1:-1::0;6584:7:0;;-1:-1:-1;6593:19:0;-1:-1:-1;3153:1:0::1;5954:667:::0;;;;;;:::o;9683:255::-;9769:13;9783:20;;9748:18;;9769:13;9783:24;;9806:1;;9783:24;:::i;:::-;9769:39;;;;;;;;:::i;:::-;;;;;;;;;;;:42;;;9748:63;;9842:15;9826:13;:31;9822:79;;;9874:15;:13;:15::i;:::-;9911:19;9922:7;9911:10;:19::i;:::-;9737:201;9683:255;:::o;5384:119::-;3136:5;;-1:-1:-1;;;;;3136:5:0;3122:10;:19;3114:28;;;;;;5481:5:::1;::::0;5448:47:::1;::::0;-1:-1:-1;;;;;5455:11:0::1;5448:32:::0;::::1;::::0;5481:5:::1;5488:6:::0;5448:32:::1;:47::i;:::-;5384:119:::0;:::o;12558:769::-;12617:4;12667:5;12641:9;12651:1;12641:12;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;;:31;;12634:39;;;;:::i;:::-;12696:9;12706:16;;:20;;12725:1;;12706:20;:::i;:::-;12696:31;;;;;;;;:::i;:::-;;;;;;;;;;;:41;;;12688:5;:49;12684:109;;;12761:9;:16;:20;;12780:1;;12761:20;:::i;12684:109::-;12829:9;12865:16;;12829:9;;12865:20;;12884:1;;12865:20;:::i;:::-;12853:32;;12926:6;12921:377;12942:3;12938:1;:7;12921:377;;;13037:4;13029;:12;13025:58;;13062:5;;13025:58;13097:9;13129:1;13110:11;13117:4;13110;:11;:::i;:::-;:15;;13124:1;13110:15;:::i;:::-;13109:21;;;;:::i;:::-;13097:33;;13178:5;13149:9;13159:4;13149:15;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;:34;13145:142;;13211:4;13204:11;;13145:142;;;13263:8;13270:1;13263:4;:8;:::i;:::-;13256:15;;13145:142;-1:-1:-1;12947:3:0;;;:::i;:::-;;;12921:377;;;-1:-1:-1;13315:4:0;;12558:769;-1:-1:-1;;;12558:769:0:o;16214:1048::-;16295:11;16308:13;16348:19;:17;:19::i;:::-;16338:7;:29;16334:79;;;-1:-1:-1;16392:1:0;;-1:-1:-1;16392:1:0;16384:17;;16334:79;16423:22;16448:9;16458:7;16448:18;;;;;;;;:::i;:::-;;;;;;;;;;;16423:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16477:15;16495:27;16514:7;16495:18;:27::i;:::-;16477:45;;16533:15;16551:27;16570:7;16551:18;:27::i;:::-;16533:45;-1:-1:-1;16593:15:0;16589:64;;16633:1;16636:4;16625:16;;;;;;;;;16589:64;16676:43;;-1:-1:-1;;;16676:43:0;;;;;4485:25:1;;;4526:18;;;4519:34;;;16663:10:0;;16679:3;-1:-1:-1;;;;;16676:22:0;;;;4458:18:1;;16676:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16732:9;16744:26;;;:17;:26;;;;;;;;:35;;;;;;;;;16805:15;;16663:56;;-1:-1:-1;16744:35:0;16797:23;;;:48;;16830:15;;16797:48;;;16823:4;16797:48;16790:55;;16868:5;:13;;;16860:4;:21;16856:70;;16906:1;16909:4;16898:16;;;;;;;;;;;16856:70;17020:13;;;;16946:8;;-1:-1:-1;16957:15:0;;17014:19;;17010:101;;;-1:-1:-1;17056:13:0;;;;17095:4;;-1:-1:-1;17010:101:0;17188:29;17201:16;17188:10;:29;:::i;:::-;17179:5;17165:10;17171:4;17165:3;:10;:::i;:::-;17140:5;:21;;;:36;;;;:::i;:::-;:44;;;;:::i;:::-;:78;;;;:::i;:::-;17131:87;;17229:25;;;;;;16214:1048;;;;;;:::o;3845:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3845:28:0;:::o;14939:273::-;15002:4;15023:9;15033:7;15023:18;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;;15056:1;15023:34;15019:139;;;15081:65;15117:9;15127:7;15117:18;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;15081:35;:65::i;15019:139::-;15175:9;15185:7;15175:18;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;;15168:36;;14939:273;;;:::o;15220:419::-;15283:4;15304:9;15314:7;15304:18;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;;15337:1;15304:34;15300:285;;;15355:8;15366:27;15385:7;15366:18;:27::i;:::-;15355:38;;15418:12;15412:3;:18;15408:118;;;15461:3;-1:-1:-1;;;;;15458:22:0;;15481:9;15491:7;15481:18;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;15458:52;;;;;;;;;;;;;2313:25:1;;2301:2;2286:18;;2167:177;15458:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15451:59;15220:419;-1:-1:-1;;;15220:419:0:o;15408:118::-;15547:26;;-1:-1:-1;;;15547:26:0;;;;;2313:25:1;;;15550:3:0;-1:-1:-1;;;;;15547:21:0;;;;2286:18:1;;15547:26:0;2167:177:1;15300:285:0;15602:9;15612:7;15602:18;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;;15595:36;;15220:419;;;:::o;10511:411::-;10611:21;10653:35;;;10645:64;;;;-1:-1:-1;;;10645:64:0;;9941:2:1;10645:64:0;;;9923:21:1;9980:2;9960:18;;;9953:30;-1:-1:-1;;;9999:18:1;;;9992:46;10055:18;;10645:64:0;9739:340:1;10645:64:0;10742:8;10730:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10730:28:0;;10720:38;;10774:6;10769:121;10786:19;;;10769:121;;;10840:38;10852:8;;10861:1;10852:11;;;;;;;:::i;:::-;;;;;;;10865:9;;10875:1;10865:12;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;10840:38::-;10827:7;10835:1;10827:10;;;;;;;;:::i;:::-;;;;;;;;;;:51;10807:3;;;;:::i;:::-;;;;10769:121;;;;10511:411;;;;;;:::o;7918:457::-;8002:4;;;8082:19;8092:9;8082:7;:19;:::i;:::-;8048:30;8062:16;8048:11;:30;:::i;:::-;:54;;;;:::i;:::-;8113:12;8128:16;;8170:52;;;;;;;;;;;;;;;;;;;;;;;8217:1;8170:52;;;;;;;;;;;;8155:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8025:77;;-1:-1:-1;8303:16:0;8025:77;8262:19;8180:9;8191:7;8262:19;:::i;:::-;8261:39;;;;:::i;:::-;:58;;;;:::i;:::-;8338:7;;;;-1:-1:-1;7918:457:0;;-1:-1:-1;;;;;;7918:457:0:o;4079:109::-;4143:36;;;;;;;;;4149:15;4143:36;;4166:12;4143:36;;;;;;4124:13;:56;;;;;;;-1:-1:-1;4124:56:0;;;;;;;;;;;;;;;;;;;;;4079:109::o;9946:365::-;10004:9;10014:7;10004:18;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;;10037:1;10004:34;10000:143;;;10087:44;10102:9;10112:7;10102:18;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;10087:14;:44::i;:::-;10055:9;10065:7;10055:18;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;:76;;;;10000:143;10157:9;10167:7;10157:18;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;;10190:1;10157:34;10153:151;;;10243:3;-1:-1:-1;;;;;10240:21:0;;10262:9;10272:7;10262:18;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;;10240:52;;;;;;;;;;;;;2313:25:1;;2301:2;2286:18;;2167:177;10240:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10208:9;10218:7;10208:18;;;;;;;;:::i;:::-;;;;;;;;;;;:29;;:84;;;;9946:365;:::o;8875:800::-;8986:4;8992;9009:9;9038:5;:15;;;9021:13;:32;;:66;;9072:15;;9021:66;;;9056:13;9021:66;9009:78;;9110:5;:13;;;9102:4;:21;9098:70;;9148:1;9151:4;9140:16;;;;;;;9098:70;9182:16;;;;9178:70;;9228:1;9231:4;9220:16;;;;;;;9178:70;9347:13;;;;9279:15;;9268:8;;9341:19;;9337:101;;;-1:-1:-1;;9383:13:0;;;;9422:4;9337:101;9495:16;;;;9463:49;;-1:-1:-1;;;9463:49:0;;;;;4485:25:1;;;4526:18;;;4519:34;;;;9450:10:0;;9466:3;-1:-1:-1;;;;;9463:22:0;;;;4458:18:1;;9463:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9450:62;;9533:11;9614:16;9595:5;:16;;;:35;;;;:::i;:::-;9586:5;9572:10;9578:4;9572:3;:10;:::i;:::-;9547:5;:21;;;:36;;;;:::i;:::-;:44;;;;:::i;:::-;:84;;;;:::i;:::-;9533:98;9658:8;;-1:-1:-1;8875:800:0;;-1:-1:-1;;;;;;;;8875:800:0:o;734:173::-;840:58;;;-1:-1:-1;;;;;10854:32:1;;840:58:0;;;10836:51:1;10903:18;;;;10896:34;;;840:58:0;;;;;;;;;;10809:18:1;;;;840:58:0;;;;;;;;-1:-1:-1;;;;;840:58:0;-1:-1:-1;;;840:58:0;;;814:85;;833:5;;814:18;:85::i;:::-;734:173;;;:::o;1124:598::-;1212:27;1220:5;-1:-1:-1;;;;;1212:25:0;;:27::i;:::-;1204:71;;;;-1:-1:-1;;;1204:71:0;;11143:2:1;1204:71:0;;;11125:21:1;11182:2;11162:18;;;11155:30;11221:33;11201:18;;;11194:61;11272:18;;1204:71:0;10941:355:1;1204:71:0;1349:12;1363:23;1398:5;-1:-1:-1;;;;;1390:19:0;1410:4;1390:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1348:67;;;;1434:7;1426:52;;;;-1:-1:-1;;;1426:52:0;;11934:2:1;1426:52:0;;;11916:21:1;;;11953:18;;;11946:30;12012:34;11992:18;;;11985:62;12064:18;;1426:52:0;11732:356:1;1426:52:0;1495:17;;:21;1491:224;;1637:10;1626:30;;;;;;;;;;;;:::i;:::-;1618:85;;;;-1:-1:-1;;;1618:85:0;;12577:2:1;1618:85:0;;;12559:21:1;12616:2;12596:18;;;12589:30;12655:34;12635:18;;;12628:62;-1:-1:-1;;;12706:18:1;;;12699:40;12756:19;;1618:85:0;12375:406:1;1618:85:0;1193:529;;1124:598;;:::o;294:374::-;354:4;577:20;;420:66;617:15;;;;;:42;;;648:11;636:8;:23;;617:42;609:51;294:374;-1:-1:-1;;;;294:374:0:o;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;523:248::-;591:6;599;652:2;640:9;631:7;627:23;623:32;620:52;;;668:1;665;658:12;620:52;-1:-1:-1;;691:23:1;;;761:2;746:18;;;733:32;;-1:-1:-1;523:248:1:o;984:316::-;1061:6;1069;1077;1130:2;1118:9;1109:7;1105:23;1101:32;1098:52;;;1146:1;1143;1136:12;1098:52;-1:-1:-1;;1169:23:1;;;1239:2;1224:18;;1211:32;;-1:-1:-1;1290:2:1;1275:18;;;1262:32;;984:316;-1:-1:-1;984:316:1:o;1305:857::-;1540:2;1592:21;;;1662:13;;1565:18;;;1684:22;;;1511:4;;1540:2;1725;;1743:18;;;;1784:15;;;1511:4;1827:309;1841:6;1838:1;1835:13;1827:309;;;1900:13;;1938:9;;1926:22;;1988:11;;;1982:18;1968:12;;;1961:40;2041:11;;2035:18;2021:12;;;2014:40;2083:4;2074:14;;;;2111:15;;;;1863:1;1856:9;1827:309;;;-1:-1:-1;2153:3:1;;1305:857;-1:-1:-1;;;;;;;1305:857:1:o;2817:385::-;2903:6;2911;2919;2927;2980:3;2968:9;2959:7;2955:23;2951:33;2948:53;;;2997:1;2994;2987:12;2948:53;-1:-1:-1;;3020:23:1;;;3090:2;3075:18;;3062:32;;-1:-1:-1;3141:2:1;3126:18;;3113:32;;3192:2;3177:18;3164:32;;-1:-1:-1;2817:385:1;-1:-1:-1;2817:385:1:o;3207:711::-;3330:6;3338;3346;3399:2;3387:9;3378:7;3374:23;3370:32;3367:52;;;3415:1;3412;3405:12;3367:52;3451:9;3438:23;3428:33;;3512:2;3501:9;3497:18;3484:32;3535:18;3576:2;3568:6;3565:14;3562:34;;;3592:1;3589;3582:12;3562:34;3630:6;3619:9;3615:22;3605:32;;3675:7;3668:4;3664:2;3660:13;3656:27;3646:55;;3697:1;3694;3687:12;3646:55;3737:2;3724:16;3763:2;3755:6;3752:14;3749:34;;;3779:1;3776;3769:12;3749:34;3832:7;3827:2;3817:6;3814:1;3810:14;3806:2;3802:23;3798:32;3795:45;3792:65;;;3853:1;3850;3843:12;3792:65;3884:2;3880;3876:11;3866:21;;3906:6;3896:16;;;;;3207:711;;;;;:::o;3923:131::-;-1:-1:-1;;;;;3998:31:1;;3988:42;;3978:70;;4044:1;4041;4034:12;4059:247;4118:6;4171:2;4159:9;4150:7;4146:23;4142:32;4139:52;;;4187:1;4184;4177:12;4139:52;4226:9;4213:23;4245:31;4270:5;4245:31;:::i;4827:367::-;4890:8;4900:6;4954:3;4947:4;4939:6;4935:17;4931:27;4921:55;;4972:1;4969;4962:12;4921:55;-1:-1:-1;4995:20:1;;5038:18;5027:30;;5024:50;;;5070:1;5067;5060:12;5024:50;5107:4;5099:6;5095:17;5083:29;;5167:3;5160:4;5150:6;5147:1;5143:14;5135:6;5131:27;5127:38;5124:47;5121:67;;;5184:1;5181;5174:12;5199:828;5376:6;5384;5392;5400;5453:2;5441:9;5432:7;5428:23;5424:32;5421:52;;;5469:1;5466;5459:12;5421:52;5509:9;5496:23;5538:18;5579:2;5571:6;5568:14;5565:34;;;5595:1;5592;5585:12;5565:34;5634:70;5696:7;5687:6;5676:9;5672:22;5634:70;:::i;:::-;5723:8;;-1:-1:-1;5608:96:1;-1:-1:-1;5811:2:1;5796:18;;5783:32;;-1:-1:-1;5827:16:1;;;5824:36;;;5856:1;5853;5846:12;5824:36;;5895:72;5959:7;5948:8;5937:9;5933:24;5895:72;:::i;:::-;5199:828;;;;-1:-1:-1;5986:8:1;-1:-1:-1;;;;5199:828:1:o;6032:632::-;6203:2;6255:21;;;6325:13;;6228:18;;;6347:22;;;6174:4;;6203:2;6426:15;;;;6400:2;6385:18;;;6174:4;6469:169;6483:6;6480:1;6477:13;6469:169;;;6544:13;;6532:26;;6613:15;;;;6578:12;;;;6505:1;6498:9;6469:169;;;-1:-1:-1;6655:3:1;;6032:632;-1:-1:-1;;;;;;6032:632:1:o;6669:127::-;6730:10;6725:3;6721:20;6718:1;6711:31;6761:4;6758:1;6751:15;6785:4;6782:1;6775:15;6801:127;6862:10;6857:3;6853:20;6850:1;6843:31;6893:4;6890:1;6883:15;6917:4;6914:1;6907:15;6933:125;6973:4;7001:1;6998;6995:8;6992:34;;;7006:18;;:::i;:::-;-1:-1:-1;7043:9:1;;6933:125::o;7063:168::-;7103:7;7169:1;7165;7161:6;7157:14;7154:1;7151:21;7146:1;7139:9;7132:17;7128:45;7125:71;;;7176:18;;:::i;:::-;-1:-1:-1;7216:9:1;;7063:168::o;7236:217::-;7276:1;7302;7292:132;;7346:10;7341:3;7337:20;7334:1;7327:31;7381:4;7378:1;7371:15;7409:4;7406:1;7399:15;7292:132;-1:-1:-1;7438:9:1;;7236:217::o;7458:128::-;7498:3;7529:1;7525:6;7522:1;7519:13;7516:39;;;7535:18;;:::i;:::-;-1:-1:-1;7571:9:1;;7458:128::o;7591:127::-;7652:10;7647:3;7643:20;7640:1;7633:31;7683:4;7680:1;7673:15;7707:4;7704:1;7697:15;7723:135;7762:3;-1:-1:-1;;7783:17:1;;7780:43;;;7803:18;;:::i;:::-;-1:-1:-1;7850:1:1;7839:13;;7723:135::o;7863:184::-;7933:6;7986:2;7974:9;7965:7;7961:23;7957:32;7954:52;;;8002:1;7999;7992:12;7954:52;-1:-1:-1;8025:16:1;;7863:184;-1:-1:-1;7863:184:1:o;8448:251::-;8518:6;8571:2;8559:9;8550:7;8546:23;8542:32;8539:52;;;8587:1;8584;8577:12;8539:52;8619:9;8613:16;8638:31;8663:5;8638:31;:::i;9051:127::-;9112:10;9107:3;9103:20;9100:1;9093:31;9143:4;9140:1;9133:15;9167:4;9164:1;9157:15;10084:573;10205:4;10211:6;10271:11;10258:25;10365:2;10361:7;10350:8;10334:14;10330:29;10326:43;10306:18;10302:68;10292:96;;10384:1;10381;10374:12;10292:96;10411:33;;10463:20;;;-1:-1:-1;10506:18:1;10495:30;;10492:50;;;10538:1;10535;10528:12;10492:50;10571:4;10559:17;;-1:-1:-1;10622:1:1;10618:14;;;10602;10598:35;10588:46;;10585:66;;;10647:1;10644;10637:12;11301:426;11430:3;11468:6;11462:13;11493:1;11503:129;11517:6;11514:1;11511:13;11503:129;;;11615:4;11599:14;;;11595:25;;11589:32;11576:11;;;11569:53;11532:12;11503:129;;;11650:6;11647:1;11644:13;11641:48;;;11685:1;11676:6;11671:3;11667:16;11660:27;11641:48;-1:-1:-1;11705:16:1;;;;;11301:426;-1:-1:-1;;11301:426:1:o;12093:277::-;12160:6;12213:2;12201:9;12192:7;12188:23;12184:32;12181:52;;;12229:1;12226;12219:12;12181:52;12261:9;12255:16;12314:5;12307:13;12300:21;12293:5;12290:32;12280:60;;12336:1;12333;12326:12

Swarm Source

ipfs://831dccb666322ecf2b9da4d235b41c73abb5affeb2961e188643b03e7d85ee06
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading

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.