ETH Price: $2,200.96 (+3.92%)
Gas: 1.1 Gwei

Contract

0x5d77F9b5a4CCA418f2cD62b6E1Cf0Ba123d4c05f
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw Stake A...140368222022-01-19 15:37:341141 days ago1642606654IN
0x5d77F9b5...123d4c05f
0 ETH0.0088300973.70390773
Withdraw Stake A...125051382021-05-25 18:29:541379 days ago1621967394IN
0x5d77F9b5...123d4c05f
0 ETH0.002632632
Withdraw Stake A...123869572021-05-07 11:46:581398 days ago1620388018IN
0x5d77F9b5...123d4c05f
0 ETH0.002989846.35
Withdraw Stake A...118849162021-02-19 3:34:031475 days ago1613705643IN
0x5d77F9b5...123d4c05f
0 ETH0.01072645106
Withdraw Stake A...117105052021-01-23 7:33:591502 days ago1611387239IN
0x5d77F9b5...123d4c05f
0 ETH0.0048243672
Withdraw Interes...117105022021-01-23 7:33:331502 days ago1611387213IN
0x5d77F9b5...123d4c05f
0 ETH0.0045531158
Withdraw Stake A...117069222021-01-22 18:27:401502 days ago1611340060IN
0x5d77F9b5...123d4c05f
0 ETH0.0060974591
Withdraw Interes...117069132021-01-22 18:26:091502 days ago1611339969IN
0x5d77F9b5...123d4c05f
0 ETH0.0057786891
Withdraw Interes...117055422021-01-22 13:22:351503 days ago1611321755IN
0x5d77F9b5...123d4c05f
0 ETH0.0041190981
Withdraw Interes...117055422021-01-22 13:22:351503 days ago1611321755IN
0x5d77F9b5...123d4c05f
0 ETH0.00345868
Withdraw Stake A...117055072021-01-22 13:15:371503 days ago1611321337IN
0x5d77F9b5...123d4c05f
0 ETH0.0064635775
Withdraw Stake A...116953612021-01-20 23:33:481504 days ago1611185628IN
0x5d77F9b5...123d4c05f
0 ETH0.0044223366
Withdraw Interes...116953422021-01-20 23:30:421504 days ago1611185442IN
0x5d77F9b5...123d4c05f
0 ETH0.0053538368.2000016
Withdraw Stake A...116866792021-01-19 15:53:541506 days ago1611071634IN
0x5d77F9b5...123d4c05f
0 ETH0.00696852104
Withdraw Interes...116866642021-01-19 15:50:151506 days ago1611071415IN
0x5d77F9b5...123d4c05f
0 ETH0.0081642104
Withdraw Stake A...116754812021-01-17 22:36:161507 days ago1610922976IN
0x5d77F9b5...123d4c05f
0 ETH0.0025476549
Withdraw Stake A...116720392021-01-17 9:54:211508 days ago1610877261IN
0x5d77F9b5...123d4c05f
0 ETH0.0018864736.3
Withdraw Interes...116667422021-01-16 14:22:531509 days ago1610806973IN
0x5d77F9b5...123d4c05f
0 ETH0.004082152
Withdraw Stake A...116659732021-01-16 11:25:111509 days ago1610796311IN
0x5d77F9b5...123d4c05f
0 ETH0.002813742.00000145
Withdraw Interes...116659662021-01-16 11:24:181509 days ago1610796258IN
0x5d77F9b5...123d4c05f
0 ETH0.0034540844
Withdraw Stake A...116558742021-01-14 22:26:251510 days ago1610663185IN
0x5d77F9b5...123d4c05f
0 ETH0.0027613441.2111
Withdraw Interes...116558622021-01-14 22:23:101510 days ago1610662990IN
0x5d77F9b5...123d4c05f
0 ETH0.0038533241.2111
Withdraw Stake A...116545802021-01-14 17:30:171510 days ago1610645417IN
0x5d77F9b5...123d4c05f
0 ETH0.0056895366
Withdraw Stake A...116542862021-01-14 16:30:381511 days ago1610641838IN
0x5d77F9b5...123d4c05f
0 ETH0.006032480
Withdraw Stake A...116530542021-01-14 11:53:061511 days ago1610625186IN
0x5d77F9b5...123d4c05f
0 ETH0.0049998958
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Staking

Compiler Version
v0.5.7+commit.6da8b019

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity Multiple files format)

File 1 of 5: Staking.sol
/* Copyright (C) 2020 PlotX.io
  This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
  This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
  You should have received a copy of the GNU General Public License
    along with this program.  If not, see http://www.gnu.org/licenses/ */

pragma solidity 0.5.7;

import "./PlotXToken.sol";
import "./SafeMath.sol";
import "./ERC20.sol";


