ETH Price: $3,391.57 (+1.70%)

Contract

0x0b1fA4b11Edbcb6d35731549211D83C857fFBC0a
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Get Reward176919512023-07-14 13:18:47533 days ago1689340727IN
0x0b1fA4b1...857fFBC0a
0 ETH0.0029693829.50999597
Get Reward172073402023-05-07 7:59:59601 days ago1683446399IN
0x0b1fA4b1...857fFBC0a
0 ETH0.0042652476.07542239
Get Reward172072682023-05-07 7:45:11601 days ago1683445511IN
0x0b1fA4b1...857fFBC0a
0 ETH0.004761584.92672457
Get Reward172072662023-05-07 7:44:47601 days ago1683445487IN
0x0b1fA4b1...857fFBC0a
0 ETH0.0093510685.72191014
Get Reward167520362023-03-04 2:11:47665 days ago1677895907IN
0x0b1fA4b1...857fFBC0a
0 ETH0.0010311118.39108768
Get Reward167520302023-03-04 2:10:35665 days ago1677895835IN
0x0b1fA4b1...857fFBC0a
0 ETH0.0010981419.58667784
Get Reward167520262023-03-04 2:09:47665 days ago1677895787IN
0x0b1fA4b1...857fFBC0a
0 ETH0.0012772622.78153167
Get Reward167063632023-02-25 16:04:47672 days ago1677341087IN
0x0b1fA4b1...857fFBC0a
0 ETH0.0026855525.63387045
Get Reward166681562023-02-20 7:04:11677 days ago1676876651IN
0x0b1fA4b1...857fFBC0a
0 ETH0.0011213220
Get Reward166581762023-02-18 21:26:23678 days ago1676755583IN
0x0b1fA4b1...857fFBC0a
0 ETH0.0013696818.51456692
Get Reward164046242023-01-14 11:04:11714 days ago1673694251IN
0x0b1fA4b1...857fFBC0a
0 ETH0.0025812918.36909609
Withdraw Bonded ...163769672023-01-10 14:20:47718 days ago1673360447IN
0x0b1fA4b1...857fFBC0a
0 ETH0.0024253721.39022646
Get Reward161739362022-12-13 6:16:59746 days ago1670912219IN
0x0b1fA4b1...857fFBC0a
0 ETH0.0008311812.43574077
Stake161682742022-12-12 11:17:23747 days ago1670843843IN
0x0b1fA4b1...857fFBC0a
0 ETH0.0011628812.550655
Stake161682512022-12-12 11:12:47747 days ago1670843567IN
0x0b1fA4b1...857fFBC0a
0 ETH0.0016523212.75739824
Get Reward161272582022-12-06 17:30:59753 days ago1670347859IN
0x0b1fA4b1...857fFBC0a
0 ETH0.0008243514.70333844
Get Reward161019092022-12-03 4:30:11756 days ago1670041811IN
0x0b1fA4b1...857fFBC0a
0 ETH0.0007419811.10129407
Get Reward161018942022-12-03 4:27:11756 days ago1670041631IN
0x0b1fA4b1...857fFBC0a
0 ETH0.0009562410.9078211
Withdraw Unbonde...161018842022-12-03 4:25:11756 days ago1670041511IN
0x0b1fA4b1...857fFBC0a
0 ETH0.0009095411.1178847
Withdraw Bonded ...161018772022-12-03 4:23:47756 days ago1670041427IN
0x0b1fA4b1...857fFBC0a
0 ETH0.0009454711.21975311
Get Reward161018712022-12-03 4:22:35756 days ago1670041355IN
0x0b1fA4b1...857fFBC0a
0 ETH0.0011836211.05299587
Withdraw Unbonde...160524772022-11-26 6:49:47763 days ago1669445387IN
0x0b1fA4b1...857fFBC0a
0 ETH0.000823589.50922008
Withdraw Unbonde...159939072022-11-18 2:27:11771 days ago1668738431IN
0x0b1fA4b1...857fFBC0a
0 ETH0.0009587711.71964897
Withdraw Bonded ...159939032022-11-18 2:26:23771 days ago1668738383IN
0x0b1fA4b1...857fFBC0a
0 ETH0.0011879211.71881767
Get Reward159791642022-11-16 0:59:23773 days ago1668560363IN
0x0b1fA4b1...857fFBC0a
0 ETH0.0008184414.59783034
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
VotingStakingRewards

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
byzantium EvmVersion
File 1 of 11 : VotingStakingRewards.sol
pragma solidity ^0.4.24;

import "@aragon/os/contracts/lib/math/SafeMath.sol";
import "@aragon/os/contracts/lib/math/SafeMath64.sol";
import "@aragon/os/contracts/lib/math/Math.sol";

import "./interfaces/IVeXBE.sol";
import "./interfaces/IERC20.sol";
import "./interfaces/IBoostLogicProvider.sol";

import "./utils/VotingPausable.sol";
import "./utils/VotingNonReentrant.sol";
import "./utils/VotingOwnable.sol";
import "./utils/VotingInitializable.sol";

