Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 3,576 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Unstake | 21258324 | 31 days ago | IN | 0 ETH | 0.00072159 | ||||
Unstake | 20841373 | 89 days ago | IN | 0 ETH | 0.00122148 | ||||
Unstake | 19973194 | 210 days ago | IN | 0 ETH | 0.00081216 | ||||
Unstake | 19888072 | 222 days ago | IN | 0 ETH | 0.00031904 | ||||
Redeem Rewards | 19888069 | 222 days ago | IN | 0 ETH | 0.00049765 | ||||
Unstake | 19861652 | 226 days ago | IN | 0 ETH | 0.00182594 | ||||
Redeem Rewards | 19861649 | 226 days ago | IN | 0 ETH | 0.00142772 | ||||
Redeem Rewards | 19861648 | 226 days ago | IN | 0 ETH | 0.00143926 | ||||
Unstake | 19742432 | 242 days ago | IN | 0 ETH | 0.00064339 | ||||
Unstake | 19452799 | 283 days ago | IN | 0 ETH | 0.00241696 | ||||
Redeem Rewards | 19452795 | 283 days ago | IN | 0 ETH | 0.00177002 | ||||
Redeem Rewards | 19452746 | 283 days ago | IN | 0 ETH | 0.00173971 | ||||
Redeem Rewards | 19452645 | 283 days ago | IN | 0 ETH | 0.00178227 | ||||
Redeem Rewards | 19452641 | 283 days ago | IN | 0 ETH | 0.00172438 | ||||
Stake | 19425847 | 287 days ago | IN | 0 ETH | 0.00600291 | ||||
Unstake | 19422538 | 287 days ago | IN | 0 ETH | 0.00408962 | ||||
Redeem Rewards | 19422513 | 287 days ago | IN | 0 ETH | 0.00350421 | ||||
Redeem Rewards | 19422504 | 287 days ago | IN | 0 ETH | 0.00326179 | ||||
Stake | 19422497 | 287 days ago | IN | 0 ETH | 0.00430385 | ||||
Unstake | 19422485 | 287 days ago | IN | 0 ETH | 0.00444265 | ||||
Redeem Rewards | 19019707 | 344 days ago | IN | 0 ETH | 0.00341257 | ||||
Redeem Rewards | 18905014 | 360 days ago | IN | 0 ETH | 0.00085383 | ||||
Unstake | 18832685 | 370 days ago | IN | 0 ETH | 0.00291567 | ||||
Redeem Rewards | 18751064 | 381 days ago | IN | 0 ETH | 0.00223483 | ||||
Unstake | 18578729 | 405 days ago | IN | 0 ETH | 0.00404358 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
StakingPools
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-12 */ // Sources flattened with hardhat v2.6.8 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.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. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File @openzeppelin/contracts/access/[email protected] pragma solidity >=0.6.0 <0.8.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. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * 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. */ abstract 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 { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the 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 virtual 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 virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File @openzeppelin/contracts/math/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } // File @openzeppelin/contracts/math/[email protected] pragma solidity >=0.6.0 <0.8.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, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @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) { 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, reverting 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) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File contracts/interfaces/IStakingPoolMigrator.sol pragma solidity ^0.7.6; interface IStakingPoolMigrator { function migrate( uint256 poolId, address oldToken, uint256 amount ) external returns (address); } // File contracts/interfaces/IStakingPoolRewarder.sol pragma solidity ^0.7.6; interface IStakingPoolRewarder { function onReward( uint256 poolId, address user, uint256 amount ) external; } // File contracts/StakingPools.sol pragma solidity ^0.7.6; /** * @title StakingPools * * @dev A contract for staking Uniswap LP tokens in exchange for locked CONV rewards. * No actual CONV tokens will be held or distributed by this contract. Only the amounts * are accumulated. * * @dev The `migrator` in this contract has access to users' staked tokens. Any changes * to the migrator address will only take effect after a delay period specified at contract * creation. * * @dev This contract interacts with token contracts via `safeApprove`, `safeTransfer`, * and `safeTransferFrom` instead of the standard Solidity interface so that some non-ERC20- * compatible tokens (e.g. Tether) can also be staked. */ contract StakingPools is Ownable { using SafeMath for uint256; event PoolCreated( uint256 indexed poolId, address indexed token, uint256 startBlock, uint256 endBlock, uint256 migrationBlock, uint256 rewardPerBlock ); event PoolEndBlockExtended(uint256 indexed poolId, uint256 oldEndBlock, uint256 newEndBlock); event PoolMigrationBlockExtended(uint256 indexed poolId, uint256 oldMigrationBlock, uint256 newMigrationBlock); event PoolRewardRateChanged(uint256 indexed poolId, uint256 oldRewardPerBlock, uint256 newRewardPerBlock); event MigratorChangeProposed(address newMigrator); event MigratorChanged(address oldMigrator, address newMigrator); event RewarderChanged(address oldRewarder, address newRewarder); event PoolMigrated(uint256 indexed poolId, address oldToken, address newToken); event Staked(uint256 indexed poolId, address indexed staker, address token, uint256 amount); event Unstaked(uint256 indexed poolId, address indexed staker, address token, uint256 amount); event RewardRedeemed(uint256 indexed poolId, address indexed staker, address rewarder, uint256 amount); /** * @param startBlock the block from which reward accumulation starts * @param endBlock the block from which reward accumulation stops * @param migrationBlock the block since which LP token migration can be triggered * @param rewardPerBlock total amount of token to be rewarded in a block * @param poolToken token to be staked */ struct PoolInfo { uint256 startBlock; uint256 endBlock; uint256 migrationBlock; uint256 rewardPerBlock; address poolToken; } /** * @param totalStakeAmount total amount of staked tokens * @param accuRewardPerShare accumulated rewards for a single unit of token staked, multiplied by `ACCU_REWARD_MULTIPLIER` * @param accuRewardLastUpdateBlock the block number at which the `accuRewardPerShare` field was last updated */ struct PoolData { uint256 totalStakeAmount; uint256 accuRewardPerShare; uint256 accuRewardLastUpdateBlock; } /** * @param stakeAmount amount of token the user stakes * @param pendingReward amount of reward to be redeemed by the user up to the user's last action * @param entryAccuRewardPerShare the `accuRewardPerShare` value at the user's last stake/unstake action */ struct UserData { uint256 stakeAmount; uint256 pendingReward; uint256 entryAccuRewardPerShare; } /** * @param proposeTime timestamp when the change is proposed * @param newMigrator new migrator address */ struct PendingMigratorChange { uint64 proposeTime; address newMigrator; } uint256 public lastPoolId; // The first pool has ID of 1 IStakingPoolMigrator public migrator; uint256 public migratorSetterDelay; PendingMigratorChange public pendingMigrator; IStakingPoolRewarder public rewarder; mapping(uint256 => PoolInfo) public poolInfos; mapping(uint256 => PoolData) public poolData; mapping(uint256 => mapping(address => UserData)) public userData; uint256 private constant ACCU_REWARD_MULTIPLIER = 10**20; // Precision loss prevention bytes4 private constant TRANSFER_SELECTOR = bytes4(keccak256(bytes("transfer(address,uint256)"))); bytes4 private constant APPROVE_SELECTOR = bytes4(keccak256(bytes("approve(address,uint256)"))); bytes4 private constant TRANSFERFROM_SELECTOR = bytes4(keccak256(bytes("transferFrom(address,address,uint256)"))); modifier onlyPoolExists(uint256 poolId) { require(poolInfos[poolId].endBlock > 0, "StakingPools: pool not found"); _; } modifier onlyPoolActive(uint256 poolId) { require( block.number >= poolInfos[poolId].startBlock && block.number < poolInfos[poolId].endBlock, "StakingPools: pool not active" ); _; } modifier onlyPoolNotEnded(uint256 poolId) { require(block.number < poolInfos[poolId].endBlock, "StakingPools: pool ended"); _; } function getReward(uint256 poolId, address staker) external view returns (uint256) { UserData memory currentUserData = userData[poolId][staker]; PoolInfo memory currentPoolInfo = poolInfos[poolId]; PoolData memory currentPoolData = poolData[poolId]; uint256 latestAccuRewardPerShare = currentPoolData.totalStakeAmount > 0 ? currentPoolData.accuRewardPerShare.add( Math .min(block.number, currentPoolInfo.endBlock) .sub(currentPoolData.accuRewardLastUpdateBlock) .mul(currentPoolInfo.rewardPerBlock) .mul(ACCU_REWARD_MULTIPLIER) .div(currentPoolData.totalStakeAmount) ) : currentPoolData.accuRewardPerShare; return currentUserData.pendingReward.add( currentUserData.stakeAmount.mul(latestAccuRewardPerShare.sub(currentUserData.entryAccuRewardPerShare)).div( ACCU_REWARD_MULTIPLIER ) ); } constructor(uint256 _migratorSetterDelay) { require(_migratorSetterDelay > 0, "StakingPools: zero setter delay"); migratorSetterDelay = _migratorSetterDelay; } function createPool( address token, uint256 startBlock, uint256 endBlock, uint256 migrationBlock, uint256 rewardPerBlock ) external onlyOwner { require(token != address(0), "StakingPools: zero address"); require( startBlock > block.number && endBlock > startBlock && migrationBlock > startBlock, "StakingPools: invalid block range" ); require(rewardPerBlock > 0, "StakingPools: reward must be positive"); uint256 newPoolId = ++lastPoolId; poolInfos[newPoolId] = PoolInfo({ startBlock: startBlock, endBlock: endBlock, migrationBlock: migrationBlock, rewardPerBlock: rewardPerBlock, poolToken: token }); poolData[newPoolId] = PoolData({totalStakeAmount: 0, accuRewardPerShare: 0, accuRewardLastUpdateBlock: startBlock}); emit PoolCreated(newPoolId, token, startBlock, endBlock, migrationBlock, rewardPerBlock); } function extendEndBlock(uint256 poolId, uint256 newEndBlock) external onlyOwner onlyPoolExists(poolId) onlyPoolNotEnded(poolId) { uint256 currentEndBlock = poolInfos[poolId].endBlock; require(newEndBlock > currentEndBlock, "StakingPools: end block not extended"); poolInfos[poolId].endBlock = newEndBlock; emit PoolEndBlockExtended(poolId, currentEndBlock, newEndBlock); } function extendMigrationBlock(uint256 poolId, uint256 newMigrationBlock) external onlyOwner onlyPoolExists(poolId) onlyPoolNotEnded(poolId) { uint256 currentMigrationBlock = poolInfos[poolId].migrationBlock; require(newMigrationBlock > currentMigrationBlock, "StakingPools: migration block not extended"); poolInfos[poolId].migrationBlock = newMigrationBlock; emit PoolMigrationBlockExtended(poolId, currentMigrationBlock, newMigrationBlock); } function setPoolReward(uint256 poolId, uint256 newRewardPerBlock) external onlyOwner onlyPoolExists(poolId) onlyPoolNotEnded(poolId) { if (block.number >= poolInfos[poolId].startBlock) { // "Settle" rewards up to this block _updatePoolAccuReward(poolId); } // We're deliberately allowing setting the reward rate to 0 here. If it turns // out this, or even changing rates at all, is undesirable after deployment, the // ownership of this contract can be transferred to a contract incapable of making // calls to this function. uint256 currentRewardPerBlock = poolInfos[poolId].rewardPerBlock; poolInfos[poolId].rewardPerBlock = newRewardPerBlock; emit PoolRewardRateChanged(poolId, currentRewardPerBlock, newRewardPerBlock); } function proposeMigratorChange(address newMigrator) external onlyOwner { pendingMigrator = PendingMigratorChange({proposeTime: uint64(block.timestamp), newMigrator: newMigrator}); emit MigratorChangeProposed(newMigrator); } function executeMigratorChange() external { require(pendingMigrator.proposeTime > 0, "StakingPools: migrator change proposal not found"); require( block.timestamp >= uint256(pendingMigrator.proposeTime).add(migratorSetterDelay), "StakingPools: migrator setter delay not passed" ); address oldMigrator = address(migrator); migrator = IStakingPoolMigrator(pendingMigrator.newMigrator); // Clear storage pendingMigrator = PendingMigratorChange({proposeTime: 0, newMigrator: address(0)}); emit MigratorChanged(oldMigrator, address(migrator)); } function setRewarder(address newRewarder) external onlyOwner { address oldRewarder = address(rewarder); rewarder = IStakingPoolRewarder(newRewarder); emit RewarderChanged(oldRewarder, newRewarder); } function migratePool(uint256 poolId) external onlyPoolExists(poolId) { require(address(migrator) != address(0), "StakingPools: migrator not set"); PoolInfo memory currentPoolInfo = poolInfos[poolId]; PoolData memory currentPoolData = poolData[poolId]; require(block.number >= currentPoolInfo.migrationBlock, "StakingPools: migration block not reached"); safeApprove(currentPoolInfo.poolToken, address(migrator), currentPoolData.totalStakeAmount); // New token balance is not validated here since the migrator can do whatever // it wants anyways (including providing a fake token address with fake balance). // It's the migrator contract's responsibility to ensure tokens are properly migrated. address newToken = migrator.migrate(poolId, address(currentPoolInfo.poolToken), uint256(currentPoolData.totalStakeAmount)); require(newToken != address(0), "StakingPools: zero new token address"); poolInfos[poolId].poolToken = newToken; emit PoolMigrated(poolId, currentPoolInfo.poolToken, newToken); } function stake(uint256 poolId, uint256 amount) external onlyPoolExists(poolId) onlyPoolActive(poolId) { _updatePoolAccuReward(poolId); _updateStakerReward(poolId, msg.sender); _stake(poolId, msg.sender, amount); } function unstake(uint256 poolId, uint256 amount) external onlyPoolExists(poolId) { _updatePoolAccuReward(poolId); _updateStakerReward(poolId, msg.sender); _unstake(poolId, msg.sender, amount); } function emergencyUnstake(uint256 poolId) external onlyPoolExists(poolId) { _unstake(poolId, msg.sender, userData[poolId][msg.sender].stakeAmount); // Forfeit user rewards to avoid abuse userData[poolId][msg.sender].pendingReward = 0; } function redeemRewards(uint256 poolId) external onlyPoolExists(poolId) { redeemRewardsByAddress(poolId, msg.sender); } function redeemRewardsByAddress(uint256 poolId, address user) public onlyPoolExists(poolId) { require(user != address(0), "StakingPools: zero address"); _updatePoolAccuReward(poolId); _updateStakerReward(poolId, user); require(address(rewarder) != address(0), "StakingPools: rewarder not set"); uint256 rewardToRedeem = userData[poolId][user].pendingReward; require(rewardToRedeem > 0, "StakingPools: no reward to redeem"); userData[poolId][user].pendingReward = 0; rewarder.onReward(poolId, user, rewardToRedeem); emit RewardRedeemed(poolId, user, address(rewarder), rewardToRedeem); } function _stake( uint256 poolId, address user, uint256 amount ) private { require(amount > 0, "StakingPools: cannot stake zero amount"); userData[poolId][user].stakeAmount = userData[poolId][user].stakeAmount.add(amount); poolData[poolId].totalStakeAmount = poolData[poolId].totalStakeAmount.add(amount); safeTransferFrom(poolInfos[poolId].poolToken, user, address(this), amount); emit Staked(poolId, user, poolInfos[poolId].poolToken, amount); } function _unstake( uint256 poolId, address user, uint256 amount ) private { require(amount > 0, "StakingPools: cannot unstake zero amount"); // No sufficiency check required as sub() will throw anyways userData[poolId][user].stakeAmount = userData[poolId][user].stakeAmount.sub(amount); poolData[poolId].totalStakeAmount = poolData[poolId].totalStakeAmount.sub(amount); safeTransfer(poolInfos[poolId].poolToken, user, amount); emit Unstaked(poolId, user, poolInfos[poolId].poolToken, amount); } function _updatePoolAccuReward(uint256 poolId) private { PoolInfo storage currentPoolInfo = poolInfos[poolId]; PoolData storage currentPoolData = poolData[poolId]; uint256 appliedUpdateBlock = Math.min(block.number, currentPoolInfo.endBlock); uint256 durationInBlocks = appliedUpdateBlock.sub(currentPoolData.accuRewardLastUpdateBlock); // This saves tx cost when being called multiple times in the same block if (durationInBlocks > 0) { // No need to update the rate if no one staked at all if (currentPoolData.totalStakeAmount > 0) { currentPoolData.accuRewardPerShare = currentPoolData.accuRewardPerShare.add( durationInBlocks.mul(currentPoolInfo.rewardPerBlock).mul(ACCU_REWARD_MULTIPLIER).div( currentPoolData.totalStakeAmount ) ); } currentPoolData.accuRewardLastUpdateBlock = appliedUpdateBlock; } } function _updateStakerReward(uint256 poolId, address staker) private { UserData storage currentUserData = userData[poolId][staker]; PoolData storage currentPoolData = poolData[poolId]; uint256 stakeAmount = currentUserData.stakeAmount; uint256 stakerEntryRate = currentUserData.entryAccuRewardPerShare; uint256 accuDifference = currentPoolData.accuRewardPerShare.sub(stakerEntryRate); if (accuDifference > 0) { currentUserData.pendingReward = currentUserData.pendingReward.add( stakeAmount.mul(accuDifference).div(ACCU_REWARD_MULTIPLIER) ); currentUserData.entryAccuRewardPerShare = currentPoolData.accuRewardPerShare; } } function safeApprove( address token, address spender, uint256 amount ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(APPROVE_SELECTOR, spender, amount)); require(success && (data.length == 0 || abi.decode(data, (bool))), "StakingPools: approve failed"); } function safeTransfer( address token, address recipient, uint256 amount ) private { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(TRANSFER_SELECTOR, recipient, amount)); require(success && (data.length == 0 || abi.decode(data, (bool))), "StakingPools: transfer failed"); } function safeTransferFrom( address token, address sender, address recipient, uint256 amount ) private { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(TRANSFERFROM_SELECTOR, sender, recipient, amount)); require(success && (data.length == 0 || abi.decode(data, (bool))), "StakingPools: transferFrom failed"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_migratorSetterDelay","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newMigrator","type":"address"}],"name":"MigratorChangeProposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldMigrator","type":"address"},{"indexed":false,"internalType":"address","name":"newMigrator","type":"address"}],"name":"MigratorChanged","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":"uint256","name":"poolId","type":"uint256"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"migrationBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"}],"name":"PoolCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldEndBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newEndBlock","type":"uint256"}],"name":"PoolEndBlockExtended","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"address","name":"oldToken","type":"address"},{"indexed":false,"internalType":"address","name":"newToken","type":"address"}],"name":"PoolMigrated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldMigrationBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMigrationBlock","type":"uint256"}],"name":"PoolMigrationBlockExtended","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldRewardPerBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRewardPerBlock","type":"uint256"}],"name":"PoolRewardRateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"address","name":"rewarder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldRewarder","type":"address"},{"indexed":false,"internalType":"address","name":"newRewarder","type":"address"}],"name":"RewarderChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Unstaked","type":"event"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"uint256","name":"migrationBlock","type":"uint256"},{"internalType":"uint256","name":"rewardPerBlock","type":"uint256"}],"name":"createPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"emergencyUnstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"executeMigratorChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"newEndBlock","type":"uint256"}],"name":"extendEndBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"newMigrationBlock","type":"uint256"}],"name":"extendMigrationBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"address","name":"staker","type":"address"}],"name":"getReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPoolId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"migratePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrator","outputs":[{"internalType":"contract IStakingPoolMigrator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"migratorSetterDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingMigrator","outputs":[{"internalType":"uint64","name":"proposeTime","type":"uint64"},{"internalType":"address","name":"newMigrator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolData","outputs":[{"internalType":"uint256","name":"totalStakeAmount","type":"uint256"},{"internalType":"uint256","name":"accuRewardPerShare","type":"uint256"},{"internalType":"uint256","name":"accuRewardLastUpdateBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfos","outputs":[{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"uint256","name":"migrationBlock","type":"uint256"},{"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"internalType":"address","name":"poolToken","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newMigrator","type":"address"}],"name":"proposeMigratorChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"redeemRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"redeemRewardsByAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewarder","outputs":[{"internalType":"contract IStakingPoolRewarder","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"newRewardPerBlock","type":"uint256"}],"name":"setPoolReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRewarder","type":"address"}],"name":"setRewarder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userData","outputs":[{"internalType":"uint256","name":"stakeAmount","type":"uint256"},{"internalType":"uint256","name":"pendingReward","type":"uint256"},{"internalType":"uint256","name":"entryAccuRewardPerShare","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200334338038062003343833981810160405260208110156200003757600080fd5b5051600062000045620000ee565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060008111620000e5576040805162461bcd60e51b815260206004820152601f60248201527f5374616b696e67506f6f6c733a207a65726f207365747465722064656c617900604482015290519081900360640190fd5b600355620000f2565b3390565b61324180620001026000396000f3fe608060405234801561001057600080fd5b50600436106101a25760003560e01c806372f73499116100ee578063b2ce5df311610097578063dcc3e06e11610071578063dcc3e06e14610510578063ec00208114610518578063f2fde38b14610535578063ff22d24114610568576101a2565b8063b2ce5df31461046f578063b3f2f997146104ba578063d9dbd28d146104ed576101a2565b80638da5cb5b116100c85780638da5cb5b1461043c5780639e2c8a5b14610444578063a657e57914610467576101a2565b806372f73499146103e05780637b0472f0146103e85780637cd07e471461040b576101a2565b80633b61edd3116101505780636ab0f2551161012a5780636ab0f255146103405780637103789414610381578063715018a6146103d8576101a2565b80633b61edd3146102a25780633c634f42146102c5578063689d84e4146102e2576101a2565b80632730661511610181578063273066151461024a57806335f11cc2146102525780633a6462e41461026f576101a2565b80628f33d7146101a7578063012ce501146101f25780630e667f0e14610211575b600080fd5b6101e0600480360360408110156101bd57600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff1661058b565b60408051918252519081900360200190f35b61020f6004803603602081101561020857600080fd5b50356106fb565b005b61020f6004803603604081101561022757600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff166107c0565b61020f610afa565b61020f6004803603602081101561026857600080fd5b5035610c9b565b61020f6004803603602081101561028557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610d28565b61020f600480360360408110156102b857600080fd5b5080359060200135610e58565b61020f600480360360208110156102db57600080fd5b50356110c0565b6102ff600480360360208110156102f857600080fd5b503561149c565b60408051958652602086019490945284840192909252606084015273ffffffffffffffffffffffffffffffffffffffff166080830152519081900360a00190f35b6103486114e1565b6040805167ffffffffffffffff909316835273ffffffffffffffffffffffffffffffffffffffff90911660208301528051918290030190f35b6103ba6004803603604081101561039757600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16611515565b60408051938452602084019290925282820152519081900360600190f35b61020f611541565b6101e0611658565b61020f600480360360408110156103fe57600080fd5b508035906020013561165e565b61041361179c565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6104136117b8565b61020f6004803603604081101561045a57600080fd5b50803590602001356117d4565b6101e0611876565b61020f600480360360a081101561048557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020810135906040810135906060810135906080013561187c565b61020f600480360360208110156104d057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611b9c565b61020f6004803603604081101561050357600080fd5b5080359060200135611d09565b610413611f2d565b6103ba6004803603602081101561052e57600080fd5b5035611f49565b61020f6004803603602081101561054b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611f6a565b61020f6004803603604081101561057e57600080fd5b508035906020013561210b565b600082815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff808616855290835281842082516060808201855282548252600180840154838801526002938401548387015289885260068752858820865160a0810188528154815281830154818a0152818601548189015260038201548185015260049091015490951660808601528988526007875285882086519283018752805480845291810154978301979097529590920154938201939093529192909190849061065c5781602001516106af565b6106af6106a4836000015161069e68056bc75e2d6310000061069888606001516106988960400151610692438d60200151612373565b9061238b565b90612402565b90612475565b6020840151906124f6565b90506106ee6106e368056bc75e2d6310000061069e6106db88604001518661238b90919063ffffffff16565b885190612402565b6020860151906124f6565b9450505050505b92915050565b600081815260066020526040902060010154819061077a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b6000828152600860209081526040808320338085529252909120546107a091849161256a565b506000908152600860209081526040808320338452909152812060010155565b600082815260066020526040902060010154829061083f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff82166108c157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5374616b696e67506f6f6c733a207a65726f2061646472657373000000000000604482015290519081900360640190fd5b6108ca836126f2565b6108d48383612797565b60055473ffffffffffffffffffffffffffffffffffffffff1661095857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f5374616b696e67506f6f6c733a207265776172646572206e6f74207365740000604482015290519081900360640190fd5b600083815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902060010154806109e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806130d96021913960400191505060405180910390fd5b600084815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff8088168086529190935281842060010184905560055482517f7a5f11fa000000000000000000000000000000000000000000000000000000008152600481018a905260248101929092526044820186905291519190921692637a5f11fa926064808201939182900301818387803b158015610a8157600080fd5b505af1158015610a95573d6000803e3d6000fd5b50506005546040805173ffffffffffffffffffffffffffffffffffffffff928316815260208101869052815192881694508893507fef1bb27f27213e5cb8963b669bf571859e849a0b1c0d1135c6932d61a1188ce3929081900390910190a350505050565b60045467ffffffffffffffff16610b5c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806130a96030913960400191505060405180910390fd5b600354600454610b789167ffffffffffffffff909116906124f6565b421015610bd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806131b6602e913960400191505060405180910390fd5b600280546004805473ffffffffffffffffffffffffffffffffffffffff68010000000000000000820481167fffffffffffffffffffffffff00000000000000000000000000000000000000008516179485905560408051808201825260008082526020918201527fffffffff00000000000000000000000000000000000000000000000000000000909316909355825193811680855294169083015280517f57897fe04a846feabc0e56ce4142f7fbd091622a3263e28077ce5fedae906c279281900390910190a150565b6000818152600660205260409020600101548190610d1a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b610d2482336107c0565b5050565b610d30612836565b73ffffffffffffffffffffffffffffffffffffffff16610d4e6117b8565b73ffffffffffffffffffffffffffffffffffffffff1614610dd057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040805191909216808252602082019390935281517f9428ebf8162d9d23f42ee294eb636214dd96f4fab1956b7637f40ff8d414ce73929181900390910190a15050565b610e60612836565b73ffffffffffffffffffffffffffffffffffffffff16610e7e6117b8565b73ffffffffffffffffffffffffffffffffffffffff1614610f0057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000828152600660205260409020600101548290610f7f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b6000838152600660205260409020600101548390431061100057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5374616b696e67506f6f6c733a20706f6f6c20656e6465640000000000000000604482015290519081900360640190fd5b60008481526006602052604090206002015480841161106a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061318c602a913960400191505060405180910390fd5b6000858152600660209081526040918290206002018690558151838152908101869052815187927f59ce6256507da20a008aa4f06f7a4690e99c008a908bf46abe9407444b5444d7928290030190a25050505050565b600081815260066020526040902060010154819061113f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b60025473ffffffffffffffffffffffffffffffffffffffff166111c357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f5374616b696e67506f6f6c733a206d69677261746f72206e6f74207365740000604482015290519081900360640190fd5b6000828152600660209081526040808320815160a0810183528154815260018083015482860152600280840154838601908152600385015460608086019190915260049095015473ffffffffffffffffffffffffffffffffffffffff166080850152898852600787529685902085519485018652805485529182015495840195909552909301549181019190915291519091904310156112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806131636029913960400191505060405180910390fd5b608082015160025482516112d9929173ffffffffffffffffffffffffffffffffffffffff169061283a565b60025460808301518251604080517f4ef88bea0000000000000000000000000000000000000000000000000000000081526004810189905273ffffffffffffffffffffffffffffffffffffffff93841660248201526044810192909252516000939290921691634ef88bea9160648082019260209290919082900301818787803b15801561136657600080fd5b505af115801561137a573d6000803e3d6000fd5b505050506040513d602081101561139057600080fd5b5051905073ffffffffffffffffffffffffffffffffffffffff8116611400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806130fa6024913960400191505060405180910390fd5b60008581526006602090815260409182902060040180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff858116918217909255608087015184519216825291810191909152815187927fb7ede30df1964589448863a66272f2b59b886c3364a82ed9cef9f9e30ab017c3928290030190a25050505050565b600660205260009081526040902080546001820154600283015460038401546004909401549293919290919073ffffffffffffffffffffffffffffffffffffffff1685565b60045467ffffffffffffffff81169068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1682565b600860209081526000928352604080842090915290825290208054600182015460029092015490919083565b611549612836565b73ffffffffffffffffffffffffffffffffffffffff166115676117b8565b73ffffffffffffffffffffffffffffffffffffffff16146115e957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60035481565b60008281526006602052604090206001015482906116dd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b6000838152600660205260409020548390431080159061170d575060008181526006602052604090206001015443105b61177857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420616374697665000000604482015290519081900360640190fd5b611781846126f2565b61178b8433612797565b611796843385612a3f565b50505050565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b600082815260066020526040902060010154829061185357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b61185c836126f2565b6118668333612797565b61187183338461256a565b505050565b60015481565b611884612836565b73ffffffffffffffffffffffffffffffffffffffff166118a26117b8565b73ffffffffffffffffffffffffffffffffffffffff161461192457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff85166119a657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5374616b696e67506f6f6c733a207a65726f2061646472657373000000000000604482015290519081900360640190fd5b43841180156119b457508383115b80156119bf57508382115b611a14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806130886021913960400191505060405180910390fd5b60008111611a6d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806130186025913960400191505060405180910390fd5b6001805481018082556040805160a0810182528781526020808201888152828401888152606080850189815273ffffffffffffffffffffffffffffffffffffffff8e8116608080890182815260008c815260068a528b81209a518b5597518a8e015595516002808b0191909155935160038a01559451600490980180547fffffffffffffffffffffffff00000000000000000000000000000000000000001698909216979097179055865180830188528481528086018581528189018f81528a875260078852958990209151825551998101999099559251979092019690965583518a8152918201899052818401889052810186905291519293909284927f36766c23c4dce64b1651af7bae0782e208b9146d590e780046a7b84c24a74dbf92908290030190a3505050505050565b611ba4612836565b73ffffffffffffffffffffffffffffffffffffffff16611bc26117b8565b73ffffffffffffffffffffffffffffffffffffffff1614611c4457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6040805180820182524267ffffffffffffffff1680825273ffffffffffffffffffffffffffffffffffffffff84166020928301819052600480547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169092177fffffffff0000000000000000000000000000000000000000ffffffffffffffff1668010000000000000000820217909155825190815291517fa29574a23976d25a545c50ae3e198c1eccdd2d6313b17a9c8ec1dc24a20551b59281900390910190a150565b611d11612836565b73ffffffffffffffffffffffffffffffffffffffff16611d2f6117b8565b73ffffffffffffffffffffffffffffffffffffffff1614611db157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000828152600660205260409020600101548290611e3057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b60008381526006602052604090206001015483904310611eb157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5374616b696e67506f6f6c733a20706f6f6c20656e6465640000000000000000604482015290519081900360640190fd5b6000848152600660205260409020544310611ecf57611ecf846126f2565b60008481526006602090815260409182902060030180549086905582518181529182018690528251909287927fe8c0ef92b4d0c5e15388b280719c402b7e9d101833759d5f3d23fcb25cd9593b929081900390910190a25050505050565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b60076020526000908152604090208054600182015460029092015490919083565b611f72612836565b73ffffffffffffffffffffffffffffffffffffffff16611f906117b8565b73ffffffffffffffffffffffffffffffffffffffff161461201257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661207e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806130626026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b612113612836565b73ffffffffffffffffffffffffffffffffffffffff166121316117b8565b73ffffffffffffffffffffffffffffffffffffffff16146121b357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600082815260066020526040902060010154829061223257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b600083815260066020526040902060010154839043106122b357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5374616b696e67506f6f6c733a20706f6f6c20656e6465640000000000000000604482015290519081900360640190fd5b60008481526006602052604090206001015480841161231d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061311e6024913960400191505060405180910390fd5b6000858152600660209081526040918290206001018690558151838152908101869052815187927f4160dc602e30ed6f057cad6503bed525ae1b6b025bffb9e84683d5ecf10f64eb928290030190a25050505050565b60008183106123825781612384565b825b9392505050565b6000828211156123fc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082612411575060006106f5565b8282028284828161241e57fe5b0414612384576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806131426021913960400191505060405180910390fd5b60008082116124e557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816124ee57fe5b049392505050565b60008282018381101561238457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600081116125c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806131e46028913960400191505060405180910390fd5b600083815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546125fd908261238b565b600084815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452825280832093909355858252600790522054612643908261238b565b6000848152600760209081526040808320939093556006905220600401546126829073ffffffffffffffffffffffffffffffffffffffff168383612bc8565b60008381526006602090815260409182902060040154825173ffffffffffffffffffffffffffffffffffffffff918216815291820184905282519085169286927f88567e6595ad345e5250569a2c8d8a50ed9db24198350fa907e42d73faf012d5929081900390910190a3505050565b60008181526006602090815260408083206007909252822060018201549192909161271e904390612373565b9050600061273983600201548361238b90919063ffffffff16565b905080156127905782541561278857612782612777846000015461069e68056bc75e2d6310000061069889600301548761240290919063ffffffff16565b6001850154906124f6565b60018401555b600283018290555b5050505050565b600082815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845282528083208584526007909252822081546002830154600183015493949293919290916127ee908361238b565b9050801561282d5761281b61281068056bc75e2d6310000061069e8685612402565b6001870154906124f6565b60018087019190915584015460028601555b50505050505050565b3390565b604080518082018252601881527f617070726f766528616464726573732c75696e74323536290000000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b30000000000000000000000000000000000000000000000000000000017815292518151600094859489169392918291908083835b6020831061293f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612902565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146129a1576040519150601f19603f3d011682016040523d82523d6000602084013e6129a6565b606091505b50915091508180156129d45750805115806129d457508080602001905160208110156129d157600080fd5b50515b61279057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20617070726f7665206661696c656400000000604482015290519081900360640190fd5b60008111612a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612fd16026913960400191505060405180910390fd5b600083815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902054612ad290826124f6565b600084815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452825280832093909355858252600790522054612b1890826124f6565b600084815260076020908152604080832093909355600690522060040154612b589073ffffffffffffffffffffffffffffffffffffffff16833084612dcd565b60008381526006602090815260409182902060040154825173ffffffffffffffffffffffffffffffffffffffff918216815291820184905282519085169286927f7edb7e181699d1db1f6e3ac27fb17e1db8ac69aeb22eec366e72528c0886726a929081900390910190a3505050565b604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017815292518151600094859489169392918291908083835b60208310612ccd57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612c90565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612d2f576040519150601f19603f3d011682016040523d82523d6000602084013e612d34565b606091505b5091509150818015612d62575080511580612d625750808060200190516020811015612d5f57600080fd5b50515b61279057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5374616b696e67506f6f6c733a207472616e73666572206661696c6564000000604482015290519081900360640190fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1660405180606001604052806025815260200161303d6025913980516020918201206040805173ffffffffffffffffffffffffffffffffffffffff808b166024830152891660448201526064808201899052825180830390910181526084909101825292830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092178252518251909182918083835b60208310612ede57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612ea1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612f40576040519150601f19603f3d011682016040523d82523d6000602084013e612f45565b606091505b5091509150818015612f73575080511580612f735750808060200190516020811015612f7057600080fd5b50515b612fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612ff76021913960400191505060405180910390fd5b50505050505056fe5374616b696e67506f6f6c733a2063616e6e6f74207374616b65207a65726f20616d6f756e745374616b696e67506f6f6c733a207472616e7366657246726f6d206661696c65645374616b696e67506f6f6c733a20726577617264206d75737420626520706f7369746976657472616e7366657246726f6d28616464726573732c616464726573732c75696e74323536294f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735374616b696e67506f6f6c733a20696e76616c696420626c6f636b2072616e67655374616b696e67506f6f6c733a206d69677261746f72206368616e67652070726f706f73616c206e6f7420666f756e645374616b696e67506f6f6c733a206e6f2072657761726420746f2072656465656d5374616b696e67506f6f6c733a207a65726f206e657720746f6b656e20616464726573735374616b696e67506f6f6c733a20656e6420626c6f636b206e6f7420657874656e646564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775374616b696e67506f6f6c733a206d6967726174696f6e20626c6f636b206e6f7420726561636865645374616b696e67506f6f6c733a206d6967726174696f6e20626c6f636b206e6f7420657874656e6465645374616b696e67506f6f6c733a206d69677261746f72207365747465722064656c6179206e6f74207061737365645374616b696e67506f6f6c733a2063616e6e6f7420756e7374616b65207a65726f20616d6f756e74a2646970667358221220c1d05c2032370bb29afffe4dbc81e3300dd0019962b57ea012944b40b984ed0b64736f6c634300070600330000000000000000000000000000000000000000000000000000000000093a80
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101a25760003560e01c806372f73499116100ee578063b2ce5df311610097578063dcc3e06e11610071578063dcc3e06e14610510578063ec00208114610518578063f2fde38b14610535578063ff22d24114610568576101a2565b8063b2ce5df31461046f578063b3f2f997146104ba578063d9dbd28d146104ed576101a2565b80638da5cb5b116100c85780638da5cb5b1461043c5780639e2c8a5b14610444578063a657e57914610467576101a2565b806372f73499146103e05780637b0472f0146103e85780637cd07e471461040b576101a2565b80633b61edd3116101505780636ab0f2551161012a5780636ab0f255146103405780637103789414610381578063715018a6146103d8576101a2565b80633b61edd3146102a25780633c634f42146102c5578063689d84e4146102e2576101a2565b80632730661511610181578063273066151461024a57806335f11cc2146102525780633a6462e41461026f576101a2565b80628f33d7146101a7578063012ce501146101f25780630e667f0e14610211575b600080fd5b6101e0600480360360408110156101bd57600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff1661058b565b60408051918252519081900360200190f35b61020f6004803603602081101561020857600080fd5b50356106fb565b005b61020f6004803603604081101561022757600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff166107c0565b61020f610afa565b61020f6004803603602081101561026857600080fd5b5035610c9b565b61020f6004803603602081101561028557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610d28565b61020f600480360360408110156102b857600080fd5b5080359060200135610e58565b61020f600480360360208110156102db57600080fd5b50356110c0565b6102ff600480360360208110156102f857600080fd5b503561149c565b60408051958652602086019490945284840192909252606084015273ffffffffffffffffffffffffffffffffffffffff166080830152519081900360a00190f35b6103486114e1565b6040805167ffffffffffffffff909316835273ffffffffffffffffffffffffffffffffffffffff90911660208301528051918290030190f35b6103ba6004803603604081101561039757600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16611515565b60408051938452602084019290925282820152519081900360600190f35b61020f611541565b6101e0611658565b61020f600480360360408110156103fe57600080fd5b508035906020013561165e565b61041361179c565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6104136117b8565b61020f6004803603604081101561045a57600080fd5b50803590602001356117d4565b6101e0611876565b61020f600480360360a081101561048557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020810135906040810135906060810135906080013561187c565b61020f600480360360208110156104d057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611b9c565b61020f6004803603604081101561050357600080fd5b5080359060200135611d09565b610413611f2d565b6103ba6004803603602081101561052e57600080fd5b5035611f49565b61020f6004803603602081101561054b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611f6a565b61020f6004803603604081101561057e57600080fd5b508035906020013561210b565b600082815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff808616855290835281842082516060808201855282548252600180840154838801526002938401548387015289885260068752858820865160a0810188528154815281830154818a0152818601548189015260038201548185015260049091015490951660808601528988526007875285882086519283018752805480845291810154978301979097529590920154938201939093529192909190849061065c5781602001516106af565b6106af6106a4836000015161069e68056bc75e2d6310000061069888606001516106988960400151610692438d60200151612373565b9061238b565b90612402565b90612475565b6020840151906124f6565b90506106ee6106e368056bc75e2d6310000061069e6106db88604001518661238b90919063ffffffff16565b885190612402565b6020860151906124f6565b9450505050505b92915050565b600081815260066020526040902060010154819061077a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b6000828152600860209081526040808320338085529252909120546107a091849161256a565b506000908152600860209081526040808320338452909152812060010155565b600082815260066020526040902060010154829061083f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff82166108c157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5374616b696e67506f6f6c733a207a65726f2061646472657373000000000000604482015290519081900360640190fd5b6108ca836126f2565b6108d48383612797565b60055473ffffffffffffffffffffffffffffffffffffffff1661095857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f5374616b696e67506f6f6c733a207265776172646572206e6f74207365740000604482015290519081900360640190fd5b600083815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902060010154806109e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806130d96021913960400191505060405180910390fd5b600084815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff8088168086529190935281842060010184905560055482517f7a5f11fa000000000000000000000000000000000000000000000000000000008152600481018a905260248101929092526044820186905291519190921692637a5f11fa926064808201939182900301818387803b158015610a8157600080fd5b505af1158015610a95573d6000803e3d6000fd5b50506005546040805173ffffffffffffffffffffffffffffffffffffffff928316815260208101869052815192881694508893507fef1bb27f27213e5cb8963b669bf571859e849a0b1c0d1135c6932d61a1188ce3929081900390910190a350505050565b60045467ffffffffffffffff16610b5c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806130a96030913960400191505060405180910390fd5b600354600454610b789167ffffffffffffffff909116906124f6565b421015610bd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806131b6602e913960400191505060405180910390fd5b600280546004805473ffffffffffffffffffffffffffffffffffffffff68010000000000000000820481167fffffffffffffffffffffffff00000000000000000000000000000000000000008516179485905560408051808201825260008082526020918201527fffffffff00000000000000000000000000000000000000000000000000000000909316909355825193811680855294169083015280517f57897fe04a846feabc0e56ce4142f7fbd091622a3263e28077ce5fedae906c279281900390910190a150565b6000818152600660205260409020600101548190610d1a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b610d2482336107c0565b5050565b610d30612836565b73ffffffffffffffffffffffffffffffffffffffff16610d4e6117b8565b73ffffffffffffffffffffffffffffffffffffffff1614610dd057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040805191909216808252602082019390935281517f9428ebf8162d9d23f42ee294eb636214dd96f4fab1956b7637f40ff8d414ce73929181900390910190a15050565b610e60612836565b73ffffffffffffffffffffffffffffffffffffffff16610e7e6117b8565b73ffffffffffffffffffffffffffffffffffffffff1614610f0057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000828152600660205260409020600101548290610f7f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b6000838152600660205260409020600101548390431061100057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5374616b696e67506f6f6c733a20706f6f6c20656e6465640000000000000000604482015290519081900360640190fd5b60008481526006602052604090206002015480841161106a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061318c602a913960400191505060405180910390fd5b6000858152600660209081526040918290206002018690558151838152908101869052815187927f59ce6256507da20a008aa4f06f7a4690e99c008a908bf46abe9407444b5444d7928290030190a25050505050565b600081815260066020526040902060010154819061113f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b60025473ffffffffffffffffffffffffffffffffffffffff166111c357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f5374616b696e67506f6f6c733a206d69677261746f72206e6f74207365740000604482015290519081900360640190fd5b6000828152600660209081526040808320815160a0810183528154815260018083015482860152600280840154838601908152600385015460608086019190915260049095015473ffffffffffffffffffffffffffffffffffffffff166080850152898852600787529685902085519485018652805485529182015495840195909552909301549181019190915291519091904310156112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806131636029913960400191505060405180910390fd5b608082015160025482516112d9929173ffffffffffffffffffffffffffffffffffffffff169061283a565b60025460808301518251604080517f4ef88bea0000000000000000000000000000000000000000000000000000000081526004810189905273ffffffffffffffffffffffffffffffffffffffff93841660248201526044810192909252516000939290921691634ef88bea9160648082019260209290919082900301818787803b15801561136657600080fd5b505af115801561137a573d6000803e3d6000fd5b505050506040513d602081101561139057600080fd5b5051905073ffffffffffffffffffffffffffffffffffffffff8116611400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806130fa6024913960400191505060405180910390fd5b60008581526006602090815260409182902060040180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff858116918217909255608087015184519216825291810191909152815187927fb7ede30df1964589448863a66272f2b59b886c3364a82ed9cef9f9e30ab017c3928290030190a25050505050565b600660205260009081526040902080546001820154600283015460038401546004909401549293919290919073ffffffffffffffffffffffffffffffffffffffff1685565b60045467ffffffffffffffff81169068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1682565b600860209081526000928352604080842090915290825290208054600182015460029092015490919083565b611549612836565b73ffffffffffffffffffffffffffffffffffffffff166115676117b8565b73ffffffffffffffffffffffffffffffffffffffff16146115e957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60035481565b60008281526006602052604090206001015482906116dd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b6000838152600660205260409020548390431080159061170d575060008181526006602052604090206001015443105b61177857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420616374697665000000604482015290519081900360640190fd5b611781846126f2565b61178b8433612797565b611796843385612a3f565b50505050565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b600082815260066020526040902060010154829061185357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b61185c836126f2565b6118668333612797565b61187183338461256a565b505050565b60015481565b611884612836565b73ffffffffffffffffffffffffffffffffffffffff166118a26117b8565b73ffffffffffffffffffffffffffffffffffffffff161461192457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff85166119a657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5374616b696e67506f6f6c733a207a65726f2061646472657373000000000000604482015290519081900360640190fd5b43841180156119b457508383115b80156119bf57508382115b611a14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806130886021913960400191505060405180910390fd5b60008111611a6d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806130186025913960400191505060405180910390fd5b6001805481018082556040805160a0810182528781526020808201888152828401888152606080850189815273ffffffffffffffffffffffffffffffffffffffff8e8116608080890182815260008c815260068a528b81209a518b5597518a8e015595516002808b0191909155935160038a01559451600490980180547fffffffffffffffffffffffff00000000000000000000000000000000000000001698909216979097179055865180830188528481528086018581528189018f81528a875260078852958990209151825551998101999099559251979092019690965583518a8152918201899052818401889052810186905291519293909284927f36766c23c4dce64b1651af7bae0782e208b9146d590e780046a7b84c24a74dbf92908290030190a3505050505050565b611ba4612836565b73ffffffffffffffffffffffffffffffffffffffff16611bc26117b8565b73ffffffffffffffffffffffffffffffffffffffff1614611c4457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6040805180820182524267ffffffffffffffff1680825273ffffffffffffffffffffffffffffffffffffffff84166020928301819052600480547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169092177fffffffff0000000000000000000000000000000000000000ffffffffffffffff1668010000000000000000820217909155825190815291517fa29574a23976d25a545c50ae3e198c1eccdd2d6313b17a9c8ec1dc24a20551b59281900390910190a150565b611d11612836565b73ffffffffffffffffffffffffffffffffffffffff16611d2f6117b8565b73ffffffffffffffffffffffffffffffffffffffff1614611db157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000828152600660205260409020600101548290611e3057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b60008381526006602052604090206001015483904310611eb157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5374616b696e67506f6f6c733a20706f6f6c20656e6465640000000000000000604482015290519081900360640190fd5b6000848152600660205260409020544310611ecf57611ecf846126f2565b60008481526006602090815260409182902060030180549086905582518181529182018690528251909287927fe8c0ef92b4d0c5e15388b280719c402b7e9d101833759d5f3d23fcb25cd9593b929081900390910190a25050505050565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b60076020526000908152604090208054600182015460029092015490919083565b611f72612836565b73ffffffffffffffffffffffffffffffffffffffff16611f906117b8565b73ffffffffffffffffffffffffffffffffffffffff161461201257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661207e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806130626026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b612113612836565b73ffffffffffffffffffffffffffffffffffffffff166121316117b8565b73ffffffffffffffffffffffffffffffffffffffff16146121b357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600082815260066020526040902060010154829061223257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b600083815260066020526040902060010154839043106122b357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5374616b696e67506f6f6c733a20706f6f6c20656e6465640000000000000000604482015290519081900360640190fd5b60008481526006602052604090206001015480841161231d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061311e6024913960400191505060405180910390fd5b6000858152600660209081526040918290206001018690558151838152908101869052815187927f4160dc602e30ed6f057cad6503bed525ae1b6b025bffb9e84683d5ecf10f64eb928290030190a25050505050565b60008183106123825781612384565b825b9392505050565b6000828211156123fc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082612411575060006106f5565b8282028284828161241e57fe5b0414612384576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806131426021913960400191505060405180910390fd5b60008082116124e557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816124ee57fe5b049392505050565b60008282018381101561238457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600081116125c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806131e46028913960400191505060405180910390fd5b600083815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546125fd908261238b565b600084815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452825280832093909355858252600790522054612643908261238b565b6000848152600760209081526040808320939093556006905220600401546126829073ffffffffffffffffffffffffffffffffffffffff168383612bc8565b60008381526006602090815260409182902060040154825173ffffffffffffffffffffffffffffffffffffffff918216815291820184905282519085169286927f88567e6595ad345e5250569a2c8d8a50ed9db24198350fa907e42d73faf012d5929081900390910190a3505050565b60008181526006602090815260408083206007909252822060018201549192909161271e904390612373565b9050600061273983600201548361238b90919063ffffffff16565b905080156127905782541561278857612782612777846000015461069e68056bc75e2d6310000061069889600301548761240290919063ffffffff16565b6001850154906124f6565b60018401555b600283018290555b5050505050565b600082815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845282528083208584526007909252822081546002830154600183015493949293919290916127ee908361238b565b9050801561282d5761281b61281068056bc75e2d6310000061069e8685612402565b6001870154906124f6565b60018087019190915584015460028601555b50505050505050565b3390565b604080518082018252601881527f617070726f766528616464726573732c75696e74323536290000000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b30000000000000000000000000000000000000000000000000000000017815292518151600094859489169392918291908083835b6020831061293f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612902565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146129a1576040519150601f19603f3d011682016040523d82523d6000602084013e6129a6565b606091505b50915091508180156129d45750805115806129d457508080602001905160208110156129d157600080fd5b50515b61279057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20617070726f7665206661696c656400000000604482015290519081900360640190fd5b60008111612a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612fd16026913960400191505060405180910390fd5b600083815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902054612ad290826124f6565b600084815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452825280832093909355858252600790522054612b1890826124f6565b600084815260076020908152604080832093909355600690522060040154612b589073ffffffffffffffffffffffffffffffffffffffff16833084612dcd565b60008381526006602090815260409182902060040154825173ffffffffffffffffffffffffffffffffffffffff918216815291820184905282519085169286927f7edb7e181699d1db1f6e3ac27fb17e1db8ac69aeb22eec366e72528c0886726a929081900390910190a3505050565b604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017815292518151600094859489169392918291908083835b60208310612ccd57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612c90565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612d2f576040519150601f19603f3d011682016040523d82523d6000602084013e612d34565b606091505b5091509150818015612d62575080511580612d625750808060200190516020811015612d5f57600080fd5b50515b61279057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5374616b696e67506f6f6c733a207472616e73666572206661696c6564000000604482015290519081900360640190fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1660405180606001604052806025815260200161303d6025913980516020918201206040805173ffffffffffffffffffffffffffffffffffffffff808b166024830152891660448201526064808201899052825180830390910181526084909101825292830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092178252518251909182918083835b60208310612ede57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612ea1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612f40576040519150601f19603f3d011682016040523d82523d6000602084013e612f45565b606091505b5091509150818015612f73575080511580612f735750808060200190516020811015612f7057600080fd5b50515b612fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612ff76021913960400191505060405180910390fd5b50505050505056fe5374616b696e67506f6f6c733a2063616e6e6f74207374616b65207a65726f20616d6f756e745374616b696e67506f6f6c733a207472616e7366657246726f6d206661696c65645374616b696e67506f6f6c733a20726577617264206d75737420626520706f7369746976657472616e7366657246726f6d28616464726573732c616464726573732c75696e74323536294f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735374616b696e67506f6f6c733a20696e76616c696420626c6f636b2072616e67655374616b696e67506f6f6c733a206d69677261746f72206368616e67652070726f706f73616c206e6f7420666f756e645374616b696e67506f6f6c733a206e6f2072657761726420746f2072656465656d5374616b696e67506f6f6c733a207a65726f206e657720746f6b656e20616464726573735374616b696e67506f6f6c733a20656e6420626c6f636b206e6f7420657874656e646564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775374616b696e67506f6f6c733a206d6967726174696f6e20626c6f636b206e6f7420726561636865645374616b696e67506f6f6c733a206d6967726174696f6e20626c6f636b206e6f7420657874656e6465645374616b696e67506f6f6c733a206d69677261746f72207365747465722064656c6179206e6f74207061737365645374616b696e67506f6f6c733a2063616e6e6f7420756e7374616b65207a65726f20616d6f756e74a2646970667358221220c1d05c2032370bb29afffe4dbc81e3300dd0019962b57ea012944b40b984ed0b64736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000093a80
-----Decoded View---------------
Arg [0] : _migratorSetterDelay (uint256): 604800
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000093a80
Deployed Bytecode Sourcemap
13012:16524:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17303:1131;;;;;;;;;;;;;;;;-1:-1:-1;17303:1131:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;24364:270;;;;;;;;;;;;;;;;-1:-1:-1;24364:270:0;;:::i;:::-;;24782:684;;;;;;;;;;;;;;;;-1:-1:-1;24782:684:0;;;;;;;;;:::i;21835:649::-;;;:::i;24642:132::-;;;;;;;;;;;;;;;;-1:-1:-1;24642:132:0;;:::i;22492:233::-;;;;;;;;;;;;;;;;-1:-1:-1;22492:233:0;;;;:::i;20151:530::-;;;;;;;;;;;;;;;;-1:-1:-1;20151:530:0;;;;;;;:::i;22733:1132::-;;;;;;;;;;;;;;;;-1:-1:-1;22733:1132:0;;:::i;16149:45::-;;;;;;;;;;;;;;;;-1:-1:-1;16149:45:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16051:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;16252:64;;;;;;;;;;;;;;;;-1:-1:-1;16252:64:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;2861:148;;;:::i;16010:34::-;;;:::i;23873:247::-;;;;;;;;;;;;;;;;-1:-1:-1;23873:247:0;;;;;;;:::i;15967:36::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2210:87;;;:::i;24128:228::-;;;;;;;;;;;;;;;;-1:-1:-1;24128:228:0;;;;;;;:::i;15903:25::-;;;:::i;18634:1043::-;;;;;;;;;;;;;;;;-1:-1:-1;18634:1043:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;21579:248::-;;;;;;;;;;;;;;;;-1:-1:-1;21579:248:0;;;;:::i;20689:882::-;;;;;;;;;;;;;;;;-1:-1:-1;20689:882:0;;;;;;;:::i;16104:36::-;;;:::i;16201:44::-;;;;;;;;;;;;;;;;-1:-1:-1;16201:44:0;;:::i;3164:244::-;;;;;;;;;;;;;;;;-1:-1:-1;3164:244:0;;;;:::i;19685:458::-;;;;;;;;;;;;;;;;-1:-1:-1;19685:458:0;;;;;;;:::i;17303:1131::-;17377:7;17431:16;;;:8;:16;;;;;;;;:24;;;;;;;;;;;;17397:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17500:17;;;:9;:17;;;;;17466:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17562:16;;;:8;:16;;;;;17528:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17397:58;;17466:51;;17528:50;17377:7;;17639:517;;18122:15;:34;;;17639:517;;;17695:407;17756:327;18050:15;:32;;;17756:263;16375:6;17756:209;17934:15;:30;;;17756:147;17861:15;:41;;;17756:74;17791:12;17805:15;:24;;;17756:34;:74::i;:::-;:104;;:147::i;:::-;:177;;:209::i;:263::-;:293;;:327::i;:::-;17695:34;;;;;:38;:407::i;:::-;17591:565;;18189:237;18241:170;16375:6;18241:102;18273:69;18302:15;:39;;;18273:24;:28;;:69;;;;:::i;:::-;18241:27;;;:31;:102::i;:170::-;18189:29;;;;;:33;:237::i;:::-;18169:257;;;;;;17303:1131;;;;;:::o;24364:270::-;16835:1;16806:17;;;:9;:17;;;;;:26;;;24430:6;;16798:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24478:16:::1;::::0;;;:8:::1;:16;::::0;;;;;;;24466:10:::1;24478:28:::0;;;;;;;;:40;24449:70:::1;::::0;24458:6;;24449:8:::1;:70::i;:::-;-1:-1:-1::0;24625:1:0::1;24580:16:::0;;;:8:::1;:16;::::0;;;;;;;24597:10:::1;24580:28:::0;;;;;;;:42:::1;;:46:::0;24364:270::o;24782:684::-;16835:1;16806:17;;;:9;:17;;;;;:26;;;24866:6;;16798:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24893:18:::1;::::0;::::1;24885:57;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;24955:29;24977:6;24955:21;:29::i;:::-;24995:33;25015:6;25023:4;24995:19;:33::i;:::-;25057:8;::::0;25049:31:::1;25057:8;25041:74;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;25128:22;25153:16:::0;;;:8:::1;:16;::::0;;;;;;;:22:::1;::::0;::::1;::::0;;;;;;;:36:::1;;::::0;25208:18;25200:64:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25316:1;25277:16:::0;;;:8:::1;:16;::::0;;;;;;;:22:::1;::::0;;::::1;::::0;;;;;;;;;;:36:::1;;:40:::0;;;25330:8:::1;::::0;:47;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;:8;;;::::1;::::0;:17:::1;::::0;:47;;;;;;;;;;;25316:1;25330:8;:47;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;25432:8:0::1;::::0;25395:63:::1;::::0;;::::1;25432:8:::0;;::::1;25395:63:::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;-1:-1:-1;25410:6:0;;-1:-1:-1;25395:63:0::1;::::0;;;;;;;;;::::1;16880:1;24782:684:::0;;;:::o;21835:649::-;21896:15;:27;;;21888:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22073:19;;22040:15;:27;22032:61;;22040:27;;;;;22032:40;:61::i;:::-;22013:15;:80;;21991:176;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22210:8;;;22262:15;:27;;22210:8;22262:27;;;;;22230:60;;;;;;;;22347:64;;;;;;;;-1:-1:-1;22347:64:0;;;;;;;;22329:82;;;;;;;22429:47;;22210:8;;;22429:47;;;22466:8;;22429:47;;;;;;;;;;;;;;;;21835:649;:::o;24642:132::-;16835:1;16806:17;;;:9;:17;;;;;:26;;;24705:6;;16798:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24724:42:::1;24747:6;24755:10;24724:22;:42::i;:::-;24642:132:::0;;:::o;22492:233::-;2441:12;:10;:12::i;:::-;2430:23;;:7;:5;:7::i;:::-;:23;;;2422:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22594:8:::1;::::0;;::::1;22614:44:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;22676:41:::1;::::0;;22594:8;;;::::1;22676:41:::0;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;::::1;2501:1;22492:233:::0;:::o;20151:530::-;2441:12;:10;:12::i;:::-;2430:23;;:7;:5;:7::i;:::-;:23;;;2422:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16835:1:::1;16806:17:::0;;;:9:::1;:17;::::0;;;;:26:::1;;::::0;20285:6;;16798:71:::1;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;17220:17:::2;::::0;;;:9:::2;:17;::::0;;;;:26:::2;;::::0;20319:6;;17205:12:::2;:41;17197:78;;;::::0;;::::2;::::0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;20343:29:::3;20375:17:::0;;;:9:::3;:17;::::0;;;;:32:::3;;::::0;20426:41;;::::3;20418:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20527:17;::::0;;;:9:::3;:17;::::0;;;;;;;;:32:::3;;:52:::0;;;20597:76;;;;;;;::::3;::::0;;;;;20537:6;;20597:76:::3;::::0;;;;;;::::3;17286:1;16880::::2;2501::::1;20151:530:::0;;:::o;22733:1132::-;16835:1;16806:17;;;:9;:17;;;;;:26;;;22794:6;;16798:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22829:8:::1;::::0;22821:31:::1;22829:8;22813:74;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;22900:31;22934:17:::0;;;:9:::1;:17;::::0;;;;;;;22900:51;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;;::::1;::::0;::::1;;::::0;;;;22996:16;;;:8:::1;:16:::0;;;;;;22962:50;;;;::::1;::::0;;;;;;;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;23047:30;;22900:51;;22962:50;23031:12:::1;:46;;23023:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23148:25;::::0;::::1;::::0;23183:8:::1;::::0;23194:32;;23136:91:::1;::::0;23148:25;23183:8:::1;;::::0;23136:11:::1;:91::i;:::-;23546:8;::::0;23579:25:::1;::::0;::::1;::::0;23615:32;;23546:103:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;:8:::1;:103:::0;;::::1;::::0;;;;;;;;;;;;23514:16:::1;::::0;23546:8;;;::::1;::::0;:16:::1;::::0;:103;;;;;::::1;::::0;;;;;;;;;23514:16;23546:8;:103;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;23546:103:0;;-1:-1:-1;23668:22:0::1;::::0;::::1;23660:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23744:17;::::0;;;:9:::1;:17;::::0;;;;;;;;:27:::1;;:38:::0;;;::::1;;::::0;;::::1;::::0;;::::1;::::0;;;23821:25:::1;::::0;::::1;::::0;23800:57;;;::::1;::::0;;;;::::1;::::0;;;;;;23744:17;;23800:57:::1;::::0;;;;;;::::1;16880:1;;;22733:1132:::0;;:::o;16149:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16051:44::-;;;;;;;;;;;;;:::o;16252:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2861:148::-;2441:12;:10;:12::i;:::-;2430:23;;:7;:5;:7::i;:::-;:23;;;2422:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2968:1:::1;2952:6:::0;;2931:40:::1;::::0;::::1;2952:6:::0;;::::1;::::0;2931:40:::1;::::0;2968:1;;2931:40:::1;2999:1;2982:19:::0;;;::::1;::::0;;2861:148::o;16010:34::-;;;;:::o;23873:247::-;16835:1;16806:17;;;:9;:17;;;;;:26;;;23944:6;;16798:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16986:17:::1;::::0;;;:9:::1;:17;::::0;;;;:28;23967:6;;16970:12:::1;:44;::::0;::::1;::::0;:89:::1;;-1:-1:-1::0;17033:17:0::1;::::0;;;:9:::1;:17;::::0;;;;:26:::1;;::::0;17018:12:::1;:41;16970:89;16948:168;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;23986:29:::2;24008:6;23986:21;:29::i;:::-;24026:39;24046:6;24054:10;24026:19;:39::i;:::-;24078:34;24085:6;24093:10;24105:6;24078;:34::i;:::-;16880:1:::1;23873:247:::0;;;:::o;15967:36::-;;;;;;:::o;2210:87::-;2256:7;2283:6;;;2210:87;:::o;24128:228::-;16835:1;16806:17;;;:9;:17;;;;;:26;;;24201:6;;16798:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24220:29:::1;24242:6;24220:21;:29::i;:::-;24260:39;24280:6;24288:10;24260:19;:39::i;:::-;24312:36;24321:6;24329:10;24341:6;24312:8;:36::i;:::-;24128:228:::0;;;:::o;15903:25::-;;;;:::o;18634:1043::-;2441:12;:10;:12::i;:::-;2430:23;;:7;:5;:7::i;:::-;:23;;;2422:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18845:19:::1;::::0;::::1;18837:58;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;18941:12;18928:10;:25;:50;;;;;18968:10;18957:8;:21;18928:50;:81;;;;;18999:10;18982:14;:27;18928:81;18906:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19106:1;19089:14;:18;19081:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19184:10;19182:12:::0;;;::::1;::::0;;;19230:212:::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;::::1;::::0;;::::1;::::0;;;;;;;-1:-1:-1;19207:20:0;;;:9:::1;:20:::0;;;;;:235;;;;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;19475:93;;;;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;19453:19;;;:8:::1;:19:::0;;;;;;:115;;;;;;;::::1;::::0;;;;;;;;;::::1;::::0;;;;19586:83;;;;;;;::::1;::::0;;;;;;;;;;;;;;;;19182:12;;19230:212;;19182:12;;19586:83:::1;::::0;;;;;;;::::1;2501:1;18634:1043:::0;;;;;:::o;21579:248::-;2441:12;:10;:12::i;:::-;2430:23;;:7;:5;:7::i;:::-;:23;;;2422:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21679:87:::1;::::0;;;;::::1;::::0;;21722:15:::1;21679:87;;::::0;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;21661:15:::1;:105:::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;;::::0;;;21784:35;;;;;;;::::1;::::0;;;;;;;;::::1;21579:248:::0;:::o;20689:882::-;2441:12;:10;:12::i;:::-;2430:23;;:7;:5;:7::i;:::-;:23;;;2422:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16835:1:::1;16806:17:::0;;;:9:::1;:17;::::0;;;;:26:::1;;::::0;20816:6;;16798:71:::1;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;17220:17:::2;::::0;;;:9:::2;:17;::::0;;;;:26:::2;;::::0;20850:6;;17205:12:::2;:41;17197:78;;;::::0;;::::2;::::0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;20894:17:::3;::::0;;;:9:::3;:17;::::0;;;;:28;20878:12:::3;:44;20874:156;;20989:29;21011:6;20989:21;:29::i;:::-;21347;21379:17:::0;;;:9:::3;:17;::::0;;;;;;;;:32:::3;;::::0;;21422:52;;;;21492:71;;;;;;;::::3;::::0;;;;;21379:32;;21389:6;;21492:71:::3;::::0;;;;;;;;;::::3;17286:1;16880::::2;2501::::1;20689:882:::0;;:::o;16104:36::-;;;;;;:::o;16201:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3164:244::-;2441:12;:10;:12::i;:::-;2430:23;;:7;:5;:7::i;:::-;:23;;;2422:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3253:22:::1;::::0;::::1;3245:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3355:6;::::0;;3334:38:::1;::::0;::::1;::::0;;::::1;::::0;3355:6;::::1;::::0;3334:38:::1;::::0;::::1;3383:6;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;3164:244::o;19685:458::-;2441:12;:10;:12::i;:::-;2430:23;;:7;:5;:7::i;:::-;:23;;;2422:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16835:1:::1;16806:17:::0;;;:9:::1;:17;::::0;;;;:26:::1;;::::0;19807:6;;16798:71:::1;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;17220:17:::2;::::0;;;:9:::2;:17;::::0;;;;:26:::2;;::::0;19841:6;;17205:12:::2;:41;17197:78;;;::::0;;::::2;::::0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;19865:23:::3;19891:17:::0;;;:9:::3;:17;::::0;;;;:26:::3;;::::0;19936:29;;::::3;19928:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20019:17;::::0;;;:9:::3;:17;::::0;;;;;;;;:26:::3;;:40:::0;;;20077:58;;;;;;;::::3;::::0;;;;;20029:6;;20077:58:::3;::::0;;;;;;::::3;17286:1;16880::::2;2501::::1;19685:458:::0;;:::o;3859:106::-;3917:7;3948:1;3944;:5;:13;;3956:1;3944:13;;;3952:1;3944:13;3937:20;3859:106;-1:-1:-1;;;3859:106:0:o;7551:158::-;7609:7;7642:1;7637;:6;;7629:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7696:5:0;;;7551:158::o;7968:220::-;8026:7;8050:6;8046:20;;-1:-1:-1;8065:1:0;8058:8;;8046:20;8089:5;;;8093:1;8089;:5;:1;8113:5;;;;;:10;8105:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8666:153;8724:7;8756:1;8752;:5;8744:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8810:1;8806;:5;;;;;;;8666:153;-1:-1:-1;;;8666:153:0:o;7089:179::-;7147:7;7179:5;;;7203:6;;;;7195:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26016:591;26150:1;26141:6;:10;26133:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26316:16;;;;:8;:16;;;;;;;;:22;;;;;;;;;;:34;:46;;26355:6;26316:38;:46::i;:::-;26279:16;;;;:8;:16;;;;;;;;:22;;;;;;;;;;:83;;;;26409:16;;;:8;:16;;;:33;:45;;26447:6;26409:37;:45::i;:::-;26373:16;;;;:8;:16;;;;;;;;:81;;;;26480:9;:17;;;:27;;;26467:55;;26480:27;;26509:4;26515:6;26467:12;:55::i;:::-;26563:17;;;;:9;:17;;;;;;;;;:27;;;26540:59;;;26563:27;;;26540:59;;;;;;;;;;;;;;26549:6;;26540:59;;;;;;;;;;;26016:591;;;:::o;26615:1031::-;26681:32;26716:17;;;:9;:17;;;;;;;;26779:8;:16;;;;;26860:24;;;;26716:17;;26779:16;;26837:48;;26846:12;;26837:8;:48::i;:::-;26808:77;;26896:24;26923:65;26946:15;:41;;;26923:18;:22;;:65;;;;:::i;:::-;26896:92;-1:-1:-1;27087:20:0;;27083:556;;27195:32;;:36;27191:360;;27289:246;27350:166;27461:15;:32;;;27350:80;16375:6;27350:52;27371:15;:30;;;27350:16;:20;;:52;;;;:::i;:166::-;27289:34;;;;;:38;:246::i;:::-;27252:34;;;:283;27191:360;27565:41;;;:62;;;27083:556;26615:1031;;;;;:::o;27654:750::-;27734:32;27769:16;;;:8;:16;;;;;;;;:24;;;;;;;;;;27839:16;;;:8;:16;;;;;27890:27;;27954:39;;;;28029:34;;;;27769:24;;27839:16;;27890:27;;27954:39;;28029:55;;27954:39;28029:38;:55::i;:::-;28004:80;-1:-1:-1;28101:18:0;;28097:300;;28168:126;28220:59;16375:6;28220:31;:11;28236:14;28220:15;:31::i;:59::-;28168:29;;;;;:33;:126::i;:::-;28136:29;;;;:158;;;;28351:34;;;28309:39;;;:76;28097:300;27654:750;;;;;;;:::o;737:106::-;825:10;737:106;:::o;28412:345::-;16583:33;;;;;;;;;;;;;;;;;28582:57;;28571:10;28582:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28571:69;;;;28536:12;;;;28571:10;;;28582:57;28571:69;;;28582:57;28571:69;;28582:57;28571:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28535:105;;;;28659:7;:57;;;;-1:-1:-1;28671:11:0;;:16;;:44;;;28702:4;28691:24;;;;;;;;;;;;;;;-1:-1:-1;28691:24:0;28671:44;28651:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25474:534;25606:1;25597:6;:10;25589:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25700:16;;;;:8;:16;;;;;;;;:22;;;;;;;;;;:34;:46;;25739:6;25700:38;:46::i;:::-;25663:16;;;;:8;:16;;;;;;;;:22;;;;;;;;;;:83;;;;25793:16;;;:8;:16;;;:33;:45;;25831:6;25793:37;:45::i;:::-;25757:16;;;;:8;:16;;;;;;;;:81;;;;25868:9;:17;;;:27;;;25851:74;;25868:27;;25897:4;25911;25918:6;25851:16;:74::i;:::-;25964:17;;;;:9;:17;;;;;;;;;:27;;;25943:57;;;25964:27;;;25943:57;;;;;;;;;;;;;;25950:6;;25943:57;;;;;;;;;;;25474:534;;;:::o;28765:351::-;16480:34;;;;;;;;;;;;;;;;;28937:60;;28926:10;28937:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28926:72;;;;28891:12;;;;28926:10;;;28937:60;28926:72;;;28937:60;28926:72;;28937:60;28926:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28890:108;;;;29017:7;:57;;;;-1:-1:-1;29029:11:0;;:16;;:44;;;29060:4;29049:24;;;;;;;;;;;;;;;-1:-1:-1;29049:24:0;29029:44;29009:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29124:409;29279:12;29293:17;29327:5;:10;;16690:46;;;;;;;;;;;;;;;;;16680:57;;;;;;;29338:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29327:84;;;;;;;;;29338:72;29327:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29278:133;;;;29430:7;:57;;;;-1:-1:-1;29442:11:0;;:16;;:44;;;29473:4;29462:24;;;;;;;;;;;;;;;-1:-1:-1;29462:24:0;29442:44;29422:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29124:409;;;;;;:::o
Swarm Source
ipfs://c1d05c2032370bb29afffe4dbc81e3300dd0019962b57ea012944b40b984ed0b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.