ETH Price: $2,056.65 (-2.52%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Unstake118600782021-02-15 7:46:521871 days ago1613375212IN
0x574D80f0...ABD7edEb0
0 ETH0.0175468896
Unstake118058202021-02-06 23:48:521880 days ago1612655332IN
0x574D80f0...ABD7edEb0
0 ETH0.02098948106
Unstake117817742021-02-03 6:49:211883 days ago1612334961IN
0x574D80f0...ABD7edEb0
0 ETH0.02396114121
Unstake117723702021-02-01 20:03:381885 days ago1612209818IN
0x574D80f0...ABD7edEb0
0 ETH0.03109008157
Unstake117693252021-02-01 8:46:381885 days ago1612169198IN
0x574D80f0...ABD7edEb0
0 ETH0.01053071116.00000134
Unstake117693252021-02-01 8:46:381885 days ago1612169198IN
0x574D80f0...ABD7edEb0
0 ETH0.0192073597.00000156
Unstake117285402021-01-26 2:03:211892 days ago1611626601IN
0x574D80f0...ABD7edEb0
0 ETH0.0179981189
Unstake116774542021-01-18 5:51:281899 days ago1610949088IN
0x574D80f0...ABD7edEb0
0 ETH0.010686440.4
Unstake115184452020-12-24 20:19:581924 days ago1608841198IN
0x574D80f0...ABD7edEb0
0 ETH0.0062355831
Stake114994042020-12-21 22:11:211927 days ago1608588681IN
0x574D80f0...ABD7edEb0
0 ETH0.0087073131
Unstake114879592020-12-20 4:09:491928 days ago1608437389IN
0x574D80f0...ABD7edEb0
0 ETH0.0064844430
Unstake114709112020-12-17 13:26:331931 days ago1608211593IN
0x574D80f0...ABD7edEb0
0 ETH0.0110631455
Unstake114593892020-12-15 18:54:111933 days ago1608058451IN
0x574D80f0...ABD7edEb0
0 ETH0.0101589547
Stake114568822020-12-15 9:44:101933 days ago1608025450IN
0x574D80f0...ABD7edEb0
0 ETH0.0196616770
Unstake114539512020-12-14 22:52:501934 days ago1607986370IN
0x574D80f0...ABD7edEb0
0 ETH0.0081249742.75
Stake114316642020-12-11 12:36:391937 days ago1607690199IN
0x574D80f0...ABD7edEb0
0 ETH0.0078079127.79913
Unstake114169942020-12-09 6:13:321939 days ago1607494412IN
0x574D80f0...ABD7edEb0
0 ETH0.0084482142
Stake114149872020-12-08 22:55:491940 days ago1607468149IN
0x574D80f0...ABD7edEb0
0 ETH0.0092686733
Unstake114132112020-12-08 16:30:201940 days ago1607445020IN
0x574D80f0...ABD7edEb0
0 ETH0.013264370
Unstake114131972020-12-08 16:26:361940 days ago1607444796IN
0x574D80f0...ABD7edEb0
0 ETH0.015086175
Unstake114124192020-12-08 13:32:081940 days ago1607434328IN
0x574D80f0...ABD7edEb0
0 ETH0.0105912549
Stake113774402020-12-03 4:25:341945 days ago1606969534IN
0x574D80f0...ABD7edEb0
0 ETH0.0056173820
Stake113440862020-11-28 1:41:551951 days ago1606527715IN
0x574D80f0...ABD7edEb0
0 ETH0.0042132115
Unstake113353522020-11-26 17:22:431952 days ago1606411363IN
0x574D80f0...ABD7edEb0
0 ETH0.02579924128.26
Stake112866372020-11-19 5:58:461959 days ago1605765526IN
0x574D80f0...ABD7edEb0
0 ETH0.0078646628
View all transactions

Latest 3 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
-112206362020-11-09 2:39:171970 days ago1604889557
0x574D80f0...ABD7edEb0
 Contract Creation0 ETH
-112206362020-11-09 2:39:171970 days ago1604889557
0x574D80f0...ABD7edEb0
 Contract Creation0 ETH
-112206362020-11-09 2:39:171970 days ago1604889557
0x574D80f0...ABD7edEb0
 Contract Creation0 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

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

Contract Source Code Verified (Exact Match)

Contract Name:
Orchard

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2020-12-07
*/

pragma solidity 0.5.17;

/**
 * @title SafeMath
 * @dev Math operations with safety checks that revert on error
 */
 
library SafeMath {

  /**
  * @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);

    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); // 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);
    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);

    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);
    return a % b;
  }
}

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
interface IERC20 {
  function totalSupply() external view returns (uint256);

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

  function allowance(address owner, address spender)
    external view returns (uint256);

  function transfer(address to, uint256 value) external returns (bool);

  function approve(address spender, uint256 value)
    external returns (bool);

  function transferFrom(address from, address to, uint256 value)
    external returns (bool);

  event Transfer(
    address indexed from,
    address indexed to,
    uint256 value
  );

  event Approval(
    address indexed owner,
    address indexed spender,
    uint256 value
  );
}


/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address private _owner;

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


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor() public {
    _owner = msg.sender;
  }

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

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(isOwner());
    _;
  }

  /**
   * @return true if `msg.sender` is the owner of the contract.
   */
  function isOwner() public view returns(bool) {
    return msg.sender == _owner;
  }

  /**
   * @dev Allows the current owner to relinquish control of the contract.
   * @notice Renouncing to ownership will leave the contract without an owner.
   * It will not be possible to call the functions with the `onlyOwner`
   * modifier anymore.
   */
  function renounceOwnership() public onlyOwner {
    emit OwnershipRenounced(_owner);
    _owner = address(0);
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    _transferOwnership(newOwner);
  }

  /**
   * @dev Transfers control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function _transferOwnership(address newOwner) internal {
    require(newOwner != address(0));
    emit OwnershipTransferred(_owner, newOwner);
    _owner = newOwner;
  }
}

contract IStaking {
    event Staked(address indexed user, uint256 amount, uint256 total, bytes data);
    event Unstaked(address indexed user, uint256 amount, uint256 total, bytes data);

    function stake(uint256 amount, bytes calldata data) external;
    function stakeFor(address user, uint256 amount, bytes calldata data) external;
    function unstake(uint256 amount, bytes calldata data) external;
    function totalStakedFor(address addr) public view returns (uint256);
    function totalStaked() public view returns (uint256);
    function token() external view returns (address);

    /**
     * @return False. This application does not support staking history.
     */
    function supportsHistory() external pure returns (bool) {
        return false;
    }
}

contract TokenPool is Ownable {
    IERC20 public token;

    constructor(IERC20 _token) public {
        token = _token;
    }

    function balance() public view returns (uint256) {
        return token.balanceOf(address(this));
    }

    function transfer(address to, uint256 value) external onlyOwner returns (bool) {
        return token.transfer(to, value);
    }

    function rescueFunds(address tokenToRescue, address to, uint256 amount) external onlyOwner returns (bool) {
        require(address(token) != tokenToRescue, 'TokenPool: Cannot claim token held by the contract');

        return IERC20(tokenToRescue).transfer(to, amount);
    }
}


/**
 * @title Orchard
 * @dev A smart-contract based mechanism to distribute tokens over time, based on the Ampleforth Geyser.
 *
 *      Distribution tokens are added to a locked pool in the contract and become unlocked over time
 *      according to a once-configurable unlock schedule. Once unlocked, they are available to be
 *      claimed by users.
 *
 *      A user may deposit tokens to accrue ownership share over the unlocked pool. This owner share
 *      is a function of the number of tokens deposited as well as the length of time deposited.
 *      Specifically, a user's share of the currently-unlocked pool equals their "deposit-seconds"
 *      divided by the global "deposit-seconds". This aligns the new token distribution with long
 *      term supporters of the project, addressing one of the major drawbacks of simple airdrops.
 *
 *      More background and motivation available at:
 *      https://github.com/ampleforth/RFCs/blob/master/RFCs/rfc-1.md
 */
contract Orchard is IStaking, Ownable {
    using SafeMath for uint256;

    event Staked(address indexed user, uint256 amount, uint256 total, bytes data);
    event Unstaked(address indexed user, uint256 amount, uint256 total, bytes data);
    event TokensClaimed(address indexed user, uint256 amount);
    event TokensLocked(uint256 amount, uint256 durationSec, uint256 total);
    // amount: Unlocked tokens, total: Total locked tokens
    event TokensUnlocked(uint256 amount, uint256 total);

    TokenPool public _stakingPool;
    TokenPool public _unlockedPool;
    TokenPool public _lockedPool;

    //
    // Time-bonus params
    //
    uint256 public constant BONUS_DECIMALS = 2;
    uint256 public startBonus = 0;
    uint256 public bonusPeriodSec = 0;

    //
    // Global accounting state
    //
    uint256 public totalLockedShares = 0;
    uint256 public totalStakingShares = 0;
    uint256 private _totalStakingShareSeconds = 0;
    uint256 private _lastAccountingTimestampSec = now;
    uint256 private _maxUnlockSchedules = 0;
    uint256 private _initialSharesPerToken = 0;

    //
    // User accounting state
    //
    // Represents a single stake for a user. A user may have multiple.
    struct Stake {
        uint256 stakingShares;
        uint256 timestampSec;
    }

    // Caches aggregated values from the User->Stake[] map to save computation.
    // If lastAccountingTimestampSec is 0, there's no entry for that user.
    struct UserTotals {
        uint256 stakingShares;
        uint256 stakingShareSeconds;
        uint256 lastAccountingTimestampSec;
    }

    // Aggregated staking values per user
    mapping(address => UserTotals) private _userTotals;

    // The collection of stakes for each user. Ordered by timestamp, earliest to latest.
    mapping(address => Stake[]) private _userStakes;

    //
    // Locked/Unlocked Accounting state
    //
    struct UnlockSchedule {
        uint256 initialLockedShares;
        uint256 unlockedShares;
        uint256 lastUnlockTimestampSec;
        uint256 endAtSec;
        uint256 durationSec;
    }

    UnlockSchedule[] public unlockSchedules;

    /**
     * @param stakingToken The token users deposit as stake.
     * @param distributionToken The token users receive as they unstake.
     * @param maxUnlockSchedules Max number of unlock stages, to guard against hitting gas limit.
     * @param startBonus_ Starting time bonus, BONUS_DECIMALS fixed point.
     *                    e.g. 25% means user gets 25% of max distribution tokens.
     * @param bonusPeriodSec_ Length of time for bonus to increase linearly to max.
     * @param initialSharesPerToken Number of shares to mint per staking token on first stake.
     */
    constructor(IERC20 stakingToken, IERC20 distributionToken, uint256 maxUnlockSchedules,
                uint256 startBonus_, uint256 bonusPeriodSec_, uint256 initialSharesPerToken) public {
        // The start bonus must be some fraction of the max. (i.e. <= 100%)
        require(startBonus_ <= 10**BONUS_DECIMALS, 'Orchard: start bonus too high');
        // If no period is desired, instead set startBonus = 100%
        // and bonusPeriod to a small value like 1sec.
        require(bonusPeriodSec_ != 0, 'Orchard: bonus period is zero');
        require(initialSharesPerToken > 0, 'Orchard: initialSharesPerToken is zero');

        _stakingPool = new TokenPool(stakingToken);
        _unlockedPool = new TokenPool(distributionToken);
        _lockedPool = new TokenPool(distributionToken);
        startBonus = startBonus_;
        bonusPeriodSec = bonusPeriodSec_;
        _maxUnlockSchedules = maxUnlockSchedules;
        _initialSharesPerToken = initialSharesPerToken;
    }

    /**
     * @return The token users deposit as stake.
     */
    function getStakingToken() public view returns (IERC20) {
        return _stakingPool.token();
    }

    /**
     * @return The token users receive as they unstake.
     */
    function getDistributionToken() public view returns (IERC20) {
        assert(_unlockedPool.token() == _lockedPool.token());
        return _unlockedPool.token();
    }

    /**
     * @dev Transfers amount of deposit tokens from the user.
     * @param amount Number of deposit tokens to stake.
     * @param data Not used.
     */
    function stake(uint256 amount, bytes calldata data) external {
        _stakeFor(msg.sender, msg.sender, amount);
    }

    /**
     * @dev Transfers amount of deposit tokens from the caller on behalf of user.
     * @param user User address who gains credit for this stake operation.
     * @param amount Number of deposit tokens to stake.
     * @param data Not used.
     */
    function stakeFor(address user, uint256 amount, bytes calldata data) external onlyOwner {
        _stakeFor(msg.sender, user, amount);
    }

    /**
     * @dev Private implementation of staking methods.
     * @param staker User address who deposits tokens to stake.
     * @param beneficiary User address who gains credit for this stake operation.
     * @param amount Number of deposit tokens to stake.
     */
    function _stakeFor(address staker, address beneficiary, uint256 amount) private {
        require(amount > 0, 'Orchard: stake amount is zero');
        require(beneficiary != address(0), 'Orchard: beneficiary is zero address');
        require(totalStakingShares == 0 || totalStaked() > 0,
                'Orchard: Invalid state. Staking shares exist, but no staking tokens do');

        uint256 mintedStakingShares = (totalStakingShares > 0)
            ? totalStakingShares.mul(amount).div(totalStaked())
            : amount.mul(_initialSharesPerToken);
        require(mintedStakingShares > 0, 'Orchard: Stake amount is too small');

        updateAccounting();

        // 1. User Accounting
        UserTotals storage totals = _userTotals[beneficiary];
        totals.stakingShares = totals.stakingShares.add(mintedStakingShares);
        totals.lastAccountingTimestampSec = now;

        Stake memory newStake = Stake(mintedStakingShares, now);
        _userStakes[beneficiary].push(newStake);

        // 2. Global Accounting
        totalStakingShares = totalStakingShares.add(mintedStakingShares);
        // Already set in updateAccounting()
        // _lastAccountingTimestampSec = now;

        // interactions
        require(_stakingPool.token().transferFrom(staker, address(_stakingPool), amount),
            'Orchard: transfer into staking pool failed');

        emit Staked(beneficiary, amount, totalStakedFor(beneficiary), "");
    }

    /**
     * @dev Unstakes a certain amount of previously deposited tokens. User also receives their
     * alotted number of distribution tokens.
     * @param amount Number of deposit tokens to unstake / withdraw.
     * @param data Not used.
     */
    function unstake(uint256 amount, bytes calldata data) external {
        _unstake(amount);
    }

    /**
     * @param amount Number of deposit tokens to unstake / withdraw.
     * @return The total number of distribution tokens that would be rewarded.
     */
    function unstakeQuery(uint256 amount) public returns (uint256) {
        return _unstake(amount);
    }

    /**
     * @dev Unstakes a certain amount of previously deposited tokens. User also receives their
     * alotted number of distribution tokens.
     * @param amount Number of deposit tokens to unstake / withdraw.
     * @return The total number of distribution tokens rewarded.
     */
    function _unstake(uint256 amount) private returns (uint256) {
        updateAccounting();

        // checks
        require(amount > 0, 'Orchard: unstake amount is zero');
        require(totalStakedFor(msg.sender) >= amount,
            'Orchard: unstake amount is greater than total user stakes');
        uint256 stakingSharesToBurn = totalStakingShares.mul(amount).div(totalStaked());
        require(stakingSharesToBurn > 0, 'Orchard: Unable to unstake amount this small');

        // 1. User Accounting
        UserTotals storage totals = _userTotals[msg.sender];
        Stake[] storage accountStakes = _userStakes[msg.sender];

        // Redeem from most recent stake and go backwards in time.
        uint256 stakingShareSecondsToBurn = 0;
        uint256 sharesLeftToBurn = stakingSharesToBurn;
        uint256 rewardAmount = 0;
        while (sharesLeftToBurn > 0) {
            Stake storage lastStake = accountStakes[accountStakes.length - 1];
            uint256 stakeTimeSec = now.sub(lastStake.timestampSec);
            uint256 newStakingShareSecondsToBurn = 0;
            if (lastStake.stakingShares <= sharesLeftToBurn) {
                // fully redeem a past stake
                newStakingShareSecondsToBurn = lastStake.stakingShares.mul(stakeTimeSec);
                rewardAmount = computeNewReward(rewardAmount, newStakingShareSecondsToBurn, stakeTimeSec);
                stakingShareSecondsToBurn = stakingShareSecondsToBurn.add(newStakingShareSecondsToBurn);
                sharesLeftToBurn = sharesLeftToBurn.sub(lastStake.stakingShares);
                accountStakes.length--;
            } else {
                // partially redeem a past stake
                newStakingShareSecondsToBurn = sharesLeftToBurn.mul(stakeTimeSec);
                rewardAmount = computeNewReward(rewardAmount, newStakingShareSecondsToBurn, stakeTimeSec);
                stakingShareSecondsToBurn = stakingShareSecondsToBurn.add(newStakingShareSecondsToBurn);
                lastStake.stakingShares = lastStake.stakingShares.sub(sharesLeftToBurn);
                sharesLeftToBurn = 0;
            }
        }
        totals.stakingShareSeconds = totals.stakingShareSeconds.sub(stakingShareSecondsToBurn);
        totals.stakingShares = totals.stakingShares.sub(stakingSharesToBurn);
        // Already set in updateAccounting
        // totals.lastAccountingTimestampSec = now;

        // 2. Global Accounting
        _totalStakingShareSeconds = _totalStakingShareSeconds.sub(stakingShareSecondsToBurn);
        totalStakingShares = totalStakingShares.sub(stakingSharesToBurn);
        // Already set in updateAccounting
        // _lastAccountingTimestampSec = now;

        // interactions
        require(_stakingPool.transfer(msg.sender, amount),
            'Orchard: transfer out of staking pool failed');
        require(_unlockedPool.transfer(msg.sender, rewardAmount),
            'Orchard: transfer out of unlocked pool failed');

        emit Unstaked(msg.sender, amount, totalStakedFor(msg.sender), "");
        emit TokensClaimed(msg.sender, rewardAmount);

        require(totalStakingShares == 0 || totalStaked() > 0,
                "Orchard: Error unstaking. Staking shares exist, but no staking tokens do");
        return rewardAmount;
    }

    /**
     * @dev Applies an additional time-bonus to a distribution amount. This is necessary to
     *      encourage long-term deposits instead of constant unstake/restakes.
     *      The bonus-multiplier is the result of a linear function that starts at startBonus and
     *      ends at 100% over bonusPeriodSec, then stays at 100% thereafter.
     * @param currentRewardTokens The current number of distribution tokens already alotted for this
     *                            unstake op. Any bonuses are already applied.
     * @param stakingShareSeconds The stakingShare-seconds that are being burned for new
     *                            distribution tokens.
     * @param stakeTimeSec Length of time for which the tokens were staked. Needed to calculate
     *                     the time-bonus.
     * @return Updated amount of distribution tokens to award, with any bonus included on the
     *         newly added tokens.
     */
    function computeNewReward(uint256 currentRewardTokens,
                                uint256 stakingShareSeconds,
                                uint256 stakeTimeSec) private view returns (uint256) {

        uint256 newRewardTokens =
            totalUnlocked()
            .mul(stakingShareSeconds)
            .div(_totalStakingShareSeconds);

        if (stakeTimeSec >= bonusPeriodSec) {
            return currentRewardTokens.add(newRewardTokens);
        }

        uint256 oneHundredPct = 10**BONUS_DECIMALS;
        uint256 bonusedReward =
            startBonus
            .add(oneHundredPct.sub(startBonus).mul(stakeTimeSec).div(bonusPeriodSec))
            .mul(newRewardTokens)
            .div(oneHundredPct);
        return currentRewardTokens.add(bonusedReward);
    }

    /**
     * @param addr The user to look up staking information for.
     * @return The number of staking tokens deposited for addr.
     */
    function totalStakedFor(address addr) public view returns (uint256) {
        return totalStakingShares > 0 ?
            totalStaked().mul(_userTotals[addr].stakingShares).div(totalStakingShares) : 0;
    }

    /**
     * @return The total number of deposit tokens staked globally, by all users.
     */
    function totalStaked() public view returns (uint256) {
        return _stakingPool.balance();
    }

    /**
     * @dev Note that this application has a staking token as well as a distribution token, which
     * may be different. This function is required by EIP-900.
     * @return The deposit token used for staking.
     */
    function token() external view returns (address) {
        return address(getStakingToken());
    }

    /**
     * @dev A globally callable function to update the accounting state of the system.
     *      Global state and state for the caller are updated.
     * @return [0] balance of the locked pool
     * @return [1] balance of the unlocked pool
     * @return [2] caller's staking share seconds
     * @return [3] global staking share seconds
     * @return [4] Rewards caller has accumulated, optimistically assumes max time-bonus.
     * @return [5] block timestamp
     */
    function updateAccounting() public returns (
        uint256, uint256, uint256, uint256, uint256, uint256) {

        unlockTokens();

        // Global accounting
        uint256 newStakingShareSeconds =
            now
            .sub(_lastAccountingTimestampSec)
            .mul(totalStakingShares);
        _totalStakingShareSeconds = _totalStakingShareSeconds.add(newStakingShareSeconds);
        _lastAccountingTimestampSec = now;

        // User Accounting
        UserTotals storage totals = _userTotals[msg.sender];
        uint256 newUserStakingShareSeconds =
            now
            .sub(totals.lastAccountingTimestampSec)
            .mul(totals.stakingShares);
        totals.stakingShareSeconds =
            totals.stakingShareSeconds
            .add(newUserStakingShareSeconds);
        totals.lastAccountingTimestampSec = now;

        uint256 totalUserRewards = (_totalStakingShareSeconds > 0)
            ? totalUnlocked().mul(totals.stakingShareSeconds).div(_totalStakingShareSeconds)
            : 0;

        return (
            totalLocked(),
            totalUnlocked(),
            totals.stakingShareSeconds,
            _totalStakingShareSeconds,
            totalUserRewards,
            now
        );
    }

    /**
     * @return Total number of locked distribution tokens.
     */
    function totalLocked() public view returns (uint256) {
        return _lockedPool.balance();
    }

    /**
     * @return Total number of unlocked distribution tokens.
     */
    function totalUnlocked() public view returns (uint256) {
        return _unlockedPool.balance();
    }

    /**
     * @return Number of unlock schedules.
     */
    function unlockScheduleCount() public view returns (uint256) {
        return unlockSchedules.length;
    }

    /**
     * @dev This funcion allows the contract owner to add more locked distribution tokens, along
     *      with the associated "unlock schedule". These locked tokens immediately begin unlocking
     *      linearly over the duraction of durationSec timeframe.
     * @param amount Number of distribution tokens to lock. These are transferred from the caller.
     * @param durationSec Length of time to linear unlock the tokens.
     */
    function lockTokens(uint256 amount, uint256 durationSec) external onlyOwner {
        require(unlockSchedules.length < _maxUnlockSchedules,
            'Orchard: reached maximum unlock schedules');

        // Update lockedTokens amount before using it in computations after.
        updateAccounting();

        uint256 lockedTokens = totalLocked();
        uint256 mintedLockedShares = (lockedTokens > 0)
            ? totalLockedShares.mul(amount).div(lockedTokens)
            : amount.mul(_initialSharesPerToken);

        UnlockSchedule memory schedule;
        schedule.initialLockedShares = mintedLockedShares;
        schedule.lastUnlockTimestampSec = now;
        schedule.endAtSec = now.add(durationSec);
        schedule.durationSec = durationSec;
        unlockSchedules.push(schedule);

        totalLockedShares = totalLockedShares.add(mintedLockedShares);

        require(_lockedPool.token().transferFrom(msg.sender, address(_lockedPool), amount),
            'Orchard: transfer into locked pool failed');
        emit TokensLocked(amount, durationSec, totalLocked());
    }

    /**
     * @dev Moves distribution tokens from the locked pool to the unlocked pool, according to the
     *      previously defined unlock schedules. Publicly callable.
     * @return Number of newly unlocked distribution tokens.
     */
    function unlockTokens() public returns (uint256) {
        uint256 unlockedTokens = 0;
        uint256 lockedTokens = totalLocked();

        if (totalLockedShares == 0) {
            unlockedTokens = lockedTokens;
        } else {
            uint256 unlockedShares = 0;
            for (uint256 s = 0; s < unlockSchedules.length; s++) {
                unlockedShares = unlockedShares.add(unlockScheduleShares(s));
            }
            unlockedTokens = unlockedShares.mul(lockedTokens).div(totalLockedShares);
            totalLockedShares = totalLockedShares.sub(unlockedShares);
        }

        if (unlockedTokens > 0) {
            require(_lockedPool.transfer(address(_unlockedPool), unlockedTokens),
                'Orchard: transfer out of locked pool failed');
            emit TokensUnlocked(unlockedTokens, totalLocked());
        }

        return unlockedTokens;
    }

    /**
     * @dev Returns the number of unlockable shares from a given schedule. The returned value
     *      depends on the time since the last unlock. This function updates schedule accounting,
     *      but does not actually transfer any tokens.
     * @param s Index of the unlock schedule.
     * @return The number of unlocked shares.
     */
    function unlockScheduleShares(uint256 s) private returns (uint256) {
        UnlockSchedule storage schedule = unlockSchedules[s];

        if(schedule.unlockedShares >= schedule.initialLockedShares) {
            return 0;
        }

        uint256 sharesToUnlock = 0;
        // Special case to handle any leftover dust from integer division
        if (now >= schedule.endAtSec) {
            sharesToUnlock = (schedule.initialLockedShares.sub(schedule.unlockedShares));
            schedule.lastUnlockTimestampSec = schedule.endAtSec;
        } else {
            sharesToUnlock = now.sub(schedule.lastUnlockTimestampSec)
                .mul(schedule.initialLockedShares)
                .div(schedule.durationSec);
            schedule.lastUnlockTimestampSec = now;
        }

        schedule.unlockedShares = schedule.unlockedShares.add(sharesToUnlock);
        return sharesToUnlock;
    }

    /**
     * @dev Lets the owner rescue funds air-dropped to the staking pool.
     * @param tokenToRescue Address of the token to be rescued.
     * @param to Address to which the rescued funds are to be sent.
     * @param amount Amount of tokens to be rescued.
     * @return Transfer success.
     */
    function rescueFundsFromStakingPool(address tokenToRescue, address to, uint256 amount)
        public onlyOwner returns (bool) {

        return _stakingPool.rescueFunds(tokenToRescue, to, amount);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"contract IERC20","name":"stakingToken","type":"address"},{"internalType":"contract IERC20","name":"distributionToken","type":"address"},{"internalType":"uint256","name":"maxUnlockSchedules","type":"uint256"},{"internalType":"uint256","name":"startBonus_","type":"uint256"},{"internalType":"uint256","name":"bonusPeriodSec_","type":"uint256"},{"internalType":"uint256","name":"initialSharesPerToken","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"durationSec","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"}],"name":"TokensLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"}],"name":"TokensUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Unstaked","type":"event"},{"constant":true,"inputs":[],"name":"BONUS_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_lockedPool","outputs":[{"internalType":"contract TokenPool","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_stakingPool","outputs":[{"internalType":"contract TokenPool","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_unlockedPool","outputs":[{"internalType":"contract TokenPool","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bonusPeriodSec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getDistributionToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"durationSec","type":"uint256"}],"name":"lockTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenToRescue","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueFundsFromStakingPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"stake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"stakeFor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"startBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"supportsHistory","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalLocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalLockedShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"totalStakedFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalStakingShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalUnlocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"unlockScheduleCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"unlockSchedules","outputs":[{"internalType":"uint256","name":"initialLockedShares","type":"uint256"},{"internalType":"uint256","name":"unlockedShares","type":"uint256"},{"internalType":"uint256","name":"lastUnlockTimestampSec","type":"uint256"},{"internalType":"uint256","name":"endAtSec","type":"uint256"},{"internalType":"uint256","name":"durationSec","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unlockTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"unstake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unstakeQuery","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"updateAccounting","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]