contract VotingStakingRewards is
    VotingPausable,
    VotingNonReentrant,
    VotingOwnable,
    VotingInitializable
{
    using SafeMath for uint256;

    /* ========== EVENTS ========== */

    event RewardAdded(uint256 reward);
    event Staked(address indexed user, uint256 amount);
    event Withdrawn(address indexed user, uint256 amount);
    event RewardPaid(address indexed user, uint256 reward);

    uint256 public constant PCT_BASE = 10**18; // 0% = 0; 1% = 10^16; 100% = 10^18
    uint256 internal constant MAX_BOOST_LEVEL = PCT_BASE;

    address public treasury;

    struct BondedReward {
        uint256 amount;
        uint256 unlockTime;
    }

    mapping(address => bool) public allowance;
    mapping(address => BondedReward) public bondedRewardLocks;

    uint256 public penaltyPct = PCT_BASE / 2; // PCT_BASE is 10^18

    uint256 public inverseMaxBoostCoefficient = 40; // 1 / inverseMaxBoostCoefficient = max boost coef. (ex. if 40 then 1 / (40 / 100) = 2.5)

    IERC20 public rewardsToken;
    IERC20 public stakingToken;
    uint256 public periodFinish;
    uint256 public rewardRate;
    uint256 public rewardsDuration;
    uint256 public lastUpdateTime;
    uint256 public rewardPerTokenStored;
    address public rewardsDistribution;
    uint256 public bondedLockDuration;

    mapping(address => uint256) public userRewardPerTokenPaid;
    mapping(address => uint256) public rewards;

    uint256 public totalSupply;
    mapping(address => uint256) internal _balances;

    IVeXBE public token;
    IBoostLogicProvider public boostLogicProvider;

    function configure(
        address _rewardsDistribution,
        IERC20 _rewardsToken,
        IERC20 _stakingToken,
        uint256 _rewardsDuration,
        IVeXBE _token,
        IBoostLogicProvider _boostLogicProvider,
        address _treasury,
        uint256 _bondedLockDuration,
        address[] memory _allowance
    ) public initializer {
        rewardsToken = _rewardsToken;
        stakingToken = _stakingToken;
        rewardsDistribution = _rewardsDistribution;
        rewardsDuration = _rewardsDuration;
        token = _token;
        boostLogicProvider = _boostLogicProvider;
        treasury = _treasury;
        require(_bondedLockDuration > 0, "badBondDuration");
        bondedLockDuration = _bondedLockDuration;
        for (uint256 i = 0; i < _allowance.length; i++) {
            allowance[_allowance[i]] = true;
        }
    }

    /* ========== MODIFIERS ========== */

    modifier updateReward(address account) {
        uint256 _lastTimeReward = lastTimeRewardApplicable();
        uint256 _duration = _lastTimeReward.sub(lastUpdateTime);
        rewardPerTokenStored = _rewardPerToken(_duration);
        lastUpdateTime = _lastTimeReward;
        if (account != address(0)) {
            (uint256 userEarned, uint256 toTreasury) = potentialXbeReturns(
                0,
                account
            );
            rewards[account] = userEarned;
            userRewardPerTokenPaid[account] = rewardPerTokenStored;
            // transfer remaining reward share to treasury
            if (toTreasury > 0) {
                require(
                    stakingToken.transfer(treasury, toTreasury),
                    "!boostDelta"
                );
            }
        }
        _;
    }

    modifier onlyRewardsDistribution() {
        require(
            msg.sender == rewardsDistribution,
            "Caller is not RewardsDistribution contract"
        );
        _;
    }

    /* ========== OWNERS FUNCTIONS ========== */

    function setRewardsDistribution(address _rewardsDistribution)
        external
        onlyOwner
    {
        rewardsDistribution = _rewardsDistribution;
    }

    function setInverseMaxBoostCoefficient(uint256 _inverseMaxBoostCoefficient)
        external
        onlyOwner
    {
        inverseMaxBoostCoefficient = _inverseMaxBoostCoefficient;
        require(
            _inverseMaxBoostCoefficient > 0 &&
                _inverseMaxBoostCoefficient < 100,
            "invalidInverseMaxBoostCoefficient"
        );
    }

    function setPenaltyPct(uint256 _penaltyPct) external onlyOwner {
        penaltyPct = _penaltyPct;
        require(_penaltyPct < PCT_BASE, "tooHighPct");
    }

    function setBondedLockDuration(uint256 _bondedLockDuration)
        external
        onlyOwner
    {
        bondedLockDuration = _bondedLockDuration;
    }

    function setBoostLogicProvider(address _boostLogicProvider)
        external
        onlyOwner
    {
        boostLogicProvider = IBoostLogicProvider(_boostLogicProvider);
    }

    function setAddressWhoCanAutoStake(address _addr, bool _flag)
        external
        onlyOwner
    {
        allowance[_addr] = _flag;
    }

    /* ========== VIEWS ========== */

    function balanceOf(address account) external view returns (uint256) {
        return _balances[account];
    }

    function lastTimeRewardApplicable() public view returns (uint256) {
        return Math.min256(block.timestamp, periodFinish);
    }

    function rewardPerToken() external view returns (uint256) {
        return _rewardPerToken(lastTimeRewardApplicable().sub(lastUpdateTime));
    }

    function _rewardPerToken(uint256 duration) internal view returns (uint256) {
        if (totalSupply == 0) {
            return rewardPerTokenStored;
        }
        return
            rewardPerTokenStored.add(
                duration.mul(rewardRate).mul(PCT_BASE).div(totalSupply)
            );
    }

    /* ========== RESTRICTED FUNCTIONS ========== */

    function notifyRewardAmount(uint256 reward)
        external
        onlyRewardsDistribution
        updateReward(address(0))
    {
        if (block.timestamp >= periodFinish) {
            rewardRate = reward.div(rewardsDuration);
        } else {
            uint256 remaining = periodFinish.sub(block.timestamp);
            uint256 leftover = remaining.mul(rewardRate);
            rewardRate = reward.add(leftover).div(rewardsDuration);
        }

        // Ensure the provided reward amount is not more than the balance in the contract.
        // This keeps the reward rate in the right range, preventing overflows due to
        // very high values of rewardRate in the earned and rewardsPerToken functions;
        // Reward + leftover must be less than 2^256 / 10^18 to avoid overflow.
        uint256 balance = rewardsToken.balanceOf(address(this));
        require(
            rewardRate <= balance.div(rewardsDuration),
            "Provided reward too high"
        );

        lastUpdateTime = block.timestamp;
        periodFinish = block.timestamp.add(rewardsDuration);
        emit RewardAdded(reward);
    }

    function _stake(address _for, uint256 _amount) internal {
        require(_amount > 0, "Cannot stake 0");
        totalSupply = totalSupply.add(_amount);
        _balances[_for] = _balances[_for].add(_amount);

        require(
            stakingToken.transferFrom(msg.sender, address(this), _amount),
            "!t"
        );
        emit Staked(_for, _amount);
    }

    function stakeFor(address _for, uint256 amount)
        external
        nonReentrant
        whenNotPaused
        updateReward(_for)
    {
        require(allowance[msg.sender], "stakeNotApproved");

        _stake(_for, amount);

        BondedReward memory rewardLock = bondedRewardLocks[_for];
        if (block.timestamp >= rewardLock.unlockTime) {
            bondedRewardLocks[_for].amount = amount;
        } else {
            bondedRewardLocks[_for].amount = rewardLock.amount.add(amount);
        }
        bondedRewardLocks[_for].unlockTime = block.timestamp.add(
            bondedLockDuration
        );
    }

    function stake(uint256 amount)
        external
        nonReentrant
        whenNotPaused
        updateReward(msg.sender)
    {
        _stake(msg.sender, amount);
    }

    function withdrawBondedOrWithPenalty()
        external
        nonReentrant
        updateReward(msg.sender)
    {
        uint256 amount = bondedRewardLocks[msg.sender].amount;
        uint256 escrowed = token.lockedAmount(msg.sender);
        amount = Math.min256(amount, _balances[msg.sender].sub(escrowed));

        totalSupply = totalSupply.sub(amount);
        _balances[msg.sender] = _balances[msg.sender].sub(amount);
        if (block.timestamp >= bondedRewardLocks[msg.sender].unlockTime) {
            require(stakingToken.transfer(msg.sender, amount), "!tBonded");
        } else {
            uint256 penalty = amount.mul(penaltyPct).div(PCT_BASE);
            uint256 toTransfer = amount.sub(penalty);
            require(
                stakingToken.transfer(msg.sender, toTransfer),
                "!tBondedWithPenalty"
            );
            require(stakingToken.transfer(treasury, penalty), "!tPenalty");
        }
        delete bondedRewardLocks[msg.sender];
        emit Withdrawn(msg.sender, amount);
    }

    function withdrawUnbonded(uint256 amount)
        external
        nonReentrant
        updateReward(msg.sender)
    {
        require(amount > 0, "!withdraw0");

        uint256 escrowed = token.lockedAmount(msg.sender);
        require(
            _balances[msg.sender].sub(escrowed).sub(
                bondedRewardLocks[msg.sender].amount
            ) >= amount,
            "escrow amount failure"
        );

        totalSupply = totalSupply.sub(amount);
        _balances[msg.sender] = _balances[msg.sender].sub(amount);

        require(stakingToken.transfer(msg.sender, amount), "!t");

        emit Withdrawn(msg.sender, amount);
    }

    function _baseBoostLevel() internal view returns (uint256) {
        return PCT_BASE.mul(inverseMaxBoostCoefficient).div(100);
    }

    function _lockedBoostLevel(address account)
        internal
        view
        returns (uint256)
    {
        IVeXBE veXBE = token;
        uint256 votingBalance = veXBE.balanceOf(account);
        uint256 votingTotal = veXBE.totalSupply();
        uint256 lockedAmount = veXBE.lockedAmount(account);
        if (votingTotal == 0 || votingBalance == 0) {
            return _baseBoostLevel();
        }

        uint256 res = PCT_BASE
            .mul(inverseMaxBoostCoefficient)
            .add(
                uint256(100)
                    .sub(inverseMaxBoostCoefficient)
                    .mul(PCT_BASE)
                    .mul(veXBE.lockedSupply())
                    .div(votingTotal)
                    .mul(votingBalance)
                    .div(lockedAmount)
            )
            .div(100);

        return res < MAX_BOOST_LEVEL ? res : MAX_BOOST_LEVEL;
    }

    function calculateBoostLevel(address account)
        public
        view
        returns (uint256)
    {
        IVeXBE veXBE = token;
        uint256 lockedAmount = veXBE.lockedAmount(account);

        uint256 stakedAmount = _balances[account];
        if (stakedAmount == 0 || lockedAmount == 0) {
            return _baseBoostLevel();
        }

        uint256 lockedBoost = boostLogicProvider.hasMaxBoostLevel(account)
            ? MAX_BOOST_LEVEL
            : _lockedBoostLevel(account);

        return
            lockedBoost
                .mul(lockedAmount)
                .add(_baseBoostLevel().mul(stakedAmount.sub(lockedAmount)))
                .div(stakedAmount);
    }

    function earned(address account)
        external
        view
        returns (
            uint256 // userEarned
        )
    {
        uint256 duration = lastTimeRewardApplicable().sub(lastUpdateTime);
        (uint256 userEarned, ) = potentialXbeReturns(duration, account);
        return userEarned;
    }

    function potentialXbeReturns(uint256 duration, address account)
        public
        view
        returns (
            uint256,
            uint256 // userEarned, toTreasury
        )
    {
        uint256 boostLevel = calculateBoostLevel(account);
        require(boostLevel <= MAX_BOOST_LEVEL, "badBoostLevel");

        uint256 maxBoostedReward = _balances[account]
            .mul(_rewardPerToken(duration).sub(userRewardPerTokenPaid[account]))
            .div(PCT_BASE);

        uint256 toUser = maxBoostedReward.mul(boostLevel).div(PCT_BASE);
        uint256 toTreasury = maxBoostedReward.sub(toUser);

        return (toUser.add(rewards[account]), toTreasury);
    }

    function getReward() external nonReentrant updateReward(msg.sender) {
        uint256 reward = rewards[msg.sender];
        if (reward > 0) {
            rewards[msg.sender] = 0;
            require(rewardsToken.transfer(msg.sender, reward), "!t");
            emit RewardPaid(msg.sender, reward);
        }
    }
}

File 2 of 11 : Math.sol
pragma solidity ^0.4.24;

/**
 * @title Math
 * @dev Assorted math operations
 */

library Math {
  function max64(uint64 a, uint64 b) internal pure returns (uint64) {
    return a >= b ? a : b;
  }

  function min64(uint64 a, uint64 b) internal pure returns (uint64) {
    return a < b ? a : b;
  }

  function max256(uint256 a, uint256 b) internal pure returns (uint256) {
    return a >= b ? a : b;
  }

  function min256(uint256 a, uint256 b) internal pure returns (uint256) {
    return a < b ? a : b;
  }
}

File 3 of 11 : SafeMath.sol
// See https://github.com/OpenZeppelin/openzeppelin-solidity/blob/d51e38758e1d985661534534d5c61e27bece5042/contracts/math/SafeMath.sol
// Adapted to use pragma ^0.4.24 and satisfy our linter rules

pragma solidity ^0.4.24;


/**
 * @title SafeMath
 * @dev Math operations with safety checks that revert on error
 */
