Contract 0xe546F8f17aff17C05dac9F9b4F9957f725fab087 1

 
Txn Hash
Method
Block
From
To
Value
0x45f136bc6d556d1053d731bfb8e98b94feaa975959de368c91f427555306a692Release149662332022-06-15 7:09:5865 days 11 hrs ago0x7b4b645421e9be7c23d8a2deab6e76e729284a4e IN  0xe546f8f17aff17c05dac9f9b4f9957f725fab0870 Ether0.00215528 30.81141889
0xb25750401364746a812412a925010a350a414b6337d58d0765c2ef299626a2dbRelease143998912022-03-16 20:59:21155 days 21 hrs ago0xf46e87177bf435804154c6bc3b71f6e3863ca90d IN  0xe546f8f17aff17c05dac9f9b4f9957f725fab0870 Ether0.00508456 58.40909221
0xde1ce11cfd2fc523bb4212c3896c5702b0c30f93fa7179115baa93ea21cb0abfRelease143710132022-03-12 8:59:41160 days 9 hrs ago0x2ec19e982172ead28b312a07faf25105fb3747d8 IN  0xe546f8f17aff17c05dac9f9b4f9957f725fab0870 Ether0.00113939 16.28854373
0xa242247f17e47f74f2a2000d29c5fb27acdeed2fd9a8f9741db05ffd7ade3748Get Rewards143648582022-03-11 10:00:34161 days 8 hrs ago0x1aa0edc5fa5a3e232039141239e5ac4178abc139 IN  0xe546f8f17aff17c05dac9f9b4f9957f725fab0870 Ether0.00108841 21.83245036
0x9b3a847f2dd97090141098bdaa65b491542f1d5e7f1bba021415e6df30713805Get Rewards143190422022-03-04 7:21:00168 days 11 hrs ago0xa4f7c5fd44b410763f83f1d8464bb90a6cfc3464 IN  0xe546f8f17aff17c05dac9f9b4f9957f725fab0870 Ether0.00133092 26.69704105
0x3413f7a3943a481ca2edd2149a5290fe5e59491e17acf712e6aef5f18f9b113dRelease143136072022-03-03 10:55:36169 days 7 hrs ago0xa3fd68643f97aa910310c9cfcf208fbe8365af5e IN  0xe546f8f17aff17c05dac9f9b4f9957f725fab0870 Ether0.00200859 28.71430852
0xb020399e7b8d3d3a6c23d09eaa6de3c8fa17f786860c2f9b1c2867f349d04b8bRelease142781532022-02-25 23:08:14174 days 19 hrs ago0xbbe3a5e1613a481621e1f5e468f57be8adbc0060 IN  0xe546f8f17aff17c05dac9f9b4f9957f725fab0870 Ether0.00680418 78.16316877
0x7a9ef986688944f5eecce4861024b1ab1c44852d4699ca039e55b13f22db0403Release142227962022-02-17 9:18:44183 days 9 hrs ago0x36ebbc8ac514cd8d2061632b89f2e445a3f55f08 IN  0xe546f8f17aff17c05dac9f9b4f9957f725fab0870 Ether0.00338706 38.90901111
0x96cf29fb909a8957e434880f7c2befad7195269c370e9b470cb339948cd8e4d2Release142160112022-02-16 8:16:40184 days 10 hrs ago0x2be48859434e4c0390969acac26447851e48bb1e IN  0xe546f8f17aff17c05dac9f9b4f9957f725fab0870 Ether0.00164523 63.37579577
0x46dfec37aabe422e983654c6f0fe7c98000ef3e08651fe808d5c975c7c14acd3Release142160112022-02-16 8:16:40184 days 10 hrs ago0x2be48859434e4c0390969acac26447851e48bb1e IN  0xe546f8f17aff17c05dac9f9b4f9957f725fab0870 Ether0.0044332 63.37579577
0xef9dfa42dd214b94156b6bcd1e9e0288a62ab72b0b5d317a707c01f6fe97b676Release141990982022-02-13 17:20:17187 days 1 hr ago0x66baf299ca88ef82c56527a8941e222822e70fb4 IN  0xe546f8f17aff17c05dac9f9b4f9957f725fab0870 Ether0.00393938 56.31635594
0x8784083b101abc90749ca14d577b86a5633b895af5c41b7f5b408d54e6f2225dGet Rewards141990922022-02-13 17:19:17187 days 1 hr ago0x66baf299ca88ef82c56527a8941e222822e70fb4 IN  0xe546f8f17aff17c05dac9f9b4f9957f725fab0870 Ether0.00327251 65.64338985
0xd8f0415c672164b97c2c0682e36dee7f57a9f4af29d00ae0533d56e4be0cdd27Release141767542022-02-10 6:36:05190 days 11 hrs ago0x91a733ffdb070a597a2f67db2422c168cb3ba142 IN  0xe546f8f17aff17c05dac9f9b4f9957f725fab0870 Ether0.00501724 57.63571234
0x99ebe1680855540b290eb8483445baa9dc2ebc7f4384c45164c3f74c42193dc3Release141740512022-02-09 20:34:03190 days 21 hrs ago0x5e4a35626e41bb7f3c66e652b27c971c9242707b IN  0xe546f8f17aff17c05dac9f9b4f9957f725fab0870 Ether0.0085972 122.90320046
0x4351912716094b02e9babcdbe620a42937806ae219e61bdf33ac8179cacd2f02Unlock Tokens141519352022-02-06 10:22:35194 days 7 hrs ago0x16378cc5d9190b650d7ff6685aed95787ae93eee IN  0xe546f8f17aff17c05dac9f9b4f9957f725fab0870 Ether0.00267 45.1417819
0x973974ec4b1b423ea47d3679963428b6e3a6b69fe542eb969aa0e46582ae871fRelease141461872022-02-05 13:05:04195 days 5 hrs ago0xb00aacc8ba60fa405fcbed177369cf5f78ecbe47 IN  0xe546f8f17aff17c05dac9f9b4f9957f725fab0870 Ether0.00416081 47.79749224
0x0ee026367d9fec056487d8962526d381d2d0fd2470c4f77a20ffa89ad9657c4bRelease141452392022-02-05 9:42:01195 days 8 hrs ago0x24e55f24899352074301a6eef12284626a4810a1 IN  0xe546f8f17aff17c05dac9f9b4f9957f725fab0870 Ether0.00398668 56.9925209
0x4b2c2933741cb5adf1160d2699fe13353ba3ac780dde17f15edba5585ac564d5Release140605222022-01-23 7:26:59208 days 10 hrs ago0x86636c90e42f6dbf7adf8d1c8f8ff3c08b9b6536 IN  0xe546f8f17aff17c05dac9f9b4f9957f725fab0870 Ether0.0065046 74.72174744
0x69317ad037a973278081a9239805e4a6774fbe4818fa03dcfca2d494574c3c46Release140431242022-01-20 15:02:19211 days 3 hrs ago0x8a03e106855eab9d032a356c1e12a3dde94d7786 IN  0xe546f8f17aff17c05dac9f9b4f9957f725fab0870 Ether0.00686212 98.09906221
0x81314eae9d58d2bf6dd3f8908d37e7c119a484b10f40624b879819e5f13133edRelease140421272022-01-20 11:21:40211 days 6 hrs ago0xc2a841a9861b32819f18ac103f27097a61708a35 IN  0xe546f8f17aff17c05dac9f9b4f9957f725fab0870 Ether0.00608216 69.86903047
0x01ec089d74d3cc6fd072006592aee28b7bac330fcf015a2ca9b878b657815dfaRelease140420962022-01-20 11:14:00211 days 7 hrs ago0x5f439a0e0a04a5b8f8979f6bf0ba505b43a8f8fc IN  0xe546f8f17aff17c05dac9f9b4f9957f725fab0870 Ether0.0070511381
0x0950e2f1ad922226754aff3f084956dc4d945d9bfec6997beebb8b0f6a0aff47Release140410772022-01-20 7:33:21211 days 10 hrs ago0xe7ab2d6a92b731e574ae1852ca1f1060f118ba10 IN  0xe546f8f17aff17c05dac9f9b4f9957f725fab0870 Ether0.00644057 92.07268573
0x3ca2f8c2c6496ad8063762d985e923ad230f063171f9ad0788926293619b0e85Release140325552022-01-18 23:41:06212 days 18 hrs ago0x3f154c3fddb622b440d5c336c3b64688b2803bca IN  0xe546f8f17aff17c05dac9f9b4f9957f725fab0870 Ether0.00982713 112.88937903
0x67e2b4cd509627ce80bd991bfbf7834b666319d1c29d74266b1ab97a52839632Release140262102022-01-18 0:09:33213 days 18 hrs ago0x9bb43b5bf085347b919968e1853a549afcb466fb IN  0xe546f8f17aff17c05dac9f9b4f9957f725fab0870 Ether0.00913744 130.62636075
0x899607e4fc0b09c45e1019201a41cf23c63b75ec284fffef252df63a06eb362aRelease140096032022-01-15 10:56:05216 days 7 hrs agoENS Name yeban.eth IN  0xe546f8f17aff17c05dac9f9b4f9957f725fab0870 Ether0.0076885 109.91268219
[ Download CSV Export 
View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Staking

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, Audited
File 1 of 2 : Staking.sol
// 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);
}

