ETH Price: $2,437.92 (+1.49%)

Token

OKLG Staking Token (sOKLG)
 

Overview

Max Total Supply

5,964.127917993548214797 sOKLG

Holders

5

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
greatgoatje.eth
Balance
714.238358066066528608 sOKLG

Value
$0.00
0x1364b33721df08e788d73ae23029be3410c88d38
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
OKLGFaaSToken

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 11 : OKLGFaaSToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import '@openzeppelin/contracts/token/ERC20/ERC20.sol';
import '@openzeppelin/contracts/interfaces/IERC20.sol';
import '@openzeppelin/contracts/interfaces/IERC721.sol';
import '@openzeppelin/contracts/utils/math/SafeMath.sol';
import './interfaces/IOKLGFaaSTimePricing.sol';

/**
 * @title OKLGFaaSToken (sOKLG)
 * @notice Represents a contract where a token owner has put her tokens up for others to stake and earn said tokens.
 */
contract OKLGFaaSToken is ERC20 {
  using SafeMath for uint256;
  bool public contractIsRemoved = false;

  IERC20 private _rewardsToken;
  IERC20 private _stakedERC20;
  IERC721 private _stakedERC721;
  IOKLGFaaSTimePricing private _faasPricing;
  PoolInfo public pool;

  struct PoolInfo {
    address creator; // address of contract creator
    address tokenOwner; // address of original rewards token owner
    uint256 poolTotalSupply; // supply of rewards tokens put up to be rewarded by original owner
    uint256 poolRemainingSupply; // current supply of rewards
    uint256 totalTokensStaked; // current amount of tokens staked
    uint256 creationBlock; // block this contract was created
    uint256 perBlockNum; // amount of rewards tokens rewarded per block
    uint256 lockedUntilDate; // unix timestamp of how long this contract is locked and can't be changed
    // uint256 allocPoint; // How many allocation points assigned to this pool. ERC20s to distribute per block.
    uint256 lastRewardBlock; // Last block number that ERC20s distribution occurs.
    uint256 accERC20PerShare; // Accumulated ERC20s per share, times 1e36.
    uint256 stakeTimeLockSec; // number of seconds after depositing the user is required to stake before unstaking
    bool isStakedNft;
  }

  struct StakerInfo {
    uint256 amountStaked;
    uint256 blockOriginallyStaked; // block the user originally staked
    uint256 timeOriginallyStaked; // unix timestamp in seconds that the user originally staked
    uint256 blockLastHarvested; // the block the user last claimed/harvested rewards
    uint256 rewardDebt; // Reward debt. See explanation below.
    uint256[] nftTokenIds; // if this is an NFT staking pool, make sure we store the token IDs here
  }

  struct BlockTokenTotal {
    uint256 blockNumber;
    uint256 totalTokens;
  }

  // mapping of userAddresses => tokenAddresses that can
  // can be evaluated to determine for a particular user which tokens
  // they are staking.
  mapping(address => StakerInfo) public stakers;

  // If we need to keep track of owed rewards for a user but not
  // send them yet (i.e. when adding tokens for a stake during lockup)
  // this keeps track of that, and will add said rewards back to
  // the rewards pool on emergency unstake
  mapping(address => uint256) public rewardVault;

  event Deposit(address indexed user, uint256 amount);
  event Withdraw(address indexed user, uint256 amount);

  /**
   * @notice The constructor for the Staking Token.
   * @param _name Name of the staking token
   * @param _symbol Name of the staking token symbol
   * @param _rewardSupply The amount of tokens to mint on construction, this should be the same as the tokens provided by the creating user.
   * @param _rewardsTokenAddy Contract address of token to be rewarded to users
   * @param _stakedTokenAddy Contract address of token to be staked by users
   * @param _originalTokenOwner Address of user putting up staking tokens to be staked
   * @param _perBlockAmount Amount of tokens to be rewarded per block
   * @param _lockedUntilDate Unix timestamp that the staked tokens will be locked. 0 means locked forever until all tokens are staked
   * @param _stakeTimeLockSec number of seconds a user is required to stake, or 0 if none
   * @param _isStakedNft is this an NFT staking pool
   * @param _pricingContract is contract we use to pay to create and update supply for FaaS pools
   */
  constructor(
    string memory _name,
    string memory _symbol,
    uint256 _rewardSupply,
    address _rewardsTokenAddy,
    address _stakedTokenAddy,
    address _originalTokenOwner,
    uint256 _perBlockAmount,
    uint256 _lockedUntilDate,
    uint256 _stakeTimeLockSec,
    bool _isStakedNft,
    address _pricingContract
  ) ERC20(_name, _symbol) {
    require(
      _perBlockAmount > uint256(0) && _perBlockAmount <= uint256(_rewardSupply),
      'per block amount must be more than 0 and less than supply'
    );

    // A locked date of '0' corresponds to being locked forever until the supply has expired and been rewards to all stakers
    require(
      _lockedUntilDate > block.timestamp || _lockedUntilDate == 0,
      'locked time must be after now or 0'
    );

    _rewardsToken = IERC20(_rewardsTokenAddy);
    if (_isStakedNft) {
      _stakedERC721 = IERC721(_stakedTokenAddy);
    } else {
      _stakedERC20 = IERC20(_stakedTokenAddy);
    }

    pool = PoolInfo({
      creator: msg.sender,
      tokenOwner: _originalTokenOwner,
      poolTotalSupply: _rewardSupply,
      poolRemainingSupply: _rewardSupply,
      totalTokensStaked: 0,
      creationBlock: 0,
      perBlockNum: _perBlockAmount,
      lockedUntilDate: _lockedUntilDate,
      lastRewardBlock: block.number,
      accERC20PerShare: 0,
      stakeTimeLockSec: _stakeTimeLockSec,
      isStakedNft: _isStakedNft
    });

    _faasPricing = IOKLGFaaSTimePricing(_pricingContract);
  }

  // SHOULD ONLY BE CALLED AT CONTRACT CREATION and allows changing
  // the initial supply if tokenomics of token transfer causes
  // the original staking contract supply to be less than the original
  function updateSupply(uint256 _newSupply) external {
    require(
      msg.sender == pool.creator,
      'only contract creator can update the supply'
    );
    pool.poolTotalSupply = _newSupply;
    pool.poolRemainingSupply = _newSupply;
  }

  function addToSupply(uint256 _additionalSupply) external payable {
    require(_additionalSupply >= pool.perBlockNum, 'must add 1 block at least');
    _faasPricing.payForPool{ value: msg.value }(
      _additionalSupply,
      pool.perBlockNum
    );

    uint256 _balBefore = _rewardsToken.balanceOf(address(this));
    _rewardsToken.transferFrom(msg.sender, address(this), _additionalSupply);
    _additionalSupply = _rewardsToken.balanceOf(address(this)) - _balBefore;

    pool.poolTotalSupply += _additionalSupply;
    pool.poolRemainingSupply += _additionalSupply;
  }

  function stakedTokenAddress() external view returns (address) {
    return pool.isStakedNft ? address(_stakedERC721) : address(_stakedERC20);
  }

  function rewardsTokenAddress() external view returns (address) {
    return address(_rewardsToken);
  }

  function tokenOwner() external view returns (address) {
    return pool.tokenOwner;
  }

  function getLockedUntilDate() external view returns (uint256) {
    return pool.lockedUntilDate;
  }

  function removeRewards() external {
    require(
      msg.sender == pool.tokenOwner || msg.sender == pool.creator,
      'must be owner or master contract to remove rewards'
    );
    _rewardsToken.transfer(pool.tokenOwner, pool.poolRemainingSupply);
    pool.poolRemainingSupply = 0;
    contractIsRemoved = true;
  }

  function stakeTokens(uint256 _amount, uint256[] memory _tokenIds) public {
    require(
      getLastStakableBlock() > block.number,
      'this farm is expired and no more stakers can be added'
    );

    StakerInfo storage _staker = stakers[msg.sender];
    _updatePool();

    if (balanceOf(msg.sender) > 0) {
      _harvestTokens(
        msg.sender,
        block.timestamp >=
          _staker.timeOriginallyStaked.add(pool.stakeTimeLockSec)
      );
    }

    uint256 _finalAmountTransferred;
    if (pool.isStakedNft) {
      require(
        _tokenIds.length > 0,
        "you need to provide NFT token IDs you're staking"
      );
      for (uint256 _i = 0; _i < _tokenIds.length; _i++) {
        _stakedERC721.transferFrom(msg.sender, address(this), _tokenIds[_i]);
      }

      _finalAmountTransferred = _tokenIds.length;
    } else {
      uint256 _contractBalanceBefore = _stakedERC20.balanceOf(address(this));
      _stakedERC20.transferFrom(msg.sender, address(this), _amount);

      // in the event a token contract on transfer taxes, burns, etc. tokens
      // the contract might not get the entire amount that the user originally
      // transferred. Need to calculate from the previous contract balance
      // so we know how many were actually transferred.
      _finalAmountTransferred = _stakedERC20.balanceOf(address(this)).sub(
        _contractBalanceBefore
      );
    }

    if (totalSupply() == 0) {
      pool.creationBlock = block.number;
      pool.lastRewardBlock = block.number;
    }
    _mint(msg.sender, _finalAmountTransferred);
    _staker.amountStaked = _staker.amountStaked.add(_finalAmountTransferred);
    _staker.blockOriginallyStaked = block.number;
    _staker.timeOriginallyStaked = block.timestamp;
    _staker.blockLastHarvested = block.number;
    _staker.rewardDebt = _staker.amountStaked.mul(pool.accERC20PerShare).div(
      1e36
    );
    for (uint256 _i = 0; _i < _tokenIds.length; _i++) {
      _staker.nftTokenIds.push(_tokenIds[_i]);
    }
    _updNumStaked(_finalAmountTransferred, 'add');
    emit Deposit(msg.sender, _finalAmountTransferred);
  }

  // pass 'false' for _shouldHarvest for emergency unstaking without claiming rewards
  function unstakeTokens(uint256 _amount, bool _shouldHarvest) external {
    StakerInfo storage _staker = stakers[msg.sender];
    uint256 _userBalance = _staker.amountStaked;
    require(
      pool.isStakedNft ? true : _amount <= _userBalance,
      'user can only unstake amount they have currently staked or less'
    );

    // allow unstaking if the user is emergency unstaking and not getting rewards or
    // if theres a time lock that it's past the time lock or
    // the contract rewards were removed by the original contract creator or
    // the contract is expired
    require(
      !_shouldHarvest ||
        block.timestamp >=
        _staker.timeOriginallyStaked.add(pool.stakeTimeLockSec) ||
        contractIsRemoved ||
        block.number > getLastStakableBlock(),
      'you have not staked for minimum time lock yet and the pool is not expired'
    );

    _updatePool();

    if (_shouldHarvest) {
      _harvestTokens(msg.sender, true);
    } else {
      _removeFromVaultBackToPool(msg.sender);
    }

    uint256 _amountToRemoveFromStaked = pool.isStakedNft
      ? _userBalance
      : _amount;
    _burn(
      msg.sender,
      _amountToRemoveFromStaked > balanceOf(msg.sender)
        ? balanceOf(msg.sender)
        : _amountToRemoveFromStaked
    );
    if (pool.isStakedNft) {
      for (uint256 _i = 0; _i < _staker.nftTokenIds.length; _i++) {
        _stakedERC721.transferFrom(
          address(this),
          msg.sender,
          _staker.nftTokenIds[_i]
        );
      }
    } else {
      require(
        _stakedERC20.transfer(msg.sender, _amountToRemoveFromStaked),
        'unable to send user original tokens'
      );
    }

    if (balanceOf(msg.sender) <= 0) {
      delete stakers[msg.sender];
    } else {
      _staker.amountStaked = _staker.amountStaked.sub(
        _amountToRemoveFromStaked
      );
    }
    _updNumStaked(_amountToRemoveFromStaked, 'remove');
    emit Withdraw(msg.sender, _amountToRemoveFromStaked);
  }

  function emergencyUnstake() external {
    StakerInfo memory _staker = stakers[msg.sender];
    _removeFromVaultBackToPool(msg.sender);
    uint256 _amountToRemoveFromStaked = _staker.amountStaked;
    require(
      _amountToRemoveFromStaked > 0,
      'user can only unstake if they have tokens in the pool'
    );
    _burn(
      msg.sender,
      _amountToRemoveFromStaked > balanceOf(msg.sender)
        ? balanceOf(msg.sender)
        : _amountToRemoveFromStaked
    );
    if (pool.isStakedNft) {
      for (uint256 _i = 0; _i < _staker.nftTokenIds.length; _i++) {
        _stakedERC721.transferFrom(
          address(this),
          msg.sender,
          _staker.nftTokenIds[_i]
        );
      }
    } else {
      require(
        _stakedERC20.transfer(msg.sender, _amountToRemoveFromStaked),
        'unable to send user original tokens'
      );
    }

    delete stakers[msg.sender];
    _updNumStaked(_amountToRemoveFromStaked, 'remove');
    emit Withdraw(msg.sender, _amountToRemoveFromStaked);
  }

  function harvestForUser(address _userAddy, bool _autoCompound)
    external
    returns (uint256)
  {
    require(
      msg.sender == pool.creator || msg.sender == _userAddy,
      'can only harvest tokens for someone else if this was the contract creator'
    );
    _updatePool();
    StakerInfo memory _staker = stakers[_userAddy];
    uint256 _tokensToUser = _harvestTokens(
      _userAddy,
      block.timestamp >= _staker.timeOriginallyStaked.add(pool.stakeTimeLockSec)
    );

    if (
      _autoCompound &&
      !pool.isStakedNft &&
      address(_rewardsToken) == address(_stakedERC20)
    ) {
      uint256[] memory _placeholder;
      stakeTokens(_tokensToUser, _placeholder);
    }

    return _tokensToUser;
  }

  function getLastStakableBlock() public view returns (uint256) {
    uint256 _blockToAdd = pool.creationBlock == 0
      ? block.number
      : pool.creationBlock;
    return pool.poolTotalSupply.div(pool.perBlockNum).add(_blockToAdd);
  }

  function calcHarvestTot(address _userAddy) public view returns (uint256) {
    StakerInfo memory _staker = stakers[_userAddy];

    if (
      _staker.blockLastHarvested >= block.number ||
      _staker.blockOriginallyStaked == 0 ||
      pool.totalTokensStaked == 0
    ) {
      return 0;
    }

    uint256 _accERC20PerShare = pool.accERC20PerShare;

    if (block.number > pool.lastRewardBlock && pool.totalTokensStaked != 0) {
      uint256 _endBlock = getLastStakableBlock();
      uint256 _lastBlock = block.number < _endBlock ? block.number : _endBlock;
      uint256 _nrOfBlocks = _lastBlock.sub(pool.lastRewardBlock);
      uint256 _erc20Reward = _nrOfBlocks.mul(pool.perBlockNum);
      _accERC20PerShare = _accERC20PerShare.add(
        _erc20Reward.mul(1e36).div(pool.totalTokensStaked)
      );
    }

    return
      _staker.amountStaked.mul(_accERC20PerShare).div(1e36).sub(
        _staker.rewardDebt
      );
  }

  // Update reward variables of the given pool to be up-to-date.
  function _updatePool() private {
    uint256 _endBlock = getLastStakableBlock();
    uint256 _lastBlock = block.number < _endBlock ? block.number : _endBlock;

    if (_lastBlock <= pool.lastRewardBlock) {
      return;
    }
    uint256 _stakedSupply = pool.totalTokensStaked;
    if (_stakedSupply == 0) {
      pool.lastRewardBlock = _lastBlock;
      return;
    }

    uint256 _nrOfBlocks = _lastBlock.sub(pool.lastRewardBlock);
    uint256 _erc20Reward = _nrOfBlocks.mul(pool.perBlockNum);

    pool.accERC20PerShare = pool.accERC20PerShare.add(
      _erc20Reward.mul(1e36).div(_stakedSupply)
    );
    pool.lastRewardBlock = _lastBlock;
  }

  function _harvestTokens(address _userAddy, bool _sendRewards)
    private
    returns (uint256)
  {
    StakerInfo storage _staker = stakers[_userAddy];
    require(_staker.blockOriginallyStaked > 0, 'user must have tokens staked');

    uint256 _num2Trans = calcHarvestTot(_userAddy);
    if (_num2Trans > 0) {
      if (_sendRewards) {
        _sendRewardsToUser(_userAddy, _num2Trans);
      } else {
        rewardVault[_userAddy] += _num2Trans;
      }
    }
    _staker.rewardDebt = _staker.amountStaked.mul(pool.accERC20PerShare).div(
      1e36
    );
    _staker.blockLastHarvested = block.number;
    return _num2Trans;
  }

  function _sendRewardsToUser(address _user, uint256 _amount) internal {
    uint256 _totalToSend = _amount + rewardVault[_user];
    rewardVault[_user] = 0;
    require(
      _rewardsToken.transfer(_user, _totalToSend),
      'unable to send user their harvested tokens'
    );
    pool.poolRemainingSupply = pool.poolRemainingSupply.sub(_totalToSend);
  }

  function _removeFromVaultBackToPool(address _user) internal {
    uint256 _amountInVault = rewardVault[_user];
    rewardVault[_user] = 0;
    pool.poolRemainingSupply = pool.poolRemainingSupply.add(_amountInVault);
  }

  // update the amount currently staked after a user harvests
  function _updNumStaked(uint256 _amount, string memory _operation) private {
    if (_compareStr(_operation, 'remove')) {
      pool.totalTokensStaked = pool.totalTokensStaked.sub(_amount);
    } else {
      pool.totalTokensStaked = pool.totalTokensStaked.add(_amount);
    }
  }

  function _compareStr(string memory a, string memory b)
    private
    pure
    returns (bool)
  {
    return (keccak256(abi.encodePacked((a))) ==
      keccak256(abi.encodePacked((b))));
  }
}