library SafeMath {
    string private constant ERROR_ADD_OVERFLOW = "MATH_ADD_OVERFLOW";
    string private constant ERROR_SUB_UNDERFLOW = "MATH_SUB_UNDERFLOW";
    string private constant ERROR_MUL_OVERFLOW = "MATH_MUL_OVERFLOW";
    string private constant ERROR_DIV_ZERO = "MATH_DIV_ZERO";

    /**
    * @dev Multiplies two numbers, reverts on overflow.
    */
    function mul(uint256 _a, uint256 _b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (_a == 0) {
            return 0;
        }

        uint256 c = _a * _b;
        require(c / _a == _b, ERROR_MUL_OVERFLOW);

        return c;
    }

    /**
    * @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
    */
    function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
        require(_b > 0, ERROR_DIV_ZERO); // Solidity only automatically asserts when dividing by 0
        uint256 c = _a / _b;
        // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold

        return c;
    }

    /**
    * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
        require(_b <= _a, ERROR_SUB_UNDERFLOW);
        uint256 c = _a - _b;

        return c;
    }

    /**
    * @dev Adds two numbers, reverts on overflow.
    */
    function add(uint256 _a, uint256 _b) internal pure returns (uint256) {
        uint256 c = _a + _b;
        require(c >= _a, ERROR_ADD_OVERFLOW);

        return c;
    }

    /**
    * @dev Divides two numbers and returns the remainder (unsigned integer modulo),
    * reverts when dividing by zero.
    */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, ERROR_DIV_ZERO);
        return a % b;
    }
}

File 4 of 11 : SafeMath64.sol
// See https://github.com/OpenZeppelin/openzeppelin-solidity/blob/d51e38758e1d985661534534d5c61e27bece5042/contracts/math/SafeMath.sol
// Adapted for uint64, pragma ^0.4.24, and satisfying our linter rules
// Also optimized the mul() implementation, see https://github.com/aragon/aragonOS/pull/417

pragma solidity ^0.4.24;


/**
 * @title SafeMath64
 * @dev Math operations for uint64 with safety checks that revert on error
 */
library SafeMath64 {
    string private constant ERROR_ADD_OVERFLOW = "MATH64_ADD_OVERFLOW";
    string private constant ERROR_SUB_UNDERFLOW = "MATH64_SUB_UNDERFLOW";
    string private constant ERROR_MUL_OVERFLOW = "MATH64_MUL_OVERFLOW";
    string private constant ERROR_DIV_ZERO = "MATH64_DIV_ZERO";

    /**
    * @dev Multiplies two numbers, reverts on overflow.
    */
    function mul(uint64 _a, uint64 _b) internal pure returns (uint64) {
        uint256 c = uint256(_a) * uint256(_b);
        require(c < 0x010000000000000000, ERROR_MUL_OVERFLOW); // 2**64 (less gas this way)

        return uint64(c);
    }

    /**
    * @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
    */
    function div(uint64 _a, uint64 _b) internal pure returns (uint64) {
        require(_b > 0, ERROR_DIV_ZERO); // Solidity only automatically asserts when dividing by 0
        uint64 c = _a / _b;
        // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold

        return c;
    }

    /**
    * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint64 _a, uint64 _b) internal pure returns (uint64) {
        require(_b <= _a, ERROR_SUB_UNDERFLOW);
        uint64 c = _a - _b;

        return c;
    }

    /**
    * @dev Adds two numbers, reverts on overflow.
    */
    function add(uint64 _a, uint64 _b) internal pure returns (uint64) {
        uint64 c = _a + _b;
        require(c >= _a, ERROR_ADD_OVERFLOW);

        return c;
    }

    /**
    * @dev Divides two numbers and returns the remainder (unsigned integer modulo),
    * reverts when dividing by zero.
    */
    function mod(uint64 a, uint64 b) internal pure returns (uint64) {
        require(b != 0, ERROR_DIV_ZERO);
        return a % b;
    }
}

File 5 of 11 : IBoostLogicProvider.sol
pragma solidity ^0.4.24;

interface IBoostLogicProvider {
    function hasMaxBoostLevel(address account) external view returns (bool);
}

File 6 of 11 : IERC20.sol
pragma solidity ^0.4.24;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);
}

File 7 of 11 : IVeXBE.sol
pragma solidity ^0.4.24;

interface IVeXBE {
    function getLastUserSlope(address addr) external view returns (int128);

    function lockedEnd(address addr) external view returns (uint256);

    function lockedAmount(address addr) external view returns (uint256);

    function userPointEpoch(address addr) external view returns (uint256);

    function userPointHistoryTs(address addr, uint256 epoch)
        external
        view
        returns (uint256);

    function balanceOfAt(address addr, uint256 _block)
        external
        view
        returns (uint256);

    function balanceOf(address addr) external view returns (uint256);

    function balanceOf(address addr, uint256 timestamp)
        external
        view
        returns (uint256);

    function totalSupply() external view returns (uint256);

    function lockedSupply() external view returns (uint256);

    function lockStarts(address addr) external view returns (uint256);

    function totalSupplyAt(uint256 _block) external view returns (uint256);
}

File 8 of 11 : VotingInitializable.sol
pragma solidity ^0.4.24;

contract VotingInitializable {
    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        require(_initializing || !_initialized, "alreadyInitialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }
}

File 9 of 11 : VotingNonReentrant.sol
pragma solidity ^0.4.24;

contract VotingNonReentrant {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status = _NOT_ENTERED;

    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 10 of 11 : VotingOwnable.sol
pragma solidity ^0.4.24;

contract VotingOwnable {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(msg.sender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == msg.sender, "!owner");
        _;
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0), "owner0");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 11 of 11 : VotingPausable.sol
pragma solidity ^0.4.24;

contract VotingPausable {
    bool public paused;
    address private pauser;

    constructor() public {
        pauser = msg.sender;
    }

    modifier whenNotPaused() {
        require(!paused, "paused");
        _;
    }

    function setPaused(bool _paused) external {
        require(msg.sender == pauser, "!pauser");
        paused = _paused;
    }

    function transferOwnership(address newPauser) public {
        require(msg.sender == pauser, "!pauser");
        pauser = newPauser;
    }
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "evmVersion": "byzantium",
  "libraries": {},
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"earned","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawBondedOrWithPenalty","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"rewards","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"duration","type":"uint256"},{"name":"account","type":"address"}],"name":"potentialXbeReturns","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_rewardsDistribution","type":"address"}],"name":"setRewardsDistribution","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_for","type":"address"},{"name":"amount","type":"uint256"}],"name":"stakeFor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rewardsDuration","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"reward","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"getReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"penaltyPct","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardsDistribution","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"calculateBoostLevel","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_flag","type":"bool"}],"name":"setAddressWhoCanAutoStake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_inverseMaxBoostCoefficient","type":"uint256"}],"name":"setInverseMaxBoostCoefficient","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"treasury","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_penaltyPct","type":"uint256"}],"name":"setPenaltyPct","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stakingToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"withdrawUnbonded","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rewardRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_rewardsDistribution","type":"address"},{"name":"_rewardsToken","type":"address"},{"name":"_stakingToken","type":"address"},{"name":"_rewardsDuration","type":"uint256"},{"name":"_token","type":"address"},{"name":"_boostLogicProvider","type":"address"},{"name":"_treasury","type":"address"},{"name":"_bondedLockDuration","type":"uint256"},{"name":"_allowance","type":"address[]"}],"name":"configure","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"userRewardPerTokenPaid","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bondedLockDuration","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_bondedLockDuration","type":"uint256"}],"name":"setBondedLockDuration","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_boostLogicProvider","type":"address"}],"name":"setBoostLogicProvider","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"stake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"bondedRewardLocks","outputs":[{"name":"amount","type":"uint256"},{"name":"unlockTime","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"inverseMaxBoostCoefficient","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"boostLogicProvider","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastUpdateTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardPerToken","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardsToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardPerTokenStored","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"periodFinish","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PCT_BASE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"user","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"user","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"user","type":"address"},{"indexed":false,"name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