contract Staking {
    
    using SafeMath for uint256;

    /**
     * @dev Structure to store Interest details.
     * It contains total amount of tokens staked and globalYield.
     */
    struct InterestData {
        uint256 globalTotalStaked;
        uint256 globalYieldPerToken; 
        uint256 lastUpdated;
        mapping(address => Staker) stakers;  
    }

    /**
     * @dev Structure to store staking details.
     * It contains amount of tokens staked and withdrawn interest.
     */
    struct Staker {
        uint256 totalStaked;
        uint256 withdrawnToDate;
        uint256 stakeBuyinRate;  
    }


    // Token address
    ERC20 private stakeToken;

    // Reward token
    PlotXToken private rewardToken;

    // Interest and staker data
    InterestData public interestData;

    uint public stakingStartTime;

    uint public totalReward;

    // unclaimed reward will be trasfered to this account
    address public vaultAddress; 

    // 10^18
    uint256 private constant DECIMAL1e18 = 10**18;

    //Total time (in sec) over which reward will be distributed
    uint256 public stakingPeriod;

    /**
     * @dev Emitted when `staker` stake `value` tokens.
     */
    event Staked(address indexed staker, uint256 value, uint256 _globalYieldPerToken);

    /**
     * @dev Emitted when `staker` withdraws their stake `value` tokens.
     */
    event StakeWithdrawn(address indexed staker, uint256 value, uint256 _globalYieldPerToken);


    /**
     * @dev Emitted when `staker` collects interest `_value`.
     */
    event InterestCollected(
        address indexed staker,
        uint256 _value,
        uint256 _globalYieldPerToken
    );

    /**     
     * @dev Constructor     
     * @param _stakeToken The address of stake Token       
     * @param _rewardToken The address of reward Token   
     * @param _stakingPeriod valid staking time after staking starts
     * @param _totalRewardToBeDistributed total amount to be distributed as reward
     */
    constructor(
        address _stakeToken,
        address _rewardToken,
        uint256 _stakingPeriod,
        uint256 _totalRewardToBeDistributed,
        uint256 _stakingStart,
        address _vaultAdd
    ) public {
        require(_stakingPeriod > 0, "Should be positive");
        require(_totalRewardToBeDistributed > 0, "Total reward can not be 0");
        require(_stakingStart >= now, "Can not be past time");
        require(_stakeToken != address(0), "Can not be null address");
        require(_rewardToken != address(0), "Can not be null address");
        require(_vaultAdd != address(0), "Can not be null address");
        stakeToken = ERC20(_stakeToken);
        rewardToken = PlotXToken(_rewardToken);
        stakingStartTime = _stakingStart;
        interestData.lastUpdated = _stakingStart;
        stakingPeriod = _stakingPeriod;
        totalReward = _totalRewardToBeDistributed;
        vaultAddress = _vaultAdd;
    }

    /**
     * @dev Allows a staker to deposit Tokens. Notice that `approve` is
     * needed to be executed before the execution of this method.
     * @param _amount The amount of tokens to stake
     */
    function stake(uint256 _amount) external {
        require(_amount > 0, "You need to stake a positive token amount");
        require(
            stakeToken.transferFrom(msg.sender, address(this), _amount),
            "TransferFrom failed, make sure you approved token transfer"
        );
        require(now.sub(stakingStartTime) <= stakingPeriod, "Can not stake after staking period passed");
        uint newlyInterestGenerated = now.sub(interestData.lastUpdated).mul(totalReward).div(stakingPeriod);
        interestData.lastUpdated = now;
        updateGlobalYieldPerToken(newlyInterestGenerated);
        updateStakeData(msg.sender, _amount);
        emit Staked(msg.sender, _amount, interestData.globalYieldPerToken);
    }

    /**
     * @dev Updates InterestData and Staker data while staking.
     * must call update globalYieldPerToken before this operation
     * @param _staker                 Staker's address
     * @param _stake                  Amount of stake
     *
     */
    function updateStakeData(
        address _staker,
        uint256 _stake
    ) internal {
        Staker storage _stakerData = interestData.stakers[_staker];

        _stakerData.totalStaked = _stakerData.totalStaked.add(_stake);

        updateStakeBuyinRate(
            _stakerData,
            interestData.globalYieldPerToken,
            _stake
        );

        interestData.globalTotalStaked = interestData.globalTotalStaked.add(_stake);
    }

    /**
     * @dev Calculates and updates the yield rate in which the staker has entered
     * a staker may stake multiple times, so we calculate his cumulative rate his earning will be calculated based on GlobalYield and StakeBuyinRate
     * Formula:
     * StakeBuyinRate = [StakeBuyinRate(P) + (GlobalYield(P) x Stake)]
     *
     * @param _stakerData                  Staker's Data
     * @param _globalYieldPerToken         Total yielding amount per token 
     * @param _stake                       Amount staked 
     *
     */
    function updateStakeBuyinRate(
        Staker storage _stakerData,
        uint256 _globalYieldPerToken,
        uint256 _stake
    ) internal {

        _stakerData.stakeBuyinRate = _stakerData.stakeBuyinRate.add(
            _globalYieldPerToken.mul(_stake).div(DECIMAL1e18)
        );
    }

    /**
     * @dev Withdraws the sender staked Token.
     */
    function withdrawStakeAndInterest(uint256 _amount) external {
        Staker storage staker = interestData.stakers[msg.sender];
        require(_amount > 0, "Should withdraw positive amount");
        require(staker.totalStaked >= _amount, "Not enough token staked");
        withdrawInterest();
        updateStakeAndInterestData(msg.sender, _amount);
        require(stakeToken.transfer(msg.sender, _amount), "withdraw transfer failed");
        emit StakeWithdrawn(msg.sender, _amount, interestData.globalYieldPerToken);
    }
    
    /**
     * @dev Updates InterestData and Staker data while withdrawing stake.
     *
     * @param _staker                 Staker address
     * @param _amount                 Amount of stake to withdraw
     *
     */    
    function updateStakeAndInterestData(
        address _staker,
        uint256 _amount
    ) internal {
        Staker storage _stakerData = interestData.stakers[_staker];

        _stakerData.totalStaked = _stakerData.totalStaked.sub(_amount);

        interestData.globalTotalStaked = interestData.globalTotalStaked.sub(_amount);

        _stakerData.stakeBuyinRate = 0;
        _stakerData.withdrawnToDate = 0;
        updateStakeBuyinRate(
            _stakerData,
            interestData.globalYieldPerToken,
            _stakerData.totalStaked
        );
    }

    /**
     * @dev Withdraws the sender Earned interest.
     */
    function withdrawInterest() public {
        uint timeSinceLastUpdate = _timeSinceLastUpdate();
        uint newlyInterestGenerated = timeSinceLastUpdate.mul(totalReward).div(stakingPeriod);
        
        updateGlobalYieldPerToken(newlyInterestGenerated);
        uint256 interest = calculateInterest(msg.sender);
        Staker storage stakerData = interestData.stakers[msg.sender];
        stakerData.withdrawnToDate = stakerData.withdrawnToDate.add(interest);
        require(rewardToken.transfer(msg.sender, interest), "Withdraw interest transfer failed");
        emit InterestCollected(msg.sender, interest, interestData.globalYieldPerToken);
    }

    function updateGlobalYield() public {
        uint timeSinceLastUpdate = _timeSinceLastUpdate();
        uint newlyInterestGenerated = timeSinceLastUpdate.mul(totalReward).div(stakingPeriod);
        updateGlobalYieldPerToken(newlyInterestGenerated);
    }

    function getYieldData(address _staker) public view returns(uint256, uint256)
    {

      return (interestData.globalYieldPerToken, interestData.stakers[_staker].stakeBuyinRate);
    }

    function _timeSinceLastUpdate() internal returns(uint256) {
        uint timeSinceLastUpdate;
        if(now.sub(stakingStartTime) > stakingPeriod)
        {
            timeSinceLastUpdate = stakingStartTime.add(stakingPeriod).sub(interestData.lastUpdated);
            interestData.lastUpdated = stakingStartTime.add(stakingPeriod);
        } else {
            timeSinceLastUpdate = now.sub(interestData.lastUpdated);
            interestData.lastUpdated = now;
        }
        return timeSinceLastUpdate;
    }

    /**
     * @dev Calculates Interest for staker for their stake.
     *
     * Formula:
     * EarnedInterest = MAX[TotalStaked x GlobalYield - (StakeBuyinRate + WithdrawnToDate), 0]
     *
     * @param _staker                     Staker's address
     *
     * @return The amount of tokens credit for the staker.
     */
    function calculateInterest(address _staker)
        public
        view
        returns (uint256)
    {
        Staker storage stakerData = interestData.stakers[_staker];

        
        uint256 _withdrawnToDate = stakerData.withdrawnToDate;

        uint256 intermediateInterest = stakerData
            .totalStaked
            .mul(interestData.globalYieldPerToken).div(DECIMAL1e18);

        uint256 intermediateVal = _withdrawnToDate.add(
            stakerData.stakeBuyinRate
        );

        // will lead to -ve value
        if (intermediateVal > intermediateInterest) {
            return 0;
        }

        uint _earnedInterest = (intermediateInterest.sub(intermediateVal));

        return _earnedInterest;
    }

    /**
     * @dev Calculates and updates new accrued amount per token since last update.
     *
     * Formula:
     * GlobalYield = GlobalYield(P) + newlyGeneratedInterest/GlobalTotalStake.
     *
     * @param _interestGenerated  Interest token earned since last update.
     *
     */
    function updateGlobalYieldPerToken(
        uint256 _interestGenerated
    ) internal {
        if (interestData.globalTotalStaked == 0) {
            require(rewardToken.transfer(vaultAddress, _interestGenerated), "Transfer failed while trasfering to vault");
            return;
        }
        interestData.globalYieldPerToken = interestData.globalYieldPerToken.add(
            _interestGenerated
                .mul(DECIMAL1e18) 
                .div(interestData.globalTotalStaked) 
        );
    }


    function getStakerData(address _staker) public view returns(uint256, uint256)
    {

      return (interestData.stakers[_staker].totalStaked, interestData.stakers[_staker].withdrawnToDate);
    }

    /**
     * @dev returns stats data.
     * @param _staker Address of staker.
     * @return Total staked.
     * @return Total reward to be distributed.
     * @return estimated reward for user at end of staking period if no one stakes from current time.
     * @return Unlocked reward based on elapsed time.
     * @return Accrued reward for user till now.
     */
    function getStatsData(address _staker) external view returns(uint, uint, uint, uint, uint)
    {

        Staker storage stakerData = interestData.stakers[_staker];
        uint estimatedReward = 0;
        uint unlockedReward = 0;
        uint accruedReward = 0;
        uint timeElapsed = now.sub(stakingStartTime);

        if(timeElapsed > stakingPeriod)
        {
            timeElapsed = stakingPeriod;
        }

        unlockedReward = timeElapsed.mul(totalReward).div(stakingPeriod);

        uint timeSinceLastUpdate;
        if(timeElapsed == stakingPeriod)
        {
            timeSinceLastUpdate = stakingStartTime.add(stakingPeriod).sub(interestData.lastUpdated);
        } else {
            timeSinceLastUpdate = now.sub(interestData.lastUpdated);
        }
        uint newlyInterestGenerated = timeSinceLastUpdate.mul(totalReward).div(stakingPeriod);
        uint updatedGlobalYield;
        uint stakingTimeLeft = 0;
        if(now < stakingStartTime.add(stakingPeriod)){
         stakingTimeLeft = stakingStartTime.add(stakingPeriod).sub(now);
        }
        uint interestGeneratedEnd = stakingTimeLeft.mul(totalReward).div(stakingPeriod);
        uint globalYieldEnd;
        if (interestData.globalTotalStaked != 0) {
            updatedGlobalYield = interestData.globalYieldPerToken.add(
            newlyInterestGenerated
                .mul(DECIMAL1e18)
                .div(interestData.globalTotalStaked));

            globalYieldEnd = updatedGlobalYield.add(interestGeneratedEnd.mul(DECIMAL1e18).div(interestData.globalTotalStaked));
        }
        
        accruedReward = stakerData
            .totalStaked
            .mul(updatedGlobalYield).div(DECIMAL1e18);

        if (stakerData.withdrawnToDate.add(stakerData.stakeBuyinRate) > accruedReward)
        {
            accruedReward = 0;
        } else {

            accruedReward = accruedReward.sub(stakerData.withdrawnToDate.add(stakerData.stakeBuyinRate));
        }

        estimatedReward = stakerData
            .totalStaked
            .mul(globalYieldEnd).div(DECIMAL1e18);
        if (stakerData.withdrawnToDate.add(stakerData.stakeBuyinRate) > estimatedReward) {
            estimatedReward = 0;
        } else {

            estimatedReward = estimatedReward.sub(stakerData.withdrawnToDate.add(stakerData.stakeBuyinRate));
        }

        return (interestData.globalTotalStaked, totalReward, estimatedReward, unlockedReward, accruedReward);

    }
}

