Contract 0x44529A37a43Bab8aF2336698e31F2e4585ad7db6 1

 
 
Txn Hash
Method
Block
From
To
Value
0x27fee5d2708c11cf726cc1fbb548c430d9b047f7b1c36fccaf944d179398620bClaim Reward160808262022-11-30 5:50:2355 mins ago0x46bfa99b7d855f7cebb352023936d207d84c8e03 IN  Multichain: veMULTI Reward0 Ether0.001822811.55
0xe4598622c7fd0d2f5251a0d5c99ab0d22d534be2f7061db10a00760cafcef9b2Claim Reward160807062022-11-30 5:26:231 hr 19 mins ago0xf6aa90d1cf9cd2b405b8b775e3fb2029e310d675 IN  Multichain: veMULTI Reward0 Ether0.0014678610.62795433
0x16c7e72a85a73f80826876025d5bb066268e415473adc4481996b8e02e3e75acClaim Reward160807062022-11-30 5:26:231 hr 19 mins ago0xf6aa90d1cf9cd2b405b8b775e3fb2029e310d675 IN  Multichain: veMULTI Reward0 Ether0.0016771610.62795433
0x380e89a45dbd66e9c1f9b4d0c07ecaaebcafc3e960d66af75593e49f9edefb85Claim Reward160804732022-11-30 4:39:232 hrs 6 mins ago0x3d68b3dbfa1ad2b44503dde31276876fd5875eb0 IN  Multichain: veMULTI Reward0 Ether0.02254528 11.94762822
0x66d2ef7dcaacf0543317497e7be48cf067c713c5d5ac4dfdf8d810ae127c5776Claim Reward160804672022-11-30 4:38:112 hrs 7 mins ago0xd00063147b08143b19736c2d1943009df2b34993 IN  Multichain: veMULTI Reward0 Ether0.01749935 11.28932133
0xa694f98cd2122ac676d1df93a7c5be72e9a675b7079822edec45a6a95f1820d8Claim Reward160768712022-11-29 16:34:4714 hrs 10 mins ago0x75f874c9af67a2b7448f0c8cdb798c5ba87007c1 IN  Multichain: veMULTI Reward0 Ether0.0019206513.65
0x76084ac6c1ecf984ecfd3938c687ea309c0000427c7f5c77402ed533f315b7d8Claim Reward160768702022-11-29 16:34:3514 hrs 11 mins ago0x75f874c9af67a2b7448f0c8cdb798c5ba87007c1 IN  Multichain: veMULTI Reward0 Ether0.0021540613.65
0x79f1b6f6c55d7711b82335dcc5e19c4e5df908839517ab5f9e320a07b1a9fda4Claim Reward160763482022-11-29 14:48:4715 hrs 56 mins ago0x14b1b3ff91525dd00e8fb8ce000097ce7d1cb251 IN  Multichain: veMULTI Reward0 Ether0.00394317 10.82100452
0x937a157f8b12e7ee134b8bb0f876cf339e33dbcbecfcbf7392f41f392a5c0a98Claim Reward160754462022-11-29 11:47:2318 hrs 58 mins ago0x1d0ae8df3c50065122c5af2197b0c4562102c17d IN  Multichain: veMULTI Reward0 Ether0.00701288 11.49428694
0x5d16e5bd32c0cec76bf6e2dd79a1e6cae9203f6a59f74de8a49cbc1d396bdb17Claim Reward160753952022-11-29 11:37:1119 hrs 8 mins ago0x833393218cdd114a5883b66d6dd51562a89c4d54 IN  Multichain: veMULTI Reward0 Ether0.00219999 9.39541183
0xdcd683608555b119e35282dcd3762df40bd215ce09d7638a352335fa82249efdClaim Reward160683642022-11-28 12:03:591 day 18 hrs ago0x20eadfcaf91bd98674ff8fc341d148e1731576a4 IN  Multichain: veMULTI Reward0 Ether0.00248105 10.78811938
0xd128465f29c578f0da3f73e1ff30dfd721d7dd7b7eae57c333c344bee24d1b4fClaim Reward160679022022-11-28 10:31:231 day 20 hrs ago0x6af390c4588f4b221c70c498e46f270b36b76986 IN  Multichain: veMULTI Reward0 Ether0.00231285 15.57098288
0x7aec1ea393fe46d41575640338052062491f79b4eccff0814c0bf2ca77bef49dClaim Reward160668072022-11-28 6:51:231 day 23 hrs ago0x392cdda9dbc12d8366b188ef10849ef01d15d989 IN  Multichain: veMULTI Reward0 Ether0.00238245 10.50658745
0xd32aa806c758830254e61acd7ed8322c11d52bd7f6117a791d1802dfb2a707c2Claim Reward160657722022-11-28 3:24:232 days 3 hrs ago0x2178367ea01a093caf1cd6ab7608a82b9521ab41 IN  Multichain: veMULTI Reward0 Ether0.01189258 11.03072202
0x6ac88ebfb9fa5e350dc3e0dea6ac44562e0645a08469aba4adb9143cc029db9eClaim Reward160622142022-11-27 15:27:232 days 15 hrs ago0xd7af4f3b97c30b77ee7ac96fae654dbf8db32207 IN  Multichain: veMULTI Reward0 Ether0.00233885 10.74272328
0x0cedfaf88174e28c8deebe9c8c4bb3a1adbe4e1dfc0f42db181a35bc1077cfd0Claim Reward160621602022-11-27 15:16:352 days 15 hrs agoENS Name chosen1.eth IN  Multichain: veMULTI Reward0 Ether0.00556843 10.49913451
0x88f32c2b76a9b49a82e68abf9cdf50728ae43a315e9651af3c2a99c8e092052cClaim Reward160619422022-11-27 14:32:352 days 16 hrs ago0xe64e39a3c393d45fc930f2476afe0e6458fdba27 IN  Multichain: veMULTI Reward0 Ether0.00277129 10.16048256
0xf650f2e8ea2ff013ba60cbc564a0ea6bb5d99c483d4f3a80133bd2566ae208b0Claim Reward160617452022-11-27 13:52:592 days 16 hrs ago0x48aa48ad9c57844f833c6a85eaaf69b6a599db3d IN  Multichain: veMULTI Reward0 Ether0.00742642 8.94401447
0x226472a8a19a2e435962c09bec3bcbf73246b780e5f30acc4de55600329975e1Claim Reward160567552022-11-26 21:10:353 days 9 hrs ago0x75f874c9af67a2b7448f0c8cdb798c5ba87007c1 IN  Multichain: veMULTI Reward0 Ether0.0024196711.55
0x2ba1a4c2bbe8f364576febffa6057537e60edaddf7f8aa4c195b6620840304bbClaim Reward160567532022-11-26 21:10:113 days 9 hrs ago0x75f874c9af67a2b7448f0c8cdb798c5ba87007c1 IN  Multichain: veMULTI Reward0 Ether0.0026171811.55
0x3f3ded4de99259e8aa97bc1c9ef2b651331da6d270a1af68197e80dd3de5864cClaim Reward160551292022-11-26 15:43:233 days 15 hrs ago0x46bfa99b7d855f7cebb352023936d207d84c8e03 IN  Multichain: veMULTI Reward0 Ether0.0028236212.6
0x407bf32b532926ab06efd8d9670ed39e6a67c34fdf52d8d5066be91c24f22789Claim Reward160546202022-11-26 14:00:353 days 16 hrs ago0x8a71d2b7d3ca2aa535dcf689c66ac68fa36d5b5a IN  Multichain: veMULTI Reward0 Ether0.00337402 11.32667777
0xdba9f7a43ed3faf7c0d6d4f8ae8ad514411b060799912e8e522ae9e2842502deClaim Reward160545992022-11-26 13:56:233 days 16 hrs ago0x26af5a2ec0a45965d4a8effd3e096c6258e68b52 IN  Multichain: veMULTI Reward0 Ether0.00345695 11.91995344
0xe879f0e1370b8d06ce27bf0e82e764cc4ce9c3be0295098394c87d5d63643983Claim Reward160530502022-11-26 8:44:593 days 22 hrs ago0xf6aa90d1cf9cd2b405b8b775e3fb2029e310d675 IN  Multichain: veMULTI Reward0 Ether0.001892839.2833886
0x9fd79aa8e5a1a7a5722f911eef58a06331fee9198b060c6665d0db132da6710dClaim Reward160530502022-11-26 8:44:593 days 22 hrs ago0xf6aa90d1cf9cd2b405b8b775e3fb2029e310d675 IN  Multichain: veMULTI Reward0 Ether0.002057589.93553772
[ 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
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

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.