6080604052600180556002670de0b6b3a76400000460065560286007556000805461010060a860020a0319163361010081029190911790915561004a9064010000000061004f810204565b6100a1565b60028054600160a060020a03838116600160a060020a0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b613292806100b06000396000f3006080604052600436106102185763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416628cc262811461021d57806301d8d119146102505780630700037d14610267578063160292b41461028857806316c38b3c146102c557806318160ddd146102df57806319762143146102f45780632ee4090814610315578063386a9525146103395780633c6b16ab1461034e5780633d18b912146103665780633d74bb091461037b5780633e5beab9146103905780633fc6df6e146103c557806349c48f4b146103f65780635c975abb146104175780635cd7202e1461042c578063601f3cef1461045257806361d027b31461046a5780636c1f75081461047f57806370a0823114610497578063715018a6146104b857806372f702f3146104cd5780637467f7b9146104e25780637b0a47ee146104fa57806380faa57d1461050f57806387adc134146105245780638b876347146105b35780638da5cb5b146105d45780638eda7063146105e9578063990c214b146105fe578063a5c573a814610616578063a694fc3a14610637578063a79f4d581461064f578063ad36e49714610670578063b611709714610685578063c8f33c911461069a578063cd3daf9d146106af578063d1af0c7d146106c4578063df136d65146106d9578063ebe2b12b146106ee578063f2fde38b14610703578063fc0c546a14610724578063fc157cb414610739575b600080fd5b34801561022957600080fd5b5061023e600160a060020a036004351661074e565b60408051918252519081900360200190f35b34801561025c57600080fd5b50610265610782565b005b34801561027357600080fd5b5061023e600160a060020a0360043516610d78565b34801561029457600080fd5b506102ac600435600160a060020a0360243516610d8a565b6040805192835260208301919091528051918290030190f35b3480156102d157600080fd5b506102656004351515610ec5565b3480156102eb57600080fd5b5061023e610f3f565b34801561030057600080fd5b50610265600160a060020a0360043516610f45565b34801561032157600080fd5b50610265600160a060020a0360043516602435610fc7565b34801561034557600080fd5b5061023e611308565b34801561035a57600080fd5b5061026560043561130e565b34801561037257600080fd5b506102656116bb565b34801561038757600080fd5b5061023e6119a5565b34801561039c57600080fd5b506103b1600160a060020a03600435166119ab565b604080519115158252519081900360200190f35b3480156103d157600080fd5b506103da6119c0565b60408051600160a060020a039092168252519081900360200190f35b34801561040257600080fd5b5061023e600160a060020a03600435166119cf565b34801561042357600080fd5b506103b1611b9d565b34801561043857600080fd5b50610265600160a060020a03600435166024351515611ba6565b34801561045e57600080fd5b50610265600435611c24565b34801561047657600080fd5b506103da611d0b565b34801561048b57600080fd5b50610265600435611d1a565b3480156104a357600080fd5b5061023e600160a060020a0360043516611dd1565b3480156104c457600080fd5b50610265611df0565b3480156104d957600080fd5b506103da611e4f565b3480156104ee57600080fd5b50610265600435611e5e565b34801561050657600080fd5b5061023e6122c5565b34801561051b57600080fd5b5061023e6122cb565b34801561053057600080fd5b5060408051610104356004818101356020818102858101820190965281855261026595600160a060020a038435811696602480358316976044358416976064359760843586169760a43587169760c4359097169660e435963696949561012495919491019290918291850190849080828437509497506122de9650505050505050565b3480156105bf57600080fd5b5061023e600160a060020a0360043516612572565b3480156105e057600080fd5b506103da612584565b3480156105f557600080fd5b5061023e612593565b34801561060a57600080fd5b50610265600435612599565b34801561062257600080fd5b50610265600160a060020a03600435166125f1565b34801561064357600080fd5b50610265600435612673565b34801561065b57600080fd5b506102ac600160a060020a036004351661287a565b34801561067c57600080fd5b5061023e612893565b34801561069157600080fd5b506103da612899565b3480156106a657600080fd5b5061023e6128a8565b3480156106bb57600080fd5b5061023e6128ae565b3480156106d057600080fd5b506103da6128c6565b3480156106e557600080fd5b5061023e6128d5565b3480156106fa57600080fd5b5061023e6128db565b34801561070f57600080fd5b50610265600160a060020a03600435166128e1565b34801561073057600080fd5b506103da61299d565b34801561074557600080fd5b5061023e6129ac565b600080600061076d600d546107616122cb565b9063ffffffff6129b816565b91506107798285610d8a565b50949350505050565b6000806000806002600154141515156107d3576040805160e560020a62461bcd02815260206004820152601f6024820152600080516020613227833981519152604482015290519081900360640190fd5b60026001553360008080806107e66122cb565b93506107fd600d54856129b890919063ffffffff16565b925061080883612a8f565b600e55600d849055600160a060020a0385161561092b5761082a600086610d8a565b600160a060020a0387166000908152601260209081526040808320859055600e546011909252822055919350915081111561092b576009546003546040805160e060020a63a9059cbb028152600160a060020a039283166004820152602481018590529051919092169163a9059cbb9160448083019260209291908290030181600087803b1580156108bb57600080fd5b505af11580156108cf573d6000803e3d6000fd5b505050506040513d60208110156108e557600080fd5b5051151561092b576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020613247833981519152604482015290519081900360640190fd5b33600081815260056020908152604080832054601554825160e360020a63142a7ce102815260048101969096529151909d50600160a060020a039091169363a153e7089360248083019493928390030190829087803b15801561098d57600080fd5b505af11580156109a1573d6000803e3d6000fd5b505050506040513d60208110156109b757600080fd5b5051336000908152601460205260409020549098506109e7908a906109e2908b63ffffffff6129b816565b612ae4565b6013549099506109fd908a63ffffffff6129b816565b60135533600090815260146020526040902054610a20908a63ffffffff6129b816565b336000908152601460209081526040808320939093556005905220600101544210610b23576009546040805160e060020a63a9059cbb028152336004820152602481018c90529051600160a060020a039092169163a9059cbb916044808201926020929091908290030181600087803b158015610a9c57600080fd5b505af1158015610ab0573d6000803e3d6000fd5b505050506040513d6020811015610ac657600080fd5b50511515610b1e576040805160e560020a62461bcd02815260206004820152600860248201527f2174426f6e646564000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b610d1c565b610b50670de0b6b3a7640000610b446006548c612afc90919063ffffffff16565b9063ffffffff612baf16565b9650610b62898863ffffffff6129b816565b6009546040805160e060020a63a9059cbb028152336004820152602481018490529051929850600160a060020a039091169163a9059cbb916044808201926020929091908290030181600087803b158015610bbc57600080fd5b505af1158015610bd0573d6000803e3d6000fd5b505050506040513d6020811015610be657600080fd5b50511515610c3e576040805160e560020a62461bcd02815260206004820152601360248201527f2174426f6e6465645769746850656e616c747900000000000000000000000000604482015290519081900360640190fd5b6009546003546040805160e060020a63a9059cbb028152600160a060020a039283166004820152602481018b90529051919092169163a9059cbb9160448083019260209291908290030181600087803b158015610c9a57600080fd5b505af1158015610cae573d6000803e3d6000fd5b505050506040513d6020811015610cc457600080fd5b50511515610d1c576040805160e560020a62461bcd02815260206004820152600960248201527f217450656e616c74790000000000000000000000000000000000000000000000604482015290519081900360640190fd5b3360008181526005602090815260408083208381556001019290925581518c815291517f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59281900390910190a250506001805550505050505050565b60126020526000908152604090205481565b600080600080600080610d9c876119cf565b9350670de0b6b3a7640000841115610dfe576040805160e560020a62461bcd02815260206004820152600d60248201527f626164426f6f73744c6576656c00000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038716600090815260116020526040902054610e5b90670de0b6b3a764000090610b4490610e36906107618d612a8f565b600160a060020a038b166000908152601460205260409020549063ffffffff612afc16565b9250610e79670de0b6b3a7640000610b44858763ffffffff612afc16565b9150610e8b838363ffffffff6129b816565b600160a060020a038816600090815260126020526040902054909150610eb890839063ffffffff612c4f16565b9890975095505050505050565b6000546101009004600160a060020a03163314610f2c576040805160e560020a62461bcd02815260206004820152600760248201527f2170617573657200000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6000805460ff1916911515919091179055565b60135481565b33610f4e612584565b600160a060020a031614610f98576040805160e560020a62461bcd028152602060048201526006602482015260d160020a6510b7bbb732b902604482015290519081900360640190fd5b600f805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b610fcf61320f565b60015460021415611018576040805160e560020a62461bcd02815260206004820152601f6024820152600080516020613227833981519152604482015290519081900360640190fd5b600260015560005460ff1615611078576040805160e560020a62461bcd02815260206004820152600660248201527f7061757365640000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b826000806000806110876122cb565b935061109e600d54856129b890919063ffffffff16565b92506110a983612a8f565b600e55600d849055600160a060020a038516156111cc576110cb600086610d8a565b600160a060020a0387166000908152601260209081526040808320859055600e54601190925282205591935091508111156111cc576009546003546040805160e060020a63a9059cbb028152600160a060020a039283166004820152602481018590529051919092169163a9059cbb9160448083019260209291908290030181600087803b15801561115c57600080fd5b505af1158015611170573d6000803e3d6000fd5b505050506040513d602081101561118657600080fd5b505115156111cc576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020613247833981519152604482015290519081900360640190fd5b3360009081526004602052604090205460ff161515611235576040805160e560020a62461bcd02815260206004820152601060248201527f7374616b654e6f74417070726f76656400000000000000000000000000000000604482015290519081900360640190fd5b61123f8888612cdd565b600160a060020a03881660009081526005602090815260409182902082518084019093528054835260010154908201819052909650421061129a57600160a060020a03881660009081526005602052604090208790556112c6565b85516112ac908863ffffffff612c4f16565b600160a060020a0389166000908152600560205260409020555b6010546112da90429063ffffffff612c4f16565b600160a060020a03909816600090815260056020526040902060019081019890985550505093805550505050565b600c5481565b600f5460009081908190600160a060020a0316331461139d576040805160e560020a62461bcd02815260206004820152602a60248201527f43616c6c6572206973206e6f742052657761726473446973747269627574696f60448201527f6e20636f6e747261637400000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008060008060006113ad6122cb565b93506113c4600d54856129b890919063ffffffff16565b92506113cf83612a8f565b600e55600d849055600160a060020a038516156114f2576113f1600086610d8a565b600160a060020a0387166000908152601260209081526040808320859055600e54601190925282205591935091508111156114f2576009546003546040805160e060020a63a9059cbb028152600160a060020a039283166004820152602481018590529051919092169163a9059cbb9160448083019260209291908290030181600087803b15801561148257600080fd5b505af1158015611496573d6000803e3d6000fd5b505050506040513d60208110156114ac57600080fd5b505115156114f2576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020613247833981519152604482015290519081900360640190fd5b600a54421061151757600c5461150f908a9063ffffffff612baf16565b600b5561155f565b600a5461152a904263ffffffff6129b816565b9750611541600b5489612afc90919063ffffffff16565b600c5490975061155b90610b448b8a63ffffffff612c4f16565b600b555b600854604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b1580156115c557600080fd5b505af11580156115d9573d6000803e3d6000fd5b505050506040513d60208110156115ef57600080fd5b5051600c5490965061160890879063ffffffff612baf16565b600b541115611661576040805160e560020a62461bcd02815260206004820152601860248201527f50726f76696465642072657761726420746f6f20686967680000000000000000604482015290519081900360640190fd5b42600d819055600c5461167a919063ffffffff612c4f16565b600a55604080518a815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a1505050505050505050565b60015460009060021415611707576040805160e560020a62461bcd02815260206004820152601f6024820152600080516020613227833981519152604482015290519081900360640190fd5b600260015533600080808061171a6122cb565b9350611731600d54856129b890919063ffffffff16565b925061173c83612a8f565b600e55600d849055600160a060020a0385161561185f5761175e600086610d8a565b600160a060020a0387166000908152601260209081526040808320859055600e546011909252822055919350915081111561185f576009546003546040805160e060020a63a9059cbb028152600160a060020a039283166004820152602481018590529051919092169163a9059cbb9160448083019260209291908290030181600087803b1580156117ef57600080fd5b505af1158015611803573d6000803e3d6000fd5b505050506040513d602081101561181957600080fd5b5051151561185f576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020613247833981519152604482015290519081900360640190fd5b33600090815260126020526040812054965086111561199957336000818152601260209081526040808320839055600854815160e060020a63a9059cbb0281526004810195909552602485018b90529051600160a060020a039091169363a9059cbb9360448083019493928390030190829087803b1580156118e057600080fd5b505af11580156118f4573d6000803e3d6000fd5b505050506040513d602081101561190a57600080fd5b50511515611962576040805160e560020a62461bcd02815260206004820152600260248201527f2174000000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60408051878152905133917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b50506001805550505050565b60065481565b60046020526000908152604090205460ff1681565b600f54600160a060020a031681565b6015546040805160e360020a63142a7ce1028152600160a060020a03848116600483015291516000939290921691839182918291859163a153e7089160248082019260209290919082900301818787803b158015611a2c57600080fd5b505af1158015611a40573d6000803e3d6000fd5b505050506040513d6020811015611a5657600080fd5b5051600160a060020a0387166000908152601460205260409020549093509150811580611a81575082155b15611a9557611a8e612ebd565b9450611b94565b601654604080517f713b66a4000000000000000000000000000000000000000000000000000000008152600160a060020a0389811660048301529151919092169163713b66a49160248083019260209291908290030181600087803b158015611afd57600080fd5b505af1158015611b11573d6000803e3d6000fd5b505050506040513d6020811015611b2757600080fd5b5051611b3b57611b3686612ee1565b611b45565b670de0b6b3a76400005b9050611b9182610b44611b75611b61838863ffffffff6129b816565b611b69612ebd565b9063ffffffff612afc16565b611b85858863ffffffff612afc16565b9063ffffffff612c4f16565b94505b50505050919050565b60005460ff1681565b33611baf612584565b600160a060020a031614611bf9576040805160e560020a62461bcd028152602060048201526006602482015260d160020a6510b7bbb732b902604482015290519081900360640190fd5b600160a060020a03919091166000908152600460205260409020805460ff1916911515919091179055565b33611c2d612584565b600160a060020a031614611c77576040805160e560020a62461bcd028152602060048201526006602482015260d160020a6510b7bbb732b902604482015290519081900360640190fd5b6007819055600081118015611c8c5750606481105b1515611d08576040805160e560020a62461bcd02815260206004820152602160248201527f696e76616c6964496e76657273654d6178426f6f7374436f656666696369656e60448201527f7400000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b50565b600354600160a060020a031681565b33611d23612584565b600160a060020a031614611d6d576040805160e560020a62461bcd028152602060048201526006602482015260d160020a6510b7bbb732b902604482015290519081900360640190fd5b6006819055670de0b6b3a76400008110611d08576040805160e560020a62461bcd02815260206004820152600a60248201527f746f6f4869676850637400000000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0381166000908152601460205260409020545b919050565b33611df9612584565b600160a060020a031614611e43576040805160e560020a62461bcd028152602060048201526006602482015260d160020a6510b7bbb732b902604482015290519081900360640190fd5b611e4d60006131b0565b565b600954600160a060020a031681565b60015460009060021415611eaa576040805160e560020a62461bcd02815260206004820152601f6024820152600080516020613227833981519152604482015290519081900360640190fd5b6002600155336000808080611ebd6122cb565b9350611ed4600d54856129b890919063ffffffff16565b9250611edf83612a8f565b600e55600d849055600160a060020a0385161561200257611f01600086610d8a565b600160a060020a0387166000908152601260209081526040808320859055600e5460119092528220559193509150811115612002576009546003546040805160e060020a63a9059cbb028152600160a060020a039283166004820152602481018590529051919092169163a9059cbb9160448083019260209291908290030181600087803b158015611f9257600080fd5b505af1158015611fa6573d6000803e3d6000fd5b505050506040513d6020811015611fbc57600080fd5b50511515612002576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020613247833981519152604482015290519081900360640190fd5b6000871161205a576040805160e560020a62461bcd02815260206004820152600a60248201527f2177697468647261773000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6015546040805160e360020a63142a7ce10281523360048201529051600160a060020a039092169163a153e708916024808201926020929091908290030181600087803b1580156120aa57600080fd5b505af11580156120be573d6000803e3d6000fd5b505050506040513d60208110156120d457600080fd5b505133600090815260056020908152604080832054601490925290912054919750889161210c9190610761908a63ffffffff6129b816565b1015612162576040805160e560020a62461bcd02815260206004820152601560248201527f657363726f7720616d6f756e74206661696c7572650000000000000000000000604482015290519081900360640190fd5b601354612175908863ffffffff6129b816565b60135533600090815260146020526040902054612198908863ffffffff6129b816565b33600081815260146020908152604080832094909455600954845160e060020a63a9059cbb0281526004810194909452602484018c90529351600160a060020a039094169363a9059cbb93604480820194918390030190829087803b15801561220057600080fd5b505af1158015612214573d6000803e3d6000fd5b505050506040513d602081101561222a57600080fd5b50511515612282576040805160e560020a62461bcd02815260206004820152600260248201527f2174000000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60408051888152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a25050600180555050505050565b600b5481565b60006122d942600a54612ae4565b905090565b60025460009081907501000000000000000000000000000000000000000000900460ff1680612328575060025474010000000000000000000000000000000000000000900460ff16155b151561237e576040805160e560020a62461bcd02815260206004820152601260248201527f616c7265616479496e697469616c697a65640000000000000000000000000000604482015290519081900360640190fd5b506002547501000000000000000000000000000000000000000000900460ff1615801561240e576002805474ff00000000000000000000000000000000000000001975ff0000000000000000000000000000000000000000001990911675010000000000000000000000000000000000000000001716740100000000000000000000000000000000000000001790555b6008805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a038d8116919091179092556009805482168c8416179055600f805482168e8416179055600c8a90556015805482168a841617905560168054821689841617905560038054909116918716919091179055600084116124da576040805160e560020a62461bcd02815260206004820152600f60248201527f626164426f6e644475726174696f6e0000000000000000000000000000000000604482015290519081900360640190fd5b6010849055600091505b825182101561253f57600160046000858581518110151561250157fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff1916911515919091179055600191909101906124e4565b8015612565576002805475ff000000000000000000000000000000000000000000191690555b5050505050505050505050565b60116020526000908152604090205481565b600254600160a060020a031690565b60105481565b336125a2612584565b600160a060020a0316146125ec576040805160e560020a62461bcd028152602060048201526006602482015260d160020a6510b7bbb732b902604482015290519081900360640190fd5b601055565b336125fa612584565b600160a060020a031614612644576040805160e560020a62461bcd028152602060048201526006602482015260d160020a6510b7bbb732b902604482015290519081900360640190fd5b6016805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600154600214156126bc576040805160e560020a62461bcd02815260206004820152601f6024820152600080516020613227833981519152604482015290519081900360640190fd5b600260015560005460ff161561271c576040805160e560020a62461bcd02815260206004820152600660248201527f7061757365640000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b3360008060008061272b6122cb565b9350612742600d54856129b890919063ffffffff16565b925061274d83612a8f565b600e55600d849055600160a060020a038516156128705761276f600086610d8a565b600160a060020a0387166000908152601260209081526040808320859055600e5460119092528220559193509150811115612870576009546003546040805160e060020a63a9059cbb028152600160a060020a039283166004820152602481018590529051919092169163a9059cbb9160448083019260209291908290030181600087803b15801561280057600080fd5b505af1158015612814573d6000803e3d6000fd5b505050506040513d602081101561282a57600080fd5b50511515612870576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020613247833981519152604482015290519081900360640190fd5b6119993387612cdd565b6005602052600090815260409020805460019091015482565b60075481565b601654600160a060020a031681565b600d5481565b60006122d96128c1600d546107616122cb565b612a8f565b600854600160a060020a031681565b600e5481565b600a5481565b336128ea612584565b600160a060020a031614612934576040805160e560020a62461bcd028152602060048201526006602482015260d160020a6510b7bbb732b902604482015290519081900360640190fd5b600160a060020a0381161515612994576040805160e560020a62461bcd02815260206004820152600660248201527f6f776e6572300000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611d08816131b0565b601554600160a060020a031681565b670de0b6b3a764000081565b60408051808201909152601281527f4d4154485f5355425f554e444552464c4f5700000000000000000000000000006020820152600090819084841115612a805760405160e560020a62461bcd0281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612a45578181015183820152602001612a2d565b50505050905090810190601f168015612a725780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050808203805b5092915050565b600060135460001415612aa55750600e54611deb565b612ade612acf601354610b44670de0b6b3a7640000611b69600b5488612afc90919063ffffffff16565b600e549063ffffffff612c4f16565b92915050565b6000818310612af35781612af5565b825b9392505050565b600080831515612b0f5760009150612a88565b50828202828482811515612b1f57fe5b60408051808201909152601181527f4d4154485f4d554c5f4f564552464c4f5700000000000000000000000000000060208201529291900414612ba75760405160e560020a62461bcd02815260040180806020018281038252838181518152602001915080519060200190808383600083811015612a45578181015183820152602001612a2d565b509392505050565b60408051808201909152600d81527f4d4154485f4449565f5a45524f0000000000000000000000000000000000000060208201526000908190818411612c3a5760405160e560020a62461bcd02815260040180806020018281038252838181518152602001915080519060200190808383600083811015612a45578181015183820152602001612a2d565b508284811515612c4657fe5b04949350505050565b60408051808201909152601181527f4d4154485f4144445f4f564552464c4f5700000000000000000000000000000060208201526000908383019084821015612ba75760405160e560020a62461bcd02815260040180806020018281038252838181518152602001915080519060200190808383600083811015612a45578181015183820152602001612a2d565b60008111612d35576040805160e560020a62461bcd02815260206004820152600e60248201527f43616e6e6f74207374616b652030000000000000000000000000000000000000604482015290519081900360640190fd5b601354612d48908263ffffffff612c4f16565b601355600160a060020a038216600090815260146020526040902054612d74908263ffffffff612c4f16565b600160a060020a0380841660009081526014602090815260408083209490945560095484517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810187905294519316936323b872dd9360648083019491928390030190829087803b158015612df857600080fd5b505af1158015612e0c573d6000803e3d6000fd5b505050506040513d6020811015612e2257600080fd5b50511515612e7a576040805160e560020a62461bcd02815260206004820152600260248201527f2174000000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b604080518281529051600160a060020a038416917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a25050565b60006122d96064610b44600754670de0b6b3a7640000612afc90919063ffffffff16565b601554604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015291516000939290921691839182918291829186916370a0823191602480830192602092919082900301818787803b158015612f5557600080fd5b505af1158015612f69573d6000803e3d6000fd5b505050506040513d6020811015612f7f57600080fd5b5051604080517f18160ddd0000000000000000000000000000000000000000000000000000000081529051919550600160a060020a038716916318160ddd916004808201926020929091908290030181600087803b158015612fe057600080fd5b505af1158015612ff4573d6000803e3d6000fd5b505050506040513d602081101561300a57600080fd5b50516040805160e360020a63142a7ce1028152600160a060020a038a8116600483015291519295509087169163a153e708916024808201926020929091908290030181600087803b15801561305e57600080fd5b505af1158015613072573d6000803e3d6000fd5b505050506040513d602081101561308857600080fd5b50519150821580613097575083155b156130ab576130a4612ebd565b95506131a6565b6131826064610b4461316685610b4489611b698a610b448e600160a060020a031663ca5c7b916040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561311957600080fd5b505af115801561312d573d6000803e3d6000fd5b505050506040513d602081101561314357600080fd5b5051600754611b6990670de0b6b3a764000090829060649063ffffffff6129b816565b600754611b8590670de0b6b3a76400009063ffffffff612afc16565b9050670de0b6b3a764000081106131a157670de0b6b3a76400006131a3565b805b95505b5050505050919050565b60028054600160a060020a0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60408051808201909152600080825260208201529056005265656e7472616e637947756172643a207265656e7472616e742063616c6c0021626f6f737444656c7461000000000000000000000000000000000000000000a165627a7a7230582052938fb1667cfedf5179e88ee87d253b1439fc51e96a86b3c30d636814ae080c0029