File 2 of 5: ERC20.sol
pragma solidity ^0.5.0;

import "./IERC20.sol";
import "./SafeMath.sol";

/**
 * @dev Implementation of the `IERC20` interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using `_mint`.
 * For a generic mechanism see `ERC20Mintable`.
 *
 * *For a detailed writeup see our guide [How to implement supply
 * mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).*
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an `Approval` event is emitted on calls to `transferFrom`.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard `decreaseAllowance` and `increaseAllowance`
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See `IERC20.approve`.
 */
contract ERC20 is IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) internal _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    /**
     * @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);

    /**
     * @dev See `IERC20.totalSupply`.
     */
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See `IERC20.balanceOf`.
     */
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See `IERC20.transfer`.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    /**
     * @dev See `IERC20.allowance`.
     */
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See `IERC20.approve`.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    /**
     * @dev See `IERC20.transferFrom`.
     *
     * Emits an `Approval` event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of `ERC20`;
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `value`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to `approve` that can be used as a mitigation for
     * problems described in `IERC20.approve`.
     *
     * Emits an `Approval` event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to `approve` that can be used as a mitigation for
     * problems described in `IERC20.approve`.
     *
     * Emits an `Approval` event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to `transfer`, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a `Transfer` event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _balances[sender] = _balances[sender].sub(amount);
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * Emits an `Approval` event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of `ERC20`;
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `value`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function _transferFrom(address sender, address recipient, uint256 amount) internal {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount));
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a `Transfer` event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

     /**
     * @dev Destoys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a `Transfer` event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 value) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _totalSupply = _totalSupply.sub(value);
        _balances[account] = _balances[account].sub(value);
        emit Transfer(account, address(0), value);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an `Approval` event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = value;
        emit Approval(owner, spender, value);
    }

    /**
     * @dev Destoys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See `_burn` and `_approve`.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount));
    }
}

File 3 of 5: IERC20.sol
pragma solidity ^0.5.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see `ERC20Detailed`.
 */
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 Mints `amount` tokens to address `account`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a `Transfer` event.
     */
    function mint(address account, 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.
     *
     * > 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);
}

File 4 of 5: PlotXToken.sol
/* Copyright (C) 2020 PlotX.io

  This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

  This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
    along with this program.  If not, see http://www.gnu.org/licenses/ */

pragma solidity 0.5.7;

import "./ERC20.sol";
import "./SafeMath.sol";

contract PlotXToken is ERC20 {
    using SafeMath for uint256;

    mapping(address => uint256) public lockedForGV;

    string public name = "PLOT";
    string public symbol = "PLOT";
    uint8 public decimals = 18;
    address public operator;

    modifier onlyOperator() {
        require(msg.sender == operator, "Not operator");
        _;
    }

    /**
     * @dev Initialize PLOT token
     * @param _initialSupply Initial token supply
     * @param _initialTokenHolder Initial token holder address
     */
    constructor(uint256 _initialSupply, address _initialTokenHolder) public {
        _mint(_initialTokenHolder, _initialSupply);
        operator = _initialTokenHolder;
    }

    /**
     * @dev change operator address
     * @param _newOperator address of new operator
     */
    function changeOperator(address _newOperator)
        public
        onlyOperator
        returns (bool)
    {
        require(_newOperator != address(0), "New operator cannot be 0 address");
        operator = _newOperator;
        return true;
    }

    /**
     * @dev burns an amount of the tokens of the message sender
     * account.
     * @param amount The amount that will be burnt.
     */
    function burn(uint256 amount) public {
        _burn(msg.sender, amount);
    }

    /**
     * @dev Burns a specific amount of tokens from the target address and decrements allowance
     * @param from address The address which you want to send tokens from
     * @param value uint256 The amount of token to be burned
     */
    function burnFrom(address from, uint256 value) public {
        _burnFrom(from, value);
    }

    /**
     * @dev function that mints an amount of the token and assigns it to
     * an account.
     * @param account The account that will receive the created tokens.
     * @param amount The amount that will be created.
     */
    function mint(address account, uint256 amount)
        public
        onlyOperator
        returns (bool)
    {
        _mint(account, amount);
        return true;
    }

    /**
     * @dev Transfer token for a specified address
     * @param to The address to transfer to.
     * @param value The amount to be transferred.
     */
    function transfer(address to, uint256 value) public returns (bool) {
        require(lockedForGV[msg.sender] < now, "Locked for governance"); // if not voted under governance
        _transfer(msg.sender, to, value);
        return true;
    }

    /**
     * @dev Transfer tokens from one address to another
     * @param from address The address which you want to send tokens from
     * @param to address The address which you want to transfer to
     * @param value uint256 the amount of tokens to be transferred
     */
    function transferFrom(
        address from,
        address to,
        uint256 value
    ) public returns (bool) {
        require(lockedForGV[from] < now, "Locked for governance"); // if not voted under governance
        _transferFrom(from, to, value);
        return true;
    }

    /**
     * @dev Lock the user's tokens
     * @param _of user's address.
     */
    function lockForGovernanceVote(address _of, uint256 _period)
        public
        onlyOperator
    {
        if (_period.add(now) > lockedForGV[_of])
            lockedForGV[_of] = _period.add(now);
    }

    function isLockedForGV(address _of) public view returns (bool) {
        return (lockedForGV[_of] > now);
    }
}