File 2 of 11 : ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.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 {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead 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 Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        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}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, 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 virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, _allowances[owner][spender] + 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 virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[owner][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This 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:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, 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:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `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 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This 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 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    /**
     * @dev Spend `amount` form the allowance of `owner` toward `spender`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

File 3 of 11 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol)

pragma solidity ^0.8.0;

import "../token/ERC20/IERC20.sol";

File 4 of 11 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol)

pragma solidity ^0.8.0;

import "../token/ERC721/IERC721.sol";

File 5 of 11 : SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @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) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 6 of 11 : IOKLGFaaSTimePricing.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

interface IOKLGFaaSTimePricing {
  function payForPool(uint256 supply, uint256 perBlockAllocation)
    external
    payable;

  function getProductCostWei(uint256 _productCostUSD18)
    external
    view
    returns (uint256);
}

File 7 of 11 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        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 8 of 11 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

File 9 of 11 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 10 of 11 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

File 11 of 11 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

Settings
{
  "metadata": {
    "bytecodeHash": "none"
  },
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_rewardSupply","type":"uint256"},{"internalType":"address","name":"_rewardsTokenAddy","type":"address"},{"internalType":"address","name":"_stakedTokenAddy","type":"address"},{"internalType":"address","name":"_originalTokenOwner","type":"address"},{"internalType":"uint256","name":"_perBlockAmount","type":"uint256"},{"internalType":"uint256","name":"_lockedUntilDate","type":"uint256"},{"internalType":"uint256","name":"_stakeTimeLockSec","type":"uint256"},{"internalType":"bool","name":"_isStakedNft","type":"bool"},{"internalType":"address","name":"_pricingContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"uint256","name":"_additionalSupply","type":"uint256"}],"name":"addToSupply","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_userAddy","type":"address"}],"name":"calcHarvestTot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractIsRemoved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyUnstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getLastStakableBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLockedUntilDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_userAddy","type":"address"},{"internalType":"bool","name":"_autoCompound","type":"bool"}],"name":"harvestForUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pool","outputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"uint256","name":"poolTotalSupply","type":"uint256"},{"internalType":"uint256","name":"poolRemainingSupply","type":"uint256"},{"internalType":"uint256","name":"totalTokensStaked","type":"uint256"},{"internalType":"uint256","name":"creationBlock","type":"uint256"},{"internalType":"uint256","name":"perBlockNum","type":"uint256"},{"internalType":"uint256","name":"lockedUntilDate","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accERC20PerShare","type":"uint256"},{"internalType":"uint256","name":"stakeTimeLockSec","type":"uint256"},{"internalType":"bool","name":"isStakedNft","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"stakeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakedTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakers","outputs":[{"internalType":"uint256","name":"amountStaked","type":"uint256"},{"internalType":"uint256","name":"blockOriginallyStaked","type":"uint256"},{"internalType":"uint256","name":"timeOriginallyStaked","type":"uint256"},{"internalType":"uint256","name":"blockLastHarvested","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_shouldHarvest","type":"bool"}],"name":"unstakeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSupply","type":"uint256"}],"name":"updateSupply","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526005805460ff191690553480156200001b57600080fd5b5060405162002f7738038062002f778339810160408190526200003e9162000432565b8a518b908b9062000057906003906020850190620002ab565b5080516200006d906004906020840190620002ab565b505050600085118015620000815750888511155b620000f95760405162461bcd60e51b815260206004820152603960248201527f70657220626c6f636b20616d6f756e74206d757374206265206d6f726520746860448201527f616e203020616e64206c657373207468616e20737570706c790000000000000060648201526084015b60405180910390fd5b4284118062000106575083155b6200015f5760405162461bcd60e51b815260206004820152602260248201527f6c6f636b65642074696d65206d757374206265206166746572206e6f77206f72604482015261020360f41b6064820152608401620000f0565b60058054610100600160a81b0319166101006001600160a01b038b16021790558115620001a757600780546001600160a01b0319166001600160a01b038916179055620001c3565b600680546001600160a01b0319166001600160a01b0389161790555b6040805161018081018252338082526001600160a01b03988916602083018190529282018c9052606082018c905260006080830181905260a0830181905260c0830189905260e0830188905243610100840181905261012084018290526101408401889052951515610160909301839052600980546001600160a01b03199081169093179055600a80548316909417909355600b8c9055600c9b909b55600d829055600e829055600f969096556010949094556011919091556012929092556013556014805460ff191690921790915560088054909516911617909255506200057992505050565b828054620002b99062000526565b90600052602060002090601f016020900481019282620002dd576000855562000328565b82601f10620002f857805160ff191683800117855562000328565b8280016001018555821562000328579182015b82811115620003285782518255916020019190600101906200030b565b50620003369291506200033a565b5090565b5b808211156200033657600081556001016200033b565b80516001600160a01b03811681146200036957600080fd5b919050565b805180151581146200036957600080fd5b600082601f83011262000390578081fd5b81516001600160401b0380821115620003ad57620003ad62000563565b604051601f8301601f19908116603f01168101908282118183101715620003d857620003d862000563565b81604052838152602092508683858801011115620003f4578485fd5b8491505b83821015620004175785820183015181830184015290820190620003f8565b838211156200042857848385830101525b9695505050505050565b60008060008060008060008060008060006101608c8e03121562000454578687fd5b8b516001600160401b038111156200046a578788fd5b620004788e828f016200037f565b60208e0151909c5090506001600160401b0381111562000496578788fd5b620004a48e828f016200037f565b9a505060408c01519850620004bc60608d0162000351565b9750620004cc60808d0162000351565b9650620004dc60a08d0162000351565b955060c08c0151945060e08c015193506101008c01519250620005036101208d016200036e565b9150620005146101408d0162000351565b90509295989b509295989b9093969950565b600181811c908216806200053b57607f821691505b602082108114156200055d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6129ee80620005896000396000f3fe6080604052600436106101b75760003560e01c80639168ae72116100ec578063cadc6c591161008a578063e93793f611610064578063e93793f6146105c2578063efd703a7146105e5578063fd7db85414610612578063ff333a761461063257600080fd5b8063cadc6c5914610552578063dd62ed3e14610567578063e17c0f11146105ad57600080fd5b8063a3e67610116100c6578063a3e67610146104c0578063a457c2d7146104f2578063a9059cbb14610512578063b7f1ef1e1461053257600080fd5b80639168ae721461041f57806395d89b411461049157806396e231e9146104a657600080fd5b8063431a45321161015957806370a082311161013357806370a082311461039f5780637589cf2f146103d55780638bdfe956146103ea5780638db796561461040a57600080fd5b8063431a45321461034a5780634afcb5371461035f5780636bd080491461037f57600080fd5b806318160ddd1161019557806318160ddd146102cf57806323b872dd146102ee578063313ce5671461030e578063395093511461032a57600080fd5b806306fdde03146101bc578063095ea7b3146101e757806316f0115b14610217575b600080fd5b3480156101c857600080fd5b506101d1610647565b6040516101de9190612841565b60405180910390f35b3480156101f357600080fd5b5061020761020236600461269c565b6106d9565b60405190151581526020016101de565b34801561022357600080fd5b50600954600a54600b54600c54600d54600e54600f546010546011546012546013546014546102699b6001600160a01b039081169b169998979695949392919060ff168c565b604080516001600160a01b039d8e1681529c909b1660208d0152998b019890985260608a0196909652608089019490945260a088019290925260c087015260e08601526101008501526101208401526101408301521515610160820152610180016101de565b3480156102db57600080fd5b506002545b6040519081526020016101de565b3480156102fa57600080fd5b5061020761030936600461262b565b6106f1565b34801561031a57600080fd5b50604051601281526020016101de565b34801561033657600080fd5b5061020761034536600461269c565b610715565b61035d6103583660046126e1565b610754565b005b34801561036b57600080fd5b506102e061037a3660046125df565b6109ee565b34801561038b57600080fd5b5061035d61039a3660046126e1565b610b9f565b3480156103ab57600080fd5b506102e06103ba3660046125df565b6001600160a01b031660009081526020819052604090205490565b3480156103e157600080fd5b5061035d610c17565b3480156103f657600080fd5b506102e0610405366004612666565b610f6d565b34801561041657600080fd5b5061035d61113c565b34801561042b57600080fd5b5061046961043a3660046125df565b601560205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a0016101de565b34801561049d57600080fd5b506101d161126c565b3480156104b257600080fd5b506005546102079060ff1681565b3480156104cc57600080fd5b50600a546001600160a01b03165b6040516001600160a01b0390911681526020016101de565b3480156104fe57600080fd5b5061020761050d36600461269c565b61127b565b34801561051e57600080fd5b5061020761052d36600461269c565b61130d565b34801561053e57600080fd5b5061035d61054d366004612711565b61131b565b34801561055e57600080fd5b506010546102e0565b34801561057357600080fd5b506102e06105823660046125f9565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156105b957600080fd5b506102e06117b6565b3480156105ce57600080fd5b5060055461010090046001600160a01b03166104da565b3480156105f157600080fd5b506102e06106003660046125df565b60166020526000908152604090205481565b34801561061e57600080fd5b5061035d61062d3660046127dd565b6117f2565b34801561063e57600080fd5b506104da611bda565b60606003805461065690612951565b80601f016020809104026020016040519081016040528092919081815260200182805461068290612951565b80156106cf5780601f106106a4576101008083540402835291602001916106cf565b820191906000526020600020905b8154815290600101906020018083116106b257829003601f168201915b5050505050905090565b6000336106e7818585611c07565b5060019392505050565b6000336106ff858285611d2c565b61070a858585611dbe565b506001949350505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091906106e7908290869061074f9087906128b7565b611c07565b600f548110156107ab5760405162461bcd60e51b815260206004820152601960248201527f6d75737420616464203120626c6f636b206174206c656173740000000000000060448201526064015b60405180910390fd5b600854600f54604051631de66df760e21b81526001600160a01b0390921691637799b7dc9134916107e9918691600401918252602082015260400190565b6000604051808303818588803b15801561080257600080fd5b505af1158015610816573d6000803e3d6000fd5b50506005546040516370a0823160e01b8152306004820152600094506101009091046001600160a01b031692506370a08231915060240160206040518083038186803b15801561086557600080fd5b505afa158015610879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089d91906126f9565b6005546040516323b872dd60e01b815291925061010090046001600160a01b0316906323b872dd906108d79033903090879060040161281d565b602060405180830381600087803b1580156108f157600080fd5b505af1158015610905573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092991906126c5565b506005546040516370a0823160e01b8152306004820152829161010090046001600160a01b0316906370a082319060240160206040518083038186803b15801561097257600080fd5b505afa158015610986573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109aa91906126f9565b6109b4919061290e565b915081600960020160008282546109cb91906128b7565b9091555050600c80548391906000906109e59084906128b7565b90915550505050565b6001600160a01b0381166000908152601560209081526040808320815160c0810183528154815260018201548185015260028201548184015260038201546060820152600482015460808201526005820180548451818702810187019095528085528695929460a086019390929190830182828015610a8c57602002820191906000526020600020905b815481526020019060010190808311610a78575b5050505050815250509050438160600151101580610aac57506020810151155b80610ab75750600d54155b15610ac55750600092915050565b60125460115443118015610ada5750600d5415155b15610b5f576000610ae96117b6565b90506000814310610afa5781610afc565b435b601154909150600090610b10908390611f8c565b600f54909150600090610b24908390611f9f565b600d54909150610b5890610b5190610b4b846ec097ce7bc90715b34b9f1000000000611f9f565b90611fab565b8690611fb7565b9450505050505b610b978260800151610b916ec097ce7bc90715b34b9f1000000000610b4b858760000151611f9f90919063ffffffff16565b90611f8c565b949350505050565b6009546001600160a01b03163314610c0d5760405162461bcd60e51b815260206004820152602b60248201527f6f6e6c7920636f6e74726163742063726561746f722063616e2075706461746560448201526a2074686520737570706c7960a81b60648201526084016107a2565b600b819055600c55565b336000908152601560209081526040808320815160c0810183528154815260018201548185015260028201548184015260038201546060820152600482015460808201526005820180548451818702810187019095528085529194929360a0860193909290830182828015610cab57602002820191906000526020600020905b815481526020019060010190808311610c97575b5050505050815250509050610cbf33611fc3565b805180610d2c5760405162461bcd60e51b815260206004820152603560248201527f757365722063616e206f6e6c7920756e7374616b6520696620746865792068616044820152741d99481d1bdad95b9cc81a5b881d1a19481c1bdbdb605a1b60648201526084016107a2565b33600081815260208190526040902054610d6391905b8311610d4e5782611ff4565b33600090815260208190526040902054611ff4565b60145460ff1615610e2e5760005b8260a0015151811015610e285760075460a084015180516001600160a01b03909216916323b872dd91309133919086908110610dbd57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518463ffffffff1660e01b8152600401610de39392919061281d565b600060405180830381600087803b158015610dfd57600080fd5b505af1158015610e11573d6000803e3d6000fd5b505050508080610e209061298c565b915050610d71565b50610ece565b60065460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b158015610e7a57600080fd5b505af1158015610e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb291906126c5565b610ece5760405162461bcd60e51b81526004016107a290612874565b3360009081526015602052604081208181556001810182905560028101829055600381018290556004810182905590610f0a6005830182612589565b5050610f34816040518060400160405280600681526020016572656d6f766560d01b81525061213a565b60405181815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a25050565b6009546000906001600160a01b0316331480610f915750336001600160a01b038416145b6110155760405162461bcd60e51b815260206004820152604960248201527f63616e206f6e6c79206861727665737420746f6b656e7320666f7220736f6d6560448201527f6f6e6520656c73652069662074686973207761732074686520636f6e747261636064820152683a1031b932b0ba37b960b91b608482015260a4016107a2565b61101d612188565b6001600160a01b0383166000908152601560209081526040808320815160c0810183528154815260018201548185015260028201548184015260038201546060820152600482015460808201526005820180548451818702810187019095528085529194929360a08601939092908301828280156110ba57602002820191906000526020600020905b8154815260200190600101908083116110a6575b505050505081525050905060006110ef856110e76009600a01548560400151611fb790919063ffffffff16565b421015612220565b9050838015611101575060145460ff16155b8015611122575060065460055461010090046001600160a01b039081169116145b15610b97576060611133828261131b565b50949350505050565b600a546001600160a01b031633148061115f57506009546001600160a01b031633145b6111c65760405162461bcd60e51b815260206004820152603260248201527f6d757374206265206f776e6572206f72206d617374657220636f6e747261637460448201527120746f2072656d6f7665207265776172647360701b60648201526084016107a2565b600554600a54600c5460405163a9059cbb60e01b81526001600160a01b0392831660048201526024810191909152610100909204169063a9059cbb90604401602060405180830381600087803b15801561121f57600080fd5b505af1158015611233573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125791906126c5565b506000600c556005805460ff19166001179055565b60606004805461065690612951565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156113005760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016107a2565b61070a8286868403611c07565b6000336106e7818585611dbe565b436113246117b6565b1161138f5760405162461bcd60e51b815260206004820152603560248201527f74686973206661726d206973206578706972656420616e64206e6f206d6f7265604482015274081cdd185ad95c9cc818d85b881899481859191959605a1b60648201526084016107a2565b3360009081526015602052604090206113a6612188565b33600090815260208190526040902054156113d45760135460028201546113d29133916110e791611fb7565b505b60145460009060ff161561150757600083511161144c5760405162461bcd60e51b815260206004820152603060248201527f796f75206e65656420746f2070726f76696465204e465420746f6b656e20494460448201526f7320796f75277265207374616b696e6760801b60648201526084016107a2565b60005b83518110156114fe5760075484516001600160a01b03909116906323b872dd903390309088908690811061149357634e487b7160e01b600052603260045260246000fd5b60200260200101516040518463ffffffff1660e01b81526004016114b99392919061281d565b600060405180830381600087803b1580156114d357600080fd5b505af11580156114e7573d6000803e3d6000fd5b5050505080806114f69061298c565b91505061144f565b50508151611690565b6006546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561154b57600080fd5b505afa15801561155f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158391906126f9565b6006546040516323b872dd60e01b81529192506001600160a01b0316906323b872dd906115b890339030908a9060040161281d565b602060405180830381600087803b1580156115d257600080fd5b505af11580156115e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160a91906126c5565b506006546040516370a0823160e01b815230600482015261168c9183916001600160a01b03909116906370a082319060240160206040518083038186803b15801561165457600080fd5b505afa158015611668573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9191906126f9565b9150505b6002546116a15743600e8190556011555b6116ab3382612318565b81546116b79082611fb7565b808355436001840181905542600285015560038401556012546116ef916ec097ce7bc90715b34b9f100000000091610b4b9190611f9f565b600483015560005b8351811015611755578260050184828151811061172457634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825460018101845560009384529190922001558061174d8161298c565b9150506116f7565b5061177b816040518060400160405280600381526020016218591960ea1b81525061213a565b60405181815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a250505050565b600e546000908190156117cb57600e546117cd565b435b600f54600b549192506117ec9183916117e69190611fab565b90611fb7565b91505090565b336000908152601560205260409020805460145460ff166118165780841115611819565b60015b61188b5760405162461bcd60e51b815260206004820152603f60248201527f757365722063616e206f6e6c7920756e7374616b6520616d6f756e742074686560448201527f7920686176652063757272656e746c79207374616b6564206f72206c6573730060648201526084016107a2565b8215806118a8575060135460028301546118a491611fb7565b4210155b806118b5575060055460ff165b806118c657506118c36117b6565b43115b61194a5760405162461bcd60e51b815260206004820152604960248201527f796f752068617665206e6f74207374616b656420666f72206d696e696d756d2060448201527f74696d65206c6f636b2079657420616e642074686520706f6f6c206973206e6f6064820152681d08195e1c1a5c995960ba1b608482015260a4016107a2565b611952612188565b821561196957611963336001612220565b50611972565b61197233611fc3565b60145460009060ff166119855784611987565b815b336000818152602081905260409020549192506119a391610d42565b60145460ff1615611a6f5760005b6005840154811015611a69576007546005850180546001600160a01b03909216916323b872dd913091339190869081106119fb57634e487b7160e01b600052603260045260246000fd5b90600052602060002001546040518463ffffffff1660e01b8152600401611a249392919061281d565b600060405180830381600087803b158015611a3e57600080fd5b505af1158015611a52573d6000803e3d6000fd5b505050508080611a619061298c565b9150506119b1565b50611b0f565b60065460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b158015611abb57600080fd5b505af1158015611acf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af391906126c5565b611b0f5760405162461bcd60e51b81526004016107a290612874565b3360009081526020819052604081205411611b67573360009081526015602052604081208181556001810182905560028101829055600381018290556004810182905590611b606005830182612589565b5050611b76565b8254611b739082611f8c565b83555b611b9e816040518060400160405280600681526020016572656d6f766560d01b81525061213a565b60405181815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a25050505050565b60145460009060ff16611bf757506006546001600160a01b031690565b506007546001600160a01b031690565b6001600160a01b038316611c695760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016107a2565b6001600160a01b038216611cca5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016107a2565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114611db85781811015611dab5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016107a2565b611db88484848403611c07565b50505050565b6001600160a01b038316611e225760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016107a2565b6001600160a01b038216611e845760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016107a2565b6001600160a01b03831660009081526020819052604090205481811015611efc5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016107a2565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611f339084906128b7565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611f7f91815260200190565b60405180910390a3611db8565b6000611f98828461290e565b9392505050565b6000611f9882846128ef565b6000611f9882846128cf565b6000611f9882846128b7565b6001600160a01b03811660009081526016602052604081208054919055600c54611fed9082611fb7565b600c555050565b6001600160a01b0382166120545760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016107a2565b6001600160a01b038216600090815260208190526040902054818110156120c85760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016107a2565b6001600160a01b03831660009081526020819052604081208383039055600280548492906120f790849061290e565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611d1f565b612162816040518060400160405280600681526020016572656d6f766560d01b8152506123f7565b1561217b57600d546121749083611f8c565b600d555050565b600d546121749083611fb7565b60006121926117b6565b905060008143106121a357816121a5565b435b60115490915081116121b5575050565b600d54806121c4575060115550565b6011546000906121d5908490611f8c565b600f549091506000906121e9908390611f9f565b905061221461220b84610b4b846ec097ce7bc90715b34b9f1000000000611f9f565b60125490611fb7565b60125550505060115550565b6001600160a01b038216600090815260156020526040812060018101546122895760405162461bcd60e51b815260206004820152601c60248201527f75736572206d757374206861766520746f6b656e73207374616b65640000000060448201526064016107a2565b6000612294856109ee565b905080156122df5783156122b1576122ac8582612450565b6122df565b6001600160a01b038516600090815260166020526040812080548392906122d99084906128b7565b90915550505b6012548254612302916ec097ce7bc90715b34b9f100000000091610b4b91611f9f565b6004830155436003909201919091559392505050565b6001600160a01b03821661236e5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016107a2565b806002600082825461238091906128b7565b90915550506001600160a01b038216600090815260208190526040812080548392906123ad9084906128b7565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60008160405160200161240a9190612801565b60405160208183030381529060405280519060200120836040516020016124319190612801565b6040516020818303038152906040528051906020012014905092915050565b6001600160a01b03821660009081526016602052604081205461247390836128b7565b6001600160a01b0384811660008181526016602052604080822091909155600554905163a9059cbb60e01b8152600481019290925260248201849052929350610100909204169063a9059cbb90604401602060405180830381600087803b1580156124dd57600080fd5b505af11580156124f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251591906126c5565b6125745760405162461bcd60e51b815260206004820152602a60248201527f756e61626c6520746f2073656e6420757365722074686569722068617276657360448201526974656420746f6b656e7360b01b60648201526084016107a2565b600c546125819082611f8c565b600c55505050565b50805460008255906000526020600020908101906125a791906125aa565b50565b5b808211156125bf57600081556001016125ab565b5090565b80356001600160a01b03811681146125da57600080fd5b919050565b6000602082840312156125f0578081fd5b611f98826125c3565b6000806040838503121561260b578081fd5b612614836125c3565b9150612622602084016125c3565b90509250929050565b60008060006060848603121561263f578081fd5b612648846125c3565b9250612656602085016125c3565b9150604084013590509250925092565b60008060408385031215612678578182fd5b612681836125c3565b91506020830135612691816129d3565b809150509250929050565b600080604083850312156126ae578182fd5b6126b7836125c3565b946020939093013593505050565b6000602082840312156126d6578081fd5b8151611f98816129d3565b6000602082840312156126f2578081fd5b5035919050565b60006020828403121561270a578081fd5b5051919050565b60008060408385031215612723578182fd5b8235915060208084013567ffffffffffffffff80821115612742578384fd5b818601915086601f830112612755578384fd5b813581811115612767576127676129bd565b8060051b604051601f19603f8301168101818110858211171561278c5761278c6129bd565b604052828152858101935084860182860187018b10156127aa578788fd5b8795505b838610156127cc5780358552600195909501949386019386016127ae565b508096505050505050509250929050565b600080604083850312156127ef578182fd5b823591506020830135612691816129d3565b60008251612813818460208701612925565b9190910192915050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6020815260008251806020840152612860816040850160208701612925565b601f01601f19169190910160400192915050565b60208082526023908201527f756e61626c6520746f2073656e642075736572206f726967696e616c20746f6b604082015262656e7360e81b606082015260800190565b600082198211156128ca576128ca6129a7565b500190565b6000826128ea57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612909576129096129a7565b500290565b600082821015612920576129206129a7565b500390565b60005b83811015612940578181015183820152602001612928565b83811115611db85750506000910152565b600181811c9082168061296557607f821691505b6020821081141561298657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156129a0576129a06129a7565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b80151581146125a757600080fdfea164736f6c6343000804000a000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000002fa54641bae8aaa000000000000000000000000000009333d3983d8af4f233f9b185ea4567bedfaf26ad0000000000000000000000009333d3983d8af4f233f9b185ea4567bedfaf26ad000000000000000000000000b6d5b241192e1798bb7401a450c793e681c2280000000000000000000000000000000000000000000000000002a8f1c1372d88470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076a70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fdf48d78477b33f9e4c3de773f12be0e4eebddb00000000000000000000000000000000000000000000000000000000000000124f4b4c47205374616b696e6720546f6b656e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005734f4b4c47000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101b75760003560e01c80639168ae72116100ec578063cadc6c591161008a578063e93793f611610064578063e93793f6146105c2578063efd703a7146105e5578063fd7db85414610612578063ff333a761461063257600080fd5b8063cadc6c5914610552578063dd62ed3e14610567578063e17c0f11146105ad57600080fd5b8063a3e67610116100c6578063a3e67610146104c0578063a457c2d7146104f2578063a9059cbb14610512578063b7f1ef1e1461053257600080fd5b80639168ae721461041f57806395d89b411461049157806396e231e9146104a657600080fd5b8063431a45321161015957806370a082311161013357806370a082311461039f5780637589cf2f146103d55780638bdfe956146103ea5780638db796561461040a57600080fd5b8063431a45321461034a5780634afcb5371461035f5780636bd080491461037f57600080fd5b806318160ddd1161019557806318160ddd146102cf57806323b872dd146102ee578063313ce5671461030e578063395093511461032a57600080fd5b806306fdde03146101bc578063095ea7b3146101e757806316f0115b14610217575b600080fd5b3480156101c857600080fd5b506101d1610647565b6040516101de9190612841565b60405180910390f35b3480156101f357600080fd5b5061020761020236600461269c565b6106d9565b60405190151581526020016101de565b34801561022357600080fd5b50600954600a54600b54600c54600d54600e54600f546010546011546012546013546014546102699b6001600160a01b039081169b169998979695949392919060ff168c565b604080516001600160a01b039d8e1681529c909b1660208d0152998b019890985260608a0196909652608089019490945260a088019290925260c087015260e08601526101008501526101208401526101408301521515610160820152610180016101de565b3480156102db57600080fd5b506002545b6040519081526020016101de565b3480156102fa57600080fd5b5061020761030936600461262b565b6106f1565b34801561031a57600080fd5b50604051601281526020016101de565b34801561033657600080fd5b5061020761034536600461269c565b610715565b61035d6103583660046126e1565b610754565b005b34801561036b57600080fd5b506102e061037a3660046125df565b6109ee565b34801561038b57600080fd5b5061035d61039a3660046126e1565b610b9f565b3480156103ab57600080fd5b506102e06103ba3660046125df565b6001600160a01b031660009081526020819052604090205490565b3480156103e157600080fd5b5061035d610c17565b3480156103f657600080fd5b506102e0610405366004612666565b610f6d565b34801561041657600080fd5b5061035d61113c565b34801561042b57600080fd5b5061046961043a3660046125df565b601560205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a0016101de565b34801561049d57600080fd5b506101d161126c565b3480156104b257600080fd5b506005546102079060ff1681565b3480156104cc57600080fd5b50600a546001600160a01b03165b6040516001600160a01b0390911681526020016101de565b3480156104fe57600080fd5b5061020761050d36600461269c565b61127b565b34801561051e57600080fd5b5061020761052d36600461269c565b61130d565b34801561053e57600080fd5b5061035d61054d366004612711565b61131b565b34801561055e57600080fd5b506010546102e0565b34801561057357600080fd5b506102e06105823660046125f9565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156105b957600080fd5b506102e06117b6565b3480156105ce57600080fd5b5060055461010090046001600160a01b03166104da565b3480156105f157600080fd5b506102e06106003660046125df565b60166020526000908152604090205481565b34801561061e57600080fd5b5061035d61062d3660046127dd565b6117f2565b34801561063e57600080fd5b506104da611bda565b60606003805461065690612951565b80601f016020809104026020016040519081016040528092919081815260200182805461068290612951565b80156106cf5780601f106106a4576101008083540402835291602001916106cf565b820191906000526020600020905b8154815290600101906020018083116106b257829003601f168201915b5050505050905090565b6000336106e7818585611c07565b5060019392505050565b6000336106ff858285611d2c565b61070a858585611dbe565b506001949350505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091906106e7908290869061074f9087906128b7565b611c07565b600f548110156107ab5760405162461bcd60e51b815260206004820152601960248201527f6d75737420616464203120626c6f636b206174206c656173740000000000000060448201526064015b60405180910390fd5b600854600f54604051631de66df760e21b81526001600160a01b0390921691637799b7dc9134916107e9918691600401918252602082015260400190565b6000604051808303818588803b15801561080257600080fd5b505af1158015610816573d6000803e3d6000fd5b50506005546040516370a0823160e01b8152306004820152600094506101009091046001600160a01b031692506370a08231915060240160206040518083038186803b15801561086557600080fd5b505afa158015610879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089d91906126f9565b6005546040516323b872dd60e01b815291925061010090046001600160a01b0316906323b872dd906108d79033903090879060040161281d565b602060405180830381600087803b1580156108f157600080fd5b505af1158015610905573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092991906126c5565b506005546040516370a0823160e01b8152306004820152829161010090046001600160a01b0316906370a082319060240160206040518083038186803b15801561097257600080fd5b505afa158015610986573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109aa91906126f9565b6109b4919061290e565b915081600960020160008282546109cb91906128b7565b9091555050600c80548391906000906109e59084906128b7565b90915550505050565b6001600160a01b0381166000908152601560209081526040808320815160c0810183528154815260018201548185015260028201548184015260038201546060820152600482015460808201526005820180548451818702810187019095528085528695929460a086019390929190830182828015610a8c57602002820191906000526020600020905b815481526020019060010190808311610a78575b5050505050815250509050438160600151101580610aac57506020810151155b80610ab75750600d54155b15610ac55750600092915050565b60125460115443118015610ada5750600d5415155b15610b5f576000610ae96117b6565b90506000814310610afa5781610afc565b435b601154909150600090610b10908390611f8c565b600f54909150600090610b24908390611f9f565b600d54909150610b5890610b5190610b4b846ec097ce7bc90715b34b9f1000000000611f9f565b90611fab565b8690611fb7565b9450505050505b610b978260800151610b916ec097ce7bc90715b34b9f1000000000610b4b858760000151611f9f90919063ffffffff16565b90611f8c565b949350505050565b6009546001600160a01b03163314610c0d5760405162461bcd60e51b815260206004820152602b60248201527f6f6e6c7920636f6e74726163742063726561746f722063616e2075706461746560448201526a2074686520737570706c7960a81b60648201526084016107a2565b600b819055600c55565b336000908152601560209081526040808320815160c0810183528154815260018201548185015260028201548184015260038201546060820152600482015460808201526005820180548451818702810187019095528085529194929360a0860193909290830182828015610cab57602002820191906000526020600020905b815481526020019060010190808311610c97575b5050505050815250509050610cbf33611fc3565b805180610d2c5760405162461bcd60e51b815260206004820152603560248201527f757365722063616e206f6e6c7920756e7374616b6520696620746865792068616044820152741d99481d1bdad95b9cc81a5b881d1a19481c1bdbdb605a1b60648201526084016107a2565b33600081815260208190526040902054610d6391905b8311610d4e5782611ff4565b33600090815260208190526040902054611ff4565b60145460ff1615610e2e5760005b8260a0015151811015610e285760075460a084015180516001600160a01b03909216916323b872dd91309133919086908110610dbd57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518463ffffffff1660e01b8152600401610de39392919061281d565b600060405180830381600087803b158015610dfd57600080fd5b505af1158015610e11573d6000803e3d6000fd5b505050508080610e209061298c565b915050610d71565b50610ece565b60065460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b158015610e7a57600080fd5b505af1158015610e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb291906126c5565b610ece5760405162461bcd60e51b81526004016107a290612874565b3360009081526015602052604081208181556001810182905560028101829055600381018290556004810182905590610f0a6005830182612589565b5050610f34816040518060400160405280600681526020016572656d6f766560d01b81525061213a565b60405181815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a25050565b6009546000906001600160a01b0316331480610f915750336001600160a01b038416145b6110155760405162461bcd60e51b815260206004820152604960248201527f63616e206f6e6c79206861727665737420746f6b656e7320666f7220736f6d6560448201527f6f6e6520656c73652069662074686973207761732074686520636f6e747261636064820152683a1031b932b0ba37b960b91b608482015260a4016107a2565b61101d612188565b6001600160a01b0383166000908152601560209081526040808320815160c0810183528154815260018201548185015260028201548184015260038201546060820152600482015460808201526005820180548451818702810187019095528085529194929360a08601939092908301828280156110ba57602002820191906000526020600020905b8154815260200190600101908083116110a6575b505050505081525050905060006110ef856110e76009600a01548560400151611fb790919063ffffffff16565b421015612220565b9050838015611101575060145460ff16155b8015611122575060065460055461010090046001600160a01b039081169116145b15610b97576060611133828261131b565b50949350505050565b600a546001600160a01b031633148061115f57506009546001600160a01b031633145b6111c65760405162461bcd60e51b815260206004820152603260248201527f6d757374206265206f776e6572206f72206d617374657220636f6e747261637460448201527120746f2072656d6f7665207265776172647360701b60648201526084016107a2565b600554600a54600c5460405163a9059cbb60e01b81526001600160a01b0392831660048201526024810191909152610100909204169063a9059cbb90604401602060405180830381600087803b15801561121f57600080fd5b505af1158015611233573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125791906126c5565b506000600c556005805460ff19166001179055565b60606004805461065690612951565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156113005760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016107a2565b61070a8286868403611c07565b6000336106e7818585611dbe565b436113246117b6565b1161138f5760405162461bcd60e51b815260206004820152603560248201527f74686973206661726d206973206578706972656420616e64206e6f206d6f7265604482015274081cdd185ad95c9cc818d85b881899481859191959605a1b60648201526084016107a2565b3360009081526015602052604090206113a6612188565b33600090815260208190526040902054156113d45760135460028201546113d29133916110e791611fb7565b505b60145460009060ff161561150757600083511161144c5760405162461bcd60e51b815260206004820152603060248201527f796f75206e65656420746f2070726f76696465204e465420746f6b656e20494460448201526f7320796f75277265207374616b696e6760801b60648201526084016107a2565b60005b83518110156114fe5760075484516001600160a01b03909116906323b872dd903390309088908690811061149357634e487b7160e01b600052603260045260246000fd5b60200260200101516040518463ffffffff1660e01b81526004016114b99392919061281d565b600060405180830381600087803b1580156114d357600080fd5b505af11580156114e7573d6000803e3d6000fd5b5050505080806114f69061298c565b91505061144f565b50508151611690565b6006546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561154b57600080fd5b505afa15801561155f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158391906126f9565b6006546040516323b872dd60e01b81529192506001600160a01b0316906323b872dd906115b890339030908a9060040161281d565b602060405180830381600087803b1580156115d257600080fd5b505af11580156115e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160a91906126c5565b506006546040516370a0823160e01b815230600482015261168c9183916001600160a01b03909116906370a082319060240160206040518083038186803b15801561165457600080fd5b505afa158015611668573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9191906126f9565b9150505b6002546116a15743600e8190556011555b6116ab3382612318565b81546116b79082611fb7565b808355436001840181905542600285015560038401556012546116ef916ec097ce7bc90715b34b9f100000000091610b4b9190611f9f565b600483015560005b8351811015611755578260050184828151811061172457634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825460018101845560009384529190922001558061174d8161298c565b9150506116f7565b5061177b816040518060400160405280600381526020016218591960ea1b81525061213a565b60405181815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a250505050565b600e546000908190156117cb57600e546117cd565b435b600f54600b549192506117ec9183916117e69190611fab565b90611fb7565b91505090565b336000908152601560205260409020805460145460ff166118165780841115611819565b60015b61188b5760405162461bcd60e51b815260206004820152603f60248201527f757365722063616e206f6e6c7920756e7374616b6520616d6f756e742074686560448201527f7920686176652063757272656e746c79207374616b6564206f72206c6573730060648201526084016107a2565b8215806118a8575060135460028301546118a491611fb7565b4210155b806118b5575060055460ff165b806118c657506118c36117b6565b43115b61194a5760405162461bcd60e51b815260206004820152604960248201527f796f752068617665206e6f74207374616b656420666f72206d696e696d756d2060448201527f74696d65206c6f636b2079657420616e642074686520706f6f6c206973206e6f6064820152681d08195e1c1a5c995960ba1b608482015260a4016107a2565b611952612188565b821561196957611963336001612220565b50611972565b61197233611fc3565b60145460009060ff166119855784611987565b815b336000818152602081905260409020549192506119a391610d42565b60145460ff1615611a6f5760005b6005840154811015611a69576007546005850180546001600160a01b03909216916323b872dd913091339190869081106119fb57634e487b7160e01b600052603260045260246000fd5b90600052602060002001546040518463ffffffff1660e01b8152600401611a249392919061281d565b600060405180830381600087803b158015611a3e57600080fd5b505af1158015611a52573d6000803e3d6000fd5b505050508080611a619061298c565b9150506119b1565b50611b0f565b60065460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b158015611abb57600080fd5b505af1158015611acf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af391906126c5565b611b0f5760405162461bcd60e51b81526004016107a290612874565b3360009081526020819052604081205411611b67573360009081526015602052604081208181556001810182905560028101829055600381018290556004810182905590611b606005830182612589565b5050611b76565b8254611b739082611f8c565b83555b611b9e816040518060400160405280600681526020016572656d6f766560d01b81525061213a565b60405181815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a25050505050565b60145460009060ff16611bf757506006546001600160a01b031690565b506007546001600160a01b031690565b6001600160a01b038316611c695760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016107a2565b6001600160a01b038216611cca5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016107a2565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114611db85781811015611dab5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016107a2565b611db88484848403611c07565b50505050565b6001600160a01b038316611e225760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016107a2565b6001600160a01b038216611e845760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016107a2565b6001600160a01b03831660009081526020819052604090205481811015611efc5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016107a2565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611f339084906128b7565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611f7f91815260200190565b60405180910390a3611db8565b6000611f98828461290e565b9392505050565b6000611f9882846128ef565b6000611f9882846128cf565b6000611f9882846128b7565b6001600160a01b03811660009081526016602052604081208054919055600c54611fed9082611fb7565b600c555050565b6001600160a01b0382166120545760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016107a2565b6001600160a01b038216600090815260208190526040902054818110156120c85760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016107a2565b6001600160a01b03831660009081526020819052604081208383039055600280548492906120f790849061290e565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611d1f565b612162816040518060400160405280600681526020016572656d6f766560d01b8152506123f7565b1561217b57600d546121749083611f8c565b600d555050565b600d546121749083611fb7565b60006121926117b6565b905060008143106121a357816121a5565b435b60115490915081116121b5575050565b600d54806121c4575060115550565b6011546000906121d5908490611f8c565b600f549091506000906121e9908390611f9f565b905061221461220b84610b4b846ec097ce7bc90715b34b9f1000000000611f9f565b60125490611fb7565b60125550505060115550565b6001600160a01b038216600090815260156020526040812060018101546122895760405162461bcd60e51b815260206004820152601c60248201527f75736572206d757374206861766520746f6b656e73207374616b65640000000060448201526064016107a2565b6000612294856109ee565b905080156122df5783156122b1576122ac8582612450565b6122df565b6001600160a01b038516600090815260166020526040812080548392906122d99084906128b7565b90915550505b6012548254612302916ec097ce7bc90715b34b9f100000000091610b4b91611f9f565b6004830155436003909201919091559392505050565b6001600160a01b03821661236e5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016107a2565b806002600082825461238091906128b7565b90915550506001600160a01b038216600090815260208190526040812080548392906123ad9084906128b7565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60008160405160200161240a9190612801565b60405160208183030381529060405280519060200120836040516020016124319190612801565b6040516020818303038152906040528051906020012014905092915050565b6001600160a01b03821660009081526016602052604081205461247390836128b7565b6001600160a01b0384811660008181526016602052604080822091909155600554905163a9059cbb60e01b8152600481019290925260248201849052929350610100909204169063a9059cbb90604401602060405180830381600087803b1580156124dd57600080fd5b505af11580156124f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251591906126c5565b6125745760405162461bcd60e51b815260206004820152602a60248201527f756e61626c6520746f2073656e6420757365722074686569722068617276657360448201526974656420746f6b656e7360b01b60648201526084016107a2565b600c546125819082611f8c565b600c55505050565b50805460008255906000526020600020908101906125a791906125aa565b50565b5b808211156125bf57600081556001016125ab565b5090565b80356001600160a01b03811681146125da57600080fd5b919050565b6000602082840312156125f0578081fd5b611f98826125c3565b6000806040838503121561260b578081fd5b612614836125c3565b9150612622602084016125c3565b90509250929050565b60008060006060848603121561263f578081fd5b612648846125c3565b9250612656602085016125c3565b9150604084013590509250925092565b60008060408385031215612678578182fd5b612681836125c3565b91506020830135612691816129d3565b809150509250929050565b600080604083850312156126ae578182fd5b6126b7836125c3565b946020939093013593505050565b6000602082840312156126d6578081fd5b8151611f98816129d3565b6000602082840312156126f2578081fd5b5035919050565b60006020828403121561270a578081fd5b5051919050565b60008060408385031215612723578182fd5b8235915060208084013567ffffffffffffffff80821115612742578384fd5b818601915086601f830112612755578384fd5b813581811115612767576127676129bd565b8060051b604051601f19603f8301168101818110858211171561278c5761278c6129bd565b604052828152858101935084860182860187018b10156127aa578788fd5b8795505b838610156127cc5780358552600195909501949386019386016127ae565b508096505050505050509250929050565b600080604083850312156127ef578182fd5b823591506020830135612691816129d3565b60008251612813818460208701612925565b9190910192915050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6020815260008251806020840152612860816040850160208701612925565b601f01601f19169190910160400192915050565b60208082526023908201527f756e61626c6520746f2073656e642075736572206f726967696e616c20746f6b604082015262656e7360e81b606082015260800190565b600082198211156128ca576128ca6129a7565b500190565b6000826128ea57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612909576129096129a7565b500290565b600082821015612920576129206129a7565b500390565b60005b83811015612940578181015183820152602001612928565b83811115611db85750506000910152565b600181811c9082168061296557607f821691505b6020821081141561298657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156129a0576129a06129a7565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b80151581146125a757600080fdfea164736f6c6343000804000a

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

000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000002fa54641bae8aaa000000000000000000000000000009333d3983d8af4f233f9b185ea4567bedfaf26ad0000000000000000000000009333d3983d8af4f233f9b185ea4567bedfaf26ad000000000000000000000000b6d5b241192e1798bb7401a450c793e681c2280000000000000000000000000000000000000000000000000002a8f1c1372d88470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076a70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fdf48d78477b33f9e4c3de773f12be0e4eebddb00000000000000000000000000000000000000000000000000000000000000124f4b4c47205374616b696e6720546f6b656e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005734f4b4c47000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): OKLG Staking Token
Arg [1] : _symbol (string): sOKLG
Arg [2] : _rewardSupply (uint256): 225000000000000000000000
Arg [3] : _rewardsTokenAddy (address): 0x9333D3983d8AF4f233F9B185ea4567bEDfAF26AD
Arg [4] : _stakedTokenAddy (address): 0x9333D3983d8AF4f233F9B185ea4567bEDfAF26AD
Arg [5] : _originalTokenOwner (address): 0xB6D5B241192e1798bB7401a450C793E681C22800
Arg [6] : _perBlockAmount (uint256): 191668796319959111
Arg [7] : _lockedUntilDate (uint256): 0
Arg [8] : _stakeTimeLockSec (uint256): 7776000
Arg [9] : _isStakedNft (bool): False
Arg [10] : _pricingContract (address): 0x1FdF48d78477B33f9E4C3dE773f12BE0e4EeBddb

-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [1] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [2] : 000000000000000000000000000000000000000000002fa54641bae8aaa00000
Arg [3] : 0000000000000000000000009333d3983d8af4f233f9b185ea4567bedfaf26ad
Arg [4] : 0000000000000000000000009333d3983d8af4f233f9b185ea4567bedfaf26ad
Arg [5] : 000000000000000000000000b6d5b241192e1798bb7401a450c793e681c22800
Arg [6] : 00000000000000000000000000000000000000000000000002a8f1c1372d8847
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000076a700
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000001fdf48d78477b33f9e4c3de773f12be0e4eebddb
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [12] : 4f4b4c47205374616b696e6720546f6b656e0000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [14] : 734f4b4c47000000000000000000000000000000000000000000000000000000


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.