608060405260006004556000600555600060065560006007556000600855426009556000600a556000600b553480156200003857600080fd5b506040516200269638038062002696833981810160405260c08110156200005e57600080fd5b508051602082015160408301516060840151608085015160a090950151600080546001600160a01b0319163317905593949293919290916064831115620000ec576040805162461bcd60e51b815260206004820152601d60248201527f4f7263686172643a20737461727420626f6e757320746f6f2068696768000000604482015290519081900360640190fd5b816200013f576040805162461bcd60e51b815260206004820152601d60248201527f4f7263686172643a20626f6e757320706572696f64206973207a65726f000000604482015290519081900360640190fd5b60008111620001805760405162461bcd60e51b8152600401808060200182810382526026815260200180620026706026913960400191505060405180910390fd5b856040516200018f90620002b7565b6001600160a01b03909116815260405190819003602001906000f080158015620001bd573d6000803e3d6000fd5b50600180546001600160a01b0319166001600160a01b03929092169190911790556040518590620001ee90620002b7565b6001600160a01b03909116815260405190819003602001906000f0801580156200021c573d6000803e3d6000fd5b50600280546001600160a01b0319166001600160a01b039290921691909117905560405185906200024d90620002b7565b6001600160a01b03909116815260405190819003602001906000f0801580156200027b573d6000803e3d6000fd5b50600380546001600160a01b0319166001600160a01b0392909216919091179055600492909255600555600a91909155600b5550620002c59050565b61057980620020f783390190565b611e2280620002d56000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c8063817b1cd2116101045780639f9106d1116100a2578063f2e456c611610071578063f2e456c61461053d578063f2fde38b14610545578063f968f4931461056b578063fc0c546a14610573576101da565b80639f9106d1146104ae578063a779d080146104b6578063c7ae2007146104be578063c8fd6ed0146104c6576101da565b806386805dd1116100de57806386805dd11461045e57806389158d8e1461047b5780638da5cb5b1461049e5780638f32d59b146104a6576101da565b8063817b1cd21461044657806381c39bec1461044e57806384791cff14610456576101da565b80634b341aed1161017c5780637033e4a61161014b5780637033e4a61461042657806370c6a17e1461042e578063715018a6146104365780637c6aa6f41461043e576101da565b80634b341aed14610366578063568914121461038c5780635a72bbef146103945780635c94bcb2146103de576101da565b806322c12b84116101b857806322c12b84146102f757806338b45fde1461031b5780633d07411014610323578063494347e71461032b576101da565b80630e89439b146101df5780630ef96356146102585780631dc27fde146102dd575b600080fd5b610256600480360360408110156101f557600080fd5b8135919081019060408101602082013564010000000081111561021757600080fd5b82018360208201111561022957600080fd5b8035906020019184600183028401116401000000008311171561024b57600080fd5b50909250905061057b565b005b6102566004803603606081101561026e57600080fd5b6001600160a01b038235169160208101359181019060608101604082013564010000000081111561029e57600080fd5b8201836020820111156102b057600080fd5b803590602001918460018302840111640100000000831117156102d257600080fd5b50909250905061058b565b6102e56105ad565b60408051918252519081900360200190f35b6102ff6105b2565b604080516001600160a01b039092168252519081900360200190f35b6102e5610728565b6102ff61072e565b61033361073d565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b6102e56004803603602081101561037c57600080fd5b50356001600160a01b0316610849565b6102e5610890565b6103ca600480360360608110156103aa57600080fd5b506001600160a01b038135811691602081013590911690604001356108d5565b604080519115158252519081900360200190f35b6103fb600480360360208110156103f457600080fd5b503561097c565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6103ca6109ba565b6102e56109bf565b6102566109c5565b6102e5610a1e565b6102e5610a24565b6102e5610a69565b6102ff610a6f565b6102e56004803603602081101561047457600080fd5b5035610a7e565b6102566004803603604081101561049157600080fd5b5080359060200135610a89565b6102ff610dd1565b6103ca610de0565b6102ff610df1565b6102e5610e36565b6102e5610e7b565b610256600480360360408110156104dc57600080fd5b813591908101906040810160208201356401000000008111156104fe57600080fd5b82018360208201111561051057600080fd5b8035906020019184600183028401116401000000008311171561053257600080fd5b509092509050610e81565b6102ff610e8a565b6102566004803603602081101561055b57600080fd5b50356001600160a01b0316610e99565b6102e5610eb6565b6102ff61104a565b610586333385611059565b505050565b610593610de0565b61059c57600080fd5b6105a7338585611059565b50505050565b600281565b60035460408051637e062a3560e11b815290516000926001600160a01b03169163fc0c546a916004808301926020929190829003018186803b1580156105f757600080fd5b505afa15801561060b573d6000803e3d6000fd5b505050506040513d602081101561062157600080fd5b505160025460408051637e062a3560e11b815290516001600160a01b03938416939092169163fc0c546a91600480820192602092909190829003018186803b15801561066c57600080fd5b505afa158015610680573d6000803e3d6000fd5b505050506040513d602081101561069657600080fd5b50516001600160a01b0316146106a857fe5b600260009054906101000a90046001600160a01b03166001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156106f657600080fd5b505afa15801561070a573d6000803e3d6000fd5b505050506040513d602081101561072057600080fd5b505190505b90565b60045481565b6001546001600160a01b031681565b60008060008060008061074e610eb6565b50600061077860075461076c6009544261140a90919063ffffffff16565b9063ffffffff61142416565b60085490915061078e908263ffffffff61144b16565b600855426009819055336000908152600c602052604081208054600282015491936107c39261076c919063ffffffff61140a16565b60018301549091506107db908263ffffffff61144b16565b60018301554260028301556008546000906107f7576000610819565b61081960085461080d856001015461076c610e36565b9063ffffffff61145d16565b9050610823610890565b61082b610e36565b600190940154600854919c949b509950975095504294509092505050565b6000806007541161085b576000610888565b6007546001600160a01b0383166000908152600c6020526040902054610888919061080d9061076c610a24565b90505b919050565b600354604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a8916004808301926020929190829003018186803b1580156106f657600080fd5b60006108df610de0565b6108e857600080fd5b60015460408051631b32b81560e21b81526001600160a01b03878116600483015286811660248301526044820186905291519190921691636ccae0549160648083019260209291908290030181600087803b15801561094657600080fd5b505af115801561095a573d6000803e3d6000fd5b505050506040513d602081101561097057600080fd5b505190505b9392505050565b600e818154811061098957fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401549294509092909185565b600090565b60075481565b6109cd610de0565b6109d657600080fd5b600080546040516001600160a01b03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a2600080546001600160a01b0319169055565b60055481565b600154604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a8916004808301926020929190829003018186803b1580156106f657600080fd5b60065481565b6003546001600160a01b031681565b60006108888261147f565b610a91610de0565b610a9a57600080fd5b600a54600e5410610adc5760405162461bcd60e51b8152600401808060200182810382526029815260200180611cbd6029913960400191505060405180910390fd5b610ae461073d565b5050505050506000610af4610890565b90506000808211610b1857600b54610b1390859063ffffffff61142416565b610b31565b610b318261080d8660065461142490919063ffffffff16565b9050610b3b611b23565b8181524260408201819052610b56908563ffffffff61144b16565b6060820190815260808201858152600e805460018101825560009190915283517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd60059092029182015560208401517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe82015560408401517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3ff82015591517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c400830155517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c40190910155600654610c4b908361144b565b60065560035460408051637e062a3560e11b815290516001600160a01b039092169163fc0c546a91600480820192602092909190829003018186803b158015610c9357600080fd5b505afa158015610ca7573d6000803e3d6000fd5b505050506040513d6020811015610cbd57600080fd5b5051600354604080516323b872dd60e01b81523360048201526001600160a01b03928316602482015260448101899052905191909216916323b872dd9160648083019260209291908290030181600087803b158015610d1b57600080fd5b505af1158015610d2f573d6000803e3d6000fd5b505050506040513d6020811015610d4557600080fd5b5051610d825760405162461bcd60e51b8152600401808060200182810382526029815260200180611c1f6029913960400191505060405180910390fd5b7ff346961af4c52f314df1b45964746280fe409abb959d4a2458d58f79408b1fe88585610dad610890565b60408051938452602084019290925282820152519081900360600190a15050505050565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b60015460408051637e062a3560e11b815290516000926001600160a01b03169163fc0c546a916004808301926020929190829003018186803b1580156106f657600080fd5b600254604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a8916004808301926020929190829003018186803b1580156106f657600080fd5b600e5490565b6105a78361147f565b6002546001600160a01b031681565b610ea1610de0565b610eaa57600080fd5b610eb381611964565b50565b60008080610ec2610890565b905060065460001415610ed757809150610f3b565b6000805b600e54811015610f0857610efe610ef1826119d2565b839063ffffffff61144b16565b9150600101610edb565b50600654610f209061080d838563ffffffff61142416565b600654909350610f36908263ffffffff61140a16565b600655505b8115611044576003546002546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919092169163a9059cbb9160448083019260209291908290030181600087803b158015610f9a57600080fd5b505af1158015610fae573d6000803e3d6000fd5b505050506040513d6020811015610fc457600080fd5b50516110015760405162461bcd60e51b815260040180806020018281038252602b815260200180611ce6602b913960400191505060405180910390fd5b7f2e444eb379b177e88ce0649c6110a3b01099f03e297127919dd5e3b63a761a9c8261102b610890565b6040805192835260208301919091528051918290030190a15b50905090565b6000611054610df1565b905090565b600081116110ae576040805162461bcd60e51b815260206004820152601d60248201527f4f7263686172643a207374616b6520616d6f756e74206973207a65726f000000604482015290519081900360640190fd5b6001600160a01b0382166110f35760405162461bcd60e51b8152600401808060200182810382526024815260200180611bb56024913960400191505060405180910390fd5b600754158061110957506000611107610a24565b115b6111445760405162461bcd60e51b8152600401808060200182810382526046815260200180611bd96046913960600191505060405180910390fd5b6000806007541161116857600b5461116390839063ffffffff61142416565b611186565b611186611173610a24565b60075461080d908563ffffffff61142416565b9050600081116111c75760405162461bcd60e51b8152600401808060200182810382526022815260200180611d3d6022913960400191505060405180910390fd5b6111cf61073d565b505050506001600160a01b0385166000908152600c6020526040902080549092506111fb91508361144b565b815542600282015561120b611b52565b506040805180820182528381524260208083019182526001600160a01b0388166000908152600d8252938420805460018181018355918652919094208351600290920201908155905192019190915560075461126d908463ffffffff61144b16565b60075560015460408051637e062a3560e11b815290516001600160a01b039092169163fc0c546a91600480820192602092909190829003018186803b1580156112b557600080fd5b505afa1580156112c9573d6000803e3d6000fd5b505050506040513d60208110156112df57600080fd5b5051600154604080516323b872dd60e01b81526001600160a01b038a81166004830152928316602482015260448101889052905191909216916323b872dd9160648083019260209291908290030181600087803b15801561133f57600080fd5b505af1158015611353573d6000803e3d6000fd5b505050506040513d602081101561136957600080fd5b50516113a65760405162461bcd60e51b815260040180806020018281038252602a815260200180611dc4602a913960400191505060405180910390fd5b846001600160a01b03167fc65e53b88159e7d2c0fc12a0600072e28ae53ff73b4c1715369c30f160935142856113db88610849565b6040805192835260208301919091526060828201819052600090830152519081900360a00190a2505050505050565b60008282111561141957600080fd5b508082035b92915050565b6000826114335750600061141e565b8282028284828161144057fe5b041461097557600080fd5b60008282018381101561097557600080fd5b600080821161146b57600080fd5b600082848161147657fe5b04949350505050565b600061148961073d565b505050505050600082116114e4576040805162461bcd60e51b815260206004820152601f60248201527f4f7263686172643a20756e7374616b6520616d6f756e74206973207a65726f00604482015290519081900360640190fd5b816114ee33610849565b101561152b5760405162461bcd60e51b8152600401808060200182810382526039815260200180611d8b6039913960400191505060405180910390fd5b600061154b611538610a24565b60075461080d908663ffffffff61142416565b90506000811161158c5760405162461bcd60e51b815260040180806020018281038252602c815260200180611d5f602c913960400191505060405180910390fd5b336000908152600c60209081526040808320600d9092528220909183815b81156116af578354600090859060001981019081106115c557fe5b9060005260206000209060020201905060006115ee82600101544261140a90919063ffffffff16565b8254909150600090851061165c57825461160e908363ffffffff61142416565b905061161b848284611a95565b935061162d868263ffffffff61144b16565b835490965061164390869063ffffffff61140a16565b8754909550611656886000198301611b6c565b506116a7565b61166c858363ffffffff61142416565b9050611679848284611a95565b935061168b868263ffffffff61144b16565b83549096506116a0908663ffffffff61140a16565b8355600094505b5050506115aa565b60018501546116c4908463ffffffff61140a16565b600186015584546116db908763ffffffff61140a16565b85556008546116f0908463ffffffff61140a16565b600855600754611706908763ffffffff61140a16565b6007556001546040805163a9059cbb60e01b8152336004820152602481018b905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561175d57600080fd5b505af1158015611771573d6000803e3d6000fd5b505050506040513d602081101561178757600080fd5b50516117c45760405162461bcd60e51b815260040180806020018281038252602c815260200180611d11602c913960400191505060405180910390fd5b6002546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561181857600080fd5b505af115801561182c573d6000803e3d6000fd5b505050506040513d602081101561184257600080fd5b505161187f5760405162461bcd60e51b815260040180806020018281038252602d815260200180611c90602d913960400191505060405180910390fd5b337faf01bfc8475df280aca00b578c4a948e6d95700f0db8c13365240f7f973c8754896118ab83610849565b6040805192835260208301919091526060828201819052600090830152519081900360a00190a260408051828152905133917f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e430919081900360200190a2600754158061191e5750600061191c610a24565b115b6119595760405162461bcd60e51b8152600401808060200182810382526048815260200180611c486048913960600191505060405180910390fd5b979650505050505050565b6001600160a01b03811661197757600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600080600e83815481106119e257fe5b906000526020600020906005020190508060000154816001015410611a0b57600091505061088b565b60038101546000904210611a405760018201548254611a2f9163ffffffff61140a16565b600383015460028401559050611a70565b611a67826004015461080d846000015461076c86600201544261140a90919063ffffffff16565b42600284015590505b6001820154611a85908263ffffffff61144b16565b6001909201919091559050919050565b600080611aaa60085461080d8661076c610e36565b90506005548310611acd57611ac5858263ffffffff61144b16565b915050610975565b60006002600a0a90506000611b118261080d8561076c611b0260055461080d8c61076c6004548c61140a90919063ffffffff16565b6004549063ffffffff61144b16565b9050611959878263ffffffff61144b16565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b81548183558181111561058657600083815260209020610586916107259160029182028101918502015b80821115611bb05760008082556001820155600201611b96565b509056fe4f7263686172643a2062656e6566696369617279206973207a65726f20616464726573734f7263686172643a20496e76616c69642073746174652e205374616b696e67207368617265732065786973742c20627574206e6f207374616b696e6720746f6b656e7320646f4f7263686172643a207472616e7366657220696e746f206c6f636b656420706f6f6c206661696c65644f7263686172643a204572726f7220756e7374616b696e672e205374616b696e67207368617265732065786973742c20627574206e6f207374616b696e6720746f6b656e7320646f4f7263686172643a207472616e73666572206f7574206f6620756e6c6f636b656420706f6f6c206661696c65644f7263686172643a2072656163686564206d6178696d756d20756e6c6f636b207363686564756c65734f7263686172643a207472616e73666572206f7574206f66206c6f636b656420706f6f6c206661696c65644f7263686172643a207472616e73666572206f7574206f66207374616b696e6720706f6f6c206661696c65644f7263686172643a205374616b6520616d6f756e7420697320746f6f20736d616c6c4f7263686172643a20556e61626c6520746f20756e7374616b6520616d6f756e74207468697320736d616c6c4f7263686172643a20756e7374616b6520616d6f756e742069732067726561746572207468616e20746f74616c2075736572207374616b65734f7263686172643a207472616e7366657220696e746f207374616b696e6720706f6f6c206661696c6564a265627a7a72315820c0d5841d85cc6137179d350d25939d86af753835e8fc51bce04d836fd4e1be3864736f6c63430005110032608060405234801561001057600080fd5b506040516105793803806105798339818101604052602081101561003357600080fd5b5051600080546001600160a01b03199081163317909155600180546001600160a01b0390931692909116919091179055610507806100726000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063a9059cbb1161005b578063a9059cbb1461010d578063b69ef8a814610139578063f2fde38b14610153578063fc0c546a1461017957610088565b80636ccae0541461008d578063715018a6146100d75780638da5cb5b146100e15780638f32d59b14610105575b600080fd5b6100c3600480360360608110156100a357600080fd5b506001600160a01b03813581169160208101359091169060400135610181565b604080519115158252519081900360200190f35b6100df610275565b005b6100e96102ce565b604080516001600160a01b039092168252519081900360200190f35b6100c36102dd565b6100c36004803603604081101561012357600080fd5b506001600160a01b0381351690602001356102ee565b61014161038a565b60408051918252519081900360200190f35b6100df6004803603602081101561016957600080fd5b50356001600160a01b0316610406565b6100e9610423565b600061018b6102dd565b61019457600080fd5b6001546001600160a01b03858116911614156101e15760405162461bcd60e51b81526004018080602001828103825260328152602001806104a16032913960400191505060405180910390fd5b836001600160a01b031663a9059cbb84846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561024157600080fd5b505af1158015610255573d6000803e3d6000fd5b505050506040513d602081101561026b57600080fd5b5051949350505050565b61027d6102dd565b61028657600080fd5b600080546040516001600160a01b03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a2600080546001600160a01b0319169055565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b60006102f86102dd565b61030157600080fd5b6001546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561035757600080fd5b505af115801561036b573d6000803e3d6000fd5b505050506040513d602081101561038157600080fd5b50519392505050565b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156103d557600080fd5b505afa1580156103e9573d6000803e3d6000fd5b505050506040513d60208110156103ff57600080fd5b5051905090565b61040e6102dd565b61041757600080fd5b61042081610432565b50565b6001546001600160a01b031681565b6001600160a01b03811661044557600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b039290921691909117905556fe546f6b656e506f6f6c3a2043616e6e6f7420636c61696d20746f6b656e2068656c642062792074686520636f6e7472616374a265627a7a723158204218c4b1c95dd3e6faefdaf555019a8ea6a8260055659224a18de7a07faed9e564736f6c634300051100324f7263686172643a20696e697469616c536861726573506572546f6b656e206973207a65726f00000000000000000000000054f5f952cca8888227276581f26978f99fdba64e00000000000000000000000087f5f9ebe40786d49d35e1b5997b07ccaa8adbff0000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000004f1a0000000000000000000000000000000000000000000000000000000000000f4240

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c8063817b1cd2116101045780639f9106d1116100a2578063f2e456c611610071578063f2e456c61461053d578063f2fde38b14610545578063f968f4931461056b578063fc0c546a14610573576101da565b80639f9106d1146104ae578063a779d080146104b6578063c7ae2007146104be578063c8fd6ed0146104c6576101da565b806386805dd1116100de57806386805dd11461045e57806389158d8e1461047b5780638da5cb5b1461049e5780638f32d59b146104a6576101da565b8063817b1cd21461044657806381c39bec1461044e57806384791cff14610456576101da565b80634b341aed1161017c5780637033e4a61161014b5780637033e4a61461042657806370c6a17e1461042e578063715018a6146104365780637c6aa6f41461043e576101da565b80634b341aed14610366578063568914121461038c5780635a72bbef146103945780635c94bcb2146103de576101da565b806322c12b84116101b857806322c12b84146102f757806338b45fde1461031b5780633d07411014610323578063494347e71461032b576101da565b80630e89439b146101df5780630ef96356146102585780631dc27fde146102dd575b600080fd5b610256600480360360408110156101f557600080fd5b8135919081019060408101602082013564010000000081111561021757600080fd5b82018360208201111561022957600080fd5b8035906020019184600183028401116401000000008311171561024b57600080fd5b50909250905061057b565b005b6102566004803603606081101561026e57600080fd5b6001600160a01b038235169160208101359181019060608101604082013564010000000081111561029e57600080fd5b8201836020820111156102b057600080fd5b803590602001918460018302840111640100000000831117156102d257600080fd5b50909250905061058b565b6102e56105ad565b60408051918252519081900360200190f35b6102ff6105b2565b604080516001600160a01b039092168252519081900360200190f35b6102e5610728565b6102ff61072e565b61033361073d565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b6102e56004803603602081101561037c57600080fd5b50356001600160a01b0316610849565b6102e5610890565b6103ca600480360360608110156103aa57600080fd5b506001600160a01b038135811691602081013590911690604001356108d5565b604080519115158252519081900360200190f35b6103fb600480360360208110156103f457600080fd5b503561097c565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6103ca6109ba565b6102e56109bf565b6102566109c5565b6102e5610a1e565b6102e5610a24565b6102e5610a69565b6102ff610a6f565b6102e56004803603602081101561047457600080fd5b5035610a7e565b6102566004803603604081101561049157600080fd5b5080359060200135610a89565b6102ff610dd1565b6103ca610de0565b6102ff610df1565b6102e5610e36565b6102e5610e7b565b610256600480360360408110156104dc57600080fd5b813591908101906040810160208201356401000000008111156104fe57600080fd5b82018360208201111561051057600080fd5b8035906020019184600183028401116401000000008311171561053257600080fd5b509092509050610e81565b6102ff610e8a565b6102566004803603602081101561055b57600080fd5b50356001600160a01b0316610e99565b6102e5610eb6565b6102ff61104a565b610586333385611059565b505050565b610593610de0565b61059c57600080fd5b6105a7338585611059565b50505050565b600281565b60035460408051637e062a3560e11b815290516000926001600160a01b03169163fc0c546a916004808301926020929190829003018186803b1580156105f757600080fd5b505afa15801561060b573d6000803e3d6000fd5b505050506040513d602081101561062157600080fd5b505160025460408051637e062a3560e11b815290516001600160a01b03938416939092169163fc0c546a91600480820192602092909190829003018186803b15801561066c57600080fd5b505afa158015610680573d6000803e3d6000fd5b505050506040513d602081101561069657600080fd5b50516001600160a01b0316146106a857fe5b600260009054906101000a90046001600160a01b03166001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156106f657600080fd5b505afa15801561070a573d6000803e3d6000fd5b505050506040513d602081101561072057600080fd5b505190505b90565b60045481565b6001546001600160a01b031681565b60008060008060008061074e610eb6565b50600061077860075461076c6009544261140a90919063ffffffff16565b9063ffffffff61142416565b60085490915061078e908263ffffffff61144b16565b600855426009819055336000908152600c602052604081208054600282015491936107c39261076c919063ffffffff61140a16565b60018301549091506107db908263ffffffff61144b16565b60018301554260028301556008546000906107f7576000610819565b61081960085461080d856001015461076c610e36565b9063ffffffff61145d16565b9050610823610890565b61082b610e36565b600190940154600854919c949b509950975095504294509092505050565b6000806007541161085b576000610888565b6007546001600160a01b0383166000908152600c6020526040902054610888919061080d9061076c610a24565b90505b919050565b600354604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a8916004808301926020929190829003018186803b1580156106f657600080fd5b60006108df610de0565b6108e857600080fd5b60015460408051631b32b81560e21b81526001600160a01b03878116600483015286811660248301526044820186905291519190921691636ccae0549160648083019260209291908290030181600087803b15801561094657600080fd5b505af115801561095a573d6000803e3d6000fd5b505050506040513d602081101561097057600080fd5b505190505b9392505050565b600e818154811061098957fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401549294509092909185565b600090565b60075481565b6109cd610de0565b6109d657600080fd5b600080546040516001600160a01b03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a2600080546001600160a01b0319169055565b60055481565b600154604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a8916004808301926020929190829003018186803b1580156106f657600080fd5b60065481565b6003546001600160a01b031681565b60006108888261147f565b610a91610de0565b610a9a57600080fd5b600a54600e5410610adc5760405162461bcd60e51b8152600401808060200182810382526029815260200180611cbd6029913960400191505060405180910390fd5b610ae461073d565b5050505050506000610af4610890565b90506000808211610b1857600b54610b1390859063ffffffff61142416565b610b31565b610b318261080d8660065461142490919063ffffffff16565b9050610b3b611b23565b8181524260408201819052610b56908563ffffffff61144b16565b6060820190815260808201858152600e805460018101825560009190915283517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd60059092029182015560208401517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe82015560408401517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3ff82015591517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c400830155517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c40190910155600654610c4b908361144b565b60065560035460408051637e062a3560e11b815290516001600160a01b039092169163fc0c546a91600480820192602092909190829003018186803b158015610c9357600080fd5b505afa158015610ca7573d6000803e3d6000fd5b505050506040513d6020811015610cbd57600080fd5b5051600354604080516323b872dd60e01b81523360048201526001600160a01b03928316602482015260448101899052905191909216916323b872dd9160648083019260209291908290030181600087803b158015610d1b57600080fd5b505af1158015610d2f573d6000803e3d6000fd5b505050506040513d6020811015610d4557600080fd5b5051610d825760405162461bcd60e51b8152600401808060200182810382526029815260200180611c1f6029913960400191505060405180910390fd5b7ff346961af4c52f314df1b45964746280fe409abb959d4a2458d58f79408b1fe88585610dad610890565b60408051938452602084019290925282820152519081900360600190a15050505050565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b60015460408051637e062a3560e11b815290516000926001600160a01b03169163fc0c546a916004808301926020929190829003018186803b1580156106f657600080fd5b600254604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a8916004808301926020929190829003018186803b1580156106f657600080fd5b600e5490565b6105a78361147f565b6002546001600160a01b031681565b610ea1610de0565b610eaa57600080fd5b610eb381611964565b50565b60008080610ec2610890565b905060065460001415610ed757809150610f3b565b6000805b600e54811015610f0857610efe610ef1826119d2565b839063ffffffff61144b16565b9150600101610edb565b50600654610f209061080d838563ffffffff61142416565b600654909350610f36908263ffffffff61140a16565b600655505b8115611044576003546002546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919092169163a9059cbb9160448083019260209291908290030181600087803b158015610f9a57600080fd5b505af1158015610fae573d6000803e3d6000fd5b505050506040513d6020811015610fc457600080fd5b50516110015760405162461bcd60e51b815260040180806020018281038252602b815260200180611ce6602b913960400191505060405180910390fd5b7f2e444eb379b177e88ce0649c6110a3b01099f03e297127919dd5e3b63a761a9c8261102b610890565b6040805192835260208301919091528051918290030190a15b50905090565b6000611054610df1565b905090565b600081116110ae576040805162461bcd60e51b815260206004820152601d60248201527f4f7263686172643a207374616b6520616d6f756e74206973207a65726f000000604482015290519081900360640190fd5b6001600160a01b0382166110f35760405162461bcd60e51b8152600401808060200182810382526024815260200180611bb56024913960400191505060405180910390fd5b600754158061110957506000611107610a24565b115b6111445760405162461bcd60e51b8152600401808060200182810382526046815260200180611bd96046913960600191505060405180910390fd5b6000806007541161116857600b5461116390839063ffffffff61142416565b611186565b611186611173610a24565b60075461080d908563ffffffff61142416565b9050600081116111c75760405162461bcd60e51b8152600401808060200182810382526022815260200180611d3d6022913960400191505060405180910390fd5b6111cf61073d565b505050506001600160a01b0385166000908152600c6020526040902080549092506111fb91508361144b565b815542600282015561120b611b52565b506040805180820182528381524260208083019182526001600160a01b0388166000908152600d8252938420805460018181018355918652919094208351600290920201908155905192019190915560075461126d908463ffffffff61144b16565b60075560015460408051637e062a3560e11b815290516001600160a01b039092169163fc0c546a91600480820192602092909190829003018186803b1580156112b557600080fd5b505afa1580156112c9573d6000803e3d6000fd5b505050506040513d60208110156112df57600080fd5b5051600154604080516323b872dd60e01b81526001600160a01b038a81166004830152928316602482015260448101889052905191909216916323b872dd9160648083019260209291908290030181600087803b15801561133f57600080fd5b505af1158015611353573d6000803e3d6000fd5b505050506040513d602081101561136957600080fd5b50516113a65760405162461bcd60e51b815260040180806020018281038252602a815260200180611dc4602a913960400191505060405180910390fd5b846001600160a01b03167fc65e53b88159e7d2c0fc12a0600072e28ae53ff73b4c1715369c30f160935142856113db88610849565b6040805192835260208301919091526060828201819052600090830152519081900360a00190a2505050505050565b60008282111561141957600080fd5b508082035b92915050565b6000826114335750600061141e565b8282028284828161144057fe5b041461097557600080fd5b60008282018381101561097557600080fd5b600080821161146b57600080fd5b600082848161147657fe5b04949350505050565b600061148961073d565b505050505050600082116114e4576040805162461bcd60e51b815260206004820152601f60248201527f4f7263686172643a20756e7374616b6520616d6f756e74206973207a65726f00604482015290519081900360640190fd5b816114ee33610849565b101561152b5760405162461bcd60e51b8152600401808060200182810382526039815260200180611d8b6039913960400191505060405180910390fd5b600061154b611538610a24565b60075461080d908663ffffffff61142416565b90506000811161158c5760405162461bcd60e51b815260040180806020018281038252602c815260200180611d5f602c913960400191505060405180910390fd5b336000908152600c60209081526040808320600d9092528220909183815b81156116af578354600090859060001981019081106115c557fe5b9060005260206000209060020201905060006115ee82600101544261140a90919063ffffffff16565b8254909150600090851061165c57825461160e908363ffffffff61142416565b905061161b848284611a95565b935061162d868263ffffffff61144b16565b835490965061164390869063ffffffff61140a16565b8754909550611656886000198301611b6c565b506116a7565b61166c858363ffffffff61142416565b9050611679848284611a95565b935061168b868263ffffffff61144b16565b83549096506116a0908663ffffffff61140a16565b8355600094505b5050506115aa565b60018501546116c4908463ffffffff61140a16565b600186015584546116db908763ffffffff61140a16565b85556008546116f0908463ffffffff61140a16565b600855600754611706908763ffffffff61140a16565b6007556001546040805163a9059cbb60e01b8152336004820152602481018b905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561175d57600080fd5b505af1158015611771573d6000803e3d6000fd5b505050506040513d602081101561178757600080fd5b50516117c45760405162461bcd60e51b815260040180806020018281038252602c815260200180611d11602c913960400191505060405180910390fd5b6002546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561181857600080fd5b505af115801561182c573d6000803e3d6000fd5b505050506040513d602081101561184257600080fd5b505161187f5760405162461bcd60e51b815260040180806020018281038252602d815260200180611c90602d913960400191505060405180910390fd5b337faf01bfc8475df280aca00b578c4a948e6d95700f0db8c13365240f7f973c8754896118ab83610849565b6040805192835260208301919091526060828201819052600090830152519081900360a00190a260408051828152905133917f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e430919081900360200190a2600754158061191e5750600061191c610a24565b115b6119595760405162461bcd60e51b8152600401808060200182810382526048815260200180611c486048913960600191505060405180910390fd5b979650505050505050565b6001600160a01b03811661197757600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600080600e83815481106119e257fe5b906000526020600020906005020190508060000154816001015410611a0b57600091505061088b565b60038101546000904210611a405760018201548254611a2f9163ffffffff61140a16565b600383015460028401559050611a70565b611a67826004015461080d846000015461076c86600201544261140a90919063ffffffff16565b42600284015590505b6001820154611a85908263ffffffff61144b16565b6001909201919091559050919050565b600080611aaa60085461080d8661076c610e36565b90506005548310611acd57611ac5858263ffffffff61144b16565b915050610975565b60006002600a0a90506000611b118261080d8561076c611b0260055461080d8c61076c6004548c61140a90919063ffffffff16565b6004549063ffffffff61144b16565b9050611959878263ffffffff61144b16565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b81548183558181111561058657600083815260209020610586916107259160029182028101918502015b80821115611bb05760008082556001820155600201611b96565b509056fe4f7263686172643a2062656e6566696369617279206973207a65726f20616464726573734f7263686172643a20496e76616c69642073746174652e205374616b696e67207368617265732065786973742c20627574206e6f207374616b696e6720746f6b656e7320646f4f7263686172643a207472616e7366657220696e746f206c6f636b656420706f6f6c206661696c65644f7263686172643a204572726f7220756e7374616b696e672e205374616b696e67207368617265732065786973742c20627574206e6f207374616b696e6720746f6b656e7320646f4f7263686172643a207472616e73666572206f7574206f6620756e6c6f636b656420706f6f6c206661696c65644f7263686172643a2072656163686564206d6178696d756d20756e6c6f636b207363686564756c65734f7263686172643a207472616e73666572206f7574206f66206c6f636b656420706f6f6c206661696c65644f7263686172643a207472616e73666572206f7574206f66207374616b696e6720706f6f6c206661696c65644f7263686172643a205374616b6520616d6f756e7420697320746f6f20736d616c6c4f7263686172643a20556e61626c6520746f20756e7374616b6520616d6f756e74207468697320736d616c6c4f7263686172643a20756e7374616b6520616d6f756e742069732067726561746572207468616e20746f74616c2075736572207374616b65734f7263686172643a207472616e7366657220696e746f207374616b696e6720706f6f6c206661696c6564a265627a7a72315820c0d5841d85cc6137179d350d25939d86af753835e8fc51bce04d836fd4e1be3864736f6c63430005110032

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

