Contract 0x222dc5cbc4d5082ac181532c01a57cc897ea4f15

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x28516b9f45de2369cc3999cfab73a6fc608464d6fb896e097bc2566dcd3649b7Claim Rewards118093412021-10-16 1:32:3413 hrs 42 mins ago0xf11ca721d0a002ca649dcb856ac9b76ffff76f4c IN  0x222dc5cbc4d5082ac181532c01a57cc897ea4f150 BNB0.00044417
0x323843e46fbe539717027ceb54c68f8c06f0985034a67111ff44d8128cdec78dDeposit118027072021-10-15 19:58:2019 hrs 16 mins ago0x1084e64fb76096d81c9e57fa58d49a68b29c9ff2 IN  0x222dc5cbc4d5082ac181532c01a57cc897ea4f150 BNB0.000567815
0x54a6e991767b6d5a3bbd424205a53f626ae07daee611fb617c05473547c404f9Claim Rewards117987672021-10-15 16:41:1422 hrs 33 mins ago0xb7a13313082b43fd6a3f33a667dfb3bb1d0d6b91 IN  0x222dc5cbc4d5082ac181532c01a57cc897ea4f150 BNB0.00036917
0xa2329627d1151f3990dffce69c710db92906c20f77198a5a68638cd7874344a2Deposit117841982021-10-15 4:30:231 day 10 hrs ago0x54132b66fef4d8109011ddbd540ac3f4f569c510 IN  0x222dc5cbc4d5082ac181532c01a57cc897ea4f150 BNB0.000567815
0x9833076debcf3ab0b3e15891d762581932f7efed14ae0312cf4b124ed5b89fa7Withdraw117785192021-10-14 23:46:151 day 15 hrs ago0x9a7c690c595b98309b2c42dc07f670c39ca62d1b IN  0x222dc5cbc4d5082ac181532c01a57cc897ea4f150 BNB0.0003000177
0x91b6fb7bd3dfd6c43a4d53ec6cd88a6759830050ed4e87f10f59facd21dcf637Claim Rewards117785092021-10-14 23:45:451 day 15 hrs ago0x9a7c690c595b98309b2c42dc07f670c39ca62d1b IN  0x222dc5cbc4d5082ac181532c01a57cc897ea4f150 BNB0.0003765534
0x5eb574f31c9dd0894fba26178a6804b1850a934a18cc6f134ab8d75bcbbf6905Claim Rewards117759372021-10-14 21:37:081 day 17 hrs ago0x239432ee8d4654e137e0d502e332ef4b69c93030 IN  0x222dc5cbc4d5082ac181532c01a57cc897ea4f150 BNB0.00036917
0xc213eadb45f3bd93600148e6bb29d0e2c220c2dab527e18ac33c8b1aacac861aWithdraw117702142021-10-14 16:50:571 day 22 hrs ago0xed5731cb71b7bb524c17e13cebf46624993b09f4 IN  0x222dc5cbc4d5082ac181532c01a57cc897ea4f150 BNB0.000294135
0x88ee911e2b0b8511529e2b7f013f7422c505687729aaa65420f25354aa7d6e79Claim Rewards117701162021-10-14 16:46:031 day 22 hrs ago0xed5731cb71b7bb524c17e13cebf46624993b09f4 IN  0x222dc5cbc4d5082ac181532c01a57cc897ea4f150 BNB0.00036917
0xa92a82c0e20b6d0d3f792c21d82c13b0fe088b5923f69987f26ceda3d32de21eClaim Rewards117667252021-10-14 13:55:342 days 1 hr ago0x80e2d53f91d659c2019764323ae57fef98261d8c IN  0x222dc5cbc4d5082ac181532c01a57cc897ea4f150 BNB0.00044417
0x6eb85fe7b489670f41b84bc21eb9b0c2fc9e96a9c284a8d8c4186d288728a97cDeposit117532362021-10-14 2:37:262 days 12 hrs ago0x625e01543ec89607da125825222a5a6decfceb1a IN  0x222dc5cbc4d5082ac181532c01a57cc897ea4f150 BNB0.000442845
0x870823fa84c8e2f9a9d99fdc359113b033fb5e7db72dfda6d6cc1f88eabe05f2Claim Rewards117486682021-10-13 22:45:432 days 16 hrs ago0x6383acb18c3eec56ca36e6dd3d97ba6b1e45e64c IN  0x222dc5cbc4d5082ac181532c01a57cc897ea4f150 BNB0.00044417
0xbaf56f1bbfcf4a03a5b4da601b548d59b8b3a5bf88e7e9734456458719a7e17eWithdraw117463732021-10-13 20:50:582 days 18 hrs ago0x886c38339b6256d672fca3b0e55feb792bf4565d IN  0x222dc5cbc4d5082ac181532c01a57cc897ea4f150 BNB0.000294135
0x123961998c3a4215917fcbb858093483773f9a3928f749b8f0a9a468833597dfClaim Rewards117463622021-10-13 20:50:252 days 18 hrs ago0x886c38339b6256d672fca3b0e55feb792bf4565d IN  0x222dc5cbc4d5082ac181532c01a57cc897ea4f150 BNB0.00044417
0xa43a7a8c8814fe9ae05347c7eeb821b37104025381dbda06f14cfa899e57089cClaim Rewards117321692021-10-13 8:52:263 days 6 hrs ago0x72d845abb49a22dcfeca61c33892d87d0af5615c IN  0x222dc5cbc4d5082ac181532c01a57cc897ea4f150 BNB0.00036917
0x5a68940b71579e7468301192023edc23d1940c1124217b510c8194de264c4bc3Deposit117182012021-10-12 20:56:543 days 18 hrs ago0x70eb0915474806164a0fe4bf0d9f29a5f50dfebb IN  0x222dc5cbc4d5082ac181532c01a57cc897ea4f150 BNB0.000567695
0xc9dc6a681448f3988b7ca59760b5667af6bfb8757a7944ee0e980a5f9ec1a02cClaim Rewards117180652021-10-12 20:50:063 days 18 hrs ago0x19d98e2d6735bd488f5e77da9d0b05d516c2f1de IN  0x222dc5cbc4d5082ac181532c01a57cc897ea4f150 BNB0.00036917
0x331347976159b14266e4f2b63b0091d3e7f4104247c33a7b5021dca248108fa6Claim Rewards117117282021-10-12 15:31:253 days 23 hrs ago0x25a1a876e1d277c0d8dd42b8b9f0e74fc8bb35fe IN  0x222dc5cbc4d5082ac181532c01a57cc897ea4f150 BNB0.00044417
0xd88584536ba3b653d87dcf5868dd0712701afb19caa37ede76c3440e667b9e14Deposit116931672021-10-11 23:57:584 days 15 hrs ago0x625e01543ec89607da125825222a5a6decfceb1a IN  0x222dc5cbc4d5082ac181532c01a57cc897ea4f150 BNB0.000421785
0x4d651f5cceec445ad25544b4fc8e294964aff5cd3785827d0b53cfc600a2ad9eDeposit116898232021-10-11 21:09:424 days 18 hrs ago0x7e4d3712f3b0a6b9f3b051b686129a957bf70179 IN  0x222dc5cbc4d5082ac181532c01a57cc897ea4f150 BNB0.000346845
0x05f5447bf5142ca2df59aae2db05708051546dcc6f00bae4ec5eaba71c920698Withdraw116872682021-10-11 19:00:004 days 20 hrs ago0x97fa1cb7893ddff62bb68593b283aa56a636c0de IN  0x222dc5cbc4d5082ac181532c01a57cc897ea4f150 BNB0.000294135
0xa68a4951569a7a737aa3657fcda6a25522c3b2d717ec9fc4004987942b46e921Claim Rewards116865862021-10-11 18:18:224 days 20 hrs ago0x2c2ae257105c1cd5b3c1bd271f90ac10cd5788d7 IN  0x222dc5cbc4d5082ac181532c01a57cc897ea4f150 BNB0.00036917
0x97c08de4aef9093c1400fbced491e59a6ad6955ab262b341cb9508cd0b0eb672Deposit116851452021-10-11 16:48:384 days 22 hrs ago0x7e4d3712f3b0a6b9f3b051b686129a957bf70179 IN  0x222dc5cbc4d5082ac181532c01a57cc897ea4f150 BNB0.000442845
0x5a83fbb6ea0ffa25a023044655307c35cf44bde6c519c9f17f1d576269cf5f17Claim Rewards116820542021-10-11 14:01:515 days 1 hr ago0x97fa1cb7893ddff62bb68593b283aa56a636c0de IN  0x222dc5cbc4d5082ac181532c01a57cc897ea4f150 BNB0.00036917
0x8a88c08ef48aec73aa346fc5895a3b8fd9b36f50a398f4adb4683b7b2d7cdfb3Deposit116813382021-10-11 13:26:035 days 1 hr ago0x8e446e5bd288dab87fa92d5a542cd0e2294403a9 IN  0x222dc5cbc4d5082ac181532c01a57cc897ea4f150 BNB0.000517905
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StakingContract

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 7 : StakingContract.sol
//SPDX-License-Identifier: Unlicense
pragma solidity >=0.8.4;

