More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 111 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Unstake | 15004961 | 976 days ago | IN | 0 ETH | 0.00770376 | ||||
Unstake | 12395924 | 1385 days ago | IN | 0 ETH | 0.02785351 | ||||
Unstake | 12395919 | 1385 days ago | IN | 0 ETH | 0.03306721 | ||||
Unstake | 12268409 | 1405 days ago | IN | 0 ETH | 0.02101757 | ||||
Unstake | 12175039 | 1419 days ago | IN | 0 ETH | 0.0211254 | ||||
Unstake | 12131333 | 1426 days ago | IN | 0 ETH | 0.02312453 | ||||
Stake | 12098091 | 1431 days ago | IN | 0 ETH | 0.03398308 | ||||
Lock Tokens | 11954254 | 1453 days ago | IN | 0 ETH | 0.03061131 | ||||
Unstake | 11953345 | 1454 days ago | IN | 0 ETH | 0.0335029 | ||||
Unstake | 11952195 | 1454 days ago | IN | 0 ETH | 0.01684299 | ||||
Unstake | 11950970 | 1454 days ago | IN | 0 ETH | 0.01263224 | ||||
Unstake | 11949282 | 1454 days ago | IN | 0 ETH | 0.01299839 | ||||
Unstake | 11948272 | 1454 days ago | IN | 0 ETH | 0.01556146 | ||||
Unstake | 11948197 | 1454 days ago | IN | 0 ETH | 0.01556146 | ||||
Unstake | 11947993 | 1454 days ago | IN | 0 ETH | 0.01455135 | ||||
Unstake | 11833223 | 1472 days ago | IN | 0 ETH | 0.02265028 | ||||
Unstake | 11817063 | 1475 days ago | IN | 0 ETH | 0.0803762 | ||||
Stake | 11816936 | 1475 days ago | IN | 0 ETH | 0.0643885 | ||||
Stake | 11816838 | 1475 days ago | IN | 0 ETH | 0.0776789 | ||||
Stake | 11816833 | 1475 days ago | IN | 0 ETH | 0.06012849 | ||||
Stake | 11816823 | 1475 days ago | IN | 0 ETH | 0.04036908 | ||||
Stake | 11799706 | 1477 days ago | IN | 0 ETH | 0.0044 | ||||
Unstake | 11791839 | 1478 days ago | IN | 0 ETH | 0.0641557 | ||||
Unstake | 11730807 | 1488 days ago | IN | 0 ETH | 0.01331533 | ||||
Unstake | 11690919 | 1494 days ago | IN | 0 ETH | 0.00992597 |
Latest 3 internal transactions
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
11361282 | 1545 days ago | Contract Creation | 0 ETH | |||
11361282 | 1545 days ago | Contract Creation | 0 ETH | |||
11361282 | 1545 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
TokenGeyser
Compiler Version
v0.5.0+commit.1d4f565a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-30 */ // 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); } function rescueFunds(address tokenToRescue, address to, uint256 amount) external onlyOwner returns (bool) { require(address(token) != tokenToRescue, 'TokenPool: Cannot claim token held by the contract'); return IERC20(tokenToRescue).transfer(to, amount); } } // 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. * * A 1% withdrawal tax is applied. This tax is sent to this contracts address to be stored permanently */ 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; // unlock 99% only, leave 1% locked as a liquidity tax uint256 amountMinusTax = amount.mul(98).div(100); uint256 amountTax = amount.sub(amountMinusTax); // interactions require(_stakingPool.transfer(msg.sender, amountMinusTax), 'TokenGeyser: transfer out of staking pool failed'); require(_stakingPool.transfer(address(this), amountTax), 'TokenGeyser: transfer out of staking pool failed'); require(_unlockedPool.transfer(msg.sender, rewardAmount), 'TokenGeyser: transfer out of unlocked pool failed'); emit Unstaked(msg.sender, amountMinusTax, 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; } /** * @dev Lets the owner rescue funds air-dropped to the staking pool. * @param tokenToRescue Address of the token to be rescued. * @param to Address to which the rescued funds are to be sent. * @param amount Amount of tokens to be rescued. * @return Transfer success. */ function rescueFundsFromStakingPool(address tokenToRescue, address to, uint256 amount) public onlyOwner returns (bool) { return _stakingPool.rescueFunds(tokenToRescue, to, amount); } }
Contract Security Audit
- 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":false,"inputs":[{"name":"tokenToRescue","type":"address"},{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"rescueFundsFromStakingPool","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","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
608060405260006004556000600555600060065560006007556000600855426009556000600a556000600b553480156200003857600080fd5b5060405160c08062004b5d833981018060405260c08110156200005a57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050620000b662000558640100000000026401000000009004565b6000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36002600a0a831115151562000214576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f546f6b656e4765797365723a20737461727420626f6e757320746f6f2068696781526020017f680000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60008214151515620002b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f546f6b656e4765797365723a20626f6e757320706572696f64206973207a657281526020017f6f0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60008111151562000353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001807f546f6b656e4765797365723a20696e697469616c536861726573506572546f6b81526020017f656e206973207a65726f0000000000000000000000000000000000000000000081525060400191505060405180910390fd5b856200035e62000560565b808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f080158015620003b1573d6000803e3d6000fd5b50600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084620003fd62000560565b808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f08015801562000450573d6000803e3d6000fd5b50600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550846200049c62000560565b808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f080158015620004ef573d6000803e3d6000fd5b50600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826004819055508160058190555083600a8190555080600b8190555050505050505062000571565b600033905090565b604051610d7b8062003de283390190565b61386180620005816000396000f3fe60806040526004361061015f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630e89439b146101645780630ef96356146101f45780631dc27fde146102a457806322c12b84146102cf57806338b45fde14610326578063494347e7146103515780634b341aed1461039f57806356891412146104045780635a72bbef1461042f5780635c94bcb2146104c25780637033e4a61461052d57806370c6a17e1461055c578063715018a6146105875780637c6aa6f41461059e578063817b1cd2146105c957806381c39bec146105f457806386805dd11461061f57806389158d8e1461066e5780638da5cb5b146106b35780638f32d59b1461070a5780639f9106d114610739578063a779d08014610790578063c7ae2007146107bb578063c8fd6ed0146107e6578063f2fde38b14610876578063f968f493146108c7578063fc0c546a146108f2575b600080fd5b34801561017057600080fd5b506101f26004803603604081101561018757600080fd5b8101908080359060200190929190803590602001906401000000008111156101ae57600080fd5b8201836020820111156101c057600080fd5b803590602001918460018302840111640100000000831117156101e257600080fd5b9091929391929390505050610949565b005b34801561020057600080fd5b506102a26004803603606081101561021757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561025e57600080fd5b82018360208201111561027057600080fd5b8035906020019184600183028401116401000000008311171561029257600080fd5b9091929391929390505050610959565b005b3480156102b057600080fd5b506102b96109e6565b6040518082815260200191505060405180910390f35b3480156102db57600080fd5b506102e46109eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561033257600080fd5b5061033b610c64565b6040518082815260200191505060405180910390f35b34801561035d57600080fd5b50610366610c6a565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b3480156103ab57600080fd5b506103ee600480360360208110156103c257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610de0565b6040518082815260200191505060405180910390f35b34801561041057600080fd5b50610419610e6a565b6040518082815260200191505060405180910390f35b34801561043b57600080fd5b506104a86004803603606081101561045257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f30565b604051808215151515815260200191505060405180910390f35b3480156104ce57600080fd5b506104fb600480360360208110156104e557600080fd5b81019080803590602001909291905050506110eb565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b34801561053957600080fd5b50610542611130565b604051808215151515815260200191505060405180910390f35b34801561056857600080fd5b50610571611138565b6040518082815260200191505060405180910390f35b34801561059357600080fd5b5061059c61113e565b005b3480156105aa57600080fd5b506105b3611279565b6040518082815260200191505060405180910390f35b3480156105d557600080fd5b506105de61127f565b6040518082815260200191505060405180910390f35b34801561060057600080fd5b50610609611345565b6040518082815260200191505060405180910390f35b34801561062b57600080fd5b506106586004803603602081101561064257600080fd5b810190808035906020019092919050505061134b565b6040518082815260200191505060405180910390f35b34801561067a57600080fd5b506106b16004803603604081101561069157600080fd5b81019080803590602001909291908035906020019092919050505061135d565b005b3480156106bf57600080fd5b506106c8611885565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561071657600080fd5b5061071f6118ae565b604051808215151515815260200191505060405180910390f35b34801561074557600080fd5b5061074e61190c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561079c57600080fd5b506107a56119d2565b6040518082815260200191505060405180910390f35b3480156107c757600080fd5b506107d0611a98565b6040518082815260200191505060405180910390f35b3480156107f257600080fd5b506108746004803603604081101561080957600080fd5b81019080803590602001909291908035906020019064010000000081111561083057600080fd5b82018360208201111561084257600080fd5b8035906020019184600183028401116401000000008311171561086457600080fd5b9091929391929390505050611aa5565b005b34801561088257600080fd5b506108c56004803603602081101561089957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ab4565b005b3480156108d357600080fd5b506108dc611b3c565b6040518082815260200191505060405180910390f35b3480156108fe57600080fd5b50610907611dff565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610954333385611e0e565b505050565b6109616118ae565b15156109d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6109e0338585611e0e565b50505050565b600281565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610a7157600080fd5b505afa158015610a85573d6000803e3d6000fd5b505050506040513d6020811015610a9b57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610b4657600080fd5b505afa158015610b5a573d6000803e3d6000fd5b505050506040513d6020811015610b7057600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16141515610ba057fe5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610c2457600080fd5b505afa158015610c38573d6000803e3d6000fd5b505050506040513d6020811015610c4e57600080fd5b8101908080519060200190929190505050905090565b60045481565b600080600080600080610c7b611b3c565b506000610ca7600754610c996009544261257e90919063ffffffff16565b6125c890919063ffffffff16565b9050610cbe8160085461269590919063ffffffff16565b600881905550426009819055506000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000610d3d8260000154610d2f84600201544261257e90919063ffffffff16565b6125c890919063ffffffff16565b9050610d5681836001015461269590919063ffffffff16565b826001018190555042826002018190555060008060085411610d79576000610dac565b610dab600854610d9d8560010154610d8f6119d2565b6125c890919063ffffffff16565b61271f90919063ffffffff16565b5b9050610db6610e6a565b610dbe6119d2565b8460010154600854844299509950995099509950995050505050909192939495565b60008060075411610df2576000610e63565b610e62600754610e54600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154610e4661127f565b6125c890919063ffffffff16565b61271f90919063ffffffff16565b5b9050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610ef057600080fd5b505afa158015610f04573d6000803e3d6000fd5b505050506040513d6020811015610f1a57600080fd5b8101908080519060200190929190505050905090565b6000610f3a6118ae565b1515610fae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636ccae0548585856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156110a757600080fd5b505af11580156110bb573d6000803e3d6000fd5b505050506040513d60208110156110d157600080fd5b810190808051906020019092919050505090509392505050565b600e818154811015156110fa57fe5b90600052602060002090600502016000915090508060000154908060010154908060020154908060030154908060040154905085565b600080905090565b60075481565b6111466118ae565b15156111ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60055481565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561130557600080fd5b505afa158015611319573d6000803e3d6000fd5b505050506040513d602081101561132f57600080fd5b8101908080519060200190929190505050905090565b60065481565b600061135682612769565b9050919050565b6113656118ae565b15156113d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600a54600e8054905010151561147d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f546f6b656e4765797365723a2072656163686564206d6178696d756d20756e6c81526020017f6f636b207363686564756c65730000000000000000000000000000000000000081525060400191505060405180910390fd5b611485610c6a565b5050505050506000611495610e6a565b905060008082116114ba576114b5600b54856125c890919063ffffffff16565b6114e2565b6114e1826114d3866006546125c890919063ffffffff16565b61271f90919063ffffffff16565b5b90506114ec61378a565b8181600001818152505042816040018181525050611513844261269590919063ffffffff16565b81606001818152505083816080018181525050600e8190806001815401808255809150509060018203906000526020600020906005020160009091929091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015550505061159e8260065461269590919063ffffffff16565b600681905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561162857600080fd5b505afa15801561163c573d6000803e3d6000fd5b505050506040513d602081101561165257600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166323b872dd33600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16886040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561175b57600080fd5b505af115801561176f573d6000803e3d6000fd5b505050506040513d602081101561178557600080fd5b81019080805190602001909291905050501515611830576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f546f6b656e4765797365723a207472616e7366657220696e746f206c6f636b6581526020017f6420706f6f6c206661696c65640000000000000000000000000000000000000081525060400191505060405180910390fd5b7ff346961af4c52f314df1b45964746280fe409abb959d4a2458d58f79408b1fe8858561185b610e6a565b60405180848152602001838152602001828152602001935050505060405180910390a15050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166118f061327d565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561199257600080fd5b505afa1580156119a6573d6000803e3d6000fd5b505050506040513d60208110156119bc57600080fd5b8101908080519060200190929190505050905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015611a5857600080fd5b505afa158015611a6c573d6000803e3d6000fd5b505050506040513d6020811015611a8257600080fd5b8101908080519060200190929190505050905090565b6000600e80549050905090565b611aae83612769565b50505050565b611abc6118ae565b1515611b30576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611b3981613285565b50565b600080600090506000611b4d610e6a565b905060006006541415611b6257809150611beb565b600080905060008090505b600e80549050811015611ba457611b95611b868261340e565b8361269590919063ffffffff16565b91508080600101915050611b6d565b50611bcc600654611bbe84846125c890919063ffffffff16565b61271f90919063ffffffff16565b9250611be38160065461257e90919063ffffffff16565b600681905550505b6000821115611df757600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611cdb57600080fd5b505af1158015611cef573d6000803e3d6000fd5b505050506040513d6020811015611d0557600080fd5b81019080805190602001909291905050501515611db0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001807f546f6b656e4765797365723a207472616e73666572206f7574206f66206c6f6381526020017f6b656420706f6f6c206661696c6564000000000000000000000000000000000081525060400191505060405180910390fd5b7f2e444eb379b177e88ce0649c6110a3b01099f03e297127919dd5e3b63a761a9c82611dda610e6a565b604051808381526020018281526020019250505060405180910390a15b819250505090565b6000611e0961190c565b905090565b600081111515611eac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f546f6b656e4765797365723a207374616b6520616d6f756e74206973207a657281526020017f6f0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611f77576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f546f6b656e4765797365723a2062656e6566696369617279206973207a65726f81526020017f206164647265737300000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60006007541480611f8f57506000611f8d61127f565b115b151561204f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604a8152602001807f546f6b656e4765797365723a20496e76616c69642073746174652e205374616b81526020017f696e67207368617265732065786973742c20627574206e6f207374616b696e6781526020017f20746f6b656e7320646f0000000000000000000000000000000000000000000081525060600191505060405180910390fd5b600080600754116120745761206f600b54836125c890919063ffffffff16565b6120a3565b6120a261207f61127f565b612094846007546125c890919063ffffffff16565b61271f90919063ffffffff16565b5b9050600081111515612143576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f546f6b656e4765797365723a205374616b6520616d6f756e7420697320746f6f81526020017f20736d616c6c000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b61214b610c6a565b5050505050506000600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506121ab82826000015461269590919063ffffffff16565b81600001819055504281600201819055506121c46137ba565b6040805190810160405280848152602001428152509050600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050906001820390600052602060002090600202016000909192909190915060008201518160000155602082015181600101555050506122728360075461269590919063ffffffff16565b600781905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156122fc57600080fd5b505afa158015612310573d6000803e3d6000fd5b505050506040513d602081101561232657600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166323b872dd87600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561242f57600080fd5b505af1158015612443573d6000803e3d6000fd5b505050506040513d602081101561245957600080fd5b81019080805190602001909291905050501515612504576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001807f546f6b656e4765797365723a207472616e7366657220696e746f207374616b6981526020017f6e6720706f6f6c206661696c656400000000000000000000000000000000000081525060400191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff167fc65e53b88159e7d2c0fc12a0600072e28ae53ff73b4c1715369c30f1609351428561254688610de0565b6040518083815260200182815260200180602001828103825260008152602001602001935050505060405180910390a2505050505050565b60006125c083836040805190810160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613505565b905092915050565b6000808314156125db576000905061268f565b600082840290508284828115156125ee57fe5b0414151561268a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f81526020017f770000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b809150505b92915050565b6000808284019050838110151515612715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600061276183836040805190810160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506135c7565b905092915050565b6000612773610c6a565b505050505050600082111515612817576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f546f6b656e4765797365723a20756e7374616b6520616d6f756e74206973207a81526020017f65726f000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8161282133610de0565b101515156128bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001807f546f6b656e4765797365723a20756e7374616b6520616d6f756e74206973206781526020017f726561746572207468616e20746f74616c2075736572207374616b657300000081525060400191505060405180910390fd5b60006128ed6128ca61127f565b6128df856007546125c890919063ffffffff16565b61271f90919063ffffffff16565b905060008111151561298d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f546f6b656e4765797365723a20556e61626c6520746f20756e7374616b65206181526020017f6d6f756e74207468697320736d616c6c0000000000000000000000000000000081525060400191505060405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000809050600084905060008090505b6000821115612b51576000846001868054905003815481101515612a4357fe5b906000526020600020906002020190506000612a6c82600101544261257e90919063ffffffff16565b90506000809050848360000154111515612aee57612a978284600001546125c890919063ffffffff16565b9050612aa4848284613691565b9350612ab9818761269590919063ffffffff16565b9550612ad283600001548661257e90919063ffffffff16565b945086805480919060019003612ae891906137d4565b50612b49565b612b0182866125c890919063ffffffff16565b9050612b0e848284613691565b9350612b23818761269590919063ffffffff16565b9550612b3c85846000015461257e90919063ffffffff16565b8360000181905550600094505b505050612a23565b612b6883866001015461257e90919063ffffffff16565b8560010181905550612b8786866000015461257e90919063ffffffff16565b8560000181905550612ba48360085461257e90919063ffffffff16565b600881905550612bbf8660075461257e90919063ffffffff16565b6007819055506000612bee6064612be060628c6125c890919063ffffffff16565b61271f90919063ffffffff16565b90506000612c05828b61257e90919063ffffffff16565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612ccc57600080fd5b505af1158015612ce0573d6000803e3d6000fd5b505050506040513d6020811015612cf657600080fd5b81019080805190602001909291905050501515612da1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f546f6b656e4765797365723a207472616e73666572206f7574206f662073746181526020017f6b696e6720706f6f6c206661696c65640000000000000000000000000000000081525060400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb30836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612e6657600080fd5b505af1158015612e7a573d6000803e3d6000fd5b505050506040513d6020811015612e9057600080fd5b81019080805190602001909291905050501515612f3b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f546f6b656e4765797365723a207472616e73666572206f7574206f662073746181526020017f6b696e6720706f6f6c206661696c65640000000000000000000000000000000081525060400191505060405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561300057600080fd5b505af1158015613014573d6000803e3d6000fd5b505050506040513d602081101561302a57600080fd5b810190808051906020019092919050505015156130d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001807f546f6b656e4765797365723a207472616e73666572206f7574206f6620756e6c81526020017f6f636b656420706f6f6c206661696c656400000000000000000000000000000081525060400191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167faf01bfc8475df280aca00b578c4a948e6d95700f0db8c13365240f7f973c87548361311733610de0565b6040518083815260200182815260200180602001828103825260008152602001602001935050505060405180910390a23373ffffffffffffffffffffffffffffffffffffffff167f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e430846040518082815260200191505060405180910390a2600060075414806131ad575060006131ab61127f565b115b151561326d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c8152602001807f546f6b656e4765797365723a204572726f7220756e7374616b696e672e20537481526020017f616b696e67207368617265732065786973742c20627574206e6f207374616b6981526020017f6e6720746f6b656e7320646f000000000000000000000000000000000000000081525060600191505060405180910390fd5b8298505050505050505050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515613350576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526020017f646472657373000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600e8381548110151561342057fe5b906000526020600020906005020190508060000154816001015410151561344b576000915050613500565b600080905081600301544210151561348c576134788260010154836000015461257e90919063ffffffff16565b9050816003015482600201819055506134db565b6134cf82600401546134c184600001546134b386600201544261257e90919063ffffffff16565b6125c890919063ffffffff16565b61271f90919063ffffffff16565b90504282600201819055505b6134f281836001015461269590919063ffffffff16565b826001018190555080925050505b919050565b600083831115829015156135b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561357957808201518184015260208101905061355e565b50505050905090810190601f1680156135a65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080831182901515613675576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561363a57808201518184015260208101905061361f565b50505050905090810190601f1680156136675780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581151561368357fe5b049050809150509392505050565b6000806136c26008546136b4866136a66119d2565b6125c890919063ffffffff16565b61271f90919063ffffffff16565b9050600554831015156136ea576136e2818661269590919063ffffffff16565b915050613783565b60006002600a0a905060006137688261375a8561374c61373b60055461372d8c61371f6004548c61257e90919063ffffffff16565b6125c890919063ffffffff16565b61271f90919063ffffffff16565b60045461269590919063ffffffff16565b6125c890919063ffffffff16565b61271f90919063ffffffff16565b905061377d818861269590919063ffffffff16565b93505050505b9392505050565b60a06040519081016040528060008152602001600081526020016000815260200160008152602001600081525090565b604080519081016040528060008152602001600081525090565b815481835581811115613801576002028160020283600052602060002091820191016138009190613806565b5b505050565b61383291905b8082111561382e5760008082016000905560018201600090555060020161380c565b5090565b9056fea165627a7a72305820eeb31be7a4be22031ece266fbbf714d9de5bd338c01a948e8664ad07f41cde1f0029608060405234801561001057600080fd5b50604051602080610d7b8339810180604052602081101561003057600080fd5b810190808051906020019092919050505061005861015a640100000000026401000000009004565b6000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610162565b600033905090565b610c0a806101716000396000f3fe60806040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636ccae05414610093578063715018a6146101265780638da5cb5b1461013d5780638f32d59b14610194578063a9059cbb146101c3578063b69ef8a814610236578063f2fde38b14610261578063fc0c546a146102b2575b600080fd5b34801561009f57600080fd5b5061010c600480360360608110156100b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610309565b604051808215151515815260200191505060405180910390f35b34801561013257600080fd5b5061013b61055a565b005b34801561014957600080fd5b50610152610695565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101a057600080fd5b506101a96106be565b604051808215151515815260200191505060405180910390f35b3480156101cf57600080fd5b5061021c600480360360408110156101e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061071c565b604051808215151515815260200191505060405180910390f35b34801561024257600080fd5b5061024b6108a2565b6040518082815260200191505060405180910390f35b34801561026d57600080fd5b506102b06004803603602081101561028457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061099f565b005b3480156102be57600080fd5b506102c7610a27565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60006103136106be565b1515610387576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610473576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001807f546f6b656e506f6f6c3a2043616e6e6f7420636c61696d20746f6b656e20686581526020017f6c642062792074686520636f6e7472616374000000000000000000000000000081525060400191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561051657600080fd5b505af115801561052a573d6000803e3d6000fd5b505050506040513d602081101561054057600080fd5b810190808051906020019092919050505090509392505050565b6105626106be565b15156105d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610700610a4d565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b60006107266106be565b151561079a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561085f57600080fd5b505af1158015610873573d6000803e3d6000fd5b505050506040513d602081101561088957600080fd5b8101908080519060200190929190505050905092915050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561095f57600080fd5b505afa158015610973573d6000803e3d6000fd5b505050506040513d602081101561098957600080fd5b8101908080519060200190929190505050905090565b6109a76106be565b1515610a1b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b610a2481610a55565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610b20576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526020017f646472657373000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505056fea165627a7a72305820d18576602433f076203a89f0cd23125d3ef9d3a3eea325496b566f3db767c04c0029000000000000000000000000eaceac83cecca6beebc736edd6360d1633175b010000000000000000000000003936ad01cf109a36489d93cabda11cf062fd3d48000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000004f1a0000000000000000000000000000000000000000000000000000000000000f4240
Deployed Bytecode
0x60806040526004361061015f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630e89439b146101645780630ef96356146101f45780631dc27fde146102a457806322c12b84146102cf57806338b45fde14610326578063494347e7146103515780634b341aed1461039f57806356891412146104045780635a72bbef1461042f5780635c94bcb2146104c25780637033e4a61461052d57806370c6a17e1461055c578063715018a6146105875780637c6aa6f41461059e578063817b1cd2146105c957806381c39bec146105f457806386805dd11461061f57806389158d8e1461066e5780638da5cb5b146106b35780638f32d59b1461070a5780639f9106d114610739578063a779d08014610790578063c7ae2007146107bb578063c8fd6ed0146107e6578063f2fde38b14610876578063f968f493146108c7578063fc0c546a146108f2575b600080fd5b34801561017057600080fd5b506101f26004803603604081101561018757600080fd5b8101908080359060200190929190803590602001906401000000008111156101ae57600080fd5b8201836020820111156101c057600080fd5b803590602001918460018302840111640100000000831117156101e257600080fd5b9091929391929390505050610949565b005b34801561020057600080fd5b506102a26004803603606081101561021757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561025e57600080fd5b82018360208201111561027057600080fd5b8035906020019184600183028401116401000000008311171561029257600080fd5b9091929391929390505050610959565b005b3480156102b057600080fd5b506102b96109e6565b6040518082815260200191505060405180910390f35b3480156102db57600080fd5b506102e46109eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561033257600080fd5b5061033b610c64565b6040518082815260200191505060405180910390f35b34801561035d57600080fd5b50610366610c6a565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b3480156103ab57600080fd5b506103ee600480360360208110156103c257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610de0565b6040518082815260200191505060405180910390f35b34801561041057600080fd5b50610419610e6a565b6040518082815260200191505060405180910390f35b34801561043b57600080fd5b506104a86004803603606081101561045257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f30565b604051808215151515815260200191505060405180910390f35b3480156104ce57600080fd5b506104fb600480360360208110156104e557600080fd5b81019080803590602001909291905050506110eb565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b34801561053957600080fd5b50610542611130565b604051808215151515815260200191505060405180910390f35b34801561056857600080fd5b50610571611138565b6040518082815260200191505060405180910390f35b34801561059357600080fd5b5061059c61113e565b005b3480156105aa57600080fd5b506105b3611279565b6040518082815260200191505060405180910390f35b3480156105d557600080fd5b506105de61127f565b6040518082815260200191505060405180910390f35b34801561060057600080fd5b50610609611345565b6040518082815260200191505060405180910390f35b34801561062b57600080fd5b506106586004803603602081101561064257600080fd5b810190808035906020019092919050505061134b565b6040518082815260200191505060405180910390f35b34801561067a57600080fd5b506106b16004803603604081101561069157600080fd5b81019080803590602001909291908035906020019092919050505061135d565b005b3480156106bf57600080fd5b506106c8611885565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561071657600080fd5b5061071f6118ae565b604051808215151515815260200191505060405180910390f35b34801561074557600080fd5b5061074e61190c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561079c57600080fd5b506107a56119d2565b6040518082815260200191505060405180910390f35b3480156107c757600080fd5b506107d0611a98565b6040518082815260200191505060405180910390f35b3480156107f257600080fd5b506108746004803603604081101561080957600080fd5b81019080803590602001909291908035906020019064010000000081111561083057600080fd5b82018360208201111561084257600080fd5b8035906020019184600183028401116401000000008311171561086457600080fd5b9091929391929390505050611aa5565b005b34801561088257600080fd5b506108c56004803603602081101561089957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ab4565b005b3480156108d357600080fd5b506108dc611b3c565b6040518082815260200191505060405180910390f35b3480156108fe57600080fd5b50610907611dff565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610954333385611e0e565b505050565b6109616118ae565b15156109d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6109e0338585611e0e565b50505050565b600281565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610a7157600080fd5b505afa158015610a85573d6000803e3d6000fd5b505050506040513d6020811015610a9b57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610b4657600080fd5b505afa158015610b5a573d6000803e3d6000fd5b505050506040513d6020811015610b7057600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16141515610ba057fe5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610c2457600080fd5b505afa158015610c38573d6000803e3d6000fd5b505050506040513d6020811015610c4e57600080fd5b8101908080519060200190929190505050905090565b60045481565b600080600080600080610c7b611b3c565b506000610ca7600754610c996009544261257e90919063ffffffff16565b6125c890919063ffffffff16565b9050610cbe8160085461269590919063ffffffff16565b600881905550426009819055506000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000610d3d8260000154610d2f84600201544261257e90919063ffffffff16565b6125c890919063ffffffff16565b9050610d5681836001015461269590919063ffffffff16565b826001018190555042826002018190555060008060085411610d79576000610dac565b610dab600854610d9d8560010154610d8f6119d2565b6125c890919063ffffffff16565b61271f90919063ffffffff16565b5b9050610db6610e6a565b610dbe6119d2565b8460010154600854844299509950995099509950995050505050909192939495565b60008060075411610df2576000610e63565b610e62600754610e54600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154610e4661127f565b6125c890919063ffffffff16565b61271f90919063ffffffff16565b5b9050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015610ef057600080fd5b505afa158015610f04573d6000803e3d6000fd5b505050506040513d6020811015610f1a57600080fd5b8101908080519060200190929190505050905090565b6000610f3a6118ae565b1515610fae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636ccae0548585856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156110a757600080fd5b505af11580156110bb573d6000803e3d6000fd5b505050506040513d60208110156110d157600080fd5b810190808051906020019092919050505090509392505050565b600e818154811015156110fa57fe5b90600052602060002090600502016000915090508060000154908060010154908060020154908060030154908060040154905085565b600080905090565b60075481565b6111466118ae565b15156111ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60055481565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561130557600080fd5b505afa158015611319573d6000803e3d6000fd5b505050506040513d602081101561132f57600080fd5b8101908080519060200190929190505050905090565b60065481565b600061135682612769565b9050919050565b6113656118ae565b15156113d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600a54600e8054905010151561147d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f546f6b656e4765797365723a2072656163686564206d6178696d756d20756e6c81526020017f6f636b207363686564756c65730000000000000000000000000000000000000081525060400191505060405180910390fd5b611485610c6a565b5050505050506000611495610e6a565b905060008082116114ba576114b5600b54856125c890919063ffffffff16565b6114e2565b6114e1826114d3866006546125c890919063ffffffff16565b61271f90919063ffffffff16565b5b90506114ec61378a565b8181600001818152505042816040018181525050611513844261269590919063ffffffff16565b81606001818152505083816080018181525050600e8190806001815401808255809150509060018203906000526020600020906005020160009091929091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015550505061159e8260065461269590919063ffffffff16565b600681905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561162857600080fd5b505afa15801561163c573d6000803e3d6000fd5b505050506040513d602081101561165257600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166323b872dd33600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16886040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561175b57600080fd5b505af115801561176f573d6000803e3d6000fd5b505050506040513d602081101561178557600080fd5b81019080805190602001909291905050501515611830576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f546f6b656e4765797365723a207472616e7366657220696e746f206c6f636b6581526020017f6420706f6f6c206661696c65640000000000000000000000000000000000000081525060400191505060405180910390fd5b7ff346961af4c52f314df1b45964746280fe409abb959d4a2458d58f79408b1fe8858561185b610e6a565b60405180848152602001838152602001828152602001935050505060405180910390a15050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166118f061327d565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b15801561199257600080fd5b505afa1580156119a6573d6000803e3d6000fd5b505050506040513d60208110156119bc57600080fd5b8101908080519060200190929190505050905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b69ef8a86040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015611a5857600080fd5b505afa158015611a6c573d6000803e3d6000fd5b505050506040513d6020811015611a8257600080fd5b8101908080519060200190929190505050905090565b6000600e80549050905090565b611aae83612769565b50505050565b611abc6118ae565b1515611b30576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611b3981613285565b50565b600080600090506000611b4d610e6a565b905060006006541415611b6257809150611beb565b600080905060008090505b600e80549050811015611ba457611b95611b868261340e565b8361269590919063ffffffff16565b91508080600101915050611b6d565b50611bcc600654611bbe84846125c890919063ffffffff16565b61271f90919063ffffffff16565b9250611be38160065461257e90919063ffffffff16565b600681905550505b6000821115611df757600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611cdb57600080fd5b505af1158015611cef573d6000803e3d6000fd5b505050506040513d6020811015611d0557600080fd5b81019080805190602001909291905050501515611db0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001807f546f6b656e4765797365723a207472616e73666572206f7574206f66206c6f6381526020017f6b656420706f6f6c206661696c6564000000000000000000000000000000000081525060400191505060405180910390fd5b7f2e444eb379b177e88ce0649c6110a3b01099f03e297127919dd5e3b63a761a9c82611dda610e6a565b604051808381526020018281526020019250505060405180910390a15b819250505090565b6000611e0961190c565b905090565b600081111515611eac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f546f6b656e4765797365723a207374616b6520616d6f756e74206973207a657281526020017f6f0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611f77576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f546f6b656e4765797365723a2062656e6566696369617279206973207a65726f81526020017f206164647265737300000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60006007541480611f8f57506000611f8d61127f565b115b151561204f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604a8152602001807f546f6b656e4765797365723a20496e76616c69642073746174652e205374616b81526020017f696e67207368617265732065786973742c20627574206e6f207374616b696e6781526020017f20746f6b656e7320646f0000000000000000000000000000000000000000000081525060600191505060405180910390fd5b600080600754116120745761206f600b54836125c890919063ffffffff16565b6120a3565b6120a261207f61127f565b612094846007546125c890919063ffffffff16565b61271f90919063ffffffff16565b5b9050600081111515612143576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f546f6b656e4765797365723a205374616b6520616d6f756e7420697320746f6f81526020017f20736d616c6c000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b61214b610c6a565b5050505050506000600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506121ab82826000015461269590919063ffffffff16565b81600001819055504281600201819055506121c46137ba565b6040805190810160405280848152602001428152509050600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819080600181540180825580915050906001820390600052602060002090600202016000909192909190915060008201518160000155602082015181600101555050506122728360075461269590919063ffffffff16565b600781905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156122fc57600080fd5b505afa158015612310573d6000803e3d6000fd5b505050506040513d602081101561232657600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166323b872dd87600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561242f57600080fd5b505af1158015612443573d6000803e3d6000fd5b505050506040513d602081101561245957600080fd5b81019080805190602001909291905050501515612504576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001807f546f6b656e4765797365723a207472616e7366657220696e746f207374616b6981526020017f6e6720706f6f6c206661696c656400000000000000000000000000000000000081525060400191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff167fc65e53b88159e7d2c0fc12a0600072e28ae53ff73b4c1715369c30f1609351428561254688610de0565b6040518083815260200182815260200180602001828103825260008152602001602001935050505060405180910390a2505050505050565b60006125c083836040805190810160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613505565b905092915050565b6000808314156125db576000905061268f565b600082840290508284828115156125ee57fe5b0414151561268a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f81526020017f770000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b809150505b92915050565b6000808284019050838110151515612715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600061276183836040805190810160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506135c7565b905092915050565b6000612773610c6a565b505050505050600082111515612817576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f546f6b656e4765797365723a20756e7374616b6520616d6f756e74206973207a81526020017f65726f000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8161282133610de0565b101515156128bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001807f546f6b656e4765797365723a20756e7374616b6520616d6f756e74206973206781526020017f726561746572207468616e20746f74616c2075736572207374616b657300000081525060400191505060405180910390fd5b60006128ed6128ca61127f565b6128df856007546125c890919063ffffffff16565b61271f90919063ffffffff16565b905060008111151561298d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f546f6b656e4765797365723a20556e61626c6520746f20756e7374616b65206181526020017f6d6f756e74207468697320736d616c6c0000000000000000000000000000000081525060400191505060405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000809050600084905060008090505b6000821115612b51576000846001868054905003815481101515612a4357fe5b906000526020600020906002020190506000612a6c82600101544261257e90919063ffffffff16565b90506000809050848360000154111515612aee57612a978284600001546125c890919063ffffffff16565b9050612aa4848284613691565b9350612ab9818761269590919063ffffffff16565b9550612ad283600001548661257e90919063ffffffff16565b945086805480919060019003612ae891906137d4565b50612b49565b612b0182866125c890919063ffffffff16565b9050612b0e848284613691565b9350612b23818761269590919063ffffffff16565b9550612b3c85846000015461257e90919063ffffffff16565b8360000181905550600094505b505050612a23565b612b6883866001015461257e90919063ffffffff16565b8560010181905550612b8786866000015461257e90919063ffffffff16565b8560000181905550612ba48360085461257e90919063ffffffff16565b600881905550612bbf8660075461257e90919063ffffffff16565b6007819055506000612bee6064612be060628c6125c890919063ffffffff16565b61271f90919063ffffffff16565b90506000612c05828b61257e90919063ffffffff16565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612ccc57600080fd5b505af1158015612ce0573d6000803e3d6000fd5b505050506040513d6020811015612cf657600080fd5b81019080805190602001909291905050501515612da1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f546f6b656e4765797365723a207472616e73666572206f7574206f662073746181526020017f6b696e6720706f6f6c206661696c65640000000000000000000000000000000081525060400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb30836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612e6657600080fd5b505af1158015612e7a573d6000803e3d6000fd5b505050506040513d6020811015612e9057600080fd5b81019080805190602001909291905050501515612f3b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f546f6b656e4765797365723a207472616e73666572206f7574206f662073746181526020017f6b696e6720706f6f6c206661696c65640000000000000000000000000000000081525060400191505060405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561300057600080fd5b505af1158015613014573d6000803e3d6000fd5b505050506040513d602081101561302a57600080fd5b810190808051906020019092919050505015156130d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001807f546f6b656e4765797365723a207472616e73666572206f7574206f6620756e6c81526020017f6f636b656420706f6f6c206661696c656400000000000000000000000000000081525060400191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167faf01bfc8475df280aca00b578c4a948e6d95700f0db8c13365240f7f973c87548361311733610de0565b6040518083815260200182815260200180602001828103825260008152602001602001935050505060405180910390a23373ffffffffffffffffffffffffffffffffffffffff167f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e430846040518082815260200191505060405180910390a2600060075414806131ad575060006131ab61127f565b115b151561326d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604c8152602001807f546f6b656e4765797365723a204572726f7220756e7374616b696e672e20537481526020017f616b696e67207368617265732065786973742c20627574206e6f207374616b6981526020017f6e6720746f6b656e7320646f000000000000000000000000000000000000000081525060600191505060405180910390fd5b8298505050505050505050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515613350576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526020017f646472657373000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600e8381548110151561342057fe5b906000526020600020906005020190508060000154816001015410151561344b576000915050613500565b600080905081600301544210151561348c576134788260010154836000015461257e90919063ffffffff16565b9050816003015482600201819055506134db565b6134cf82600401546134c184600001546134b386600201544261257e90919063ffffffff16565b6125c890919063ffffffff16565b61271f90919063ffffffff16565b90504282600201819055505b6134f281836001015461269590919063ffffffff16565b826001018190555080925050505b919050565b600083831115829015156135b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561357957808201518184015260208101905061355e565b50505050905090810190601f1680156135a65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080831182901515613675576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561363a57808201518184015260208101905061361f565b50505050905090810190601f1680156136675780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581151561368357fe5b049050809150509392505050565b6000806136c26008546136b4866136a66119d2565b6125c890919063ffffffff16565b61271f90919063ffffffff16565b9050600554831015156136ea576136e2818661269590919063ffffffff16565b915050613783565b60006002600a0a905060006137688261375a8561374c61373b60055461372d8c61371f6004548c61257e90919063ffffffff16565b6125c890919063ffffffff16565b61271f90919063ffffffff16565b60045461269590919063ffffffff16565b6125c890919063ffffffff16565b61271f90919063ffffffff16565b905061377d818861269590919063ffffffff16565b93505050505b9392505050565b60a06040519081016040528060008152602001600081526020016000815260200160008152602001600081525090565b604080519081016040528060008152602001600081525090565b815481835581811115613801576002028160020283600052602060002091820191016138009190613806565b5b505050565b61383291905b8082111561382e5760008082016000905560018201600090555060020161380c565b5090565b9056fea165627a7a72305820eeb31be7a4be22031ece266fbbf714d9de5bd338c01a948e8664ad07f41cde1f0029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000eaceac83cecca6beebc736edd6360d1633175b010000000000000000000000003936Ad01cf109a36489d93cabdA11cF062fd3d48000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000004f1a0000000000000000000000000000000000000000000000000000000000000f4240
-----Decoded View---------------
Arg [0] : stakingToken (address): 0xeaceAC83CEcCA6BEeBc736EDd6360d1633175b01
Arg [1] : distributionToken (address): 0x3936Ad01cf109a36489d93cabdA11cF062fd3d48
Arg [2] : maxUnlockSchedules (uint256): 10
Arg [3] : startBonus_ (uint256): 33
Arg [4] : bonusPeriodSec_ (uint256): 5184000
Arg [5] : initialSharesPerToken (uint256): 1000000
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000eaceac83cecca6beebc736edd6360d1633175b01
Arg [1] : 0000000000000000000000003936Ad01cf109a36489d93cabdA11cF062fd3d48
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000021
Arg [4] : 00000000000000000000000000000000000000000000000000000000004f1a00
Arg [5] : 00000000000000000000000000000000000000000000000000000000000f4240
Deployed Bytecode Sourcemap
15105:21022:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19531:121;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19531:121:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19531:121:0;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;19531:121:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19531: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;19531:121:0;;;;;;;;;;;;;;;19924:142;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19924:142:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19924:142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;19924:142:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19924: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;19924:142:0;;;;;;;;;;;;;;;15775:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15775:42:0;;;;;;;;;;;;;;;;;;;;;;;19184:171;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19184:171:0;;;;;;;;;;;;;;;;;;;;;;;;;;;15824:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15824:29:0;;;;;;;;;;;;;;;;;;;;;;;29710:1281;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29710:1281:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28448:210;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28448:210:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28448:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31077:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31077:100:0;;;;;;;;;;;;;;;;;;;;;;;35917:207;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35917:207:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35917:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17270:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17270:39:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17270:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12981:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12981:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;15993:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15993:37:0;;;;;;;;;;;;;;;;;;;;;;;11342:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11342:140:0;;;;;;15860:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15860:33:0;;;;;;;;;;;;;;;;;;;;;;;28766:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28766:101:0;;;;;;;;;;;;;;;;;;;;;;;15950:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15950:36:0;;;;;;;;;;;;;;;;;;;;;;;22403:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22403:105:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22403:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32010:1123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32010:1123:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32010: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;;;;;;;;;;;;;;;;;;;;;;;;;;;18999:102;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18999:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;31265:104;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31265:104:0;;;;;;;;;;;;;;;;;;;;;;;31439:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31439:109:0;;;;;;;;;;;;;;;;;;;;;;;22129:98;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22129:98:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22129:98:0;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;22129:98:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;22129: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;22129: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;;;;;;;;;;;;;;;;;;;;;;33389:916;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33389:916:0;;;;;;;;;;;;;;;;;;;;;;;29108:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29108:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;19531:121;19603:41;19613:10;19625;19637:6;19603:9;:41::i;:::-;19531:121;;;:::o;19924:142::-;10743:9;:7;:9::i;:::-;10735:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20023:35;20033:10;20045:4;20051:6;20023:9;:35::i;:::-;19924:142;;;;:::o;15775:42::-;15816:1;15775:42;:::o;19184:171::-;19237:6;19288:11;;;;;;;;;;;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19288:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19288:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19288:19:0;;;;;;;;;;;;;;;;19263:44;;:13;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19263:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19263:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19263:21:0;;;;;;;;;;;;;;;;:44;;;19256:52;;;;;;19326:13;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19326:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19326:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19326:21:0;;;;;;;;;;;;;;;;19319:28;;19184:171;:::o;15824:29::-;;;;:::o;29710:1281::-;29764:7;29773;29782;29791;29800;29809;29831:14;:12;:14::i;:::-;;29888:30;29934:88;30003:18;;29934:50;29956:27;;29934:3;:21;;:50;;;;:::i;:::-;:68;;:88;;;;:::i;:::-;29888:134;;30061:53;30091:22;30061:25;;:29;;:53;;;;:::i;:::-;30033:25;:81;;;;30155:3;30125:27;:33;;;;30199:25;30227:11;:23;30239:10;30227:23;;;;;;;;;;;;;;;30199:51;;30261:34;30311:96;30386:6;:20;;;30311:56;30333:6;:33;;;30311:3;:21;;:56;;;;:::i;:::-;:74;;:96;;;;:::i;:::-;30261:146;;30460:72;30505:26;30460:6;:26;;;:44;;:72;;;;:::i;:::-;30418:6;:26;;:114;;;;30579:3;30543:6;:33;;:39;;;;30595:24;30651:1;30623:25;;:29;30622:142;;30763:1;30622:142;;;30669:78;30721:25;;30669:47;30689:6;:26;;;30669:15;:13;:15::i;:::-;:19;;:47;;;;:::i;:::-;:51;;:78;;;;:::i;:::-;30622:142;30595:169;;30799:13;:11;:13::i;:::-;30827:15;:13;:15::i;:::-;30857:6;:26;;;30898:25;;30938:16;30969:3;30777:206;;;;;;;;;;;;;;;;29710:1281;;;;;;:::o;28448:210::-;28507:7;28555:1;28534:18;;:22;:116;;28649:1;28534:116;;;28572:74;28627:18;;28572:50;28590:11;:17;28602:4;28590:17;;;;;;;;;;;;;;;:31;;;28572:13;:11;:13::i;:::-;:17;;:50;;;;:::i;:::-;:54;;:74;;;;:::i;:::-;28534:116;28527:123;;28448:210;;;:::o;31077:100::-;31121:7;31148:11;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31148:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31148:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31148:21:0;;;;;;;;;;;;;;;;31141:28;;31077:100;:::o;35917:207::-;36039:4;10743:9;:7;:9::i;:::-;10735:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36065:12;;;;;;;;;;;:24;;;36090:13;36105:2;36109:6;36065:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36065:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36065:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36065:51:0;;;;;;;;;;;;;;;;36058:58;;35917:207;;;;;:::o;17270:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12981:87::-;13031:4;13055:5;13048:12;;12981:87;:::o;15993: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;15860:33::-;;;;:::o;28766:101::-;28810:7;28837:12;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28837:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28837:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28837:22:0;;;;;;;;;;;;;;;;28830:29;;28766:101;:::o;15950:36::-;;;;:::o;22403:105::-;22457:7;22484:16;22493:6;22484:8;:16::i;:::-;22477:23;;22403:105;;;:::o;32010:1123::-;10743:9;:7;:9::i;:::-;10735:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32130:19;;32105:15;:22;;;;:44;32097:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32303:18;:16;:18::i;:::-;;;;;;;32334:20;32357:13;:11;:13::i;:::-;32334:36;;32381:26;32426:1;32411:12;:16;32410:131;;32507:34;32518:22;;32507:6;:10;;:34;;;;:::i;:::-;32410:131;;;32444:47;32478:12;32444:29;32466:6;32444:17;;:21;;:29;;;;:::i;:::-;:33;;:47;;;;:::i;:::-;32410:131;32381:160;;32554:30;;:::i;:::-;32626:18;32595:8;:28;;:49;;;;;32689:3;32655:8;:31;;:37;;;;;32723:20;32731:11;32723:3;:7;;:20;;;;:::i;:::-;32703:8;:17;;:40;;;;;32777:11;32754:8;:20;;:34;;;;;32799:15;32820:8;32799:30;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;32799:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32862:41;32884:18;32862:17;;:21;;:41;;;;:::i;:::-;32842:17;:61;;;;32924:11;;;;;;;;;;;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32924:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32924:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32924:19:0;;;;;;;;;;;;;;;;:32;;;32957:10;32977:11;;;;;;;;;;;32991:6;32924:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32924:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32924:74:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32924:74:0;;;;;;;;;;;;;;;;32916:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33077:48;33090:6;33098:11;33111:13;:11;:13::i;:::-;33077:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10800:1;;;32010: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;18999:102::-;19047:6;19073:12;;;;;;;;;;;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19073:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19073:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19073:20:0;;;;;;;;;;;;;;;;19066:27;;18999:102;:::o;31265:104::-;31311:7;31338:13;;;;;;;;;;;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31338:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31338:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31338:23:0;;;;;;;;;;;;;;;;31331:30;;31265:104;:::o;31439:109::-;31491:7;31518:15;:22;;;;31511:29;;31439:109;:::o;22129:98::-;22203:16;22212:6;22203:8;:16::i;:::-;;22129:98;;;:::o;11637:109::-;10743:9;:7;:9::i;:::-;10735:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11710:28;11729:8;11710:18;:28::i;:::-;11637:109;:::o;33389:916::-;33429:7;33449:22;33474:1;33449:26;;33486:20;33509:13;:11;:13::i;:::-;33486:36;;33560:1;33539:17;;:22;33535:464;;;33595:12;33578:29;;33535:464;;;33640:22;33665:1;33640:26;;33686:9;33698:1;33686:13;;33681:148;33705:15;:22;;;;33701:1;:26;33681:148;;;33770:43;33789:23;33810:1;33789:20;:23::i;:::-;33770:14;:18;;:43;;;;:::i;:::-;33753:60;;33729:3;;;;;;;33681:148;;;;33860:55;33897:17;;33860:32;33879:12;33860:14;:18;;:32;;;;:::i;:::-;:36;;:55;;;;:::i;:::-;33843:72;;33950:37;33972:14;33950:17;;:21;;:37;;;;:::i;:::-;33930:17;:57;;;;33535:464;;34032:1;34015:14;:18;34011:253;;;34058:11;;;;;;;;;;;:20;;;34087:13;;;;;;;;;;;34103:14;34058:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34058:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34058:60:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34058:60:0;;;;;;;;;;;;;;;;34050:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34207:45;34222:14;34238:13;:11;:13::i;:::-;34207:45;;;;;;;;;;;;;;;;;;;;;;;;34011:253;34283:14;34276:21;;;;33389:916;:::o;29108:101::-;29148:7;29183:17;:15;:17::i;:::-;29168:33;;29108:101;:::o;20353:1507::-;20461:1;20452:6;:10;20444:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20542:1;20519:25;;:11;:25;;;;20511:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20630:1;20608:18;;:23;:44;;;;20651:1;20635:13;:11;:13::i;:::-;:17;20608:44;20600:148;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20761:27;20813:1;20792:18;;:22;20791:139;;20896:34;20907:22;;20896:6;:10;;:34;;;;:::i;:::-;20791:139;;;20831:49;20866:13;:11;:13::i;:::-;20831:30;20854:6;20831:18;;:22;;:30;;;;:::i;:::-;:34;;:49;;;;:::i;:::-;20791:139;20761:169;;20971:1;20949:19;:23;20941:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21028:18;:16;:18::i;:::-;;;;;;;21090:25;21118:11;:24;21130:11;21118:24;;;;;;;;;;;;;;;21090:52;;21176:45;21201:19;21176:6;:20;;;:24;;:45;;;;:::i;:::-;21153:6;:20;;:68;;;;21268:3;21232:6;:33;;:39;;;;21284:21;;:::i;:::-;21308:31;;;;;;;;;21314:19;21308:31;;;;21335:3;21308:31;;;21284:55;;21350:11;:24;21362:11;21350:24;;;;;;;;;;;;;;;21380:8;21350:39;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;21350:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21456:43;21479:19;21456:18;;:22;;:43;;;;:::i;:::-;21435:18;:64;;;;21638:12;;;;;;;;;;;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21638:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21638:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21638:20:0;;;;;;;;;;;;;;;;:33;;;21672:6;21688:12;;;;;;;;;;;21703:6;21638:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21638:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21638:72:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21638:72:0;;;;;;;;;;;;;;;;21630:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21799:11;21792:60;;;21812:6;21820:27;21835:11;21820:14;:27::i;:::-;21792:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20353: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;22813:3695::-;22864:7;22884:18;:16;:18::i;:::-;;;;;;;22951:1;22942:6;:10;22934:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23041:6;23011:26;23026:10;23011:14;:26::i;:::-;:36;;23003:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23137:27;23167:49;23202:13;:11;:13::i;:::-;23167:30;23190:6;23167:18;;:22;;:30;;;;:::i;:::-;:34;;:49;;;;:::i;:::-;23137:79;;23257:1;23235:19;:23;23227:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23355:25;23383:11;:23;23395:10;23383:23;;;;;;;;;;;;;;;23355:51;;23417:29;23449:11;:23;23461:10;23449:23;;;;;;;;;;;;;;;23417:55;;23553:33;23589:1;23553:37;;23601:24;23628:19;23601:46;;23658:20;23681:1;23658:24;;23693:1298;23719:1;23700:16;:20;23693:1298;;;23737:23;23763:13;23800:1;23777:13;:20;;;;:24;23763:39;;;;;;;;;;;;;;;;;;;;23737:65;;23817:20;23840:31;23848:9;:22;;;23840:3;:7;;:31;;;;:::i;:::-;23817:54;;23886:36;23925:1;23886:40;;23972:16;23945:9;:23;;;:43;;23941:1039;;;24086:41;24114:12;24086:9;:23;;;:27;;:41;;;;:::i;:::-;24055:72;;24161:74;24178:12;24192:28;24222:12;24161:16;:74::i;:::-;24146:89;;24282:59;24312:28;24282:25;:29;;:59;;;;:::i;:::-;24254:87;;24379:45;24400:9;:23;;;24379:16;:20;;:45;;;;:::i;:::-;24360:64;;24443:13;:22;;;;;;;;;;;;:::i;:::-;;23941:1039;;;24587:34;24608:12;24587:16;:20;;:34;;;;:::i;:::-;24556:65;;24655:74;24672:12;24686:28;24716:12;24655:16;:74::i;:::-;24640:89;;24776:59;24806:28;24776:25;:29;;:59;;;;:::i;:::-;24748:87;;24880:45;24908:16;24880:9;:23;;;:27;;:45;;;;:::i;:::-;24854:9;:23;;:71;;;;24963:1;24944:20;;23941:1039;23693:1298;;;;;;25030:57;25061:25;25030:6;:26;;;:30;;:57;;;;:::i;:::-;25001:6;:26;;:86;;;;25121:45;25146:19;25121:6;:20;;;:24;;:45;;;;:::i;:::-;25098:6;:20;;:68;;;;25337:56;25367:25;25337;;:29;;:56;;;;:::i;:::-;25309:25;:84;;;;25425:43;25448:19;25425:18;;:22;;:43;;;;:::i;:::-;25404:18;:64;;;;25636:22;25661:23;25680:3;25661:14;25672:2;25661:6;:10;;:14;;;;:::i;:::-;:18;;:23;;;;:::i;:::-;25636:48;;25695:17;25715:26;25726:14;25715:6;:10;;:26;;;;:::i;:::-;25695:46;;25785:12;;;;;;;;;;;:21;;;25807:10;25819:14;25785:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25785:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25785:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25785:49:0;;;;;;;;;;;;;;;;25777:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25919:12;;;;;;;;;;;:21;;;25949:4;25956:9;25919:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25919:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25919:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25919:47:0;;;;;;;;;;;;;;;;25911:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26051:13;;;;;;;;;;;:22;;;26074:10;26086:12;26051:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26051:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26051:48:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26051:48:0;;;;;;;;;;;;;;;;26043:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26193:10;26184:68;;;26205:14;26221:26;26236:10;26221:14;:26::i;:::-;26184:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26282:10;26268:39;;;26294:12;26268:39;;;;;;;;;;;;;;;;;;26350:1;26328:18;;:23;:44;;;;26371:1;26355:13;:11;:13::i;:::-;:17;26328:44;26320:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26488:12;26481:19;;;;;;;;;;22813:3695;;;:::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;34675:920::-;34733:7;34753:31;34787:15;34803:1;34787:18;;;;;;;;;;;;;;;;;;;;34753:52;;34848:8;:28;;;34821:8;:23;;;:55;;34818:95;;;34900:1;34893:8;;;;;34818:95;34925:22;34950:1;34925:26;;35048:8;:17;;;35041:3;:24;;35037:437;;;35100:57;35133:8;:23;;;35100:8;:28;;;:32;;:57;;;;:::i;:::-;35082:76;;35207:8;:17;;;35173:8;:31;;:51;;;;35037:437;;;35274:136;35389:8;:20;;;35274:92;35337:8;:28;;;35274:40;35282:8;:31;;;35274:3;:7;;:40;;;;:::i;:::-;:62;;:92;;;;:::i;:::-;:114;;:136;;;;:::i;:::-;35257:153;;35459:3;35425:8;:31;;:37;;;;35037:437;35512:43;35540:14;35512:8;:23;;;:27;;:43;;;;:::i;:::-;35486:8;:23;;:69;;;;35573:14;35566:21;;;;34675: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;27484:808::-;27678:7;27700:23;27739:99;27812:25;;27739:54;27773:19;27739:15;:13;:15::i;:::-;:33;;:54;;;;:::i;:::-;:72;;:99;;;;:::i;:::-;27700:138;;27871:14;;27855:12;:30;;27851:110;;;27909:40;27933:15;27909:19;:23;;:40;;;;:::i;:::-;27902:47;;;;;27851:110;27973:21;15816:1;27997:2;:18;27973:42;;28026:21;28063:165;28214:13;28063:132;28179:15;28063:97;28092:67;28144:14;;28092:47;28126:12;28092:29;28110:10;;28092:13;:17;;:29;;;;:::i;:::-;:33;;:47;;;;:::i;:::-;:51;;:67;;;;:::i;:::-;28063:10;;:28;;:97;;;;:::i;:::-;:115;;:132;;;;:::i;:::-;:150;;:165;;;;:::i;:::-;28026:202;;28246:38;28270:13;28246:19;:23;;:38;;;;:::i;:::-;28239:45;;;;;27484:808;;;;;;:::o;15105:21022::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://d18576602433f076203a89f0cd23125d3ef9d3a3eea325496b566f3db767c04c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.