00000000000000000000000054f5f952cca8888227276581f26978f99fdba64e00000000000000000000000087f5f9ebe40786d49d35e1b5997b07ccaa8adbff0000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000004f1a0000000000000000000000000000000000000000000000000000000000000f4240

-----Decoded View---------------
Arg [0] : stakingToken (address): 0x54f5f952cca8888227276581F26978F99FDBa64E
Arg [1] : distributionToken (address): 0x87F5F9eBE40786D49D35E1B5997b07cCAA8ADbFF
Arg [2] : maxUnlockSchedules (uint256): 1024
Arg [3] : startBonus_ (uint256): 33
Arg [4] : bonusPeriodSec_ (uint256): 5184000
Arg [5] : initialSharesPerToken (uint256): 1000000

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 00000000000000000000000054f5f952cca8888227276581f26978f99fdba64e
Arg [1] : 00000000000000000000000087f5f9ebe40786d49d35e1b5997b07ccaa8adbff
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000400
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000021
Arg [4] : 00000000000000000000000000000000000000000000000000000000004f1a00
Arg [5] : 00000000000000000000000000000000000000000000000000000000000f4240


Deployed Bytecode Sourcemap

7006:20619:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7006:20619:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11413:121;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11413:121:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;11413:121:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;11413:121:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;11413:121:0;;-1:-1:-1;11413:121:0;-1:-1:-1;11413:121:0;:::i;:::-;;11806:142;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;11806:142:0;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;11806:142:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;11806:142:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;11806:142:0;;-1:-1:-1;11806:142:0;-1:-1:-1;11806:142:0;:::i;7669:42::-;;;:::i;:::-;;;;;;;;;;;;;;;;11066:171;;;:::i;:::-;;;;-1:-1:-1;;;;;11066:171:0;;;;;;;;;;;;;;7718:29;;;:::i;7517:::-;;;:::i;21220:1281::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19958:210;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19958:210:0;-1:-1:-1;;;;;19958:210:0;;:::i;22587:100::-;;;:::i;27415:207::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27415:207:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;9164:39;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9164:39:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5234:87;;;:::i;7887:37::-;;;:::i;3829:116::-;;;:::i;7754:33::-;;;:::i;20276:101::-;;;:::i;7844:36::-;;;:::i;7590:28::-;;;:::i;14265:105::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14265:105:0;;:::i;23520:1115::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23520:1115:0;;;;;;;:::i;3170:72::-;;;:::i;3472:85::-;;;:::i;10881:102::-;;;:::i;22775:104::-;;;:::i;22949:109::-;;;:::i;13991:98::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13991:98:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;13991:98:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;13991:98:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;13991:98:0;;-1:-1:-1;13991:98:0;-1:-1:-1;13991:98:0;:::i;7553:30::-;;;:::i;4112:103::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4112:103:0;-1:-1:-1;;;;;4112:103:0;;:::i;24891:912::-;;;:::i;20618:101::-;;;:::i;11413:121::-;11485:41;11495:10;11507;11519:6;11485:9;:41::i;:::-;11413:121;;;:::o;11806:142::-;3363:9;:7;:9::i;:::-;3355:18;;;;;;11905:35;11915:10;11927:4;11933:6;11905:9;:35::i;:::-;11806:142;;;;:::o;7669:42::-;7710:1;7669:42;:::o;11066:171::-;11170:11;;:19;;;-1:-1:-1;;;11170:19:0;;;;11119:6;;-1:-1:-1;;;;;11170:11:0;;:17;;:19;;;;;;;;;;;;;;:11;:19;;;5:2:-1;;;;30:1;27;20:12;5:2;11170:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11170:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11170:19:0;11145:13;;:21;;;-1:-1:-1;;;11145:21:0;;;;-1:-1:-1;;;;;11145:44:0;;;;:13;;;;:19;;:21;;;;;11170:19;;11145:21;;;;;;;;:13;:21;;;5:2:-1;;;;30:1;27;20:12;5:2;11145:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11145:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11145:21:0;-1:-1:-1;;;;;11145:44:0;;11138:52;;;;11208:13;;;;;;;;;-1:-1:-1;;;;;11208:13:0;-1:-1:-1;;;;;11208:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11208:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11208:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11208:21:0;;-1:-1:-1;11066:171:0;;:::o;7718:29::-;;;;:::o;7517:::-;;;-1:-1:-1;;;;;7517:29:0;;:::o;21220:1281::-;21274:7;21283;21292;21301;21310;21319;21341:14;:12;:14::i;:::-;;21398:30;21444:88;21513:18;;21444:50;21466:27;;21444:3;:21;;:50;;;;:::i;:::-;:68;:88;:68;:88;:::i;:::-;21571:25;;21398:134;;-1:-1:-1;21571:53:0;;21398:134;21571:53;:29;:53;:::i;:::-;21543:25;:81;21665:3;21635:27;:33;;;21749:10;-1:-1:-1;21737:23:0;;;:11;:23;;;;;21896:20;;21843:33;;;;21737:23;;21821:96;;:56;;21665:3;21821:56;:21;:56;:::i;:96::-;21970:26;;;;21771:146;;-1:-1:-1;21970:72:0;;21771:146;21970:72;:44;:72;:::i;:::-;21928:26;;;:114;22089:3;22053:33;;;:39;22133:25;;-1:-1:-1;;22132:142:0;;22273:1;22132:142;;;22179:78;22231:25;;22179:47;22199:6;:26;;;22179:15;:13;:15::i;:47::-;:51;:78;:51;:78;:::i;:::-;22105:169;;22309:13;:11;:13::i;:::-;22337:15;:13;:15::i;:::-;22367:26;;;;;22408:25;;22287:206;;;;-1:-1:-1;22367:26:0;-1:-1:-1;22408:25:0;-1:-1:-1;22448:16:0;-1:-1:-1;22479:3:0;;-1:-1:-1;21220:1281:0;;-1:-1:-1;;;21220:1281:0:o;19958:210::-;20017:7;20065:1;20044:18;;:22;:116;;20159:1;20044:116;;;20137:18;;-1:-1:-1;;;;;20100:17:0;;;;;;:11;:17;;;;;:31;20082:74;;20137:18;20082:50;;:13;:11;:13::i;:74::-;20037:123;;19958:210;;;;:::o;22587:100::-;22658:11;;:21;;;-1:-1:-1;;;22658:21:0;;;;22631:7;;-1:-1:-1;;;;;22658:11:0;;:19;;:21;;;;;;;;;;;;;;:11;:21;;;5:2:-1;;;;30:1;27;20:12;27415:207:0;27537:4;3363:9;:7;:9::i;:::-;3355:18;;;;;;27563:12;;:51;;;-1:-1:-1;;;27563:51:0;;-1:-1:-1;;;;;27563:51:0;;;;;;;;;;;;;;;;;;;;;;:12;;;;;:24;;:51;;;;;;;;;;;;;;:12;;:51;;;5:2:-1;;;;30:1;27;20:12;5:2;27563:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27563:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27563:51:0;;-1:-1:-1;3380:1:0;27415:207;;;;;:::o;9164:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9164:39:0;;;;;:::o;5234:87::-;5284:4;5234:87;:::o;7887:37::-;;;;:::o;3829:116::-;3363:9;:7;:9::i;:::-;3355:18;;;;;;3906:6;;;3887:26;;-1:-1:-1;;;;;3906:6:0;;;;3887:26;;;3937:1;3920:19;;-1:-1:-1;;;;;;3920:19:0;;;3829:116::o;7754:33::-;;;;:::o;20276:101::-;20347:12;;:22;;;-1:-1:-1;;;20347:22:0;;;;20320:7;;-1:-1:-1;;;;;20347:12:0;;:20;;:22;;;;;;;;;;;;;;:12;:22;;;5:2:-1;;;;30:1;27;20:12;7844:36:0;;;;:::o;7590:28::-;;;-1:-1:-1;;;;;7590:28:0;;:::o;14265:105::-;14319:7;14346:16;14355:6;14346:8;:16::i;23520:1115::-;3363:9;:7;:9::i;:::-;3355:18;;;;;;23640:19;;23615:15;:22;:44;23607:111;;;;-1:-1:-1;;;23607:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23809:18;:16;:18::i;:::-;;;;;;;23840:20;23863:13;:11;:13::i;:::-;23840:36;;23887:26;23932:1;23917:12;:16;23916:131;;24024:22;;24013:34;;:6;;:34;:10;:34;:::i;:::-;23916:131;;;23950:47;23984:12;23950:29;23972:6;23950:17;;:21;;:29;;;;:::i;:47::-;23887:160;;24060:30;;:::i;:::-;24101:49;;;24195:3;24161:31;;;:37;;;24229:20;;24237:11;24229:20;:7;:20;:::i;:::-;24209:17;;;:40;;;24260:20;;;:34;;;24305:15;27:10:-1;;39:1;23:18;;45:23;;-1:-1;24305:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24368:17;;:41;;24390:18;24368:21;:41::i;:::-;24348:17;:61;24430:11;;:19;;;-1:-1:-1;;;24430:19:0;;;;-1:-1:-1;;;;;24430:11:0;;;;:17;;:19;;;;;;;;;;;;;;;:11;:19;;;5:2:-1;;;;30:1;27;20:12;5:2;24430:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24430:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24430:19:0;24483:11;;24430:74;;;-1:-1:-1;;;24430:74:0;;24463:10;24430:74;;;;-1:-1:-1;;;;;24483:11:0;;;24430:74;;;;;;;;;;;;:32;;;;;;;:74;;;;;:19;;:74;;;;;;;24483:11;24430:32;:74;;;5:2:-1;;;;30:1;27;20:12;5:2;24430:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24430:74:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24430:74:0;24422:141;;;;-1:-1:-1;;;24422:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24579:48;24592:6;24600:11;24613:13;:11;:13::i;:::-;24579:48;;;;;;;;;;;;;;;;;;;;;;;;;;3380:1;;;23520:1115;;:::o;3170:72::-;3207:7;3230:6;-1:-1:-1;;;;;3230:6:0;3170:72;:::o;3472:85::-;3511:4;3545:6;-1:-1:-1;;;;;3545:6:0;3531:10;:20;;3472:85::o;10881:102::-;10955:12;;:20;;;-1:-1:-1;;;10955:20:0;;;;10929:6;;-1:-1:-1;;;;;10955:12:0;;:18;;:20;;;;;;;;;;;;;;:12;:20;;;5:2:-1;;;;30:1;27;20:12;22775:104:0;22848:13;;:23;;;-1:-1:-1;;;22848:23:0;;;;22821:7;;-1:-1:-1;;;;;22848:13:0;;:21;;:23;;;;;;;;;;;;;;:13;:23;;;5:2:-1;;;;30:1;27;20:12;22949:109:0;23028:15;:22;22949:109;:::o;13991:98::-;14065:16;14074:6;14065:8;:16::i;7553:30::-;;;-1:-1:-1;;;;;7553:30:0;;:::o;4112:103::-;3363:9;:7;:9::i;:::-;3355:18;;;;;;4181:28;4200:8;4181:18;:28::i;:::-;4112:103;:::o;24891:912::-;24931:7;;;25011:13;:11;:13::i;:::-;24988:36;;25041:17;;25062:1;25041:22;25037:464;;;25097:12;25080:29;;25037:464;;;25142:22;;25183:148;25207:15;:22;25203:26;;25183:148;;;25272:43;25291:23;25312:1;25291:20;:23::i;:::-;25272:14;;:43;:18;:43;:::i;:::-;25255:60;-1:-1:-1;25231:3:0;;25183:148;;;-1:-1:-1;25399:17:0;;25362:55;;:32;:14;25381:12;25362:32;:18;:32;:::i;:55::-;25452:17;;25345:72;;-1:-1:-1;25452:37:0;;25474:14;25452:37;:21;:37;:::i;:::-;25432:17;:57;-1:-1:-1;25037:464:0;25517:18;;25513:249;;25560:11;;25589:13;;25560:60;;;-1:-1:-1;;;25560:60:0;;-1:-1:-1;;;;;25589:13:0;;;25560:60;;;;;;;;;;;;:11;;;;;:20;;:60;;;;;;;;;;;;;;:11;;:60;;;5:2:-1;;;;30:1;27;20:12;5:2;25560:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25560:60:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25560:60:0;25552:133;;;;-1:-1:-1;;;25552:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25705:45;25720:14;25736:13;:11;:13::i;:::-;25705:45;;;;;;;;;;;;;;;;;;;;;;25513:249;-1:-1:-1;25781:14:0;-1:-1:-1;24891:912:0;:::o;20618:101::-;20658:7;20693:17;:15;:17::i;:::-;20678:33;;20618:101;:::o;12235:1487::-;12343:1;12334:6;:10;12326:52;;;;;-1:-1:-1;;;12326:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12397:25:0;;12389:74;;;;-1:-1:-1;;;12389:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12482:18;;:23;;:44;;;12525:1;12509:13;:11;:13::i;:::-;:17;12482:44;12474:144;;;;-1:-1:-1;;;12474:144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12631:27;12683:1;12662:18;;:22;12661:139;;12777:22;;12766:34;;:6;;:34;:10;:34;:::i;:::-;12661:139;;;12701:49;12736:13;:11;:13::i;:::-;12701:18;;:30;;12724:6;12701:30;:22;:30;:::i;:49::-;12631:169;;12841:1;12819:19;:23;12811:70;;;;-1:-1:-1;;;12811:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12894:18;:16;:18::i;:::-;-1:-1:-1;;;;;;;;;12984:24:0;;12956:25;12984:24;;;:11;:24;;;;;13042:20;;12984:24;;-1:-1:-1;13042:45:0;;-1:-1:-1;13067:19:0;13042:24;:45::i;:::-;13019:68;;13134:3;13098:33;;;:39;13150:21;;:::i;:::-;-1:-1:-1;13174:31:0;;;;;;;;;;;13201:3;13174:31;;;;;;;-1:-1:-1;;;;;13216:24:0;;-1:-1:-1;13216:24:0;;;:11;:24;;;;;27:10:-1;;39:1;23:18;;;45:23;;13216:39:0;;;;;;;;;;;;;;;;;;;;;;;;;13322:18;;:43;;13180:19;13322:43;:22;:43;:::i;:::-;13301:18;:64;13504:12;;:20;;;-1:-1:-1;;;13504:20:0;;;;-1:-1:-1;;;;;13504:12:0;;;;:18;;:20;;;;;;;;;;;;;;;:12;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;13504:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13504:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13504:20:0;13554:12;;13504:72;;;-1:-1:-1;;;13504:72:0;;-1:-1:-1;;;;;13504:72:0;;;;;;;13554:12;;;13504:72;;;;;;;;;;;;:33;;;;;;;:72;;;;;:20;;:72;;;;;;;13554:12;13504:33;:72;;;5:2:-1;;;;30:1;27;20:12;5:2;13504:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13504:72:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13504:72:0;13496:140;;;;-1:-1:-1;;;13496:140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13661:11;-1:-1:-1;;;;;13654:60:0;;13674:6;13682:27;13697:11;13682:14;:27::i;:::-;13654:60;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13654:60:0;;;;;;;;;;;;;12235:1487;;;;;;:::o;1119:136::-;1177:7;1206:1;1201;:6;;1193:15;;;;;;-1:-1:-1;1227:5:0;;;1119:136;;;;;:::o;217:393::-;275:7;503:6;499:37;;-1:-1:-1;527:1:0;520:8;;499:37;556:5;;;560:1;556;:5;:1;576:5;;;;;:10;568:19;;;;;1323:136;1381:7;1409:5;;;1429:6;;;;1421:15;;;;;725:276;783:7;811:1;807;:5;799:14;;;;;;878:9;894:1;890;:5;;;;;;;725:276;-1:-1:-1;;;;725:276:0:o;14675:3343::-;14726:7;14746:18;:16;:18::i;:::-;;;;;;;14813:1;14804:6;:10;14796:54;;;;;-1:-1:-1;;;14796:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14899:6;14869:26;14884:10;14869:14;:26::i;:::-;:36;;14861:119;;;;-1:-1:-1;;;14861:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14991:27;15021:49;15056:13;:11;:13::i;:::-;15021:18;;:30;;15044:6;15021:30;:22;:30;:::i;:49::-;14991:79;;15111:1;15089:19;:23;15081:80;;;;-1:-1:-1;;;15081:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15245:10;15205:25;15233:23;;;:11;:23;;;;;;;;15299:11;:23;;;;;15233;;15478:19;15205:25;15543:1298;15550:20;;15543:1298;;15627:20;;15587:23;;15613:13;;-1:-1:-1;;15627:24:0;;;15613:39;;;;;;;;;;;;;;;;15587:65;;15667:20;15690:31;15698:9;:22;;;15690:3;:7;;:31;;;;:::i;:::-;15795:23;;15667:54;;-1:-1:-1;15736:36:0;;15795:43;-1:-1:-1;15791:1039:0;;15936:23;;:41;;15964:12;15936:41;:27;:41;:::i;:::-;15905:72;;16011:74;16028:12;16042:28;16072:12;16011:16;:74::i;:::-;15996:89;-1:-1:-1;16132:59:0;:25;16162:28;16132:59;:29;:59;:::i;:::-;16250:23;;16104:87;;-1:-1:-1;16229:45:0;;:16;;:45;:20;:45;:::i;:::-;16293:22;;16210:64;;-1:-1:-1;16293:22:0;:13;-1:-1:-1;;16293:22:0;;;:::i;:::-;;15791:1039;;;16437:34;:16;16458:12;16437:34;:20;:34;:::i;:::-;16406:65;;16505:74;16522:12;16536:28;16566:12;16505:16;:74::i;:::-;16490:89;-1:-1:-1;16626:59:0;:25;16656:28;16626:59;:29;:59;:::i;:::-;16730:23;;16598:87;;-1:-1:-1;16730:45:0;;16758:16;16730:45;:27;:45;:::i;:::-;16704:71;;:23;;-1:-1:-1;15791:1039:0;15543:1298;;;;;;16880:26;;;;:57;;16911:25;16880:57;:30;:57;:::i;:::-;16851:26;;;:86;16971:20;;:45;;16996:19;16971:45;:24;:45;:::i;:::-;16948:68;;17187:25;;:56;;17217:25;17187:56;:29;:56;:::i;:::-;17159:25;:84;17275:18;;:43;;17298:19;17275:43;:22;:43;:::i;:::-;17254:18;:64;17455:12;;:41;;;-1:-1:-1;;;17455:41:0;;17477:10;17455:41;;;;;;;;;;;;-1:-1:-1;;;;;17455:12:0;;;;:21;;:41;;;;;;;;;;;;;;;:12;;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;17455:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17455:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17455:41:0;17447:111;;;;-1:-1:-1;;;17447:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17577:13;;:48;;;-1:-1:-1;;;17577:48:0;;17600:10;17577:48;;;;;;;;;;;;-1:-1:-1;;;;;17577:13:0;;;;:22;;:48;;;;;;;;;;;;;;;:13;;:48;;;5:2:-1;;;;30:1;27;20:12;5:2;17577:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17577:48:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17577:48:0;17569:119;;;;-1:-1:-1;;;17569:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17715:10;17706:60;17727:6;17735:26;17715:10;17735:14;:26::i;:::-;17706:60;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17706:60:0;;;;;;;;;;;;;17782:39;;;;;;;;17796:10;;17782:39;;;;;;;;;;17842:18;;:23;;:44;;;17885:1;17869:13;:11;:13::i;:::-;:17;17842:44;17834:146;;;;-1:-1:-1;;;17834:146:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17998:12;14675:3343;-1:-1:-1;;;;;;;14675:3343:0:o;4355:173::-;-1:-1:-1;;;;;4425:22:0;;4417:31;;;;;;4481:6;;;4460:38;;-1:-1:-1;;;;;4460:38:0;;;;4481:6;;;4460:38;;;4505:6;:17;;-1:-1:-1;;;;;;4505:17:0;-1:-1:-1;;;;;4505:17:0;;;;;;;;;;4355:173::o;26173:920::-;26231:7;26251:31;26285:15;26301:1;26285:18;;;;;;;;;;;;;;;;;;26251:52;;26346:8;:28;;;26319:8;:23;;;:55;26316:95;;26398:1;26391:8;;;;;26316:95;26546:17;;;;26423:22;;26539:3;:24;26535:437;;26631:23;;;;26598:28;;:57;;;:32;:57;:::i;:::-;26705:17;;;;26671:31;;;:51;26580:76;-1:-1:-1;26535:437:0;;;26772:136;26887:8;:20;;;26772:92;26835:8;:28;;;26772:40;26780:8;:31;;;26772:3;:7;;:40;;;;:::i;:136::-;26957:3;26923:31;;;:37;26755:153;-1:-1:-1;26535:437:0;27010:23;;;;:43;;27038:14;27010:43;:27;:43;:::i;:::-;26984:23;;;;:69;;;;27071:14;-1:-1:-1;26173:920:0;;;:::o;18994:808::-;19188:7;19210:23;19249:99;19322:25;;19249:54;19283:19;19249:15;:13;:15::i;:99::-;19210:138;;19381:14;;19365:12;:30;19361:110;;19419:40;:19;19443:15;19419:40;:23;:40;:::i;:::-;19412:47;;;;;19361:110;19483:21;7710:1;19507:2;:18;19483:42;;19536:21;19573:165;19724:13;19573:132;19689:15;19573:97;19602:67;19654:14;;19602:47;19636:12;19602:29;19620:10;;19602:13;:17;;:29;;;;:::i;:67::-;19573:10;;;:97;:28;:97;:::i;:165::-;19536:202;-1:-1:-1;19756:38:0;:19;19536:202;19756:38;:23;:38;:::i;7006:20619::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://4218c4b1c95dd3e6faefdaf555019a8ea6a8260055659224a18de7a07faed9e5

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