More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,206 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Release | 14966233 | 748 days ago | IN | 0 ETH | 0.00215528 | ||||
Release | 14399891 | 839 days ago | IN | 0 ETH | 0.00508456 | ||||
Release | 14371013 | 843 days ago | IN | 0 ETH | 0.00113939 | ||||
Get Rewards | 14364858 | 844 days ago | IN | 0 ETH | 0.00108841 | ||||
Get Rewards | 14319042 | 851 days ago | IN | 0 ETH | 0.00133092 | ||||
Release | 14313607 | 852 days ago | IN | 0 ETH | 0.00200859 | ||||
Release | 14278153 | 858 days ago | IN | 0 ETH | 0.00680418 | ||||
Release | 14222796 | 866 days ago | IN | 0 ETH | 0.00338706 | ||||
Release | 14216011 | 867 days ago | IN | 0 ETH | 0.00164523 | ||||
Release | 14216011 | 867 days ago | IN | 0 ETH | 0.0044332 | ||||
Release | 14199098 | 870 days ago | IN | 0 ETH | 0.00393938 | ||||
Get Rewards | 14199092 | 870 days ago | IN | 0 ETH | 0.00327251 | ||||
Release | 14176754 | 873 days ago | IN | 0 ETH | 0.00501724 | ||||
Release | 14174051 | 874 days ago | IN | 0 ETH | 0.0085972 | ||||
Unlock Tokens | 14151935 | 877 days ago | IN | 0 ETH | 0.00267 | ||||
Release | 14146187 | 878 days ago | IN | 0 ETH | 0.00416081 | ||||
Release | 14145239 | 878 days ago | IN | 0 ETH | 0.00398668 | ||||
Release | 14060522 | 891 days ago | IN | 0 ETH | 0.0065046 | ||||
Release | 14043124 | 894 days ago | IN | 0 ETH | 0.00686212 | ||||
Release | 14042127 | 894 days ago | IN | 0 ETH | 0.00608216 | ||||
Release | 14042096 | 894 days ago | IN | 0 ETH | 0.00705113 | ||||
Release | 14041077 | 894 days ago | IN | 0 ETH | 0.00644057 | ||||
Release | 14032555 | 896 days ago | IN | 0 ETH | 0.00982713 | ||||
Release | 14026210 | 897 days ago | IN | 0 ETH | 0.00913744 | ||||
Release | 14009603 | 899 days ago | IN | 0 ETH | 0.0076885 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Staking
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 999999 runs
Other Settings:
default evmVersion, Audited
Contract Source Code (Solidity Standard Json-Input format)Audit Report
// SPDX-License-Identifier: MIT pragma solidity 0.8.4; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; /// @notice Wording below needs to properly represent the legal terms so has to be reviewed /// @notice Comments have been written by the development team and may not represent the actual terms of the contract correctly /// @title Oiler Staking /// @author oiler.network /// @dev that staking contract is fully dependent on the provided reward token and the underlying LP token. /** * @notice Staking contract assumes there is a Staking Program going on until a specified Staking Program End Date. * And there is an amount of Oiler tokens that is gonna be given away to incentivise participation in the Staking Program (called StakingFund). * * During this Program - users commit to lock tokens for some period of time, earning RewardPoints (if they don't unlock prematurely). * RewardPoints multiplier grows linearly with the locking period length (see the formula in calculateStakingRewardPoints() function) * * After the end of the Staking Program - the amount of RewardPoints earned by each user is relatively compared to the total RewardPoints * earned by all staking participants - and the OIL tokens from StakingFund are divided among them accordingly, by their RewardPoints proportions. */ contract Staking { /** * @dev Saving gas by using lower-bit variables to fit the Stake struct into 256bits * * LP Tokens are calculated by this formula: * LP Tokens = sqrt(tokenAmount * e18 * usdcAmount * e6) = * = sqrt(100 000 000 * usdcAmount * e24) = // here 100 000 000 is totalSupply of OIL * = sqrt(usdcAmount * e32) = * = sqrt(usdcAmount) * e16 * * Thus the maximum amount of USDC we can use to not overflow the maximum amount of uint72 (4722 e18) will be: * sqrt(usdcAmount) * e16 < 4722 * e18 * sqrt(usdcAmount) < 472 200 * usdcAmount < 222 972 840 000 * Which is over two hundred trillion dollars - the amount highly improbable at our Uniswap pool as for today * * tokenAmount is limited by LP tokens amount (4722e18 LPs for hundreds of trillions of dollars) (Range: [0 - 4722 e18] - uint72 (max 4722 e18)) * lockingPeriodInBlocks is limited by Staking Program duration (around 700000 blocks) (Range: [1 - 700000] - uint24 (max 16 777 215)) * startBlock is in a typical range of Mainnet, Testnets, local networks blocks range (Range: [0 - 100 000 000] - uint32 (max 4 294 967 295)) * * expectedStakingRewardPoints is limited by: * LP tokens amount * lockingPeriodInBlocks * lockingPeriodInBlocks * which is: * uint72 * uint24 * uint24 = which gives us max uint120, but we use uint128 anyway (Range: [0 - 1.33 e36] - uint128 (max 340 e36)) */ struct Stake { uint72 tokenAmount; // Amount of tokens locked in a stake uint24 lockingPeriodInBlocks; // Arbitrary lock period that will give you a reward uint32 startBlock; // Start of the locking uint128 expectedStakingRewardPoints; // The amount of RewardPoints the stake will earn if not unlocked prematurely } /// @notice Active stakes for each user mapping (address => Stake) public stakes; /// @notice "Reward points" each user earned (would be relative to totalRewardPoints to get the percentage) mapping (address => uint256) public rewardPointsEarned; /// @notice Total "reward points" all users earned uint256 public totalRewardPoints; /// @notice Block when Staking Program ends uint256 immutable public stakingProgramEndsBlock; /// @notice Amount of Staking Bonus Fund (500 000 OIL), Oiler funds must be here, approved and ready to be transferredFrom uint256 immutable public stakingFundAmount; /// @notice Uniswap pool that we accept LP tokens from IERC20 public poolToken; /// @notice Oiler token that will be given as a reward IERC20 immutable public oilerToken; /// @notice The amount of OIL tokens earned, granted to be released during vesting period mapping (address => uint256) public grantedTokens; /// @notice The amount of OIL tokens that were already released during vesting period mapping (address => uint256) public releasedTokens; /// @dev In blocks - should be around 100 days uint256 immutable public vestingDuration; /// @dev Check if poolToken was initialized modifier poolTokenSet() { require(address(poolToken) != address(0x0), "poolToken not set"); _; } /// @dev Owner is used only in setPoolToken() address immutable public owner; /// @dev Used only in setPoolToken() modifier onlyOwner() { require(msg.sender == owner, "Can only be called by owner"); _; } /** * @dev before deploying the stakingFundAddress must have set allowances on behalf of that contract. The address can be predicted basing on the CREATE or CREATE2 opcode. * @param oilerToken_ - address of the token in which rewards will be payed off. * @param stakingDurationInBlocks_ - Number of blocks after which staking will end. * @param stakingFundAmount_ - Amount of tokens to be payed of as rewards. * @param vestingDuration_ - Number of blocks after which OIL tokens earned by staking will be released (duration of Vesting period). * @param owner_ - Owner of the contract (is used to initialize poolToken after it's available). */ constructor(address oilerToken_, uint256 stakingDurationInBlocks_, uint256 stakingFundAmount_, uint256 vestingDuration_, address owner_) { require(owner_ != address(0x0), "Owner address cannot be zero"); owner = owner_; require(oilerToken_ != address(0x0), "oilerToken address cannot be zero"); oilerToken = IERC20(oilerToken_); stakingProgramEndsBlock = block.number + stakingDurationInBlocks_; vestingDuration = vestingDuration_; stakingFundAmount = stakingFundAmount_; } /// @notice Initialize poolToken when OIL<>USDC Uniswap pool is available function setPoolToken(address poolToken_, address stakingFundAddress_) public onlyOwner { require(address(poolToken) == address(0x0), "poolToken was already set"); require(poolToken_ != address(0x0), "poolToken address cannot be zero"); poolToken = IERC20(poolToken_); // Transfer the Staking Bonus Funds from stakingFundAddress here require(IERC20(oilerToken).balanceOf(stakingFundAddress_) >= stakingFundAmount, "StakingFund doesn't have enough OIL balance"); require(IERC20(oilerToken).allowance(stakingFundAddress_, address(this)) >= stakingFundAmount, "StakingFund doesn't have enough allowance"); require(IERC20(oilerToken).transferFrom(stakingFundAddress_, address(this), stakingFundAmount), "TransferFrom of OIL from StakingFund failed"); } /** * @notice Calculates the RewardPoints user will earn for a given tokenAmount locked for a given period * @dev If any parameter is zero - it will fail, thus we save gas on "requires" by not checking in other places * @param tokenAmount_ - Amount of tokens to be stake. * @param lockingPeriodInBlocks_ - Lock duration defined in blocks. */ function calculateStakingRewardPoints(uint72 tokenAmount_, uint24 lockingPeriodInBlocks_) public pure returns (uint128) { // // / \ // stakingRewardPoints = ( tokenAmount * lockingPeriodInBlocks ) * lockingPeriodInBlocks // \ / // uint256 stakingRewardPoints = uint256(tokenAmount_) * uint256(lockingPeriodInBlocks_) * uint256(lockingPeriodInBlocks_); require(stakingRewardPoints > 0, "Neither tokenAmount nor lockingPeriod couldn't be 0"); return uint128(stakingRewardPoints); } /** * @notice Lock the LP tokens for a specified period of Blocks. * @notice Can only be called before Staking Program ends. * @notice And the locking period can't last longer than the end of Staking Program block. * @param tokenAmount_ - Amount of LP tokens to be locked. * @param lockingPeriodInBlocks_ - locking period duration defined in blocks. */ function lockTokens(uint72 tokenAmount_, uint24 lockingPeriodInBlocks_) public poolTokenSet { // Here we don't check lockingPeriodInBlocks_ for being non-zero, cause its happening in calculateStakingRewardPoints() calculation require(block.number <= stakingProgramEndsBlock - lockingPeriodInBlocks_, "Your lock period exceeds Staking Program duration"); require(stakes[msg.sender].tokenAmount == 0, "Already staking"); // This is a locking reward - will be earned only after the full lock period is over - otherwise not applicable uint128 expectedStakingRewardPoints = calculateStakingRewardPoints(tokenAmount_, lockingPeriodInBlocks_); Stake memory stake = Stake(tokenAmount_, lockingPeriodInBlocks_, uint32(block.number), expectedStakingRewardPoints); stakes[msg.sender] = stake; // We add the rewards initially during locking of tokens, and subtract them later if unlocking is made prematurely // That prevents us from waiting for all users to unlock to distribute the rewards after Staking Program Ends totalRewardPoints += expectedStakingRewardPoints; rewardPointsEarned[msg.sender] += expectedStakingRewardPoints; // We transfer LP tokens from user to this contract, "locking" them // We don't check for allowances or balance cause it's done within the transferFrom() and would only raise gas costs require(poolToken.transferFrom(msg.sender, address(this), tokenAmount_), "TransferFrom of poolTokens failed"); emit StakeLocked(msg.sender, tokenAmount_, lockingPeriodInBlocks_, expectedStakingRewardPoints); } /** * @notice Unlock the tokens and get the reward * @notice This can be called at any time, even after Staking Program end block */ function unlockTokens() public poolTokenSet { Stake memory stake = stakes[msg.sender]; uint256 stakeAmount = stake.tokenAmount; require(stakeAmount != 0, "You don't have a stake to unlock"); require(block.number > stake.startBlock, "You can't withdraw the stake in the same block it was locked"); // Check if the unlock is called prematurely - and subtract the reward if it is the case _punishEarlyWithdrawal(stake); // Zero the Stake - to protect from double-unlocking and to be able to stake again delete stakes[msg.sender]; require(poolToken.transfer(msg.sender, stakeAmount), "Pool token transfer failed"); } /** * @notice If the unlock is called prematurely - we subtract the bonus */ function _punishEarlyWithdrawal(Stake memory stake_) internal { // As any of the locking periods can't be longer than Staking Program end block - this will automatically mean that if called after Staking Program end - all stakes locking periods are over // So no rewards can be manipulated after Staking Program ends if (block.number < (stake_.startBlock + stake_.lockingPeriodInBlocks)) { // lt - cause you can only withdraw at or after startBlock + lockPeriod rewardPointsEarned[msg.sender] -= stake_.expectedStakingRewardPoints; totalRewardPoints -= stake_.expectedStakingRewardPoints; emit StakeUnlockedPrematurely(msg.sender, stake_.tokenAmount, stake_.lockingPeriodInBlocks, block.number - stake_.startBlock); } else { emit StakeUnlocked(msg.sender, stake_.tokenAmount, stake_.lockingPeriodInBlocks, stake_.expectedStakingRewardPoints); } } /** * @notice This can only be called after the Staking Program ended * @dev Which means that all stakes lock periods are already over, and totalRewardPoints value isn't changing anymore - so we can now calculate the percentages of rewards */ function getRewards() public { require(block.number > stakingProgramEndsBlock, "You can only get Rewards after Staking Program ends"); require(stakes[msg.sender].tokenAmount == 0, "You still have a stake locked - please unlock first, don't leave free money here"); require(rewardPointsEarned[msg.sender] > 0, "You don't have any rewardPoints"); // The amount earned is calculated as: // // user RewardPoints earned during Staking Program // amountEarned = stakingFund * ------------------------------------------------------- // total RewardPoints earned by everyone participated // // Division always rounds towards zero in solidity. // And because of this rounding somebody always misses the fractional part of their earnings and gets only integer amount. // Thus the worst thing that can happen is amountEarned becomes 0, and we check for that in _grantTokens() uint256 amountEarned = stakingFundAmount * rewardPointsEarned[msg.sender] / totalRewardPoints; rewardPointsEarned[msg.sender] = 0; // Zero rewardPoints of a user - so this function can be called only once per user _grantTokens(msg.sender, amountEarned); // Grant OIL reward earned by user for future vesting during the Vesting period } ////////////////////////////////////////////////////// // // VESTING PART // ////////////////////////////////////////////////////// /** * @param recipient_ - Recipient of granted tokens * @param amountEarned_ - Amount of tokens earned to be granted */ function _grantTokens(address recipient_, uint256 amountEarned_) internal { require(amountEarned_ > 0, "You didn't earn any integer amount of wei"); require(recipient_ != address(0), "TokenVesting: beneficiary is the zero address"); grantedTokens[recipient_] = amountEarned_; emit RewardGranted(recipient_, amountEarned_); } /// @notice Releases granted tokens function release() public { uint256 releasable = _releasableAmount(msg.sender); require(releasable > 0, "Vesting release: no tokens are due"); releasedTokens[msg.sender] += releasable; require(oilerToken.transfer(msg.sender, releasable), "Reward oilers transfer failed"); emit grantedTokensReleased(msg.sender, releasable); } /// @notice Releasable amount is what is available at a given time minus what was already withdrawn function _releasableAmount(address recipient_) internal view returns (uint256) { return _vestedAmount(recipient_) - releasedTokens[recipient_]; } /** * @notice The output of this function gradually changes from [0.. to ..grantedAmount] while the vesting is going * @param recipient_ - vested tokens recipient * @return vested amount */ function _vestedAmount(address recipient_) internal view returns (uint256) { if (block.number >= stakingProgramEndsBlock + vestingDuration) { // Return the full granted amount if Vesting Period is over return grantedTokens[recipient_]; } else { // Return the proportional amount if Vesting Period is still going return grantedTokens[recipient_] * (block.number - stakingProgramEndsBlock) / vestingDuration; } } event StakeLocked(address recipient, uint256 tokenAmount, uint256 lockingPeriodInBlocks, uint256 expectedStakingRewardPoints); event StakeUnlockedPrematurely(address recipient, uint256 tokenAmount, uint256 lockingPeriodInBlocks, uint256 actualLockingPeriodInBlocks); event StakeUnlocked(address recipient, uint256 tokenAmount, uint256 lockingPeriodInBlocks, uint256 rewardPoints); event RewardGranted(address recipient, uint256 amountEarned); event grantedTokensReleased(address recipient, uint256 amount); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
{ "optimizer": { "enabled": true, "runs": 999999 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "libraries": {} }
Contract Security Audit
- Chainsulting - May 13th, 2021 - Security Audit Report
[{"inputs":[{"internalType":"address","name":"oilerToken_","type":"address"},{"internalType":"uint256","name":"stakingDurationInBlocks_","type":"uint256"},{"internalType":"uint256","name":"stakingFundAmount_","type":"uint256"},{"internalType":"uint256","name":"vestingDuration_","type":"uint256"},{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountEarned","type":"uint256"}],"name":"RewardGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockingPeriodInBlocks","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"expectedStakingRewardPoints","type":"uint256"}],"name":"StakeLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockingPeriodInBlocks","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPoints","type":"uint256"}],"name":"StakeUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockingPeriodInBlocks","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"actualLockingPeriodInBlocks","type":"uint256"}],"name":"StakeUnlockedPrematurely","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"grantedTokensReleased","type":"event"},{"inputs":[{"internalType":"uint72","name":"tokenAmount_","type":"uint72"},{"internalType":"uint24","name":"lockingPeriodInBlocks_","type":"uint24"}],"name":"calculateStakingRewardPoints","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"grantedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint72","name":"tokenAmount_","type":"uint72"},{"internalType":"uint24","name":"lockingPeriodInBlocks_","type":"uint24"}],"name":"lockTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"oilerToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"releasedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardPointsEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"poolToken_","type":"address"},{"internalType":"address","name":"stakingFundAddress_","type":"address"}],"name":"setPoolToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakes","outputs":[{"internalType":"uint72","name":"tokenAmount","type":"uint72"},{"internalType":"uint24","name":"lockingPeriodInBlocks","type":"uint24"},{"internalType":"uint32","name":"startBlock","type":"uint32"},{"internalType":"uint128","name":"expectedStakingRewardPoints","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingFundAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingProgramEndsBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewardPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlockTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vestingDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101206040523480156200001257600080fd5b506040516200206c3803806200206c833981016040819052620000359162000154565b6001600160a01b038116620000915760405162461bcd60e51b815260206004820152601c60248201527f4f776e657220616464726573732063616e6e6f74206265207a65726f0000000060448201526064015b60405180910390fd5b6001600160601b0319606082901b16610100526001600160a01b038516620001065760405162461bcd60e51b815260206004820152602160248201527f6f696c6572546f6b656e20616464726573732063616e6e6f74206265207a65726044820152606f60f81b606482015260840162000088565b6001600160601b0319606086901b1660c052620001248443620001a8565b6080525060e05260a05250620001cd9050565b80516001600160a01b03811681146200014f57600080fd5b919050565b600080600080600060a086880312156200016c578081fd5b620001778662000137565b94506020860151935060408601519250606086015191506200019c6080870162000137565b90509295509295909350565b60008219821115620001c857634e487b7160e01b81526011600452602481fd5b500190565b60805160a05160c05160601c60e0516101005160601c611deb62000281600039600081816103150152610e0401526000818161012f01528181611ac70152611b3d0152600081816102c101528181610cb80152818161101f01528181611194015261130f015260008181610246015281816105f601528181610ffd0152818161117201526112e901526000818161033c015281816103e4015281816106ce01528181611ae80152611b610152611deb6000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c806386d1a69f116100b2578063c959360b11610081578063e0e4a72211610066578063e0e4a722146103a7578063f6ffab88146103c7578063f968f493146103da57600080fd5b8063c959360b14610367578063cbdf382c1461038757600080fd5b806386d1a69f146103085780638da5cb5b14610310578063bc0925ae14610337578063c2e8caf61461035e57600080fd5b806352946b04116100ee57806352946b041461024157806370ff852b14610268578063798633b91461028857806381e9207d146102bc57600080fd5b80630572b0cc146101205780631514617e1461012a57806316934fc414610164578063378592c81461022e575b600080fd5b6101286103e2565b005b6101517f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b6101e1610172366004611be9565b60006020819052908152604090205468ffffffffffffffffff8116906901000000000000000000810462ffffff16906c01000000000000000000000000810463ffffffff169070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1684565b6040805168ffffffffffffffffff909516855262ffffff909316602085015263ffffffff909116918301919091526fffffffffffffffffffffffffffffffff16606082015260800161015b565b61012861023c366004611c6d565b610644565b6101517f000000000000000000000000000000000000000000000000000000000000000081565b610151610276366004611be9565b60056020526000908152604090205481565b61029b610296366004611c6d565b610b01565b6040516fffffffffffffffffffffffffffffffff909116815260200161015b565b6102e37f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161015b565b610128610bc2565b6102e37f000000000000000000000000000000000000000000000000000000000000000081565b6101517f000000000000000000000000000000000000000000000000000000000000000081565b61015160025481565b610151610375366004611be9565b60016020526000908152604090205481565b6003546102e39073ffffffffffffffffffffffffffffffffffffffff1681565b6101516103b5366004611be9565b60046020526000908152604090205481565b6101286103d5366004611c03565b610dec565b61012861141b565b7f00000000000000000000000000000000000000000000000000000000000000004311610496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f596f752063616e206f6e6c79206765742052657761726473206166746572205360448201527f74616b696e672050726f6772616d20656e64730000000000000000000000000060648201526084015b60405180910390fd5b3360009081526020819052604090205468ffffffffffffffffff1615610564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f596f75207374696c6c20686176652061207374616b65206c6f636b6564202d2060448201527f706c6561736520756e6c6f636b2066697273742c20646f6e2774206c6561766560648201527f2066726565206d6f6e6579206865726500000000000000000000000000000000608482015260a40161048d565b336000908152600160205260409020546105da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f596f7520646f6e2774206861766520616e7920726577617264506f696e747300604482015260640161048d565b6002543360009081526001602052604081205490919061061a907f0000000000000000000000000000000000000000000000000000000000000000611d32565b6106249190611cf9565b336000818152600160205260408120559091506106419082611752565b50565b60035473ffffffffffffffffffffffffffffffffffffffff166106c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f706f6f6c546f6b656e206e6f7420736574000000000000000000000000000000604482015260640161048d565b6106f262ffffff82167f0000000000000000000000000000000000000000000000000000000000000000611d6f565b431115610781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f596f7572206c6f636b20706572696f642065786365656473205374616b696e6760448201527f2050726f6772616d206475726174696f6e000000000000000000000000000000606482015260840161048d565b3360009081526020819052604090205468ffffffffffffffffff1615610803576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f416c7265616479207374616b696e670000000000000000000000000000000000604482015260640161048d565b600061080f8383610b01565b6040805160808101825268ffffffffffffffffff868116825262ffffff86811660208085019182524363ffffffff9081168688019081526fffffffffffffffffffffffffffffffff898116606089018181523360009081529586905299852089518154975194519b5199167fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009097169690961769010000000000000000009390971692909202959095176bffffffffffffffffffffffff166c0100000000000000000000000098909216979097028416177001000000000000000000000000000000009490931693909302919091179055600280549495509193610914908490611cb9565b909155505033600090815260016020526040812080546fffffffffffffffffffffffffffffffff8516929061094a908490611cb9565b90915550506003546040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015230602482015268ffffffffffffffffff8616604482015273ffffffffffffffffffffffffffffffffffffffff909116906323b872dd90606401602060405180830381600087803b1580156109d157600080fd5b505af11580156109e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a099190611c35565b610a95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5472616e7366657246726f6d206f6620706f6f6c546f6b656e73206661696c6560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161048d565b6040805133815268ffffffffffffffffff8616602082015262ffffff8516818301526fffffffffffffffffffffffffffffffff8416606082015290517fe7dbea143058f90be7a1644e539342c25ddc5379868fe922bab596de99debf419181900360800190a150505050565b60008062ffffff8316610b1f8168ffffffffffffffffff8716611d32565b610b299190611d32565b905060008111610bbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4e65697468657220746f6b656e416d6f756e74206e6f72206c6f636b696e675060448201527f6572696f6420636f756c646e2774206265203000000000000000000000000000606482015260840161048d565b9392505050565b6000610bcd336118ea565b905060008111610c5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f56657374696e672072656c656173653a206e6f20746f6b656e7320617265206460448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161048d565b3360009081526005602052604081208054839290610c7e908490611cb9565b90915550506040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a9059cbb90604401602060405180830381600087803b158015610d1157600080fd5b505af1158015610d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d499190611c35565b610daf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f526577617264206f696c657273207472616e73666572206661696c6564000000604482015260640161048d565b60408051338152602081018390527f769d4212c4fbfaa012a896b49e0f3bb14d32dd0d60ce1a13d357ee6b69db77c291015b60405180910390a150565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610e8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f43616e206f6e6c792062652063616c6c6564206279206f776e65720000000000604482015260640161048d565b60035473ffffffffffffffffffffffffffffffffffffffff1615610f0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f706f6f6c546f6b656e2077617320616c72656164792073657400000000000000604482015260640161048d565b73ffffffffffffffffffffffffffffffffffffffff8216610f88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f706f6f6c546f6b656e20616464726573732063616e6e6f74206265207a65726f604482015260640161048d565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff848116919091179091556040517f70a0823100000000000000000000000000000000000000000000000000000000815282821660048201527f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000016906370a082319060240160206040518083038186803b15801561106157600080fd5b505afa158015611075573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110999190611c55565b1015611127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f5374616b696e6746756e6420646f65736e2774206861766520656e6f7567682060448201527f4f494c2062616c616e6365000000000000000000000000000000000000000000606482015260840161048d565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301523060248301527f0000000000000000000000000000000000000000000000000000000000000000917f00000000000000000000000000000000000000000000000000000000000000009091169063dd62ed3e9060440160206040518083038186803b1580156111d857600080fd5b505afa1580156111ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112109190611c55565b101561129e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5374616b696e6746756e6420646f65736e2774206861766520656e6f7567682060448201527f616c6c6f77616e63650000000000000000000000000000000000000000000000606482015260840161048d565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301523060248301527f000000000000000000000000000000000000000000000000000000000000000060448301527f000000000000000000000000000000000000000000000000000000000000000016906323b872dd90606401602060405180830381600087803b15801561135357600080fd5b505af1158015611367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138b9190611c35565b611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f5472616e7366657246726f6d206f66204f494c2066726f6d205374616b696e6760448201527f46756e64206661696c6564000000000000000000000000000000000000000000606482015260840161048d565b5050565b60035473ffffffffffffffffffffffffffffffffffffffff1661149a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f706f6f6c546f6b656e206e6f7420736574000000000000000000000000000000604482015260640161048d565b33600090815260208181526040918290208251608081018452905468ffffffffffffffffff81168083526901000000000000000000820462ffffff16938301939093526c01000000000000000000000000810463ffffffff16938201939093527001000000000000000000000000000000009092046fffffffffffffffffffffffffffffffff1660608301528061158d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f596f7520646f6e277420686176652061207374616b6520746f20756e6c6f636b604482015260640161048d565b816040015163ffffffff164311611626576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f596f752063616e277420776974686472617720746865207374616b6520696e2060448201527f7468652073616d6520626c6f636b20697420776173206c6f636b656400000000606482015260840161048d565b61162f82611929565b336000818152602081905260408082209190915560035490517fa9059cbb00000000000000000000000000000000000000000000000000000000815260048101929092526024820183905273ffffffffffffffffffffffffffffffffffffffff169063a9059cbb90604401602060405180830381600087803b1580156116b457600080fd5b505af11580156116c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ec9190611c35565b611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f506f6f6c20746f6b656e207472616e73666572206661696c6564000000000000604482015260640161048d565b600081116117e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f596f75206469646e2774206561726e20616e7920696e746567657220616d6f7560448201527f6e74206f66207765690000000000000000000000000000000000000000000000606482015260840161048d565b73ffffffffffffffffffffffffffffffffffffffff8216611885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f546f6b656e56657374696e673a2062656e65666963696172792069732074686560448201527f207a65726f206164647265737300000000000000000000000000000000000000606482015260840161048d565b73ffffffffffffffffffffffffffffffffffffffff8216600081815260046020908152604091829020849055815192835282018390527f6e1afd29522b0aaf986597bcc53f5fb4daae2af7cfd41d00c384ab1bdf912b23910160405180910390a15050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081205461191983611ac0565b6119239190611d6f565b92915050565b806020015162ffffff1681604001516119429190611cd1565b63ffffffff16431015611a4957606081015133600090815260016020526040812080546fffffffffffffffffffffffffffffffff90931692909190611988908490611d6f565b9250508190555080606001516fffffffffffffffffffffffffffffffff16600260008282546119b79190611d6f565b90915550508051602082015160408301517f6c6f3c7d8c87976393011cc962da12841024bc1d62d2de21716a6306ab314ef392339290916119fe9063ffffffff1643611d6f565b6040805173ffffffffffffffffffffffffffffffffffffffff909516855268ffffffffffffffffff909316602085015262ffffff909116918301919091526060820152608001610de1565b80516020808301516060808501516040805133815268ffffffffffffffffff9096169486019490945262ffffff909216928401929092526fffffffffffffffffffffffffffffffff16908201527f391930ab48e95a9040c849cc86e1b2f63c711a1f59d6e324ce775dc9a005105690608001610de1565b6000611b0c7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611cb9565b4310611b3b575073ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b7f0000000000000000000000000000000000000000000000000000000000000000611b867f000000000000000000000000000000000000000000000000000000000000000043611d6f565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260046020526040902054611bb69190611d32565b6119239190611cf9565b919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bc057600080fd5b600060208284031215611bfa578081fd5b610bbb82611bc5565b60008060408385031215611c15578081fd5b611c1e83611bc5565b9150611c2c60208401611bc5565b90509250929050565b600060208284031215611c46578081fd5b81518015158114610bbb578182fd5b600060208284031215611c66578081fd5b5051919050565b60008060408385031215611c7f578182fd5b823568ffffffffffffffffff81168114611c97578283fd5b9150602083013562ffffff81168114611cae578182fd5b809150509250929050565b60008219821115611ccc57611ccc611d86565b500190565b600063ffffffff808316818516808303821115611cf057611cf0611d86565b01949350505050565b600082611d2d577f4e487b710000000000000000000000000000000000000000000000000000000081526012600452602481fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611d6a57611d6a611d86565b500290565b600082821015611d8157611d81611d86565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212209f66dbf510b376427fca8720389e11278fd0dc3e23141d190dd4f4b4d69aa74e64736f6c634300080400330000000000000000000000000275e1001e293c46cfe158b3702aade0b99f88a500000000000000000000000000000000000000000000000000000000000a12200000000000000000000000000000000000000000000069e10de76676d080000000000000000000000000000000000000000000000000000000000000000a1220000000000000000000000000a94db69502920a657f8685978e62d3e3b9762adf
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061011b5760003560e01c806386d1a69f116100b2578063c959360b11610081578063e0e4a72211610066578063e0e4a722146103a7578063f6ffab88146103c7578063f968f493146103da57600080fd5b8063c959360b14610367578063cbdf382c1461038757600080fd5b806386d1a69f146103085780638da5cb5b14610310578063bc0925ae14610337578063c2e8caf61461035e57600080fd5b806352946b04116100ee57806352946b041461024157806370ff852b14610268578063798633b91461028857806381e9207d146102bc57600080fd5b80630572b0cc146101205780631514617e1461012a57806316934fc414610164578063378592c81461022e575b600080fd5b6101286103e2565b005b6101517f00000000000000000000000000000000000000000000000000000000000a122081565b6040519081526020015b60405180910390f35b6101e1610172366004611be9565b60006020819052908152604090205468ffffffffffffffffff8116906901000000000000000000810462ffffff16906c01000000000000000000000000810463ffffffff169070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1684565b6040805168ffffffffffffffffff909516855262ffffff909316602085015263ffffffff909116918301919091526fffffffffffffffffffffffffffffffff16606082015260800161015b565b61012861023c366004611c6d565b610644565b6101517f0000000000000000000000000000000000000000000069e10de76676d080000081565b610151610276366004611be9565b60056020526000908152604090205481565b61029b610296366004611c6d565b610b01565b6040516fffffffffffffffffffffffffffffffff909116815260200161015b565b6102e37f0000000000000000000000000275e1001e293c46cfe158b3702aade0b99f88a581565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161015b565b610128610bc2565b6102e37f000000000000000000000000a94db69502920a657f8685978e62d3e3b9762adf81565b6101517f0000000000000000000000000000000000000000000000000000000000c7693b81565b61015160025481565b610151610375366004611be9565b60016020526000908152604090205481565b6003546102e39073ffffffffffffffffffffffffffffffffffffffff1681565b6101516103b5366004611be9565b60046020526000908152604090205481565b6101286103d5366004611c03565b610dec565b61012861141b565b7f0000000000000000000000000000000000000000000000000000000000c7693b4311610496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f596f752063616e206f6e6c79206765742052657761726473206166746572205360448201527f74616b696e672050726f6772616d20656e64730000000000000000000000000060648201526084015b60405180910390fd5b3360009081526020819052604090205468ffffffffffffffffff1615610564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f596f75207374696c6c20686176652061207374616b65206c6f636b6564202d2060448201527f706c6561736520756e6c6f636b2066697273742c20646f6e2774206c6561766560648201527f2066726565206d6f6e6579206865726500000000000000000000000000000000608482015260a40161048d565b336000908152600160205260409020546105da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f596f7520646f6e2774206861766520616e7920726577617264506f696e747300604482015260640161048d565b6002543360009081526001602052604081205490919061061a907f0000000000000000000000000000000000000000000069e10de76676d0800000611d32565b6106249190611cf9565b336000818152600160205260408120559091506106419082611752565b50565b60035473ffffffffffffffffffffffffffffffffffffffff166106c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f706f6f6c546f6b656e206e6f7420736574000000000000000000000000000000604482015260640161048d565b6106f262ffffff82167f0000000000000000000000000000000000000000000000000000000000c7693b611d6f565b431115610781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f596f7572206c6f636b20706572696f642065786365656473205374616b696e6760448201527f2050726f6772616d206475726174696f6e000000000000000000000000000000606482015260840161048d565b3360009081526020819052604090205468ffffffffffffffffff1615610803576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f416c7265616479207374616b696e670000000000000000000000000000000000604482015260640161048d565b600061080f8383610b01565b6040805160808101825268ffffffffffffffffff868116825262ffffff86811660208085019182524363ffffffff9081168688019081526fffffffffffffffffffffffffffffffff898116606089018181523360009081529586905299852089518154975194519b5199167fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009097169690961769010000000000000000009390971692909202959095176bffffffffffffffffffffffff166c0100000000000000000000000098909216979097028416177001000000000000000000000000000000009490931693909302919091179055600280549495509193610914908490611cb9565b909155505033600090815260016020526040812080546fffffffffffffffffffffffffffffffff8516929061094a908490611cb9565b90915550506003546040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015230602482015268ffffffffffffffffff8616604482015273ffffffffffffffffffffffffffffffffffffffff909116906323b872dd90606401602060405180830381600087803b1580156109d157600080fd5b505af11580156109e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a099190611c35565b610a95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5472616e7366657246726f6d206f6620706f6f6c546f6b656e73206661696c6560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161048d565b6040805133815268ffffffffffffffffff8616602082015262ffffff8516818301526fffffffffffffffffffffffffffffffff8416606082015290517fe7dbea143058f90be7a1644e539342c25ddc5379868fe922bab596de99debf419181900360800190a150505050565b60008062ffffff8316610b1f8168ffffffffffffffffff8716611d32565b610b299190611d32565b905060008111610bbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4e65697468657220746f6b656e416d6f756e74206e6f72206c6f636b696e675060448201527f6572696f6420636f756c646e2774206265203000000000000000000000000000606482015260840161048d565b9392505050565b6000610bcd336118ea565b905060008111610c5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f56657374696e672072656c656173653a206e6f20746f6b656e7320617265206460448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161048d565b3360009081526005602052604081208054839290610c7e908490611cb9565b90915550506040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f0000000000000000000000000275e1001e293c46cfe158b3702aade0b99f88a573ffffffffffffffffffffffffffffffffffffffff169063a9059cbb90604401602060405180830381600087803b158015610d1157600080fd5b505af1158015610d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d499190611c35565b610daf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f526577617264206f696c657273207472616e73666572206661696c6564000000604482015260640161048d565b60408051338152602081018390527f769d4212c4fbfaa012a896b49e0f3bb14d32dd0d60ce1a13d357ee6b69db77c291015b60405180910390a150565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a94db69502920a657f8685978e62d3e3b9762adf1614610e8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f43616e206f6e6c792062652063616c6c6564206279206f776e65720000000000604482015260640161048d565b60035473ffffffffffffffffffffffffffffffffffffffff1615610f0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f706f6f6c546f6b656e2077617320616c72656164792073657400000000000000604482015260640161048d565b73ffffffffffffffffffffffffffffffffffffffff8216610f88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f706f6f6c546f6b656e20616464726573732063616e6e6f74206265207a65726f604482015260640161048d565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff848116919091179091556040517f70a0823100000000000000000000000000000000000000000000000000000000815282821660048201527f0000000000000000000000000000000000000000000069e10de76676d0800000917f0000000000000000000000000275e1001e293c46cfe158b3702aade0b99f88a516906370a082319060240160206040518083038186803b15801561106157600080fd5b505afa158015611075573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110999190611c55565b1015611127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f5374616b696e6746756e6420646f65736e2774206861766520656e6f7567682060448201527f4f494c2062616c616e6365000000000000000000000000000000000000000000606482015260840161048d565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301523060248301527f0000000000000000000000000000000000000000000069e10de76676d0800000917f0000000000000000000000000275e1001e293c46cfe158b3702aade0b99f88a59091169063dd62ed3e9060440160206040518083038186803b1580156111d857600080fd5b505afa1580156111ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112109190611c55565b101561129e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5374616b696e6746756e6420646f65736e2774206861766520656e6f7567682060448201527f616c6c6f77616e63650000000000000000000000000000000000000000000000606482015260840161048d565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301523060248301527f0000000000000000000000000000000000000000000069e10de76676d080000060448301527f0000000000000000000000000275e1001e293c46cfe158b3702aade0b99f88a516906323b872dd90606401602060405180830381600087803b15801561135357600080fd5b505af1158015611367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138b9190611c35565b611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f5472616e7366657246726f6d206f66204f494c2066726f6d205374616b696e6760448201527f46756e64206661696c6564000000000000000000000000000000000000000000606482015260840161048d565b5050565b60035473ffffffffffffffffffffffffffffffffffffffff1661149a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f706f6f6c546f6b656e206e6f7420736574000000000000000000000000000000604482015260640161048d565b33600090815260208181526040918290208251608081018452905468ffffffffffffffffff81168083526901000000000000000000820462ffffff16938301939093526c01000000000000000000000000810463ffffffff16938201939093527001000000000000000000000000000000009092046fffffffffffffffffffffffffffffffff1660608301528061158d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f596f7520646f6e277420686176652061207374616b6520746f20756e6c6f636b604482015260640161048d565b816040015163ffffffff164311611626576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f596f752063616e277420776974686472617720746865207374616b6520696e2060448201527f7468652073616d6520626c6f636b20697420776173206c6f636b656400000000606482015260840161048d565b61162f82611929565b336000818152602081905260408082209190915560035490517fa9059cbb00000000000000000000000000000000000000000000000000000000815260048101929092526024820183905273ffffffffffffffffffffffffffffffffffffffff169063a9059cbb90604401602060405180830381600087803b1580156116b457600080fd5b505af11580156116c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ec9190611c35565b611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f506f6f6c20746f6b656e207472616e73666572206661696c6564000000000000604482015260640161048d565b600081116117e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f596f75206469646e2774206561726e20616e7920696e746567657220616d6f7560448201527f6e74206f66207765690000000000000000000000000000000000000000000000606482015260840161048d565b73ffffffffffffffffffffffffffffffffffffffff8216611885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f546f6b656e56657374696e673a2062656e65666963696172792069732074686560448201527f207a65726f206164647265737300000000000000000000000000000000000000606482015260840161048d565b73ffffffffffffffffffffffffffffffffffffffff8216600081815260046020908152604091829020849055815192835282018390527f6e1afd29522b0aaf986597bcc53f5fb4daae2af7cfd41d00c384ab1bdf912b23910160405180910390a15050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081205461191983611ac0565b6119239190611d6f565b92915050565b806020015162ffffff1681604001516119429190611cd1565b63ffffffff16431015611a4957606081015133600090815260016020526040812080546fffffffffffffffffffffffffffffffff90931692909190611988908490611d6f565b9250508190555080606001516fffffffffffffffffffffffffffffffff16600260008282546119b79190611d6f565b90915550508051602082015160408301517f6c6f3c7d8c87976393011cc962da12841024bc1d62d2de21716a6306ab314ef392339290916119fe9063ffffffff1643611d6f565b6040805173ffffffffffffffffffffffffffffffffffffffff909516855268ffffffffffffffffff909316602085015262ffffff909116918301919091526060820152608001610de1565b80516020808301516060808501516040805133815268ffffffffffffffffff9096169486019490945262ffffff909216928401929092526fffffffffffffffffffffffffffffffff16908201527f391930ab48e95a9040c849cc86e1b2f63c711a1f59d6e324ce775dc9a005105690608001610de1565b6000611b0c7f00000000000000000000000000000000000000000000000000000000000a12207f0000000000000000000000000000000000000000000000000000000000c7693b611cb9565b4310611b3b575073ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b7f00000000000000000000000000000000000000000000000000000000000a1220611b867f0000000000000000000000000000000000000000000000000000000000c7693b43611d6f565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260046020526040902054611bb69190611d32565b6119239190611cf9565b919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bc057600080fd5b600060208284031215611bfa578081fd5b610bbb82611bc5565b60008060408385031215611c15578081fd5b611c1e83611bc5565b9150611c2c60208401611bc5565b90509250929050565b600060208284031215611c46578081fd5b81518015158114610bbb578182fd5b600060208284031215611c66578081fd5b5051919050565b60008060408385031215611c7f578182fd5b823568ffffffffffffffffff81168114611c97578283fd5b9150602083013562ffffff81168114611cae578182fd5b809150509250929050565b60008219821115611ccc57611ccc611d86565b500190565b600063ffffffff808316818516808303821115611cf057611cf0611d86565b01949350505050565b600082611d2d577f4e487b710000000000000000000000000000000000000000000000000000000081526012600452602481fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611d6a57611d6a611d86565b500290565b600082821015611d8157611d81611d86565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212209f66dbf510b376427fca8720389e11278fd0dc3e23141d190dd4f4b4d69aa74e64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000275e1001e293c46cfe158b3702aade0b99f88a500000000000000000000000000000000000000000000000000000000000a12200000000000000000000000000000000000000000000069e10de76676d080000000000000000000000000000000000000000000000000000000000000000a1220000000000000000000000000a94db69502920a657f8685978e62d3e3b9762adf
-----Decoded View---------------
Arg [0] : oilerToken_ (address): 0x0275E1001e293C46CFe158B3702AADe0B99f88a5
Arg [1] : stakingDurationInBlocks_ (uint256): 660000
Arg [2] : stakingFundAmount_ (uint256): 500000000000000000000000
Arg [3] : vestingDuration_ (uint256): 660000
Arg [4] : owner_ (address): 0xA94db69502920A657F8685978e62D3E3B9762adf
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000275e1001e293c46cfe158b3702aade0b99f88a5
Arg [1] : 00000000000000000000000000000000000000000000000000000000000a1220
Arg [2] : 0000000000000000000000000000000000000000000069e10de76676d0800000
Arg [3] : 00000000000000000000000000000000000000000000000000000000000a1220
Arg [4] : 000000000000000000000000a94db69502920a657f8685978e62d3e3b9762adf
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $436,349.3 | 0.00359977 | $1,570.76 |
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.