import '@openzeppelin/contracts/token/ERC20/IERC20.sol';
import '@openzeppelin/contracts/access/Ownable.sol';
import '@openzeppelin/contracts/utils/math/SafeMath.sol';
import '@openzeppelin/contracts/security/ReentrancyGuard.sol';
import './IRewardToken.sol';

contract StakingContract is Ownable, ReentrancyGuard {
  using SafeMath for uint256;

  // Token given as reward for staking
  IRewardToken public immutable rewardToken;
  // Token deposited for staking
  IERC20 public immutable stakedToken;

  // Total staked token balance
  uint256 public totalStakedSupply;
  // Staked LP token balance of each user
  mapping(address => uint256) public stakedBalances;
  // First deposit timestamp of each user
  mapping(address => uint256) public firstDepositTimestamps;
  // Used for calculating the latest rewards. Resets after each reward claim.
  mapping(address => uint256) public rewardCalculationStartTimestamps;
  // The pending rewards, saved each time user tops up staked balance
  mapping(address => uint256) public pendingRewardsUpToLastDeposit;

  // Yearly mint rate per staked token
  uint256 public immutable APRM;
  // Basis points of staked token processing fee taken when user withdraws
  uint256 public immutable processingFeeForStakedToken;

  // Minimum number of tokens that can be staked
  uint256 public minimumStakeAmount;
  // Minimum stake time to receive rewards after the first deposit
  uint256 public minimumStakeTime;
  // Address of fee vault
  address public feeVaultAddress;

  bool public depositsPaused;
  bool public withdrawalsPaused;

  event Deposit(address indexed account, uint256 indexed amount);
  event Withdrawal(address indexed account, uint256 indexed amount);
  event EmergencyWithdrawal(address indexed account, uint256 indexed amount);
  event RewardClaim(address indexed account, uint256 indexed amount);
  event DepositsPaused(bool indexed paused);
  event WithdrawalsPaused(bool indexed paused);

  constructor(
    address _rewardToken,
    address _stakedToken,
    uint256 _APRM,
    uint256 _minimumStakeAmount,
    uint256 _minimumStakeTime,
    uint256 _processingFeeForStakedToken,
    address _feeVaultAddress
  ) {
    rewardToken = IRewardToken(_rewardToken);
    stakedToken = IERC20(_stakedToken);
    APRM = _APRM;
    minimumStakeAmount = _minimumStakeAmount;
    minimumStakeTime = _minimumStakeTime;
    processingFeeForStakedToken = _processingFeeForStakedToken;
    feeVaultAddress = _feeVaultAddress;
    depositsPaused = false;
    withdrawalsPaused = false;
  }

  /**
   * @dev Throws if deposit is paused.
   */
  modifier whenDepositNotPaused() {
    require(!depositsPaused, 'DEPOSITS ARE PAUSED');
    _;
  }

  /**
   * @dev Throws if withdraw is paused.
   */
  modifier whenWithdrawNotPaused() {
    require(!withdrawalsPaused, 'WITHDRAWS ARE PAUSED');
    _;
  }

  /**
   * Allows user to deposit the token for staking and earn reward token, calculated with the APRM.
   * To be able to deposit user should give allowance to the staking contract and
   * deposit at least the minimum stake amount.
   */
  function deposit(uint256 amount) external nonReentrant whenDepositNotPaused {
    require(amount <= stakedToken.allowance(msg.sender, address(this)), 'NOT ENOUGH ALLOWANCE');
    require(amount <= stakedToken.balanceOf(msg.sender), 'NOT ENOUGH TOKEN BALANCE');
    require(amount >= minimumStakeAmount, 'AMOUNT CANNOT BE SMALLER THAN MINIMUM AMOUNT');

    uint256 balanceOfAccount = stakedBalances[msg.sender];

    if (balanceOfAccount > 0) {
      // Adds all pending rewards to pending rewards of the account.
      pendingRewardsUpToLastDeposit[msg.sender] = calculateTotalPendingRewards(msg.sender);
    }

    // Adds amount to total supply and balance of the account, sets timestamps of the account.
    totalStakedSupply = totalStakedSupply.add(amount);
    stakedBalances[msg.sender] = stakedBalances[msg.sender].add(amount);
    if (firstDepositTimestamps[msg.sender] == 0) {
      firstDepositTimestamps[msg.sender] = block.timestamp;
    }
    rewardCalculationStartTimestamps[msg.sender] = block.timestamp;

    // Receives tokens from the account.
    bool success = stakedToken.transferFrom(msg.sender, address(this), amount);
    require(success, 'TRANSFER_FROM REVERTED');

    emit Deposit(msg.sender, amount);
  }

  /**
   * Claim pending rewards if minimum stake time has passed since the first deposit.
   */
  function claimRewards() external nonReentrant whenWithdrawNotPaused {
    uint256 userBalance = stakedBalances[msg.sender];
    require(userBalance > 0, 'NO STAKED BALANCE');
    require(
      (block.timestamp - firstDepositTimestamps[msg.sender]) >= minimumStakeTime,
      'MINIMUM STAKE TIME HAS NOT PASSED'
    );

    uint256 totalRewardsAmount = calculateTotalPendingRewards(msg.sender);
    require(totalRewardsAmount > 0, 'NO PENDING REWARDS');

    rewardCalculationStartTimestamps[msg.sender] = block.timestamp;
    pendingRewardsUpToLastDeposit[msg.sender] = 0;

    // Mints total rewards amount for the user and fee vault.
    rewardToken.mint(msg.sender, totalRewardsAmount);
    rewardToken.mint(feeVaultAddress, totalRewardsAmount);
    emit RewardClaim(msg.sender, totalRewardsAmount);
  }

  /**
   * Withdraws all tokens of an account and rewards.
   */
  function withdraw() external nonReentrant whenWithdrawNotPaused {
    uint256 userBalance = stakedBalances[msg.sender];
    require(userBalance > 0, 'NO STAKED BALANCE');

    // Calculate total rewards amount (if minimumStakeTime has passed), and reset timestamp and pending rewards of the account
    uint256 totalRewardsAmount;
    if (block.timestamp - firstDepositTimestamps[msg.sender] >= minimumStakeTime) {
      totalRewardsAmount = calculateTotalPendingRewards(msg.sender);
    }
    rewardCalculationStartTimestamps[msg.sender] = 0;
    pendingRewardsUpToLastDeposit[msg.sender] = 0;
    firstDepositTimestamps[msg.sender] = 0;

    // Substract amount from total supply and reset balance of the account.
    totalStakedSupply = totalStakedSupply.sub(userBalance);
    stakedBalances[msg.sender] = 0;

    // Send staked tokens to the user account and fees to feeVault.
    uint256 stakeTokenFee = userBalance.mul(processingFeeForStakedToken).div(10000);
    uint256 stakeTokenAmountAfterFee = userBalance.sub(stakeTokenFee);
    bool transferToSender = stakedToken.transfer(msg.sender, stakeTokenAmountAfterFee);
    bool transferToVault = stakedToken.transfer(feeVaultAddress, stakeTokenFee);
    require(transferToSender && transferToVault, 'TRANSFER REVERTED');
    emit Withdrawal(msg.sender, stakeTokenAmountAfterFee);

    if (totalRewardsAmount > 0) {
      // Mints total rewards amount for the user and fee vault.
      rewardToken.mint(msg.sender, totalRewardsAmount);
      rewardToken.mint(feeVaultAddress, totalRewardsAmount);
      emit RewardClaim(msg.sender, totalRewardsAmount);
    }
  }

  /**
   * Withdraws all tokens of an account immediately without a reward.
   */
  function emergencyWithdraw() external nonReentrant {
    uint256 userBalance = stakedBalances[msg.sender];
    require(userBalance > 0, 'NO STAKED BALANCE');

    // Substract amount from total supply and resets all data of the account.
    totalStakedSupply = totalStakedSupply.sub(userBalance);
    stakedBalances[msg.sender] = 0;
    firstDepositTimestamps[msg.sender] = 0;
    rewardCalculationStartTimestamps[msg.sender] = 0;
    pendingRewardsUpToLastDeposit[msg.sender] = 0;

    // Sends tokens to the account and fees to vault.
    uint256 stakeTokenFee = userBalance.mul(processingFeeForStakedToken).div(10000);
    uint256 stakeTokenAmountAfterFee = userBalance.sub(stakeTokenFee);
    bool transferToSender = stakedToken.transfer(msg.sender, stakeTokenAmountAfterFee);
    bool transferToVault = stakedToken.transfer(feeVaultAddress, stakeTokenFee);
    require(transferToSender && transferToVault, 'TRANSFER REVERTED');
    emit EmergencyWithdrawal(msg.sender, stakeTokenAmountAfterFee);
  }

  /**
   * Calculate rewards.
   */
  function calculateLatestRewards(address userAddress) public view returns (uint256) {
    // Subtract current time from starting time and convert the timestamp to the day.
    uint256 dayCount = (block.timestamp - rewardCalculationStartTimestamps[userAddress]).div(60).div(60).div(24);
    // Calculate yearly mint rate.
    uint256 yearlyMint = stakedBalances[userAddress].mul(APRM).div(10000);
    // Calculate total amount of interest.
    uint256 rewards = yearlyMint.div(365).mul(dayCount);

    return rewards;
  }

  /**
   * Return total pending rewards.
   */
  function calculateTotalPendingRewards(address userAddress) public view returns (uint256) {
    uint256 pendingSinceLastDeposit = calculateLatestRewards(userAddress);
    return pendingSinceLastDeposit.add(pendingRewardsUpToLastDeposit[userAddress]);
  }

  /**
   * Set Minimum Stake Amount.
   */
  function setMinimumStakeAmount(uint256 _minimumStakeAmount) public onlyOwner {
    minimumStakeAmount = _minimumStakeAmount;
  }

  /**
   * Set Minimum Stake Time.
   */
  function setMinimumStakeTime(uint256 _minimumStakeTime) public onlyOwner {
    minimumStakeTime = _minimumStakeTime;
  }

  /**
   * Set Processing Fee Vault Address.
   */
  function setFeeVaultAddress(address _address) public onlyOwner {
    feeVaultAddress = _address;
  }

  /**
   * Pause/unpause deposits.
   */
  function pauseDeposits(bool pause) public onlyOwner {
    depositsPaused = pause;
    emit DepositsPaused(pause);
  }

  /**
   * Pause/unpause withdrawals.
   */
  function pauseWithdrawals(bool pause) public onlyOwner {
    withdrawalsPaused = pause;
    emit WithdrawalsPaused(pause);
  }
}

