Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 49 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Unstake | 11860078 | 1871 days ago | IN | 0 ETH | 0.01754688 | ||||
| Unstake | 11805820 | 1880 days ago | IN | 0 ETH | 0.02098948 | ||||
| Unstake | 11781774 | 1883 days ago | IN | 0 ETH | 0.02396114 | ||||
| Unstake | 11772370 | 1885 days ago | IN | 0 ETH | 0.03109008 | ||||
| Unstake | 11769325 | 1885 days ago | IN | 0 ETH | 0.01053071 | ||||
| Unstake | 11769325 | 1885 days ago | IN | 0 ETH | 0.01920735 | ||||
| Unstake | 11728540 | 1892 days ago | IN | 0 ETH | 0.01799811 | ||||
| Unstake | 11677454 | 1899 days ago | IN | 0 ETH | 0.0106864 | ||||
| Unstake | 11518445 | 1924 days ago | IN | 0 ETH | 0.00623558 | ||||
| Stake | 11499404 | 1927 days ago | IN | 0 ETH | 0.00870731 | ||||
| Unstake | 11487959 | 1928 days ago | IN | 0 ETH | 0.00648444 | ||||
| Unstake | 11470911 | 1931 days ago | IN | 0 ETH | 0.01106314 | ||||
| Unstake | 11459389 | 1933 days ago | IN | 0 ETH | 0.01015895 | ||||
| Stake | 11456882 | 1933 days ago | IN | 0 ETH | 0.01966167 | ||||
| Unstake | 11453951 | 1934 days ago | IN | 0 ETH | 0.00812497 | ||||
| Stake | 11431664 | 1937 days ago | IN | 0 ETH | 0.00780791 | ||||
| Unstake | 11416994 | 1939 days ago | IN | 0 ETH | 0.00844821 | ||||
| Stake | 11414987 | 1940 days ago | IN | 0 ETH | 0.00926867 | ||||
| Unstake | 11413211 | 1940 days ago | IN | 0 ETH | 0.0132643 | ||||
| Unstake | 11413197 | 1940 days ago | IN | 0 ETH | 0.0150861 | ||||
| Unstake | 11412419 | 1940 days ago | IN | 0 ETH | 0.01059125 | ||||
| Stake | 11377440 | 1945 days ago | IN | 0 ETH | 0.00561738 | ||||
| Stake | 11344086 | 1951 days ago | IN | 0 ETH | 0.00421321 | ||||
| Unstake | 11335352 | 1952 days ago | IN | 0 ETH | 0.02579924 | ||||
| Stake | 11286637 | 1959 days ago | IN | 0 ETH | 0.00786466 |
Latest 3 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 11220636 | 1970 days ago | Contract Creation | 0 ETH | |||
| - | 11220636 | 1970 days ago | Contract Creation | 0 ETH | |||
| - | 11220636 | 1970 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Orchard
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2020-12-07
*/
pragma solidity 0.5.17;
/**
* @title SafeMath
* @dev Math operations with safety checks that revert on error
*/
library SafeMath {
/**
* @dev Multiplies two numbers, reverts on overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b);
return c;
}
/**
* @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0); // Solidity only automatically asserts when dividing by 0
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a);
uint256 c = a - b;
return c;
}
/**
* @dev Adds two numbers, reverts on overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a);
return c;
}
/**
* @dev Divides two numbers and returns the remainder (unsigned integer modulo),
* reverts when dividing by zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b != 0);
return a % b;
}
}
/**
* @title ERC20 interface
* @dev see https://github.com/ethereum/EIPs/issues/20
*/
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address who) external view returns (uint256);
function allowance(address owner, address spender)
external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function approve(address spender, uint256 value)
external returns (bool);
function transferFrom(address from, address to, uint256 value)
external returns (bool);
event Transfer(
address indexed from,
address indexed to,
uint256 value
);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
}
/**
* @title Ownable
* @dev The Ownable contract has an owner address, and provides basic authorization control
* functions, this simplifies the implementation of "user permissions".
*/
contract Ownable {
address private _owner;
event OwnershipRenounced(address indexed previousOwner);
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
/**
* @dev The Ownable constructor sets the original `owner` of the contract to the sender
* account.
*/
constructor() public {
_owner = msg.sender;
}
/**
* @return the address of the owner.
*/
function owner() public view returns(address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(isOwner());
_;
}
/**
* @return true if `msg.sender` is the owner of the contract.
*/
function isOwner() public view returns(bool) {
return msg.sender == _owner;
}
/**
* @dev Allows the current owner to relinquish control of the contract.
* @notice Renouncing to ownership will leave the contract without an owner.
* It will not be possible to call the functions with the `onlyOwner`
* modifier anymore.
*/
function renounceOwnership() public onlyOwner {
emit OwnershipRenounced(_owner);
_owner = address(0);
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
*/
function transferOwnership(address newOwner) public onlyOwner {
_transferOwnership(newOwner);
}
/**
* @dev Transfers control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
*/
function _transferOwnership(address newOwner) internal {
require(newOwner != address(0));
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
contract IStaking {
event Staked(address indexed user, uint256 amount, uint256 total, bytes data);
event Unstaked(address indexed user, uint256 amount, uint256 total, bytes data);
function stake(uint256 amount, bytes calldata data) external;
function stakeFor(address user, uint256 amount, bytes calldata data) external;
function unstake(uint256 amount, bytes calldata data) external;
function totalStakedFor(address addr) public view returns (uint256);
function totalStaked() public view returns (uint256);
function token() external view returns (address);
/**
* @return False. This application does not support staking history.
*/
function supportsHistory() external pure returns (bool) {
return false;
}
}
contract TokenPool is Ownable {
IERC20 public token;
constructor(IERC20 _token) public {
token = _token;
}
function balance() public view returns (uint256) {
return token.balanceOf(address(this));
}
function transfer(address to, uint256 value) external onlyOwner returns (bool) {
return token.transfer(to, value);
}
function rescueFunds(address tokenToRescue, address to, uint256 amount) external onlyOwner returns (bool) {
require(address(token) != tokenToRescue, 'TokenPool: Cannot claim token held by the contract');
return IERC20(tokenToRescue).transfer(to, amount);
}
}
/**
* @title Orchard
* @dev A smart-contract based mechanism to distribute tokens over time, based on the Ampleforth Geyser.
*
* Distribution tokens are added to a locked pool in the contract and become unlocked over time
* according to a once-configurable unlock schedule. Once unlocked, they are available to be
* claimed by users.
*
* A user may deposit tokens to accrue ownership share over the unlocked pool. This owner share
* is a function of the number of tokens deposited as well as the length of time deposited.
* Specifically, a user's share of the currently-unlocked pool equals their "deposit-seconds"
* divided by the global "deposit-seconds". This aligns the new token distribution with long
* term supporters of the project, addressing one of the major drawbacks of simple airdrops.
*
* More background and motivation available at:
* https://github.com/ampleforth/RFCs/blob/master/RFCs/rfc-1.md
*/
contract Orchard is IStaking, Ownable {
using SafeMath for uint256;
event Staked(address indexed user, uint256 amount, uint256 total, bytes data);
event Unstaked(address indexed user, uint256 amount, uint256 total, bytes data);
event TokensClaimed(address indexed user, uint256 amount);
event TokensLocked(uint256 amount, uint256 durationSec, uint256 total);
// amount: Unlocked tokens, total: Total locked tokens
event TokensUnlocked(uint256 amount, uint256 total);
TokenPool public _stakingPool;
TokenPool public _unlockedPool;
TokenPool public _lockedPool;
//
// Time-bonus params
//
uint256 public constant BONUS_DECIMALS = 2;
uint256 public startBonus = 0;
uint256 public bonusPeriodSec = 0;
//
// Global accounting state
//
uint256 public totalLockedShares = 0;
uint256 public totalStakingShares = 0;
uint256 private _totalStakingShareSeconds = 0;
uint256 private _lastAccountingTimestampSec = now;
uint256 private _maxUnlockSchedules = 0;
uint256 private _initialSharesPerToken = 0;
//
// User accounting state
//
// Represents a single stake for a user. A user may have multiple.
struct Stake {
uint256 stakingShares;
uint256 timestampSec;
}
// Caches aggregated values from the User->Stake[] map to save computation.
// If lastAccountingTimestampSec is 0, there's no entry for that user.
struct UserTotals {
uint256 stakingShares;
uint256 stakingShareSeconds;
uint256 lastAccountingTimestampSec;
}
// Aggregated staking values per user
mapping(address => UserTotals) private _userTotals;
// The collection of stakes for each user. Ordered by timestamp, earliest to latest.
mapping(address => Stake[]) private _userStakes;
//
// Locked/Unlocked Accounting state
//
struct UnlockSchedule {
uint256 initialLockedShares;
uint256 unlockedShares;
uint256 lastUnlockTimestampSec;
uint256 endAtSec;
uint256 durationSec;
}
UnlockSchedule[] public unlockSchedules;
/**
* @param stakingToken The token users deposit as stake.
* @param distributionToken The token users receive as they unstake.
* @param maxUnlockSchedules Max number of unlock stages, to guard against hitting gas limit.
* @param startBonus_ Starting time bonus, BONUS_DECIMALS fixed point.
* e.g. 25% means user gets 25% of max distribution tokens.
* @param bonusPeriodSec_ Length of time for bonus to increase linearly to max.
* @param initialSharesPerToken Number of shares to mint per staking token on first stake.
*/
constructor(IERC20 stakingToken, IERC20 distributionToken, uint256 maxUnlockSchedules,
uint256 startBonus_, uint256 bonusPeriodSec_, uint256 initialSharesPerToken) public {
// The start bonus must be some fraction of the max. (i.e. <= 100%)
require(startBonus_ <= 10**BONUS_DECIMALS, 'Orchard: start bonus too high');
// If no period is desired, instead set startBonus = 100%
// and bonusPeriod to a small value like 1sec.
require(bonusPeriodSec_ != 0, 'Orchard: bonus period is zero');
require(initialSharesPerToken > 0, 'Orchard: initialSharesPerToken is zero');
_stakingPool = new TokenPool(stakingToken);
_unlockedPool = new TokenPool(distributionToken);
_lockedPool = new TokenPool(distributionToken);
startBonus = startBonus_;
bonusPeriodSec = bonusPeriodSec_;
_maxUnlockSchedules = maxUnlockSchedules;
_initialSharesPerToken = initialSharesPerToken;
}
/**
* @return The token users deposit as stake.
*/
function getStakingToken() public view returns (IERC20) {
return _stakingPool.token();
}
/**
* @return The token users receive as they unstake.
*/
function getDistributionToken() public view returns (IERC20) {
assert(_unlockedPool.token() == _lockedPool.token());
return _unlockedPool.token();
}
/**
* @dev Transfers amount of deposit tokens from the user.
* @param amount Number of deposit tokens to stake.
* @param data Not used.
*/
function stake(uint256 amount, bytes calldata data) external {
_stakeFor(msg.sender, msg.sender, amount);
}
/**
* @dev Transfers amount of deposit tokens from the caller on behalf of user.
* @param user User address who gains credit for this stake operation.
* @param amount Number of deposit tokens to stake.
* @param data Not used.
*/
function stakeFor(address user, uint256 amount, bytes calldata data) external onlyOwner {
_stakeFor(msg.sender, user, amount);
}
/**
* @dev Private implementation of staking methods.
* @param staker User address who deposits tokens to stake.
* @param beneficiary User address who gains credit for this stake operation.
* @param amount Number of deposit tokens to stake.
*/
function _stakeFor(address staker, address beneficiary, uint256 amount) private {
require(amount > 0, 'Orchard: stake amount is zero');
require(beneficiary != address(0), 'Orchard: beneficiary is zero address');
require(totalStakingShares == 0 || totalStaked() > 0,
'Orchard: Invalid state. Staking shares exist, but no staking tokens do');
uint256 mintedStakingShares = (totalStakingShares > 0)
? totalStakingShares.mul(amount).div(totalStaked())
: amount.mul(_initialSharesPerToken);
require(mintedStakingShares > 0, 'Orchard: Stake amount is too small');
updateAccounting();
// 1. User Accounting
UserTotals storage totals = _userTotals[beneficiary];
totals.stakingShares = totals.stakingShares.add(mintedStakingShares);
totals.lastAccountingTimestampSec = now;
Stake memory newStake = Stake(mintedStakingShares, now);
_userStakes[beneficiary].push(newStake);
// 2. Global Accounting
totalStakingShares = totalStakingShares.add(mintedStakingShares);
// Already set in updateAccounting()
// _lastAccountingTimestampSec = now;
// interactions
require(_stakingPool.token().transferFrom(staker, address(_stakingPool), amount),
'Orchard: transfer into staking pool failed');
emit Staked(beneficiary, amount, totalStakedFor(beneficiary), "");
}
/**
* @dev Unstakes a certain amount of previously deposited tokens. User also receives their
* alotted number of distribution tokens.
* @param amount Number of deposit tokens to unstake / withdraw.
* @param data Not used.
*/
function unstake(uint256 amount, bytes calldata data) external {
_unstake(amount);
}
/**
* @param amount Number of deposit tokens to unstake / withdraw.
* @return The total number of distribution tokens that would be rewarded.
*/
function unstakeQuery(uint256 amount) public returns (uint256) {
return _unstake(amount);
}
/**
* @dev Unstakes a certain amount of previously deposited tokens. User also receives their
* alotted number of distribution tokens.
* @param amount Number of deposit tokens to unstake / withdraw.
* @return The total number of distribution tokens rewarded.
*/
function _unstake(uint256 amount) private returns (uint256) {
updateAccounting();
// checks
require(amount > 0, 'Orchard: unstake amount is zero');
require(totalStakedFor(msg.sender) >= amount,
'Orchard: unstake amount is greater than total user stakes');
uint256 stakingSharesToBurn = totalStakingShares.mul(amount).div(totalStaked());
require(stakingSharesToBurn > 0, 'Orchard: Unable to unstake amount this small');
// 1. User Accounting
UserTotals storage totals = _userTotals[msg.sender];
Stake[] storage accountStakes = _userStakes[msg.sender];
// Redeem from most recent stake and go backwards in time.
uint256 stakingShareSecondsToBurn = 0;
uint256 sharesLeftToBurn = stakingSharesToBurn;
uint256 rewardAmount = 0;
while (sharesLeftToBurn > 0) {
Stake storage lastStake = accountStakes[accountStakes.length - 1];
uint256 stakeTimeSec = now.sub(lastStake.timestampSec);
uint256 newStakingShareSecondsToBurn = 0;
if (lastStake.stakingShares <= sharesLeftToBurn) {
// fully redeem a past stake
newStakingShareSecondsToBurn = lastStake.stakingShares.mul(stakeTimeSec);
rewardAmount = computeNewReward(rewardAmount, newStakingShareSecondsToBurn, stakeTimeSec);
stakingShareSecondsToBurn = stakingShareSecondsToBurn.add(newStakingShareSecondsToBurn);
sharesLeftToBurn = sharesLeftToBurn.sub(lastStake.stakingShares);
accountStakes.length--;
} else {
// partially redeem a past stake
newStakingShareSecondsToBurn = sharesLeftToBurn.mul(stakeTimeSec);
rewardAmount = computeNewReward(rewardAmount, newStakingShareSecondsToBurn, stakeTimeSec);
stakingShareSecondsToBurn = stakingShareSecondsToBurn.add(newStakingShareSecondsToBurn);
lastStake.stakingShares = lastStake.stakingShares.sub(sharesLeftToBurn);
sharesLeftToBurn = 0;
}
}
totals.stakingShareSeconds = totals.stakingShareSeconds.sub(stakingShareSecondsToBurn);
totals.stakingShares = totals.stakingShares.sub(stakingSharesToBurn);
// Already set in updateAccounting
// totals.lastAccountingTimestampSec = now;
// 2. Global Accounting
_totalStakingShareSeconds = _totalStakingShareSeconds.sub(stakingShareSecondsToBurn);
totalStakingShares = totalStakingShares.sub(stakingSharesToBurn);
// Already set in updateAccounting
// _lastAccountingTimestampSec = now;
// interactions
require(_stakingPool.transfer(msg.sender, amount),
'Orchard: transfer out of staking pool failed');
require(_unlockedPool.transfer(msg.sender, rewardAmount),
'Orchard: transfer out of unlocked pool failed');
emit Unstaked(msg.sender, amount, totalStakedFor(msg.sender), "");
emit TokensClaimed(msg.sender, rewardAmount);
require(totalStakingShares == 0 || totalStaked() > 0,
"Orchard: Error unstaking. Staking shares exist, but no staking tokens do");
return rewardAmount;
}
/**
* @dev Applies an additional time-bonus to a distribution amount. This is necessary to
* encourage long-term deposits instead of constant unstake/restakes.
* The bonus-multiplier is the result of a linear function that starts at startBonus and
* ends at 100% over bonusPeriodSec, then stays at 100% thereafter.
* @param currentRewardTokens The current number of distribution tokens already alotted for this
* unstake op. Any bonuses are already applied.
* @param stakingShareSeconds The stakingShare-seconds that are being burned for new
* distribution tokens.
* @param stakeTimeSec Length of time for which the tokens were staked. Needed to calculate
* the time-bonus.
* @return Updated amount of distribution tokens to award, with any bonus included on the
* newly added tokens.
*/
function computeNewReward(uint256 currentRewardTokens,
uint256 stakingShareSeconds,
uint256 stakeTimeSec) private view returns (uint256) {
uint256 newRewardTokens =
totalUnlocked()
.mul(stakingShareSeconds)
.div(_totalStakingShareSeconds);
if (stakeTimeSec >= bonusPeriodSec) {
return currentRewardTokens.add(newRewardTokens);
}
uint256 oneHundredPct = 10**BONUS_DECIMALS;
uint256 bonusedReward =
startBonus
.add(oneHundredPct.sub(startBonus).mul(stakeTimeSec).div(bonusPeriodSec))
.mul(newRewardTokens)
.div(oneHundredPct);
return currentRewardTokens.add(bonusedReward);
}
/**
* @param addr The user to look up staking information for.
* @return The number of staking tokens deposited for addr.
*/
function totalStakedFor(address addr) public view returns (uint256) {
return totalStakingShares > 0 ?
totalStaked().mul(_userTotals[addr].stakingShares).div(totalStakingShares) : 0;
}
/**
* @return The total number of deposit tokens staked globally, by all users.
*/
function totalStaked() public view returns (uint256) {
return _stakingPool.balance();
}
/**
* @dev Note that this application has a staking token as well as a distribution token, which
* may be different. This function is required by EIP-900.
* @return The deposit token used for staking.
*/
function token() external view returns (address) {
return address(getStakingToken());
}
/**
* @dev A globally callable function to update the accounting state of the system.
* Global state and state for the caller are updated.
* @return [0] balance of the locked pool
* @return [1] balance of the unlocked pool
* @return [2] caller's staking share seconds
* @return [3] global staking share seconds
* @return [4] Rewards caller has accumulated, optimistically assumes max time-bonus.
* @return [5] block timestamp
*/
function updateAccounting() public returns (
uint256, uint256, uint256, uint256, uint256, uint256) {
unlockTokens();
// Global accounting
uint256 newStakingShareSeconds =
now
.sub(_lastAccountingTimestampSec)
.mul(totalStakingShares);
_totalStakingShareSeconds = _totalStakingShareSeconds.add(newStakingShareSeconds);
_lastAccountingTimestampSec = now;
// User Accounting
UserTotals storage totals = _userTotals[msg.sender];
uint256 newUserStakingShareSeconds =
now
.sub(totals.lastAccountingTimestampSec)
.mul(totals.stakingShares);
totals.stakingShareSeconds =
totals.stakingShareSeconds
.add(newUserStakingShareSeconds);
totals.lastAccountingTimestampSec = now;
uint256 totalUserRewards = (_totalStakingShareSeconds > 0)
? totalUnlocked().mul(totals.stakingShareSeconds).div(_totalStakingShareSeconds)
: 0;
return (
totalLocked(),
totalUnlocked(),
totals.stakingShareSeconds,
_totalStakingShareSeconds,
totalUserRewards,
now
);
}
/**
* @return Total number of locked distribution tokens.
*/
function totalLocked() public view returns (uint256) {
return _lockedPool.balance();
}
/**
* @return Total number of unlocked distribution tokens.
*/
function totalUnlocked() public view returns (uint256) {
return _unlockedPool.balance();
}
/**
* @return Number of unlock schedules.
*/
function unlockScheduleCount() public view returns (uint256) {
return unlockSchedules.length;
}
/**
* @dev This funcion allows the contract owner to add more locked distribution tokens, along
* with the associated "unlock schedule". These locked tokens immediately begin unlocking
* linearly over the duraction of durationSec timeframe.
* @param amount Number of distribution tokens to lock. These are transferred from the caller.
* @param durationSec Length of time to linear unlock the tokens.
*/
function lockTokens(uint256 amount, uint256 durationSec) external onlyOwner {
require(unlockSchedules.length < _maxUnlockSchedules,
'Orchard: reached maximum unlock schedules');
// Update lockedTokens amount before using it in computations after.
updateAccounting();
uint256 lockedTokens = totalLocked();
uint256 mintedLockedShares = (lockedTokens > 0)
? totalLockedShares.mul(amount).div(lockedTokens)
: amount.mul(_initialSharesPerToken);
UnlockSchedule memory schedule;
schedule.initialLockedShares = mintedLockedShares;
schedule.lastUnlockTimestampSec = now;
schedule.endAtSec = now.add(durationSec);
schedule.durationSec = durationSec;
unlockSchedules.push(schedule);
totalLockedShares = totalLockedShares.add(mintedLockedShares);
require(_lockedPool.token().transferFrom(msg.sender, address(_lockedPool), amount),
'Orchard: transfer into locked pool failed');
emit TokensLocked(amount, durationSec, totalLocked());
}
/**
* @dev Moves distribution tokens from the locked pool to the unlocked pool, according to the
* previously defined unlock schedules. Publicly callable.
* @return Number of newly unlocked distribution tokens.
*/
function unlockTokens() public returns (uint256) {
uint256 unlockedTokens = 0;
uint256 lockedTokens = totalLocked();
if (totalLockedShares == 0) {
unlockedTokens = lockedTokens;
} else {
uint256 unlockedShares = 0;
for (uint256 s = 0; s < unlockSchedules.length; s++) {
unlockedShares = unlockedShares.add(unlockScheduleShares(s));
}
unlockedTokens = unlockedShares.mul(lockedTokens).div(totalLockedShares);
totalLockedShares = totalLockedShares.sub(unlockedShares);
}
if (unlockedTokens > 0) {
require(_lockedPool.transfer(address(_unlockedPool), unlockedTokens),
'Orchard: transfer out of locked pool failed');
emit TokensUnlocked(unlockedTokens, totalLocked());
}
return unlockedTokens;
}
/**
* @dev Returns the number of unlockable shares from a given schedule. The returned value
* depends on the time since the last unlock. This function updates schedule accounting,
* but does not actually transfer any tokens.
* @param s Index of the unlock schedule.
* @return The number of unlocked shares.
*/
function unlockScheduleShares(uint256 s) private returns (uint256) {
UnlockSchedule storage schedule = unlockSchedules[s];
if(schedule.unlockedShares >= schedule.initialLockedShares) {
return 0;
}
uint256 sharesToUnlock = 0;
// Special case to handle any leftover dust from integer division
if (now >= schedule.endAtSec) {
sharesToUnlock = (schedule.initialLockedShares.sub(schedule.unlockedShares));
schedule.lastUnlockTimestampSec = schedule.endAtSec;
} else {
sharesToUnlock = now.sub(schedule.lastUnlockTimestampSec)
.mul(schedule.initialLockedShares)
.div(schedule.durationSec);
schedule.lastUnlockTimestampSec = now;
}
schedule.unlockedShares = schedule.unlockedShares.add(sharesToUnlock);
return sharesToUnlock;
}
/**
* @dev Lets the owner rescue funds air-dropped to the staking pool.
* @param tokenToRescue Address of the token to be rescued.
* @param to Address to which the rescued funds are to be sent.
* @param amount Amount of tokens to be rescued.
* @return Transfer success.
*/
function rescueFundsFromStakingPool(address tokenToRescue, address to, uint256 amount)
public onlyOwner returns (bool) {
return _stakingPool.rescueFunds(tokenToRescue, to, amount);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IERC20","name":"stakingToken","type":"address"},{"internalType":"contract IERC20","name":"distributionToken","type":"address"},{"internalType":"uint256","name":"maxUnlockSchedules","type":"uint256"},{"internalType":"uint256","name":"startBonus_","type":"uint256"},{"internalType":"uint256","name":"bonusPeriodSec_","type":"uint256"},{"internalType":"uint256","name":"initialSharesPerToken","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"durationSec","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"}],"name":"TokensLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"}],"name":"TokensUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Unstaked","type":"event"},{"constant":true,"inputs":[],"name":"BONUS_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_lockedPool","outputs":[{"internalType":"contract TokenPool","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_stakingPool","outputs":[{"internalType":"contract TokenPool","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_unlockedPool","outputs":[{"internalType":"contract TokenPool","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bonusPeriodSec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getDistributionToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"durationSec","type":"uint256"}],"name":"lockTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenToRescue","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueFundsFromStakingPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"stake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"stakeFor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"startBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"supportsHistory","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalLocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalLockedShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"totalStakedFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalStakingShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalUnlocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"unlockScheduleCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"unlockSchedules","outputs":[{"internalType":"uint256","name":"initialLockedShares","type":"uint256"},{"internalType":"uint256","name":"unlockedShares","type":"uint256"},{"internalType":"uint256","name":"lastUnlockTimestampSec","type":"uint256"},{"internalType":"uint256","name":"endAtSec","type":"uint256"},{"internalType":"uint256","name":"durationSec","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unlockTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"unstake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unstakeQuery","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"updateAccounting","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405260006004556000600555600060065560006007556000600855426009556000600a556000600b553480156200003857600080fd5b506040516200269638038062002696833981810160405260c08110156200005e57600080fd5b508051602082015160408301516060840151608085015160a090950151600080546001600160a01b0319163317905593949293919290916064831115620000ec576040805162461bcd60e51b815260206004820152601d60248201527f4f7263686172643a20737461727420626f6e757320746f6f2068696768000000604482015290519081900360640190fd5b816200013f576040805162461bcd60e51b815260206004820152601d60248201527f4f7263686172643a20626f6e757320706572696f64206973207a65726f000000604482015290519081900360640190fd5b60008111620001805760405162461bcd60e51b8152600401808060200182810382526026815260200180620026706026913960400191505060405180910390fd5b856040516200018f90620002b7565b6001600160a01b03909116815260405190819003602001906000f080158015620001bd573d6000803e3d6000fd5b50600180546001600160a01b0319166001600160a01b03929092169190911790556040518590620001ee90620002b7565b6001600160a01b03909116815260405190819003602001906000f0801580156200021c573d6000803e3d6000fd5b50600280546001600160a01b0319166001600160a01b039290921691909117905560405185906200024d90620002b7565b6001600160a01b03909116815260405190819003602001906000f0801580156200027b573d6000803e3d6000fd5b50600380546001600160a01b0319166001600160a01b0392909216919091179055600492909255600555600a91909155600b5550620002c59050565b61057980620020f783390190565b611e2280620002d56000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c8063817b1cd2116101045780639f9106d1116100a2578063f2e456c611610071578063f2e456c61461053d578063f2fde38b14610545578063f968f4931461056b578063fc0c546a14610573576101da565b80639f9106d1146104ae578063a779d080146104b6578063c7ae2007146104be578063c8fd6ed0146104c6576101da565b806386805dd1116100de57806386805dd11461045e57806389158d8e1461047b5780638da5cb5b1461049e5780638f32d59b146104a6576101da565b8063817b1cd21461044657806381c39bec1461044e57806384791cff14610456576101da565b80634b341aed1161017c5780637033e4a61161014b5780637033e4a61461042657806370c6a17e1461042e578063715018a6146104365780637c6aa6f41461043e576101da565b80634b341aed14610366578063568914121461038c5780635a72bbef146103945780635c94bcb2146103de576101da565b806322c12b84116101b857806322c12b84146102f757806338b45fde1461031b5780633d07411014610323578063494347e71461032b576101da565b80630e89439b146101df5780630ef96356146102585780631dc27fde146102dd575b600080fd5b610256600480360360408110156101f557600080fd5b8135919081019060408101602082013564010000000081111561021757600080fd5b82018360208201111561022957600080fd5b8035906020019184600183028401116401000000008311171561024b57600080fd5b50909250905061057b565b005b6102566004803603606081101561026e57600080fd5b6001600160a01b038235169160208101359181019060608101604082013564010000000081111561029e57600080fd5b8201836020820111156102b057600080fd5b803590602001918460018302840111640100000000831117156102d257600080fd5b50909250905061058b565b6102e56105ad565b60408051918252519081900360200190f35b6102ff6105b2565b604080516001600160a01b039092168252519081900360200190f35b6102e5610728565b6102ff61072e565b61033361073d565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b6102e56004803603602081101561037c57600080fd5b50356001600160a01b0316610849565b6102e5610890565b6103ca600480360360608110156103aa57600080fd5b506001600160a01b038135811691602081013590911690604001356108d5565b604080519115158252519081900360200190f35b6103fb600480360360208110156103f457600080fd5b503561097c565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6103ca6109ba565b6102e56109bf565b6102566109c5565b6102e5610a1e565b6102e5610a24565b6102e5610a69565b6102ff610a6f565b6102e56004803603602081101561047457600080fd5b5035610a7e565b6102566004803603604081101561049157600080fd5b5080359060200135610a89565b6102ff610dd1565b6103ca610de0565b6102ff610df1565b6102e5610e36565b6102e5610e7b565b610256600480360360408110156104dc57600080fd5b813591908101906040810160208201356401000000008111156104fe57600080fd5b82018360208201111561051057600080fd5b8035906020019184600183028401116401000000008311171561053257600080fd5b509092509050610e81565b6102ff610e8a565b6102566004803603602081101561055b57600080fd5b50356001600160a01b0316610e99565b6102e5610eb6565b6102ff61104a565b610586333385611059565b505050565b610593610de0565b61059c57600080fd5b6105a7338585611059565b50505050565b600281565b60035460408051637e062a3560e11b815290516000926001600160a01b03169163fc0c546a916004808301926020929190829003018186803b1580156105f757600080fd5b505afa15801561060b573d6000803e3d6000fd5b505050506040513d602081101561062157600080fd5b505160025460408051637e062a3560e11b815290516001600160a01b03938416939092169163fc0c546a91600480820192602092909190829003018186803b15801561066c57600080fd5b505afa158015610680573d6000803e3d6000fd5b505050506040513d602081101561069657600080fd5b50516001600160a01b0316146106a857fe5b600260009054906101000a90046001600160a01b03166001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156106f657600080fd5b505afa15801561070a573d6000803e3d6000fd5b505050506040513d602081101561072057600080fd5b505190505b90565b60045481565b6001546001600160a01b031681565b60008060008060008061074e610eb6565b50600061077860075461076c6009544261140a90919063ffffffff16565b9063ffffffff61142416565b60085490915061078e908263ffffffff61144b16565b600855426009819055336000908152600c602052604081208054600282015491936107c39261076c919063ffffffff61140a16565b60018301549091506107db908263ffffffff61144b16565b60018301554260028301556008546000906107f7576000610819565b61081960085461080d856001015461076c610e36565b9063ffffffff61145d16565b9050610823610890565b61082b610e36565b600190940154600854919c949b509950975095504294509092505050565b6000806007541161085b576000610888565b6007546001600160a01b0383166000908152600c6020526040902054610888919061080d9061076c610a24565b90505b919050565b600354604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a8916004808301926020929190829003018186803b1580156106f657600080fd5b60006108df610de0565b6108e857600080fd5b60015460408051631b32b81560e21b81526001600160a01b03878116600483015286811660248301526044820186905291519190921691636ccae0549160648083019260209291908290030181600087803b15801561094657600080fd5b505af115801561095a573d6000803e3d6000fd5b505050506040513d602081101561097057600080fd5b505190505b9392505050565b600e818154811061098957fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401549294509092909185565b600090565b60075481565b6109cd610de0565b6109d657600080fd5b600080546040516001600160a01b03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a2600080546001600160a01b0319169055565b60055481565b600154604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a8916004808301926020929190829003018186803b1580156106f657600080fd5b60065481565b6003546001600160a01b031681565b60006108888261147f565b610a91610de0565b610a9a57600080fd5b600a54600e5410610adc5760405162461bcd60e51b8152600401808060200182810382526029815260200180611cbd6029913960400191505060405180910390fd5b610ae461073d565b5050505050506000610af4610890565b90506000808211610b1857600b54610b1390859063ffffffff61142416565b610b31565b610b318261080d8660065461142490919063ffffffff16565b9050610b3b611b23565b8181524260408201819052610b56908563ffffffff61144b16565b6060820190815260808201858152600e805460018101825560009190915283517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd60059092029182015560208401517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe82015560408401517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3ff82015591517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c400830155517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c40190910155600654610c4b908361144b565b60065560035460408051637e062a3560e11b815290516001600160a01b039092169163fc0c546a91600480820192602092909190829003018186803b158015610c9357600080fd5b505afa158015610ca7573d6000803e3d6000fd5b505050506040513d6020811015610cbd57600080fd5b5051600354604080516323b872dd60e01b81523360048201526001600160a01b03928316602482015260448101899052905191909216916323b872dd9160648083019260209291908290030181600087803b158015610d1b57600080fd5b505af1158015610d2f573d6000803e3d6000fd5b505050506040513d6020811015610d4557600080fd5b5051610d825760405162461bcd60e51b8152600401808060200182810382526029815260200180611c1f6029913960400191505060405180910390fd5b7ff346961af4c52f314df1b45964746280fe409abb959d4a2458d58f79408b1fe88585610dad610890565b60408051938452602084019290925282820152519081900360600190a15050505050565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b60015460408051637e062a3560e11b815290516000926001600160a01b03169163fc0c546a916004808301926020929190829003018186803b1580156106f657600080fd5b600254604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a8916004808301926020929190829003018186803b1580156106f657600080fd5b600e5490565b6105a78361147f565b6002546001600160a01b031681565b610ea1610de0565b610eaa57600080fd5b610eb381611964565b50565b60008080610ec2610890565b905060065460001415610ed757809150610f3b565b6000805b600e54811015610f0857610efe610ef1826119d2565b839063ffffffff61144b16565b9150600101610edb565b50600654610f209061080d838563ffffffff61142416565b600654909350610f36908263ffffffff61140a16565b600655505b8115611044576003546002546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919092169163a9059cbb9160448083019260209291908290030181600087803b158015610f9a57600080fd5b505af1158015610fae573d6000803e3d6000fd5b505050506040513d6020811015610fc457600080fd5b50516110015760405162461bcd60e51b815260040180806020018281038252602b815260200180611ce6602b913960400191505060405180910390fd5b7f2e444eb379b177e88ce0649c6110a3b01099f03e297127919dd5e3b63a761a9c8261102b610890565b6040805192835260208301919091528051918290030190a15b50905090565b6000611054610df1565b905090565b600081116110ae576040805162461bcd60e51b815260206004820152601d60248201527f4f7263686172643a207374616b6520616d6f756e74206973207a65726f000000604482015290519081900360640190fd5b6001600160a01b0382166110f35760405162461bcd60e51b8152600401808060200182810382526024815260200180611bb56024913960400191505060405180910390fd5b600754158061110957506000611107610a24565b115b6111445760405162461bcd60e51b8152600401808060200182810382526046815260200180611bd96046913960600191505060405180910390fd5b6000806007541161116857600b5461116390839063ffffffff61142416565b611186565b611186611173610a24565b60075461080d908563ffffffff61142416565b9050600081116111c75760405162461bcd60e51b8152600401808060200182810382526022815260200180611d3d6022913960400191505060405180910390fd5b6111cf61073d565b505050506001600160a01b0385166000908152600c6020526040902080549092506111fb91508361144b565b815542600282015561120b611b52565b506040805180820182528381524260208083019182526001600160a01b0388166000908152600d8252938420805460018181018355918652919094208351600290920201908155905192019190915560075461126d908463ffffffff61144b16565b60075560015460408051637e062a3560e11b815290516001600160a01b039092169163fc0c546a91600480820192602092909190829003018186803b1580156112b557600080fd5b505afa1580156112c9573d6000803e3d6000fd5b505050506040513d60208110156112df57600080fd5b5051600154604080516323b872dd60e01b81526001600160a01b038a81166004830152928316602482015260448101889052905191909216916323b872dd9160648083019260209291908290030181600087803b15801561133f57600080fd5b505af1158015611353573d6000803e3d6000fd5b505050506040513d602081101561136957600080fd5b50516113a65760405162461bcd60e51b815260040180806020018281038252602a815260200180611dc4602a913960400191505060405180910390fd5b846001600160a01b03167fc65e53b88159e7d2c0fc12a0600072e28ae53ff73b4c1715369c30f160935142856113db88610849565b6040805192835260208301919091526060828201819052600090830152519081900360a00190a2505050505050565b60008282111561141957600080fd5b508082035b92915050565b6000826114335750600061141e565b8282028284828161144057fe5b041461097557600080fd5b60008282018381101561097557600080fd5b600080821161146b57600080fd5b600082848161147657fe5b04949350505050565b600061148961073d565b505050505050600082116114e4576040805162461bcd60e51b815260206004820152601f60248201527f4f7263686172643a20756e7374616b6520616d6f756e74206973207a65726f00604482015290519081900360640190fd5b816114ee33610849565b101561152b5760405162461bcd60e51b8152600401808060200182810382526039815260200180611d8b6039913960400191505060405180910390fd5b600061154b611538610a24565b60075461080d908663ffffffff61142416565b90506000811161158c5760405162461bcd60e51b815260040180806020018281038252602c815260200180611d5f602c913960400191505060405180910390fd5b336000908152600c60209081526040808320600d9092528220909183815b81156116af578354600090859060001981019081106115c557fe5b9060005260206000209060020201905060006115ee82600101544261140a90919063ffffffff16565b8254909150600090851061165c57825461160e908363ffffffff61142416565b905061161b848284611a95565b935061162d868263ffffffff61144b16565b835490965061164390869063ffffffff61140a16565b8754909550611656886000198301611b6c565b506116a7565b61166c858363ffffffff61142416565b9050611679848284611a95565b935061168b868263ffffffff61144b16565b83549096506116a0908663ffffffff61140a16565b8355600094505b5050506115aa565b60018501546116c4908463ffffffff61140a16565b600186015584546116db908763ffffffff61140a16565b85556008546116f0908463ffffffff61140a16565b600855600754611706908763ffffffff61140a16565b6007556001546040805163a9059cbb60e01b8152336004820152602481018b905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561175d57600080fd5b505af1158015611771573d6000803e3d6000fd5b505050506040513d602081101561178757600080fd5b50516117c45760405162461bcd60e51b815260040180806020018281038252602c815260200180611d11602c913960400191505060405180910390fd5b6002546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561181857600080fd5b505af115801561182c573d6000803e3d6000fd5b505050506040513d602081101561184257600080fd5b505161187f5760405162461bcd60e51b815260040180806020018281038252602d815260200180611c90602d913960400191505060405180910390fd5b337faf01bfc8475df280aca00b578c4a948e6d95700f0db8c13365240f7f973c8754896118ab83610849565b6040805192835260208301919091526060828201819052600090830152519081900360a00190a260408051828152905133917f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e430919081900360200190a2600754158061191e5750600061191c610a24565b115b6119595760405162461bcd60e51b8152600401808060200182810382526048815260200180611c486048913960600191505060405180910390fd5b979650505050505050565b6001600160a01b03811661197757600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600080600e83815481106119e257fe5b906000526020600020906005020190508060000154816001015410611a0b57600091505061088b565b60038101546000904210611a405760018201548254611a2f9163ffffffff61140a16565b600383015460028401559050611a70565b611a67826004015461080d846000015461076c86600201544261140a90919063ffffffff16565b42600284015590505b6001820154611a85908263ffffffff61144b16565b6001909201919091559050919050565b600080611aaa60085461080d8661076c610e36565b90506005548310611acd57611ac5858263ffffffff61144b16565b915050610975565b60006002600a0a90506000611b118261080d8561076c611b0260055461080d8c61076c6004548c61140a90919063ffffffff16565b6004549063ffffffff61144b16565b9050611959878263ffffffff61144b16565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b81548183558181111561058657600083815260209020610586916107259160029182028101918502015b80821115611bb05760008082556001820155600201611b96565b509056fe4f7263686172643a2062656e6566696369617279206973207a65726f20616464726573734f7263686172643a20496e76616c69642073746174652e205374616b696e67207368617265732065786973742c20627574206e6f207374616b696e6720746f6b656e7320646f4f7263686172643a207472616e7366657220696e746f206c6f636b656420706f6f6c206661696c65644f7263686172643a204572726f7220756e7374616b696e672e205374616b696e67207368617265732065786973742c20627574206e6f207374616b696e6720746f6b656e7320646f4f7263686172643a207472616e73666572206f7574206f6620756e6c6f636b656420706f6f6c206661696c65644f7263686172643a2072656163686564206d6178696d756d20756e6c6f636b207363686564756c65734f7263686172643a207472616e73666572206f7574206f66206c6f636b656420706f6f6c206661696c65644f7263686172643a207472616e73666572206f7574206f66207374616b696e6720706f6f6c206661696c65644f7263686172643a205374616b6520616d6f756e7420697320746f6f20736d616c6c4f7263686172643a20556e61626c6520746f20756e7374616b6520616d6f756e74207468697320736d616c6c4f7263686172643a20756e7374616b6520616d6f756e742069732067726561746572207468616e20746f74616c2075736572207374616b65734f7263686172643a207472616e7366657220696e746f207374616b696e6720706f6f6c206661696c6564a265627a7a72315820c0d5841d85cc6137179d350d25939d86af753835e8fc51bce04d836fd4e1be3864736f6c63430005110032608060405234801561001057600080fd5b506040516105793803806105798339818101604052602081101561003357600080fd5b5051600080546001600160a01b03199081163317909155600180546001600160a01b0390931692909116919091179055610507806100726000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063a9059cbb1161005b578063a9059cbb1461010d578063b69ef8a814610139578063f2fde38b14610153578063fc0c546a1461017957610088565b80636ccae0541461008d578063715018a6146100d75780638da5cb5b146100e15780638f32d59b14610105575b600080fd5b6100c3600480360360608110156100a357600080fd5b506001600160a01b03813581169160208101359091169060400135610181565b604080519115158252519081900360200190f35b6100df610275565b005b6100e96102ce565b604080516001600160a01b039092168252519081900360200190f35b6100c36102dd565b6100c36004803603604081101561012357600080fd5b506001600160a01b0381351690602001356102ee565b61014161038a565b60408051918252519081900360200190f35b6100df6004803603602081101561016957600080fd5b50356001600160a01b0316610406565b6100e9610423565b600061018b6102dd565b61019457600080fd5b6001546001600160a01b03858116911614156101e15760405162461bcd60e51b81526004018080602001828103825260328152602001806104a16032913960400191505060405180910390fd5b836001600160a01b031663a9059cbb84846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561024157600080fd5b505af1158015610255573d6000803e3d6000fd5b505050506040513d602081101561026b57600080fd5b5051949350505050565b61027d6102dd565b61028657600080fd5b600080546040516001600160a01b03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a2600080546001600160a01b0319169055565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b60006102f86102dd565b61030157600080fd5b6001546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561035757600080fd5b505af115801561036b573d6000803e3d6000fd5b505050506040513d602081101561038157600080fd5b50519392505050565b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156103d557600080fd5b505afa1580156103e9573d6000803e3d6000fd5b505050506040513d60208110156103ff57600080fd5b5051905090565b61040e6102dd565b61041757600080fd5b61042081610432565b50565b6001546001600160a01b031681565b6001600160a01b03811661044557600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b039290921691909117905556fe546f6b656e506f6f6c3a2043616e6e6f7420636c61696d20746f6b656e2068656c642062792074686520636f6e7472616374a265627a7a723158204218c4b1c95dd3e6faefdaf555019a8ea6a8260055659224a18de7a07faed9e564736f6c634300051100324f7263686172643a20696e697469616c536861726573506572546f6b656e206973207a65726f00000000000000000000000054f5f952cca8888227276581f26978f99fdba64e00000000000000000000000087f5f9ebe40786d49d35e1b5997b07ccaa8adbff0000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000004f1a0000000000000000000000000000000000000000000000000000000000000f4240
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c8063817b1cd2116101045780639f9106d1116100a2578063f2e456c611610071578063f2e456c61461053d578063f2fde38b14610545578063f968f4931461056b578063fc0c546a14610573576101da565b80639f9106d1146104ae578063a779d080146104b6578063c7ae2007146104be578063c8fd6ed0146104c6576101da565b806386805dd1116100de57806386805dd11461045e57806389158d8e1461047b5780638da5cb5b1461049e5780638f32d59b146104a6576101da565b8063817b1cd21461044657806381c39bec1461044e57806384791cff14610456576101da565b80634b341aed1161017c5780637033e4a61161014b5780637033e4a61461042657806370c6a17e1461042e578063715018a6146104365780637c6aa6f41461043e576101da565b80634b341aed14610366578063568914121461038c5780635a72bbef146103945780635c94bcb2146103de576101da565b806322c12b84116101b857806322c12b84146102f757806338b45fde1461031b5780633d07411014610323578063494347e71461032b576101da565b80630e89439b146101df5780630ef96356146102585780631dc27fde146102dd575b600080fd5b610256600480360360408110156101f557600080fd5b8135919081019060408101602082013564010000000081111561021757600080fd5b82018360208201111561022957600080fd5b8035906020019184600183028401116401000000008311171561024b57600080fd5b50909250905061057b565b005b6102566004803603606081101561026e57600080fd5b6001600160a01b038235169160208101359181019060608101604082013564010000000081111561029e57600080fd5b8201836020820111156102b057600080fd5b803590602001918460018302840111640100000000831117156102d257600080fd5b50909250905061058b565b6102e56105ad565b60408051918252519081900360200190f35b6102ff6105b2565b604080516001600160a01b039092168252519081900360200190f35b6102e5610728565b6102ff61072e565b61033361073d565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b6102e56004803603602081101561037c57600080fd5b50356001600160a01b0316610849565b6102e5610890565b6103ca600480360360608110156103aa57600080fd5b506001600160a01b038135811691602081013590911690604001356108d5565b604080519115158252519081900360200190f35b6103fb600480360360208110156103f457600080fd5b503561097c565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6103ca6109ba565b6102e56109bf565b6102566109c5565b6102e5610a1e565b6102e5610a24565b6102e5610a69565b6102ff610a6f565b6102e56004803603602081101561047457600080fd5b5035610a7e565b6102566004803603604081101561049157600080fd5b5080359060200135610a89565b6102ff610dd1565b6103ca610de0565b6102ff610df1565b6102e5610e36565b6102e5610e7b565b610256600480360360408110156104dc57600080fd5b813591908101906040810160208201356401000000008111156104fe57600080fd5b82018360208201111561051057600080fd5b8035906020019184600183028401116401000000008311171561053257600080fd5b509092509050610e81565b6102ff610e8a565b6102566004803603602081101561055b57600080fd5b50356001600160a01b0316610e99565b6102e5610eb6565b6102ff61104a565b610586333385611059565b505050565b610593610de0565b61059c57600080fd5b6105a7338585611059565b50505050565b600281565b60035460408051637e062a3560e11b815290516000926001600160a01b03169163fc0c546a916004808301926020929190829003018186803b1580156105f757600080fd5b505afa15801561060b573d6000803e3d6000fd5b505050506040513d602081101561062157600080fd5b505160025460408051637e062a3560e11b815290516001600160a01b03938416939092169163fc0c546a91600480820192602092909190829003018186803b15801561066c57600080fd5b505afa158015610680573d6000803e3d6000fd5b505050506040513d602081101561069657600080fd5b50516001600160a01b0316146106a857fe5b600260009054906101000a90046001600160a01b03166001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156106f657600080fd5b505afa15801561070a573d6000803e3d6000fd5b505050506040513d602081101561072057600080fd5b505190505b90565b60045481565b6001546001600160a01b031681565b60008060008060008061074e610eb6565b50600061077860075461076c6009544261140a90919063ffffffff16565b9063ffffffff61142416565b60085490915061078e908263ffffffff61144b16565b600855426009819055336000908152600c602052604081208054600282015491936107c39261076c919063ffffffff61140a16565b60018301549091506107db908263ffffffff61144b16565b60018301554260028301556008546000906107f7576000610819565b61081960085461080d856001015461076c610e36565b9063ffffffff61145d16565b9050610823610890565b61082b610e36565b600190940154600854919c949b509950975095504294509092505050565b6000806007541161085b576000610888565b6007546001600160a01b0383166000908152600c6020526040902054610888919061080d9061076c610a24565b90505b919050565b600354604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a8916004808301926020929190829003018186803b1580156106f657600080fd5b60006108df610de0565b6108e857600080fd5b60015460408051631b32b81560e21b81526001600160a01b03878116600483015286811660248301526044820186905291519190921691636ccae0549160648083019260209291908290030181600087803b15801561094657600080fd5b505af115801561095a573d6000803e3d6000fd5b505050506040513d602081101561097057600080fd5b505190505b9392505050565b600e818154811061098957fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401549294509092909185565b600090565b60075481565b6109cd610de0565b6109d657600080fd5b600080546040516001600160a01b03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a2600080546001600160a01b0319169055565b60055481565b600154604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a8916004808301926020929190829003018186803b1580156106f657600080fd5b60065481565b6003546001600160a01b031681565b60006108888261147f565b610a91610de0565b610a9a57600080fd5b600a54600e5410610adc5760405162461bcd60e51b8152600401808060200182810382526029815260200180611cbd6029913960400191505060405180910390fd5b610ae461073d565b5050505050506000610af4610890565b90506000808211610b1857600b54610b1390859063ffffffff61142416565b610b31565b610b318261080d8660065461142490919063ffffffff16565b9050610b3b611b23565b8181524260408201819052610b56908563ffffffff61144b16565b6060820190815260808201858152600e805460018101825560009190915283517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd60059092029182015560208401517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe82015560408401517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3ff82015591517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c400830155517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c40190910155600654610c4b908361144b565b60065560035460408051637e062a3560e11b815290516001600160a01b039092169163fc0c546a91600480820192602092909190829003018186803b158015610c9357600080fd5b505afa158015610ca7573d6000803e3d6000fd5b505050506040513d6020811015610cbd57600080fd5b5051600354604080516323b872dd60e01b81523360048201526001600160a01b03928316602482015260448101899052905191909216916323b872dd9160648083019260209291908290030181600087803b158015610d1b57600080fd5b505af1158015610d2f573d6000803e3d6000fd5b505050506040513d6020811015610d4557600080fd5b5051610d825760405162461bcd60e51b8152600401808060200182810382526029815260200180611c1f6029913960400191505060405180910390fd5b7ff346961af4c52f314df1b45964746280fe409abb959d4a2458d58f79408b1fe88585610dad610890565b60408051938452602084019290925282820152519081900360600190a15050505050565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b60015460408051637e062a3560e11b815290516000926001600160a01b03169163fc0c546a916004808301926020929190829003018186803b1580156106f657600080fd5b600254604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a8916004808301926020929190829003018186803b1580156106f657600080fd5b600e5490565b6105a78361147f565b6002546001600160a01b031681565b610ea1610de0565b610eaa57600080fd5b610eb381611964565b50565b60008080610ec2610890565b905060065460001415610ed757809150610f3b565b6000805b600e54811015610f0857610efe610ef1826119d2565b839063ffffffff61144b16565b9150600101610edb565b50600654610f209061080d838563ffffffff61142416565b600654909350610f36908263ffffffff61140a16565b600655505b8115611044576003546002546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919092169163a9059cbb9160448083019260209291908290030181600087803b158015610f9a57600080fd5b505af1158015610fae573d6000803e3d6000fd5b505050506040513d6020811015610fc457600080fd5b50516110015760405162461bcd60e51b815260040180806020018281038252602b815260200180611ce6602b913960400191505060405180910390fd5b7f2e444eb379b177e88ce0649c6110a3b01099f03e297127919dd5e3b63a761a9c8261102b610890565b6040805192835260208301919091528051918290030190a15b50905090565b6000611054610df1565b905090565b600081116110ae576040805162461bcd60e51b815260206004820152601d60248201527f4f7263686172643a207374616b6520616d6f756e74206973207a65726f000000604482015290519081900360640190fd5b6001600160a01b0382166110f35760405162461bcd60e51b8152600401808060200182810382526024815260200180611bb56024913960400191505060405180910390fd5b600754158061110957506000611107610a24565b115b6111445760405162461bcd60e51b8152600401808060200182810382526046815260200180611bd96046913960600191505060405180910390fd5b6000806007541161116857600b5461116390839063ffffffff61142416565b611186565b611186611173610a24565b60075461080d908563ffffffff61142416565b9050600081116111c75760405162461bcd60e51b8152600401808060200182810382526022815260200180611d3d6022913960400191505060405180910390fd5b6111cf61073d565b505050506001600160a01b0385166000908152600c6020526040902080549092506111fb91508361144b565b815542600282015561120b611b52565b506040805180820182528381524260208083019182526001600160a01b0388166000908152600d8252938420805460018181018355918652919094208351600290920201908155905192019190915560075461126d908463ffffffff61144b16565b60075560015460408051637e062a3560e11b815290516001600160a01b039092169163fc0c546a91600480820192602092909190829003018186803b1580156112b557600080fd5b505afa1580156112c9573d6000803e3d6000fd5b505050506040513d60208110156112df57600080fd5b5051600154604080516323b872dd60e01b81526001600160a01b038a81166004830152928316602482015260448101889052905191909216916323b872dd9160648083019260209291908290030181600087803b15801561133f57600080fd5b505af1158015611353573d6000803e3d6000fd5b505050506040513d602081101561136957600080fd5b50516113a65760405162461bcd60e51b815260040180806020018281038252602a815260200180611dc4602a913960400191505060405180910390fd5b846001600160a01b03167fc65e53b88159e7d2c0fc12a0600072e28ae53ff73b4c1715369c30f160935142856113db88610849565b6040805192835260208301919091526060828201819052600090830152519081900360a00190a2505050505050565b60008282111561141957600080fd5b508082035b92915050565b6000826114335750600061141e565b8282028284828161144057fe5b041461097557600080fd5b60008282018381101561097557600080fd5b600080821161146b57600080fd5b600082848161147657fe5b04949350505050565b600061148961073d565b505050505050600082116114e4576040805162461bcd60e51b815260206004820152601f60248201527f4f7263686172643a20756e7374616b6520616d6f756e74206973207a65726f00604482015290519081900360640190fd5b816114ee33610849565b101561152b5760405162461bcd60e51b8152600401808060200182810382526039815260200180611d8b6039913960400191505060405180910390fd5b600061154b611538610a24565b60075461080d908663ffffffff61142416565b90506000811161158c5760405162461bcd60e51b815260040180806020018281038252602c815260200180611d5f602c913960400191505060405180910390fd5b336000908152600c60209081526040808320600d9092528220909183815b81156116af578354600090859060001981019081106115c557fe5b9060005260206000209060020201905060006115ee82600101544261140a90919063ffffffff16565b8254909150600090851061165c57825461160e908363ffffffff61142416565b905061161b848284611a95565b935061162d868263ffffffff61144b16565b835490965061164390869063ffffffff61140a16565b8754909550611656886000198301611b6c565b506116a7565b61166c858363ffffffff61142416565b9050611679848284611a95565b935061168b868263ffffffff61144b16565b83549096506116a0908663ffffffff61140a16565b8355600094505b5050506115aa565b60018501546116c4908463ffffffff61140a16565b600186015584546116db908763ffffffff61140a16565b85556008546116f0908463ffffffff61140a16565b600855600754611706908763ffffffff61140a16565b6007556001546040805163a9059cbb60e01b8152336004820152602481018b905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561175d57600080fd5b505af1158015611771573d6000803e3d6000fd5b505050506040513d602081101561178757600080fd5b50516117c45760405162461bcd60e51b815260040180806020018281038252602c815260200180611d11602c913960400191505060405180910390fd5b6002546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561181857600080fd5b505af115801561182c573d6000803e3d6000fd5b505050506040513d602081101561184257600080fd5b505161187f5760405162461bcd60e51b815260040180806020018281038252602d815260200180611c90602d913960400191505060405180910390fd5b337faf01bfc8475df280aca00b578c4a948e6d95700f0db8c13365240f7f973c8754896118ab83610849565b6040805192835260208301919091526060828201819052600090830152519081900360a00190a260408051828152905133917f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e430919081900360200190a2600754158061191e5750600061191c610a24565b115b6119595760405162461bcd60e51b8152600401808060200182810382526048815260200180611c486048913960600191505060405180910390fd5b979650505050505050565b6001600160a01b03811661197757600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600080600e83815481106119e257fe5b906000526020600020906005020190508060000154816001015410611a0b57600091505061088b565b60038101546000904210611a405760018201548254611a2f9163ffffffff61140a16565b600383015460028401559050611a70565b611a67826004015461080d846000015461076c86600201544261140a90919063ffffffff16565b42600284015590505b6001820154611a85908263ffffffff61144b16565b6001909201919091559050919050565b600080611aaa60085461080d8661076c610e36565b90506005548310611acd57611ac5858263ffffffff61144b16565b915050610975565b60006002600a0a90506000611b118261080d8561076c611b0260055461080d8c61076c6004548c61140a90919063ffffffff16565b6004549063ffffffff61144b16565b9050611959878263ffffffff61144b16565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b81548183558181111561058657600083815260209020610586916107259160029182028101918502015b80821115611bb05760008082556001820155600201611b96565b509056fe4f7263686172643a2062656e6566696369617279206973207a65726f20616464726573734f7263686172643a20496e76616c69642073746174652e205374616b696e67207368617265732065786973742c20627574206e6f207374616b696e6720746f6b656e7320646f4f7263686172643a207472616e7366657220696e746f206c6f636b656420706f6f6c206661696c65644f7263686172643a204572726f7220756e7374616b696e672e205374616b696e67207368617265732065786973742c20627574206e6f207374616b696e6720746f6b656e7320646f4f7263686172643a207472616e73666572206f7574206f6620756e6c6f636b656420706f6f6c206661696c65644f7263686172643a2072656163686564206d6178696d756d20756e6c6f636b207363686564756c65734f7263686172643a207472616e73666572206f7574206f66206c6f636b656420706f6f6c206661696c65644f7263686172643a207472616e73666572206f7574206f66207374616b696e6720706f6f6c206661696c65644f7263686172643a205374616b6520616d6f756e7420697320746f6f20736d616c6c4f7263686172643a20556e61626c6520746f20756e7374616b6520616d6f756e74207468697320736d616c6c4f7263686172643a20756e7374616b6520616d6f756e742069732067726561746572207468616e20746f74616c2075736572207374616b65734f7263686172643a207472616e7366657220696e746f207374616b696e6720706f6f6c206661696c6564a265627a7a72315820c0d5841d85cc6137179d350d25939d86af753835e8fc51bce04d836fd4e1be3864736f6c63430005110032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000054f5f952cca8888227276581f26978f99fdba64e00000000000000000000000087f5f9ebe40786d49d35e1b5997b07ccaa8adbff0000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000004f1a0000000000000000000000000000000000000000000000000000000000000f4240
-----Decoded View---------------
Arg [0] : stakingToken (address): 0x54f5f952cca8888227276581F26978F99FDBa64E
Arg [1] : distributionToken (address): 0x87F5F9eBE40786D49D35E1B5997b07cCAA8ADbFF
Arg [2] : maxUnlockSchedules (uint256): 1024
Arg [3] : startBonus_ (uint256): 33
Arg [4] : bonusPeriodSec_ (uint256): 5184000
Arg [5] : initialSharesPerToken (uint256): 1000000
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 00000000000000000000000054f5f952cca8888227276581f26978f99fdba64e
Arg [1] : 00000000000000000000000087f5f9ebe40786d49d35e1b5997b07ccaa8adbff
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000400
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000021
Arg [4] : 00000000000000000000000000000000000000000000000000000000004f1a00
Arg [5] : 00000000000000000000000000000000000000000000000000000000000f4240
Deployed Bytecode Sourcemap
7006:20619:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7006:20619:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11413:121;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11413:121:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;11413:121:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;11413:121:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;11413:121:0;;-1:-1:-1;11413:121:0;-1:-1:-1;11413:121:0;:::i;:::-;;11806:142;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;11806:142:0;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;11806:142:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;11806:142:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;11806:142:0;;-1:-1:-1;11806:142:0;-1:-1:-1;11806:142:0;:::i;7669:42::-;;;:::i;:::-;;;;;;;;;;;;;;;;11066:171;;;:::i;:::-;;;;-1:-1:-1;;;;;11066:171:0;;;;;;;;;;;;;;7718:29;;;:::i;7517:::-;;;:::i;21220:1281::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19958:210;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19958:210:0;-1:-1:-1;;;;;19958:210:0;;:::i;22587:100::-;;;:::i;27415:207::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27415:207:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;9164:39;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9164:39:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5234:87;;;:::i;7887:37::-;;;:::i;3829:116::-;;;:::i;7754:33::-;;;:::i;20276:101::-;;;:::i;7844:36::-;;;:::i;7590:28::-;;;:::i;14265:105::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14265:105:0;;:::i;23520:1115::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23520:1115:0;;;;;;;:::i;3170:72::-;;;:::i;3472:85::-;;;:::i;10881:102::-;;;:::i;22775:104::-;;;:::i;22949:109::-;;;:::i;13991:98::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13991:98:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;13991:98:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;13991:98:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;13991:98:0;;-1:-1:-1;13991:98:0;-1:-1:-1;13991:98:0;:::i;7553:30::-;;;:::i;4112:103::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4112:103:0;-1:-1:-1;;;;;4112:103:0;;:::i;24891:912::-;;;:::i;20618:101::-;;;:::i;11413:121::-;11485:41;11495:10;11507;11519:6;11485:9;:41::i;:::-;11413:121;;;:::o;11806:142::-;3363:9;:7;:9::i;:::-;3355:18;;;;;;11905:35;11915:10;11927:4;11933:6;11905:9;:35::i;:::-;11806:142;;;;:::o;7669:42::-;7710:1;7669:42;:::o;11066:171::-;11170:11;;:19;;;-1:-1:-1;;;11170:19:0;;;;11119:6;;-1:-1:-1;;;;;11170:11:0;;:17;;:19;;;;;;;;;;;;;;:11;:19;;;5:2:-1;;;;30:1;27;20:12;5:2;11170:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11170:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11170:19:0;11145:13;;:21;;;-1:-1:-1;;;11145:21:0;;;;-1:-1:-1;;;;;11145:44:0;;;;:13;;;;:19;;:21;;;;;11170:19;;11145:21;;;;;;;;:13;:21;;;5:2:-1;;;;30:1;27;20:12;5:2;11145:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11145:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11145:21:0;-1:-1:-1;;;;;11145:44:0;;11138:52;;;;11208:13;;;;;;;;;-1:-1:-1;;;;;11208:13:0;-1:-1:-1;;;;;11208:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11208:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11208:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11208:21:0;;-1:-1:-1;11066:171:0;;:::o;7718:29::-;;;;:::o;7517:::-;;;-1:-1:-1;;;;;7517:29:0;;:::o;21220:1281::-;21274:7;21283;21292;21301;21310;21319;21341:14;:12;:14::i;:::-;;21398:30;21444:88;21513:18;;21444:50;21466:27;;21444:3;:21;;:50;;;;:::i;:::-;:68;:88;:68;:88;:::i;:::-;21571:25;;21398:134;;-1:-1:-1;21571:53:0;;21398:134;21571:53;:29;:53;:::i;:::-;21543:25;:81;21665:3;21635:27;:33;;;21749:10;-1:-1:-1;21737:23:0;;;:11;:23;;;;;21896:20;;21843:33;;;;21737:23;;21821:96;;:56;;21665:3;21821:56;:21;:56;:::i;:96::-;21970:26;;;;21771:146;;-1:-1:-1;21970:72:0;;21771:146;21970:72;:44;:72;:::i;:::-;21928:26;;;:114;22089:3;22053:33;;;:39;22133:25;;-1:-1:-1;;22132:142:0;;22273:1;22132:142;;;22179:78;22231:25;;22179:47;22199:6;:26;;;22179:15;:13;:15::i;:47::-;:51;:78;:51;:78;:::i;:::-;22105:169;;22309:13;:11;:13::i;:::-;22337:15;:13;:15::i;:::-;22367:26;;;;;22408:25;;22287:206;;;;-1:-1:-1;22367:26:0;-1:-1:-1;22408:25:0;-1:-1:-1;22448:16:0;-1:-1:-1;22479:3:0;;-1:-1:-1;21220:1281:0;;-1:-1:-1;;;21220:1281:0:o;19958:210::-;20017:7;20065:1;20044:18;;:22;:116;;20159:1;20044:116;;;20137:18;;-1:-1:-1;;;;;20100:17:0;;;;;;:11;:17;;;;;:31;20082:74;;20137:18;20082:50;;:13;:11;:13::i;:74::-;20037:123;;19958:210;;;;:::o;22587:100::-;22658:11;;:21;;;-1:-1:-1;;;22658:21:0;;;;22631:7;;-1:-1:-1;;;;;22658:11:0;;:19;;:21;;;;;;;;;;;;;;:11;:21;;;5:2:-1;;;;30:1;27;20:12;27415:207:0;27537:4;3363:9;:7;:9::i;:::-;3355:18;;;;;;27563:12;;:51;;;-1:-1:-1;;;27563:51:0;;-1:-1:-1;;;;;27563:51:0;;;;;;;;;;;;;;;;;;;;;;:12;;;;;:24;;:51;;;;;;;;;;;;;;:12;;:51;;;5:2:-1;;;;30:1;27;20:12;5:2;27563:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27563:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27563:51:0;;-1:-1:-1;3380:1:0;27415:207;;;;;:::o;9164:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9164:39:0;;;;;:::o;5234:87::-;5284:4;5234:87;:::o;7887:37::-;;;;:::o;3829:116::-;3363:9;:7;:9::i;:::-;3355:18;;;;;;3906:6;;;3887:26;;-1:-1:-1;;;;;3906:6:0;;;;3887:26;;;3937:1;3920:19;;-1:-1:-1;;;;;;3920:19:0;;;3829:116::o;7754:33::-;;;;:::o;20276:101::-;20347:12;;:22;;;-1:-1:-1;;;20347:22:0;;;;20320:7;;-1:-1:-1;;;;;20347:12:0;;:20;;:22;;;;;;;;;;;;;;:12;:22;;;5:2:-1;;;;30:1;27;20:12;7844:36:0;;;;:::o;7590:28::-;;;-1:-1:-1;;;;;7590:28:0;;:::o;14265:105::-;14319:7;14346:16;14355:6;14346:8;:16::i;23520:1115::-;3363:9;:7;:9::i;:::-;3355:18;;;;;;23640:19;;23615:15;:22;:44;23607:111;;;;-1:-1:-1;;;23607:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23809:18;:16;:18::i;:::-;;;;;;;23840:20;23863:13;:11;:13::i;:::-;23840:36;;23887:26;23932:1;23917:12;:16;23916:131;;24024:22;;24013:34;;:6;;:34;:10;:34;:::i;:::-;23916:131;;;23950:47;23984:12;23950:29;23972:6;23950:17;;:21;;:29;;;;:::i;:47::-;23887:160;;24060:30;;:::i;:::-;24101:49;;;24195:3;24161:31;;;:37;;;24229:20;;24237:11;24229:20;:7;:20;:::i;:::-;24209:17;;;:40;;;24260:20;;;:34;;;24305:15;27:10:-1;;39:1;23:18;;45:23;;-1:-1;24305:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24368:17;;:41;;24390:18;24368:21;:41::i;:::-;24348:17;:61;24430:11;;:19;;;-1:-1:-1;;;24430:19:0;;;;-1:-1:-1;;;;;24430:11:0;;;;:17;;:19;;;;;;;;;;;;;;;:11;:19;;;5:2:-1;;;;30:1;27;20:12;5:2;24430:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24430:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24430:19:0;24483:11;;24430:74;;;-1:-1:-1;;;24430:74:0;;24463:10;24430:74;;;;-1:-1:-1;;;;;24483:11:0;;;24430:74;;;;;;;;;;;;:32;;;;;;;:74;;;;;:19;;:74;;;;;;;24483:11;24430:32;:74;;;5:2:-1;;;;30:1;27;20:12;5:2;24430:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24430:74:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24430:74:0;24422:141;;;;-1:-1:-1;;;24422:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24579:48;24592:6;24600:11;24613:13;:11;:13::i;:::-;24579:48;;;;;;;;;;;;;;;;;;;;;;;;;;3380:1;;;23520:1115;;:::o;3170:72::-;3207:7;3230:6;-1:-1:-1;;;;;3230:6:0;3170:72;:::o;3472:85::-;3511:4;3545:6;-1:-1:-1;;;;;3545:6:0;3531:10;:20;;3472:85::o;10881:102::-;10955:12;;:20;;;-1:-1:-1;;;10955:20:0;;;;10929:6;;-1:-1:-1;;;;;10955:12:0;;:18;;:20;;;;;;;;;;;;;;:12;:20;;;5:2:-1;;;;30:1;27;20:12;22775:104:0;22848:13;;:23;;;-1:-1:-1;;;22848:23:0;;;;22821:7;;-1:-1:-1;;;;;22848:13:0;;:21;;:23;;;;;;;;;;;;;;:13;:23;;;5:2:-1;;;;30:1;27;20:12;22949:109:0;23028:15;:22;22949:109;:::o;13991:98::-;14065:16;14074:6;14065:8;:16::i;7553:30::-;;;-1:-1:-1;;;;;7553:30:0;;:::o;4112:103::-;3363:9;:7;:9::i;:::-;3355:18;;;;;;4181:28;4200:8;4181:18;:28::i;:::-;4112:103;:::o;24891:912::-;24931:7;;;25011:13;:11;:13::i;:::-;24988:36;;25041:17;;25062:1;25041:22;25037:464;;;25097:12;25080:29;;25037:464;;;25142:22;;25183:148;25207:15;:22;25203:26;;25183:148;;;25272:43;25291:23;25312:1;25291:20;:23::i;:::-;25272:14;;:43;:18;:43;:::i;:::-;25255:60;-1:-1:-1;25231:3:0;;25183:148;;;-1:-1:-1;25399:17:0;;25362:55;;:32;:14;25381:12;25362:32;:18;:32;:::i;:55::-;25452:17;;25345:72;;-1:-1:-1;25452:37:0;;25474:14;25452:37;:21;:37;:::i;:::-;25432:17;:57;-1:-1:-1;25037:464:0;25517:18;;25513:249;;25560:11;;25589:13;;25560:60;;;-1:-1:-1;;;25560:60:0;;-1:-1:-1;;;;;25589:13:0;;;25560:60;;;;;;;;;;;;:11;;;;;:20;;:60;;;;;;;;;;;;;;:11;;:60;;;5:2:-1;;;;30:1;27;20:12;5:2;25560:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25560:60:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25560:60:0;25552:133;;;;-1:-1:-1;;;25552:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25705:45;25720:14;25736:13;:11;:13::i;:::-;25705:45;;;;;;;;;;;;;;;;;;;;;;25513:249;-1:-1:-1;25781:14:0;-1:-1:-1;24891:912:0;:::o;20618:101::-;20658:7;20693:17;:15;:17::i;:::-;20678:33;;20618:101;:::o;12235:1487::-;12343:1;12334:6;:10;12326:52;;;;;-1:-1:-1;;;12326:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12397:25:0;;12389:74;;;;-1:-1:-1;;;12389:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12482:18;;:23;;:44;;;12525:1;12509:13;:11;:13::i;:::-;:17;12482:44;12474:144;;;;-1:-1:-1;;;12474:144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12631:27;12683:1;12662:18;;:22;12661:139;;12777:22;;12766:34;;:6;;:34;:10;:34;:::i;:::-;12661:139;;;12701:49;12736:13;:11;:13::i;:::-;12701:18;;:30;;12724:6;12701:30;:22;:30;:::i;:49::-;12631:169;;12841:1;12819:19;:23;12811:70;;;;-1:-1:-1;;;12811:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12894:18;:16;:18::i;:::-;-1:-1:-1;;;;;;;;;12984:24:0;;12956:25;12984:24;;;:11;:24;;;;;13042:20;;12984:24;;-1:-1:-1;13042:45:0;;-1:-1:-1;13067:19:0;13042:24;:45::i;:::-;13019:68;;13134:3;13098:33;;;:39;13150:21;;:::i;:::-;-1:-1:-1;13174:31:0;;;;;;;;;;;13201:3;13174:31;;;;;;;-1:-1:-1;;;;;13216:24:0;;-1:-1:-1;13216:24:0;;;:11;:24;;;;;27:10:-1;;39:1;23:18;;;45:23;;13216:39:0;;;;;;;;;;;;;;;;;;;;;;;;;13322:18;;:43;;13180:19;13322:43;:22;:43;:::i;:::-;13301:18;:64;13504:12;;:20;;;-1:-1:-1;;;13504:20:0;;;;-1:-1:-1;;;;;13504:12:0;;;;:18;;:20;;;;;;;;;;;;;;;:12;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;13504:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13504:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13504:20:0;13554:12;;13504:72;;;-1:-1:-1;;;13504:72:0;;-1:-1:-1;;;;;13504:72:0;;;;;;;13554:12;;;13504:72;;;;;;;;;;;;:33;;;;;;;:72;;;;;:20;;:72;;;;;;;13554:12;13504:33;:72;;;5:2:-1;;;;30:1;27;20:12;5:2;13504:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13504:72:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13504:72:0;13496:140;;;;-1:-1:-1;;;13496:140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13661:11;-1:-1:-1;;;;;13654:60:0;;13674:6;13682:27;13697:11;13682:14;:27::i;:::-;13654:60;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13654:60:0;;;;;;;;;;;;;12235:1487;;;;;;:::o;1119:136::-;1177:7;1206:1;1201;:6;;1193:15;;;;;;-1:-1:-1;1227:5:0;;;1119:136;;;;;:::o;217:393::-;275:7;503:6;499:37;;-1:-1:-1;527:1:0;520:8;;499:37;556:5;;;560:1;556;:5;:1;576:5;;;;;:10;568:19;;;;;1323:136;1381:7;1409:5;;;1429:6;;;;1421:15;;;;;725:276;783:7;811:1;807;:5;799:14;;;;;;878:9;894:1;890;:5;;;;;;;725:276;-1:-1:-1;;;;725:276:0:o;14675:3343::-;14726:7;14746:18;:16;:18::i;:::-;;;;;;;14813:1;14804:6;:10;14796:54;;;;;-1:-1:-1;;;14796:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14899:6;14869:26;14884:10;14869:14;:26::i;:::-;:36;;14861:119;;;;-1:-1:-1;;;14861:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14991:27;15021:49;15056:13;:11;:13::i;:::-;15021:18;;:30;;15044:6;15021:30;:22;:30;:::i;:49::-;14991:79;;15111:1;15089:19;:23;15081:80;;;;-1:-1:-1;;;15081:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15245:10;15205:25;15233:23;;;:11;:23;;;;;;;;15299:11;:23;;;;;15233;;15478:19;15205:25;15543:1298;15550:20;;15543:1298;;15627:20;;15587:23;;15613:13;;-1:-1:-1;;15627:24:0;;;15613:39;;;;;;;;;;;;;;;;15587:65;;15667:20;15690:31;15698:9;:22;;;15690:3;:7;;:31;;;;:::i;:::-;15795:23;;15667:54;;-1:-1:-1;15736:36:0;;15795:43;-1:-1:-1;15791:1039:0;;15936:23;;:41;;15964:12;15936:41;:27;:41;:::i;:::-;15905:72;;16011:74;16028:12;16042:28;16072:12;16011:16;:74::i;:::-;15996:89;-1:-1:-1;16132:59:0;:25;16162:28;16132:59;:29;:59;:::i;:::-;16250:23;;16104:87;;-1:-1:-1;16229:45:0;;:16;;:45;:20;:45;:::i;:::-;16293:22;;16210:64;;-1:-1:-1;16293:22:0;:13;-1:-1:-1;;16293:22:0;;;:::i;:::-;;15791:1039;;;16437:34;:16;16458:12;16437:34;:20;:34;:::i;:::-;16406:65;;16505:74;16522:12;16536:28;16566:12;16505:16;:74::i;:::-;16490:89;-1:-1:-1;16626:59:0;:25;16656:28;16626:59;:29;:59;:::i;:::-;16730:23;;16598:87;;-1:-1:-1;16730:45:0;;16758:16;16730:45;:27;:45;:::i;:::-;16704:71;;:23;;-1:-1:-1;15791:1039:0;15543:1298;;;;;;16880:26;;;;:57;;16911:25;16880:57;:30;:57;:::i;:::-;16851:26;;;:86;16971:20;;:45;;16996:19;16971:45;:24;:45;:::i;:::-;16948:68;;17187:25;;:56;;17217:25;17187:56;:29;:56;:::i;:::-;17159:25;:84;17275:18;;:43;;17298:19;17275:43;:22;:43;:::i;:::-;17254:18;:64;17455:12;;:41;;;-1:-1:-1;;;17455:41:0;;17477:10;17455:41;;;;;;;;;;;;-1:-1:-1;;;;;17455:12:0;;;;:21;;:41;;;;;;;;;;;;;;;:12;;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;17455:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17455:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17455:41:0;17447:111;;;;-1:-1:-1;;;17447:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17577:13;;:48;;;-1:-1:-1;;;17577:48:0;;17600:10;17577:48;;;;;;;;;;;;-1:-1:-1;;;;;17577:13:0;;;;:22;;:48;;;;;;;;;;;;;;;:13;;:48;;;5:2:-1;;;;30:1;27;20:12;5:2;17577:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17577:48:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17577:48:0;17569:119;;;;-1:-1:-1;;;17569:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17715:10;17706:60;17727:6;17735:26;17715:10;17735:14;:26::i;:::-;17706:60;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17706:60:0;;;;;;;;;;;;;17782:39;;;;;;;;17796:10;;17782:39;;;;;;;;;;17842:18;;:23;;:44;;;17885:1;17869:13;:11;:13::i;:::-;:17;17842:44;17834:146;;;;-1:-1:-1;;;17834:146:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17998:12;14675:3343;-1:-1:-1;;;;;;;14675:3343:0:o;4355:173::-;-1:-1:-1;;;;;4425:22:0;;4417:31;;;;;;4481:6;;;4460:38;;-1:-1:-1;;;;;4460:38:0;;;;4481:6;;;4460:38;;;4505:6;:17;;-1:-1:-1;;;;;;4505:17:0;-1:-1:-1;;;;;4505:17:0;;;;;;;;;;4355:173::o;26173:920::-;26231:7;26251:31;26285:15;26301:1;26285:18;;;;;;;;;;;;;;;;;;26251:52;;26346:8;:28;;;26319:8;:23;;;:55;26316:95;;26398:1;26391:8;;;;;26316:95;26546:17;;;;26423:22;;26539:3;:24;26535:437;;26631:23;;;;26598:28;;:57;;;:32;:57;:::i;:::-;26705:17;;;;26671:31;;;:51;26580:76;-1:-1:-1;26535:437:0;;;26772:136;26887:8;:20;;;26772:92;26835:8;:28;;;26772:40;26780:8;:31;;;26772:3;:7;;:40;;;;:::i;:136::-;26957:3;26923:31;;;:37;26755:153;-1:-1:-1;26535:437:0;27010:23;;;;:43;;27038:14;27010:43;:27;:43;:::i;:::-;26984:23;;;;:69;;;;27071:14;-1:-1:-1;26173:920:0;;;:::o;18994:808::-;19188:7;19210:23;19249:99;19322:25;;19249:54;19283:19;19249:15;:13;:15::i;:99::-;19210:138;;19381:14;;19365:12;:30;19361:110;;19419:40;:19;19443:15;19419:40;:23;:40;:::i;:::-;19412:47;;;;;19361:110;19483:21;7710:1;19507:2;:18;19483:42;;19536:21;19573:165;19724:13;19573:132;19689:15;19573:97;19602:67;19654:14;;19602:47;19636:12;19602:29;19620:10;;19602:13;:17;;:29;;;;:::i;:67::-;19573:10;;;:97;:28;:97;:::i;:165::-;19536:202;-1:-1:-1;19756:38:0;:19;19536:202;19756:38;:23;:38;:::i;7006:20619::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://4218c4b1c95dd3e6faefdaf555019a8ea6a8260055659224a18de7a07faed9e5
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.