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 12,320 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Unstake | 21237892 | 5 days ago | IN | 0 ETH | 0.00178893 | ||||
Unstake | 21188050 | 12 days ago | IN | 0 ETH | 0.00313958 | ||||
Unstake | 21187961 | 12 days ago | IN | 0 ETH | 0.00249111 | ||||
Unstake | 20854731 | 58 days ago | IN | 0 ETH | 0.0007448 | ||||
Unstake | 20720580 | 77 days ago | IN | 0 ETH | 0.00141388 | ||||
Stake | 20658321 | 86 days ago | IN | 0 ETH | 0.00020893 | ||||
Unstake | 20592094 | 95 days ago | IN | 0 ETH | 0.00064847 | ||||
Unstake | 20592063 | 95 days ago | IN | 0 ETH | 0.00051924 | ||||
Unstake | 20591585 | 95 days ago | IN | 0 ETH | 0.00015313 | ||||
Unstake | 20561505 | 99 days ago | IN | 0 ETH | 0.0001204 | ||||
Unstake | 20561497 | 99 days ago | IN | 0 ETH | 0.00012741 | ||||
Stake | 20561142 | 99 days ago | IN | 0 ETH | 0.00013016 | ||||
Unstake | 20561112 | 99 days ago | IN | 0 ETH | 0.00011306 | ||||
Unstake | 20540948 | 102 days ago | IN | 0 ETH | 0.0001355 | ||||
Unstake | 20539982 | 102 days ago | IN | 0 ETH | 0.00017173 | ||||
Unstake | 20526336 | 104 days ago | IN | 0 ETH | 0.00031276 | ||||
Unstake | 20520060 | 105 days ago | IN | 0 ETH | 0.00031918 | ||||
Unstake | 20517447 | 106 days ago | IN | 0 ETH | 0.00009905 | ||||
Unstake | 20423559 | 119 days ago | IN | 0 ETH | 0.00040882 | ||||
Unstake | 20397861 | 122 days ago | IN | 0 ETH | 0.00018053 | ||||
Stake | 20397855 | 122 days ago | IN | 0 ETH | 0.00017998 | ||||
Stake | 20376318 | 125 days ago | IN | 0 ETH | 0.00047944 | ||||
Stake | 20360118 | 128 days ago | IN | 0 ETH | 0.00041353 | ||||
Unstake | 20238811 | 144 days ago | IN | 0 ETH | 0.00120235 | ||||
Unstake | 20204435 | 149 days ago | IN | 0 ETH | 0.0003563 |
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 2021-04-03 */ // SPDX-License-Identifier: MIT // File @openzeppelin/contracts/utils/[email protected] 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) { // "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) { _updatePoolAccuReward(poolId); _updateStakerReward(poolId, msg.sender); require(address(rewarder) != address(0), "StakingPools: rewarder not set"); uint256 rewardToRedeem = userData[poolId][msg.sender].pendingReward; require(rewardToRedeem > 0, "StakingPools: no reward to redeem"); userData[poolId][msg.sender].pendingReward = 0; rewarder.onReward(poolId, msg.sender, rewardToRedeem); emit RewardRedeemed(poolId, msg.sender, 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":[],"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
60806040523480156200001157600080fd5b50604051620031bc380380620031bc833981810160405260208110156200003757600080fd5b5051600062000045620000ee565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060008111620000e5576040805162461bcd60e51b815260206004820152601f60248201527f5374616b696e67506f6f6c733a207a65726f207365747465722064656c617900604482015290519081900360640190fd5b600355620000f2565b3390565b6130ba80620001026000396000f3fe608060405234801561001057600080fd5b50600436106101975760003560e01c80637b0472f0116100e3578063b3f2f9971161008c578063ec00208111610066578063ec002081146104d4578063f2fde38b146104f1578063ff22d2411461052457610197565b8063b3f2f99714610476578063d9dbd28d146104a9578063dcc3e06e146104cc57610197565b80639e2c8a5b116100bd5780639e2c8a5b14610400578063a657e57914610423578063b2ce5df31461042b57610197565b80637b0472f0146103a45780637cd07e47146103c75780638da5cb5b146103f857610197565b80633c634f4211610145578063710378941161011f578063710378941461033d578063715018a61461039457806372f734991461039c57610197565b80633c634f4214610281578063689d84e41461029e5780636ab0f255146102fc57610197565b806335f11cc21161017657806335f11cc21461020e5780633a6462e41461022b5780633b61edd31461025e57610197565b80628f33d71461019c578063012ce501146101e75780632730661514610206575b600080fd5b6101d5600480360360408110156101b257600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16610547565b60408051918252519081900360200190f35b610204600480360360208110156101fd57600080fd5b50356106b7565b005b61020461077c565b6102046004803603602081101561022457600080fd5b503561091d565b6102046004803603602081101561024157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610bb6565b6102046004803603604081101561027457600080fd5b5080359060200135610ce6565b6102046004803603602081101561029757600080fd5b5035610f4e565b6102bb600480360360208110156102b457600080fd5b503561132a565b60408051958652602086019490945284840192909252606084015273ffffffffffffffffffffffffffffffffffffffff166080830152519081900360a00190f35b61030461136f565b6040805167ffffffffffffffff909316835273ffffffffffffffffffffffffffffffffffffffff90911660208301528051918290030190f35b6103766004803603604081101561035357600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff166113a3565b60408051938452602084019290925282820152519081900360600190f35b6102046113cf565b6101d56114e6565b610204600480360360408110156103ba57600080fd5b50803590602001356114ec565b6103cf61162a565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6103cf611646565b6102046004803603604081101561041657600080fd5b5080359060200135611662565b6101d5611704565b610204600480360360a081101561044157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020810135906040810135906060810135906080013561170a565b6102046004803603602081101561048c57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611a2a565b610204600480360360408110156104bf57600080fd5b5080359060200135611b97565b6103cf611da6565b610376600480360360208110156104ea57600080fd5b5035611dc2565b6102046004803603602081101561050757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611de3565b6102046004803603604081101561053a57600080fd5b5080359060200135611f84565b600082815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff808616855290835281842082516060808201855282548252600180840154838801526002938401548387015289885260068752858820865160a0810188528154815281830154818a0152818601548189015260038201548185015260049091015490951660808601528988526007875285882086519283018752805480845291810154978301979097529590920154938201939093529192909190849061061857816020015161066b565b61066b610660836000015161065a68056bc75e2d631000006106548860600151610654896040015161064e438d602001516121ec565b90612204565b9061227b565b906122ee565b60208401519061236f565b90506106aa61069f68056bc75e2d6310000061065a61069788604001518661220490919063ffffffff16565b88519061227b565b60208601519061236f565b9450505050505b92915050565b600081815260066020526040902060010154819061073657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b60008281526008602090815260408083203380855292529091205461075c9184916123e3565b506000908152600860209081526040808320338452909152812060010155565b60045467ffffffffffffffff166107de576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180612f226030913960400191505060405180910390fd5b6003546004546107fa9167ffffffffffffffff9091169061236f565b421015610852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061302f602e913960400191505060405180910390fd5b600280546004805473ffffffffffffffffffffffffffffffffffffffff68010000000000000000820481167fffffffffffffffffffffffff00000000000000000000000000000000000000008516179485905560408051808201825260008082526020918201527fffffffff00000000000000000000000000000000000000000000000000000000909316909355825193811680855294169083015280517f57897fe04a846feabc0e56ce4142f7fbd091622a3263e28077ce5fedae906c279281900390910190a150565b600081815260066020526040902060010154819061099c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b6109a58261256b565b6109af8233612610565b60055473ffffffffffffffffffffffffffffffffffffffff16610a3357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f5374616b696e67506f6f6c733a207265776172646572206e6f74207365740000604482015290519081900360640190fd5b600082815260086020908152604080832033845290915290206001015480610aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612f526021913960400191505060405180910390fd5b600083815260086020908152604080832033808552925280832060010183905560055481517f7a5f11fa00000000000000000000000000000000000000000000000000000000815260048101889052602481019390935260448301859052905173ffffffffffffffffffffffffffffffffffffffff90911692637a5f11fa926064808201939182900301818387803b158015610b4157600080fd5b505af1158015610b55573d6000803e3d6000fd5b50506005546040805173ffffffffffffffffffffffffffffffffffffffff90921682526020820185905280513394508793507fef1bb27f27213e5cb8963b669bf571859e849a0b1c0d1135c6932d61a1188ce39281900390910190a3505050565b610bbe6126af565b73ffffffffffffffffffffffffffffffffffffffff16610bdc611646565b73ffffffffffffffffffffffffffffffffffffffff1614610c5e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040805191909216808252602082019390935281517f9428ebf8162d9d23f42ee294eb636214dd96f4fab1956b7637f40ff8d414ce73929181900390910190a15050565b610cee6126af565b73ffffffffffffffffffffffffffffffffffffffff16610d0c611646565b73ffffffffffffffffffffffffffffffffffffffff1614610d8e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000828152600660205260409020600101548290610e0d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b60008381526006602052604090206001015483904310610e8e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5374616b696e67506f6f6c733a20706f6f6c20656e6465640000000000000000604482015290519081900360640190fd5b600084815260066020526040902060020154808411610ef8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613005602a913960400191505060405180910390fd5b6000858152600660209081526040918290206002018690558151838152908101869052815187927f59ce6256507da20a008aa4f06f7a4690e99c008a908bf46abe9407444b5444d7928290030190a25050505050565b6000818152600660205260409020600101548190610fcd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b60025473ffffffffffffffffffffffffffffffffffffffff1661105157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f5374616b696e67506f6f6c733a206d69677261746f72206e6f74207365740000604482015290519081900360640190fd5b6000828152600660209081526040808320815160a0810183528154815260018083015482860152600280840154838601908152600385015460608086019190915260049095015473ffffffffffffffffffffffffffffffffffffffff1660808501528988526007875296859020855194850186528054855291820154958401959095529093015491810191909152915190919043101561113c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180612fdc6029913960400191505060405180910390fd5b60808201516002548251611167929173ffffffffffffffffffffffffffffffffffffffff16906126b3565b60025460808301518251604080517f4ef88bea0000000000000000000000000000000000000000000000000000000081526004810189905273ffffffffffffffffffffffffffffffffffffffff93841660248201526044810192909252516000939290921691634ef88bea9160648082019260209290919082900301818787803b1580156111f457600080fd5b505af1158015611208573d6000803e3d6000fd5b505050506040513d602081101561121e57600080fd5b5051905073ffffffffffffffffffffffffffffffffffffffff811661128e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180612f736024913960400191505060405180910390fd5b60008581526006602090815260409182902060040180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff858116918217909255608087015184519216825291810191909152815187927fb7ede30df1964589448863a66272f2b59b886c3364a82ed9cef9f9e30ab017c3928290030190a25050505050565b600660205260009081526040902080546001820154600283015460038401546004909401549293919290919073ffffffffffffffffffffffffffffffffffffffff1685565b60045467ffffffffffffffff81169068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1682565b600860209081526000928352604080842090915290825290208054600182015460029092015490919083565b6113d76126af565b73ffffffffffffffffffffffffffffffffffffffff166113f5611646565b73ffffffffffffffffffffffffffffffffffffffff161461147757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60035481565b600082815260066020526040902060010154829061156b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b6000838152600660205260409020548390431080159061159b575060008181526006602052604090206001015443105b61160657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420616374697665000000604482015290519081900360640190fd5b61160f8461256b565b6116198433612610565b6116248433856128b8565b50505050565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60008281526006602052604090206001015482906116e157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b6116ea8361256b565b6116f48333612610565b6116ff8333846123e3565b505050565b60015481565b6117126126af565b73ffffffffffffffffffffffffffffffffffffffff16611730611646565b73ffffffffffffffffffffffffffffffffffffffff16146117b257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff851661183457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5374616b696e67506f6f6c733a207a65726f2061646472657373000000000000604482015290519081900360640190fd5b438411801561184257508383115b801561184d57508382115b6118a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612f016021913960400191505060405180910390fd5b600081116118fb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180612e916025913960400191505060405180910390fd5b6001805481018082556040805160a0810182528781526020808201888152828401888152606080850189815273ffffffffffffffffffffffffffffffffffffffff8e8116608080890182815260008c815260068a528b81209a518b5597518a8e015595516002808b0191909155935160038a01559451600490980180547fffffffffffffffffffffffff00000000000000000000000000000000000000001698909216979097179055865180830188528481528086018581528189018f81528a875260078852958990209151825551998101999099559251979092019690965583518a8152918201899052818401889052810186905291519293909284927f36766c23c4dce64b1651af7bae0782e208b9146d590e780046a7b84c24a74dbf92908290030190a3505050505050565b611a326126af565b73ffffffffffffffffffffffffffffffffffffffff16611a50611646565b73ffffffffffffffffffffffffffffffffffffffff1614611ad257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6040805180820182524267ffffffffffffffff1680825273ffffffffffffffffffffffffffffffffffffffff84166020928301819052600480547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169092177fffffffff0000000000000000000000000000000000000000ffffffffffffffff1668010000000000000000820217909155825190815291517fa29574a23976d25a545c50ae3e198c1eccdd2d6313b17a9c8ec1dc24a20551b59281900390910190a150565b611b9f6126af565b73ffffffffffffffffffffffffffffffffffffffff16611bbd611646565b73ffffffffffffffffffffffffffffffffffffffff1614611c3f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000828152600660205260409020600101548290611cbe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b60008381526006602052604090206001015483904310611d3f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5374616b696e67506f6f6c733a20706f6f6c20656e6465640000000000000000604482015290519081900360640190fd5b611d488461256b565b60008481526006602090815260409182902060030180549086905582518181529182018690528251909287927fe8c0ef92b4d0c5e15388b280719c402b7e9d101833759d5f3d23fcb25cd9593b929081900390910190a25050505050565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b60076020526000908152604090208054600182015460029092015490919083565b611deb6126af565b73ffffffffffffffffffffffffffffffffffffffff16611e09611646565b73ffffffffffffffffffffffffffffffffffffffff1614611e8b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116611ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612edb6026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b611f8c6126af565b73ffffffffffffffffffffffffffffffffffffffff16611faa611646565b73ffffffffffffffffffffffffffffffffffffffff161461202c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60008281526006602052604090206001015482906120ab57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b6000838152600660205260409020600101548390431061212c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5374616b696e67506f6f6c733a20706f6f6c20656e6465640000000000000000604482015290519081900360640190fd5b600084815260066020526040902060010154808411612196576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180612f976024913960400191505060405180910390fd5b6000858152600660209081526040918290206001018690558151838152908101869052815187927f4160dc602e30ed6f057cad6503bed525ae1b6b025bffb9e84683d5ecf10f64eb928290030190a25050505050565b60008183106121fb57816121fd565b825b9392505050565b60008282111561227557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008261228a575060006106b1565b8282028284828161229757fe5b04146121fd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612fbb6021913960400191505060405180910390fd5b600080821161235e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161236757fe5b049392505050565b6000828201838110156121fd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000811161243c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061305d6028913960400191505060405180910390fd5b600083815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546124769082612204565b600084815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684528252808320939093558582526007905220546124bc9082612204565b6000848152600760209081526040808320939093556006905220600401546124fb9073ffffffffffffffffffffffffffffffffffffffff168383612a41565b60008381526006602090815260409182902060040154825173ffffffffffffffffffffffffffffffffffffffff918216815291820184905282519085169286927f88567e6595ad345e5250569a2c8d8a50ed9db24198350fa907e42d73faf012d5929081900390910190a3505050565b6000818152600660209081526040808320600790925282206001820154919290916125979043906121ec565b905060006125b283600201548361220490919063ffffffff16565b9050801561260957825415612601576125fb6125f0846000015461065a68056bc75e2d6310000061065489600301548761227b90919063ffffffff16565b60018501549061236f565b60018401555b600283018290555b5050505050565b600082815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845282528083208584526007909252822081546002830154600183015493949293919290916126679083612204565b905080156126a65761269461268968056bc75e2d6310000061065a868561227b565b60018701549061236f565b60018087019190915584015460028601555b50505050505050565b3390565b604080518082018252601881527f617070726f766528616464726573732c75696e74323536290000000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b30000000000000000000000000000000000000000000000000000000017815292518151600094859489169392918291908083835b602083106127b857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161277b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461281a576040519150601f19603f3d011682016040523d82523d6000602084013e61281f565b606091505b509150915081801561284d57508051158061284d575080806020019051602081101561284a57600080fd5b50515b61260957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20617070726f7665206661696c656400000000604482015290519081900360640190fd5b60008111612911576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612e4a6026913960400191505060405180910390fd5b600083815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915290205461294b908261236f565b600084815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452825280832093909355858252600790522054612991908261236f565b6000848152600760209081526040808320939093556006905220600401546129d19073ffffffffffffffffffffffffffffffffffffffff16833084612c46565b60008381526006602090815260409182902060040154825173ffffffffffffffffffffffffffffffffffffffff918216815291820184905282519085169286927f7edb7e181699d1db1f6e3ac27fb17e1db8ac69aeb22eec366e72528c0886726a929081900390910190a3505050565b604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017815292518151600094859489169392918291908083835b60208310612b4657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612b09565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612ba8576040519150601f19603f3d011682016040523d82523d6000602084013e612bad565b606091505b5091509150818015612bdb575080511580612bdb5750808060200190516020811015612bd857600080fd5b50515b61260957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5374616b696e67506f6f6c733a207472616e73666572206661696c6564000000604482015290519081900360640190fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060258152602001612eb66025913980516020918201206040805173ffffffffffffffffffffffffffffffffffffffff808b166024830152891660448201526064808201899052825180830390910181526084909101825292830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092178252518251909182918083835b60208310612d5757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612d1a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612db9576040519150601f19603f3d011682016040523d82523d6000602084013e612dbe565b606091505b5091509150818015612dec575080511580612dec5750808060200190516020811015612de957600080fd5b50515b612e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612e706021913960400191505060405180910390fd5b50505050505056fe5374616b696e67506f6f6c733a2063616e6e6f74207374616b65207a65726f20616d6f756e745374616b696e67506f6f6c733a207472616e7366657246726f6d206661696c65645374616b696e67506f6f6c733a20726577617264206d75737420626520706f7369746976657472616e7366657246726f6d28616464726573732c616464726573732c75696e74323536294f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735374616b696e67506f6f6c733a20696e76616c696420626c6f636b2072616e67655374616b696e67506f6f6c733a206d69677261746f72206368616e67652070726f706f73616c206e6f7420666f756e645374616b696e67506f6f6c733a206e6f2072657761726420746f2072656465656d5374616b696e67506f6f6c733a207a65726f206e657720746f6b656e20616464726573735374616b696e67506f6f6c733a20656e6420626c6f636b206e6f7420657874656e646564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775374616b696e67506f6f6c733a206d6967726174696f6e20626c6f636b206e6f7420726561636865645374616b696e67506f6f6c733a206d6967726174696f6e20626c6f636b206e6f7420657874656e6465645374616b696e67506f6f6c733a206d69677261746f72207365747465722064656c6179206e6f74207061737365645374616b696e67506f6f6c733a2063616e6e6f7420756e7374616b65207a65726f20616d6f756e74a264697066735822122069499101fd26def9f372a06cf9a07889d52150c66bd1f5b88f20d79af34d1f3f64736f6c634300070600330000000000000000000000000000000000000000000000000000000000093a80
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101975760003560e01c80637b0472f0116100e3578063b3f2f9971161008c578063ec00208111610066578063ec002081146104d4578063f2fde38b146104f1578063ff22d2411461052457610197565b8063b3f2f99714610476578063d9dbd28d146104a9578063dcc3e06e146104cc57610197565b80639e2c8a5b116100bd5780639e2c8a5b14610400578063a657e57914610423578063b2ce5df31461042b57610197565b80637b0472f0146103a45780637cd07e47146103c75780638da5cb5b146103f857610197565b80633c634f4211610145578063710378941161011f578063710378941461033d578063715018a61461039457806372f734991461039c57610197565b80633c634f4214610281578063689d84e41461029e5780636ab0f255146102fc57610197565b806335f11cc21161017657806335f11cc21461020e5780633a6462e41461022b5780633b61edd31461025e57610197565b80628f33d71461019c578063012ce501146101e75780632730661514610206575b600080fd5b6101d5600480360360408110156101b257600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16610547565b60408051918252519081900360200190f35b610204600480360360208110156101fd57600080fd5b50356106b7565b005b61020461077c565b6102046004803603602081101561022457600080fd5b503561091d565b6102046004803603602081101561024157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610bb6565b6102046004803603604081101561027457600080fd5b5080359060200135610ce6565b6102046004803603602081101561029757600080fd5b5035610f4e565b6102bb600480360360208110156102b457600080fd5b503561132a565b60408051958652602086019490945284840192909252606084015273ffffffffffffffffffffffffffffffffffffffff166080830152519081900360a00190f35b61030461136f565b6040805167ffffffffffffffff909316835273ffffffffffffffffffffffffffffffffffffffff90911660208301528051918290030190f35b6103766004803603604081101561035357600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff166113a3565b60408051938452602084019290925282820152519081900360600190f35b6102046113cf565b6101d56114e6565b610204600480360360408110156103ba57600080fd5b50803590602001356114ec565b6103cf61162a565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6103cf611646565b6102046004803603604081101561041657600080fd5b5080359060200135611662565b6101d5611704565b610204600480360360a081101561044157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020810135906040810135906060810135906080013561170a565b6102046004803603602081101561048c57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611a2a565b610204600480360360408110156104bf57600080fd5b5080359060200135611b97565b6103cf611da6565b610376600480360360208110156104ea57600080fd5b5035611dc2565b6102046004803603602081101561050757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611de3565b6102046004803603604081101561053a57600080fd5b5080359060200135611f84565b600082815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff808616855290835281842082516060808201855282548252600180840154838801526002938401548387015289885260068752858820865160a0810188528154815281830154818a0152818601548189015260038201548185015260049091015490951660808601528988526007875285882086519283018752805480845291810154978301979097529590920154938201939093529192909190849061061857816020015161066b565b61066b610660836000015161065a68056bc75e2d631000006106548860600151610654896040015161064e438d602001516121ec565b90612204565b9061227b565b906122ee565b60208401519061236f565b90506106aa61069f68056bc75e2d6310000061065a61069788604001518661220490919063ffffffff16565b88519061227b565b60208601519061236f565b9450505050505b92915050565b600081815260066020526040902060010154819061073657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b60008281526008602090815260408083203380855292529091205461075c9184916123e3565b506000908152600860209081526040808320338452909152812060010155565b60045467ffffffffffffffff166107de576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180612f226030913960400191505060405180910390fd5b6003546004546107fa9167ffffffffffffffff9091169061236f565b421015610852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061302f602e913960400191505060405180910390fd5b600280546004805473ffffffffffffffffffffffffffffffffffffffff68010000000000000000820481167fffffffffffffffffffffffff00000000000000000000000000000000000000008516179485905560408051808201825260008082526020918201527fffffffff00000000000000000000000000000000000000000000000000000000909316909355825193811680855294169083015280517f57897fe04a846feabc0e56ce4142f7fbd091622a3263e28077ce5fedae906c279281900390910190a150565b600081815260066020526040902060010154819061099c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b6109a58261256b565b6109af8233612610565b60055473ffffffffffffffffffffffffffffffffffffffff16610a3357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f5374616b696e67506f6f6c733a207265776172646572206e6f74207365740000604482015290519081900360640190fd5b600082815260086020908152604080832033845290915290206001015480610aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612f526021913960400191505060405180910390fd5b600083815260086020908152604080832033808552925280832060010183905560055481517f7a5f11fa00000000000000000000000000000000000000000000000000000000815260048101889052602481019390935260448301859052905173ffffffffffffffffffffffffffffffffffffffff90911692637a5f11fa926064808201939182900301818387803b158015610b4157600080fd5b505af1158015610b55573d6000803e3d6000fd5b50506005546040805173ffffffffffffffffffffffffffffffffffffffff90921682526020820185905280513394508793507fef1bb27f27213e5cb8963b669bf571859e849a0b1c0d1135c6932d61a1188ce39281900390910190a3505050565b610bbe6126af565b73ffffffffffffffffffffffffffffffffffffffff16610bdc611646565b73ffffffffffffffffffffffffffffffffffffffff1614610c5e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040805191909216808252602082019390935281517f9428ebf8162d9d23f42ee294eb636214dd96f4fab1956b7637f40ff8d414ce73929181900390910190a15050565b610cee6126af565b73ffffffffffffffffffffffffffffffffffffffff16610d0c611646565b73ffffffffffffffffffffffffffffffffffffffff1614610d8e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000828152600660205260409020600101548290610e0d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b60008381526006602052604090206001015483904310610e8e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5374616b696e67506f6f6c733a20706f6f6c20656e6465640000000000000000604482015290519081900360640190fd5b600084815260066020526040902060020154808411610ef8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613005602a913960400191505060405180910390fd5b6000858152600660209081526040918290206002018690558151838152908101869052815187927f59ce6256507da20a008aa4f06f7a4690e99c008a908bf46abe9407444b5444d7928290030190a25050505050565b6000818152600660205260409020600101548190610fcd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b60025473ffffffffffffffffffffffffffffffffffffffff1661105157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f5374616b696e67506f6f6c733a206d69677261746f72206e6f74207365740000604482015290519081900360640190fd5b6000828152600660209081526040808320815160a0810183528154815260018083015482860152600280840154838601908152600385015460608086019190915260049095015473ffffffffffffffffffffffffffffffffffffffff1660808501528988526007875296859020855194850186528054855291820154958401959095529093015491810191909152915190919043101561113c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180612fdc6029913960400191505060405180910390fd5b60808201516002548251611167929173ffffffffffffffffffffffffffffffffffffffff16906126b3565b60025460808301518251604080517f4ef88bea0000000000000000000000000000000000000000000000000000000081526004810189905273ffffffffffffffffffffffffffffffffffffffff93841660248201526044810192909252516000939290921691634ef88bea9160648082019260209290919082900301818787803b1580156111f457600080fd5b505af1158015611208573d6000803e3d6000fd5b505050506040513d602081101561121e57600080fd5b5051905073ffffffffffffffffffffffffffffffffffffffff811661128e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180612f736024913960400191505060405180910390fd5b60008581526006602090815260409182902060040180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff858116918217909255608087015184519216825291810191909152815187927fb7ede30df1964589448863a66272f2b59b886c3364a82ed9cef9f9e30ab017c3928290030190a25050505050565b600660205260009081526040902080546001820154600283015460038401546004909401549293919290919073ffffffffffffffffffffffffffffffffffffffff1685565b60045467ffffffffffffffff81169068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1682565b600860209081526000928352604080842090915290825290208054600182015460029092015490919083565b6113d76126af565b73ffffffffffffffffffffffffffffffffffffffff166113f5611646565b73ffffffffffffffffffffffffffffffffffffffff161461147757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60035481565b600082815260066020526040902060010154829061156b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b6000838152600660205260409020548390431080159061159b575060008181526006602052604090206001015443105b61160657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420616374697665000000604482015290519081900360640190fd5b61160f8461256b565b6116198433612610565b6116248433856128b8565b50505050565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60008281526006602052604090206001015482906116e157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b6116ea8361256b565b6116f48333612610565b6116ff8333846123e3565b505050565b60015481565b6117126126af565b73ffffffffffffffffffffffffffffffffffffffff16611730611646565b73ffffffffffffffffffffffffffffffffffffffff16146117b257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff851661183457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5374616b696e67506f6f6c733a207a65726f2061646472657373000000000000604482015290519081900360640190fd5b438411801561184257508383115b801561184d57508382115b6118a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612f016021913960400191505060405180910390fd5b600081116118fb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180612e916025913960400191505060405180910390fd5b6001805481018082556040805160a0810182528781526020808201888152828401888152606080850189815273ffffffffffffffffffffffffffffffffffffffff8e8116608080890182815260008c815260068a528b81209a518b5597518a8e015595516002808b0191909155935160038a01559451600490980180547fffffffffffffffffffffffff00000000000000000000000000000000000000001698909216979097179055865180830188528481528086018581528189018f81528a875260078852958990209151825551998101999099559251979092019690965583518a8152918201899052818401889052810186905291519293909284927f36766c23c4dce64b1651af7bae0782e208b9146d590e780046a7b84c24a74dbf92908290030190a3505050505050565b611a326126af565b73ffffffffffffffffffffffffffffffffffffffff16611a50611646565b73ffffffffffffffffffffffffffffffffffffffff1614611ad257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6040805180820182524267ffffffffffffffff1680825273ffffffffffffffffffffffffffffffffffffffff84166020928301819052600480547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169092177fffffffff0000000000000000000000000000000000000000ffffffffffffffff1668010000000000000000820217909155825190815291517fa29574a23976d25a545c50ae3e198c1eccdd2d6313b17a9c8ec1dc24a20551b59281900390910190a150565b611b9f6126af565b73ffffffffffffffffffffffffffffffffffffffff16611bbd611646565b73ffffffffffffffffffffffffffffffffffffffff1614611c3f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000828152600660205260409020600101548290611cbe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b60008381526006602052604090206001015483904310611d3f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5374616b696e67506f6f6c733a20706f6f6c20656e6465640000000000000000604482015290519081900360640190fd5b611d488461256b565b60008481526006602090815260409182902060030180549086905582518181529182018690528251909287927fe8c0ef92b4d0c5e15388b280719c402b7e9d101833759d5f3d23fcb25cd9593b929081900390910190a25050505050565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b60076020526000908152604090208054600182015460029092015490919083565b611deb6126af565b73ffffffffffffffffffffffffffffffffffffffff16611e09611646565b73ffffffffffffffffffffffffffffffffffffffff1614611e8b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116611ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612edb6026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b611f8c6126af565b73ffffffffffffffffffffffffffffffffffffffff16611faa611646565b73ffffffffffffffffffffffffffffffffffffffff161461202c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60008281526006602052604090206001015482906120ab57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b6000838152600660205260409020600101548390431061212c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5374616b696e67506f6f6c733a20706f6f6c20656e6465640000000000000000604482015290519081900360640190fd5b600084815260066020526040902060010154808411612196576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180612f976024913960400191505060405180910390fd5b6000858152600660209081526040918290206001018690558151838152908101869052815187927f4160dc602e30ed6f057cad6503bed525ae1b6b025bffb9e84683d5ecf10f64eb928290030190a25050505050565b60008183106121fb57816121fd565b825b9392505050565b60008282111561227557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008261228a575060006106b1565b8282028284828161229757fe5b04146121fd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612fbb6021913960400191505060405180910390fd5b600080821161235e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161236757fe5b049392505050565b6000828201838110156121fd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000811161243c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061305d6028913960400191505060405180910390fd5b600083815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546124769082612204565b600084815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684528252808320939093558582526007905220546124bc9082612204565b6000848152600760209081526040808320939093556006905220600401546124fb9073ffffffffffffffffffffffffffffffffffffffff168383612a41565b60008381526006602090815260409182902060040154825173ffffffffffffffffffffffffffffffffffffffff918216815291820184905282519085169286927f88567e6595ad345e5250569a2c8d8a50ed9db24198350fa907e42d73faf012d5929081900390910190a3505050565b6000818152600660209081526040808320600790925282206001820154919290916125979043906121ec565b905060006125b283600201548361220490919063ffffffff16565b9050801561260957825415612601576125fb6125f0846000015461065a68056bc75e2d6310000061065489600301548761227b90919063ffffffff16565b60018501549061236f565b60018401555b600283018290555b5050505050565b600082815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845282528083208584526007909252822081546002830154600183015493949293919290916126679083612204565b905080156126a65761269461268968056bc75e2d6310000061065a868561227b565b60018701549061236f565b60018087019190915584015460028601555b50505050505050565b3390565b604080518082018252601881527f617070726f766528616464726573732c75696e74323536290000000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b30000000000000000000000000000000000000000000000000000000017815292518151600094859489169392918291908083835b602083106127b857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161277b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461281a576040519150601f19603f3d011682016040523d82523d6000602084013e61281f565b606091505b509150915081801561284d57508051158061284d575080806020019051602081101561284a57600080fd5b50515b61260957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20617070726f7665206661696c656400000000604482015290519081900360640190fd5b60008111612911576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612e4a6026913960400191505060405180910390fd5b600083815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915290205461294b908261236f565b600084815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452825280832093909355858252600790522054612991908261236f565b6000848152600760209081526040808320939093556006905220600401546129d19073ffffffffffffffffffffffffffffffffffffffff16833084612c46565b60008381526006602090815260409182902060040154825173ffffffffffffffffffffffffffffffffffffffff918216815291820184905282519085169286927f7edb7e181699d1db1f6e3ac27fb17e1db8ac69aeb22eec366e72528c0886726a929081900390910190a3505050565b604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017815292518151600094859489169392918291908083835b60208310612b4657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612b09565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612ba8576040519150601f19603f3d011682016040523d82523d6000602084013e612bad565b606091505b5091509150818015612bdb575080511580612bdb5750808060200190516020811015612bd857600080fd5b50515b61260957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5374616b696e67506f6f6c733a207472616e73666572206661696c6564000000604482015290519081900360640190fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16604051806060016040528060258152602001612eb66025913980516020918201206040805173ffffffffffffffffffffffffffffffffffffffff808b166024830152891660448201526064808201899052825180830390910181526084909101825292830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092178252518251909182918083835b60208310612d5757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612d1a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612db9576040519150601f19603f3d011682016040523d82523d6000602084013e612dbe565b606091505b5091509150818015612dec575080511580612dec5750808060200190516020811015612de957600080fd5b50515b612e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612e706021913960400191505060405180910390fd5b50505050505056fe5374616b696e67506f6f6c733a2063616e6e6f74207374616b65207a65726f20616d6f756e745374616b696e67506f6f6c733a207472616e7366657246726f6d206661696c65645374616b696e67506f6f6c733a20726577617264206d75737420626520706f7369746976657472616e7366657246726f6d28616464726573732c616464726573732c75696e74323536294f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735374616b696e67506f6f6c733a20696e76616c696420626c6f636b2072616e67655374616b696e67506f6f6c733a206d69677261746f72206368616e67652070726f706f73616c206e6f7420666f756e645374616b696e67506f6f6c733a206e6f2072657761726420746f2072656465656d5374616b696e67506f6f6c733a207a65726f206e657720746f6b656e20616464726573735374616b696e67506f6f6c733a20656e6420626c6f636b206e6f7420657874656e646564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775374616b696e67506f6f6c733a206d6967726174696f6e20626c6f636b206e6f7420726561636865645374616b696e67506f6f6c733a206d6967726174696f6e20626c6f636b206e6f7420657874656e6465645374616b696e67506f6f6c733a206d69677261746f72207365747465722064656c6179206e6f74207061737365645374616b696e67506f6f6c733a2063616e6e6f7420756e7374616b65207a65726f20616d6f756e74a264697066735822122069499101fd26def9f372a06cf9a07889d52150c66bd1f5b88f20d79af34d1f3f64736f6c63430007060033
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
13015:16243:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17306:1131;;;;;;;;;;;;;;;;-1:-1:-1;17306:1131:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;24287:270;;;;;;;;;;;;;;;;-1:-1:-1;24287:270:0;;:::i;:::-;;21758:649;;;:::i;24565:623::-;;;;;;;;;;;;;;;;-1:-1:-1;24565:623:0;;:::i;22415:233::-;;;;;;;;;;;;;;;;-1:-1:-1;22415:233:0;;;;:::i;20154:530::-;;;;;;;;;;;;;;;;-1:-1:-1;20154:530:0;;;;;;;:::i;22656:1132::-;;;;;;;;;;;;;;;;-1:-1:-1;22656:1132:0;;:::i;16152:45::-;;;;;;;;;;;;;;;;-1:-1:-1;16152:45:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16054:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;16255:64;;;;;;;;;;;;;;;;-1:-1:-1;16255:64:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;2790:148;;;:::i;16013:34::-;;;:::i;23796:247::-;;;;;;;;;;;;;;;;-1:-1:-1;23796:247:0;;;;;;;:::i;15970:36::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2139:87;;;:::i;24051:228::-;;;;;;;;;;;;;;;;-1:-1:-1;24051:228:0;;;;;;;:::i;15906:25::-;;;:::i;18637:1043::-;;;;;;;;;;;;;;;;-1:-1:-1;18637:1043:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;21502:248::-;;;;;;;;;;;;;;;;-1:-1:-1;21502:248:0;;;;:::i;20692:802::-;;;;;;;;;;;;;;;;-1:-1:-1;20692:802:0;;;;;;;:::i;16107:36::-;;;:::i;16204:44::-;;;;;;;;;;;;;;;;-1:-1:-1;16204:44:0;;:::i;3093:244::-;;;;;;;;;;;;;;;;-1:-1:-1;3093:244:0;;;;:::i;19688:458::-;;;;;;;;;;;;;;;;-1:-1:-1;19688:458:0;;;;;;;:::i;17306:1131::-;17380:7;17434:16;;;:8;:16;;;;;;;;:24;;;;;;;;;;;;17400:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17503:17;;;:9;:17;;;;;17469:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17565:16;;;:8;:16;;;;;17531:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17400:58;;17469:51;;17531:50;17380:7;;17642:517;;18125:15;:34;;;17642:517;;;17698:407;17759:327;18053:15;:32;;;17759:263;16378:6;17759:209;17937:15;:30;;;17759:147;17864:15;:41;;;17759:74;17794:12;17808:15;:24;;;17759:34;:74::i;:::-;:104;;:147::i;:::-;:177;;:209::i;:263::-;:293;;:327::i;:::-;17698:34;;;;;:38;:407::i;:::-;17594:565;;18192:237;18244:170;16378:6;18244:102;18276:69;18305:15;:39;;;18276:24;:28;;:69;;;;:::i;:::-;18244:27;;;:31;:102::i;:170::-;18192:29;;;;;:33;:237::i;:::-;18172:257;;;;;;17306:1131;;;;;:::o;24287:270::-;16838:1;16809:17;;;:9;:17;;;;;:26;;;24353:6;;16801:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24401:16:::1;::::0;;;:8:::1;:16;::::0;;;;;;;24389:10:::1;24401:28:::0;;;;;;;;:40;24372:70:::1;::::0;24381:6;;24372:8:::1;:70::i;:::-;-1:-1:-1::0;24548:1:0::1;24503:16:::0;;;:8:::1;:16;::::0;;;;;;;24520:10:::1;24503:28:::0;;;;;;;:42:::1;;:46:::0;24287:270::o;21758:649::-;21819:15;:27;;;21811:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21996:19;;21963:15;:27;21955:61;;21963:27;;;;;21955:40;:61::i;:::-;21936:15;:80;;21914:176;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22133:8;;;22185:15;:27;;22133:8;22185:27;;;;;22153:60;;;;;;;;22270:64;;;;;;;;-1:-1:-1;22270:64:0;;;;;;;;22252:82;;;;;;;22352:47;;22133:8;;;22352:47;;;22389:8;;22352:47;;;;;;;;;;;;;;;;21758:649;:::o;24565:623::-;16838:1;16809:17;;;:9;:17;;;;;:26;;;24628:6;;16801:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24647:29:::1;24669:6;24647:21;:29::i;:::-;24687:39;24707:6;24715:10;24687:19;:39::i;:::-;24755:8;::::0;24747:31:::1;24755:8;24739:74;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;24826:22;24851:16:::0;;;:8:::1;:16;::::0;;;;;;;24868:10:::1;24851:28:::0;;;;;;;:42:::1;;::::0;24912:18;24904:64:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25026:1;24981:16:::0;;;:8:::1;:16;::::0;;;;;;;24998:10:::1;24981:28:::0;;;;;;;;:42:::1;;:46:::0;;;25040:8:::1;::::0;:53;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;24981:28:::1;25040:8:::0;;::::1;::::0;:17:::1;::::0;:53;;;;;;;;;;;25026:1;25040:8;:53;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;25154:8:0::1;::::0;25111:69:::1;::::0;;::::1;25154:8:::0;;::::1;25111:69:::0;;::::1;::::0;::::1;::::0;;;;;25134:10:::1;::::0;-1:-1:-1;25126:6:0;;-1:-1:-1;25111:69:0::1;::::0;;;;;;;;::::1;16883:1;24565:623:::0;;:::o;22415:233::-;2370:12;:10;:12::i;:::-;2359:23;;:7;:5;:7::i;:::-;:23;;;2351:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22517:8:::1;::::0;;::::1;22537:44:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;22599:41:::1;::::0;;22517:8;;;::::1;22599:41:::0;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;::::1;2430:1;22415:233:::0;:::o;20154:530::-;2370:12;:10;:12::i;:::-;2359:23;;:7;:5;:7::i;:::-;:23;;;2351:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16838:1:::1;16809:17:::0;;;:9:::1;:17;::::0;;;;:26:::1;;::::0;20288:6;;16801:71:::1;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;17223:17:::2;::::0;;;:9:::2;:17;::::0;;;;:26:::2;;::::0;20322:6;;17208:12:::2;:41;17200:78;;;::::0;;::::2;::::0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;20346:29:::3;20378:17:::0;;;:9:::3;:17;::::0;;;;:32:::3;;::::0;20429:41;;::::3;20421:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20530:17;::::0;;;:9:::3;:17;::::0;;;;;;;;:32:::3;;:52:::0;;;20600:76;;;;;;;::::3;::::0;;;;;20540:6;;20600:76:::3;::::0;;;;;;::::3;17289:1;16883::::2;2430::::1;20154:530:::0;;:::o;22656:1132::-;16838:1;16809:17;;;:9;:17;;;;;:26;;;22717:6;;16801:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22752:8:::1;::::0;22744:31:::1;22752:8;22736:74;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;22823:31;22857:17:::0;;;:9:::1;:17;::::0;;;;;;;22823: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;;;;22919:16;;;:8:::1;:16:::0;;;;;;22885:50;;;;::::1;::::0;;;;;;;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;22970:30;;22823:51;;22885:50;22954:12:::1;:46;;22946:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23071:25;::::0;::::1;::::0;23106:8:::1;::::0;23117:32;;23059:91:::1;::::0;23071:25;23106:8:::1;;::::0;23059:11:::1;:91::i;:::-;23469:8;::::0;23502:25:::1;::::0;::::1;::::0;23538:32;;23469:103:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;:8:::1;:103:::0;;::::1;::::0;;;;;;;;;;;;23437:16:::1;::::0;23469:8;;;::::1;::::0;:16:::1;::::0;:103;;;;;::::1;::::0;;;;;;;;;23437:16;23469:8;:103;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;23469:103:0;;-1:-1:-1;23591:22:0::1;::::0;::::1;23583:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23667:17;::::0;;;:9:::1;:17;::::0;;;;;;;;:27:::1;;:38:::0;;;::::1;;::::0;;::::1;::::0;;::::1;::::0;;;23744:25:::1;::::0;::::1;::::0;23723:57;;;::::1;::::0;;;;::::1;::::0;;;;;;23667:17;;23723:57:::1;::::0;;;;;;::::1;16883:1;;;22656:1132:::0;;:::o;16152:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;16054:44::-;;;;;;;;;;;;;:::o;16255:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2790:148::-;2370:12;:10;:12::i;:::-;2359:23;;:7;:5;:7::i;:::-;:23;;;2351:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2897:1:::1;2881:6:::0;;2860:40:::1;::::0;::::1;2881:6:::0;;::::1;::::0;2860:40:::1;::::0;2897:1;;2860:40:::1;2928:1;2911:19:::0;;;::::1;::::0;;2790:148::o;16013:34::-;;;;:::o;23796:247::-;16838:1;16809:17;;;:9;:17;;;;;:26;;;23867:6;;16801:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16989:17:::1;::::0;;;:9:::1;:17;::::0;;;;:28;23890:6;;16973:12:::1;:44;::::0;::::1;::::0;:89:::1;;-1:-1:-1::0;17036:17:0::1;::::0;;;:9:::1;:17;::::0;;;;:26:::1;;::::0;17021:12:::1;:41;16973:89;16951:168;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;23909:29:::2;23931:6;23909:21;:29::i;:::-;23949:39;23969:6;23977:10;23949:19;:39::i;:::-;24001:34;24008:6;24016:10;24028:6;24001;:34::i;:::-;16883:1:::1;23796:247:::0;;;:::o;15970:36::-;;;;;;:::o;2139:87::-;2185:7;2212:6;;;2139:87;:::o;24051:228::-;16838:1;16809:17;;;:9;:17;;;;;:26;;;24124:6;;16801:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24143:29:::1;24165:6;24143:21;:29::i;:::-;24183:39;24203:6;24211:10;24183:19;:39::i;:::-;24235:36;24244:6;24252:10;24264:6;24235:8;:36::i;:::-;24051:228:::0;;;:::o;15906:25::-;;;;:::o;18637:1043::-;2370:12;:10;:12::i;:::-;2359:23;;:7;:5;:7::i;:::-;:23;;;2351:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18848:19:::1;::::0;::::1;18840:58;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;18944:12;18931:10;:25;:50;;;;;18971:10;18960:8;:21;18931:50;:81;;;;;19002:10;18985:14;:27;18931:81;18909:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19109:1;19092:14;:18;19084:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19187:10;19185:12:::0;;;::::1;::::0;;;19233:212:::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;::::1;::::0;;::::1;::::0;;;;;;;-1:-1:-1;19210: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;;19478:93;;;;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;19456:19;;;:8:::1;:19:::0;;;;;;:115;;;;;;;::::1;::::0;;;;;;;;;::::1;::::0;;;;19589:83;;;;;;;::::1;::::0;;;;;;;;;;;;;;;;19185:12;;19233:212;;19185:12;;19589:83:::1;::::0;;;;;;;::::1;2430:1;18637:1043:::0;;;;;:::o;21502:248::-;2370:12;:10;:12::i;:::-;2359:23;;:7;:5;:7::i;:::-;:23;;;2351:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21602:87:::1;::::0;;;;::::1;::::0;;21645:15:::1;21602:87;;::::0;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;21584:15:::1;:105:::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;;::::0;;;21707:35;;;;;;;::::1;::::0;;;;;;;;::::1;21502:248:::0;:::o;20692:802::-;2370:12;:10;:12::i;:::-;2359:23;;:7;:5;:7::i;:::-;:23;;;2351:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16838:1:::1;16809:17:::0;;;:9:::1;:17;::::0;;;;:26:::1;;::::0;20819:6;;16801:71:::1;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;17223:17:::2;::::0;;;:9:::2;:17;::::0;;;;:26:::2;;::::0;20853:6;;17208:12:::2;:41;17200:78;;;::::0;;::::2;::::0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;20923:29:::3;20945:6;20923:21;:29::i;:::-;21270;21302:17:::0;;;:9:::3;:17;::::0;;;;;;;;:32:::3;;::::0;;21345:52;;;;21415:71;;;;;;;::::3;::::0;;;;;21302:32;;21312:6;;21415:71:::3;::::0;;;;;;;;;::::3;17289:1;16883::::2;2430::::1;20692:802:::0;;:::o;16107:36::-;;;;;;:::o;16204:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3093:244::-;2370:12;:10;:12::i;:::-;2359:23;;:7;:5;:7::i;:::-;:23;;;2351:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3182:22:::1;::::0;::::1;3174:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3284:6;::::0;;3263:38:::1;::::0;::::1;::::0;;::::1;::::0;3284:6;::::1;::::0;3263:38:::1;::::0;::::1;3312:6;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;3093:244::o;19688:458::-;2370:12;:10;:12::i;:::-;2359:23;;:7;:5;:7::i;:::-;:23;;;2351:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16838:1:::1;16809:17:::0;;;:9:::1;:17;::::0;;;;:26:::1;;::::0;19810:6;;16801:71:::1;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;17223:17:::2;::::0;;;:9:::2;:17;::::0;;;;:26:::2;;::::0;19844:6;;17208:12:::2;:41;17200:78;;;::::0;;::::2;::::0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;19868:23:::3;19894:17:::0;;;:9:::3;:17;::::0;;;;:26:::3;;::::0;19939:29;;::::3;19931:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20022:17;::::0;;;:9:::3;:17;::::0;;;;;;;;:26:::3;;:40:::0;;;20080:58;;;;;;;::::3;::::0;;;;;20032:6;;20080:58:::3;::::0;;;;;;::::3;17289:1;16883::::2;2430::::1;19688:458:::0;;:::o;3782:106::-;3840:7;3871:1;3867;:5;:13;;3879:1;3867:13;;;3875:1;3867:13;3860:20;3782:106;-1:-1:-1;;;3782:106:0:o;7472:158::-;7530:7;7563:1;7558;:6;;7550:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7617:5:0;;;7472:158::o;7889:220::-;7947:7;7971:6;7967:20;;-1:-1:-1;7986:1:0;7979:8;;7967:20;8010:5;;;8014:1;8010;:5;:1;8034:5;;;;;:10;8026:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8587:153;8645:7;8677:1;8673;:5;8665:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8731:1;8727;:5;;;;;;;8587:153;-1:-1:-1;;;8587:153:0:o;7010:179::-;7068:7;7100:5;;;7124:6;;;;7116:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25738:591;25872:1;25863:6;:10;25855:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26038:16;;;;:8;:16;;;;;;;;:22;;;;;;;;;;:34;:46;;26077:6;26038:38;:46::i;:::-;26001:16;;;;:8;:16;;;;;;;;:22;;;;;;;;;;:83;;;;26131:16;;;:8;:16;;;:33;:45;;26169:6;26131:37;:45::i;:::-;26095:16;;;;:8;:16;;;;;;;;:81;;;;26202:9;:17;;;:27;;;26189:55;;26202:27;;26231:4;26237:6;26189:12;:55::i;:::-;26285:17;;;;:9;:17;;;;;;;;;:27;;;26262:59;;;26285:27;;;26262:59;;;;;;;;;;;;;;26271:6;;26262:59;;;;;;;;;;;25738:591;;;:::o;26337:1031::-;26403:32;26438:17;;;:9;:17;;;;;;;;26501:8;:16;;;;;26582:24;;;;26438:17;;26501:16;;26559:48;;26568:12;;26559:8;:48::i;:::-;26530:77;;26618:24;26645:65;26668:15;:41;;;26645:18;:22;;:65;;;;:::i;:::-;26618:92;-1:-1:-1;26809:20:0;;26805:556;;26917:32;;:36;26913:360;;27011:246;27072:166;27183:15;:32;;;27072:80;16378:6;27072:52;27093:15;:30;;;27072:16;:20;;:52;;;;:::i;:166::-;27011:34;;;;;:38;:246::i;:::-;26974:34;;;:283;26913:360;27287:41;;;:62;;;26805:556;26337:1031;;;;;:::o;27376:750::-;27456:32;27491:16;;;:8;:16;;;;;;;;:24;;;;;;;;;;27561:16;;;:8;:16;;;;;27612:27;;27676:39;;;;27751:34;;;;27491:24;;27561:16;;27612:27;;27676:39;;27751:55;;27676:39;27751:38;:55::i;:::-;27726:80;-1:-1:-1;27823:18:0;;27819:300;;27890:126;27942:59;16378:6;27942:31;:11;27958:14;27942:15;:31::i;:59::-;27890:29;;;;;:33;:126::i;:::-;27858:29;;;;:158;;;;28073:34;;;28031:39;;;:76;27819:300;27376:750;;;;;;;:::o;673:106::-;761:10;673:106;:::o;28134:345::-;16586:33;;;;;;;;;;;;;;;;;28304:57;;28293:10;28304:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28293:69;;;;28258:12;;;;28293:10;;;28304:57;28293:69;;;28304:57;28293:69;;28304:57;28293:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28257:105;;;;28381:7;:57;;;;-1:-1:-1;28393:11:0;;:16;;:44;;;28424:4;28413:24;;;;;;;;;;;;;;;-1:-1:-1;28413:24:0;28393:44;28373:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25196:534;25328:1;25319:6;:10;25311:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25422:16;;;;:8;:16;;;;;;;;:22;;;;;;;;;;:34;:46;;25461:6;25422:38;:46::i;:::-;25385:16;;;;:8;:16;;;;;;;;:22;;;;;;;;;;:83;;;;25515:16;;;:8;:16;;;:33;:45;;25553:6;25515:37;:45::i;:::-;25479:16;;;;:8;:16;;;;;;;;:81;;;;25590:9;:17;;;:27;;;25573:74;;25590:27;;25619:4;25633;25640:6;25573:16;:74::i;:::-;25686:17;;;;:9;:17;;;;;;;;;:27;;;25665:57;;;25686:27;;;25665:57;;;;;;;;;;;;;;25672:6;;25665:57;;;;;;;;;;;25196:534;;;:::o;28487:351::-;16483:34;;;;;;;;;;;;;;;;;28659:60;;28648:10;28659:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28648:72;;;;28613:12;;;;28648:10;;;28659:60;28648:72;;;28659:60;28648:72;;28659:60;28648:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28612:108;;;;28739:7;:57;;;;-1:-1:-1;28751:11:0;;:16;;:44;;;28782:4;28771:24;;;;;;;;;;;;;;;-1:-1:-1;28771:24:0;28751:44;28731:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28846:409;29001:12;29015:17;29049:5;:10;;16693:46;;;;;;;;;;;;;;;;;16683:57;;;;;;;29060:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29049:84;;;;;;;;;29060:72;29049:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29000:133;;;;29152:7;:57;;;;-1:-1:-1;29164:11:0;;:16;;:44;;;29195:4;29184:24;;;;;;;;;;;;;;;-1:-1:-1;29184:24:0;29164:44;29144:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28846:409;;;;;;:::o
Swarm Source
ipfs://69499101fd26def9f372a06cf9a07889d52150c66bd1f5b88f20d79af34d1f3f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.000086 | 98,768,791.9253 | $8,454.61 |
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.