File 5 of 5: SafeMath.sol
pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}

library SafeMath64 {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint64 a, uint64 b) internal pure returns (uint64) {
        uint64 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint64 a, uint64 b) internal pure returns (uint64) {
        require(b <= a, "SafeMath: subtraction overflow");
        uint64 c = a - b;

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint64 a, uint64 b, string memory errorMessage) internal pure returns (uint64) {
        require(b <= a, errorMessage);
        uint64 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint64 a, uint64 b) internal pure returns (uint64) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint64 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint64 a, uint64 b) internal pure returns (uint64) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        uint64 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint64 a, uint64 b) internal pure returns (uint64) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}

Contract Security Audit

Contract ABI

API
[{"constant":false,"inputs":[],"name":"withdrawInterest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"withdrawStakeAndInterest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"updateGlobalYield","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"interestData","outputs":[{"name":"globalTotalStaked","type":"uint256"},{"name":"globalYieldPerToken","type":"uint256"},{"name":"lastUpdated","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"vaultAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"stakingStartTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalReward","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_staker","type":"address"}],"name":"getYieldData","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"stake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stakingPeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_staker","type":"address"}],"name":"getStakerData","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_staker","type":"address"}],"name":"calculateInterest","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_staker","type":"address"}],"name":"getStatsData","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_stakeToken","type":"address"},{"name":"_rewardToken","type":"address"},{"name":"_stakingPeriod","type":"uint256"},{"name":"_totalRewardToBeDistributed","type":"uint256"},{"name":"_stakingStart","type":"uint256"},{"name":"_vaultAdd","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"staker","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"_globalYieldPerToken","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"staker","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"_globalYieldPerToken","type":"uint256"}],"name":"StakeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"staker","type":"address"},{"indexed":false,"name":"_value","type":"uint256"},{"indexed":false,"name":"_globalYieldPerToken","type":"uint256"}],"name":"InterestCollected","type":"event"}]

