Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 24,940 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Unstake | 19729490 | 79 days ago | IN | 0 ETH | 0.00160865 | ||||
Unstake | 19724231 | 80 days ago | IN | 0 ETH | 0.00266208 | ||||
Unstake | 19396416 | 126 days ago | IN | 0 ETH | 0.00785144 | ||||
Unstake | 18295281 | 280 days ago | IN | 0 ETH | 0.000798 | ||||
Unstake | 17616658 | 375 days ago | IN | 0 ETH | 0.00225703 | ||||
Unlock Tokens | 17521396 | 388 days ago | IN | 0 ETH | 0.00112743 | ||||
Unstake | 17487775 | 393 days ago | IN | 0 ETH | 0.00364483 | ||||
Unstake | 16812278 | 488 days ago | IN | 0 ETH | 0.00392823 | ||||
Unstake | 16639632 | 513 days ago | IN | 0 ETH | 0.00571372 | ||||
Unstake | 16559808 | 524 days ago | IN | 0 ETH | 0.00296247 | ||||
Unstake | 16403973 | 546 days ago | IN | 0 ETH | 0.00322135 | ||||
Unstake | 16130466 | 584 days ago | IN | 0 ETH | 0.00232134 | ||||
Unstake | 15966205 | 607 days ago | IN | 0 ETH | 0.00232485 | ||||
Unstake | 15651039 | 651 days ago | IN | 0 ETH | 0.00145442 | ||||
Unstake Query | 15302891 | 704 days ago | IN | 0 ETH | 0.00425692 | ||||
Unstake | 15267530 | 710 days ago | IN | 0 ETH | 0.00093271 | ||||
Unstake | 15148439 | 728 days ago | IN | 0 ETH | 0.00510279 | ||||
Unstake | 14890872 | 771 days ago | IN | 0 ETH | 0.00257999 | ||||
Unstake | 14890862 | 771 days ago | IN | 0 ETH | 0.00300946 | ||||
Unstake | 14890862 | 771 days ago | IN | 0 ETH | 0.00298712 | ||||
Unstake | 14890862 | 771 days ago | IN | 0 ETH | 0.00494673 | ||||
Unstake | 14682927 | 805 days ago | IN | 0 ETH | 0.00716284 | ||||
Unstake | 14545997 | 826 days ago | IN | 0 ETH | 0.01015215 | ||||
Unstake | 14341124 | 858 days ago | IN | 0 ETH | 0.00663698 | ||||
Unstake | 14326320 | 861 days ago | IN | 0 ETH | 0.00341243 |
Latest 3 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
10439190 | 1462 days ago | Contract Creation | 0 ETH | |||
10439190 | 1462 days ago | Contract Creation | 0 ETH | |||
10439190 | 1462 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
TokenGeyser
Compiler Version
v0.5.0+commit.1d4f565a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-07-11 */ // File: openzeppelin-solidity/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot 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-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: openzeppelin-solidity/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: openzeppelin-solidity/contracts/GSN/Context.sol pragma solidity ^0.5.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: openzeppelin-solidity/contracts/ownership/Ownable.sol pragma solidity ^0.5.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { _owner = _msgSender(); emit OwnershipTransferred(address(0), _owner); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _owner; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/IStaking.sol pragma solidity 0.5.0; /** * @title Staking interface, as defined by EIP-900. * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-900.md */ 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; } } // File: contracts/TokenPool.sol pragma solidity 0.5.0; /** * @title A simple holder of tokens. * This is a simple contract to hold tokens. It's useful in the case where a separate contract * needs to hold multiple distinct pools of the same token. */ 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); } } // File: contracts/TokenGeyser.sol pragma solidity 0.5.0; /** * @title Token Geyser * @dev A smart-contract based mechanism to distribute tokens over time, inspired loosely by * Compound and Uniswap. * * 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 TokenGeyser 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 private _stakingPool; TokenPool private _unlockedPool; TokenPool private _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, 'TokenGeyser: start bonus too high'); // If no period is desired, instead set startBonus = 100% // and bonusPeriod to a small value like 1sec. require(bonusPeriodSec_ != 0, 'TokenGeyser: bonus period is zero'); require(initialSharesPerToken > 0, 'TokenGeyser: 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, 'TokenGeyser: stake amount is zero'); require(beneficiary != address(0), 'TokenGeyser: beneficiary is zero address'); require(totalStakingShares == 0 || totalStaked() > 0, 'TokenGeyser: 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, 'TokenGeyser: 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), 'TokenGeyser: 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, 'TokenGeyser: unstake amount is zero'); require(totalStakedFor(msg.sender) >= amount, 'TokenGeyser: unstake amount is greater than total user stakes'); uint256 stakingSharesToBurn = totalStakingShares.mul(amount).div(totalStaked()); require(stakingSharesToBurn > 0, 'TokenGeyser: 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), 'TokenGeyser: transfer out of staking pool failed'); require(_unlockedPool.transfer(msg.sender, rewardAmount), 'TokenGeyser: transfer out of unlocked pool failed'); emit Unstaked(msg.sender, amount, totalStakedFor(msg.sender), ""); emit TokensClaimed(msg.sender, rewardAmount); require(totalStakingShares == 0 || totalStaked() > 0, "TokenGeyser: 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, 'TokenGeyser: 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), 'TokenGeyser: 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), 'TokenGeyser: 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; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[{"name":"amount","type":"uint256"},{"name":"data","type":"bytes"}],"name":"stake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"user","type":"address"},{"name":"amount","type":"uint256"},{"name":"data","type":"bytes"}],"name":"stakeFor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"BONUS_DECIMALS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getDistributionToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"startBonus","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"updateAccounting","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"totalStakedFor","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalLocked","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"unlockSchedules","outputs":[{"name":"initialLockedShares","type":"uint256"},{"name":"unlockedShares","type":"uint256"},{"name":"lastUnlockTimestampSec","type":"uint256"},{"name":"endAtSec","type":"uint256"},{"name":"durationSec","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"supportsHistory","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"totalStakingShares","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"bonusPeriodSec","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalStaked","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalLockedShares","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"unstakeQuery","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"},{"name":"durationSec","type":"uint256"}],"name":"lockTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStakingToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalUnlocked","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"unlockScheduleCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"},{"name":"data","type":"bytes"}],"name":"unstake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unlockTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"stakingToken","type":"address"},{"name":"distributionToken","type":"address"},{"name":"maxUnlockSchedules","type":"uint256"},{"name":"startBonus_","type":"uint256"},{"name":"bonusPeriodSec_","type":"uint256"},{"name":"initialSharesPerToken","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"user","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"total","type":"uint256"},{"indexed":false,"name":"data","type":"bytes"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"user","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"total","type":"uint256"},{"indexed":false,"name":"data","type":"bytes"}],"name":"Unstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"user","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"TokensClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"durationSec","type":"uint256"},{"indexed":false,"name":"total","type":"uint256"}],"name":"TokensLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"total","type":"uint256"}],"name":"TokensUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]
Contract Creation Code
608060405260006004556000600555600060065560006007556000600855426009556000600a556000600b553480156200003857600080fd5b5060405160c08062004437833981018060405260c08110156200005a57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050620000b662000558640100000000026401000000009004565b6000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36002600a0a831115151562000214576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f546f6b656e4765797365723a20737461727420626f6e757320746f6f2068696781526020017f680000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60008214151515620002b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f546f6b656e4765797365723a20626f6e757320706572696f64206973207a657281526020017f6f0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60008111151562000353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001807f546f6b656e4765797365723a20696e697469616c536861726573506572546f6b81526020017f656e206973207a65726f0000000000000000000000000000000000000000000081525060400191505060405180910390fd5b856200035e62000560565b808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f080158015620003b1573d6000803e3d6000fd5b50600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084620003fd62000560565b808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f08015801562000450573d6000803e3d6000fd5b50600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550846200049c62000560565b808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f080158015620004ef573d6000803e3d6000fd5b50600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826004819055508160058190555083600a8190555080600b8190555050505050505062000571565b600033905090565b604051610a8c80620039ab83390190565b61342a80620005816000396000f3fe608060405260043610610154576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630e89439b146101595780630ef96356146101e95780631dc27fde1461029957806322c12b84146102c457806338b45fde1461031b578063494347e7146103465780634b341aed1461039457806356891412146103f95780635c94bcb2146104245780637033e4a61461048f57806370c6a17e146104be578063715018a6146104e95780637c6aa6f414610500578063817b1cd21461052b57806381c39bec1461055657806386805dd11461058157806389158d8e146105d05780638da5cb5b146106155780638f32d59b1461066c5780639f9106d11461069b578063a779d080146106f2578063c7ae20071461071d578063c8fd6ed014610748578063f2fde38b146107d8578063f968f49314610829578063fc0c546a14610854575b600080fd5b34801561016557600080fd5b506101e76004803603604081101561017c57600080fd5b8101908080359060200190929190803590602001906401000000008111156101a357600080fd5b8201836020820111156101b557600080fd5b803590602001918460018302840111640100000000831117156101d757600080fd5b90919293919293905050506108ab565b005b3480156101f557600080fd5b506102976004803603606081101561020c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561025357600080fd5b82018360208201111561026557600080fd5b8035906020019184600183028401116401000000008311171561028757600080fd5b90919293919293905050506108bb565b005b3480156102a557600080fd5b506102ae610948565b6040518082815260200191505060405180910390f35b3480156102d057600080fd5b506102d961094d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561032757600080fd5b50610330610bc6565b6040518082815260200191505060405180910390f35b34801561035257600080fd5b5061035b610bcc565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b3480156103a057600080fd5b506103e3600480360360208110156103b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d42565b6040518082815260200191505060405180910390f35b34801561040557600080fd5b5061040e610dcc565b6040518082815260200191505060405180910390f35b34801561043057600080fd5b5061045d6004803603602081101561044757600080fd5b8101908080359060200190929190505050610e92565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b34801561049b57600080fd5b506104a4610ed7565b604051808215151515815260200191505060405180910390f35b3480156104ca57600080fd5b506104d3610edf565b6040518082815260200191505060405180910390f35b3480156104f557600080fd5b506104fe610ee5565b005b34801561050c57600080fd5b50610515611020565b6040518082815260200191505060405180910390f35b34801561053757600080fd5b50610540611026565b6040518082815260200191505060405180910390f35b34801561056257600080fd5b5061056b6110ec565b6040518082815260200191505060405180910390f35b34801561058d57600080fd5b506105ba600480360360208110156105a457600080fd5b81019080803590602001909291905050506110f2565b6040518082815260200191505060405180910390f35b3480156105dc57600080fd5b50610613600480360360408110156105f357600080fd5b810190808035906020019092919080359060200190929190505050611104565b005b34801561062157600080fd5b5061062a61162c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561067857600080fd5b50610681611655565b604051808215151515815260200191505060405180910390f35b3480156106a757600080fd5b506106b06116b3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156106fe57600080fd5b50610707611779565b6040518082815260200191505060405180910390f35b34801561072957600080fd5b5061073261183f565b6040518082815260200191505060405180910390f35b34801561075457600080fd5b506107d66004803603604081101561076b57600080fd5b81019080803590602001909291908035906020019064010000000081111561079257600080fd5b8201836020820111156107a457600080fd5b803590602001918460018302840111640100000000831117156107c657600080fd5b909192939192939050505061184c565b005b3480156107e457600080fd5b50610827600480360360208110156107fb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061185b565b005b34801561083557600080fd5b5061083e6118e3565b6040518082815260200191505060405180910390f35b34801561086057600080fd5b50610869611ba6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108b6333385611bb5565b505050565b6108c3611655565b1515610937576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b610942338585611bb5565b50505050565b600281565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156109d357600080fd5b505afa1580156109e7573d6000803e3d6000fd5b505050506040513d60208110156109fd57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610aa857600080fd5b505afa158015610abc573d6000803e3d6000fd5b505050506040513d6020811015610ad257600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16141515610b0257fe5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610b8657600080fd5b505afa158015610b9a573d6000803e3d6000fd5b505050506040513d6020811015610bb057600080fd5b8101908080519060200190929190505050905090565b60045481565b600080600080600080610bdd6118e3565b506000610c09600754610bfb6009544261232590919063ffffffff16565b61236f90919063ffffffff16565b9050610c208160085461243c90919063ffffffff16565b600881905550426009819055506000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000610c9f8260000154610c9184600201544261232590919063ffffffff16565b61236f90919063ffffffff16565b9050610cb881836001015461243c90919063ffffffff16565b826001018190555042826002018190555060008060085411610cdb576000610d0e565b610d0d600854610cff8560010154610cf1611779565b61236f90919063ffffffff16565b6124c690919063ffffffff16565b5b9050610d18610dcc565b610d20611779565b8460010154600854844299509950995099509950995050505050909192939495565b60008060075411610d54576000610dc5565b610dc4600754610db6600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154610da8611026565b61236f90919063ffffffff16565b6124c690919063ffffffff16565b5b9050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610e5257600080fd5b505afa158015610e66573d6000803e3d6000fd5b505050506040513d6020811015610e7c57600080fd5b8101908080519060200190929190505050905090565b600e81815481101515610ea157fe5b90600052602060002090600502016000915090508060000154908060010154908060020154908060030154908060040154905085565b600080905090565b60075481565b610eed611655565b1515610f61576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60055481565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156110ac57600080fd5b505afa1580156110c0573d6000803e3d6000fd5b505050506040513d60208110156110d657600080fd5b8101908080519060200190929190505050905090565b60065481565b60006110fd82612510565b9050919050565b61110c611655565b1515611180576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600a54600e80549050101515611224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f546f6b656e4765797365723a2072656163686564206d6178696d756d20756e6c81526020017f6f636b207363686564756c65730000000000000000000000000000000000000081525060400191505060405180910390fd5b61122c610bcc565b505050505050600061123c610dcc565b905060008082116112615761125c600b548561236f90919063ffffffff16565b611289565b6112888261127a8660065461236f90919063ffffffff16565b6124c690919063ffffffff16565b5b9050611293613353565b81816000018181525050428160400181815250506112ba844261243c90919063ffffffff16565b81606001818152505083816080018181525050600e819080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401555050506113458260065461243c90919063ffffffff16565b600681905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156113cf57600080fd5b505afa1580156113e3573d6000803e3d6000fd5b505050506040513d60208110156113f957600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166323b872dd33600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16886040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561150257600080fd5b505af1158015611516573d6000803e3d6000fd5b505050506040513d602081101561152c57600080fd5b810190808051906020019092919050505015156115d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f546f6b656e4765797365723a207472616e7366657220696e746f206c6f636b6581526020017f6420706f6f6c206661696c65640000000000000000000000000000000000000081525060400191505060405180910390fd5b7ff346961af4c52f314df1b45964746280fe409abb959d4a2458d58f79408b1fe88585611602610dcc565b60405180848152602001838152602001828152602001935050505060405180910390a15050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611697612e46565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561173957600080fd5b505afa15801561174d573d6000803e3d6000fd5b505050506040513d602081101561176357600080fd5b8101908080519060200190929190505050905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156117ff57600080fd5b505afa158015611813573d6000803e3d6000fd5b505050506040513d602081101561182957600080fd5b8101908080519060200190929190505050905090565b6000600e80549050905090565b61185583612510565b50505050565b611863611655565b15156118d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6118e081612e4e565b50565b6000806000905060006118f4610dcc565b90506000600654141561190957809150611992565b600080905060008090505b600e8054905081101561194b5761193c61192d82612fd7565b8361243c90919063ffffffff16565b91508080600101915050611914565b50611973600654611965848461236f90919063ffffffff16565b6124c690919063ffffffff16565b925061198a8160065461232590919063ffffffff16565b600681905550505b6000821115611b9e57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611a8257600080fd5b505af1158015611a96573d6000803e3d6000fd5b505050506040513d6020811015611aac57600080fd5b81019080805190602001909291905050501515611b57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001807f546f6b656e4765797365723a207472616e73666572206f7574206f66206c6f6381526020017f6b656420706f6f6c206661696c6564000000000000000000000000000000000081525060400191505060405180910390fd5b7f2e444eb379b177e88ce0649c6110a3b01099f03e297127919dd5e3b63a761a9c82611b81610dcc565b604051808381526020018281526020019250505060405180910390a15b819250505090565b6000611bb06116b3565b905090565b600081111515611c53576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f546f6b656e4765797365723a207374616b6520616d6f756e74206973207a657281526020017f6f0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611d1e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f546f6b656e4765797365723a2062656e6566696369617279206973207a65726f81526020017f206164647265737300000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60006007541480611d3657506000611d34611026565b115b1515611df6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604a8152602001807f546f6b656e4765797365723a20496e76616c69642073746174652e205374616b81526020017f696e67207368617265732065786973742c20627574206e6f207374616b696e6781526020017f20746f6b656e7320646f0000000000000000000000000000000000000000000081525060600191505060405180910390fd5b60008060075411611e1b57611e16600b548361236f90919063ffffffff16565b611e4a565b611e49611e26611026565b611e3b8460075461236f90919063ffffffff16565b6124c690919063ffffffff16565b5b9050600081111515611eea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f546f6b656e4765797365723a205374616b6520616d6f756e7420697320746f6f81526020017f20736d616c6c000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b611ef2610bcc565b5050505050506000600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611f5282826000015461243c90919063ffffffff16565b8160000181905550428160020181905550611f6b613383565b6040805190810160405280848152602001428152509050600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050906001820390600052602060002090600202016000909192909190915060008201518160000155602082015181600101555050506120198360075461243c90919063ffffffff16565b600781905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156120a357600080fd5b505afa1580156120b7573d6000803e3d6000fd5b505050506040513d60208110156120cd57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166323b872dd87600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156121d657600080fd5b505af11580156121ea573d6000803e3d6000fd5b505050506040513d602081101561220057600080fd5b810190808051906020019092919050505015156122ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001807f546f6b656e4765797365723a207472616e7366657220696e746f207374616b6981526020017f6e6720706f6f6c206661696c656400000000000000000000000000000000000081525060400191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff167fc65e53b88159e7d2c0fc12a0600072e28ae53ff73b4c1715369c30f160935142856122ed88610d42565b6040518083815260200182815260200180602001828103825260008152602001602001935050505060405180910390a2505050505050565b600061236783836040805190810160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506130ce565b905092915050565b6000808314156123825760009050612436565b6000828402905082848281151561239557fe5b04141515612431576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f81526020017f770000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b809150505b92915050565b60008082840190508381101515156124bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600061250883836040805190810160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613190565b905092915050565b600061251a610bcc565b5050505050506000821115156125be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f546f6b656e4765797365723a20756e7374616b6520616d6f756e74206973207a81526020017f65726f000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b816125c833610d42565b10151515612664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001807f546f6b656e4765797365723a20756e7374616b6520616d6f756e74206973206781526020017f726561746572207468616e20746f74616c2075736572207374616b657300000081525060400191505060405180910390fd5b6000612694612671611026565b6126868560075461236f90919063ffffffff16565b6124c690919063ffffffff16565b9050600081111515612734576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f546f6b656e4765797365723a20556e61626c6520746f20756e7374616b65206181526020017f6d6f756e74207468697320736d616c6c0000000000000000000000000000000081525060400191505060405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000809050600084905060008090505b60008211156128f85760008460018680549050038154811015156127ea57fe5b90600052602060002090600202019050600061281382600101544261232590919063ffffffff16565b905060008090508483600001541115156128955761283e82846000015461236f90919063ffffffff16565b905061284b84828461325a565b9350612860818761243c90919063ffffffff16565b955061287983600001548661232590919063ffffffff16565b94508680548091906001900361288f919061339d565b506128f0565b6128a8828661236f90919063ffffffff16565b90506128b584828461325a565b93506128ca818761243c90919063ffffffff16565b95506128e385846000015461232590919063ffffffff16565b8360000181905550600094505b5050506127ca565b61290f83866001015461232590919063ffffffff16565b856001018190555061292e86866000015461232590919063ffffffff16565b856000018190555061294b8360085461232590919063ffffffff16565b6008819055506129668660075461232590919063ffffffff16565b600781905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338a6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612a3157600080fd5b505af1158015612a45573d6000803e3d6000fd5b505050506040513d6020811015612a5b57600080fd5b81019080805190602001909291905050501515612b06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f546f6b656e4765797365723a207472616e73666572206f7574206f662073746181526020017f6b696e6720706f6f6c206661696c65640000000000000000000000000000000081525060400191505060405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612bcb57600080fd5b505af1158015612bdf573d6000803e3d6000fd5b505050506040513d6020811015612bf557600080fd5b81019080805190602001909291905050501515612ca0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001807f546f6b656e4765797365723a207472616e73666572206f7574206f6620756e6c81526020017f6f636b656420706f6f6c206661696c656400000000000000000000000000000081525060400191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167faf01bfc8475df280aca00b578c4a948e6d95700f0db8c13365240f7f973c875489612ce233610d42565b6040518083815260200182815260200180602001828103825260008152602001602001935050505060405180910390a23373ffffffffffffffffffffffffffffffffffffffff167f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e430826040518082815260200191505060405180910390a260006007541480612d7857506000612d76611026565b115b1515612e38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c8152602001807f546f6b656e4765797365723a204572726f7220756e7374616b696e672e20537481526020017f616b696e67207368617265732065786973742c20627574206e6f207374616b6981526020017f6e6720746f6b656e7320646f000000000000000000000000000000000000000081525060600191505060405180910390fd5b809650505050505050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612f19576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526020017f646472657373000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600e83815481101515612fe957fe5b90600052602060002090600502019050806000015481600101541015156130145760009150506130c9565b6000809050816003015442101515613055576130418260010154836000015461232590919063ffffffff16565b9050816003015482600201819055506130a4565b613098826004015461308a846000015461307c86600201544261232590919063ffffffff16565b61236f90919063ffffffff16565b6124c690919063ffffffff16565b90504282600201819055505b6130bb81836001015461243c90919063ffffffff16565b826001018190555080925050505b919050565b6000838311158290151561317d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613142578082015181840152602081019050613127565b50505050905090810190601f16801561316f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083118290151561323e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156132035780820151818401526020810190506131e8565b50505050905090810190601f1680156132305780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581151561324c57fe5b049050809150509392505050565b60008061328b60085461327d8661326f611779565b61236f90919063ffffffff16565b6124c690919063ffffffff16565b9050600554831015156132b3576132ab818661243c90919063ffffffff16565b91505061334c565b60006002600a0a9050600061333182613323856133156133046005546132f68c6132e86004548c61232590919063ffffffff16565b61236f90919063ffffffff16565b6124c690919063ffffffff16565b60045461243c90919063ffffffff16565b61236f90919063ffffffff16565b6124c690919063ffffffff16565b9050613346818861243c90919063ffffffff16565b93505050505b9392505050565b60a06040519081016040528060008152602001600081526020016000815260200160008152602001600081525090565b604080519081016040528060008152602001600081525090565b8154818355818111156133ca576002028160020283600052602060002091820191016133c991906133cf565b5b505050565b6133fb91905b808211156133f7576000808201600090556001820160009055506002016133d5565b5090565b9056fea165627a7a72305820f77d31fea98651e76c2c5e14c30cc127fcdecf1356bdf0adc189fd7be24c7ede0029608060405234801561001057600080fd5b50604051602080610a8c8339810180604052602081101561003057600080fd5b810190808051906020019092919050505061005861015a640100000000026401000000009004565b6000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610162565b600033905090565b61091b806101716000396000f3fe608060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063715018a6146100885780638da5cb5b1461009f5780638f32d59b146100f6578063a9059cbb14610125578063b69ef8a814610198578063f2fde38b146101c3578063fc0c546a14610214575b600080fd5b34801561009457600080fd5b5061009d61026b565b005b3480156100ab57600080fd5b506100b46103a6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561010257600080fd5b5061010b6103cf565b604051808215151515815260200191505060405180910390f35b34801561013157600080fd5b5061017e6004803603604081101561014857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061042d565b604051808215151515815260200191505060405180910390f35b3480156101a457600080fd5b506101ad6105b3565b6040518082815260200191505060405180910390f35b3480156101cf57600080fd5b50610212600480360360208110156101e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506106b0565b005b34801561022057600080fd5b50610229610738565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102736103cf565b15156102e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661041161075e565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b60006104376103cf565b15156104ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561057057600080fd5b505af1158015610584573d6000803e3d6000fd5b505050506040513d602081101561059a57600080fd5b8101908080519060200190929190505050905092915050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561067057600080fd5b505afa158015610684573d6000803e3d6000fd5b505050506040513d602081101561069a57600080fd5b8101908080519060200190929190505050905090565b6106b86103cf565b151561072c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61073581610766565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610831576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526020017f646472657373000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505056fea165627a7a723058205df2dfdc9d05e2cef7f8a2b1178178a6cfb08c1b3b21b2a1a4e7612601c40a120029000000000000000000000000c5be99a02c6857f9eac67bbce58df5572498f40c000000000000000000000000d46ba6d942050d489dbd938a2c909a5d5039a1610000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000004f1a0000000000000000000000000000000000000000000000000000000000000f4240
Deployed Bytecode
0x608060405260043610610154576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630e89439b146101595780630ef96356146101e95780631dc27fde1461029957806322c12b84146102c457806338b45fde1461031b578063494347e7146103465780634b341aed1461039457806356891412146103f95780635c94bcb2146104245780637033e4a61461048f57806370c6a17e146104be578063715018a6146104e95780637c6aa6f414610500578063817b1cd21461052b57806381c39bec1461055657806386805dd11461058157806389158d8e146105d05780638da5cb5b146106155780638f32d59b1461066c5780639f9106d11461069b578063a779d080146106f2578063c7ae20071461071d578063c8fd6ed014610748578063f2fde38b146107d8578063f968f49314610829578063fc0c546a14610854575b600080fd5b34801561016557600080fd5b506101e76004803603604081101561017c57600080fd5b8101908080359060200190929190803590602001906401000000008111156101a357600080fd5b8201836020820111156101b557600080fd5b803590602001918460018302840111640100000000831117156101d757600080fd5b90919293919293905050506108ab565b005b3480156101f557600080fd5b506102976004803603606081101561020c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561025357600080fd5b82018360208201111561026557600080fd5b8035906020019184600183028401116401000000008311171561028757600080fd5b90919293919293905050506108bb565b005b3480156102a557600080fd5b506102ae610948565b6040518082815260200191505060405180910390f35b3480156102d057600080fd5b506102d961094d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561032757600080fd5b50610330610bc6565b6040518082815260200191505060405180910390f35b34801561035257600080fd5b5061035b610bcc565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b3480156103a057600080fd5b506103e3600480360360208110156103b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d42565b6040518082815260200191505060405180910390f35b34801561040557600080fd5b5061040e610dcc565b6040518082815260200191505060405180910390f35b34801561043057600080fd5b5061045d6004803603602081101561044757600080fd5b8101908080359060200190929190505050610e92565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b34801561049b57600080fd5b506104a4610ed7565b604051808215151515815260200191505060405180910390f35b3480156104ca57600080fd5b506104d3610edf565b6040518082815260200191505060405180910390f35b3480156104f557600080fd5b506104fe610ee5565b005b34801561050c57600080fd5b50610515611020565b6040518082815260200191505060405180910390f35b34801561053757600080fd5b50610540611026565b6040518082815260200191505060405180910390f35b34801561056257600080fd5b5061056b6110ec565b6040518082815260200191505060405180910390f35b34801561058d57600080fd5b506105ba600480360360208110156105a457600080fd5b81019080803590602001909291905050506110f2565b6040518082815260200191505060405180910390f35b3480156105dc57600080fd5b50610613600480360360408110156105f357600080fd5b810190808035906020019092919080359060200190929190505050611104565b005b34801561062157600080fd5b5061062a61162c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561067857600080fd5b50610681611655565b604051808215151515815260200191505060405180910390f35b3480156106a757600080fd5b506106b06116b3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156106fe57600080fd5b50610707611779565b6040518082815260200191505060405180910390f35b34801561072957600080fd5b5061073261183f565b6040518082815260200191505060405180910390f35b34801561075457600080fd5b506107d66004803603604081101561076b57600080fd5b81019080803590602001909291908035906020019064010000000081111561079257600080fd5b8201836020820111156107a457600080fd5b803590602001918460018302840111640100000000831117156107c657600080fd5b909192939192939050505061184c565b005b3480156107e457600080fd5b50610827600480360360208110156107fb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061185b565b005b34801561083557600080fd5b5061083e6118e3565b6040518082815260200191505060405180910390f35b34801561086057600080fd5b50610869611ba6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108b6333385611bb5565b505050565b6108c3611655565b1515610937576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b610942338585611bb5565b50505050565b600281565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156109d357600080fd5b505afa1580156109e7573d6000803e3d6000fd5b505050506040513d60208110156109fd57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610aa857600080fd5b505afa158015610abc573d6000803e3d6000fd5b505050506040513d6020811015610ad257600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16141515610b0257fe5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610b8657600080fd5b505afa158015610b9a573d6000803e3d6000fd5b505050506040513d6020811015610bb057600080fd5b8101908080519060200190929190505050905090565b60045481565b600080600080600080610bdd6118e3565b506000610c09600754610bfb6009544261232590919063ffffffff16565b61236f90919063ffffffff16565b9050610c208160085461243c90919063ffffffff16565b600881905550426009819055506000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000610c9f8260000154610c9184600201544261232590919063ffffffff16565b61236f90919063ffffffff16565b9050610cb881836001015461243c90919063ffffffff16565b826001018190555042826002018190555060008060085411610cdb576000610d0e565b610d0d600854610cff8560010154610cf1611779565b61236f90919063ffffffff16565b6124c690919063ffffffff16565b5b9050610d18610dcc565b610d20611779565b8460010154600854844299509950995099509950995050505050909192939495565b60008060075411610d54576000610dc5565b610dc4600754610db6600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154610da8611026565b61236f90919063ffffffff16565b6124c690919063ffffffff16565b5b9050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610e5257600080fd5b505afa158015610e66573d6000803e3d6000fd5b505050506040513d6020811015610e7c57600080fd5b8101908080519060200190929190505050905090565b600e81815481101515610ea157fe5b90600052602060002090600502016000915090508060000154908060010154908060020154908060030154908060040154905085565b600080905090565b60075481565b610eed611655565b1515610f61576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60055481565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156110ac57600080fd5b505afa1580156110c0573d6000803e3d6000fd5b505050506040513d60208110156110d657600080fd5b8101908080519060200190929190505050905090565b60065481565b60006110fd82612510565b9050919050565b61110c611655565b1515611180576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600a54600e80549050101515611224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f546f6b656e4765797365723a2072656163686564206d6178696d756d20756e6c81526020017f6f636b207363686564756c65730000000000000000000000000000000000000081525060400191505060405180910390fd5b61122c610bcc565b505050505050600061123c610dcc565b905060008082116112615761125c600b548561236f90919063ffffffff16565b611289565b6112888261127a8660065461236f90919063ffffffff16565b6124c690919063ffffffff16565b5b9050611293613353565b81816000018181525050428160400181815250506112ba844261243c90919063ffffffff16565b81606001818152505083816080018181525050600e819080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401555050506113458260065461243c90919063ffffffff16565b600681905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156113cf57600080fd5b505afa1580156113e3573d6000803e3d6000fd5b505050506040513d60208110156113f957600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166323b872dd33600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16886040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561150257600080fd5b505af1158015611516573d6000803e3d6000fd5b505050506040513d602081101561152c57600080fd5b810190808051906020019092919050505015156115d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f546f6b656e4765797365723a207472616e7366657220696e746f206c6f636b6581526020017f6420706f6f6c206661696c65640000000000000000000000000000000000000081525060400191505060405180910390fd5b7ff346961af4c52f314df1b45964746280fe409abb959d4a2458d58f79408b1fe88585611602610dcc565b60405180848152602001838152602001828152602001935050505060405180910390a15050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611697612e46565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561173957600080fd5b505afa15801561174d573d6000803e3d6000fd5b505050506040513d602081101561176357600080fd5b8101908080519060200190929190505050905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156117ff57600080fd5b505afa158015611813573d6000803e3d6000fd5b505050506040513d602081101561182957600080fd5b8101908080519060200190929190505050905090565b6000600e80549050905090565b61185583612510565b50505050565b611863611655565b15156118d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6118e081612e4e565b50565b6000806000905060006118f4610dcc565b90506000600654141561190957809150611992565b600080905060008090505b600e8054905081101561194b5761193c61192d82612fd7565b8361243c90919063ffffffff16565b91508080600101915050611914565b50611973600654611965848461236f90919063ffffffff16565b6124c690919063ffffffff16565b925061198a8160065461232590919063ffffffff16565b600681905550505b6000821115611b9e57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611a8257600080fd5b505af1158015611a96573d6000803e3d6000fd5b505050506040513d6020811015611aac57600080fd5b81019080805190602001909291905050501515611b57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001807f546f6b656e4765797365723a207472616e73666572206f7574206f66206c6f6381526020017f6b656420706f6f6c206661696c6564000000000000000000000000000000000081525060400191505060405180910390fd5b7f2e444eb379b177e88ce0649c6110a3b01099f03e297127919dd5e3b63a761a9c82611b81610dcc565b604051808381526020018281526020019250505060405180910390a15b819250505090565b6000611bb06116b3565b905090565b600081111515611c53576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f546f6b656e4765797365723a207374616b6520616d6f756e74206973207a657281526020017f6f0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611d1e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f546f6b656e4765797365723a2062656e6566696369617279206973207a65726f81526020017f206164647265737300000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60006007541480611d3657506000611d34611026565b115b1515611df6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604a8152602001807f546f6b656e4765797365723a20496e76616c69642073746174652e205374616b81526020017f696e67207368617265732065786973742c20627574206e6f207374616b696e6781526020017f20746f6b656e7320646f0000000000000000000000000000000000000000000081525060600191505060405180910390fd5b60008060075411611e1b57611e16600b548361236f90919063ffffffff16565b611e4a565b611e49611e26611026565b611e3b8460075461236f90919063ffffffff16565b6124c690919063ffffffff16565b5b9050600081111515611eea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f546f6b656e4765797365723a205374616b6520616d6f756e7420697320746f6f81526020017f20736d616c6c000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b611ef2610bcc565b5050505050506000600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611f5282826000015461243c90919063ffffffff16565b8160000181905550428160020181905550611f6b613383565b6040805190810160405280848152602001428152509050600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050906001820390600052602060002090600202016000909192909190915060008201518160000155602082015181600101555050506120198360075461243c90919063ffffffff16565b600781905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156120a357600080fd5b505afa1580156120b7573d6000803e3d6000fd5b505050506040513d60208110156120cd57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166323b872dd87600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156121d657600080fd5b505af11580156121ea573d6000803e3d6000fd5b505050506040513d602081101561220057600080fd5b810190808051906020019092919050505015156122ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001807f546f6b656e4765797365723a207472616e7366657220696e746f207374616b6981526020017f6e6720706f6f6c206661696c656400000000000000000000000000000000000081525060400191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff167fc65e53b88159e7d2c0fc12a0600072e28ae53ff73b4c1715369c30f160935142856122ed88610d42565b6040518083815260200182815260200180602001828103825260008152602001602001935050505060405180910390a2505050505050565b600061236783836040805190810160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506130ce565b905092915050565b6000808314156123825760009050612436565b6000828402905082848281151561239557fe5b04141515612431576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f81526020017f770000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b809150505b92915050565b60008082840190508381101515156124bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600061250883836040805190810160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613190565b905092915050565b600061251a610bcc565b5050505050506000821115156125be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f546f6b656e4765797365723a20756e7374616b6520616d6f756e74206973207a81526020017f65726f000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b816125c833610d42565b10151515612664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001807f546f6b656e4765797365723a20756e7374616b6520616d6f756e74206973206781526020017f726561746572207468616e20746f74616c2075736572207374616b657300000081525060400191505060405180910390fd5b6000612694612671611026565b6126868560075461236f90919063ffffffff16565b6124c690919063ffffffff16565b9050600081111515612734576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f546f6b656e4765797365723a20556e61626c6520746f20756e7374616b65206181526020017f6d6f756e74207468697320736d616c6c0000000000000000000000000000000081525060400191505060405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000809050600084905060008090505b60008211156128f85760008460018680549050038154811015156127ea57fe5b90600052602060002090600202019050600061281382600101544261232590919063ffffffff16565b905060008090508483600001541115156128955761283e82846000015461236f90919063ffffffff16565b905061284b84828461325a565b9350612860818761243c90919063ffffffff16565b955061287983600001548661232590919063ffffffff16565b94508680548091906001900361288f919061339d565b506128f0565b6128a8828661236f90919063ffffffff16565b90506128b584828461325a565b93506128ca818761243c90919063ffffffff16565b95506128e385846000015461232590919063ffffffff16565b8360000181905550600094505b5050506127ca565b61290f83866001015461232590919063ffffffff16565b856001018190555061292e86866000015461232590919063ffffffff16565b856000018190555061294b8360085461232590919063ffffffff16565b6008819055506129668660075461232590919063ffffffff16565b600781905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338a6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612a3157600080fd5b505af1158015612a45573d6000803e3d6000fd5b505050506040513d6020811015612a5b57600080fd5b81019080805190602001909291905050501515612b06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f546f6b656e4765797365723a207472616e73666572206f7574206f662073746181526020017f6b696e6720706f6f6c206661696c65640000000000000000000000000000000081525060400191505060405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612bcb57600080fd5b505af1158015612bdf573d6000803e3d6000fd5b505050506040513d6020811015612bf557600080fd5b81019080805190602001909291905050501515612ca0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001807f546f6b656e4765797365723a207472616e73666572206f7574206f6620756e6c81526020017f6f636b656420706f6f6c206661696c656400000000000000000000000000000081525060400191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167faf01bfc8475df280aca00b578c4a948e6d95700f0db8c13365240f7f973c875489612ce233610d42565b6040518083815260200182815260200180602001828103825260008152602001602001935050505060405180910390a23373ffffffffffffffffffffffffffffffffffffffff167f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e430826040518082815260200191505060405180910390a260006007541480612d7857506000612d76611026565b115b1515612e38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c8152602001807f546f6b656e4765797365723a204572726f7220756e7374616b696e672e20537481526020017f616b696e67207368617265732065786973742c20627574206e6f207374616b6981526020017f6e6720746f6b656e7320646f000000000000000000000000000000000000000081525060600191505060405180910390fd5b809650505050505050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612f19576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526020017f646472657373000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600e83815481101515612fe957fe5b90600052602060002090600502019050806000015481600101541015156130145760009150506130c9565b6000809050816003015442101515613055576130418260010154836000015461232590919063ffffffff16565b9050816003015482600201819055506130a4565b613098826004015461308a846000015461307c86600201544261232590919063ffffffff16565b61236f90919063ffffffff16565b6124c690919063ffffffff16565b90504282600201819055505b6130bb81836001015461243c90919063ffffffff16565b826001018190555080925050505b919050565b6000838311158290151561317d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613142578082015181840152602081019050613127565b50505050905090810190601f16801561316f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083118290151561323e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156132035780820151818401526020810190506131e8565b50505050905090810190601f1680156132305780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581151561324c57fe5b049050809150509392505050565b60008061328b60085461327d8661326f611779565b61236f90919063ffffffff16565b6124c690919063ffffffff16565b9050600554831015156132b3576132ab818661243c90919063ffffffff16565b91505061334c565b60006002600a0a9050600061333182613323856133156133046005546132f68c6132e86004548c61232590919063ffffffff16565b61236f90919063ffffffff16565b6124c690919063ffffffff16565b60045461243c90919063ffffffff16565b61236f90919063ffffffff16565b6124c690919063ffffffff16565b9050613346818861243c90919063ffffffff16565b93505050505b9392505050565b60a06040519081016040528060008152602001600081526020016000815260200160008152602001600081525090565b604080519081016040528060008152602001600081525090565b8154818355818111156133ca576002028160020283600052602060002091820191016133c991906133cf565b5b505050565b6133fb91905b808211156133f7576000808201600090556001820160009055506002016133d5565b5090565b9056fea165627a7a72305820f77d31fea98651e76c2c5e14c30cc127fcdecf1356bdf0adc189fd7be24c7ede0029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c5be99a02c6857f9eac67bbce58df5572498f40c000000000000000000000000d46ba6d942050d489dbd938a2c909a5d5039a1610000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000004f1a0000000000000000000000000000000000000000000000000000000000000f4240
-----Decoded View---------------
Arg [0] : stakingToken (address): 0xc5be99A02C6857f9Eac67BbCE58DF5572498F40c
Arg [1] : distributionToken (address): 0xD46bA6D942050d489DBd938a2C909A5d5039A161
Arg [2] : maxUnlockSchedules (uint256): 10000
Arg [3] : startBonus_ (uint256): 33
Arg [4] : bonusPeriodSec_ (uint256): 5184000
Arg [5] : initialSharesPerToken (uint256): 1000000
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000c5be99a02c6857f9eac67bbce58df5572498f40c
Arg [1] : 000000000000000000000000d46ba6d942050d489dbd938a2c909a5d5039a161
Arg [2] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000021
Arg [4] : 00000000000000000000000000000000000000000000000000000000004f1a00
Arg [5] : 00000000000000000000000000000000000000000000000000000000000f4240
Deployed Bytecode Sourcemap
14831:20165:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19257:121;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19257:121:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19257:121:0;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;19257:121:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19257: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;19257:121:0;;;;;;;;;;;;;;;19650:142;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19650:142:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19650:142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;19650:142:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19650: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;19650:142:0;;;;;;;;;;;;;;;15501:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15501:42:0;;;;;;;;;;;;;;;;;;;;;;;18910:171;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18910:171:0;;;;;;;;;;;;;;;;;;;;;;;;;;;15550:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15550:29:0;;;;;;;;;;;;;;;;;;;;;;;29108:1281;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29108:1281:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27846:210;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27846:210:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27846:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30475:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30475:100:0;;;;;;;;;;;;;;;;;;;;;;;16996:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16996:39:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16996:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12981:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12981:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;15719:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15719:37:0;;;;;;;;;;;;;;;;;;;;;;;11342:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11342:140:0;;;;;;15586:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15586:33:0;;;;;;;;;;;;;;;;;;;;;;;28164:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28164:101:0;;;;;;;;;;;;;;;;;;;;;;;15676:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15676:36:0;;;;;;;;;;;;;;;;;;;;;;;22129:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22129:105:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22129:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31408:1123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31408:1123:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31408:1123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10531:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10531:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;10897:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10897:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;18725:102;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18725:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;30663:104;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30663:104:0;;;;;;;;;;;;;;;;;;;;;;;30837:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30837:109:0;;;;;;;;;;;;;;;;;;;;;;;21855:98;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21855:98:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21855:98:0;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;21855:98:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;21855: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;21855:98:0;;;;;;;;;;;;;;;11637:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11637:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11637:109:0;;;;;;;;;;;;;;;;;;;;;;32787:916;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32787:916:0;;;;;;;;;;;;;;;;;;;;;;;28506:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28506:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;19257:121;19329:41;19339:10;19351;19363:6;19329:9;:41::i;:::-;19257:121;;;:::o;19650:142::-;10743:9;:7;:9::i;:::-;10735:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19749:35;19759:10;19771:4;19777:6;19749:9;:35::i;:::-;19650:142;;;;:::o;15501:42::-;15542:1;15501:42;:::o;18910:171::-;18963:6;19014:11;;;;;;;;;;;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19014:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19014:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19014:19:0;;;;;;;;;;;;;;;;18989:44;;:13;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18989:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18989:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18989:21:0;;;;;;;;;;;;;;;;:44;;;18982:52;;;;;;19052:13;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19052:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19052:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19052:21:0;;;;;;;;;;;;;;;;19045:28;;18910:171;:::o;15550:29::-;;;;:::o;29108:1281::-;29162:7;29171;29180;29189;29198;29207;29229:14;:12;:14::i;:::-;;29286:30;29332:88;29401:18;;29332:50;29354:27;;29332:3;:21;;:50;;;;:::i;:::-;:68;;:88;;;;:::i;:::-;29286:134;;29459:53;29489:22;29459:25;;:29;;:53;;;;:::i;:::-;29431:25;:81;;;;29553:3;29523:27;:33;;;;29597:25;29625:11;:23;29637:10;29625:23;;;;;;;;;;;;;;;29597:51;;29659:34;29709:96;29784:6;:20;;;29709:56;29731:6;:33;;;29709:3;:21;;:56;;;;:::i;:::-;:74;;:96;;;;:::i;:::-;29659:146;;29858:72;29903:26;29858:6;:26;;;:44;;:72;;;;:::i;:::-;29816:6;:26;;:114;;;;29977:3;29941:6;:33;;:39;;;;29993:24;30049:1;30021:25;;:29;30020:142;;30161:1;30020:142;;;30067:78;30119:25;;30067:47;30087:6;:26;;;30067:15;:13;:15::i;:::-;:19;;:47;;;;:::i;:::-;:51;;:78;;;;:::i;:::-;30020:142;29993:169;;30197:13;:11;:13::i;:::-;30225:15;:13;:15::i;:::-;30255:6;:26;;;30296:25;;30336:16;30367:3;30175:206;;;;;;;;;;;;;;;;29108:1281;;;;;;:::o;27846:210::-;27905:7;27953:1;27932:18;;:22;:116;;28047:1;27932:116;;;27970:74;28025:18;;27970:50;27988:11;:17;28000:4;27988:17;;;;;;;;;;;;;;;:31;;;27970:13;:11;:13::i;:::-;:17;;:50;;;;:::i;:::-;:54;;:74;;;;:::i;:::-;27932:116;27925:123;;27846:210;;;:::o;30475:100::-;30519:7;30546:11;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30546:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30546:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30546:21:0;;;;;;;;;;;;;;;;30539:28;;30475:100;:::o;16996:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12981:87::-;13031:4;13055:5;13048:12;;12981:87;:::o;15719:37::-;;;;:::o;11342:140::-;10743:9;:7;:9::i;:::-;10735:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11441:1;11404:40;;11425:6;;;;;;;;;;;11404:40;;;;;;;;;;;;11472:1;11455:6;;:19;;;;;;;;;;;;;;;;;;11342:140::o;15586:33::-;;;;:::o;28164:101::-;28208:7;28235:12;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28235:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28235:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28235:22:0;;;;;;;;;;;;;;;;28228:29;;28164:101;:::o;15676:36::-;;;;:::o;22129:105::-;22183:7;22210:16;22219:6;22210:8;:16::i;:::-;22203:23;;22129:105;;;:::o;31408:1123::-;10743:9;:7;:9::i;:::-;10735:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31528:19;;31503:15;:22;;;;:44;31495:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31701:18;:16;:18::i;:::-;;;;;;;31732:20;31755:13;:11;:13::i;:::-;31732:36;;31779:26;31824:1;31809:12;:16;31808:131;;31905:34;31916:22;;31905:6;:10;;:34;;;;:::i;:::-;31808:131;;;31842:47;31876:12;31842:29;31864:6;31842:17;;:21;;:29;;;;:::i;:::-;:33;;:47;;;;:::i;:::-;31808:131;31779:160;;31952:30;;:::i;:::-;32024:18;31993:8;:28;;:49;;;;;32087:3;32053:8;:31;;:37;;;;;32121:20;32129:11;32121:3;:7;;:20;;;;:::i;:::-;32101:8;:17;;:40;;;;;32175:11;32152:8;:20;;:34;;;;;32197:15;32218:8;32197:30;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;32197:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32260:41;32282:18;32260:17;;:21;;:41;;;;:::i;:::-;32240:17;:61;;;;32322:11;;;;;;;;;;;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32322:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32322:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32322:19:0;;;;;;;;;;;;;;;;:32;;;32355:10;32375:11;;;;;;;;;;;32389:6;32322:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32322:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32322:74:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32322:74:0;;;;;;;;;;;;;;;;32314:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32475:48;32488:6;32496:11;32509:13;:11;:13::i;:::-;32475:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10800:1;;;31408:1123;;:::o;10531:79::-;10569:7;10596:6;;;;;;;;;;;10589:13;;10531:79;:::o;10897:94::-;10937:4;10977:6;;;;;;;;;;;10961:22;;:12;:10;:12::i;:::-;:22;;;10954:29;;10897:94;:::o;18725:102::-;18773:6;18799:12;;;;;;;;;;;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18799:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18799:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18799:20:0;;;;;;;;;;;;;;;;18792:27;;18725:102;:::o;30663:104::-;30709:7;30736:13;;;;;;;;;;;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30736:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30736:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30736:23:0;;;;;;;;;;;;;;;;30729:30;;30663:104;:::o;30837:109::-;30889:7;30916:15;:22;;;;30909:29;;30837:109;:::o;21855:98::-;21929:16;21938:6;21929:8;:16::i;:::-;;21855:98;;;:::o;11637:109::-;10743:9;:7;:9::i;:::-;10735:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11710:28;11729:8;11710:18;:28::i;:::-;11637:109;:::o;32787:916::-;32827:7;32847:22;32872:1;32847:26;;32884:20;32907:13;:11;:13::i;:::-;32884:36;;32958:1;32937:17;;:22;32933:464;;;32993:12;32976:29;;32933:464;;;33038:22;33063:1;33038:26;;33084:9;33096:1;33084:13;;33079:148;33103:15;:22;;;;33099:1;:26;33079:148;;;33168:43;33187:23;33208:1;33187:20;:23::i;:::-;33168:14;:18;;:43;;;;:::i;:::-;33151:60;;33127:3;;;;;;;33079:148;;;;33258:55;33295:17;;33258:32;33277:12;33258:14;:18;;:32;;;;:::i;:::-;:36;;:55;;;;:::i;:::-;33241:72;;33348:37;33370:14;33348:17;;:21;;:37;;;;:::i;:::-;33328:17;:57;;;;32933:464;;33430:1;33413:14;:18;33409:253;;;33456:11;;;;;;;;;;;:20;;;33485:13;;;;;;;;;;;33501:14;33456:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33456:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33456:60:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33456:60:0;;;;;;;;;;;;;;;;33448:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33605:45;33620:14;33636:13;:11;:13::i;:::-;33605:45;;;;;;;;;;;;;;;;;;;;;;;;33409:253;33681:14;33674:21;;;;32787:916;:::o;28506:101::-;28546:7;28581:17;:15;:17::i;:::-;28566:33;;28506:101;:::o;20079:1507::-;20187:1;20178:6;:10;20170:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20268:1;20245:25;;:11;:25;;;;20237:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20356:1;20334:18;;:23;:44;;;;20377:1;20361:13;:11;:13::i;:::-;:17;20334:44;20326:148;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20487:27;20539:1;20518:18;;:22;20517:139;;20622:34;20633:22;;20622:6;:10;;:34;;;;:::i;:::-;20517:139;;;20557:49;20592:13;:11;:13::i;:::-;20557:30;20580:6;20557:18;;:22;;:30;;;;:::i;:::-;:34;;:49;;;;:::i;:::-;20517:139;20487:169;;20697:1;20675:19;:23;20667:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20754:18;:16;:18::i;:::-;;;;;;;20816:25;20844:11;:24;20856:11;20844:24;;;;;;;;;;;;;;;20816:52;;20902:45;20927:19;20902:6;:20;;;:24;;:45;;;;:::i;:::-;20879:6;:20;;:68;;;;20994:3;20958:6;:33;;:39;;;;21010:21;;:::i;:::-;21034:31;;;;;;;;;21040:19;21034:31;;;;21061:3;21034:31;;;21010:55;;21076:11;:24;21088:11;21076:24;;;;;;;;;;;;;;;21106:8;21076:39;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;21076:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21182:43;21205:19;21182:18;;:22;;:43;;;;:::i;:::-;21161:18;:64;;;;21364:12;;;;;;;;;;;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21364:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21364:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21364:20:0;;;;;;;;;;;;;;;;:33;;;21398:6;21414:12;;;;;;;;;;;21429:6;21364:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21364:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21364:72:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21364:72:0;;;;;;;;;;;;;;;;21356:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21525:11;21518:60;;;21538:6;21546:27;21561:11;21546:14;:27::i;:::-;21518:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20079:1507;;;;;;:::o;1377:136::-;1435:7;1462:43;1466:1;1469;1462:43;;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1455:50;;1377:136;;;;:::o;2293:471::-;2351:7;2601:1;2596;:6;2592:47;;;2626:1;2619:8;;;;2592:47;2651:9;2667:1;2663;:5;2651:17;;2696:1;2691;2687;:5;;;;;;;;:10;2679:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2755:1;2748:8;;;2293:471;;;;;:::o;921:181::-;979:7;999:9;1015:1;1011;:5;999:17;;1040:1;1035;:6;;1027:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1093:1;1086:8;;;921:181;;;;:::o;3232:132::-;3290:7;3317:39;3321:1;3324;3317:39;;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3310:46;;3232:132;;;;:::o;22539:3367::-;22590:7;22610:18;:16;:18::i;:::-;;;;;;;22677:1;22668:6;:10;22660:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22767:6;22737:26;22752:10;22737:14;:26::i;:::-;:36;;22729:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22863:27;22893:49;22928:13;:11;:13::i;:::-;22893:30;22916:6;22893:18;;:22;;:30;;;;:::i;:::-;:34;;:49;;;;:::i;:::-;22863:79;;22983:1;22961:19;:23;22953:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23081:25;23109:11;:23;23121:10;23109:23;;;;;;;;;;;;;;;23081:51;;23143:29;23175:11;:23;23187:10;23175:23;;;;;;;;;;;;;;;23143:55;;23279:33;23315:1;23279:37;;23327:24;23354:19;23327:46;;23384:20;23407:1;23384:24;;23419:1298;23445:1;23426:16;:20;23419:1298;;;23463:23;23489:13;23526:1;23503:13;:20;;;;:24;23489:39;;;;;;;;;;;;;;;;;;;;23463:65;;23543:20;23566:31;23574:9;:22;;;23566:3;:7;;:31;;;;:::i;:::-;23543:54;;23612:36;23651:1;23612:40;;23698:16;23671:9;:23;;;:43;;23667:1039;;;23812:41;23840:12;23812:9;:23;;;:27;;:41;;;;:::i;:::-;23781:72;;23887:74;23904:12;23918:28;23948:12;23887:16;:74::i;:::-;23872:89;;24008:59;24038:28;24008:25;:29;;:59;;;;:::i;:::-;23980:87;;24105:45;24126:9;:23;;;24105:16;:20;;:45;;;;:::i;:::-;24086:64;;24169:13;:22;;;;;;;;;;;;:::i;:::-;;23667:1039;;;24313:34;24334:12;24313:16;:20;;:34;;;;:::i;:::-;24282:65;;24381:74;24398:12;24412:28;24442:12;24381:16;:74::i;:::-;24366:89;;24502:59;24532:28;24502:25;:29;;:59;;;;:::i;:::-;24474:87;;24606:45;24634:16;24606:9;:23;;;:27;;:45;;;;:::i;:::-;24580:9;:23;;:71;;;;24689:1;24670:20;;23667:1039;23419:1298;;;;;;24756:57;24787:25;24756:6;:26;;;:30;;:57;;;;:::i;:::-;24727:6;:26;;:86;;;;24847:45;24872:19;24847:6;:20;;;:24;;:45;;;;:::i;:::-;24824:6;:20;;:68;;;;25063:56;25093:25;25063;;:29;;:56;;;;:::i;:::-;25035:25;:84;;;;25151:43;25174:19;25151:18;;:22;;:43;;;;:::i;:::-;25130:18;:64;;;;25331:12;;;;;;;;;;;:21;;;25353:10;25365:6;25331:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25331:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25331:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25331:41:0;;;;;;;;;;;;;;;;25323:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25457:13;;;;;;;;;;;:22;;;25480:10;25492:12;25457:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25457:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25457:48:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25457:48:0;;;;;;;;;;;;;;;;25449:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25599:10;25590:60;;;25611:6;25619:26;25634:10;25619:14;:26::i;:::-;25590:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25680:10;25666:39;;;25692:12;25666:39;;;;;;;;;;;;;;;;;;25748:1;25726:18;;:23;:44;;;;25769:1;25753:13;:11;:13::i;:::-;:17;25726:44;25718:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25886:12;25879:19;;;;;;;;22539:3367;;;:::o;9272:98::-;9317:15;9352:10;9345:17;;9272:98;:::o;11852:229::-;11946:1;11926:22;;:8;:22;;;;11918:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12036:8;12007:38;;12028:6;;;;;;;;;;;12007:38;;;;;;;;;;;;12065:8;12056:6;;:17;;;;;;;;;;;;;;;;;;11852:229;:::o;34073:920::-;34131:7;34151:31;34185:15;34201:1;34185:18;;;;;;;;;;;;;;;;;;;;34151:52;;34246:8;:28;;;34219:8;:23;;;:55;;34216:95;;;34298:1;34291:8;;;;;34216:95;34323:22;34348:1;34323:26;;34446:8;:17;;;34439:3;:24;;34435:437;;;34498:57;34531:8;:23;;;34498:8;:28;;;:32;;:57;;;;:::i;:::-;34480:76;;34605:8;:17;;;34571:8;:31;;:51;;;;34435:437;;;34672:136;34787:8;:20;;;34672:92;34735:8;:28;;;34672:40;34680:8;:31;;;34672:3;:7;;:40;;;;:::i;:::-;:62;;:92;;;;:::i;:::-;:114;;:136;;;;:::i;:::-;34655:153;;34857:3;34823:8;:31;;:37;;;;34435:437;34910:43;34938:14;34910:8;:23;;;:27;;:43;;;;:::i;:::-;34884:8;:23;;:69;;;;34971:14;34964:21;;;;34073:920;;;;:::o;1850:192::-;1936:7;1969:1;1964;:6;;1972:12;1956:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1956:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1996:9;2012:1;2008;:5;1996:17;;2033:1;2026:8;;;1850:192;;;;;:::o;3894:345::-;3980:7;4079:1;4075;:5;4082:12;4067:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;4067:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4106:9;4122:1;4118;:5;;;;;;;;4106:17;;4230:1;4223:8;;;3894:345;;;;;:::o;26882:808::-;27076:7;27098:23;27137:99;27210:25;;27137:54;27171:19;27137:15;:13;:15::i;:::-;:33;;:54;;;;:::i;:::-;:72;;:99;;;;:::i;:::-;27098:138;;27269:14;;27253:12;:30;;27249:110;;;27307:40;27331:15;27307:19;:23;;:40;;;;:::i;:::-;27300:47;;;;;27249:110;27371:21;15542:1;27395:2;:18;27371:42;;27424:21;27461:165;27612:13;27461:132;27577:15;27461:97;27490:67;27542:14;;27490:47;27524:12;27490:29;27508:10;;27490:13;:17;;:29;;;;:::i;:::-;:33;;:47;;;;:::i;:::-;:51;;:67;;;;:::i;:::-;27461:10;;:28;;:97;;;;:::i;:::-;:115;;:132;;;;:::i;:::-;:150;;:165;;;;:::i;:::-;27424:202;;27644:38;27668:13;27644:19;:23;;:38;;;;:::i;:::-;27637:45;;;;;26882:808;;;;;;:::o;14831:20165::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://5df2dfdc9d05e2cef7f8a2b1178178a6cfb08c1b3b21b2a1a4e7612601c40a12
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.