File 2 of 7 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 3 of 7 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/Context.sol";
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 4 of 7 : SafeMath.sol
// SPDX-License-Identifier: MIT

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 no longer needed starting with Solidity 0.8. 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. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * 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 5 of 7 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 6 of 7 : IRewardToken.sol
//SPDX-License-Identifier: Unlicense
pragma solidity >=0.8.4;

interface IRewardToken {
  function giveMintingConsent() external;

  function removeMintingConsent() external;

  function proposeMinter(address proposedMinterAddress) external;

  function approveProposedMinter(address proposedMinterAddress) external;

  function proposeMinterRemoval(address minterAddress) external;

  function approveMinterRemoval(address minterAddress) external;

  function mint(address to, uint256 amount) external;
}

File 7 of 7 : Context.sol
// SPDX-License-Identifier: MIT

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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"address","name":"_stakedToken","type":"address"},{"internalType":"uint256","name":"_APRM","type":"uint256"},{"internalType":"uint256","name":"_minimumStakeAmount","type":"uint256"},{"internalType":"uint256","name":"_minimumStakeTime","type":"uint256"},{"internalType":"uint256","name":"_processingFeeForStakedToken","type":"uint256"},{"internalType":"address","name":"_feeVaultAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"paused","type":"bool"}],"name":"DepositsPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardClaim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"paused","type":"bool"}],"name":"WithdrawalsPaused","type":"event"},{"inputs":[],"name":"APRM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"calculateLatestRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"calculateTotalPendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositsPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeVaultAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"firstDepositTimestamps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumStakeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumStakeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"pause","type":"bool"}],"name":"pauseDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"pause","type":"bool"}],"name":"pauseWithdrawals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pendingRewardsUpToLastDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"processingFeeForStakedToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardCalculationStartTimestamps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IRewardToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setFeeVaultAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumStakeAmount","type":"uint256"}],"name":"setMinimumStakeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumStakeTime","type":"uint256"}],"name":"setMinimumStakeTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakedBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakedToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawalsPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