608060405234801561001057600080fd5b5060405160c080611441833981018060405260c081101561003057600080fd5b508051602082015160408301516060840151608085015160a0909501519394929391929091836100c157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f53686f756c6420626520706f7369746976650000000000000000000000000000604482015290519081900360640190fd5b6000831161013057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f546f74616c207265776172642063616e206e6f74206265203000000000000000604482015290519081900360640190fd5b4282101561019f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f43616e206e6f7420626520706173742074696d65000000000000000000000000604482015290519081900360640190fd5b6001600160a01b03861661020257604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260176024820152600080516020611421833981519152604482015290519081900360640190fd5b6001600160a01b03851661026557604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260176024820152600080516020611421833981519152604482015290519081900360640190fd5b6001600160a01b0381166102c857604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260176024820152600080516020611421833981519152604482015290519081900360640190fd5b600080546001600160a01b039788166001600160a01b03199182161790915560018054968816968216969096179095556006829055600491909155600992909255600755600880549190931691161790556110f9806103286000396000f3fe608060405234801561001057600080fd5b50600436106100ce5760003560e01c8063750142e61161008c578063c03d5b4711610066578063c03d5b47146101ca578063c601f352146101d2578063e11932cf146101f8578063ebbbabbd1461021e576100ce565b8063750142e6146101665780637943913d1461016e578063a694fc3a146101ad576100ce565b806263750c146100d357806304c3a8a3146100dd57806329c257a2146100fa5780633b71be5914610102578063430bf08a146101285780636abfd1831461014c575b600080fd5b6100db61026f565b005b6100db600480360360208110156100f357600080fd5b50356103ef565b6100db6105d9565b61010a610611565b60408051938452602084019290925282820152519081900360600190f35b61013061061d565b604080516001600160a01b039092168252519081900360200190f35b61015461062c565b60408051918252519081900360200190f35b610154610632565b6101946004803603602081101561018457600080fd5b50356001600160a01b0316610638565b6040805192835260208301919091528051918290030190f35b6100db600480360360208110156101c357600080fd5b503561065c565b61015461084a565b610194600480360360208110156101e857600080fd5b50356001600160a01b0316610850565b6101546004803603602081101561020e57600080fd5b50356001600160a01b0316610873565b6102446004803603602081101561023457600080fd5b50356001600160a01b0316610906565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6000610279610bd2565b905060006102a460095461029860075485610c5290919063ffffffff16565b9063ffffffff610cb716565b90506102af81610d24565b60006102ba33610873565b3360009081526005602052604090206001810154919250906102e2908363ffffffff610e2016565b6001808301919091555460408051600160e01b63a9059cbb0281523360048201526024810185905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561034057600080fd5b505af1158015610354573d6000803e3d6000fd5b505050506040513d602081101561036a57600080fd5b50516103aa57604051600160e51b62461bcd0281526004018080602001828103825260218152602001806110846021913960400191505060405180910390fd5b600354604080518481526020810192909252805133927f9bbd517758fbae61197f1c1c04c8614064e89512dbaf4350dcdf76fcaa5e216192908290030190a250505050565b336000908152600560205260409020816104535760408051600160e51b62461bcd02815260206004820152601f60248201527f53686f756c6420776974686472617720706f73697469766520616d6f756e7400604482015290519081900360640190fd5b80548211156104ac5760408051600160e51b62461bcd02815260206004820152601760248201527f4e6f7420656e6f75676820746f6b656e207374616b6564000000000000000000604482015290519081900360640190fd5b6104b461026f565b6104be3383610e7d565b6000805460408051600160e01b63a9059cbb0281523360048201526024810186905290516001600160a01b039092169263a9059cbb926044808401936020939083900390910190829087803b15801561051657600080fd5b505af115801561052a573d6000803e3d6000fd5b505050506040513d602081101561054057600080fd5b50516105965760408051600160e51b62461bcd02815260206004820152601860248201527f7769746864726177207472616e73666572206661696c65640000000000000000604482015290519081900360640190fd5b600354604080518481526020810192909252805133927f933735aa8de6d7547d0126171b2f31b9c34dd00f3ecd4be85a0ba047db4fafef92908290030190a25050565b60006105e3610bd2565b9050600061060260095461029860075485610c5290919063ffffffff16565b905061060d81610d24565b5050565b60025460035460045483565b6008546001600160a01b031681565b60065481565b60075481565b6003546001600160a01b038216600090815260056020526040902060020154915091565b6000811161069e57604051600160e51b62461bcd028152600401808060200182810382526029815260200180610fd76029913960400191505060405180910390fd5b6000805460408051600160e01b6323b872dd0281523360048201523060248201526044810185905290516001600160a01b03909216926323b872dd926064808401936020939083900390910190829087803b1580156106fc57600080fd5b505af1158015610710573d6000803e3d6000fd5b505050506040513d602081101561072657600080fd5b505161076657604051600160e51b62461bcd02815260040180806020018281038252603a815260200180611000603a913960400191505060405180910390fd5b60095460065461077d90429063ffffffff610ee316565b11156107bd57604051600160e51b62461bcd02815260040180806020018281038252602981526020018061103a6029913960400191505060405180910390fd5b60006107ee6009546102986007546107e2600280015442610ee390919063ffffffff16565b9063ffffffff610c5216565b4260045590506107fd81610d24565b6108073383610f43565b600354604080518481526020810192909252805133927f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee9092908290030190a25050565b60095481565b6001600160a01b0316600090815260056020526040902080546001909101549091565b6001600160a01b03811660009081526005602052604081206001810154600354825484916108b591670de0b6b3a764000091610298919063ffffffff610c5216565b905060006108d0846002015484610e2090919063ffffffff16565b9050818111156108e7576000945050505050610901565b60006108f9838363ffffffff610ee316565b955050505050505b919050565b6001600160a01b03811660009081526005602052604081206006548291829182918291829081908190819061094290429063ffffffff610ee316565b905060095481111561095357506009545b61096e60095461029860075484610c5290919063ffffffff16565b925060006009548214156109ad576004546009546006546109a6929161099a919063ffffffff610e2016565b9063ffffffff610ee316565b90506109c4565b6004546109c190429063ffffffff610ee316565b90505b60006109e160095461029860075485610c5290919063ffffffff16565b60095460065491925060009182916109ff919063ffffffff610e2016565b421015610a2457610a214261099a600954600654610e2090919063ffffffff16565b90505b6000610a4160095461029860075485610c5290919063ffffffff16565b60025490915060009015610ab757600254610a8190610a729061029888670de0b6b3a764000063ffffffff610c5216565b6003549063ffffffff610e2016565b600254909450610ab490610aa79061029885670de0b6b3a764000063ffffffff610c5216565b859063ffffffff610e2016565b90505b8a54610ad790670de0b6b3a764000090610298908763ffffffff610c5216565b975087610af58c600201548d60010154610e2090919063ffffffff16565b1115610b045760009750610b32565b610b2f610b228c600201548d60010154610e2090919063ffffffff16565b899063ffffffff610ee316565b97505b8a54610b5290670de0b6b3a764000090610298908463ffffffff610c5216565b995089610b708c600201548d60010154610e2090919063ffffffff16565b1115610b7f5760009950610bad565b610baa610b9d8c600201548d60010154610e2090919063ffffffff16565b8b9063ffffffff610ee316565b99505b5050600254600754909e509c50969a5094985092965050505050505091939590929450565b600080600954610bed60065442610ee390919063ffffffff16565b1115610c3257600454600954600654610c11929161099a919063ffffffff610e2016565b9050610c2a600954600654610e2090919063ffffffff16565b600455610c4d565b600454610c4690429063ffffffff610ee316565b4260045590505b905090565b600082610c6157506000610cb1565b82820282848281610c6e57fe5b0414610cae57604051600160e51b62461bcd0281526004018080602001828103825260218152602001806110636021913960400191505060405180910390fd5b90505b92915050565b6000808211610d105760408051600160e51b62461bcd02815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b6000828481610d1b57fe5b04949350505050565b600254610df65760015460085460408051600160e01b63a9059cbb0281526001600160a01b039283166004820152602481018590529051919092169163a9059cbb9160448083019260209291908290030181600087803b158015610d8757600080fd5b505af1158015610d9b573d6000803e3d6000fd5b505050506040513d6020811015610db157600080fd5b5051610df157604051600160e51b62461bcd0281526004018080602001828103825260298152602001806110a56029913960400191505060405180910390fd5b610e1d565b600254610e1990610a729061029884670de0b6b3a764000063ffffffff610c5216565b6003555b50565b600082820183811015610cae5760408051600160e51b62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b03821660009081526005602052604090208054610ea7908363ffffffff610ee316565b8155600254610ebc908363ffffffff610ee316565b6002908155600090820181905560018201556003548154610ede918391610f99565b505050565b600082821115610f3d5760408051600160e51b62461bcd02815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6001600160a01b03821660009081526005602052604090208054610f6d908363ffffffff610e2016565b8155600354610f7e90829084610f99565b600254610f91908363ffffffff610e2016565b600255505050565b610fc9610fb8670de0b6b3a7640000610298858563ffffffff610c5216565b60028501549063ffffffff610e2016565b836002018190555050505056fe596f75206e65656420746f207374616b65206120706f73697469766520746f6b656e20616d6f756e745472616e7366657246726f6d206661696c65642c206d616b65207375726520796f7520617070726f76656420746f6b656e207472616e7366657243616e206e6f74207374616b65206166746572207374616b696e6720706572696f6420706173736564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77576974686472617720696e746572657374207472616e73666572206661696c65645472616e73666572206661696c6564207768696c652074726173666572696e6720746f207661756c74a165627a7a72305820cd2c829af5130d3d8b5c8aa18a0da733a676bfba645b67b8462a93e9491a9d73002943616e206e6f74206265206e756c6c20616464726573730000000000000000000000000000000000000000009db640e18390d2408c71e9927d8518c79d5569c600000000000000000000000072f020f8f3e8fd9382705723cd26380f8d0c66bb00000000000000000000000000000000000000000000000000000000004f1a00000000000000000000000000000000000000000000007f0e10af47c1c7000000000000000000000000000000000000000000000000000000000000005fad3fe00000000000000000000000007b781d8c483ba33fa2aa40ead13f3a943ab08814

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100ce5760003560e01c8063750142e61161008c578063c03d5b4711610066578063c03d5b47146101ca578063c601f352146101d2578063e11932cf146101f8578063ebbbabbd1461021e576100ce565b8063750142e6146101665780637943913d1461016e578063a694fc3a146101ad576100ce565b806263750c146100d357806304c3a8a3146100dd57806329c257a2146100fa5780633b71be5914610102578063430bf08a146101285780636abfd1831461014c575b600080fd5b6100db61026f565b005b6100db600480360360208110156100f357600080fd5b50356103ef565b6100db6105d9565b61010a610611565b60408051938452602084019290925282820152519081900360600190f35b61013061061d565b604080516001600160a01b039092168252519081900360200190f35b61015461062c565b60408051918252519081900360200190f35b610154610632565b6101946004803603602081101561018457600080fd5b50356001600160a01b0316610638565b6040805192835260208301919091528051918290030190f35b6100db600480360360208110156101c357600080fd5b503561065c565b61015461084a565b610194600480360360208110156101e857600080fd5b50356001600160a01b0316610850565b6101546004803603602081101561020e57600080fd5b50356001600160a01b0316610873565b6102446004803603602081101561023457600080fd5b50356001600160a01b0316610906565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6000610279610bd2565b905060006102a460095461029860075485610c5290919063ffffffff16565b9063ffffffff610cb716565b90506102af81610d24565b60006102ba33610873565b3360009081526005602052604090206001810154919250906102e2908363ffffffff610e2016565b6001808301919091555460408051600160e01b63a9059cbb0281523360048201526024810185905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561034057600080fd5b505af1158015610354573d6000803e3d6000fd5b505050506040513d602081101561036a57600080fd5b50516103aa57604051600160e51b62461bcd0281526004018080602001828103825260218152602001806110846021913960400191505060405180910390fd5b600354604080518481526020810192909252805133927f9bbd517758fbae61197f1c1c04c8614064e89512dbaf4350dcdf76fcaa5e216192908290030190a250505050565b336000908152600560205260409020816104535760408051600160e51b62461bcd02815260206004820152601f60248201527f53686f756c6420776974686472617720706f73697469766520616d6f756e7400604482015290519081900360640190fd5b80548211156104ac5760408051600160e51b62461bcd02815260206004820152601760248201527f4e6f7420656e6f75676820746f6b656e207374616b6564000000000000000000604482015290519081900360640190fd5b6104b461026f565b6104be3383610e7d565b6000805460408051600160e01b63a9059cbb0281523360048201526024810186905290516001600160a01b039092169263a9059cbb926044808401936020939083900390910190829087803b15801561051657600080fd5b505af115801561052a573d6000803e3d6000fd5b505050506040513d602081101561054057600080fd5b50516105965760408051600160e51b62461bcd02815260206004820152601860248201527f7769746864726177207472616e73666572206661696c65640000000000000000604482015290519081900360640190fd5b600354604080518481526020810192909252805133927f933735aa8de6d7547d0126171b2f31b9c34dd00f3ecd4be85a0ba047db4fafef92908290030190a25050565b60006105e3610bd2565b9050600061060260095461029860075485610c5290919063ffffffff16565b905061060d81610d24565b5050565b60025460035460045483565b6008546001600160a01b031681565b60065481565b60075481565b6003546001600160a01b038216600090815260056020526040902060020154915091565b6000811161069e57604051600160e51b62461bcd028152600401808060200182810382526029815260200180610fd76029913960400191505060405180910390fd5b6000805460408051600160e01b6323b872dd0281523360048201523060248201526044810185905290516001600160a01b03909216926323b872dd926064808401936020939083900390910190829087803b1580156106fc57600080fd5b505af1158015610710573d6000803e3d6000fd5b505050506040513d602081101561072657600080fd5b505161076657604051600160e51b62461bcd02815260040180806020018281038252603a815260200180611000603a913960400191505060405180910390fd5b60095460065461077d90429063ffffffff610ee316565b11156107bd57604051600160e51b62461bcd02815260040180806020018281038252602981526020018061103a6029913960400191505060405180910390fd5b60006107ee6009546102986007546107e2600280015442610ee390919063ffffffff16565b9063ffffffff610c5216565b4260045590506107fd81610d24565b6108073383610f43565b600354604080518481526020810192909252805133927f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee9092908290030190a25050565b60095481565b6001600160a01b0316600090815260056020526040902080546001909101549091565b6001600160a01b03811660009081526005602052604081206001810154600354825484916108b591670de0b6b3a764000091610298919063ffffffff610c5216565b905060006108d0846002015484610e2090919063ffffffff16565b9050818111156108e7576000945050505050610901565b60006108f9838363ffffffff610ee316565b955050505050505b919050565b6001600160a01b03811660009081526005602052604081206006548291829182918291829081908190819061094290429063ffffffff610ee316565b905060095481111561095357506009545b61096e60095461029860075484610c5290919063ffffffff16565b925060006009548214156109ad576004546009546006546109a6929161099a919063ffffffff610e2016565b9063ffffffff610ee316565b90506109c4565b6004546109c190429063ffffffff610ee316565b90505b60006109e160095461029860075485610c5290919063ffffffff16565b60095460065491925060009182916109ff919063ffffffff610e2016565b421015610a2457610a214261099a600954600654610e2090919063ffffffff16565b90505b6000610a4160095461029860075485610c5290919063ffffffff16565b60025490915060009015610ab757600254610a8190610a729061029888670de0b6b3a764000063ffffffff610c5216565b6003549063ffffffff610e2016565b600254909450610ab490610aa79061029885670de0b6b3a764000063ffffffff610c5216565b859063ffffffff610e2016565b90505b8a54610ad790670de0b6b3a764000090610298908763ffffffff610c5216565b975087610af58c600201548d60010154610e2090919063ffffffff16565b1115610b045760009750610b32565b610b2f610b228c600201548d60010154610e2090919063ffffffff16565b899063ffffffff610ee316565b97505b8a54610b5290670de0b6b3a764000090610298908463ffffffff610c5216565b995089610b708c600201548d60010154610e2090919063ffffffff16565b1115610b7f5760009950610bad565b610baa610b9d8c600201548d60010154610e2090919063ffffffff16565b8b9063ffffffff610ee316565b99505b5050600254600754909e509c50969a5094985092965050505050505091939590929450565b600080600954610bed60065442610ee390919063ffffffff16565b1115610c3257600454600954600654610c11929161099a919063ffffffff610e2016565b9050610c2a600954600654610e2090919063ffffffff16565b600455610c4d565b600454610c4690429063ffffffff610ee316565b4260045590505b905090565b600082610c6157506000610cb1565b82820282848281610c6e57fe5b0414610cae57604051600160e51b62461bcd0281526004018080602001828103825260218152602001806110636021913960400191505060405180910390fd5b90505b92915050565b6000808211610d105760408051600160e51b62461bcd02815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b6000828481610d1b57fe5b04949350505050565b600254610df65760015460085460408051600160e01b63a9059cbb0281526001600160a01b039283166004820152602481018590529051919092169163a9059cbb9160448083019260209291908290030181600087803b158015610d8757600080fd5b505af1158015610d9b573d6000803e3d6000fd5b505050506040513d6020811015610db157600080fd5b5051610df157604051600160e51b62461bcd0281526004018080602001828103825260298152602001806110a56029913960400191505060405180910390fd5b610e1d565b600254610e1990610a729061029884670de0b6b3a764000063ffffffff610c5216565b6003555b50565b600082820183811015610cae5760408051600160e51b62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b03821660009081526005602052604090208054610ea7908363ffffffff610ee316565b8155600254610ebc908363ffffffff610ee316565b6002908155600090820181905560018201556003548154610ede918391610f99565b505050565b600082821115610f3d5760408051600160e51b62461bcd02815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6001600160a01b03821660009081526005602052604090208054610f6d908363ffffffff610e2016565b8155600354610f7e90829084610f99565b600254610f91908363ffffffff610e2016565b600255505050565b610fc9610fb8670de0b6b3a7640000610298858563ffffffff610c5216565b60028501549063ffffffff610e2016565b836002018190555050505056fe596f75206e65656420746f207374616b65206120706f73697469766520746f6b656e20616d6f756e745472616e7366657246726f6d206661696c65642c206d616b65207375726520796f7520617070726f76656420746f6b656e207472616e7366657243616e206e6f74207374616b65206166746572207374616b696e6720706572696f6420706173736564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77576974686472617720696e746572657374207472616e73666572206661696c65645472616e73666572206661696c6564207768696c652074726173666572696e6720746f207661756c74a165627a7a72305820cd2c829af5130d3d8b5c8aa18a0da733a676bfba645b67b8462a93e9491a9d730029

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000009db640e18390d2408c71e9927d8518c79d5569c600000000000000000000000072f020f8f3e8fd9382705723cd26380f8d0c66bb00000000000000000000000000000000000000000000000000000000004f1a00000000000000000000000000000000000000000000007f0e10af47c1c7000000000000000000000000000000000000000000000000000000000000005fad3fe00000000000000000000000007b781d8c483ba33fa2aa40ead13f3a943ab08814

