Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 199 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Unstake | 12576582 | 1296 days ago | IN | 0 ETH | 0.00256542 | ||||
Stake | 11642477 | 1440 days ago | IN | 0 ETH | 0.01293014 | ||||
Unstake | 11637065 | 1441 days ago | IN | 0 ETH | 0.02086517 | ||||
Unstake | 11573725 | 1450 days ago | IN | 0 ETH | 0.01222274 | ||||
Stake | 11567168 | 1451 days ago | IN | 0 ETH | 0.01314279 | ||||
Unstake | 11564228 | 1452 days ago | IN | 0 ETH | 0.01744465 | ||||
Unstake | 11557933 | 1453 days ago | IN | 0 ETH | 0.01881286 | ||||
Unstake | 11535006 | 1456 days ago | IN | 0 ETH | 0.02052312 | ||||
Unstake | 11534997 | 1456 days ago | IN | 0 ETH | 0.0275758 | ||||
Unstake | 11511309 | 1460 days ago | IN | 0 ETH | 0.0205224 | ||||
Unstake | 11494047 | 1463 days ago | IN | 0 ETH | 0.02626316 | ||||
Stake | 11493794 | 1463 days ago | IN | 0 ETH | 0.02406078 | ||||
Stake | 11491496 | 1463 days ago | IN | 0 ETH | 0.01112638 | ||||
Unstake | 11489282 | 1463 days ago | IN | 0 ETH | 0.00957745 | ||||
Unstake | 11488239 | 1464 days ago | IN | 0 ETH | 0.00752488 | ||||
Unstake | 11486489 | 1464 days ago | IN | 0 ETH | 0.01026156 | ||||
Unstake | 11471595 | 1466 days ago | IN | 0 ETH | 0.03248226 | ||||
Unstake | 11467203 | 1467 days ago | IN | 0 ETH | 0.01866067 | ||||
Unstake | 11465299 | 1467 days ago | IN | 0 ETH | 0.02508823 | ||||
Stake | 11463973 | 1467 days ago | IN | 0 ETH | 0.01587764 | ||||
Unstake | 11460309 | 1468 days ago | IN | 0 ETH | 0.01938569 | ||||
Stake | 11459170 | 1468 days ago | IN | 0 ETH | 0.01533636 | ||||
Unstake | 11452498 | 1469 days ago | IN | 0 ETH | 0.01140374 | ||||
Unstake | 11450213 | 1469 days ago | IN | 0 ETH | 0.01520446 | ||||
Stake | 11450082 | 1469 days ago | IN | 0 ETH | 0.01503505 |
Latest 3 internal transactions
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
11338102 | 1487 days ago | Contract Creation | 0 ETH | |||
11338102 | 1487 days ago | Contract Creation | 0 ETH | |||
11338102 | 1487 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
TokenGeyser
Compiler Version
v0.5.0+commit.1d4f565a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-27 */ /* stargazeprotocol.com * _..._ * .' '. _ * / .-""-\ _/ \ * .-| /:. | | | * | \ |:. /.-'-./ * | .-'-;:__.' =/ * .'= *=|STGZ _.=' * / _. | ; * ;-.-'| \ | * / | \ _\ _\ * \__/'._;. ==' ==\ * \ \ | * / / / * /-._/-._/ * \ `\ \ * `-._/._/ */ // SPDX-License-Identifier: MIT // File: openzeppelin-solidity/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: openzeppelin-solidity/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: openzeppelin-solidity/contracts/GSN/Context.sol pragma solidity ^0.5.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: openzeppelin-solidity/contracts/ownership/Ownable.sol pragma solidity ^0.5.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { _owner = _msgSender(); emit OwnershipTransferred(address(0), _owner); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _owner; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/IStaking.sol pragma solidity 0.5.0; /** * @title Staking interface, as defined by EIP-900. * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-900.md */ contract IStaking { event Staked(address indexed user, uint256 amount, uint256 total, bytes data); event Unstaked(address indexed user, uint256 amount, uint256 total, bytes data); function stake(uint256 amount, bytes calldata data) external; function stakeFor(address user, uint256 amount, bytes calldata data) external; function unstake(uint256 amount, bytes calldata data) external; function totalStakedFor(address addr) public view returns (uint256); function totalStaked() public view returns (uint256); function token() external view returns (address); /** * @return False. This application does not support staking history. */ function supportsHistory() external pure returns (bool) { return false; } } // File: contracts/TokenPool.sol pragma solidity 0.5.0; /** * @title A simple holder of tokens. * This is a simple contract to hold tokens. It's useful in the case where a separate contract * needs to hold multiple distinct pools of the same token. */ contract TokenPool is Ownable { IERC20 public token; constructor(IERC20 _token) public { token = _token; } function balance() public view returns (uint256) { return token.balanceOf(address(this)); } function transfer(address to, uint256 value) external onlyOwner returns (bool) { return token.transfer(to, value); } } // File: contracts/TokenGeyser.sol pragma solidity 0.5.0; // ABIEncoderV2 added for Flow Protocol pragma experimental ABIEncoderV2; /** * @title Token Geyser * @dev A smart-contract based mechanism to distribute tokens over time, inspired loosely by * Compound and Uniswap. * * Distribution tokens are added to a locked pool in the contract and become unlocked over time * according to a once-configurable unlock schedule. Once unlocked, they are available to be * claimed by users. * * A user may deposit tokens to accrue ownership share over the unlocked pool. This owner share * is a function of the number of tokens deposited as well as the length of time deposited. * Specifically, a user's share of the currently-unlocked pool equals their "deposit-seconds" * divided by the global "deposit-seconds". This aligns the new token distribution with long * term supporters of the project, addressing one of the major drawbacks of simple airdrops. * * More background and motivation available at: * https://github.com/ampleforth/RFCs/blob/master/RFCs/rfc-1.md */ contract TokenGeyser is IStaking, Ownable { using SafeMath for uint256; event Staked(address indexed user, uint256 amount, uint256 total, bytes data); event Unstaked(address indexed user, uint256 amount, uint256 total, bytes data); event TokensClaimed(address indexed user, uint256 amount); event TokensLocked(uint256 amount, uint256 durationSec, uint256 total); // amount: Unlocked tokens, total: Total locked tokens event TokensUnlocked(uint256 amount, uint256 total); TokenPool private _stakingPool; TokenPool private _unlockedPool; TokenPool private _lockedPool; // // Time-bonus params // uint256 public constant BONUS_DECIMALS = 2; uint256 public startBonus = 0; uint256 public bonusPeriodSec = 0; // // Global accounting state // uint256 public totalLockedShares = 0; uint256 public totalStakingShares = 0; uint256 private _totalStakingShareSeconds = 0; uint256 private _lastAccountingTimestampSec = now; uint256 private _maxUnlockSchedules = 0; uint256 private _initialSharesPerToken = 0; // // User accounting state // // Represents a single stake for a user. A user may have multiple. struct Stake { uint256 stakingShares; uint256 timestampSec; } // Caches aggregated values from the User->Stake[] map to save computation. // If lastAccountingTimestampSec is 0, there's no entry for that user. struct UserTotals { uint256 stakingShares; uint256 stakingShareSeconds; uint256 lastAccountingTimestampSec; } // Aggregated staking values per user mapping(address => UserTotals) private _userTotals; // The collection of stakes for each user. Ordered by timestamp, earliest to latest. mapping(address => Stake[]) private _userStakes; // // Locked/Unlocked Accounting state // struct UnlockSchedule { uint256 initialLockedShares; uint256 unlockedShares; uint256 lastUnlockTimestampSec; uint256 endAtSec; uint256 durationSec; } UnlockSchedule[] public unlockSchedules; /** * @param stakingToken The token users deposit as stake. * @param distributionToken The token users receive as they unstake. * @param maxUnlockSchedules Max number of unlock stages, to guard against hitting gas limit. * @param startBonus_ Starting time bonus, BONUS_DECIMALS fixed point. * e.g. 25% means user gets 25% of max distribution tokens. * @param bonusPeriodSec_ Length of time for bonus to increase linearly to max. * @param initialSharesPerToken Number of shares to mint per staking token on first stake. */ constructor(IERC20 stakingToken, IERC20 distributionToken, uint256 maxUnlockSchedules, uint256 startBonus_, uint256 bonusPeriodSec_, uint256 initialSharesPerToken) public { // The start bonus must be some fraction of the max. (i.e. <= 100%) require(startBonus_ <= 10**BONUS_DECIMALS, 'TokenGeyser: start bonus too high'); // If no period is desired, instead set startBonus = 100% // and bonusPeriod to a small value like 1sec. require(bonusPeriodSec_ != 0, 'TokenGeyser: bonus period is zero'); require(initialSharesPerToken > 0, 'TokenGeyser: initialSharesPerToken is zero'); _stakingPool = new TokenPool(stakingToken); _unlockedPool = new TokenPool(distributionToken); _lockedPool = new TokenPool(distributionToken); startBonus = startBonus_; bonusPeriodSec = bonusPeriodSec_; _maxUnlockSchedules = maxUnlockSchedules; _initialSharesPerToken = initialSharesPerToken; } /** * @return The token users deposit as stake. */ function getStakingToken() public view returns (IERC20) { return _stakingPool.token(); } /** * @return The token users receive as they unstake. */ function getDistributionToken() public view returns (IERC20) { assert(_unlockedPool.token() == _lockedPool.token()); return _unlockedPool.token(); } /** * @dev Transfers amount of deposit tokens from the user. * @param amount Number of deposit tokens to stake. * @param data Not used. */ function stake(uint256 amount, bytes calldata data) external { _stakeFor(msg.sender, msg.sender, amount); } /** * @dev Transfers amount of deposit tokens from the caller on behalf of user. * @param user User address who gains credit for this stake operation. * @param amount Number of deposit tokens to stake. * @param data Not used. */ function stakeFor(address user, uint256 amount, bytes calldata data) external onlyOwner { _stakeFor(msg.sender, user, amount); } /** * @dev Private implementation of staking methods. * @param staker User address who deposits tokens to stake. * @param beneficiary User address who gains credit for this stake operation. * @param amount Number of deposit tokens to stake. */ function _stakeFor(address staker, address beneficiary, uint256 amount) private { require(amount > 0, 'TokenGeyser: stake amount is zero'); require(beneficiary != address(0), 'TokenGeyser: beneficiary is zero address'); require(totalStakingShares == 0 || totalStaked() > 0, 'TokenGeyser: Invalid state. Staking shares exist, but no staking tokens do'); uint256 mintedStakingShares = (totalStakingShares > 0) ? totalStakingShares.mul(amount).div(totalStaked()) : amount.mul(_initialSharesPerToken); require(mintedStakingShares > 0, 'TokenGeyser: Stake amount is too small'); updateAccounting(); // 1. User Accounting UserTotals storage totals = _userTotals[beneficiary]; totals.stakingShares = totals.stakingShares.add(mintedStakingShares); totals.lastAccountingTimestampSec = now; Stake memory newStake = Stake(mintedStakingShares, now); _userStakes[beneficiary].push(newStake); // 2. Global Accounting totalStakingShares = totalStakingShares.add(mintedStakingShares); // Already set in updateAccounting() // _lastAccountingTimestampSec = now; // interactions require(_stakingPool.token().transferFrom(staker, address(_stakingPool), amount), 'TokenGeyser: transfer into staking pool failed'); emit Staked(beneficiary, amount, totalStakedFor(beneficiary), ""); } /** * @dev Unstakes a certain amount of previously deposited tokens. User also receives their * alotted number of distribution tokens. * @param amount Number of deposit tokens to unstake / withdraw. * @param data Not used. */ function unstake(uint256 amount, bytes calldata data) external { _unstake(amount); } /** * @param amount Number of deposit tokens to unstake / withdraw. * @return The total number of distribution tokens that would be rewarded. */ function unstakeQuery(uint256 amount) public returns (uint256) { return _unstake(amount); } /** * @dev Unstakes a certain amount of previously deposited tokens. User also receives their * alotted number of distribution tokens. * @param amount Number of deposit tokens to unstake / withdraw. * @return The total number of distribution tokens rewarded. */ function _unstake(uint256 amount) private returns (uint256) { updateAccounting(); // checks require(amount > 0, 'TokenGeyser: unstake amount is zero'); require(totalStakedFor(msg.sender) >= amount, 'TokenGeyser: unstake amount is greater than total user stakes'); uint256 stakingSharesToBurn = totalStakingShares.mul(amount).div(totalStaked()); require(stakingSharesToBurn > 0, 'TokenGeyser: Unable to unstake amount this small'); // 1. User Accounting UserTotals storage totals = _userTotals[msg.sender]; Stake[] storage accountStakes = _userStakes[msg.sender]; // Redeem from most recent stake and go backwards in time. uint256 stakingShareSecondsToBurn = 0; uint256 sharesLeftToBurn = stakingSharesToBurn; uint256 rewardAmount = 0; while (sharesLeftToBurn > 0) { Stake storage lastStake = accountStakes[accountStakes.length - 1]; uint256 stakeTimeSec = now.sub(lastStake.timestampSec); uint256 newStakingShareSecondsToBurn = 0; if (lastStake.stakingShares <= sharesLeftToBurn) { // fully redeem a past stake newStakingShareSecondsToBurn = lastStake.stakingShares.mul(stakeTimeSec); rewardAmount = computeNewReward(rewardAmount, newStakingShareSecondsToBurn, stakeTimeSec); stakingShareSecondsToBurn = stakingShareSecondsToBurn.add(newStakingShareSecondsToBurn); sharesLeftToBurn = sharesLeftToBurn.sub(lastStake.stakingShares); accountStakes.length--; } else { // partially redeem a past stake newStakingShareSecondsToBurn = sharesLeftToBurn.mul(stakeTimeSec); rewardAmount = computeNewReward(rewardAmount, newStakingShareSecondsToBurn, stakeTimeSec); stakingShareSecondsToBurn = stakingShareSecondsToBurn.add(newStakingShareSecondsToBurn); lastStake.stakingShares = lastStake.stakingShares.sub(sharesLeftToBurn); sharesLeftToBurn = 0; } } totals.stakingShareSeconds = totals.stakingShareSeconds.sub(stakingShareSecondsToBurn); totals.stakingShares = totals.stakingShares.sub(stakingSharesToBurn); // Already set in updateAccounting // totals.lastAccountingTimestampSec = now; // 2. Global Accounting _totalStakingShareSeconds = _totalStakingShareSeconds.sub(stakingShareSecondsToBurn); totalStakingShares = totalStakingShares.sub(stakingSharesToBurn); // Already set in updateAccounting // _lastAccountingTimestampSec = now; // interactions require(_stakingPool.transfer(msg.sender, amount), 'TokenGeyser: transfer out of staking pool failed'); require(_unlockedPool.transfer(msg.sender, rewardAmount), 'TokenGeyser: transfer out of unlocked pool failed'); emit Unstaked(msg.sender, amount, totalStakedFor(msg.sender), ""); emit TokensClaimed(msg.sender, rewardAmount); require(totalStakingShares == 0 || totalStaked() > 0, "TokenGeyser: Error unstaking. Staking shares exist, but no staking tokens do"); return rewardAmount; } /** * @dev Applies an additional time-bonus to a distribution amount. This is necessary to * encourage long-term deposits instead of constant unstake/restakes. * The bonus-multiplier is the result of a linear function that starts at startBonus and * ends at 100% over bonusPeriodSec, then stays at 100% thereafter. * @param currentRewardTokens The current number of distribution tokens already alotted for this * unstake op. Any bonuses are already applied. * @param stakingShareSeconds The stakingShare-seconds that are being burned for new * distribution tokens. * @param stakeTimeSec Length of time for which the tokens were staked. Needed to calculate * the time-bonus. * @return Updated amount of distribution tokens to award, with any bonus included on the * newly added tokens. */ function computeNewReward(uint256 currentRewardTokens, uint256 stakingShareSeconds, uint256 stakeTimeSec) private view returns (uint256) { uint256 newRewardTokens = totalUnlocked() .mul(stakingShareSeconds) .div(_totalStakingShareSeconds); if (stakeTimeSec >= bonusPeriodSec) { return currentRewardTokens.add(newRewardTokens); } uint256 oneHundredPct = 10**BONUS_DECIMALS; uint256 bonusedReward = startBonus .add(oneHundredPct.sub(startBonus).mul(stakeTimeSec).div(bonusPeriodSec)) .mul(newRewardTokens) .div(oneHundredPct); return currentRewardTokens.add(bonusedReward); } // getUserTotals, getTotalStakingShareSeconds, getLastAccountingTimestamp functions added for Flow Protocol /** * @param addr The user to look up staking information for. * @return The UserStakes for this address. */ function getUserStakes(address addr) public view returns (Stake[] memory){ Stake[] memory userStakes = _userStakes[addr]; return userStakes; } /** * @param addr The user to look up staking information for. * @return The UserTotals for this address. */ function getUserTotals(address addr) public view returns (UserTotals memory) { UserTotals memory userTotals = _userTotals[addr]; return userTotals; } /** * @return The total staking share seconds. */ function getTotalStakingShareSeconds() public view returns (uint256) { return _totalStakingShareSeconds; } /** * @return The last global accounting timestamp. */ function getLastAccountingTimestamp() public view returns (uint256) { return _lastAccountingTimestampSec; } /** * @param addr The user to look up staking information for. * @return The number of staking tokens deposited for addr. */ function totalStakedFor(address addr) public view returns (uint256) { return totalStakingShares > 0 ? totalStaked().mul(_userTotals[addr].stakingShares).div(totalStakingShares) : 0; } /** * @return The total number of deposit tokens staked globally, by all users. */ function totalStaked() public view returns (uint256) { return _stakingPool.balance(); } /** * @dev Note that this application has a staking token as well as a distribution token, which * may be different. This function is required by EIP-900. * @return The deposit token used for staking. */ function token() external view returns (address) { return address(getStakingToken()); } /** * @dev A globally callable function to update the accounting state of the system. * Global state and state for the caller are updated. * @return [0] balance of the locked pool * @return [1] balance of the unlocked pool * @return [2] caller's staking share seconds * @return [3] global staking share seconds * @return [4] Rewards caller has accumulated, optimistically assumes max time-bonus. * @return [5] block timestamp */ function updateAccounting() public returns ( uint256, uint256, uint256, uint256, uint256, uint256) { unlockTokens(); // Global accounting uint256 newStakingShareSeconds = now .sub(_lastAccountingTimestampSec) .mul(totalStakingShares); _totalStakingShareSeconds = _totalStakingShareSeconds.add(newStakingShareSeconds); _lastAccountingTimestampSec = now; // User Accounting UserTotals storage totals = _userTotals[msg.sender]; uint256 newUserStakingShareSeconds = now .sub(totals.lastAccountingTimestampSec) .mul(totals.stakingShares); totals.stakingShareSeconds = totals.stakingShareSeconds .add(newUserStakingShareSeconds); totals.lastAccountingTimestampSec = now; uint256 totalUserRewards = (_totalStakingShareSeconds > 0) ? totalUnlocked().mul(totals.stakingShareSeconds).div(_totalStakingShareSeconds) : 0; return ( totalLocked(), totalUnlocked(), totals.stakingShareSeconds, _totalStakingShareSeconds, totalUserRewards, now ); } /** * @return Total number of locked distribution tokens. */ function totalLocked() public view returns (uint256) { return _lockedPool.balance(); } /** * @return Total number of unlocked distribution tokens. */ function totalUnlocked() public view returns (uint256) { return _unlockedPool.balance(); } /** * @return Number of unlock schedules. */ function unlockScheduleCount() public view returns (uint256) { return unlockSchedules.length; } /** * @dev This funcion allows the contract owner to add more locked distribution tokens, along * with the associated "unlock schedule". These locked tokens immediately begin unlocking * linearly over the duraction of durationSec timeframe. * @param amount Number of distribution tokens to lock. These are transferred from the caller. * @param durationSec Length of time to linear unlock the tokens. */ function lockTokens(uint256 amount, uint256 durationSec) external onlyOwner { require(unlockSchedules.length < _maxUnlockSchedules, 'TokenGeyser: reached maximum unlock schedules'); // Update lockedTokens amount before using it in computations after. updateAccounting(); uint256 lockedTokens = totalLocked(); uint256 mintedLockedShares = (lockedTokens > 0) ? totalLockedShares.mul(amount).div(lockedTokens) : amount.mul(_initialSharesPerToken); UnlockSchedule memory schedule; schedule.initialLockedShares = mintedLockedShares; schedule.lastUnlockTimestampSec = now; schedule.endAtSec = now.add(durationSec); schedule.durationSec = durationSec; unlockSchedules.push(schedule); totalLockedShares = totalLockedShares.add(mintedLockedShares); require(_lockedPool.token().transferFrom(msg.sender, address(_lockedPool), amount), 'TokenGeyser: transfer into locked pool failed'); emit TokensLocked(amount, durationSec, totalLocked()); } /** * @dev Moves distribution tokens from the locked pool to the unlocked pool, according to the * previously defined unlock schedules. Publicly callable. * @return Number of newly unlocked distribution tokens. */ function unlockTokens() public returns (uint256) { uint256 unlockedTokens = 0; uint256 lockedTokens = totalLocked(); if (totalLockedShares == 0) { unlockedTokens = lockedTokens; } else { uint256 unlockedShares = 0; for (uint256 s = 0; s < unlockSchedules.length; s++) { unlockedShares = unlockedShares.add(unlockScheduleShares(s)); } unlockedTokens = unlockedShares.mul(lockedTokens).div(totalLockedShares); totalLockedShares = totalLockedShares.sub(unlockedShares); } if (unlockedTokens > 0) { require(_lockedPool.transfer(address(_unlockedPool), unlockedTokens), 'TokenGeyser: transfer out of locked pool failed'); emit TokensUnlocked(unlockedTokens, totalLocked()); } return unlockedTokens; } /** * @dev Returns the number of unlockable shares from a given schedule. The returned value * depends on the time since the last unlock. This function updates schedule accounting, * but does not actually transfer any tokens. * @param s Index of the unlock schedule. * @return The number of unlocked shares. */ function unlockScheduleShares(uint256 s) private returns (uint256) { UnlockSchedule storage schedule = unlockSchedules[s]; if(schedule.unlockedShares >= schedule.initialLockedShares) { return 0; } uint256 sharesToUnlock = 0; // Special case to handle any leftover dust from integer division if (now >= schedule.endAtSec) { sharesToUnlock = (schedule.initialLockedShares.sub(schedule.unlockedShares)); schedule.lastUnlockTimestampSec = schedule.endAtSec; } else { sharesToUnlock = now.sub(schedule.lastUnlockTimestampSec) .mul(schedule.initialLockedShares) .div(schedule.durationSec); schedule.lastUnlockTimestampSec = now; } schedule.unlockedShares = schedule.unlockedShares.add(sharesToUnlock); return sharesToUnlock; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[{"name":"amount","type":"uint256"},{"name":"data","type":"bytes"}],"name":"stake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"user","type":"address"},{"name":"amount","type":"uint256"},{"name":"data","type":"bytes"}],"name":"stakeFor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"BONUS_DECIMALS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getDistributionToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getLastAccountingTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"startBonus","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"updateAccounting","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"totalStakedFor","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalLocked","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"unlockSchedules","outputs":[{"name":"initialLockedShares","type":"uint256"},{"name":"unlockedShares","type":"uint256"},{"name":"lastUnlockTimestampSec","type":"uint256"},{"name":"endAtSec","type":"uint256"},{"name":"durationSec","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"supportsHistory","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"totalStakingShares","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"bonusPeriodSec","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalStaked","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalLockedShares","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"getUserStakes","outputs":[{"components":[{"name":"stakingShares","type":"uint256"},{"name":"timestampSec","type":"uint256"}],"name":"","type":"tuple[]"}],"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":"addr","type":"address"}],"name":"getUserTotals","outputs":[{"components":[{"name":"stakingShares","type":"uint256"},{"name":"stakingShareSeconds","type":"uint256"},{"name":"lastAccountingTimestampSec","type":"uint256"}],"name":"","type":"tuple"}],"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":true,"inputs":[],"name":"getTotalStakingShareSeconds","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":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
608060405260006004556000600555600060065560006007556000600855426009556000600a556000600b553480156200003857600080fd5b5060405160c0806200362983398101806040526200005a9190810190620002c7565b6200006d6401000000006200028f810204565b60008054600160a060020a031916600160a060020a03928316178082556040519216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36064831115620000fc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000f39062000484565b60405180910390fd5b81151562000138576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000f390620004a8565b6000811162000175576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000f39062000496565b856200018062000293565b6200018c91906200046e565b604051809103906000f080158015620001a9573d6000803e3d6000fd5b5060018054600160a060020a031916600160a060020a039290921691909117905584620001d562000293565b620001e191906200046e565b604051809103906000f080158015620001fe573d6000803e3d6000fd5b5060028054600160a060020a031916600160a060020a0392909216919091179055846200022a62000293565b6200023691906200046e565b604051809103906000f08015801562000253573d6000803e3d6000fd5b5060038054600160a060020a031916600160a060020a0392909216919091179055600492909255600555600a91909155600b5550620004dc9050565b3390565b6040516107f18062002e3883390190565b6000620002b28251620004cc565b9392505050565b6000620002b28251620004d9565b60008060008060008060c08789031215620002e157600080fd5b6000620002ef8989620002a4565b96505060206200030289828a01620002a4565b95505060406200031589828a01620002b9565b94505060606200032889828a01620002b9565b93505060806200033b89828a01620002b9565b92505060a06200034e89828a01620002b9565b9150509295509295509295565b6200036681620004cc565b82525050565b602181527f546f6b656e4765797365723a20737461727420626f6e757320746f6f2068696760208201527f6800000000000000000000000000000000000000000000000000000000000000604082015260600190565b602a81527f546f6b656e4765797365723a20696e697469616c536861726573506572546f6b60208201527f656e206973207a65726f00000000000000000000000000000000000000000000604082015260600190565b602181527f546f6b656e4765797365723a20626f6e757320706572696f64206973207a657260208201527f6f00000000000000000000000000000000000000000000000000000000000000604082015260600190565b602081016200047e82846200035b565b92915050565b602080825281016200047e816200036c565b602080825281016200047e81620003c2565b602080825281016200047e8162000418565b6000600160a060020a0382166200047e565b60006200047e82620004ba565b90565b61294c80620004ec6000396000f3fe6080604052600436106101665763ffffffff60e060020a6000350416630e89439b811461016b5780630ef963561461018d5780631dc27fde146101ad57806322c12b84146101d85780632f58aba2146101fa57806338b45fde1461020f578063494347e7146102245780634b341aed1461024b578063568914121461026b5780635c94bcb2146102805780637033e4a6146102b157806370c6a17e146102d3578063715018a6146102e85780637c6aa6f4146102fd578063817b1cd21461031257806381c39bec14610327578063842e29811461033c57806386805dd11461036957806389158d8e146103895780638da5cb5b146103a95780638f32d59b146103cb57806399044f7c146103e05780639f9106d11461040d578063a779d08014610422578063c7ae200714610437578063c8fd6ed01461044c578063dc24ffee1461046c578063f2fde38b14610481578063f968f493146104a1578063fc0c546a146104b6575b600080fd5b34801561017757600080fd5b5061018b610186366004611e0d565b6104cb565b005b34801561019957600080fd5b5061018b6101a8366004611d2d565b6104db565b3480156101b957600080fd5b506101c261051e565b6040516101cf91906127a2565b60405180910390f35b3480156101e457600080fd5b506101ed610523565b6040516101cf9190612655565b34801561020657600080fd5b506101c26106d4565b34801561021b57600080fd5b506101c26106da565b34801561023057600080fd5b506102396106e0565b6040516101cf96959493929190612851565b34801561025757600080fd5b506101c2610266366004611d07565b6107ee565b34801561027757600080fd5b506101c2610835565b34801561028c57600080fd5b506102a061029b366004611dd1565b6108cb565b6040516101cf959493929190612805565b3480156102bd57600080fd5b506102c661090a565b6040516101cf9190612647565b3480156102df57600080fd5b506101c261090f565b3480156102f457600080fd5b5061018b610915565b34801561030957600080fd5b506101c2610995565b34801561031e57600080fd5b506101c261099b565b34801561033357600080fd5b506101c26109f9565b34801561034857600080fd5b5061035c610357366004611d07565b6109ff565b6040516101cf9190612636565b34801561037557600080fd5b506101c2610384366004611dd1565b610a7e565b34801561039557600080fd5b5061018b6103a4366004611e63565b610a89565b3480156103b557600080fd5b506103be610dd5565b6040516101cf91906125c9565b3480156103d757600080fd5b506102c6610de4565b3480156103ec57600080fd5b506104006103fb366004611d07565b610e08565b6040516101cf9190612794565b34801561041957600080fd5b506101ed610e5b565b34801561042e57600080fd5b506101c2610ea3565b34801561044357600080fd5b506101c2610f01565b34801561045857600080fd5b5061018b610467366004611e0d565b610f07565b34801561047857600080fd5b506101c2610f10565b34801561048d57600080fd5b5061018b61049c366004611d07565b610f16565b3480156104ad57600080fd5b506101c2610f4b565b3480156104c257600080fd5b506103be6110e2565b6104d63333856110ec565b505050565b6104e3610de4565b151561050d5760405160e560020a62461bcd02815260040161050490612754565b60405180910390fd5b6105183385856110ec565b50505050565b600281565b6003546040805160e160020a637e062a350281529051600092600160a060020a03169163fc0c546a916004808301926020929190829003018186803b15801561056b57600080fd5b505afa15801561057f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506105a39190810190611db3565b600160a060020a0316600260009054906101000a9004600160a060020a0316600160a060020a031663fc0c546a6040518163ffffffff1660e060020a02815260040160206040518083038186803b1580156105fd57600080fd5b505afa158015610611573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106359190810190611db3565b600160a060020a03161461064557fe5b600260009054906101000a9004600160a060020a0316600160a060020a031663fc0c546a6040518163ffffffff1660e060020a02815260040160206040518083038186803b15801561069657600080fd5b505afa1580156106aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106ce9190810190611db3565b90505b90565b60095490565b60045481565b6000806000806000806106f1610f4b565b50600061071b60075461070f6009544261141690919063ffffffff16565b9063ffffffff61146116565b600854909150610731908263ffffffff6114a216565b600855426009819055336000908152600c602052604081208054600282015491936107669261070f919063ffffffff61141616565b600183015490915061077e908263ffffffff6114a216565b6001830155426002830155600854600090811061079c5760006107be565b6107be6008546107b2856001015461070f610ea3565b9063ffffffff6114ca16565b90506107c8610835565b6107d0610ea3565b600190940154600854919c949b509950975095504294509092505050565b6000806007541161080057600061082d565b600754600160a060020a0383166000908152600c602052604090205461082d91906107b29061070f61099b565b90505b919050565b600354604080517fb69ef8a80000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163b69ef8a8916004808301926020929190829003018186803b15801561089357600080fd5b505afa1580156108a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106ce9190810190611def565b600e8054829081106108d957fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401549294509092909185565b600090565b60075481565b61091d610de4565b151561093e5760405160e560020a62461bcd02815260040161050490612754565b60008054604051600160a060020a03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b60055481565b600154604080517fb69ef8a80000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163b69ef8a8916004808301926020929190829003018186803b15801561089357600080fd5b60065481565b600160a060020a0381166000908152600d602090815260408083208054825181850281018501909352808352606094859484015b82821015610a72576000848152602090819020604080518082019091526002850290910180548252600190810154828401529083529092019101610a33565b50929695505050505050565b600061082d8261150c565b610a91610de4565b1515610ab25760405160e560020a62461bcd02815260040161050490612754565b600a54600e5410610ad85760405160e560020a62461bcd02815260040161050490612774565b610ae06106e0565b5050505050506000610af0610835565b90506000808211610b1457600b54610b0f90859063ffffffff61146116565b610b2d565b610b2d826107b28660065461146190919063ffffffff16565b9050610b37611bd1565b8181524260408201819052610b52908563ffffffff6114a216565b6060820190815260808201858152600e805460018101825560009190915283517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd60059092029182015560208401517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe82015560408401517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3ff82015591517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c400830155517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c40190910155600654610c4790836114a2565b6006556003546040805160e160020a637e062a350281529051600160a060020a039092169163fc0c546a91600480820192602092909190829003018186803b158015610c9257600080fd5b505afa158015610ca6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610cca9190810190611db3565b6003546040517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a03928316926323b872dd92610d19923392909116908a906004016125d7565b602060405180830381600087803b158015610d3357600080fd5b505af1158015610d47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d6b9190810190611d95565b1515610d8c5760405160e560020a62461bcd02815260040161050490612674565b7ff346961af4c52f314df1b45964746280fe409abb959d4a2458d58f79408b1fe88585610db7610835565b604051610dc6939291906127ea565b60405180910390a15050505050565b600054600160a060020a031690565b60008054600160a060020a0316610df9611972565b600160a060020a031614905090565b610e10611c01565b610e18611c01565b5050600160a060020a03166000908152600c6020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915290565b6001546040805160e160020a637e062a350281529051600092600160a060020a03169163fc0c546a916004808301926020929190829003018186803b15801561069657600080fd5b600254604080517fb69ef8a80000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163b69ef8a8916004808301926020929190829003018186803b15801561089357600080fd5b600e5490565b6105188361150c565b60085490565b610f1e610de4565b1515610f3f5760405160e560020a62461bcd02815260040161050490612754565b610f4881611976565b50565b60008080610f57610835565b905060065460001415610f6c57809150610fd0565b6000805b600e54811015610f9d57610f93610f8682611a09565b839063ffffffff6114a216565b9150600101610f70565b50600654610fb5906107b2838563ffffffff61146116565b600654909350610fcb908263ffffffff61141616565b600655505b60008211156110dc576003546002546040517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a039283169263a9059cbb92611028929116908690600401612628565b602060405180830381600087803b15801561104257600080fd5b505af1158015611056573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061107a9190810190611d95565b151561109b5760405160e560020a62461bcd028152600401610504906126f4565b7f2e444eb379b177e88ce0649c6110a3b01099f03e297127919dd5e3b63a761a9c826110c5610835565b6040516110d39291906127b0565b60405180910390a15b50905090565b60006106ce610e5b565b6000811161110f5760405160e560020a62461bcd02815260040161050490612734565b600160a060020a038216151561113a5760405160e560020a62461bcd028152600401610504906126d4565b60075415806111505750600061114e61099b565b115b15156111715760405160e560020a62461bcd02815260040161050490612764565b6000806007541161119557600b5461119090839063ffffffff61146116565b6111b3565b6111b36111a061099b565b6007546107b2908563ffffffff61146116565b9050600081116111d85760405160e560020a62461bcd02815260040161050490612704565b6111e06106e0565b50505050600160a060020a0385166000908152600c60205260409020805490925061120c9150836114a2565b815542600282015561121c611c23565b50604080518082018252838152426020808301918252600160a060020a0388166000908152600d8252938420805460018181018355918652919094208351600290920201908155905192019190915560075461127e908463ffffffff6114a216565b6007556001546040805160e160020a637e062a350281529051600160a060020a039092169163fc0c546a91600480820192602092909190829003018186803b1580156112c957600080fd5b505afa1580156112dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113019190810190611db3565b6001546040517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a03928316926323b872dd92611350928b9290911690899060040161261a565b602060405180830381600087803b15801561136a57600080fd5b505af115801561137e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113a29190810190611d95565b15156113c35760405160e560020a62461bcd02815260040161050490612724565b84600160a060020a03167fc65e53b88159e7d2c0fc12a0600072e28ae53ff73b4c1715369c30f160935142856113f8886107ee565b6040516114069291906127be565b60405180910390a2505050505050565b600061145883836040805190810160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ad0565b90505b92915050565b60008215156114725750600061145b565b82820282848281151561148157fe5b04146114585760405160e560020a62461bcd02815260040161050490612744565b6000828201838110156114585760405160e560020a62461bcd028152600401610504906126c4565b600061145883836040805190810160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611b04565b60006115166106e0565b5050505050506000821115156115415760405160e560020a62461bcd028152600401610504906126e4565b8161154b336107ee565b101561156c5760405160e560020a62461bcd028152600401610504906126b4565b600061158c61157961099b565b6007546107b2908663ffffffff61146116565b9050600081116115b15760405160e560020a62461bcd02815260040161050490612684565b336000908152600c60209081526040808320600d9092528220909183815b60008211156116d7578354600090859060001981019081106115ed57fe5b90600052602060002090600202019050600061161682600101544261141690919063ffffffff16565b82549091506000908510611684578254611636908363ffffffff61146116565b9050611643848284611b42565b9350611655868263ffffffff6114a216565b835490965061166b90869063ffffffff61141616565b875490955061167e886000198301611c3a565b506116cf565b611694858363ffffffff61146116565b90506116a1848284611b42565b93506116b3868263ffffffff6114a216565b83549096506116c8908663ffffffff61141616565b8355600094505b5050506115cf565b60018501546116ec908463ffffffff61141616565b60018601558454611703908763ffffffff61141616565b8555600854611718908463ffffffff61141616565b60085560075461172e908763ffffffff61141616565b6007556001546040517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a039091169063a9059cbb9061177c9033908c906004016125ff565b602060405180830381600087803b15801561179657600080fd5b505af11580156117aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117ce9190810190611d95565b15156117ef5760405160e560020a62461bcd02815260040161050490612784565b6002546040517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a039091169063a9059cbb9061183a90339085906004016125ff565b602060405180830381600087803b15801561185457600080fd5b505af1158015611868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061188c9190810190611d95565b15156118ad5760405160e560020a62461bcd028152600401610504906126a4565b337faf01bfc8475df280aca00b578c4a948e6d95700f0db8c13365240f7f973c8754896118d9836107ee565b6040516118e79291906127be565b60405180910390a233600160a060020a03167f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e4308260405161192891906127a2565b60405180910390a260075415806119465750600061194461099b565b115b15156119675760405160e560020a62461bcd02815260040161050490612714565b979650505050505050565b3390565b600160a060020a03811615156119a15760405160e560020a62461bcd02815260040161050490612694565b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600080600e83815481101515611a1b57fe5b9060005260206000209060050201905080600001548160010154101515611a46576000915050610830565b60038101546000904210611a7b5760018201548254611a6a9163ffffffff61141616565b600383015460028401559050611aab565b611aa282600401546107b2846000015461070f86600201544261141690919063ffffffff16565b42600284015590505b6001820154611ac0908263ffffffff6114a216565b6001909201919091559050919050565b60008184841115611af75760405160e560020a62461bcd0281526004016105049190612663565b50508183035b9392505050565b600081818411611b2a5760405160e560020a62461bcd0281526004016105049190612663565b5060008385811515611b3857fe5b0495945050505050565b600080611b576008546107b28661070f610ea3565b6005549091508310611b7b57611b73858263ffffffff6114a216565b915050611afd565b60006002600a0a90506000611bbf826107b28561070f611bb06005546107b28c61070f6004548c61141690919063ffffffff16565b6004549063ffffffff6114a216565b9050611967878263ffffffff6114a216565b60a06040519081016040528060008152602001600081526020016000815260200160008152602001600081525090565b6060604051908101604052806000815260200160008152602001600081525090565b604080518082019091526000808252602082015290565b8154818355818111156104d6576000838152602090206104d6916106d19160029182028101918502015b80821115611c7e5760008082556001820155600201611c64565b5090565b600061145882356128aa565b600061145882516128b5565b600080601f83018413611cac57600080fd5b50813567ffffffffffffffff811115611cc457600080fd5b602083019150836001820283011115611cdc57600080fd5b9250929050565b600061145882516128c6565b600061145882356106d1565b600061145882516106d1565b600060208284031215611d1957600080fd5b6000611d258484611c82565b949350505050565b60008060008060608587031215611d4357600080fd5b6000611d4f8787611c82565b9450506020611d6087828801611cef565b935050604085013567ffffffffffffffff811115611d7d57600080fd5b611d8987828801611c9a565b95989497509550505050565b600060208284031215611da757600080fd5b6000611d258484611c8e565b600060208284031215611dc557600080fd5b6000611d258484611ce3565b600060208284031215611de357600080fd5b6000611d258484611cef565b600060208284031215611e0157600080fd5b6000611d258484611cfb565b600080600060408486031215611e2257600080fd5b6000611e2e8686611cef565b935050602084013567ffffffffffffffff811115611e4b57600080fd5b611e5786828701611c9a565b92509250509250925092565b60008060408385031215611e7657600080fd5b6000611e828585611cef565b9250506020611e9385828601611cef565b9150509250929050565b611ea6816128d1565b82525050565b611ea6816128aa565b6000611ec0826128a6565b808452602084019350611ed2836128a0565b60005b82811015611f0257611ee8868351612569565b611ef1826128a0565b604096909601959150600101611ed5565b5093949350505050565b611ea6816128b5565b611ea6816128c6565b6000611f29826128a6565b808452611f3d8160208601602086016128dc565b611f4681612908565b9093016020019392505050565b602d81527f546f6b656e4765797365723a207472616e7366657220696e746f206c6f636b6560208201527f6420706f6f6c206661696c656400000000000000000000000000000000000000604082015260600190565b603081527f546f6b656e4765797365723a20556e61626c6520746f20756e7374616b65206160208201527f6d6f756e74207468697320736d616c6c00000000000000000000000000000000604082015260600190565b602681527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160208201527f6464726573730000000000000000000000000000000000000000000000000000604082015260600190565b603181527f546f6b656e4765797365723a207472616e73666572206f7574206f6620756e6c60208201527f6f636b656420706f6f6c206661696c6564000000000000000000000000000000604082015260600190565b603d81527f546f6b656e4765797365723a20756e7374616b6520616d6f756e74206973206760208201527f726561746572207468616e20746f74616c2075736572207374616b6573000000604082015260600190565b601b81527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000602082015260400190565b602881527f546f6b656e4765797365723a2062656e6566696369617279206973207a65726f60208201527f2061646472657373000000000000000000000000000000000000000000000000604082015260600190565b602381527f546f6b656e4765797365723a20756e7374616b6520616d6f756e74206973207a60208201527f65726f0000000000000000000000000000000000000000000000000000000000604082015260600190565b602f81527f546f6b656e4765797365723a207472616e73666572206f7574206f66206c6f6360208201527f6b656420706f6f6c206661696c65640000000000000000000000000000000000604082015260600190565b602681527f546f6b656e4765797365723a205374616b6520616d6f756e7420697320746f6f60208201527f20736d616c6c0000000000000000000000000000000000000000000000000000604082015260600190565b604c81527f546f6b656e4765797365723a204572726f7220756e7374616b696e672e20537460208201527f616b696e67207368617265732065786973742c20627574206e6f207374616b6960408201527f6e6720746f6b656e7320646f0000000000000000000000000000000000000000606082015260800190565b602e81527f546f6b656e4765797365723a207472616e7366657220696e746f207374616b6960208201527f6e6720706f6f6c206661696c6564000000000000000000000000000000000000604082015260600190565b602181527f546f6b656e4765797365723a207374616b6520616d6f756e74206973207a657260208201527f6f00000000000000000000000000000000000000000000000000000000000000604082015260600190565b602181527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60208201527f7700000000000000000000000000000000000000000000000000000000000000604082015260600190565b60208082527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65729082015260400190565b604a81527f546f6b656e4765797365723a20496e76616c69642073746174652e205374616b60208201527f696e67207368617265732065786973742c20627574206e6f207374616b696e6760408201527f20746f6b656e7320646f00000000000000000000000000000000000000000000606082015260800190565b602d81527f546f6b656e4765797365723a2072656163686564206d6178696d756d20756e6c60208201527f6f636b207363686564756c657300000000000000000000000000000000000000604082015260600190565b6000815260200190565b603081527f546f6b656e4765797365723a207472616e73666572206f7574206f662073746160208201527f6b696e6720706f6f6c206661696c656400000000000000000000000000000000604082015260600190565b8051604083019061257a84826125c0565b50602082015161051860208501826125c0565b8051606083019061259e84826125c0565b5060208201516125b160208501826125c0565b50604082015161051860408501825b611ea6816106d1565b6020810161145b8284611eac565b606081016125e58286611e9d565b6125f26020830185611eac565b611d2560408301846125c0565b6040810161260d8285611e9d565b611afd60208301846125c0565b606081016125e58286611eac565b6040810161260d8285611eac565b602080825281016114588184611eb5565b6020810161145b8284611f0c565b6020810161145b8284611f15565b602080825281016114588184611f1e565b6020808252810161082d81611f53565b6020808252810161082d81611fa9565b6020808252810161082d81611fff565b6020808252810161082d81612055565b6020808252810161082d816120ab565b6020808252810161082d81612101565b6020808252810161082d81612131565b6020808252810161082d81612187565b6020808252810161082d816121dd565b6020808252810161082d81612233565b6020808252810161082d81612289565b6020808252810161082d81612305565b6020808252810161082d8161235b565b6020808252810161082d816123b1565b6020808252810161082d81612407565b6020808252810161082d81612437565b6020808252810161082d816124b3565b6020808252810161082d81612513565b6060810161145b828461258d565b6020810161145b82846125c0565b6040810161260d82856125c0565b606081016127cc82856125c0565b6127d960208301846125c0565b8181036040830152611d2581612509565b606081016127f882866125c0565b6125f260208301856125c0565b60a0810161281382886125c0565b61282060208301876125c0565b61282d60408301866125c0565b61283a60608301856125c0565b61284760808301846125c0565b9695505050505050565b60c0810161285f82896125c0565b61286c60208301886125c0565b61287960408301876125c0565b61288660608301866125c0565b61289360808301856125c0565b61196760a08301846125c0565b60200190565b5190565b600061082d826128ba565b151590565b600160a060020a031690565b600061082d826128aa565b600061082d826128c6565b60005b838110156128f75781810151838201526020016128df565b838111156105185750506000910152565b601f01601f19169056fea265627a7a72305820e5e09647cd5a4f3a9e60c8ec00c88e72442311e7bf96b984c4a36800ae1d3d066c6578706572696d656e74616cf50037608060405234801561001057600080fd5b506040516020806107f1833981018060405261002f91908101906100c4565b6100406401000000006100ad810204565b60008054600160a060020a031916600160a060020a03928316178082556040519216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a360018054600160a060020a031916600160a060020a0392909216919091179055610112565b3390565b60006100bd8251610107565b9392505050565b6000602082840312156100d657600080fd5b60006100e284846100b1565b949350505050565b60006100f5826100fb565b92915050565b600160a060020a031690565b60006100f5826100ea565b6106d0806101216000396000f3fe6080604052600436106100825763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663715018a681146100875780638da5cb5b1461009e5780638f32d59b146100c9578063a9059cbb146100eb578063b69ef8a81461010b578063f2fde38b1461012d578063fc0c546a1461014d575b600080fd5b34801561009357600080fd5b5061009c61016f565b005b3480156100aa57600080fd5b506100b36101f8565b6040516100c091906105f2565b60405180910390f35b3480156100d557600080fd5b506100de610207565b6040516100c09190610622565b3480156100f757600080fd5b506100de6101063660046104cc565b61022b565b34801561011757600080fd5b506101206102fc565b6040516100c0919061065e565b34801561013957600080fd5b5061009c6101483660046104a6565b61039b565b34801561015957600080fd5b506101626103d0565b6040516100c09190610630565b610177610207565b15156101a15760405160e560020a62461bcd0281526004016101989061064e565b60405180910390fd5b60008054604051600160a060020a03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600054600160a060020a031690565b60008054600160a060020a031661021c6103df565b600160a060020a031614905090565b6000610235610207565b15156102565760405160e560020a62461bcd0281526004016101989061064e565b6001546040517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a039091169063a9059cbb906102a19086908690600401610600565b602060405180830381600087803b1580156102bb57600080fd5b505af11580156102cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506102f39190810190610506565b90505b92915050565b6001546040517f70a08231000000000000000000000000000000000000000000000000000000008152600091600160a060020a0316906370a08231906103469030906004016105f2565b60206040518083038186803b15801561035e57600080fd5b505afa158015610372573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506103969190810190610524565b905090565b6103a3610207565b15156103c45760405160e560020a62461bcd0281526004016101989061064e565b6103cd816103e3565b50565b600154600160a060020a031681565b3390565b600160a060020a038116151561040e5760405160e560020a62461bcd0281526004016101989061063e565b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60006102f3823561066c565b60006102f38251610677565b60006102f38235610688565b60006102f38251610688565b6000602082840312156104b857600080fd5b60006104c48484610476565b949350505050565b600080604083850312156104df57600080fd5b60006104eb8585610476565b92505060206104fc8582860161048e565b9150509250929050565b60006020828403121561051857600080fd5b60006104c48484610482565b60006020828403121561053657600080fd5b60006104c4848461049a565b61054b8161066c565b82525050565b61054b81610677565b61054b8161068b565b602681527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160208201527f6464726573730000000000000000000000000000000000000000000000000000604082015260600190565b60208082527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65729082015260400190565b61054b81610688565b602081016102f68284610542565b6040810161060e8285610542565b61061b60208301846105e9565b9392505050565b602081016102f68284610551565b602081016102f6828461055a565b602080825281016102f681610563565b602080825281016102f6816105b9565b602081016102f682846105e9565b60006102f68261067c565b151590565b600160a060020a031690565b90565b60006102f68261066c56fea265627a7a72305820f48ef2d2f3e63341feaf2906c447e793081c388e766c6ed91cb8e0ad32e90ea46c6578706572696d656e74616cf500370000000000000000000000008cb6fdf3d57a8cc0a251bacf1a941dde75466673000000000000000000000000a9a8377287ea9c6b8b4249dd502e75d34148fc5b000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000210000000000000000000000000000000000000000000000000000000000093a8000000000000000000000000000000000000000000000000000000000000f4240
Deployed Bytecode
0x6080604052600436106101665763ffffffff60e060020a6000350416630e89439b811461016b5780630ef963561461018d5780631dc27fde146101ad57806322c12b84146101d85780632f58aba2146101fa57806338b45fde1461020f578063494347e7146102245780634b341aed1461024b578063568914121461026b5780635c94bcb2146102805780637033e4a6146102b157806370c6a17e146102d3578063715018a6146102e85780637c6aa6f4146102fd578063817b1cd21461031257806381c39bec14610327578063842e29811461033c57806386805dd11461036957806389158d8e146103895780638da5cb5b146103a95780638f32d59b146103cb57806399044f7c146103e05780639f9106d11461040d578063a779d08014610422578063c7ae200714610437578063c8fd6ed01461044c578063dc24ffee1461046c578063f2fde38b14610481578063f968f493146104a1578063fc0c546a146104b6575b600080fd5b34801561017757600080fd5b5061018b610186366004611e0d565b6104cb565b005b34801561019957600080fd5b5061018b6101a8366004611d2d565b6104db565b3480156101b957600080fd5b506101c261051e565b6040516101cf91906127a2565b60405180910390f35b3480156101e457600080fd5b506101ed610523565b6040516101cf9190612655565b34801561020657600080fd5b506101c26106d4565b34801561021b57600080fd5b506101c26106da565b34801561023057600080fd5b506102396106e0565b6040516101cf96959493929190612851565b34801561025757600080fd5b506101c2610266366004611d07565b6107ee565b34801561027757600080fd5b506101c2610835565b34801561028c57600080fd5b506102a061029b366004611dd1565b6108cb565b6040516101cf959493929190612805565b3480156102bd57600080fd5b506102c661090a565b6040516101cf9190612647565b3480156102df57600080fd5b506101c261090f565b3480156102f457600080fd5b5061018b610915565b34801561030957600080fd5b506101c2610995565b34801561031e57600080fd5b506101c261099b565b34801561033357600080fd5b506101c26109f9565b34801561034857600080fd5b5061035c610357366004611d07565b6109ff565b6040516101cf9190612636565b34801561037557600080fd5b506101c2610384366004611dd1565b610a7e565b34801561039557600080fd5b5061018b6103a4366004611e63565b610a89565b3480156103b557600080fd5b506103be610dd5565b6040516101cf91906125c9565b3480156103d757600080fd5b506102c6610de4565b3480156103ec57600080fd5b506104006103fb366004611d07565b610e08565b6040516101cf9190612794565b34801561041957600080fd5b506101ed610e5b565b34801561042e57600080fd5b506101c2610ea3565b34801561044357600080fd5b506101c2610f01565b34801561045857600080fd5b5061018b610467366004611e0d565b610f07565b34801561047857600080fd5b506101c2610f10565b34801561048d57600080fd5b5061018b61049c366004611d07565b610f16565b3480156104ad57600080fd5b506101c2610f4b565b3480156104c257600080fd5b506103be6110e2565b6104d63333856110ec565b505050565b6104e3610de4565b151561050d5760405160e560020a62461bcd02815260040161050490612754565b60405180910390fd5b6105183385856110ec565b50505050565b600281565b6003546040805160e160020a637e062a350281529051600092600160a060020a03169163fc0c546a916004808301926020929190829003018186803b15801561056b57600080fd5b505afa15801561057f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506105a39190810190611db3565b600160a060020a0316600260009054906101000a9004600160a060020a0316600160a060020a031663fc0c546a6040518163ffffffff1660e060020a02815260040160206040518083038186803b1580156105fd57600080fd5b505afa158015610611573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106359190810190611db3565b600160a060020a03161461064557fe5b600260009054906101000a9004600160a060020a0316600160a060020a031663fc0c546a6040518163ffffffff1660e060020a02815260040160206040518083038186803b15801561069657600080fd5b505afa1580156106aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106ce9190810190611db3565b90505b90565b60095490565b60045481565b6000806000806000806106f1610f4b565b50600061071b60075461070f6009544261141690919063ffffffff16565b9063ffffffff61146116565b600854909150610731908263ffffffff6114a216565b600855426009819055336000908152600c602052604081208054600282015491936107669261070f919063ffffffff61141616565b600183015490915061077e908263ffffffff6114a216565b6001830155426002830155600854600090811061079c5760006107be565b6107be6008546107b2856001015461070f610ea3565b9063ffffffff6114ca16565b90506107c8610835565b6107d0610ea3565b600190940154600854919c949b509950975095504294509092505050565b6000806007541161080057600061082d565b600754600160a060020a0383166000908152600c602052604090205461082d91906107b29061070f61099b565b90505b919050565b600354604080517fb69ef8a80000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163b69ef8a8916004808301926020929190829003018186803b15801561089357600080fd5b505afa1580156108a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106ce9190810190611def565b600e8054829081106108d957fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401549294509092909185565b600090565b60075481565b61091d610de4565b151561093e5760405160e560020a62461bcd02815260040161050490612754565b60008054604051600160a060020a03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b60055481565b600154604080517fb69ef8a80000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163b69ef8a8916004808301926020929190829003018186803b15801561089357600080fd5b60065481565b600160a060020a0381166000908152600d602090815260408083208054825181850281018501909352808352606094859484015b82821015610a72576000848152602090819020604080518082019091526002850290910180548252600190810154828401529083529092019101610a33565b50929695505050505050565b600061082d8261150c565b610a91610de4565b1515610ab25760405160e560020a62461bcd02815260040161050490612754565b600a54600e5410610ad85760405160e560020a62461bcd02815260040161050490612774565b610ae06106e0565b5050505050506000610af0610835565b90506000808211610b1457600b54610b0f90859063ffffffff61146116565b610b2d565b610b2d826107b28660065461146190919063ffffffff16565b9050610b37611bd1565b8181524260408201819052610b52908563ffffffff6114a216565b6060820190815260808201858152600e805460018101825560009190915283517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd60059092029182015560208401517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe82015560408401517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3ff82015591517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c400830155517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c40190910155600654610c4790836114a2565b6006556003546040805160e160020a637e062a350281529051600160a060020a039092169163fc0c546a91600480820192602092909190829003018186803b158015610c9257600080fd5b505afa158015610ca6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610cca9190810190611db3565b6003546040517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a03928316926323b872dd92610d19923392909116908a906004016125d7565b602060405180830381600087803b158015610d3357600080fd5b505af1158015610d47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d6b9190810190611d95565b1515610d8c5760405160e560020a62461bcd02815260040161050490612674565b7ff346961af4c52f314df1b45964746280fe409abb959d4a2458d58f79408b1fe88585610db7610835565b604051610dc6939291906127ea565b60405180910390a15050505050565b600054600160a060020a031690565b60008054600160a060020a0316610df9611972565b600160a060020a031614905090565b610e10611c01565b610e18611c01565b5050600160a060020a03166000908152600c6020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915290565b6001546040805160e160020a637e062a350281529051600092600160a060020a03169163fc0c546a916004808301926020929190829003018186803b15801561069657600080fd5b600254604080517fb69ef8a80000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163b69ef8a8916004808301926020929190829003018186803b15801561089357600080fd5b600e5490565b6105188361150c565b60085490565b610f1e610de4565b1515610f3f5760405160e560020a62461bcd02815260040161050490612754565b610f4881611976565b50565b60008080610f57610835565b905060065460001415610f6c57809150610fd0565b6000805b600e54811015610f9d57610f93610f8682611a09565b839063ffffffff6114a216565b9150600101610f70565b50600654610fb5906107b2838563ffffffff61146116565b600654909350610fcb908263ffffffff61141616565b600655505b60008211156110dc576003546002546040517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a039283169263a9059cbb92611028929116908690600401612628565b602060405180830381600087803b15801561104257600080fd5b505af1158015611056573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061107a9190810190611d95565b151561109b5760405160e560020a62461bcd028152600401610504906126f4565b7f2e444eb379b177e88ce0649c6110a3b01099f03e297127919dd5e3b63a761a9c826110c5610835565b6040516110d39291906127b0565b60405180910390a15b50905090565b60006106ce610e5b565b6000811161110f5760405160e560020a62461bcd02815260040161050490612734565b600160a060020a038216151561113a5760405160e560020a62461bcd028152600401610504906126d4565b60075415806111505750600061114e61099b565b115b15156111715760405160e560020a62461bcd02815260040161050490612764565b6000806007541161119557600b5461119090839063ffffffff61146116565b6111b3565b6111b36111a061099b565b6007546107b2908563ffffffff61146116565b9050600081116111d85760405160e560020a62461bcd02815260040161050490612704565b6111e06106e0565b50505050600160a060020a0385166000908152600c60205260409020805490925061120c9150836114a2565b815542600282015561121c611c23565b50604080518082018252838152426020808301918252600160a060020a0388166000908152600d8252938420805460018181018355918652919094208351600290920201908155905192019190915560075461127e908463ffffffff6114a216565b6007556001546040805160e160020a637e062a350281529051600160a060020a039092169163fc0c546a91600480820192602092909190829003018186803b1580156112c957600080fd5b505afa1580156112dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113019190810190611db3565b6001546040517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a03928316926323b872dd92611350928b9290911690899060040161261a565b602060405180830381600087803b15801561136a57600080fd5b505af115801561137e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113a29190810190611d95565b15156113c35760405160e560020a62461bcd02815260040161050490612724565b84600160a060020a03167fc65e53b88159e7d2c0fc12a0600072e28ae53ff73b4c1715369c30f160935142856113f8886107ee565b6040516114069291906127be565b60405180910390a2505050505050565b600061145883836040805190810160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ad0565b90505b92915050565b60008215156114725750600061145b565b82820282848281151561148157fe5b04146114585760405160e560020a62461bcd02815260040161050490612744565b6000828201838110156114585760405160e560020a62461bcd028152600401610504906126c4565b600061145883836040805190810160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611b04565b60006115166106e0565b5050505050506000821115156115415760405160e560020a62461bcd028152600401610504906126e4565b8161154b336107ee565b101561156c5760405160e560020a62461bcd028152600401610504906126b4565b600061158c61157961099b565b6007546107b2908663ffffffff61146116565b9050600081116115b15760405160e560020a62461bcd02815260040161050490612684565b336000908152600c60209081526040808320600d9092528220909183815b60008211156116d7578354600090859060001981019081106115ed57fe5b90600052602060002090600202019050600061161682600101544261141690919063ffffffff16565b82549091506000908510611684578254611636908363ffffffff61146116565b9050611643848284611b42565b9350611655868263ffffffff6114a216565b835490965061166b90869063ffffffff61141616565b875490955061167e886000198301611c3a565b506116cf565b611694858363ffffffff61146116565b90506116a1848284611b42565b93506116b3868263ffffffff6114a216565b83549096506116c8908663ffffffff61141616565b8355600094505b5050506115cf565b60018501546116ec908463ffffffff61141616565b60018601558454611703908763ffffffff61141616565b8555600854611718908463ffffffff61141616565b60085560075461172e908763ffffffff61141616565b6007556001546040517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a039091169063a9059cbb9061177c9033908c906004016125ff565b602060405180830381600087803b15801561179657600080fd5b505af11580156117aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117ce9190810190611d95565b15156117ef5760405160e560020a62461bcd02815260040161050490612784565b6002546040517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a039091169063a9059cbb9061183a90339085906004016125ff565b602060405180830381600087803b15801561185457600080fd5b505af1158015611868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061188c9190810190611d95565b15156118ad5760405160e560020a62461bcd028152600401610504906126a4565b337faf01bfc8475df280aca00b578c4a948e6d95700f0db8c13365240f7f973c8754896118d9836107ee565b6040516118e79291906127be565b60405180910390a233600160a060020a03167f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e4308260405161192891906127a2565b60405180910390a260075415806119465750600061194461099b565b115b15156119675760405160e560020a62461bcd02815260040161050490612714565b979650505050505050565b3390565b600160a060020a03811615156119a15760405160e560020a62461bcd02815260040161050490612694565b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600080600e83815481101515611a1b57fe5b9060005260206000209060050201905080600001548160010154101515611a46576000915050610830565b60038101546000904210611a7b5760018201548254611a6a9163ffffffff61141616565b600383015460028401559050611aab565b611aa282600401546107b2846000015461070f86600201544261141690919063ffffffff16565b42600284015590505b6001820154611ac0908263ffffffff6114a216565b6001909201919091559050919050565b60008184841115611af75760405160e560020a62461bcd0281526004016105049190612663565b50508183035b9392505050565b600081818411611b2a5760405160e560020a62461bcd0281526004016105049190612663565b5060008385811515611b3857fe5b0495945050505050565b600080611b576008546107b28661070f610ea3565b6005549091508310611b7b57611b73858263ffffffff6114a216565b915050611afd565b60006002600a0a90506000611bbf826107b28561070f611bb06005546107b28c61070f6004548c61141690919063ffffffff16565b6004549063ffffffff6114a216565b9050611967878263ffffffff6114a216565b60a06040519081016040528060008152602001600081526020016000815260200160008152602001600081525090565b6060604051908101604052806000815260200160008152602001600081525090565b604080518082019091526000808252602082015290565b8154818355818111156104d6576000838152602090206104d6916106d19160029182028101918502015b80821115611c7e5760008082556001820155600201611c64565b5090565b600061145882356128aa565b600061145882516128b5565b600080601f83018413611cac57600080fd5b50813567ffffffffffffffff811115611cc457600080fd5b602083019150836001820283011115611cdc57600080fd5b9250929050565b600061145882516128c6565b600061145882356106d1565b600061145882516106d1565b600060208284031215611d1957600080fd5b6000611d258484611c82565b949350505050565b60008060008060608587031215611d4357600080fd5b6000611d4f8787611c82565b9450506020611d6087828801611cef565b935050604085013567ffffffffffffffff811115611d7d57600080fd5b611d8987828801611c9a565b95989497509550505050565b600060208284031215611da757600080fd5b6000611d258484611c8e565b600060208284031215611dc557600080fd5b6000611d258484611ce3565b600060208284031215611de357600080fd5b6000611d258484611cef565b600060208284031215611e0157600080fd5b6000611d258484611cfb565b600080600060408486031215611e2257600080fd5b6000611e2e8686611cef565b935050602084013567ffffffffffffffff811115611e4b57600080fd5b611e5786828701611c9a565b92509250509250925092565b60008060408385031215611e7657600080fd5b6000611e828585611cef565b9250506020611e9385828601611cef565b9150509250929050565b611ea6816128d1565b82525050565b611ea6816128aa565b6000611ec0826128a6565b808452602084019350611ed2836128a0565b60005b82811015611f0257611ee8868351612569565b611ef1826128a0565b604096909601959150600101611ed5565b5093949350505050565b611ea6816128b5565b611ea6816128c6565b6000611f29826128a6565b808452611f3d8160208601602086016128dc565b611f4681612908565b9093016020019392505050565b602d81527f546f6b656e4765797365723a207472616e7366657220696e746f206c6f636b6560208201527f6420706f6f6c206661696c656400000000000000000000000000000000000000604082015260600190565b603081527f546f6b656e4765797365723a20556e61626c6520746f20756e7374616b65206160208201527f6d6f756e74207468697320736d616c6c00000000000000000000000000000000604082015260600190565b602681527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160208201527f6464726573730000000000000000000000000000000000000000000000000000604082015260600190565b603181527f546f6b656e4765797365723a207472616e73666572206f7574206f6620756e6c60208201527f6f636b656420706f6f6c206661696c6564000000000000000000000000000000604082015260600190565b603d81527f546f6b656e4765797365723a20756e7374616b6520616d6f756e74206973206760208201527f726561746572207468616e20746f74616c2075736572207374616b6573000000604082015260600190565b601b81527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000602082015260400190565b602881527f546f6b656e4765797365723a2062656e6566696369617279206973207a65726f60208201527f2061646472657373000000000000000000000000000000000000000000000000604082015260600190565b602381527f546f6b656e4765797365723a20756e7374616b6520616d6f756e74206973207a60208201527f65726f0000000000000000000000000000000000000000000000000000000000604082015260600190565b602f81527f546f6b656e4765797365723a207472616e73666572206f7574206f66206c6f6360208201527f6b656420706f6f6c206661696c65640000000000000000000000000000000000604082015260600190565b602681527f546f6b656e4765797365723a205374616b6520616d6f756e7420697320746f6f60208201527f20736d616c6c0000000000000000000000000000000000000000000000000000604082015260600190565b604c81527f546f6b656e4765797365723a204572726f7220756e7374616b696e672e20537460208201527f616b696e67207368617265732065786973742c20627574206e6f207374616b6960408201527f6e6720746f6b656e7320646f0000000000000000000000000000000000000000606082015260800190565b602e81527f546f6b656e4765797365723a207472616e7366657220696e746f207374616b6960208201527f6e6720706f6f6c206661696c6564000000000000000000000000000000000000604082015260600190565b602181527f546f6b656e4765797365723a207374616b6520616d6f756e74206973207a657260208201527f6f00000000000000000000000000000000000000000000000000000000000000604082015260600190565b602181527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60208201527f7700000000000000000000000000000000000000000000000000000000000000604082015260600190565b60208082527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65729082015260400190565b604a81527f546f6b656e4765797365723a20496e76616c69642073746174652e205374616b60208201527f696e67207368617265732065786973742c20627574206e6f207374616b696e6760408201527f20746f6b656e7320646f00000000000000000000000000000000000000000000606082015260800190565b602d81527f546f6b656e4765797365723a2072656163686564206d6178696d756d20756e6c60208201527f6f636b207363686564756c657300000000000000000000000000000000000000604082015260600190565b6000815260200190565b603081527f546f6b656e4765797365723a207472616e73666572206f7574206f662073746160208201527f6b696e6720706f6f6c206661696c656400000000000000000000000000000000604082015260600190565b8051604083019061257a84826125c0565b50602082015161051860208501826125c0565b8051606083019061259e84826125c0565b5060208201516125b160208501826125c0565b50604082015161051860408501825b611ea6816106d1565b6020810161145b8284611eac565b606081016125e58286611e9d565b6125f26020830185611eac565b611d2560408301846125c0565b6040810161260d8285611e9d565b611afd60208301846125c0565b606081016125e58286611eac565b6040810161260d8285611eac565b602080825281016114588184611eb5565b6020810161145b8284611f0c565b6020810161145b8284611f15565b602080825281016114588184611f1e565b6020808252810161082d81611f53565b6020808252810161082d81611fa9565b6020808252810161082d81611fff565b6020808252810161082d81612055565b6020808252810161082d816120ab565b6020808252810161082d81612101565b6020808252810161082d81612131565b6020808252810161082d81612187565b6020808252810161082d816121dd565b6020808252810161082d81612233565b6020808252810161082d81612289565b6020808252810161082d81612305565b6020808252810161082d8161235b565b6020808252810161082d816123b1565b6020808252810161082d81612407565b6020808252810161082d81612437565b6020808252810161082d816124b3565b6020808252810161082d81612513565b6060810161145b828461258d565b6020810161145b82846125c0565b6040810161260d82856125c0565b606081016127cc82856125c0565b6127d960208301846125c0565b8181036040830152611d2581612509565b606081016127f882866125c0565b6125f260208301856125c0565b60a0810161281382886125c0565b61282060208301876125c0565b61282d60408301866125c0565b61283a60608301856125c0565b61284760808301846125c0565b9695505050505050565b60c0810161285f82896125c0565b61286c60208301886125c0565b61287960408301876125c0565b61288660608301866125c0565b61289360808301856125c0565b61196760a08301846125c0565b60200190565b5190565b600061082d826128ba565b151590565b600160a060020a031690565b600061082d826128aa565b600061082d826128c6565b60005b838110156128f75781810151838201526020016128df565b838111156105185750506000910152565b601f01601f19169056fea265627a7a72305820e5e09647cd5a4f3a9e60c8ec00c88e72442311e7bf96b984c4a36800ae1d3d066c6578706572696d656e74616cf50037
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008cb6fdf3d57a8cc0a251bacf1a941dde75466673000000000000000000000000a9a8377287ea9c6b8b4249dd502e75d34148fc5b000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000210000000000000000000000000000000000000000000000000000000000093a8000000000000000000000000000000000000000000000000000000000000f4240
-----Decoded View---------------
Arg [0] : stakingToken (address): 0x8cB6FdF3D57A8Cc0A251bACf1A941dDe75466673
Arg [1] : distributionToken (address): 0xA9A8377287ea9C6B8b4249DD502E75D34148fC5B
Arg [2] : maxUnlockSchedules (uint256): 10
Arg [3] : startBonus_ (uint256): 33
Arg [4] : bonusPeriodSec_ (uint256): 604800
Arg [5] : initialSharesPerToken (uint256): 1000000
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000008cb6fdf3d57a8cc0a251bacf1a941dde75466673
Arg [1] : 000000000000000000000000a9a8377287ea9c6b8b4249dd502e75d34148fc5b
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000021
Arg [4] : 0000000000000000000000000000000000000000000000000000000000093a80
Arg [5] : 00000000000000000000000000000000000000000000000000000000000f4240
Deployed Bytecode Sourcemap
15353:21293:0:-;;;;;;;;;-1:-1:-1;;;15353:21293:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19779:121;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19779:121:0;;;;;;;;;;;20172:142;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20172:142:0;;;;;;;;;16023:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16023:42:0;;;;;;;;;;;;;;;;;;;;19432:171;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19432:171:0;;;;;;;;;;;;29219:121;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29219:121:0;;;;16072:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16072:29:0;;;;30758:1281;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30758:1281:0;;;;;;;;;;;;;;;;;29496:210;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;29496:210:0;;;;;;;;;32125:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32125:100:0;;;;17518:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17518:39:0;;;;;;;;;;;;;;;;;;;;;13429:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13429:87:0;;;;;;;;;;;;16241:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16241:37:0;;;;11790:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11790:140:0;;;;16108:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16108:33:0;;;;29814:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29814:101:0;;;;16198:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16198:36:0;;;;28467:165;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28467:165:0;;;;;;;;;;;;;;;;;22651:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22651:105:0;;;;;;;;;33058:1123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;33058:1123:0;;;;;;;;;10979:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10979:79:0;;;;;;;;;;;;11345:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11345:94:0;;;;28772:172;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28772:172:0;;;;;;;;;;;;;;;;;19247:102;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19247:102:0;;;;32313:104;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32313:104:0;;;;32487:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32487:109:0;;;;22377:98;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22377:98:0;;;;;;;;;29019:120;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29019:120:0;;;;12085:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;12085:109:0;;;;;;;;;34437:916;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34437:916:0;;;;30156:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30156:101:0;;;;19779:121;19851:41;19861:10;19873;19885:6;19851:9;:41::i;:::-;19779:121;;;:::o;20172:142::-;11191:9;:7;:9::i;:::-;11183:54;;;;;;-1:-1:-1;;;;;11183:54:0;;;;;;;;;;;;;;;;;20271:35;20281:10;20293:4;20299:6;20271:9;:35::i;:::-;20172:142;;;;:::o;16023:42::-;16064:1;16023:42;:::o;19432:171::-;19536:11;;:19;;;-1:-1:-1;;;;;19536:19:0;;;;19485:6;;-1:-1:-1;;;;;19536:11:0;;:17;;:19;;;;;;;;;;;;;;:11;:19;;;5:2:-1;;;;30:1;27;20:12;5:2;19536:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19536:19:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19536:19:0;;;;;;;;;-1:-1:-1;;;;;19511:44:0;:13;;;;;;;;;-1:-1:-1;;;;;19511:13:0;-1:-1:-1;;;;;19511:19:0;;:21;;;;;-1:-1:-1;;;19511:21:0;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19511:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19511:21:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19511:21:0;;;;;;;;;-1:-1:-1;;;;;19511:44:0;;19504:52;;;;19574:13;;;;;;;;;-1:-1:-1;;;;;19574:13:0;-1:-1:-1;;;;;19574:19:0;;:21;;;;;-1:-1:-1;;;19574:21:0;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19574:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19574:21:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19574:21:0;;;;;;;;;19567:28;;19432:171;;:::o;29219:121::-;29305:27;;29219:121;:::o;16072:29::-;;;;:::o;30758:1281::-;30812:7;30821;30830;30839;30848;30857;30879:14;:12;:14::i;:::-;;30936:30;30982:88;31051:18;;30982:50;31004:27;;30982:3;:21;;:50;;;;:::i;:::-;:68;:88;:68;:88;:::i;:::-;31109:25;;30936:134;;-1:-1:-1;31109:53:0;;30936:134;31109:53;:29;:53;:::i;:::-;31081:25;:81;31203:3;31173:27;:33;;;31287:10;-1:-1:-1;31275:23:0;;;:11;:23;;;;;31434:20;;31381:33;;;;31275:23;;31359:96;;:56;;31203:3;31359:56;:21;:56;:::i;:96::-;31508:26;;;;31309:146;;-1:-1:-1;31508:72:0;;31309:146;31508:72;:44;:72;:::i;:::-;31466:26;;;:114;31627:3;31591:33;;;:39;31671:25;;-1:-1:-1;;31671:29:0;-1:-1:-1;31670:142:0;;31811:1;31670:142;;;31717:78;31769:25;;31717:47;31737:6;:26;;;31717:15;:13;:15::i;:47::-;:51;:78;:51;:78;:::i;:::-;31643:169;;31847:13;:11;:13::i;:::-;31875:15;:13;:15::i;:::-;31905:26;;;;;31946:25;;31825:206;;;;-1:-1:-1;31905:26:0;-1:-1:-1;31946:25:0;-1:-1:-1;31986:16:0;-1:-1:-1;32017:3:0;;-1:-1:-1;30758:1281:0;;-1:-1:-1;;;30758:1281:0:o;29496:210::-;29555:7;29603:1;29582:18;;:22;:116;;29697:1;29582:116;;;29675:18;;-1:-1:-1;;;;;29638:17:0;;;;;;:11;:17;;;;;:31;29620:74;;29675:18;29620:50;;:13;:11;:13::i;:74::-;29575:123;;29496:210;;;;:::o;32125:100::-;32196:11;;:21;;;;;;;;32169:7;;-1:-1:-1;;;;;32196:11:0;;:19;;:21;;;;;;;;;;;;;;:11;:21;;;5:2:-1;;;;30:1;27;20:12;5:2;32196:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32196:21:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;32196:21:0;;;;;;;;17518:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17518:39:0;;;;;:::o;13429:87::-;13479:4;13429:87;:::o;16241:37::-;;;;:::o;11790:140::-;11191:9;:7;:9::i;:::-;11183:54;;;;;;-1:-1:-1;;;;;11183:54:0;;;;;;;;;11889:1;11873:6;;11852:40;;-1:-1:-1;;;;;11873:6:0;;;;11852:40;;11889:1;;11852:40;11920:1;11903:19;;-1:-1:-1;;11903:19:0;;;11790:140::o;16108:33::-;;;;:::o;29814:101::-;29885:12;;:22;;;;;;;;29858:7;;-1:-1:-1;;;;;29885:12:0;;:20;;:22;;;;;;;;;;;;;;:12;:22;;;5:2:-1;;;;30:1;27;20:12;16198:36:0;;;;:::o;28467:165::-;-1:-1:-1;;;;;28579:17:0;;;;;;:11;:17;;;;;;;;28551:45;;;;;;;;;;;;;;;;;28525:14;;;;28551:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28551:45:0;;28467:165;-1:-1:-1;;;;;;28467:165:0:o;22651:105::-;22705:7;22732:16;22741:6;22732:8;:16::i;33058:1123::-;11191:9;:7;:9::i;:::-;11183:54;;;;;;-1:-1:-1;;;;;11183:54:0;;;;;;;;;33178:19;;33153:15;:22;:44;33145:115;;;;-1:-1:-1;;;;;33145:115:0;;;;;;;;;33351:18;:16;:18::i;:::-;;;;;;;33382:20;33405:13;:11;:13::i;:::-;33382:36;;33429:26;33474:1;33459:12;:16;33458:131;;33566:22;;33555:34;;:6;;:34;:10;:34;:::i;:::-;33458:131;;;33492:47;33526:12;33492:29;33514:6;33492:17;;:21;;:29;;;;:::i;:47::-;33429:160;;33602:30;;:::i;:::-;33643:49;;;33737:3;33703:31;;;:37;;;33771:20;;33779:11;33771:20;:7;:20;:::i;:::-;33751:17;;;:40;;;33802:20;;;:34;;;33847:15;27:10:-1;;39:1;23:18;;45:23;;-1:-1;33847:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33910:17;;:41;;33932:18;33910:21;:41::i;:::-;33890:17;:61;33972:11;;:19;;;-1:-1:-1;;;;;33972:19:0;;;;-1:-1:-1;;;;;33972:11:0;;;;:17;;:19;;;;;;;;;;;;;;;:11;:19;;;5:2:-1;;;;30:1;27;20:12;5:2;33972:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33972:19:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;33972:19:0;;;;;;;;;34025:11;;33972:74;;;;;-1:-1:-1;;;;;33972:32:0;;;;;;:74;;34005:10;;34025:11;;;;34039:6;;33972:74;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33972:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33972:74:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;33972:74:0;;;;;;;;;33964:145;;;;;;-1:-1:-1;;;;;33964:145:0;;;;;;;;;34125:48;34138:6;34146:11;34159:13;:11;:13::i;:::-;34125:48;;;;;;;;;;;;;;;;;11248:1;;;33058:1123;;:::o;10979:79::-;11017:7;11044:6;-1:-1:-1;;;;;11044:6:0;10979:79;:::o;11345:94::-;11385:4;11425:6;;-1:-1:-1;;;;;11425:6:0;11409:12;:10;:12::i;:::-;-1:-1:-1;;;;;11409:22:0;;11402:29;;11345:94;:::o;28772:172::-;28830:17;;:::i;:::-;28860:28;;:::i;:::-;-1:-1:-1;;;;;;;28891:17:0;;;;;:11;:17;;;;;;;;;28860:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28772:172::o;19247:102::-;19321:12;;:20;;;-1:-1:-1;;;;;19321:20:0;;;;19295:6;;-1:-1:-1;;;;;19321:12:0;;:18;;:20;;;;;;;;;;;;;;:12;:20;;;5:2:-1;;;;30:1;27;20:12;32313:104:0;32386:13;;:23;;;;;;;;32359:7;;-1:-1:-1;;;;;32386:13:0;;:21;;:23;;;;;;;;;;;;;;:13;:23;;;5:2:-1;;;;30:1;27;20:12;32487:109:0;32566:15;:22;32487:109;:::o;22377:98::-;22451:16;22460:6;22451:8;:16::i;29019:120::-;29106:25;;29019:120;:::o;12085:109::-;11191:9;:7;:9::i;:::-;11183:54;;;;;;-1:-1:-1;;;;;11183:54:0;;;;;;;;;12158:28;12177:8;12158:18;:28::i;:::-;12085:109;:::o;34437:916::-;34477:7;;;34557:13;:11;:13::i;:::-;34534:36;;34587:17;;34608:1;34587:22;34583:464;;;34643:12;34626:29;;34583:464;;;34688:22;;34729:148;34753:15;:22;34749:26;;34729:148;;;34818:43;34837:23;34858:1;34837:20;:23::i;:::-;34818:14;;:43;:18;:43;:::i;:::-;34801:60;-1:-1:-1;34777:3:0;;34729:148;;;-1:-1:-1;34945:17:0;;34908:55;;:32;:14;34927:12;34908:32;:18;:32;:::i;:55::-;34998:17;;34891:72;;-1:-1:-1;34998:37:0;;35020:14;34998:37;:21;:37;:::i;:::-;34978:17;:57;-1:-1:-1;34583:464:0;35080:1;35063:14;:18;35059:253;;;35106:11;;35135:13;;35106:60;;;;;-1:-1:-1;;;;;35106:11:0;;;;:20;;:60;;35135:13;;;35151:14;;35106:60;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35106:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35106:60:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;35106:60:0;;;;;;;;;35098:137;;;;;;-1:-1:-1;;;;;35098:137:0;;;;;;;;;35255:45;35270:14;35286:13;:11;:13::i;:::-;35255:45;;;;;;;;;;;;;;;;35059:253;-1:-1:-1;35331:14:0;-1:-1:-1;34437:916:0;:::o;30156:101::-;30196:7;30231:17;:15;:17::i;20601:1507::-;20709:1;20700:10;;20692:56;;;;-1:-1:-1;;;;;20692:56:0;;;;;;;;;-1:-1:-1;;;;;20767:25:0;;;;20759:78;;;;-1:-1:-1;;;;;20759:78:0;;;;;;;;;20856:18;;:23;;:44;;;20899:1;20883:13;:11;:13::i;:::-;:17;20856:44;20848:148;;;;;;-1:-1:-1;;;;;20848:148:0;;;;;;;;;21009:27;21061:1;21040:18;;:22;21039:139;;21155:22;;21144:34;;:6;;:34;:10;:34;:::i;:::-;21039:139;;;21079:49;21114:13;:11;:13::i;:::-;21079:18;;:30;;21102:6;21079:30;:22;:30;:::i;:49::-;21009:169;-1:-1:-1;21219:1:0;21197:23;;21189:74;;;;-1:-1:-1;;;;;21189:74:0;;;;;;;;;21276:18;:16;:18::i;:::-;-1:-1:-1;;;;;;;;;21366:24:0;;21338:25;21366:24;;;:11;:24;;;;;21424:20;;21366:24;;-1:-1:-1;21424:45:0;;-1:-1:-1;21449:19:0;21424:24;:45::i;:::-;21401:68;;21516:3;21480:33;;;:39;21532:21;;:::i;:::-;-1:-1:-1;21556:31:0;;;;;;;;;;;21583:3;21556:31;;;;;;;-1:-1:-1;;;;;21598:24:0;;-1:-1:-1;21598:24:0;;;:11;:24;;;;;27:10:-1;;39:1;23:18;;;45:23;;21598:39:0;;;;;;;;;;;;;;;;;;;;;;;;;21704:18;;:43;;21562:19;21704:43;:22;:43;:::i;:::-;21683:18;:64;21886:12;;:20;;;-1:-1:-1;;;;;21886:20:0;;;;-1:-1:-1;;;;;21886:12:0;;;;:18;;:20;;;;;;;;;;;;;;;:12;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;21886:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21886:20:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;21886:20:0;;;;;;;;;21936:12;;21886:72;;;;;-1:-1:-1;;;;;21886:33:0;;;;;;:72;;21920:6;;21936:12;;;;21951:6;;21886:72;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21886:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21886:72:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;21886:72:0;;;;;;;;;21878:144;;;;;;-1:-1:-1;;;;;21878:144:0;;;;;;;;;22047:11;-1:-1:-1;;;;;22040:60:0;;22060:6;22068:27;22083:11;22068:14;:27::i;:::-;22040:60;;;;;;;;;;;;;;;;20601:1507;;;;;;:::o;1825:136::-;1883:7;1910:43;1914:1;1917;1910:43;;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1903:50;;1825:136;;;;;:::o;2741:471::-;2799:7;3044:6;;3040:47;;;-1:-1:-1;3074:1:0;3067:8;;3040:47;3111:5;;;3115:1;3111;:5;3135;;;;;;;;:10;3127:56;;;;-1:-1:-1;;;;;3127:56:0;;;;;;;;1369:181;1427:7;1459:5;;;1483:6;;;;1475:46;;;;-1:-1:-1;;;;;1475:46:0;;;;;;;;3680:132;3738:7;3765:39;3769:1;3772;3765:39;;;;;;;;;;;;;;;;;;:3;:39::i;23061:3367::-;23112:7;23132:18;:16;:18::i;:::-;;;;;;;23199:1;23190:6;:10;23182:58;;;;;;-1:-1:-1;;;;;23182:58:0;;;;;;;;;23289:6;23259:26;23274:10;23259:14;:26::i;:::-;:36;;23251:123;;;;-1:-1:-1;;;;;23251:123:0;;;;;;;;;23385:27;23415:49;23450:13;:11;:13::i;:::-;23415:18;;:30;;23438:6;23415:30;:22;:30;:::i;:49::-;23385:79;-1:-1:-1;23505:1:0;23483:23;;23475:84;;;;-1:-1:-1;;;;;23475:84:0;;;;;;;;;23643:10;23603:25;23631:23;;;:11;:23;;;;;;;;23697:11;:23;;;;;23631;;23876:19;23603:25;23941:1298;23967:1;23948:16;:20;23941:1298;;;24025:20;;23985:23;;24011:13;;-1:-1:-1;;24025:24:0;;;24011:39;;;;;;;;;;;;;;;;23985:65;;24065:20;24088:31;24096:9;:22;;;24088:3;:7;;:31;;;;:::i;:::-;24193:23;;24065:54;;-1:-1:-1;24134:36:0;;24193:43;-1:-1:-1;24189:1039:0;;24334:23;;:41;;24362:12;24334:41;:27;:41;:::i;:::-;24303:72;;24409:74;24426:12;24440:28;24470:12;24409:16;:74::i;:::-;24394:89;-1:-1:-1;24530:59:0;:25;24560:28;24530:59;:29;:59;:::i;:::-;24648:23;;24502:87;;-1:-1:-1;24627:45:0;;:16;;:45;:20;:45;:::i;:::-;24691:22;;24608:64;;-1:-1:-1;24691:22:0;:13;-1:-1:-1;;24691:22:0;;;:::i;:::-;;24189:1039;;;24835:34;:16;24856:12;24835:34;:20;:34;:::i;:::-;24804:65;;24903:74;24920:12;24934:28;24964:12;24903:16;:74::i;:::-;24888:89;-1:-1:-1;25024:59:0;:25;25054:28;25024:59;:29;:59;:::i;:::-;25128:23;;24996:87;;-1:-1:-1;25128:45:0;;25156:16;25128:45;:27;:45;:::i;:::-;25102:71;;:23;;-1:-1:-1;24189:1039:0;23941:1298;;;;;;25278:26;;;;:57;;25309:25;25278:57;:30;:57;:::i;:::-;25249:26;;;:86;25369:20;;:45;;25394:19;25369:45;:24;:45;:::i;:::-;25346:68;;25585:25;;:56;;25615:25;25585:56;:29;:56;:::i;:::-;25557:25;:84;25673:18;;:43;;25696:19;25673:43;:22;:43;:::i;:::-;25652:18;:64;25853:12;;:41;;;;;-1:-1:-1;;;;;25853:12:0;;;;:21;;:41;;25875:10;;25887:6;;25853:41;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25853:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25853:41:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;25853:41:0;;;;;;;;;25845:115;;;;;;-1:-1:-1;;;;;25845:115:0;;;;;;;;;25979:13;;:48;;;;;-1:-1:-1;;;;;25979:13:0;;;;:22;;:48;;26002:10;;26014:12;;25979:48;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25979:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25979:48:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;25979:48:0;;;;;;;;;25971:123;;;;;;-1:-1:-1;;;;;25971:123:0;;;;;;;;;26121:10;26112:60;26133:6;26141:26;26121:10;26141:14;:26::i;:::-;26112:60;;;;;;;;;;;;;;;;26202:10;-1:-1:-1;;;;;26188:39:0;;26214:12;26188:39;;;;;;;;;;;;;;;26248:18;;:23;;:44;;;26291:1;26275:13;:11;:13::i;:::-;:17;26248:44;26240:150;;;;;;-1:-1:-1;;;;;26240:150:0;;;;;;;;;26408:12;23061:3367;-1:-1:-1;;;;;;;23061:3367:0:o;9720:98::-;9800:10;9720:98;:::o;12300:229::-;-1:-1:-1;;;;;12374:22:0;;;;12366:73;;;;-1:-1:-1;;;;;12366:73:0;;;;;;;;;12476:6;;;12455:38;;-1:-1:-1;;;;;12455:38:0;;;;12476:6;;;12455:38;;;12504:6;:17;;-1:-1:-1;;12504:17:0;-1:-1:-1;;;;;12504:17:0;;;;;;;;;;12300:229::o;35723:920::-;35781:7;35801:31;35835:15;35851:1;35835:18;;;;;;;;;;;;;;;;;;;;35801:52;;35896:8;:28;;;35869:8;:23;;;:55;;35866:95;;;35948:1;35941:8;;;;;35866:95;36096:17;;;;35973:22;;36089:3;:24;36085:437;;36181:23;;;;36148:28;;:57;;;:32;:57;:::i;:::-;36255:17;;;;36221:31;;;:51;36130:76;-1:-1:-1;36085:437:0;;;36322:136;36437:8;:20;;;36322:92;36385:8;:28;;;36322:40;36330:8;:31;;;36322:3;:7;;:40;;;;:::i;:136::-;36507:3;36473:31;;;:37;36305:153;-1:-1:-1;36085:437:0;36560:23;;;;:43;;36588:14;36560:43;:27;:43;:::i;:::-;36534:23;;;;:69;;;;36621:14;-1:-1:-1;35723:920:0;;;:::o;2298:192::-;2384:7;2420:12;2412:6;;;;2404:29;;;;-1:-1:-1;;;;;2404:29:0;;;;;;;;;;-1:-1:-1;;2456:5:0;;;2298:192;;;;;;:::o;4342:345::-;4428:7;4530:12;4523:5;;;4515:28;;;;-1:-1:-1;;;;;4515:28:0;;;;;;;;;;;4554:9;4570:1;4566;:5;;;;;;;;;4342:345;-1:-1:-1;;;;;4342:345:0:o;27404:808::-;27598:7;27620:23;27659:99;27732:25;;27659:54;27693:19;27659:15;:13;:15::i;:99::-;27791:14;;27620:138;;-1:-1:-1;27775:30:0;;27771:110;;27829:40;:19;27853:15;27829:40;:23;:40;:::i;:::-;27822:47;;;;;27771:110;27893:21;16064:1;27917:2;:18;27893:42;;27946:21;27983:165;28134:13;27983:132;28099:15;27983:97;28012:67;28064:14;;28012:47;28046:12;28012:29;28030:10;;28012:13;:17;;:29;;;;:::i;:67::-;27983:10;;;:97;:28;:97;:::i;:165::-;27946:202;-1:-1:-1;28166:38:0;:19;27946:202;28166:38;:23;:38;:::i;15353:21293::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;15353:21293:0;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:118:-1;;72:46;110:6;97:20;72:46;;130:116;;205:36;233:6;227:13;205:36;;267:335;;;374:4;362:17;;358:27;-1:-1;348:2;;399:1;396;389:12;348:2;-1:-1;419:20;;459:18;448:30;;445:2;;;491:1;488;481:12;445:2;525:4;517:6;513:17;501:29;;575:3;568;560:6;556:16;546:8;542:31;539:40;536:2;;;592:1;589;582:12;536:2;341:261;;;;;;610:150;;702:53;747:6;741:13;702:53;;767:118;;834:46;872:6;859:20;834:46;;892:122;;970:39;1001:6;995:13;970:39;;1021:241;;1125:2;1113:9;1104:7;1100:23;1096:32;1093:2;;;1141:1;1138;1131:12;1093:2;1176:1;1193:53;1238:7;1218:9;1193:53;;;1183:63;1087:175;-1:-1;;;;1087:175;1269:615;;;;;1426:2;1414:9;1405:7;1401:23;1397:32;1394:2;;;1442:1;1439;1432:12;1394:2;1477:1;1494:53;1539:7;1519:9;1494:53;;;1484:63;;1456:97;1584:2;1602:53;1647:7;1638:6;1627:9;1623:22;1602:53;;;1592:63;;1563:98;1720:2;1709:9;1705:18;1692:32;1744:18;1736:6;1733:30;1730:2;;;1776:1;1773;1766:12;1730:2;1804:64;1860:7;1851:6;1840:9;1836:22;1804:64;;;1388:496;;;;-1:-1;1786:82;-1:-1;;;;1388:496;1891:257;;2003:2;1991:9;1982:7;1978:23;1974:32;1971:2;;;2019:1;2016;2009:12;1971:2;2054:1;2071:61;2124:7;2104:9;2071:61;;2155:291;;2284:2;2272:9;2263:7;2259:23;2255:32;2252:2;;;2300:1;2297;2290:12;2252:2;2335:1;2352:78;2422:7;2402:9;2352:78;;2453:241;;2557:2;2545:9;2536:7;2532:23;2528:32;2525:2;;;2573:1;2570;2563:12;2525:2;2608:1;2625:53;2670:7;2650:9;2625:53;;2701:263;;2816:2;2804:9;2795:7;2791:23;2787:32;2784:2;;;2832:1;2829;2822:12;2784:2;2867:1;2884:64;2940:7;2920:9;2884:64;;2971:490;;;;3111:2;3099:9;3090:7;3086:23;3082:32;3079:2;;;3127:1;3124;3117:12;3079:2;3162:1;3179:53;3224:7;3204:9;3179:53;;;3169:63;;3141:97;3297:2;3286:9;3282:18;3269:32;3321:18;3313:6;3310:30;3307:2;;;3353:1;3350;3343:12;3307:2;3381:64;3437:7;3428:6;3417:9;3413:22;3381:64;;;3363:82;;;;3248:203;3073:388;;;;;;3468:366;;;3589:2;3577:9;3568:7;3564:23;3560:32;3557:2;;;3605:1;3602;3595:12;3557:2;3640:1;3657:53;3702:7;3682:9;3657:53;;;3647:63;;3619:97;3747:2;3765:53;3810:7;3801:6;3790:9;3786:22;3765:53;;;3755:63;;3726:98;3551:283;;;;;;3841:132;3922:45;3961:5;3922:45;;;3917:3;3910:58;3904:69;;;3980:110;4053:31;4078:5;4053:31;;4162:720;;4333:72;4399:5;4333:72;;;4423:6;4418:3;4411:19;4447:4;4442:3;4438:14;4431:21;;4492:74;4560:5;4492:74;;;4587:1;4572:288;4597:6;4594:1;4591:13;4572:288;;;4637:93;4726:3;4717:6;4711:13;4637:93;;;4747:78;4818:6;4747:78;;;4848:4;4839:14;;;;;4737:88;-1:-1;4619:1;4612:9;4572:288;;;-1:-1;4873:3;;4312:570;-1:-1;;;;4312:570;4890:101;4957:28;4979:5;4957:28;;4998:144;5085:51;5130:5;5085:51;;5149:300;;5251:39;5284:5;5251:39;;;5307:6;5302:3;5295:19;5319:63;5375:6;5368:4;5363:3;5359:14;5352:4;5345:5;5341:16;5319:63;;;5414:29;5436:6;5414:29;;;5394:50;;;5407:4;5394:50;;5231:218;-1:-1;;;5231:218;5457:397;5612:2;5600:15;;5649:66;5644:2;5635:12;;5628:88;5750:66;5745:2;5736:12;;5729:88;5845:2;5836:12;;5593:261;5863:397;6018:2;6006:15;;6055:66;6050:2;6041:12;;6034:88;6156:66;6151:2;6142:12;;6135:88;6251:2;6242:12;;5999:261;6269:397;6424:2;6412:15;;6461:66;6456:2;6447:12;;6440:88;6562:66;6557:2;6548:12;;6541:88;6657:2;6648:12;;6405:261;6675:397;6830:2;6818:15;;6867:66;6862:2;6853:12;;6846:88;6968:66;6963:2;6954:12;;6947:88;7063:2;7054:12;;6811:261;7081:397;7236:2;7224:15;;7273:66;7268:2;7259:12;;7252:88;7374:66;7369:2;7360:12;;7353:88;7469:2;7460:12;;7217:261;7487:296;7642:2;7630:15;;7679:66;7674:2;7665:12;;7658:88;7774:2;7765:12;;7623:160;7792:397;7947:2;7935:15;;7984:66;7979:2;7970:12;;7963:88;8085:66;8080:2;8071:12;;8064:88;8180:2;8171:12;;7928:261;8198:397;8353:2;8341:15;;8390:66;8385:2;8376:12;;8369:88;8491:66;8486:2;8477:12;;8470:88;8586:2;8577:12;;8334:261;8604:397;8759:2;8747:15;;8796:66;8791:2;8782:12;;8775:88;8897:66;8892:2;8883:12;;8876:88;8992:2;8983:12;;8740:261;9010:397;9165:2;9153:15;;9202:66;9197:2;9188:12;;9181:88;9303:66;9298:2;9289:12;;9282:88;9398:2;9389:12;;9146:261;9416:499;9571:2;9559:15;;9608:66;9603:2;9594:12;;9587:88;9709:66;9704:2;9695:12;;9688:88;9810:66;9805:2;9796:12;;9789:88;9905:3;9896:13;;9552:363;9924:397;10079:2;10067:15;;10116:66;10111:2;10102:12;;10095:88;10217:66;10212:2;10203:12;;10196:88;10312:2;10303:12;;10060:261;10330:397;10485:2;10473:15;;10522:66;10517:2;10508:12;;10501:88;10623:66;10618:2;10609:12;;10602:88;10718:2;10709:12;;10466:261;10736:397;10891:2;10879:15;;10928:66;10923:2;10914:12;;10907:88;11029:66;11024:2;11015:12;;11008:88;11124:2;11115:12;;10872:261;11142:296;11297:2;11285:15;;;11334:66;11320:12;;;11313:88;11429:2;11420:12;;11278:160;11447:499;11602:2;11590:15;;11639:66;11634:2;11625:12;;11618:88;11740:66;11735:2;11726:12;;11719:88;11841:66;11836:2;11827:12;;11820:88;11936:3;11927:13;;11583:363;11955:397;12110:2;12098:15;;12147:66;12142:2;12133:12;;12126:88;12248:66;12243:2;12234:12;;12227:88;12343:2;12334:12;;12091:261;12361:193;;12503:14;;12545:2;12536:12;;12496:58;12563:397;12718:2;12706:15;;12755:66;12750:2;12741:12;;12734:88;12856:66;12851:2;12842:12;;12835:88;12951:2;12942:12;;12699:261;13027:499;13228:22;;13150:4;13141:14;;;13262:61;13145:3;13228:22;13262:61;;;13170:165;13419:4;13412:5;13408:16;13402:23;13437:62;13493:4;13488:3;13484:14;13471:11;13437:62;;13602:710;13817:22;;13739:4;13730:14;;;13851:61;13734:3;13817:22;13851:61;;;13759:165;14015:4;14008:5;14004:16;13998:23;14033:62;14089:4;14084:3;14080:14;14067:11;14033:62;;;13934:173;14205:4;14198:5;14194:16;14188:23;14223:62;14279:4;14274:3;14270:14;14257:11;14319:110;14392:31;14417:5;14392:31;;14436:193;14544:2;14529:18;;14558:61;14533:9;14592:6;14558:61;;14636:411;14808:2;14793:18;;14822:69;14797:9;14864:6;14822:69;;;14902:62;14960:2;14949:9;14945:18;14936:6;14902:62;;;14975;15033:2;15022:9;15018:18;15009:6;14975:62;;15054:310;15198:2;15183:18;;15212:69;15187:9;15254:6;15212:69;;;15292:62;15350:2;15339:9;15335:18;15326:6;15292:62;;15371:395;15535:2;15520:18;;15549:61;15524:9;15583:6;15549:61;;15773:294;15909:2;15894:18;;15923:61;15898:9;15957:6;15923:61;;16074:413;16268:2;16282:47;;;16253:18;;16343:134;16253:18;16463:6;16343:134;;16494:181;16596:2;16581:18;;16610:55;16585:9;16638:6;16610:55;;16682:221;16804:2;16789:18;;16818:75;16793:9;16866:6;16818:75;;16910:281;17038:2;17052:47;;;17023:18;;17113:68;17023:18;17167:6;17113:68;;17198:387;17379:2;17393:47;;;17364:18;;17454:121;17364:18;17454:121;;17592:387;17773:2;17787:47;;;17758:18;;17848:121;17758:18;17848:121;;17986:387;18167:2;18181:47;;;18152:18;;18242:121;18152:18;18242:121;;18380:387;18561:2;18575:47;;;18546:18;;18636:121;18546:18;18636:121;;18774:387;18955:2;18969:47;;;18940:18;;19030:121;18940:18;19030:121;;19168:387;19349:2;19363:47;;;19334:18;;19424:121;19334:18;19424:121;;19562:387;19743:2;19757:47;;;19728:18;;19818:121;19728:18;19818:121;;19956:387;20137:2;20151:47;;;20122:18;;20212:121;20122:18;20212:121;;20350:387;20531:2;20545:47;;;20516:18;;20606:121;20516:18;20606:121;;20744:387;20925:2;20939:47;;;20910:18;;21000:121;20910:18;21000:121;;21138:387;21319:2;21333:47;;;21304:18;;21394:121;21304:18;21394:121;;21532:387;21713:2;21727:47;;;21698:18;;21788:121;21698:18;21788:121;;21926:387;22107:2;22121:47;;;22092:18;;22182:121;22092:18;22182:121;;22320:387;22501:2;22515:47;;;22486:18;;22576:121;22486:18;22576:121;;22714:387;22895:2;22909:47;;;22880:18;;22970:121;22880:18;22970:121;;23108:387;23289:2;23303:47;;;23274:18;;23364:121;23274:18;23364:121;;23502:387;23683:2;23697:47;;;23668:18;;23758:121;23668:18;23758:121;;23896:387;24077:2;24091:47;;;24062:18;;24152:121;24062:18;24152:121;;24290:301;24452:2;24437:18;;24466:115;24441:9;24554:6;24466:115;;24598:193;24706:2;24691:18;;24720:61;24695:9;24754:6;24720:61;;24798:294;24934:2;24919:18;;24948:61;24923:9;24982:6;24948:61;;25099:587;25335:2;25320:18;;25349:61;25324:9;25383:6;25349:61;;;25421:62;25479:2;25468:9;25464:18;25455:6;25421:62;;;25531:9;25525:4;25521:20;25516:2;25505:9;25501:18;25494:48;25556:120;25671:4;25556:120;;25693:395;25857:2;25842:18;;25871:61;25846:9;25905:6;25871:61;;;25943:62;26001:2;25990:9;25986:18;25977:6;25943:62;;26095:599;26315:3;26300:19;;26330:61;26304:9;26364:6;26330:61;;;26402:62;26460:2;26449:9;26445:18;26436:6;26402:62;;;26475;26533:2;26522:9;26518:18;26509:6;26475:62;;;26548;26606:2;26595:9;26591:18;26582:6;26548:62;;;26621:63;26679:3;26668:9;26664:19;26655:6;26621:63;;;26286:408;;;;;;;;;26701:701;26949:3;26934:19;;26964:61;26938:9;26998:6;26964:61;;;27036:62;27094:2;27083:9;27079:18;27070:6;27036:62;;;27109;27167:2;27156:9;27152:18;27143:6;27109:62;;;27182;27240:2;27229:9;27225:18;27216:6;27182:62;;;27255:63;27313:3;27302:9;27298:19;27289:6;27255:63;;;27329;27387:3;27376:9;27372:19;27363:6;27329:63;;27411:139;27538:4;27526:17;;27507:43;27559:125;27667:12;;27651:33;27939:105;;28008:31;28033:5;28008:31;;28051:92;28124:13;28117:21;;28100:43;28150:128;-1:-1;;;;;28219:54;;28202:76;28582:119;;28665:31;28690:5;28665:31;;28794:129;;28881:37;28912:5;28881:37;;29473:268;29538:1;29545:101;29559:6;29556:1;29553:13;29545:101;;;29626:11;;;29620:18;29607:11;;;29600:39;29581:2;29574:10;29545:101;;;29661:6;29658:1;29655:13;29652:2;;;-1:-1;;29726:1;29708:16;;29701:27;29522:219;29749:97;29837:2;29817:14;-1:-1;;29813:28;;29797:49
Swarm Source
bzzr://f48ef2d2f3e63341feaf2906c447e793081c388e766c6ed91cb8e0ad32e90ea4
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 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.