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 4,879 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Unstake | 20291240 | 32 hrs ago | IN | 0 ETH | 0.00060023 | ||||
Redeem Rewards B... | 20281926 | 2 days ago | IN | 0 ETH | 0.00143011 | ||||
Unstake | 20185965 | 16 days ago | IN | 0 ETH | 0.000612 | ||||
Redeem Rewards | 20093622 | 28 days ago | IN | 0 ETH | 0.00040375 | ||||
Unstake | 20093607 | 28 days ago | IN | 0 ETH | 0.00032671 | ||||
Unstake | 20088220 | 29 days ago | IN | 0 ETH | 0.00080901 | ||||
Stake | 20059485 | 33 days ago | IN | 0 ETH | 0.00035406 | ||||
Redeem Rewards | 20047226 | 35 days ago | IN | 0 ETH | 0.00156796 | ||||
Unstake | 20016870 | 39 days ago | IN | 0 ETH | 0.00072679 | ||||
Redeem Rewards | 20002433 | 41 days ago | IN | 0 ETH | 0.00052785 | ||||
Redeem Rewards | 19960995 | 47 days ago | IN | 0 ETH | 0.00192342 | ||||
Unstake | 19957103 | 48 days ago | IN | 0 ETH | 0.00041564 | ||||
Unstake | 19793852 | 70 days ago | IN | 0 ETH | 0.00045707 | ||||
Redeem Rewards | 19744357 | 77 days ago | IN | 0 ETH | 0.00057636 | ||||
Redeem Rewards | 19744336 | 77 days ago | IN | 0 ETH | 0.00059736 | ||||
Redeem Rewards | 19722890 | 80 days ago | IN | 0 ETH | 0.0008947 | ||||
Redeem Rewards | 19722882 | 80 days ago | IN | 0 ETH | 0.00018013 | ||||
Redeem Rewards | 19652091 | 90 days ago | IN | 0 ETH | 0.00101874 | ||||
Redeem Rewards | 19651686 | 90 days ago | IN | 0 ETH | 0.00104838 | ||||
Unstake | 19625664 | 94 days ago | IN | 0 ETH | 0.00271432 | ||||
Unstake | 19597384 | 98 days ago | IN | 0 ETH | 0.00141764 | ||||
Unstake | 19593517 | 98 days ago | IN | 0 ETH | 0.00119821 | ||||
Redeem Rewards | 19586747 | 99 days ago | IN | 0 ETH | 0.00100039 | ||||
Redeem Rewards | 19580566 | 100 days ago | IN | 0 ETH | 0.00194247 | ||||
Unstake | 19554775 | 104 days ago | IN | 0 ETH | 0.00298442 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
StakingPools
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
Yes with 999999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.7.6; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/math/Math.sol"; import "@openzeppelin/contracts/math/SafeMath.sol"; import "./interfaces/IStakingPoolMigrator.sol"; import "./interfaces/IStakingPoolRewarder.sol"; /** * @title StakingPools * * @dev A contract for staking Uniswap LP tokens in exchange for locked CONV rewards. * No actual CONV tokens will be held or distributed by this contract. Only the amounts * are accumulated. * * @dev The `migrator` in this contract has access to users' staked tokens. Any changes * to the migrator address will only take effect after a delay period specified at contract * creation. * * @dev This contract interacts with token contracts via `safeApprove`, `safeTransfer`, * and `safeTransferFrom` instead of the standard Solidity interface so that some non-ERC20- * compatible tokens (e.g. Tether) can also be staked. */ contract StakingPools is Ownable { using SafeMath for uint256; event PoolCreated( uint256 indexed poolId, address indexed token, uint256 startBlock, uint256 endBlock, uint256 migrationBlock, uint256 rewardPerBlock ); event PoolEndBlockExtended(uint256 indexed poolId, uint256 oldEndBlock, uint256 newEndBlock); event PoolMigrationBlockExtended(uint256 indexed poolId, uint256 oldMigrationBlock, uint256 newMigrationBlock); event PoolRewardRateChanged(uint256 indexed poolId, uint256 oldRewardPerBlock, uint256 newRewardPerBlock); event MigratorChangeProposed(address newMigrator); event MigratorChanged(address oldMigrator, address newMigrator); event RewarderChanged(address oldRewarder, address newRewarder); event PoolMigrated(uint256 indexed poolId, address oldToken, address newToken); event Staked(uint256 indexed poolId, address indexed staker, address token, uint256 amount); event Unstaked(uint256 indexed poolId, address indexed staker, address token, uint256 amount); event RewardRedeemed(uint256 indexed poolId, address indexed staker, address rewarder, uint256 amount); /** * @param startBlock the block from which reward accumulation starts * @param endBlock the block from which reward accumulation stops * @param migrationBlock the block since which LP token migration can be triggered * @param rewardPerBlock total amount of token to be rewarded in a block * @param poolToken token to be staked */ struct PoolInfo { uint256 startBlock; uint256 endBlock; uint256 migrationBlock; uint256 rewardPerBlock; address poolToken; } /** * @param totalStakeAmount total amount of staked tokens * @param accuRewardPerShare accumulated rewards for a single unit of token staked, multiplied by `ACCU_REWARD_MULTIPLIER` * @param accuRewardLastUpdateBlock the block number at which the `accuRewardPerShare` field was last updated */ struct PoolData { uint256 totalStakeAmount; uint256 accuRewardPerShare; uint256 accuRewardLastUpdateBlock; } /** * @param stakeAmount amount of token the user stakes * @param pendingReward amount of reward to be redeemed by the user up to the user's last action * @param entryAccuRewardPerShare the `accuRewardPerShare` value at the user's last stake/unstake action */ struct UserData { uint256 stakeAmount; uint256 pendingReward; uint256 entryAccuRewardPerShare; } /** * @param proposeTime timestamp when the change is proposed * @param newMigrator new migrator address */ struct PendingMigratorChange { uint64 proposeTime; address newMigrator; } uint256 public lastPoolId; // The first pool has ID of 1 IStakingPoolMigrator public migrator; uint256 public migratorSetterDelay; PendingMigratorChange public pendingMigrator; IStakingPoolRewarder public rewarder; mapping(uint256 => PoolInfo) public poolInfos; mapping(uint256 => PoolData) public poolData; mapping(uint256 => mapping(address => UserData)) public userData; uint256 private constant ACCU_REWARD_MULTIPLIER = 10**20; // Precision loss prevention bytes4 private constant TRANSFER_SELECTOR = bytes4(keccak256(bytes("transfer(address,uint256)"))); bytes4 private constant APPROVE_SELECTOR = bytes4(keccak256(bytes("approve(address,uint256)"))); bytes4 private constant TRANSFERFROM_SELECTOR = bytes4(keccak256(bytes("transferFrom(address,address,uint256)"))); modifier onlyPoolExists(uint256 poolId) { require(poolInfos[poolId].endBlock > 0, "StakingPools: pool not found"); _; } modifier onlyPoolActive(uint256 poolId) { require( block.number >= poolInfos[poolId].startBlock && block.number < poolInfos[poolId].endBlock, "StakingPools: pool not active" ); _; } modifier onlyPoolNotEnded(uint256 poolId) { require(block.number < poolInfos[poolId].endBlock, "StakingPools: pool ended"); _; } function getReward(uint256 poolId, address staker) external view returns (uint256) { UserData memory currentUserData = userData[poolId][staker]; PoolInfo memory currentPoolInfo = poolInfos[poolId]; PoolData memory currentPoolData = poolData[poolId]; uint256 latestAccuRewardPerShare = currentPoolData.totalStakeAmount > 0 ? currentPoolData.accuRewardPerShare.add( Math .min(block.number, currentPoolInfo.endBlock) .sub(currentPoolData.accuRewardLastUpdateBlock) .mul(currentPoolInfo.rewardPerBlock) .mul(ACCU_REWARD_MULTIPLIER) .div(currentPoolData.totalStakeAmount) ) : currentPoolData.accuRewardPerShare; return currentUserData.pendingReward.add( currentUserData.stakeAmount.mul(latestAccuRewardPerShare.sub(currentUserData.entryAccuRewardPerShare)).div( ACCU_REWARD_MULTIPLIER ) ); } constructor(uint256 _migratorSetterDelay) { require(_migratorSetterDelay > 0, "StakingPools: zero setter delay"); migratorSetterDelay = _migratorSetterDelay; } function createPool( address token, uint256 startBlock, uint256 endBlock, uint256 migrationBlock, uint256 rewardPerBlock ) external onlyOwner { require(token != address(0), "StakingPools: zero address"); require( startBlock > block.number && endBlock > startBlock && migrationBlock > startBlock, "StakingPools: invalid block range" ); require(rewardPerBlock > 0, "StakingPools: reward must be positive"); uint256 newPoolId = ++lastPoolId; poolInfos[newPoolId] = PoolInfo({ startBlock: startBlock, endBlock: endBlock, migrationBlock: migrationBlock, rewardPerBlock: rewardPerBlock, poolToken: token }); poolData[newPoolId] = PoolData({totalStakeAmount: 0, accuRewardPerShare: 0, accuRewardLastUpdateBlock: startBlock}); emit PoolCreated(newPoolId, token, startBlock, endBlock, migrationBlock, rewardPerBlock); } function extendEndBlock(uint256 poolId, uint256 newEndBlock) external onlyOwner onlyPoolExists(poolId) onlyPoolNotEnded(poolId) { uint256 currentEndBlock = poolInfos[poolId].endBlock; require(newEndBlock > currentEndBlock, "StakingPools: end block not extended"); poolInfos[poolId].endBlock = newEndBlock; emit PoolEndBlockExtended(poolId, currentEndBlock, newEndBlock); } function extendMigrationBlock(uint256 poolId, uint256 newMigrationBlock) external onlyOwner onlyPoolExists(poolId) onlyPoolNotEnded(poolId) { uint256 currentMigrationBlock = poolInfos[poolId].migrationBlock; require(newMigrationBlock > currentMigrationBlock, "StakingPools: migration block not extended"); poolInfos[poolId].migrationBlock = newMigrationBlock; emit PoolMigrationBlockExtended(poolId, currentMigrationBlock, newMigrationBlock); } function setPoolReward(uint256 poolId, uint256 newRewardPerBlock) external onlyOwner onlyPoolExists(poolId) onlyPoolNotEnded(poolId) { if ( block.number >= poolInfos[poolId].startBlock) { // "Settle" rewards up to this block _updatePoolAccuReward(poolId); } // We're deliberately allowing setting the reward rate to 0 here. If it turns // out this, or even changing rates at all, is undesirable after deployment, the // ownership of this contract can be transferred to a contract incapable of making // calls to this function. uint256 currentRewardPerBlock = poolInfos[poolId].rewardPerBlock; poolInfos[poolId].rewardPerBlock = newRewardPerBlock; emit PoolRewardRateChanged(poolId, currentRewardPerBlock, newRewardPerBlock); } function proposeMigratorChange(address newMigrator) external onlyOwner { pendingMigrator = PendingMigratorChange({proposeTime: uint64(block.timestamp), newMigrator: newMigrator}); emit MigratorChangeProposed(newMigrator); } function executeMigratorChange() external { require(pendingMigrator.proposeTime > 0, "StakingPools: migrator change proposal not found"); require( block.timestamp >= uint256(pendingMigrator.proposeTime).add(migratorSetterDelay), "StakingPools: migrator setter delay not passed" ); address oldMigrator = address(migrator); migrator = IStakingPoolMigrator(pendingMigrator.newMigrator); // Clear storage pendingMigrator = PendingMigratorChange({proposeTime: 0, newMigrator: address(0)}); emit MigratorChanged(oldMigrator, address(migrator)); } function setRewarder(address newRewarder) external onlyOwner { address oldRewarder = address(rewarder); rewarder = IStakingPoolRewarder(newRewarder); emit RewarderChanged(oldRewarder, newRewarder); } function migratePool(uint256 poolId) external onlyPoolExists(poolId) { require(address(migrator) != address(0), "StakingPools: migrator not set"); PoolInfo memory currentPoolInfo = poolInfos[poolId]; PoolData memory currentPoolData = poolData[poolId]; require(block.number >= currentPoolInfo.migrationBlock, "StakingPools: migration block not reached"); safeApprove(currentPoolInfo.poolToken, address(migrator), currentPoolData.totalStakeAmount); // New token balance is not validated here since the migrator can do whatever // it wants anyways (including providing a fake token address with fake balance). // It's the migrator contract's responsibility to ensure tokens are properly migrated. address newToken = migrator.migrate(poolId, address(currentPoolInfo.poolToken), uint256(currentPoolData.totalStakeAmount)); require(newToken != address(0), "StakingPools: zero new token address"); poolInfos[poolId].poolToken = newToken; emit PoolMigrated(poolId, currentPoolInfo.poolToken, newToken); } function stake(uint256 poolId, uint256 amount) external onlyPoolExists(poolId) onlyPoolActive(poolId) { _updatePoolAccuReward(poolId); _updateStakerReward(poolId, msg.sender); _stake(poolId, msg.sender, amount); } function unstake(uint256 poolId, uint256 amount) external onlyPoolExists(poolId) { _updatePoolAccuReward(poolId); _updateStakerReward(poolId, msg.sender); _unstake(poolId, msg.sender, amount); } function emergencyUnstake(uint256 poolId) external onlyPoolExists(poolId) { _unstake(poolId, msg.sender, userData[poolId][msg.sender].stakeAmount); // Forfeit user rewards to avoid abuse userData[poolId][msg.sender].pendingReward = 0; } function redeemRewards(uint256 poolId) external onlyPoolExists(poolId) { redeemRewardsByAddress(poolId, msg.sender); } function redeemRewardsByAddress(uint256 poolId, address user) public onlyPoolExists(poolId) { require(user != address(0), "StakingPools: zero address"); _updatePoolAccuReward(poolId); _updateStakerReward(poolId, user); require(address(rewarder) != address(0), "StakingPools: rewarder not set"); uint256 rewardToRedeem = userData[poolId][user].pendingReward; require(rewardToRedeem > 0, "StakingPools: no reward to redeem"); userData[poolId][user].pendingReward = 0; rewarder.onReward(poolId, user, rewardToRedeem); emit RewardRedeemed(poolId, user, address(rewarder), rewardToRedeem); } function _stake( uint256 poolId, address user, uint256 amount ) private { require(amount > 0, "StakingPools: cannot stake zero amount"); userData[poolId][user].stakeAmount = userData[poolId][user].stakeAmount.add(amount); poolData[poolId].totalStakeAmount = poolData[poolId].totalStakeAmount.add(amount); safeTransferFrom(poolInfos[poolId].poolToken, user, address(this), amount); emit Staked(poolId, user, poolInfos[poolId].poolToken, amount); } function _unstake( uint256 poolId, address user, uint256 amount ) private { require(amount > 0, "StakingPools: cannot unstake zero amount"); // No sufficiency check required as sub() will throw anyways userData[poolId][user].stakeAmount = userData[poolId][user].stakeAmount.sub(amount); poolData[poolId].totalStakeAmount = poolData[poolId].totalStakeAmount.sub(amount); safeTransfer(poolInfos[poolId].poolToken, user, amount); emit Unstaked(poolId, user, poolInfos[poolId].poolToken, amount); } function _updatePoolAccuReward(uint256 poolId) private { PoolInfo storage currentPoolInfo = poolInfos[poolId]; PoolData storage currentPoolData = poolData[poolId]; uint256 appliedUpdateBlock = Math.min(block.number, currentPoolInfo.endBlock); uint256 durationInBlocks = appliedUpdateBlock.sub(currentPoolData.accuRewardLastUpdateBlock); // This saves tx cost when being called multiple times in the same block if (durationInBlocks > 0) { // No need to update the rate if no one staked at all if (currentPoolData.totalStakeAmount > 0) { currentPoolData.accuRewardPerShare = currentPoolData.accuRewardPerShare.add( durationInBlocks.mul(currentPoolInfo.rewardPerBlock).mul(ACCU_REWARD_MULTIPLIER).div( currentPoolData.totalStakeAmount ) ); } currentPoolData.accuRewardLastUpdateBlock = appliedUpdateBlock; } } function _updateStakerReward(uint256 poolId, address staker) private { UserData storage currentUserData = userData[poolId][staker]; PoolData storage currentPoolData = poolData[poolId]; uint256 stakeAmount = currentUserData.stakeAmount; uint256 stakerEntryRate = currentUserData.entryAccuRewardPerShare; uint256 accuDifference = currentPoolData.accuRewardPerShare.sub(stakerEntryRate); if (accuDifference > 0) { currentUserData.pendingReward = currentUserData.pendingReward.add( stakeAmount.mul(accuDifference).div(ACCU_REWARD_MULTIPLIER) ); currentUserData.entryAccuRewardPerShare = currentPoolData.accuRewardPerShare; } } function safeApprove( address token, address spender, uint256 amount ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(APPROVE_SELECTOR, spender, amount)); require(success && (data.length == 0 || abi.decode(data, (bool))), "StakingPools: approve failed"); } function safeTransfer( address token, address recipient, uint256 amount ) private { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(TRANSFER_SELECTOR, recipient, amount)); require(success && (data.length == 0 || abi.decode(data, (bool))), "StakingPools: transfer failed"); } function safeTransferFrom( address token, address sender, address recipient, uint256 amount ) private { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(TRANSFERFROM_SELECTOR, sender, recipient, amount)); require(success && (data.length == 0 || abi.decode(data, (bool))), "StakingPools: transferFrom failed"); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "../utils/Context.sol"; /** * @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; } }
// SPDX-License-Identifier: MIT 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); } }
// SPDX-License-Identifier: MIT 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; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.6; interface IStakingPoolMigrator { function migrate( uint256 poolId, address oldToken, uint256 amount ) external returns (address); }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.6; interface IStakingPoolRewarder { function onReward( uint256 poolId, address user, uint256 amount ) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
{ "optimizer": { "enabled": true, "runs": 999999 }, "evmVersion": "istanbul", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_migratorSetterDelay","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newMigrator","type":"address"}],"name":"MigratorChangeProposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldMigrator","type":"address"},{"indexed":false,"internalType":"address","name":"newMigrator","type":"address"}],"name":"MigratorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"migrationBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"}],"name":"PoolCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldEndBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newEndBlock","type":"uint256"}],"name":"PoolEndBlockExtended","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"address","name":"oldToken","type":"address"},{"indexed":false,"internalType":"address","name":"newToken","type":"address"}],"name":"PoolMigrated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldMigrationBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMigrationBlock","type":"uint256"}],"name":"PoolMigrationBlockExtended","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldRewardPerBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRewardPerBlock","type":"uint256"}],"name":"PoolRewardRateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"address","name":"rewarder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldRewarder","type":"address"},{"indexed":false,"internalType":"address","name":"newRewarder","type":"address"}],"name":"RewarderChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Unstaked","type":"event"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"uint256","name":"migrationBlock","type":"uint256"},{"internalType":"uint256","name":"rewardPerBlock","type":"uint256"}],"name":"createPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"emergencyUnstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"executeMigratorChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"newEndBlock","type":"uint256"}],"name":"extendEndBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"newMigrationBlock","type":"uint256"}],"name":"extendMigrationBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"address","name":"staker","type":"address"}],"name":"getReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPoolId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"migratePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrator","outputs":[{"internalType":"contract IStakingPoolMigrator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"migratorSetterDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingMigrator","outputs":[{"internalType":"uint64","name":"proposeTime","type":"uint64"},{"internalType":"address","name":"newMigrator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolData","outputs":[{"internalType":"uint256","name":"totalStakeAmount","type":"uint256"},{"internalType":"uint256","name":"accuRewardPerShare","type":"uint256"},{"internalType":"uint256","name":"accuRewardLastUpdateBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfos","outputs":[{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"uint256","name":"migrationBlock","type":"uint256"},{"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"internalType":"address","name":"poolToken","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newMigrator","type":"address"}],"name":"proposeMigratorChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"redeemRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"redeemRewardsByAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewarder","outputs":[{"internalType":"contract IStakingPoolRewarder","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"newRewardPerBlock","type":"uint256"}],"name":"setPoolReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRewarder","type":"address"}],"name":"setRewarder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userData","outputs":[{"internalType":"uint256","name":"stakeAmount","type":"uint256"},{"internalType":"uint256","name":"pendingReward","type":"uint256"},{"internalType":"uint256","name":"entryAccuRewardPerShare","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200334338038062003343833981810160405260208110156200003757600080fd5b5051600062000045620000ee565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060008111620000e5576040805162461bcd60e51b815260206004820152601f60248201527f5374616b696e67506f6f6c733a207a65726f207365747465722064656c617900604482015290519081900360640190fd5b600355620000f2565b3390565b61324180620001026000396000f3fe608060405234801561001057600080fd5b50600436106101a25760003560e01c806372f73499116100ee578063b2ce5df311610097578063dcc3e06e11610071578063dcc3e06e14610510578063ec00208114610518578063f2fde38b14610535578063ff22d24114610568576101a2565b8063b2ce5df31461046f578063b3f2f997146104ba578063d9dbd28d146104ed576101a2565b80638da5cb5b116100c85780638da5cb5b1461043c5780639e2c8a5b14610444578063a657e57914610467576101a2565b806372f73499146103e05780637b0472f0146103e85780637cd07e471461040b576101a2565b80633b61edd3116101505780636ab0f2551161012a5780636ab0f255146103405780637103789414610381578063715018a6146103d8576101a2565b80633b61edd3146102a25780633c634f42146102c5578063689d84e4146102e2576101a2565b80632730661511610181578063273066151461024a57806335f11cc2146102525780633a6462e41461026f576101a2565b80628f33d7146101a7578063012ce501146101f25780630e667f0e14610211575b600080fd5b6101e0600480360360408110156101bd57600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff1661058b565b60408051918252519081900360200190f35b61020f6004803603602081101561020857600080fd5b50356106fb565b005b61020f6004803603604081101561022757600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff166107c0565b61020f610afa565b61020f6004803603602081101561026857600080fd5b5035610c9b565b61020f6004803603602081101561028557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610d28565b61020f600480360360408110156102b857600080fd5b5080359060200135610e58565b61020f600480360360208110156102db57600080fd5b50356110c0565b6102ff600480360360208110156102f857600080fd5b503561149c565b60408051958652602086019490945284840192909252606084015273ffffffffffffffffffffffffffffffffffffffff166080830152519081900360a00190f35b6103486114e1565b6040805167ffffffffffffffff909316835273ffffffffffffffffffffffffffffffffffffffff90911660208301528051918290030190f35b6103ba6004803603604081101561039757600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16611515565b60408051938452602084019290925282820152519081900360600190f35b61020f611541565b6101e0611658565b61020f600480360360408110156103fe57600080fd5b508035906020013561165e565b61041361179c565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6104136117b8565b61020f6004803603604081101561045a57600080fd5b50803590602001356117d4565b6101e0611876565b61020f600480360360a081101561048557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020810135906040810135906060810135906080013561187c565b61020f600480360360208110156104d057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611b9c565b61020f6004803603604081101561050357600080fd5b5080359060200135611d09565b610413611f2d565b6103ba6004803603602081101561052e57600080fd5b5035611f49565b61020f6004803603602081101561054b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611f6a565b61020f6004803603604081101561057e57600080fd5b508035906020013561210b565b600082815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff808616855290835281842082516060808201855282548252600180840154838801526002938401548387015289885260068752858820865160a0810188528154815281830154818a0152818601548189015260038201548185015260049091015490951660808601528988526007875285882086519283018752805480845291810154978301979097529590920154938201939093529192909190849061065c5781602001516106af565b6106af6106a4836000015161069e68056bc75e2d6310000061069888606001516106988960400151610692438d60200151612373565b9061238b565b90612402565b90612475565b6020840151906124f6565b90506106ee6106e368056bc75e2d6310000061069e6106db88604001518661238b90919063ffffffff16565b885190612402565b6020860151906124f6565b9450505050505b92915050565b600081815260066020526040902060010154819061077a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b6000828152600860209081526040808320338085529252909120546107a091849161256a565b506000908152600860209081526040808320338452909152812060010155565b600082815260066020526040902060010154829061083f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff82166108c157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5374616b696e67506f6f6c733a207a65726f2061646472657373000000000000604482015290519081900360640190fd5b6108ca836126f2565b6108d48383612797565b60055473ffffffffffffffffffffffffffffffffffffffff1661095857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f5374616b696e67506f6f6c733a207265776172646572206e6f74207365740000604482015290519081900360640190fd5b600083815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902060010154806109e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806130d96021913960400191505060405180910390fd5b600084815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff8088168086529190935281842060010184905560055482517f7a5f11fa000000000000000000000000000000000000000000000000000000008152600481018a905260248101929092526044820186905291519190921692637a5f11fa926064808201939182900301818387803b158015610a8157600080fd5b505af1158015610a95573d6000803e3d6000fd5b50506005546040805173ffffffffffffffffffffffffffffffffffffffff928316815260208101869052815192881694508893507fef1bb27f27213e5cb8963b669bf571859e849a0b1c0d1135c6932d61a1188ce3929081900390910190a350505050565b60045467ffffffffffffffff16610b5c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806130a96030913960400191505060405180910390fd5b600354600454610b789167ffffffffffffffff909116906124f6565b421015610bd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806131b6602e913960400191505060405180910390fd5b600280546004805473ffffffffffffffffffffffffffffffffffffffff68010000000000000000820481167fffffffffffffffffffffffff00000000000000000000000000000000000000008516179485905560408051808201825260008082526020918201527fffffffff00000000000000000000000000000000000000000000000000000000909316909355825193811680855294169083015280517f57897fe04a846feabc0e56ce4142f7fbd091622a3263e28077ce5fedae906c279281900390910190a150565b6000818152600660205260409020600101548190610d1a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b610d2482336107c0565b5050565b610d30612836565b73ffffffffffffffffffffffffffffffffffffffff16610d4e6117b8565b73ffffffffffffffffffffffffffffffffffffffff1614610dd057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040805191909216808252602082019390935281517f9428ebf8162d9d23f42ee294eb636214dd96f4fab1956b7637f40ff8d414ce73929181900390910190a15050565b610e60612836565b73ffffffffffffffffffffffffffffffffffffffff16610e7e6117b8565b73ffffffffffffffffffffffffffffffffffffffff1614610f0057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000828152600660205260409020600101548290610f7f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b6000838152600660205260409020600101548390431061100057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5374616b696e67506f6f6c733a20706f6f6c20656e6465640000000000000000604482015290519081900360640190fd5b60008481526006602052604090206002015480841161106a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061318c602a913960400191505060405180910390fd5b6000858152600660209081526040918290206002018690558151838152908101869052815187927f59ce6256507da20a008aa4f06f7a4690e99c008a908bf46abe9407444b5444d7928290030190a25050505050565b600081815260066020526040902060010154819061113f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b60025473ffffffffffffffffffffffffffffffffffffffff166111c357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f5374616b696e67506f6f6c733a206d69677261746f72206e6f74207365740000604482015290519081900360640190fd5b6000828152600660209081526040808320815160a0810183528154815260018083015482860152600280840154838601908152600385015460608086019190915260049095015473ffffffffffffffffffffffffffffffffffffffff166080850152898852600787529685902085519485018652805485529182015495840195909552909301549181019190915291519091904310156112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806131636029913960400191505060405180910390fd5b608082015160025482516112d9929173ffffffffffffffffffffffffffffffffffffffff169061283a565b60025460808301518251604080517f4ef88bea0000000000000000000000000000000000000000000000000000000081526004810189905273ffffffffffffffffffffffffffffffffffffffff93841660248201526044810192909252516000939290921691634ef88bea9160648082019260209290919082900301818787803b15801561136657600080fd5b505af115801561137a573d6000803e3d6000fd5b505050506040513d602081101561139057600080fd5b5051905073ffffffffffffffffffffffffffffffffffffffff8116611400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806130fa6024913960400191505060405180910390fd5b60008581526006602090815260409182902060040180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff858116918217909255608087015184519216825291810191909152815187927fb7ede30df1964589448863a66272f2b59b886c3364a82ed9cef9f9e30ab017c3928290030190a25050505050565b600660205260009081526040902080546001820154600283015460038401546004909401549293919290919073ffffffffffffffffffffffffffffffffffffffff1685565b60045467ffffffffffffffff81169068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1682565b600860209081526000928352604080842090915290825290208054600182015460029092015490919083565b611549612836565b73ffffffffffffffffffffffffffffffffffffffff166115676117b8565b73ffffffffffffffffffffffffffffffffffffffff16146115e957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60035481565b60008281526006602052604090206001015482906116dd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b6000838152600660205260409020548390431080159061170d575060008181526006602052604090206001015443105b61177857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420616374697665000000604482015290519081900360640190fd5b611781846126f2565b61178b8433612797565b611796843385612a3f565b50505050565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b600082815260066020526040902060010154829061185357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b61185c836126f2565b6118668333612797565b61187183338461256a565b505050565b60015481565b611884612836565b73ffffffffffffffffffffffffffffffffffffffff166118a26117b8565b73ffffffffffffffffffffffffffffffffffffffff161461192457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff85166119a657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5374616b696e67506f6f6c733a207a65726f2061646472657373000000000000604482015290519081900360640190fd5b43841180156119b457508383115b80156119bf57508382115b611a14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806130886021913960400191505060405180910390fd5b60008111611a6d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806130186025913960400191505060405180910390fd5b6001805481018082556040805160a0810182528781526020808201888152828401888152606080850189815273ffffffffffffffffffffffffffffffffffffffff8e8116608080890182815260008c815260068a528b81209a518b5597518a8e015595516002808b0191909155935160038a01559451600490980180547fffffffffffffffffffffffff00000000000000000000000000000000000000001698909216979097179055865180830188528481528086018581528189018f81528a875260078852958990209151825551998101999099559251979092019690965583518a8152918201899052818401889052810186905291519293909284927f36766c23c4dce64b1651af7bae0782e208b9146d590e780046a7b84c24a74dbf92908290030190a3505050505050565b611ba4612836565b73ffffffffffffffffffffffffffffffffffffffff16611bc26117b8565b73ffffffffffffffffffffffffffffffffffffffff1614611c4457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6040805180820182524267ffffffffffffffff1680825273ffffffffffffffffffffffffffffffffffffffff84166020928301819052600480547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169092177fffffffff0000000000000000000000000000000000000000ffffffffffffffff1668010000000000000000820217909155825190815291517fa29574a23976d25a545c50ae3e198c1eccdd2d6313b17a9c8ec1dc24a20551b59281900390910190a150565b611d11612836565b73ffffffffffffffffffffffffffffffffffffffff16611d2f6117b8565b73ffffffffffffffffffffffffffffffffffffffff1614611db157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000828152600660205260409020600101548290611e3057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b60008381526006602052604090206001015483904310611eb157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5374616b696e67506f6f6c733a20706f6f6c20656e6465640000000000000000604482015290519081900360640190fd5b6000848152600660205260409020544310611ecf57611ecf846126f2565b60008481526006602090815260409182902060030180549086905582518181529182018690528251909287927fe8c0ef92b4d0c5e15388b280719c402b7e9d101833759d5f3d23fcb25cd9593b929081900390910190a25050505050565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b60076020526000908152604090208054600182015460029092015490919083565b611f72612836565b73ffffffffffffffffffffffffffffffffffffffff16611f906117b8565b73ffffffffffffffffffffffffffffffffffffffff161461201257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661207e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806130626026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b612113612836565b73ffffffffffffffffffffffffffffffffffffffff166121316117b8565b73ffffffffffffffffffffffffffffffffffffffff16146121b357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600082815260066020526040902060010154829061223257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b600083815260066020526040902060010154839043106122b357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5374616b696e67506f6f6c733a20706f6f6c20656e6465640000000000000000604482015290519081900360640190fd5b60008481526006602052604090206001015480841161231d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061311e6024913960400191505060405180910390fd5b6000858152600660209081526040918290206001018690558151838152908101869052815187927f4160dc602e30ed6f057cad6503bed525ae1b6b025bffb9e84683d5ecf10f64eb928290030190a25050505050565b60008183106123825781612384565b825b9392505050565b6000828211156123fc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082612411575060006106f5565b8282028284828161241e57fe5b0414612384576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806131426021913960400191505060405180910390fd5b60008082116124e557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816124ee57fe5b049392505050565b60008282018381101561238457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600081116125c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806131e46028913960400191505060405180910390fd5b600083815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546125fd908261238b565b600084815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452825280832093909355858252600790522054612643908261238b565b6000848152600760209081526040808320939093556006905220600401546126829073ffffffffffffffffffffffffffffffffffffffff168383612bc8565b60008381526006602090815260409182902060040154825173ffffffffffffffffffffffffffffffffffffffff918216815291820184905282519085169286927f88567e6595ad345e5250569a2c8d8a50ed9db24198350fa907e42d73faf012d5929081900390910190a3505050565b60008181526006602090815260408083206007909252822060018201549192909161271e904390612373565b9050600061273983600201548361238b90919063ffffffff16565b905080156127905782541561278857612782612777846000015461069e68056bc75e2d6310000061069889600301548761240290919063ffffffff16565b6001850154906124f6565b60018401555b600283018290555b5050505050565b600082815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845282528083208584526007909252822081546002830154600183015493949293919290916127ee908361238b565b9050801561282d5761281b61281068056bc75e2d6310000061069e8685612402565b6001870154906124f6565b60018087019190915584015460028601555b50505050505050565b3390565b604080518082018252601881527f617070726f766528616464726573732c75696e74323536290000000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b30000000000000000000000000000000000000000000000000000000017815292518151600094859489169392918291908083835b6020831061293f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612902565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146129a1576040519150601f19603f3d011682016040523d82523d6000602084013e6129a6565b606091505b50915091508180156129d45750805115806129d457508080602001905160208110156129d157600080fd5b50515b61279057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20617070726f7665206661696c656400000000604482015290519081900360640190fd5b60008111612a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612fd16026913960400191505060405180910390fd5b600083815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902054612ad290826124f6565b600084815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452825280832093909355858252600790522054612b1890826124f6565b600084815260076020908152604080832093909355600690522060040154612b589073ffffffffffffffffffffffffffffffffffffffff16833084612dcd565b60008381526006602090815260409182902060040154825173ffffffffffffffffffffffffffffffffffffffff918216815291820184905282519085169286927f7edb7e181699d1db1f6e3ac27fb17e1db8ac69aeb22eec366e72528c0886726a929081900390910190a3505050565b604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017815292518151600094859489169392918291908083835b60208310612ccd57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612c90565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612d2f576040519150601f19603f3d011682016040523d82523d6000602084013e612d34565b606091505b5091509150818015612d62575080511580612d625750808060200190516020811015612d5f57600080fd5b50515b61279057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5374616b696e67506f6f6c733a207472616e73666572206661696c6564000000604482015290519081900360640190fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1660405180606001604052806025815260200161303d6025913980516020918201206040805173ffffffffffffffffffffffffffffffffffffffff808b166024830152891660448201526064808201899052825180830390910181526084909101825292830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092178252518251909182918083835b60208310612ede57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612ea1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612f40576040519150601f19603f3d011682016040523d82523d6000602084013e612f45565b606091505b5091509150818015612f73575080511580612f735750808060200190516020811015612f7057600080fd5b50515b612fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612ff76021913960400191505060405180910390fd5b50505050505056fe5374616b696e67506f6f6c733a2063616e6e6f74207374616b65207a65726f20616d6f756e745374616b696e67506f6f6c733a207472616e7366657246726f6d206661696c65645374616b696e67506f6f6c733a20726577617264206d75737420626520706f7369746976657472616e7366657246726f6d28616464726573732c616464726573732c75696e74323536294f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735374616b696e67506f6f6c733a20696e76616c696420626c6f636b2072616e67655374616b696e67506f6f6c733a206d69677261746f72206368616e67652070726f706f73616c206e6f7420666f756e645374616b696e67506f6f6c733a206e6f2072657761726420746f2072656465656d5374616b696e67506f6f6c733a207a65726f206e657720746f6b656e20616464726573735374616b696e67506f6f6c733a20656e6420626c6f636b206e6f7420657874656e646564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775374616b696e67506f6f6c733a206d6967726174696f6e20626c6f636b206e6f7420726561636865645374616b696e67506f6f6c733a206d6967726174696f6e20626c6f636b206e6f7420657874656e6465645374616b696e67506f6f6c733a206d69677261746f72207365747465722064656c6179206e6f74207061737365645374616b696e67506f6f6c733a2063616e6e6f7420756e7374616b65207a65726f20616d6f756e74a26469706673582212208c8dbf1eb88a4ed725a74aa7e570b09b1d1ab86435b28ad6ef28a9e7b698771364736f6c634300070600330000000000000000000000000000000000000000000000000000000000093a80
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101a25760003560e01c806372f73499116100ee578063b2ce5df311610097578063dcc3e06e11610071578063dcc3e06e14610510578063ec00208114610518578063f2fde38b14610535578063ff22d24114610568576101a2565b8063b2ce5df31461046f578063b3f2f997146104ba578063d9dbd28d146104ed576101a2565b80638da5cb5b116100c85780638da5cb5b1461043c5780639e2c8a5b14610444578063a657e57914610467576101a2565b806372f73499146103e05780637b0472f0146103e85780637cd07e471461040b576101a2565b80633b61edd3116101505780636ab0f2551161012a5780636ab0f255146103405780637103789414610381578063715018a6146103d8576101a2565b80633b61edd3146102a25780633c634f42146102c5578063689d84e4146102e2576101a2565b80632730661511610181578063273066151461024a57806335f11cc2146102525780633a6462e41461026f576101a2565b80628f33d7146101a7578063012ce501146101f25780630e667f0e14610211575b600080fd5b6101e0600480360360408110156101bd57600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff1661058b565b60408051918252519081900360200190f35b61020f6004803603602081101561020857600080fd5b50356106fb565b005b61020f6004803603604081101561022757600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff166107c0565b61020f610afa565b61020f6004803603602081101561026857600080fd5b5035610c9b565b61020f6004803603602081101561028557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610d28565b61020f600480360360408110156102b857600080fd5b5080359060200135610e58565b61020f600480360360208110156102db57600080fd5b50356110c0565b6102ff600480360360208110156102f857600080fd5b503561149c565b60408051958652602086019490945284840192909252606084015273ffffffffffffffffffffffffffffffffffffffff166080830152519081900360a00190f35b6103486114e1565b6040805167ffffffffffffffff909316835273ffffffffffffffffffffffffffffffffffffffff90911660208301528051918290030190f35b6103ba6004803603604081101561039757600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16611515565b60408051938452602084019290925282820152519081900360600190f35b61020f611541565b6101e0611658565b61020f600480360360408110156103fe57600080fd5b508035906020013561165e565b61041361179c565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6104136117b8565b61020f6004803603604081101561045a57600080fd5b50803590602001356117d4565b6101e0611876565b61020f600480360360a081101561048557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020810135906040810135906060810135906080013561187c565b61020f600480360360208110156104d057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611b9c565b61020f6004803603604081101561050357600080fd5b5080359060200135611d09565b610413611f2d565b6103ba6004803603602081101561052e57600080fd5b5035611f49565b61020f6004803603602081101561054b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611f6a565b61020f6004803603604081101561057e57600080fd5b508035906020013561210b565b600082815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff808616855290835281842082516060808201855282548252600180840154838801526002938401548387015289885260068752858820865160a0810188528154815281830154818a0152818601548189015260038201548185015260049091015490951660808601528988526007875285882086519283018752805480845291810154978301979097529590920154938201939093529192909190849061065c5781602001516106af565b6106af6106a4836000015161069e68056bc75e2d6310000061069888606001516106988960400151610692438d60200151612373565b9061238b565b90612402565b90612475565b6020840151906124f6565b90506106ee6106e368056bc75e2d6310000061069e6106db88604001518661238b90919063ffffffff16565b885190612402565b6020860151906124f6565b9450505050505b92915050565b600081815260066020526040902060010154819061077a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b6000828152600860209081526040808320338085529252909120546107a091849161256a565b506000908152600860209081526040808320338452909152812060010155565b600082815260066020526040902060010154829061083f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff82166108c157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5374616b696e67506f6f6c733a207a65726f2061646472657373000000000000604482015290519081900360640190fd5b6108ca836126f2565b6108d48383612797565b60055473ffffffffffffffffffffffffffffffffffffffff1661095857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f5374616b696e67506f6f6c733a207265776172646572206e6f74207365740000604482015290519081900360640190fd5b600083815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902060010154806109e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806130d96021913960400191505060405180910390fd5b600084815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff8088168086529190935281842060010184905560055482517f7a5f11fa000000000000000000000000000000000000000000000000000000008152600481018a905260248101929092526044820186905291519190921692637a5f11fa926064808201939182900301818387803b158015610a8157600080fd5b505af1158015610a95573d6000803e3d6000fd5b50506005546040805173ffffffffffffffffffffffffffffffffffffffff928316815260208101869052815192881694508893507fef1bb27f27213e5cb8963b669bf571859e849a0b1c0d1135c6932d61a1188ce3929081900390910190a350505050565b60045467ffffffffffffffff16610b5c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806130a96030913960400191505060405180910390fd5b600354600454610b789167ffffffffffffffff909116906124f6565b421015610bd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806131b6602e913960400191505060405180910390fd5b600280546004805473ffffffffffffffffffffffffffffffffffffffff68010000000000000000820481167fffffffffffffffffffffffff00000000000000000000000000000000000000008516179485905560408051808201825260008082526020918201527fffffffff00000000000000000000000000000000000000000000000000000000909316909355825193811680855294169083015280517f57897fe04a846feabc0e56ce4142f7fbd091622a3263e28077ce5fedae906c279281900390910190a150565b6000818152600660205260409020600101548190610d1a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b610d2482336107c0565b5050565b610d30612836565b73ffffffffffffffffffffffffffffffffffffffff16610d4e6117b8565b73ffffffffffffffffffffffffffffffffffffffff1614610dd057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040805191909216808252602082019390935281517f9428ebf8162d9d23f42ee294eb636214dd96f4fab1956b7637f40ff8d414ce73929181900390910190a15050565b610e60612836565b73ffffffffffffffffffffffffffffffffffffffff16610e7e6117b8565b73ffffffffffffffffffffffffffffffffffffffff1614610f0057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000828152600660205260409020600101548290610f7f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b6000838152600660205260409020600101548390431061100057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5374616b696e67506f6f6c733a20706f6f6c20656e6465640000000000000000604482015290519081900360640190fd5b60008481526006602052604090206002015480841161106a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061318c602a913960400191505060405180910390fd5b6000858152600660209081526040918290206002018690558151838152908101869052815187927f59ce6256507da20a008aa4f06f7a4690e99c008a908bf46abe9407444b5444d7928290030190a25050505050565b600081815260066020526040902060010154819061113f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b60025473ffffffffffffffffffffffffffffffffffffffff166111c357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f5374616b696e67506f6f6c733a206d69677261746f72206e6f74207365740000604482015290519081900360640190fd5b6000828152600660209081526040808320815160a0810183528154815260018083015482860152600280840154838601908152600385015460608086019190915260049095015473ffffffffffffffffffffffffffffffffffffffff166080850152898852600787529685902085519485018652805485529182015495840195909552909301549181019190915291519091904310156112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806131636029913960400191505060405180910390fd5b608082015160025482516112d9929173ffffffffffffffffffffffffffffffffffffffff169061283a565b60025460808301518251604080517f4ef88bea0000000000000000000000000000000000000000000000000000000081526004810189905273ffffffffffffffffffffffffffffffffffffffff93841660248201526044810192909252516000939290921691634ef88bea9160648082019260209290919082900301818787803b15801561136657600080fd5b505af115801561137a573d6000803e3d6000fd5b505050506040513d602081101561139057600080fd5b5051905073ffffffffffffffffffffffffffffffffffffffff8116611400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806130fa6024913960400191505060405180910390fd5b60008581526006602090815260409182902060040180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff858116918217909255608087015184519216825291810191909152815187927fb7ede30df1964589448863a66272f2b59b886c3364a82ed9cef9f9e30ab017c3928290030190a25050505050565b600660205260009081526040902080546001820154600283015460038401546004909401549293919290919073ffffffffffffffffffffffffffffffffffffffff1685565b60045467ffffffffffffffff81169068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1682565b600860209081526000928352604080842090915290825290208054600182015460029092015490919083565b611549612836565b73ffffffffffffffffffffffffffffffffffffffff166115676117b8565b73ffffffffffffffffffffffffffffffffffffffff16146115e957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60035481565b60008281526006602052604090206001015482906116dd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b6000838152600660205260409020548390431080159061170d575060008181526006602052604090206001015443105b61177857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420616374697665000000604482015290519081900360640190fd5b611781846126f2565b61178b8433612797565b611796843385612a3f565b50505050565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b600082815260066020526040902060010154829061185357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b61185c836126f2565b6118668333612797565b61187183338461256a565b505050565b60015481565b611884612836565b73ffffffffffffffffffffffffffffffffffffffff166118a26117b8565b73ffffffffffffffffffffffffffffffffffffffff161461192457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff85166119a657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5374616b696e67506f6f6c733a207a65726f2061646472657373000000000000604482015290519081900360640190fd5b43841180156119b457508383115b80156119bf57508382115b611a14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806130886021913960400191505060405180910390fd5b60008111611a6d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806130186025913960400191505060405180910390fd5b6001805481018082556040805160a0810182528781526020808201888152828401888152606080850189815273ffffffffffffffffffffffffffffffffffffffff8e8116608080890182815260008c815260068a528b81209a518b5597518a8e015595516002808b0191909155935160038a01559451600490980180547fffffffffffffffffffffffff00000000000000000000000000000000000000001698909216979097179055865180830188528481528086018581528189018f81528a875260078852958990209151825551998101999099559251979092019690965583518a8152918201899052818401889052810186905291519293909284927f36766c23c4dce64b1651af7bae0782e208b9146d590e780046a7b84c24a74dbf92908290030190a3505050505050565b611ba4612836565b73ffffffffffffffffffffffffffffffffffffffff16611bc26117b8565b73ffffffffffffffffffffffffffffffffffffffff1614611c4457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6040805180820182524267ffffffffffffffff1680825273ffffffffffffffffffffffffffffffffffffffff84166020928301819052600480547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169092177fffffffff0000000000000000000000000000000000000000ffffffffffffffff1668010000000000000000820217909155825190815291517fa29574a23976d25a545c50ae3e198c1eccdd2d6313b17a9c8ec1dc24a20551b59281900390910190a150565b611d11612836565b73ffffffffffffffffffffffffffffffffffffffff16611d2f6117b8565b73ffffffffffffffffffffffffffffffffffffffff1614611db157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000828152600660205260409020600101548290611e3057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b60008381526006602052604090206001015483904310611eb157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5374616b696e67506f6f6c733a20706f6f6c20656e6465640000000000000000604482015290519081900360640190fd5b6000848152600660205260409020544310611ecf57611ecf846126f2565b60008481526006602090815260409182902060030180549086905582518181529182018690528251909287927fe8c0ef92b4d0c5e15388b280719c402b7e9d101833759d5f3d23fcb25cd9593b929081900390910190a25050505050565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b60076020526000908152604090208054600182015460029092015490919083565b611f72612836565b73ffffffffffffffffffffffffffffffffffffffff16611f906117b8565b73ffffffffffffffffffffffffffffffffffffffff161461201257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661207e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806130626026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b612113612836565b73ffffffffffffffffffffffffffffffffffffffff166121316117b8565b73ffffffffffffffffffffffffffffffffffffffff16146121b357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600082815260066020526040902060010154829061223257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20706f6f6c206e6f7420666f756e6400000000604482015290519081900360640190fd5b600083815260066020526040902060010154839043106122b357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5374616b696e67506f6f6c733a20706f6f6c20656e6465640000000000000000604482015290519081900360640190fd5b60008481526006602052604090206001015480841161231d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061311e6024913960400191505060405180910390fd5b6000858152600660209081526040918290206001018690558151838152908101869052815187927f4160dc602e30ed6f057cad6503bed525ae1b6b025bffb9e84683d5ecf10f64eb928290030190a25050505050565b60008183106123825781612384565b825b9392505050565b6000828211156123fc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082612411575060006106f5565b8282028284828161241e57fe5b0414612384576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806131426021913960400191505060405180910390fd5b60008082116124e557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816124ee57fe5b049392505050565b60008282018381101561238457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600081116125c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806131e46028913960400191505060405180910390fd5b600083815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546125fd908261238b565b600084815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452825280832093909355858252600790522054612643908261238b565b6000848152600760209081526040808320939093556006905220600401546126829073ffffffffffffffffffffffffffffffffffffffff168383612bc8565b60008381526006602090815260409182902060040154825173ffffffffffffffffffffffffffffffffffffffff918216815291820184905282519085169286927f88567e6595ad345e5250569a2c8d8a50ed9db24198350fa907e42d73faf012d5929081900390910190a3505050565b60008181526006602090815260408083206007909252822060018201549192909161271e904390612373565b9050600061273983600201548361238b90919063ffffffff16565b905080156127905782541561278857612782612777846000015461069e68056bc75e2d6310000061069889600301548761240290919063ffffffff16565b6001850154906124f6565b60018401555b600283018290555b5050505050565b600082815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845282528083208584526007909252822081546002830154600183015493949293919290916127ee908361238b565b9050801561282d5761281b61281068056bc75e2d6310000061069e8685612402565b6001870154906124f6565b60018087019190915584015460028601555b50505050505050565b3390565b604080518082018252601881527f617070726f766528616464726573732c75696e74323536290000000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b30000000000000000000000000000000000000000000000000000000017815292518151600094859489169392918291908083835b6020831061293f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612902565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146129a1576040519150601f19603f3d011682016040523d82523d6000602084013e6129a6565b606091505b50915091508180156129d45750805115806129d457508080602001905160208110156129d157600080fd5b50515b61279057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5374616b696e67506f6f6c733a20617070726f7665206661696c656400000000604482015290519081900360640190fd5b60008111612a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612fd16026913960400191505060405180910390fd5b600083815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902054612ad290826124f6565b600084815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452825280832093909355858252600790522054612b1890826124f6565b600084815260076020908152604080832093909355600690522060040154612b589073ffffffffffffffffffffffffffffffffffffffff16833084612dcd565b60008381526006602090815260409182902060040154825173ffffffffffffffffffffffffffffffffffffffff918216815291820184905282519085169286927f7edb7e181699d1db1f6e3ac27fb17e1db8ac69aeb22eec366e72528c0886726a929081900390910190a3505050565b604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017815292518151600094859489169392918291908083835b60208310612ccd57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612c90565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612d2f576040519150601f19603f3d011682016040523d82523d6000602084013e612d34565b606091505b5091509150818015612d62575080511580612d625750808060200190516020811015612d5f57600080fd5b50515b61279057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5374616b696e67506f6f6c733a207472616e73666572206661696c6564000000604482015290519081900360640190fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1660405180606001604052806025815260200161303d6025913980516020918201206040805173ffffffffffffffffffffffffffffffffffffffff808b166024830152891660448201526064808201899052825180830390910181526084909101825292830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092178252518251909182918083835b60208310612ede57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612ea1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612f40576040519150601f19603f3d011682016040523d82523d6000602084013e612f45565b606091505b5091509150818015612f73575080511580612f735750808060200190516020811015612f7057600080fd5b50515b612fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612ff76021913960400191505060405180910390fd5b50505050505056fe5374616b696e67506f6f6c733a2063616e6e6f74207374616b65207a65726f20616d6f756e745374616b696e67506f6f6c733a207472616e7366657246726f6d206661696c65645374616b696e67506f6f6c733a20726577617264206d75737420626520706f7369746976657472616e7366657246726f6d28616464726573732c616464726573732c75696e74323536294f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735374616b696e67506f6f6c733a20696e76616c696420626c6f636b2072616e67655374616b696e67506f6f6c733a206d69677261746f72206368616e67652070726f706f73616c206e6f7420666f756e645374616b696e67506f6f6c733a206e6f2072657761726420746f2072656465656d5374616b696e67506f6f6c733a207a65726f206e657720746f6b656e20616464726573735374616b696e67506f6f6c733a20656e6420626c6f636b206e6f7420657874656e646564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775374616b696e67506f6f6c733a206d6967726174696f6e20626c6f636b206e6f7420726561636865645374616b696e67506f6f6c733a206d6967726174696f6e20626c6f636b206e6f7420657874656e6465645374616b696e67506f6f6c733a206d69677261746f72207365747465722064656c6179206e6f74207061737365645374616b696e67506f6f6c733a2063616e6e6f7420756e7374616b65207a65726f20616d6f756e74a26469706673582212208c8dbf1eb88a4ed725a74aa7e570b09b1d1ab86435b28ad6ef28a9e7b698771364736f6c63430007060033
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
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.000838 | 37,506,527.4036 | $31,442.93 |
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.