-----Decoded View---------------
Arg [0] : _stakeToken (address): 0x9Db640e18390D2408C71E9927d8518c79d5569c6
Arg [1] : _rewardToken (address): 0x72F020f8f3E8fd9382705723Cd26380f8D0c66Bb
Arg [2] : _stakingPeriod (uint256): 5184000
Arg [3] : _totalRewardToBeDistributed (uint256): 600000000000000000000000
Arg [4] : _stakingStart (uint256): 1605189600
Arg [5] : _vaultAdd (address): 0x7b781D8c483Ba33FA2aA40eAD13F3A943ab08814

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000009db640e18390d2408c71e9927d8518c79d5569c6
Arg [1] : 00000000000000000000000072f020f8f3e8fd9382705723cd26380f8d0c66bb
Arg [2] : 00000000000000000000000000000000000000000000000000000000004f1a00
Arg [3] : 000000000000000000000000000000000000000000007f0e10af47c1c7000000
Arg [4] : 000000000000000000000000000000000000000000000000000000005fad3fe0
Arg [5] : 0000000000000000000000007b781d8c483ba33fa2aa40ead13f3a943ab08814


Deployed Bytecode Sourcemap

795:13849:4:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;795:13849:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7926:667;;;:::i;:::-;;6483:537;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6483:537:4;;:::i;8601:260::-;;;:::i;1597:32::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;1766:27;;;:::i;:::-;;;;-1:-1:-1;;;;;1766:27:4;;;;;;;;;;;;;;1638:28;;;:::i;:::-;;;;;;;;;;;;;;;;1675:23;;;:::i;8869:188::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8869:188:4;-1:-1:-1;;;;;8869:188:4;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;4058:745;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4058:745:4;;:::i;1936:28::-;;;:::i;11530:199::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11530:199:4;-1:-1:-1;;;;;11530:199:4;;:::i;9936:757::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9936:757:4;-1:-1:-1;;;;;9936:757:4;;:::i;12116:2525::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12116:2525:4;-1:-1:-1;;;;;12116:2525:4;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7926:667;7972:24;7999:22;:20;:22::i;:::-;7972:49;;8032:27;8062:55;8103:13;;8062:36;8086:11;;8062:19;:23;;:36;;;;:::i;:::-;:40;:55;:40;:55;:::i;:::-;8032:85;;8138:49;8164:22;8138:25;:49::i;:::-;8198:16;8217:29;8235:10;8217:17;:29::i;:::-;8306:10;8257:25;8285:32;;;:20;:32;;;;;8357:26;;;;8198:48;;-1:-1:-1;8285:32:4;8357:40;;8198:48;8357:40;:30;:40;:::i;:::-;8328:26;;;;:69;;;;8416:11;:42;;;-1:-1:-1;;;;;8416:42:4;;8437:10;8416:42;;;;;;;;;;;;-1:-1:-1;;;;;8416:11:4;;;;:20;;:42;;;;;;;;;;;;;;;:11;;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;8416:42:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8416:42:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8416:42:4;8408:88;;;;-1:-1:-1;;;;;8408:88:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8552:32;;8512:73;;;;;;;;;;;;;;;8530:10;;8512:73;;;;;;;;;7926:667;;;;:::o;6483:537::-;6599:10;6554:21;6578:32;;;:20;:32;;;;;6629:11;6621:55;;;;;-1:-1:-1;;;;;6621:55:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;6695:18;;:29;-1:-1:-1;6695:29:4;6687:65;;;;;-1:-1:-1;;;;;6687:65:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;6763:18;:16;:18::i;:::-;6792:47;6819:10;6831:7;6792:26;:47::i;:::-;6858:10;;;:40;;;-1:-1:-1;;;;;6858:40:4;;6878:10;6858:40;;;;;;;;;;;;-1:-1:-1;;;;;6858:10:4;;;;:19;;:40;;;;;;;;;;;;;;;;;:10;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;6858:40:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6858:40:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6858:40:4;6850:77;;;;;-1:-1:-1;;;;;6850:77:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;6979:32;;6943:69;;;;;;;;;;;;;;;6958:10;;6943:69;;;;;;;;;6483:537;;:::o;8601:260::-;8648:24;8675:22;:20;:22::i;:::-;8648:49;;8708:27;8738:55;8779:13;;8738:36;8762:11;;8738:19;:23;;:36;;;;:::i;:55::-;8708:85;;8804:49;8830:22;8804:25;:49::i;:::-;8601:260;;:::o;1597:32::-;;;;;;;;:::o;1766:27::-;;;-1:-1:-1;;;;;1766:27:4;;:::o;1638:28::-;;;;:::o;1675:23::-;;;;:::o;8869:188::-;8970:32;;-1:-1:-1;;;;;9004:29:4;;8928:7;9004:29;;;:20;:29;;;;;8970:12;9004:44;;8869:188;;;:::o;4058:745::-;4128:1;4118:7;:11;4110:65;;;;-1:-1:-1;;;;;4110:65:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4208:10;;;:59;;;-1:-1:-1;;;;;4208:59:4;;4232:10;4208:59;;;;4252:4;4208:59;;;;;;;;;;;;-1:-1:-1;;;;;4208:10:4;;;;:23;;:59;;;;;;;;;;;;;;;;;:10;:59;;;5:2:-1;;;;30:1;27;20:12;5:2;4208:59:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4208:59:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4208:59:4;4186:167;;;;-1:-1:-1;;;;;4186:167:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4401:13;;4380:16;;4372:25;;:3;;:25;:7;:25;:::i;:::-;:42;;4364:96;;;;-1:-1:-1;;;;;4364:96:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4471:27;4501:69;4556:13;;4501:50;4539:11;;4501:33;4509:12;:24;;;4501:3;:7;;:33;;;;:::i;:::-;:37;:50;:37;:50;:::i;:69::-;4608:3;4581:24;:30;4471:99;-1:-1:-1;4622:49:4;4471:99;4622:25;:49::i;:::-;4682:36;4698:10;4710:7;4682:15;:36::i;:::-;4762:32;;4734:61;;;;;;;;;;;;;;;4741:10;;4734:61;;;;;;;;;4058:745;;:::o;1936:28::-;;;;:::o;11530:199::-;-1:-1:-1;;;;;11632:29:4;11590:7;11632:29;;;:20;:29;;;;;:41;;11675:45;;;;;11632:41;;11530:199::o;9936:757::-;-1:-1:-1;;;;;10081:29:4;;10028:7;10081:29;;;:20;:29;;;;;10160:26;;;;10081:20;10285:32;10230:36;;10028:7;;10230:105;;1856:6;;10230:88;;:36;:88;:54;:88;:::i;:105::-;10199:136;;10348:23;10374:71;10409:10;:25;;;10374:16;:20;;:71;;;;:::i;:::-;10348:97;;10515:20;10497:15;:38;10493:79;;;10559:1;10552:8;;;;;;;;10493:79;10584:20;10608:41;:20;10633:15;10608:41;:24;:41;:::i;:::-;10584:66;-1:-1:-1;;;;;;9936:757:4;;;;:::o;12116:2525::-;-1:-1:-1;;;;;12253:29:4;;12177:4;12253:29;;;:20;:29;;;;;12422:16;;12177:4;;;;;;;;;;;;;;;;12414:25;;:3;;:25;:7;:25;:::i;:::-;12395:44;;12469:13;;12455:11;:27;12452:95;;;-1:-1:-1;12522:13:4;;12452:95;12576:47;12609:13;;12576:28;12592:11;;12576;:15;;:28;;;;:::i;:47::-;12559:64;;12636:24;12689:13;;12674:11;:28;12671:244;;;12790:24;;12771:13;;12750:16;;:65;;12790:24;12750:35;;:16;:35;:20;:35;:::i;:::-;:39;:65;:39;:65;:::i;:::-;12728:87;;12671:244;;;12878:24;;12870:33;;:3;;:33;:7;:33;:::i;:::-;12848:55;;12671:244;12925:27;12955:55;12996:13;;12955:36;12979:11;;12955:19;:23;;:36;;;;:::i;:55::-;13120:13;;13099:16;;12925:85;;-1:-1:-1;13021:23:4;;;;13099:35;;:16;:35;:20;:35;:::i;:::-;13093:3;:41;13090:131;;;13165:44;13205:3;13165:35;13186:13;;13165:16;;:20;;:35;;;;:::i;:44::-;13147:62;;13090:131;13231:25;13259:51;13296:13;;13259:32;13279:11;;13259:15;:19;;:32;;;;:::i;:51::-;13355:12;:30;13231:79;;-1:-1:-1;13321:19:4;;13355:35;13351:383;;13559:12;:30;13428:163;;13479:111;;:57;:22;1856:6;13479:57;:44;:57;:::i;:111::-;13428:32;;;:163;:36;:163;:::i;:::-;13690:12;:30;13407:184;;-1:-1:-1;13625:97:4;;13648:73;;:37;:20;1856:6;13648:37;:24;:37;:::i;:73::-;13625:18;;:97;:22;:97;:::i;:::-;13608:114;;13351:383;13770:36;;:91;;1856:6;;13770:74;;13825:18;13770:74;:54;:74;:::i;:91::-;13754:107;;13938:13;13878:57;13909:10;:25;;;13878:10;:26;;;:30;;:57;;;;:::i;:::-;:73;13874:259;;;13993:1;13977:17;;13874:259;;;14045:76;14063:57;14094:10;:25;;;14063:10;:26;;;:30;;:57;;;;:::i;:::-;14045:13;;:76;:17;:76;:::i;:::-;14029:92;;13874:259;14163:36;;:87;;1856:6;;14163:70;;14218:14;14163:70;:54;:70;:::i;:87::-;14145:105;;14325:15;14265:57;14296:10;:25;;;14265:10;:26;;;:30;;:57;;;;:::i;:::-;:75;14261:258;;;14375:1;14357:19;;14261:258;;;14429:78;14449:57;14480:10;:25;;;14449:10;:26;;;:30;;:57;;;;:::i;:::-;14429:15;;:78;:19;:78;:::i;:::-;14411:96;;14261:258;-1:-1:-1;;14539:12:4;:30;14571:11;;14539:30;;-1:-1:-1;14571:11:4;-1:-1:-1;14584:15:4;;-1:-1:-1;14601:14:4;;-1:-1:-1;14617:13:4;;-1:-1:-1;;;;;;;12116:2525:4;;;;;;;:::o;9065:527::-;9114:7;9134:24;9200:13;;9172:25;9180:16;;9172:3;:7;;:25;;;;:::i;:::-;:41;9169:379;;;9301:24;;9282:13;;9261:16;;:65;;9301:24;9261:35;;:16;:35;:20;:35;:::i;:65::-;9239:87;;9368:35;9389:13;;9368:16;;:20;;:35;;;;:::i;:::-;9341:24;:62;9169:379;;;9466:24;;9458:33;;:3;;:33;:7;:33;:::i;:::-;9533:3;9506:24;:30;9436:55;-1:-1:-1;9169:379:4;9565:19;-1:-1:-1;9065:527:4;:::o;2279:471:3:-;2337:7;2582:6;2578:47;;-1:-1:-1;2612:1:3;2605:8;;2578:47;2649:5;;;2653:1;2649;:5;:1;2673:5;;;;;:10;2665:56;;;;-1:-1:-1;;;;;2665:56:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2741:1;-1:-1:-1;2279:471:3;;;;;:::o;3218:333::-;3276:7;3375:1;3371;:5;3363:44;;;;;-1:-1:-1;;;;;3363:44:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;3418:9;3434:1;3430;:5;;;;;;;3218:333;-1:-1:-1;;;;3218:333:3:o;11000:520:4:-;11103:12;:30;11099:197;;11163:11;;11184:12;;11163:54;;;-1:-1:-1;;;;;11163:54:4;;-1:-1:-1;;;;;11184:12:4;;;11163:54;;;;;;;;;;;;:11;;;;;:20;;:54;;;;;;;;;;;;;;:11;;:54;;;5:2:-1;;;;30:1;27;20:12;5:2;11163:54:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11163:54:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11163:54:4;11155:108;;;;-1:-1:-1;;;;;11155:108:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11278:7;;11099:197;11469:12;:30;11341:171;;11392:108;;:53;:18;1856:6;11392:53;:40;:53;:::i;11341:171::-;11306:32;:206;11000:520;;:::o;859:181:3:-;917:7;949:5;;;973:6;;;;965:46;;;;;-1:-1:-1;;;;;965:46:3;;;;;;;;;;;;;;;;;;;;;;;;;;;7266:583:4;-1:-1:-1;;;;;7410:29:4;;7381:26;7410:29;;;:20;:29;;;;;7478:23;;:36;;7506:7;7478:36;:27;:36;:::i;:::-;7452:62;;7560:12;:30;:43;;7595:7;7560:43;:34;:43;:::i;:::-;7527:12;:76;;;:30;7616:26;;;:30;;;7657:27;;;:31;7760:32;;7807:23;;7699:142;;7616:11;;7699:20;:142::i;:::-;7266:583;;;:::o;1315:184:3:-;1373:7;1406:1;1401;:6;;1393:49;;;;;-1:-1:-1;;;;;1393:49:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1465:5:3;;;1315:184::o;5080:469:4:-;-1:-1:-1;;;;;5212:29:4;;5183:26;5212:29;;;:20;:29;;;;;5280:23;;:35;;5308:6;5280:35;:27;:35;:::i;:::-;5254:61;;5389:32;;5328:125;;5254:11;;5436:6;5328:20;:125::i;:::-;5499:12;:30;:42;;5534:6;5499:42;:34;:42;:::i;:::-;5466:12;:75;-1:-1:-1;;;5080:469:4:o;6107:302::-;6296:105;6341:49;1856:6;6341:32;:20;6366:6;6341:32;:24;:32;:::i;:49::-;6296:26;;;;;:105;:30;:105;:::i;:::-;6267:11;:26;;:134;;;;6107:302;;;:::o

Swarm Source

bzzr://cd2c829af5130d3d8b5c8aa18a0da733a676bfba645b67b8462a93e9491a9d73

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.