File 2 of 2 : IERC20.sol
// 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);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 999999
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"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"}]

6101206040523480156200001257600080fd5b506040516200206c3803806200206c833981016040819052620000359162000154565b6001600160a01b038116620000915760405162461bcd60e51b815260206004820152601c60248201527f4f776e657220616464726573732063616e6e6f74206265207a65726f0000000060448201526064015b60405180910390fd5b6001600160601b0319606082901b16610100526001600160a01b038516620001065760405162461bcd60e51b815260206004820152602160248201527f6f696c6572546f6b656e20616464726573732063616e6e6f74206265207a65726044820152606f60f81b606482015260840162000088565b6001600160601b0319606086901b1660c052620001248443620001a8565b6080525060e05260a05250620001cd9050565b80516001600160a01b03811681146200014f57600080fd5b919050565b600080600080600060a086880312156200016c578081fd5b620001778662000137565b94506020860151935060408601519250606086015191506200019c6080870162000137565b90509295509295909350565b60008219821115620001c857634e487b7160e01b81526011600452602481fd5b500190565b60805160a05160c05160601c60e0516101005160601c611deb62000281600039600081816103150152610e0401526000818161012f01528181611ac70152611b3d0152600081816102c101528181610cb80152818161101f01528181611194015261130f015260008181610246015281816105f601528181610ffd0152818161117201526112e901526000818161033c015281816103e4015281816106ce01528181611ae80152611b610152611deb6000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c806386d1a69f116100b2578063c959360b11610081578063e0e4a72211610066578063e0e4a722146103a7578063f6ffab88146103c7578063f968f493146103da57600080fd5b8063c959360b14610367578063cbdf382c1461038757600080fd5b806386d1a69f146103085780638da5cb5b14610310578063bc0925ae14610337578063c2e8caf61461035e57600080fd5b806352946b04116100ee57806352946b041461024157806370ff852b14610268578063798633b91461028857806381e9207d146102bc57600080fd5b80630572b0cc146101205780631514617e1461012a57806316934fc414610164578063378592c81461022e575b600080fd5b6101286103e2565b005b6101517f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b6101e1610172366004611be9565b60006020819052908152604090205468ffffffffffffffffff8116906901000000000000000000810462ffffff16906c01000000000000000000000000810463ffffffff169070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1684565b6040805168ffffffffffffffffff909516855262ffffff909316602085015263ffffffff909116918301919091526fffffffffffffffffffffffffffffffff16606082015260800161015b565b61012861023c366004611c6d565b610644565b6101517f000000000000000000000000000000000000000000000000000000000000000081565b610151610276366004611be9565b60056020526000908152604090205481565b61029b610296366004611c6d565b610b01565b6040516fffffffffffffffffffffffffffffffff909116815260200161015b565b6102e37f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161015b565b610128610bc2565b6102e37f000000000000000000000000000000000000000000000000000000000000000081565b6101517f000000000000000000000000000000000000000000000000000000000000000081565b61015160025481565b610151610375366004611be9565b60016020526000908152604090205481565b6003546102e39073ffffffffffffffffffffffffffffffffffffffff1681565b6101516103b5366004611be9565b60046020526000908152604090205481565b6101286103d5366004611c03565b610dec565b61012861141b565b7f00000000000000000000000000000000000000000000000000000000000000004311610496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f596f752063616e206f6e6c79206765742052657761726473206166746572205360448201527f74616b696e672050726f6772616d20656e64730000000000000000000000000060648201526084015b60405180910390fd5b3360009081526020819052604090205468ffffffffffffffffff1615610564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f596f75207374696c6c20686176652061207374616b65206c6f636b6564202d2060448201527f706c6561736520756e6c6f636b2066697273742c20646f6e2774206c6561766560648201527f2066726565206d6f6e6579206865726500000000000000000000000000000000608482015260a40161048d565b336000908152600160205260409020546105da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f596f7520646f6e2774206861766520616e7920726577617264506f696e747300604482015260640161048d565b6002543360009081526001602052604081205490919061061a907f0000000000000000000000000000000000000000000000000000000000000000611d32565b6106249190611cf9565b336000818152600160205260408120559091506106419082611752565b50565b60035473ffffffffffffffffffffffffffffffffffffffff166106c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f706f6f6c546f6b656e206e6f7420736574000000000000000000000000000000604482015260640161048d565b6106f262ffffff82167f0000000000000000000000000000000000000000000000000000000000000000611d6f565b431115610781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f596f7572206c6f636b20706572696f642065786365656473205374616b696e6760448201527f2050726f6772616d206475726174696f6e000000000000000000000000000000606482015260840161048d565b3360009081526020819052604090205468ffffffffffffffffff1615610803576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f416c7265616479207374616b696e670000000000000000000000000000000000604482015260640161048d565b600061080f8383610b01565b6040805160808101825268ffffffffffffffffff868116825262ffffff86811660208085019182524363ffffffff9081168688019081526fffffffffffffffffffffffffffffffff898116606089018181523360009081529586905299852089518154975194519b5199167fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009097169690961769010000000000000000009390971692909202959095176bffffffffffffffffffffffff166c0100000000000000000000000098909216979097028416177001000000000000000000000000000000009490931693909302919091179055600280549495509193610914908490611cb9565b909155505033600090815260016020526040812080546fffffffffffffffffffffffffffffffff8516929061094a908490611cb9565b90915550506003546040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015230602482015268ffffffffffffffffff8616604482015273ffffffffffffffffffffffffffffffffffffffff909116906323b872dd90606401602060405180830381600087803b1580156109d157600080fd5b505af11580156109e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a099190611c35565b610a95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5472616e7366657246726f6d206f6620706f6f6c546f6b656e73206661696c6560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161048d565b6040805133815268ffffffffffffffffff8616602082015262ffffff8516818301526fffffffffffffffffffffffffffffffff8416606082015290517fe7dbea143058f90be7a1644e539342c25ddc5379868fe922bab596de99debf419181900360800190a150505050565b60008062ffffff8316610b1f8168ffffffffffffffffff8716611d32565b610b299190611d32565b905060008111610bbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4e65697468657220746f6b656e416d6f756e74206e6f72206c6f636b696e675060448201527f6572696f6420636f756c646e2774206265203000000000000000000000000000606482015260840161048d565b9392505050565b6000610bcd336118ea565b905060008111610c5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f56657374696e672072656c656173653a206e6f20746f6b656e7320617265206460448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161048d565b3360009081526005602052604081208054839290610c7e908490611cb9565b90915550506040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a9059cbb90604401602060405180830381600087803b158015610d1157600080fd5b505af1158015610d25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d499190611c35565b610daf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f526577617264206f696c657273207472616e73666572206661696c6564000000604482015260640161048d565b60408051338152602081018390527f769d4212c4fbfaa012a896b49e0f3bb14d32dd0d60ce1a13d357ee6b69db77c291015b60405180910390a150565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610e8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f43616e206f6e6c792062652063616c6c6564206279206f776e65720000000000604482015260640161048d565b60035473ffffffffffffffffffffffffffffffffffffffff1615610f0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f706f6f6c546f6b656e2077617320616c72656164792073657400000000000000604482015260640161048d565b73ffffffffffffffffffffffffffffffffffffffff8216610f88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f706f6f6c546f6b656e20616464726573732063616e6e6f74206265207a65726f604482015260640161048d565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff848116919091179091556040517f70a0823100000000000000000000000000000000000000000000000000000000815282821660048201527f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000016906370a082319060240160206040518083038186803b15801561106157600080fd5b505afa158015611075573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110999190611c55565b1015611127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f5374616b696e6746756e6420646f65736e2774206861766520656e6f7567682060448201527f4f494c2062616c616e6365000000000000000000000000000000000000000000606482015260840161048d565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301523060248301527f0000000000000000000000000000000000000000000000000000000000000000917f00000000000000000000000000000000000000000000000000000000000000009091169063dd62ed3e9060440160206040518083038186803b1580156111d857600080fd5b505afa1580156111ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112109190611c55565b101561129e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5374616b696e6746756e6420646f65736e2774206861766520656e6f7567682060448201527f616c6c6f77616e63650000000000000000000000000000000000000000000000606482015260840161048d565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301523060248301527f000000000000000000000000000000000000000000000000000000000000000060448301527f000000000000000000000000000000000000000000000000000000000000000016906323b872dd90606401602060405180830381600087803b15801561135357600080fd5b505af1158015611367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138b9190611c35565b611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f5472616e7366657246726f6d206f66204f494c2066726f6d205374616b696e6760448201527f46756e64206661696c6564000000000000000000000000000000000000000000606482015260840161048d565b5050565b60035473ffffffffffffffffffffffffffffffffffffffff1661149a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f706f6f6c546f6b656e206e6f7420736574000000000000000000000000000000604482015260640161048d565b33600090815260208181526040918290208251608081018452905468ffffffffffffffffff81168083526901000000000000000000820462ffffff16938301939093526c01000000000000000000000000810463ffffffff16938201939093527001000000000000000000000000000000009092046fffffffffffffffffffffffffffffffff1660608301528061158d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f596f7520646f6e277420686176652061207374616b6520746f20756e6c6f636b604482015260640161048d565b816040015163ffffffff164311611626576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f596f752063616e277420776974686472617720746865207374616b6520696e2060448201527f7468652073616d6520626c6f636b20697420776173206c6f636b656400000000606482015260840161048d565b61162f82611929565b336000818152602081905260408082209190915560035490517fa9059cbb00000000000000000000000000000000000000000000000000000000815260048101929092526024820183905273ffffffffffffffffffffffffffffffffffffffff169063a9059cbb90604401602060405180830381600087803b1580156116b457600080fd5b505af11580156116c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ec9190611c35565b611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f506f6f6c20746f6b656e207472616e73666572206661696c6564000000000000604482015260640161048d565b600081116117e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f596f75206469646e2774206561726e20616e7920696e746567657220616d6f7560448201527f6e74206f66207765690000000000000000000000000000000000000000000000606482015260840161048d565b73ffffffffffffffffffffffffffffffffffffffff8216611885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f546f6b656e56657374696e673a2062656e65666963696172792069732074686560448201527f207a65726f206164647265737300000000000000000000000000000000000000606482015260840161048d565b73ffffffffffffffffffffffffffffffffffffffff8216600081815260046020908152604091829020849055815192835282018390527f6e1afd29522b0aaf986597bcc53f5fb4daae2af7cfd41d00c384ab1bdf912b23910160405180910390a15050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081205461191983611ac0565b6119239190611d6f565b92915050565b806020015162ffffff1681604001516119429190611cd1565b63ffffffff16431015611a4957606081015133600090815260016020526040812080546fffffffffffffffffffffffffffffffff90931692909190611988908490611d6f565b9250508190555080606001516fffffffffffffffffffffffffffffffff16600260008282546119b79190611d6f565b90915550508051602082015160408301517f6c6f3c7d8c87976393011cc962da12841024bc1d62d2de21716a6306ab314ef392339290916119fe9063ffffffff1643611d6f565b6040805173ffffffffffffffffffffffffffffffffffffffff909516855268ffffffffffffffffff909316602085015262ffffff909116918301919091526060820152608001610de1565b80516020808301516060808501516040805133815268ffffffffffffffffff9096169486019490945262ffffff909216928401929092526fffffffffffffffffffffffffffffffff16908201527f391930ab48e95a9040c849cc86e1b2f63c711a1f59d6e324ce775dc9a005105690608001610de1565b6000611b0c7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611cb9565b4310611b3b575073ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b7f0000000000000000000000000000000000000000000000000000000000000000611b867f000000000000000000000000000000000000000000000000000000000000000043611d6f565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260046020526040902054611bb69190611d32565b6119239190611cf9565b919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bc057600080fd5b600060208284031215611bfa578081fd5b610bbb82611bc5565b60008060408385031215611c15578081fd5b611c1e83611bc5565b9150611c2c60208401611bc5565b90509250929050565b600060208284031215611c46578081fd5b81518015158114610bbb578182fd5b600060208284031215611c66578081fd5b5051919050565b60008060408385031215611c7f578182fd5b823568ffffffffffffffffff81168114611c97578283fd5b9150602083013562ffffff81168114611cae578182fd5b809150509250929050565b60008219821115611ccc57611ccc611d86565b500190565b600063ffffffff808316818516808303821115611cf057611cf0611d86565b01949350505050565b600082611d2d577f4e487b710000000000000000000000000000000000000000000000000000000081526012600452602481fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611d6a57611d6a611d86565b500290565b600082821015611d8157611d81611d86565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212209f66dbf510b376427fca8720389e11278fd0dc3e23141d190dd4f4b4d69aa74e64736f6c634300080400330000000000000000000000000275e1001e293c46cfe158b3702aade0b99f88a500000000000000000000000000000000000000000000000000000000000a12200000000000000000000000000000000000000000000069e10de76676d080000000000000000000000000000000000000000000000000000000000000000a1220000000000000000000000000a94db69502920a657f8685978e62d3e3b9762adf

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


Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

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.