6101006040523480156200001257600080fd5b506040516200336138038062003361833981810160405281019062000038919062000235565b60006200004a620001ff60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600180819055508673ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250508573ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508460c0818152505083600781905550826008819055508160e0818152505080600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600960146101000a81548160ff0219169083151502179055506000600960156101000a81548160ff0219169083151502179055505050505050505062000354565b600033905090565b600081519050620002188162000320565b92915050565b6000815190506200022f816200033a565b92915050565b600080600080600080600060e0888a0312156200025157600080fd5b6000620002618a828b0162000207565b9750506020620002748a828b0162000207565b9650506040620002878a828b016200021e565b95505060606200029a8a828b016200021e565b9450506080620002ad8a828b016200021e565b93505060a0620002c08a828b016200021e565b92505060c0620002d38a828b0162000207565b91505092959891949750929550565b6000620002ef82620002f6565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6200032b81620002e2565b81146200033757600080fd5b50565b620003458162000316565b81146200035157600080fd5b50565b60805160601c60a05160601c60c05160e051612f6b620003f660003960008181610d35015281816113690152611e3501526000818161144a0152611c02015260008181610d8e01528181610e3f0152818161165d0152818161174a01528181611a9701528181611bde01528181611e8e0152611f3f0152600081816108ea0152818161097701528181610fa60152818161103301526123db0152612f6b6000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80638da5cb5b116100f9578063db2e21bc11610097578063f2ccb6d911610071578063f2ccb6d9146104ab578063f2fde38b146104c9578063f4cc87ba146104e5578063f7c618c114610501576101c4565b8063db2e21bc14610467578063e942204614610471578063e9f2838e1461048d576101c4565b8063b6b55f25116100d3578063b6b55f25146103f1578063bcdc3cfc1461040d578063cc7a262e1461042b578063d82a2aa614610449576101c4565b80638da5cb5b14610387578063af62f747146103a5578063b67c15b4146103d5576101c4565b80633ccfd60b116101665780636b036f45116101405780636b036f4514610325578063715018a614610343578063738b62e51461034d5780638169779b14610369576101c4565b80633ccfd60b146102cd57806355db2703146102d757806360da3e8314610307576101c4565b806319f48cff116101a257806319f48cff1461024557806322f6d00314610275578063242df9e1146102a5578063372500ab146102c3576101c4565b806303237a04146101c95780630d29fcd4146101f95780631460fa8714610215575b600080fd5b6101e360048036038101906101de91906124c6565b61051f565b6040516101f09190612a3a565b60405180910390f35b610213600480360381019061020e9190612541565b610587565b005b61022f600480360381019061022a91906124c6565b61060d565b60405161023c9190612a3a565b60405180910390f35b61025f600480360381019061025a91906124c6565b610625565b60405161026c9190612a3a565b60405180910390f35b61028f600480360381019061028a91906124c6565b61063d565b60405161029c9190612a3a565b60405180910390f35b6102ad610655565b6040516102ba9190612a3a565b60405180910390f35b6102cb61065b565b005b6102d5610a73565b005b6102f160048036038101906102ec91906124c6565b611134565b6040516102fe9190612a3a565b60405180910390f35b61030f61114c565b60405161031c9190612849565b60405180910390f35b61032d61115f565b60405161033a9190612a3a565b60405180910390f35b61034b611165565b005b610367600480360381019061036291906124ef565b61129f565b005b610371611367565b60405161037e9190612a3a565b60405180910390f35b61038f61138b565b60405161039c91906127a5565b60405180910390f35b6103bf60048036038101906103ba91906124c6565b6113b4565b6040516103cc9190612a3a565b60405180910390f35b6103ef60048036038101906103ea91906124c6565b6114fd565b005b61040b60048036038101906104069190612541565b6115bd565b005b610415611bd6565b6040516104229190612a3a565b60405180910390f35b610433611bdc565b6040516104409190612864565b60405180910390f35b610451611c00565b60405161045e9190612a3a565b60405180910390f35b61046f611c24565b005b61048b60048036038101906104869190612541565b6120a9565b005b61049561212f565b6040516104a29190612849565b60405180910390f35b6104b3612142565b6040516104c091906127a5565b60405180910390f35b6104e360048036038101906104de91906124c6565b612168565b005b6104ff60048036038101906104fa91906124ef565b612311565b005b6105096123d9565b604051610516919061287f565b60405180910390f35b60008061052b836113b4565b905061057f600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826123fd90919063ffffffff16565b915050919050565b61058f612413565b73ffffffffffffffffffffffffffffffffffffffff166105ad61138b565b73ffffffffffffffffffffffffffffffffffffffff1614610603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105fa9061297a565b60405180910390fd5b8060078190555050565b60036020528060005260406000206000915090505481565b60046020528060005260406000206000915090505481565b60056020528060005260406000206000915090505481565b60085481565b600260015414156106a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610698906129fa565b60405180910390fd5b6002600181905550600960159054906101000a900460ff16156106f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f09061299a565b60405180910390fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111610780576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107779061295a565b60405180910390fd5b600854600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054426107ce9190612b47565b101561080f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610806906129ba565b60405180910390fd5b600061081a3361051f565b90506000811161085f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108569061289a565b60405180910390fd5b42600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340c10f1933836040518363ffffffff1660e01b8152600401610943929190612820565b600060405180830381600087803b15801561095d57600080fd5b505af1158015610971573d6000803e3d6000fd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340c10f19600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b81526004016109f2929190612820565b600060405180830381600087803b158015610a0c57600080fd5b505af1158015610a20573d6000803e3d6000fd5b50505050803373ffffffffffffffffffffffffffffffffffffffff167f75690555e75b04e280e646889defdcbefd8401507e5394d1173fd84290944c2960405160405180910390a3505060018081905550565b60026001541415610ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab0906129fa565b60405180910390fd5b6002600181905550600960159054906101000a900460ff1615610b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b089061299a565b60405180910390fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111610b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8f9061295a565b60405180910390fd5b6000600854600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205442610be89190612b47565b10610bf957610bf63361051f565b90505b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610cdd8260025461241b90919063ffffffff16565b6002819055506000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000610d71612710610d637f00000000000000000000000000000000000000000000000000000000000000008661243190919063ffffffff16565b61244790919063ffffffff16565b90506000610d88828561241b90919063ffffffff16565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401610de7929190612820565b602060405180830381600087803b158015610e0157600080fd5b505af1158015610e15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e399190612518565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518363ffffffff1660e01b8152600401610eba929190612820565b602060405180830381600087803b158015610ed457600080fd5b505af1158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c9190612518565b9050818015610f185750805b610f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4e906129da565b60405180910390fd5b823373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6560405160405180910390a36000851115611125577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340c10f1933876040518363ffffffff1660e01b8152600401610fff929190612820565b600060405180830381600087803b15801561101957600080fd5b505af115801561102d573d6000803e3d6000fd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340c10f19600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16876040518363ffffffff1660e01b81526004016110ae929190612820565b600060405180830381600087803b1580156110c857600080fd5b505af11580156110dc573d6000803e3d6000fd5b50505050843373ffffffffffffffffffffffffffffffffffffffff167f75690555e75b04e280e646889defdcbefd8401507e5394d1173fd84290944c2960405160405180910390a35b50505050505060018081905550565b60066020528060005260406000206000915090505481565b600960149054906101000a900460ff1681565b60075481565b61116d612413565b73ffffffffffffffffffffffffffffffffffffffff1661118b61138b565b73ffffffffffffffffffffffffffffffffffffffff16146111e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d89061297a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6112a7612413565b73ffffffffffffffffffffffffffffffffffffffff166112c561138b565b73ffffffffffffffffffffffffffffffffffffffff161461131b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113129061297a565b60405180910390fd5b80600960146101000a81548160ff0219169083151502179055508015157f5ef34f53269a04b5b817e5be24a51ba6b477118b399ec9dd5b2baf5b299563dc60405160405180910390a250565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008061143b601861142d603c61141f603c600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054426114119190612b47565b61244790919063ffffffff16565b61244790919063ffffffff16565b61244790919063ffffffff16565b905060006114c56127106114b77f0000000000000000000000000000000000000000000000000000000000000000600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461243190919063ffffffff16565b61244790919063ffffffff16565b905060006114f0836114e261016d8561244790919063ffffffff16565b61243190919063ffffffff16565b9050809350505050919050565b611505612413565b73ffffffffffffffffffffffffffffffffffffffff1661152361138b565b73ffffffffffffffffffffffffffffffffffffffff1614611579576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115709061297a565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60026001541415611603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fa906129fa565b60405180910390fd5b6002600181905550600960149054906101000a900460ff161561165b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116529061291a565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016116b69291906127c0565b60206040518083038186803b1580156116ce57600080fd5b505afa1580156116e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611706919061256a565b811115611748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173f90612a1a565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016117a191906127a5565b60206040518083038186803b1580156117b957600080fd5b505afa1580156117cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f1919061256a565b811115611833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182a906128ba565b60405180910390fd5b600754811015611878576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186f906128da565b60405180910390fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811115611912576118ce3361051f565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b611927826002546123fd90919063ffffffff16565b60028190555061197f82600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123fd90919063ffffffff16565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415611a4f5742600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b42600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401611af2939291906127e9565b602060405180830381600087803b158015611b0c57600080fd5b505af1158015611b20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b449190612518565b905080611b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7d9061293a565b60405180910390fd5b823373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c60405160405180910390a350506001808190555050565b60025481565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60026001541415611c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c61906129fa565b60405180910390fd5b60026001819055506000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111611cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf09061295a565b60405180910390fd5b611d0e8160025461241b90919063ffffffff16565b6002819055506000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000611e71612710611e637f00000000000000000000000000000000000000000000000000000000000000008561243190919063ffffffff16565b61244790919063ffffffff16565b90506000611e88828461241b90919063ffffffff16565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401611ee7929190612820565b602060405180830381600087803b158015611f0157600080fd5b505af1158015611f15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f399190612518565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518363ffffffff1660e01b8152600401611fba929190612820565b602060405180830381600087803b158015611fd457600080fd5b505af1158015611fe8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200c9190612518565b90508180156120185750805b612057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204e906129da565b60405180910390fd5b823373ffffffffffffffffffffffffffffffffffffffff167f23d6711a1d031134a36921253c75aa59e967d38e369ac625992824315e204f2060405160405180910390a3505050505060018081905550565b6120b1612413565b73ffffffffffffffffffffffffffffffffffffffff166120cf61138b565b73ffffffffffffffffffffffffffffffffffffffff1614612125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211c9061297a565b60405180910390fd5b8060088190555050565b600960159054906101000a900460ff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612170612413565b73ffffffffffffffffffffffffffffffffffffffff1661218e61138b565b73ffffffffffffffffffffffffffffffffffffffff16146121e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121db9061297a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612254576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224b906128fa565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612319612413565b73ffffffffffffffffffffffffffffffffffffffff1661233761138b565b73ffffffffffffffffffffffffffffffffffffffff161461238d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123849061297a565b60405180910390fd5b80600960156101000a81548160ff0219169083151502179055508015157f129d33f7856617012aed60524381cfff7233cfc57df58d9f6613a5593d3dc21860405160405180910390a250565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000818361240b9190612a66565b905092915050565b600033905090565b600081836124299190612b47565b905092915050565b6000818361243f9190612aed565b905092915050565b600081836124559190612abc565b905092915050565b60008135905061246c81612ef0565b92915050565b60008135905061248181612f07565b92915050565b60008151905061249681612f07565b92915050565b6000813590506124ab81612f1e565b92915050565b6000815190506124c081612f1e565b92915050565b6000602082840312156124d857600080fd5b60006124e68482850161245d565b91505092915050565b60006020828403121561250157600080fd5b600061250f84828501612472565b91505092915050565b60006020828403121561252a57600080fd5b600061253884828501612487565b91505092915050565b60006020828403121561255357600080fd5b60006125618482850161249c565b91505092915050565b60006020828403121561257c57600080fd5b600061258a848285016124b1565b91505092915050565b61259c81612b7b565b82525050565b6125ab81612b8d565b82525050565b6125ba81612bc3565b82525050565b6125c981612be7565b82525050565b60006125dc601283612a55565b91506125e782612c69565b602082019050919050565b60006125ff601883612a55565b915061260a82612c92565b602082019050919050565b6000612622602c83612a55565b915061262d82612cbb565b604082019050919050565b6000612645602683612a55565b915061265082612d0a565b604082019050919050565b6000612668601383612a55565b915061267382612d59565b602082019050919050565b600061268b601683612a55565b915061269682612d82565b602082019050919050565b60006126ae601183612a55565b91506126b982612dab565b602082019050919050565b60006126d1602083612a55565b91506126dc82612dd4565b602082019050919050565b60006126f4601483612a55565b91506126ff82612dfd565b602082019050919050565b6000612717602183612a55565b915061272282612e26565b604082019050919050565b600061273a601183612a55565b915061274582612e75565b602082019050919050565b600061275d601f83612a55565b915061276882612e9e565b602082019050919050565b6000612780601483612a55565b915061278b82612ec7565b602082019050919050565b61279f81612bb9565b82525050565b60006020820190506127ba6000830184612593565b92915050565b60006040820190506127d56000830185612593565b6127e26020830184612593565b9392505050565b60006060820190506127fe6000830186612593565b61280b6020830185612593565b6128186040830184612796565b949350505050565b60006040820190506128356000830185612593565b6128426020830184612796565b9392505050565b600060208201905061285e60008301846125a2565b92915050565b600060208201905061287960008301846125b1565b92915050565b600060208201905061289460008301846125c0565b92915050565b600060208201905081810360008301526128b3816125cf565b9050919050565b600060208201905081810360008301526128d3816125f2565b9050919050565b600060208201905081810360008301526128f381612615565b9050919050565b6000602082019050818103600083015261291381612638565b9050919050565b600060208201905081810360008301526129338161265b565b9050919050565b600060208201905081810360008301526129538161267e565b9050919050565b60006020820190508181036000830152612973816126a1565b9050919050565b60006020820190508181036000830152612993816126c4565b9050919050565b600060208201905081810360008301526129b3816126e7565b9050919050565b600060208201905081810360008301526129d38161270a565b9050919050565b600060208201905081810360008301526129f38161272d565b9050919050565b60006020820190508181036000830152612a1381612750565b9050919050565b60006020820190508181036000830152612a3381612773565b9050919050565b6000602082019050612a4f6000830184612796565b92915050565b600082825260208201905092915050565b6000612a7182612bb9565b9150612a7c83612bb9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612ab157612ab0612c0b565b5b828201905092915050565b6000612ac782612bb9565b9150612ad283612bb9565b925082612ae257612ae1612c3a565b5b828204905092915050565b6000612af882612bb9565b9150612b0383612bb9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b3c57612b3b612c0b565b5b828202905092915050565b6000612b5282612bb9565b9150612b5d83612bb9565b925082821015612b7057612b6f612c0b565b5b828203905092915050565b6000612b8682612b99565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000612bce82612bd5565b9050919050565b6000612be082612b99565b9050919050565b6000612bf282612bf9565b9050919050565b6000612c0482612b99565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e4f2050454e44494e4720524557415244530000000000000000000000000000600082015250565b7f4e4f5420454e4f55474820544f4b454e2042414c414e43450000000000000000600082015250565b7f414d4f554e542043414e4e4f5420424520534d414c4c4552205448414e204d4960008201527f4e494d554d20414d4f554e540000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4445504f53495453204152452050415553454400000000000000000000000000600082015250565b7f5452414e534645525f46524f4d20524556455254454400000000000000000000600082015250565b7f4e4f205354414b45442042414c414e4345000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5749544844524157532041524520504155534544000000000000000000000000600082015250565b7f4d494e494d554d205354414b452054494d4520484153204e4f5420504153534560008201527f4400000000000000000000000000000000000000000000000000000000000000602082015250565b7f5452414e53464552205245564552544544000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4e4f5420454e4f55474820414c4c4f57414e4345000000000000000000000000600082015250565b612ef981612b7b565b8114612f0457600080fd5b50565b612f1081612b8d565b8114612f1b57600080fd5b50565b612f2781612bb9565b8114612f3257600080fd5b5056fea264697066735822122016cb5c5c0360ebeb89f334bbe089b9fbcf7a9e43b6f994d8d0f05524cde08d9664736f6c63430008040033000000000000000000000000ba0f58179f5441d81d22402bd0183ffff130e243000000000000000000000000d632bd021a07af70592ce1e18717ab9aa126decb0000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000069e10de76676d0800000000000000000000000000000000000000000000000000000000000000002a300000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000a77d3754428edda3760438f9c25b9bd25dc23b6a

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