Deployed Bytecode

0x6080604052600436106102185763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416628cc262811461021d57806301d8d119146102505780630700037d14610267578063160292b41461028857806316c38b3c146102c557806318160ddd146102df57806319762143146102f45780632ee4090814610315578063386a9525146103395780633c6b16ab1461034e5780633d18b912146103665780633d74bb091461037b5780633e5beab9146103905780633fc6df6e146103c557806349c48f4b146103f65780635c975abb146104175780635cd7202e1461042c578063601f3cef1461045257806361d027b31461046a5780636c1f75081461047f57806370a0823114610497578063715018a6146104b857806372f702f3146104cd5780637467f7b9146104e25780637b0a47ee146104fa57806380faa57d1461050f57806387adc134146105245780638b876347146105b35780638da5cb5b146105d45780638eda7063146105e9578063990c214b146105fe578063a5c573a814610616578063a694fc3a14610637578063a79f4d581461064f578063ad36e49714610670578063b611709714610685578063c8f33c911461069a578063cd3daf9d146106af578063d1af0c7d146106c4578063df136d65146106d9578063ebe2b12b146106ee578063f2fde38b14610703578063fc0c546a14610724578063fc157cb414610739575b600080fd5b34801561022957600080fd5b5061023e600160a060020a036004351661074e565b60408051918252519081900360200190f35b34801561025c57600080fd5b50610265610782565b005b34801561027357600080fd5b5061023e600160a060020a0360043516610d78565b34801561029457600080fd5b506102ac600435600160a060020a0360243516610d8a565b6040805192835260208301919091528051918290030190f35b3480156102d157600080fd5b506102656004351515610ec5565b3480156102eb57600080fd5b5061023e610f3f565b34801561030057600080fd5b50610265600160a060020a0360043516610f45565b34801561032157600080fd5b50610265600160a060020a0360043516602435610fc7565b34801561034557600080fd5b5061023e611308565b34801561035a57600080fd5b5061026560043561130e565b34801561037257600080fd5b506102656116bb565b34801561038757600080fd5b5061023e6119a5565b34801561039c57600080fd5b506103b1600160a060020a03600435166119ab565b604080519115158252519081900360200190f35b3480156103d157600080fd5b506103da6119c0565b60408051600160a060020a039092168252519081900360200190f35b34801561040257600080fd5b5061023e600160a060020a03600435166119cf565b34801561042357600080fd5b506103b1611b9d565b34801561043857600080fd5b50610265600160a060020a03600435166024351515611ba6565b34801561045e57600080fd5b50610265600435611c24565b34801561047657600080fd5b506103da611d0b565b34801561048b57600080fd5b50610265600435611d1a565b3480156104a357600080fd5b5061023e600160a060020a0360043516611dd1565b3480156104c457600080fd5b50610265611df0565b3480156104d957600080fd5b506103da611e4f565b3480156104ee57600080fd5b50610265600435611e5e565b34801561050657600080fd5b5061023e6122c5565b34801561051b57600080fd5b5061023e6122cb565b34801561053057600080fd5b5060408051610104356004818101356020818102858101820190965281855261026595600160a060020a038435811696602480358316976044358416976064359760843586169760a43587169760c4359097169660e435963696949561012495919491019290918291850190849080828437509497506122de9650505050505050565b3480156105bf57600080fd5b5061023e600160a060020a0360043516612572565b3480156105e057600080fd5b506103da612584565b3480156105f557600080fd5b5061023e612593565b34801561060a57600080fd5b50610265600435612599565b34801561062257600080fd5b50610265600160a060020a03600435166125f1565b34801561064357600080fd5b50610265600435612673565b34801561065b57600080fd5b506102ac600160a060020a036004351661287a565b34801561067c57600080fd5b5061023e612893565b34801561069157600080fd5b506103da612899565b3480156106a657600080fd5b5061023e6128a8565b3480156106bb57600080fd5b5061023e6128ae565b3480156106d057600080fd5b506103da6128c6565b3480156106e557600080fd5b5061023e6128d5565b3480156106fa57600080fd5b5061023e6128db565b34801561070f57600080fd5b50610265600160a060020a03600435166128e1565b34801561073057600080fd5b506103da61299d565b34801561074557600080fd5b5061023e6129ac565b600080600061076d600d546107616122cb565b9063ffffffff6129b816565b91506107798285610d8a565b50949350505050565b6000806000806002600154141515156107d3576040805160e560020a62461bcd02815260206004820152601f6024820152600080516020613227833981519152604482015290519081900360640190fd5b60026001553360008080806107e66122cb565b93506107fd600d54856129b890919063ffffffff16565b925061080883612a8f565b600e55600d849055600160a060020a0385161561092b5761082a600086610d8a565b600160a060020a0387166000908152601260209081526040808320859055600e546011909252822055919350915081111561092b576009546003546040805160e060020a63a9059cbb028152600160a060020a039283166004820152602481018590529051919092169163a9059cbb9160448083019260209291908290030181600087803b1580156108bb57600080fd5b505af11580156108cf573d6000803e3d6000fd5b505050506040513d60208110156108e557600080fd5b5051151561092b576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020613247833981519152604482015290519081900360640190fd5b33600081815260056020908152604080832054601554825160e360020a63142a7ce102815260048101969096529151909d50600160a060020a039091169363a153e7089360248083019493928390030190829087803b15801561098d57600080fd5b505af11580156109a1573d6000803e3d6000fd5b505050506040513d60208110156109b757600080fd5b5051336000908152601460205260409020549098506109e7908a906109e2908b63ffffffff6129b816565b612ae4565b6013549099506109fd908a63ffffffff6129b816565b60135533600090815260146020526040902054610a20908a63ffffffff6129b816565b336000908152601460209081526040808320939093556005905220600101544210610b23576009546040805160e060020a63a9059cbb028152336004820152602481018c90529051600160a060020a039092169163a9059cbb916044808201926020929091908290030181600087803b158015610a9c57600080fd5b505af1158015610ab0573d6000803e3d6000fd5b505050506040513d6020811015610ac657600080fd5b50511515610b1e576040805160e560020a62461bcd02815260206004820152600860248201527f2174426f6e646564000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b610d1c565b610b50670de0b6b3a7640000610b446006548c612afc90919063ffffffff16565b9063ffffffff612baf16565b9650610b62898863ffffffff6129b816565b6009546040805160e060020a63a9059cbb028152336004820152602481018490529051929850600160a060020a039091169163a9059cbb916044808201926020929091908290030181600087803b158015610bbc57600080fd5b505af1158015610bd0573d6000803e3d6000fd5b505050506040513d6020811015610be657600080fd5b50511515610c3e576040805160e560020a62461bcd02815260206004820152601360248201527f2174426f6e6465645769746850656e616c747900000000000000000000000000604482015290519081900360640190fd5b6009546003546040805160e060020a63a9059cbb028152600160a060020a039283166004820152602481018b90529051919092169163a9059cbb9160448083019260209291908290030181600087803b158015610c9a57600080fd5b505af1158015610cae573d6000803e3d6000fd5b505050506040513d6020811015610cc457600080fd5b50511515610d1c576040805160e560020a62461bcd02815260206004820152600960248201527f217450656e616c74790000000000000000000000000000000000000000000000604482015290519081900360640190fd5b3360008181526005602090815260408083208381556001019290925581518c815291517f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59281900390910190a250506001805550505050505050565b60126020526000908152604090205481565b600080600080600080610d9c876119cf565b9350670de0b6b3a7640000841115610dfe576040805160e560020a62461bcd02815260206004820152600d60248201527f626164426f6f73744c6576656c00000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038716600090815260116020526040902054610e5b90670de0b6b3a764000090610b4490610e36906107618d612a8f565b600160a060020a038b166000908152601460205260409020549063ffffffff612afc16565b9250610e79670de0b6b3a7640000610b44858763ffffffff612afc16565b9150610e8b838363ffffffff6129b816565b600160a060020a038816600090815260126020526040902054909150610eb890839063ffffffff612c4f16565b9890975095505050505050565b6000546101009004600160a060020a03163314610f2c576040805160e560020a62461bcd02815260206004820152600760248201527f2170617573657200000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6000805460ff1916911515919091179055565b60135481565b33610f4e612584565b600160a060020a031614610f98576040805160e560020a62461bcd028152602060048201526006602482015260d160020a6510b7bbb732b902604482015290519081900360640190fd5b600f805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b610fcf61320f565b60015460021415611018576040805160e560020a62461bcd02815260206004820152601f6024820152600080516020613227833981519152604482015290519081900360640190fd5b600260015560005460ff1615611078576040805160e560020a62461bcd02815260206004820152600660248201527f7061757365640000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b826000806000806110876122cb565b935061109e600d54856129b890919063ffffffff16565b92506110a983612a8f565b600e55600d849055600160a060020a038516156111cc576110cb600086610d8a565b600160a060020a0387166000908152601260209081526040808320859055600e54601190925282205591935091508111156111cc576009546003546040805160e060020a63a9059cbb028152600160a060020a039283166004820152602481018590529051919092169163a9059cbb9160448083019260209291908290030181600087803b15801561115c57600080fd5b505af1158015611170573d6000803e3d6000fd5b505050506040513d602081101561118657600080fd5b505115156111cc576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020613247833981519152604482015290519081900360640190fd5b3360009081526004602052604090205460ff161515611235576040805160e560020a62461bcd02815260206004820152601060248201527f7374616b654e6f74417070726f76656400000000000000000000000000000000604482015290519081900360640190fd5b61123f8888612cdd565b600160a060020a03881660009081526005602090815260409182902082518084019093528054835260010154908201819052909650421061129a57600160a060020a03881660009081526005602052604090208790556112c6565b85516112ac908863ffffffff612c4f16565b600160a060020a0389166000908152600560205260409020555b6010546112da90429063ffffffff612c4f16565b600160a060020a03909816600090815260056020526040902060019081019890985550505093805550505050565b600c5481565b600f5460009081908190600160a060020a0316331461139d576040805160e560020a62461bcd02815260206004820152602a60248201527f43616c6c6572206973206e6f742052657761726473446973747269627574696f60448201527f6e20636f6e747261637400000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008060008060006113ad6122cb565b93506113c4600d54856129b890919063ffffffff16565b92506113cf83612a8f565b600e55600d849055600160a060020a038516156114f2576113f1600086610d8a565b600160a060020a0387166000908152601260209081526040808320859055600e54601190925282205591935091508111156114f2576009546003546040805160e060020a63a9059cbb028152600160a060020a039283166004820152602481018590529051919092169163a9059cbb9160448083019260209291908290030181600087803b15801561148257600080fd5b505af1158015611496573d6000803e3d6000fd5b505050506040513d60208110156114ac57600080fd5b505115156114f2576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020613247833981519152604482015290519081900360640190fd5b600a54421061151757600c5461150f908a9063ffffffff612baf16565b600b5561155f565b600a5461152a904263ffffffff6129b816565b9750611541600b5489612afc90919063ffffffff16565b600c5490975061155b90610b448b8a63ffffffff612c4f16565b600b555b600854604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b1580156115c557600080fd5b505af11580156115d9573d6000803e3d6000fd5b505050506040513d60208110156115ef57600080fd5b5051600c5490965061160890879063ffffffff612baf16565b600b541115611661576040805160e560020a62461bcd02815260206004820152601860248201527f50726f76696465642072657761726420746f6f20686967680000000000000000604482015290519081900360640190fd5b42600d819055600c5461167a919063ffffffff612c4f16565b600a55604080518a815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a1505050505050505050565b60015460009060021415611707576040805160e560020a62461bcd02815260206004820152601f6024820152600080516020613227833981519152604482015290519081900360640190fd5b600260015533600080808061171a6122cb565b9350611731600d54856129b890919063ffffffff16565b925061173c83612a8f565b600e55600d849055600160a060020a0385161561185f5761175e600086610d8a565b600160a060020a0387166000908152601260209081526040808320859055600e546011909252822055919350915081111561185f576009546003546040805160e060020a63a9059cbb028152600160a060020a039283166004820152602481018590529051919092169163a9059cbb9160448083019260209291908290030181600087803b1580156117ef57600080fd5b505af1158015611803573d6000803e3d6000fd5b505050506040513d602081101561181957600080fd5b5051151561185f576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020613247833981519152604482015290519081900360640190fd5b33600090815260126020526040812054965086111561199957336000818152601260209081526040808320839055600854815160e060020a63a9059cbb0281526004810195909552602485018b90529051600160a060020a039091169363a9059cbb9360448083019493928390030190829087803b1580156118e057600080fd5b505af11580156118f4573d6000803e3d6000fd5b505050506040513d602081101561190a57600080fd5b50511515611962576040805160e560020a62461bcd02815260206004820152600260248201527f2174000000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60408051878152905133917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b50506001805550505050565b60065481565b60046020526000908152604090205460ff1681565b600f54600160a060020a031681565b6015546040805160e360020a63142a7ce1028152600160a060020a03848116600483015291516000939290921691839182918291859163a153e7089160248082019260209290919082900301818787803b158015611a2c57600080fd5b505af1158015611a40573d6000803e3d6000fd5b505050506040513d6020811015611a5657600080fd5b5051600160a060020a0387166000908152601460205260409020549093509150811580611a81575082155b15611a9557611a8e612ebd565b9450611b94565b601654604080517f713b66a4000000000000000000000000000000000000000000000000000000008152600160a060020a0389811660048301529151919092169163713b66a49160248083019260209291908290030181600087803b158015611afd57600080fd5b505af1158015611b11573d6000803e3d6000fd5b505050506040513d6020811015611b2757600080fd5b5051611b3b57611b3686612ee1565b611b45565b670de0b6b3a76400005b9050611b9182610b44611b75611b61838863ffffffff6129b816565b611b69612ebd565b9063ffffffff612afc16565b611b85858863ffffffff612afc16565b9063ffffffff612c4f16565b94505b50505050919050565b60005460ff1681565b33611baf612584565b600160a060020a031614611bf9576040805160e560020a62461bcd028152602060048201526006602482015260d160020a6510b7bbb732b902604482015290519081900360640190fd5b600160a060020a03919091166000908152600460205260409020805460ff1916911515919091179055565b33611c2d612584565b600160a060020a031614611c77576040805160e560020a62461bcd028152602060048201526006602482015260d160020a6510b7bbb732b902604482015290519081900360640190fd5b6007819055600081118015611c8c5750606481105b1515611d08576040805160e560020a62461bcd02815260206004820152602160248201527f696e76616c6964496e76657273654d6178426f6f7374436f656666696369656e60448201527f7400000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b50565b600354600160a060020a031681565b33611d23612584565b600160a060020a031614611d6d576040805160e560020a62461bcd028152602060048201526006602482015260d160020a6510b7bbb732b902604482015290519081900360640190fd5b6006819055670de0b6b3a76400008110611d08576040805160e560020a62461bcd02815260206004820152600a60248201527f746f6f4869676850637400000000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0381166000908152601460205260409020545b919050565b33611df9612584565b600160a060020a031614611e43576040805160e560020a62461bcd028152602060048201526006602482015260d160020a6510b7bbb732b902604482015290519081900360640190fd5b611e4d60006131b0565b565b600954600160a060020a031681565b60015460009060021415611eaa576040805160e560020a62461bcd02815260206004820152601f6024820152600080516020613227833981519152604482015290519081900360640190fd5b6002600155336000808080611ebd6122cb565b9350611ed4600d54856129b890919063ffffffff16565b9250611edf83612a8f565b600e55600d849055600160a060020a0385161561200257611f01600086610d8a565b600160a060020a0387166000908152601260209081526040808320859055600e5460119092528220559193509150811115612002576009546003546040805160e060020a63a9059cbb028152600160a060020a039283166004820152602481018590529051919092169163a9059cbb9160448083019260209291908290030181600087803b158015611f9257600080fd5b505af1158015611fa6573d6000803e3d6000fd5b505050506040513d6020811015611fbc57600080fd5b50511515612002576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020613247833981519152604482015290519081900360640190fd5b6000871161205a576040805160e560020a62461bcd02815260206004820152600a60248201527f2177697468647261773000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6015546040805160e360020a63142a7ce10281523360048201529051600160a060020a039092169163a153e708916024808201926020929091908290030181600087803b1580156120aa57600080fd5b505af11580156120be573d6000803e3d6000fd5b505050506040513d60208110156120d457600080fd5b505133600090815260056020908152604080832054601490925290912054919750889161210c9190610761908a63ffffffff6129b816565b1015612162576040805160e560020a62461bcd02815260206004820152601560248201527f657363726f7720616d6f756e74206661696c7572650000000000000000000000604482015290519081900360640190fd5b601354612175908863ffffffff6129b816565b60135533600090815260146020526040902054612198908863ffffffff6129b816565b33600081815260146020908152604080832094909455600954845160e060020a63a9059cbb0281526004810194909452602484018c90529351600160a060020a039094169363a9059cbb93604480820194918390030190829087803b15801561220057600080fd5b505af1158015612214573d6000803e3d6000fd5b505050506040513d602081101561222a57600080fd5b50511515612282576040805160e560020a62461bcd02815260206004820152600260248201527f2174000000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60408051888152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a25050600180555050505050565b600b5481565b60006122d942600a54612ae4565b905090565b60025460009081907501000000000000000000000000000000000000000000900460ff1680612328575060025474010000000000000000000000000000000000000000900460ff16155b151561237e576040805160e560020a62461bcd02815260206004820152601260248201527f616c7265616479496e697469616c697a65640000000000000000000000000000604482015290519081900360640190fd5b506002547501000000000000000000000000000000000000000000900460ff1615801561240e576002805474ff00000000000000000000000000000000000000001975ff0000000000000000000000000000000000000000001990911675010000000000000000000000000000000000000000001716740100000000000000000000000000000000000000001790555b6008805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a038d8116919091179092556009805482168c8416179055600f805482168e8416179055600c8a90556015805482168a841617905560168054821689841617905560038054909116918716919091179055600084116124da576040805160e560020a62461bcd02815260206004820152600f60248201527f626164426f6e644475726174696f6e0000000000000000000000000000000000604482015290519081900360640190fd5b6010849055600091505b825182101561253f57600160046000858581518110151561250157fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff1916911515919091179055600191909101906124e4565b8015612565576002805475ff000000000000000000000000000000000000000000191690555b5050505050505050505050565b60116020526000908152604090205481565b600254600160a060020a031690565b60105481565b336125a2612584565b600160a060020a0316146125ec576040805160e560020a62461bcd028152602060048201526006602482015260d160020a6510b7bbb732b902604482015290519081900360640190fd5b601055565b336125fa612584565b600160a060020a031614612644576040805160e560020a62461bcd028152602060048201526006602482015260d160020a6510b7bbb732b902604482015290519081900360640190fd5b6016805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600154600214156126bc576040805160e560020a62461bcd02815260206004820152601f6024820152600080516020613227833981519152604482015290519081900360640190fd5b600260015560005460ff161561271c576040805160e560020a62461bcd02815260206004820152600660248201527f7061757365640000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b3360008060008061272b6122cb565b9350612742600d54856129b890919063ffffffff16565b925061274d83612a8f565b600e55600d849055600160a060020a038516156128705761276f600086610d8a565b600160a060020a0387166000908152601260209081526040808320859055600e5460119092528220559193509150811115612870576009546003546040805160e060020a63a9059cbb028152600160a060020a039283166004820152602481018590529051919092169163a9059cbb9160448083019260209291908290030181600087803b15801561280057600080fd5b505af1158015612814573d6000803e3d6000fd5b505050506040513d602081101561282a57600080fd5b50511515612870576040805160e560020a62461bcd02815260206004820152600b6024820152600080516020613247833981519152604482015290519081900360640190fd5b6119993387612cdd565b6005602052600090815260409020805460019091015482565b60075481565b601654600160a060020a031681565b600d5481565b60006122d96128c1600d546107616122cb565b612a8f565b600854600160a060020a031681565b600e5481565b600a5481565b336128ea612584565b600160a060020a031614612934576040805160e560020a62461bcd028152602060048201526006602482015260d160020a6510b7bbb732b902604482015290519081900360640190fd5b600160a060020a0381161515612994576040805160e560020a62461bcd02815260206004820152600660248201527f6f776e6572300000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611d08816131b0565b601554600160a060020a031681565b670de0b6b3a764000081565b60408051808201909152601281527f4d4154485f5355425f554e444552464c4f5700000000000000000000000000006020820152600090819084841115612a805760405160e560020a62461bcd0281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612a45578181015183820152602001612a2d565b50505050905090810190601f168015612a725780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050808203805b5092915050565b600060135460001415612aa55750600e54611deb565b612ade612acf601354610b44670de0b6b3a7640000611b69600b5488612afc90919063ffffffff16565b600e549063ffffffff612c4f16565b92915050565b6000818310612af35781612af5565b825b9392505050565b600080831515612b0f5760009150612a88565b50828202828482811515612b1f57fe5b60408051808201909152601181527f4d4154485f4d554c5f4f564552464c4f5700000000000000000000000000000060208201529291900414612ba75760405160e560020a62461bcd02815260040180806020018281038252838181518152602001915080519060200190808383600083811015612a45578181015183820152602001612a2d565b509392505050565b60408051808201909152600d81527f4d4154485f4449565f5a45524f0000000000000000000000000000000000000060208201526000908190818411612c3a5760405160e560020a62461bcd02815260040180806020018281038252838181518152602001915080519060200190808383600083811015612a45578181015183820152602001612a2d565b508284811515612c4657fe5b04949350505050565b60408051808201909152601181527f4d4154485f4144445f4f564552464c4f5700000000000000000000000000000060208201526000908383019084821015612ba75760405160e560020a62461bcd02815260040180806020018281038252838181518152602001915080519060200190808383600083811015612a45578181015183820152602001612a2d565b60008111612d35576040805160e560020a62461bcd02815260206004820152600e60248201527f43616e6e6f74207374616b652030000000000000000000000000000000000000604482015290519081900360640190fd5b601354612d48908263ffffffff612c4f16565b601355600160a060020a038216600090815260146020526040902054612d74908263ffffffff612c4f16565b600160a060020a0380841660009081526014602090815260408083209490945560095484517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810187905294519316936323b872dd9360648083019491928390030190829087803b158015612df857600080fd5b505af1158015612e0c573d6000803e3d6000fd5b505050506040513d6020811015612e2257600080fd5b50511515612e7a576040805160e560020a62461bcd02815260206004820152600260248201527f2174000000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b604080518281529051600160a060020a038416917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a25050565b60006122d96064610b44600754670de0b6b3a7640000612afc90919063ffffffff16565b601554604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015291516000939290921691839182918291829186916370a0823191602480830192602092919082900301818787803b158015612f5557600080fd5b505af1158015612f69573d6000803e3d6000fd5b505050506040513d6020811015612f7f57600080fd5b5051604080517f18160ddd0000000000000000000000000000000000000000000000000000000081529051919550600160a060020a038716916318160ddd916004808201926020929091908290030181600087803b158015612fe057600080fd5b505af1158015612ff4573d6000803e3d6000fd5b505050506040513d602081101561300a57600080fd5b50516040805160e360020a63142a7ce1028152600160a060020a038a8116600483015291519295509087169163a153e708916024808201926020929091908290030181600087803b15801561305e57600080fd5b505af1158015613072573d6000803e3d6000fd5b505050506040513d602081101561308857600080fd5b50519150821580613097575083155b156130ab576130a4612ebd565b95506131a6565b6131826064610b4461316685610b4489611b698a610b448e600160a060020a031663ca5c7b916040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561311957600080fd5b505af115801561312d573d6000803e3d6000fd5b505050506040513d602081101561314357600080fd5b5051600754611b6990670de0b6b3a764000090829060649063ffffffff6129b816565b600754611b8590670de0b6b3a76400009063ffffffff612afc16565b9050670de0b6b3a764000081106131a157670de0b6b3a76400006131a3565b805b95505b5050505050919050565b60028054600160a060020a0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60408051808201909152600080825260208201529056005265656e7472616e637947756172643a207265656e7472616e742063616c6c0021626f6f737444656c7461000000000000000000000000000000000000000000a165627a7a7230582052938fb1667cfedf5179e88ee87d253b1439fc51e96a86b3c30d636814ae080c0029

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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