000000000000000000000000ba0f58179f5441d81d22402bd0183ffff130e243000000000000000000000000d632bd021a07af70592ce1e18717ab9aa126decb0000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000069e10de76676d0800000000000000000000000000000000000000000000000000000000000000002a300000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000a77d3754428edda3760438f9c25b9bd25dc23b6a

-----Decoded View---------------
Arg [0] : _rewardToken (address): 0xba0f58179f5441d81d22402bd0183ffff130e243
Arg [1] : _stakedToken (address): 0xd632bd021a07af70592ce1e18717ab9aa126decb
Arg [2] : _APRM (uint256): 3000
Arg [3] : _minimumStakeAmount (uint256): 500000000000000000000000
Arg [4] : _minimumStakeTime (uint256): 172800
Arg [5] : _processingFeeForStakedToken (uint256): 10
Arg [6] : _feeVaultAddress (address): 0xa77d3754428edda3760438f9c25b9bd25dc23b6a

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000ba0f58179f5441d81d22402bd0183ffff130e243
Arg [1] : 000000000000000000000000d632bd021a07af70592ce1e18717ab9aa126decb
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000bb8
Arg [3] : 0000000000000000000000000000000000000000000069e10de76676d0800000
Arg [4] : 000000000000000000000000000000000000000000000000000000000002a300
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [6] : 000000000000000000000000a77d3754428edda3760438f9c25b9bd25dc23b6a


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.