Contract 0x297fddc5c33ef988dd03bd13e162ae084ea1fe57

Contract Overview

Balance:
0 FTM

FTM Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x6ad83e2ff1b83f9677a6807b29aba710cd69fac357c8b247ccee663e43345836Claim203616722021-10-28 14:59:2341 secs ago0xd9fce11c2df0ce3de88da170d9c6692348e7e45d IN  0x297fddc5c33ef988dd03bd13e162ae084ea1fe570 FTM0.54938221655
0x55bba6a962002aadc31f2429281084a3cfe84a86f6ef75b408a1796316becca5Claim203601682021-10-28 14:37:4322 mins ago0xcd18b74f8fcc726deb48729e91b93736491597c4 IN  0x297fddc5c33ef988dd03bd13e162ae084ea1fe570 FTM0.581277716763
0x5649b8be2f7f9b3c332b5bcc9aeca041307d1e5f1822a02fd004f079136f75edClaim203600392021-10-28 14:35:3824 mins ago0x70ce4bba5076fa59e4fbdee382663df78402f2e0 IN  0x297fddc5c33ef988dd03bd13e162ae084ea1fe570 FTM0.57389538286
0x168141665abfebf9a6f1f5018e59501f7fadb65500578a692a3343bf35ae9f2aClaim203599862021-10-28 14:34:4625 mins ago0xc705ad7d77293c600c7655e5476578e95ef5b9e7 IN  0x297fddc5c33ef988dd03bd13e162ae084ea1fe570 FTM0.537468971716
0xf924d0e301bfabb6a0a0bacdd4a55eddd8af88ae0e2dc73461f3ee9405e52bc0Claim203599792021-10-28 14:34:3725 mins ago0x28b931db129d9b79550a3dc1b9147a03217e5ed6 IN  0x297fddc5c33ef988dd03bd13e162ae084ea1fe570 FTM0.488062123819
0x0b9c49c43f1e00962c18e1fb4739e96d61ddbbd09532d8ecfff81a0a98eb9779Claim203597792021-10-28 14:31:2028 mins ago0x7a730e22bff836b3a2bd4cf3160bbb0cb6583c07 IN  0x297fddc5c33ef988dd03bd13e162ae084ea1fe570 FTM0.395260829113
0x8f92db63dc3b8b24a4e2b9316cedb3c9209857f514f6ad4b0e85995b7ef74428Claim203595402021-10-28 14:27:4332 mins ago0xc8484d4a6baaaa7c31f411b1362145da109f9b50 IN  0x297fddc5c33ef988dd03bd13e162ae084ea1fe570 FTM0.528375228208
0xa8d5261165de8fb8e1b93374fc0831e73a6485ac8ef67a29f613bf5ab1eb78baClaim203594602021-10-28 14:26:2933 mins ago0x388cad06256a829f3d57642acdc11950453a62c4 IN  0x297fddc5c33ef988dd03bd13e162ae084ea1fe570 FTM0.5367402336
0x2615da75446c7e8b441041e51c8533baf53df535e850c72039ba8996cfa56c5cClaim203594512021-10-28 14:26:2133 mins ago0x0c3793e400f8e7396a69629b89fc8f8eacede81d IN  0x297fddc5c33ef988dd03bd13e162ae084ea1fe570 FTM0.579621978432
0x4879eb04ec8943da71654957d1f52b75a4ca6f274f3ae1d7c6986cc5dba7c499Claim203589812021-10-28 14:19:3940 mins ago0x390548ba3bbc8476f95d326fda6f77c0d29e98f8 IN  0x297fddc5c33ef988dd03bd13e162ae084ea1fe570 FTM0.679304920092
0x0f0c441756eff83bc03ab30d1ac3dc21915b0d90cf669e25e9cc2d1847f29f2bClaim203588792021-10-28 14:18:0941 mins ago0x6d03769720335fb8a3abd64e39919d43cadcdb2a IN  0x297fddc5c33ef988dd03bd13e162ae084ea1fe570 FTM0.652995974694
0xed84ff0e2b019e8ccc609d41545c06ad27a668b27fd2bed1bf1a121eb6c1ec50Claim203586552021-10-28 14:14:4845 mins ago0x91e146a612b2e8206069f54da9d6a9302492d895 IN  0x297fddc5c33ef988dd03bd13e162ae084ea1fe570 FTM0.632165930971
0x2413d7918e531193bcad286ee398bec3e78eebd75c071b09a862a3e3562c5cd8Claim203583772021-10-28 14:09:2950 mins ago0x44df291ea37097399a02e9457917c4698babc6bf IN  0x297fddc5c33ef988dd03bd13e162ae084ea1fe570 FTM0.535274120736
0x21922dd1e90908e1871d5d4fa352e0505a49a324dcaefcd2ea613f5361fc1deeClaim203583412021-10-28 14:08:4451 mins ago0xf3a47521e471d5ad1ab8efcbc287751abc565c31 IN  0x297fddc5c33ef988dd03bd13e162ae084ea1fe570 FTM0.483130498726
0xa97c7966677ad97a05079a4e94bc2573f3148d867cc6d25d7feb8ba9d5ca26c1Claim203579162021-10-28 14:00:1359 mins ago0x61d3bafb9bc3da723e4259a7e3653099aeb4487f IN  0x297fddc5c33ef988dd03bd13e162ae084ea1fe570 FTM0.336993426042
0x2441d737e15d32a2253300a8acec6e0f58907899985e67d142f8d51008bf1bdbClaim203578062021-10-28 13:57:571 hr 2 mins ago0x26356e50515d57406b31cb5624b3ce68c840e7ca IN  0x297fddc5c33ef988dd03bd13e162ae084ea1fe570 FTM0.162976103065
0x03c3216777995edad782a5471b71bc81e781777d90b61f819c1331f83a552732Claim203574142021-10-28 13:50:381 hr 9 mins ago0xcf07aeda16eba7c76f91a589e2c5265b1bf379a8 IN  0x297fddc5c33ef988dd03bd13e162ae084ea1fe570 FTM0.210843716905
0x7e80e930cf25455a73d38dbdd75571cad4f58492583b412e07b7130e05638864Claim203573962021-10-28 13:50:171 hr 9 mins ago0xb783dc0696f93ec74fd9214b527278670cb5b09e IN  0x297fddc5c33ef988dd03bd13e162ae084ea1fe570 FTM0.21144290111
0xfd8b0ebfd9480281eb4329400058ba79dc25dc4616863a4d88176847800be7edClaim203573272021-10-28 13:49:071 hr 10 mins ago0x6e81417b312917305d12f76fa3b6bd66ffaa75e7 IN  0x297fddc5c33ef988dd03bd13e162ae084ea1fe570 FTM0.199078040454
0x91b2bd1c25d7ae391605f1dcb2283e9c2a9ea4d8b5c4b99f72d2cc1d34cf2d9bClaim203571242021-10-28 13:45:051 hr 14 mins ago0x32f300e2fdbc05303ba07758d51d86b90f04048e IN  0x297fddc5c33ef988dd03bd13e162ae084ea1fe570 FTM0.121732703846
0xa8924ca8d833702c1806dab555458268b631f0ab20ef380907cfa9dd834e9b62Claim203570992021-10-28 13:44:281 hr 15 mins ago0xa7695668e6b2530b713239574fd219aaa9acf24f IN  0x297fddc5c33ef988dd03bd13e162ae084ea1fe570 FTM0.115064574638
0xe68e1e0bd79d19768f427f35b08db6294166b395c0553cb03bfd59f80e392628Claim203569722021-10-28 13:41:321 hr 18 mins ago0x9ee6f42531adac0bd443756f0120c6aeed354115 IN  0x297fddc5c33ef988dd03bd13e162ae084ea1fe570 FTM0.176914540478
0x27d38c4574d2228a468a05b1c629b8afe3b6e64a18691873d714cfc65f207121Claim203567992021-10-28 13:38:401 hr 21 mins ago0x7718187a9a20336a1682bf79bd58398268bc2dfb IN  0x297fddc5c33ef988dd03bd13e162ae084ea1fe570 FTM0.147661335868
0xd0263d6f42aa51d9629532386492f0775088764a48447ec3e4734c6f959815deClaim203567272021-10-28 13:37:161 hr 22 mins ago0x0291eb432cb4a2613a7415018933e3db45bcd769 IN  0x297fddc5c33ef988dd03bd13e162ae084ea1fe570 FTM0.157525752129
0xb2f75dffb2363efa8ff07967591eb8f77f39810828fef37a0fd6d5f754e4b0b6Claim203562762021-10-28 13:29:471 hr 30 mins ago0x37e5e0fe160edc00092093bb9c206a8421bb6ecc IN  0x297fddc5c33ef988dd03bd13e162ae084ea1fe570 FTM0.134387921271
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0xbda745d3ffef5a1073c0cbd5f57ed949a57f5f59dc8c89e482cdf71b4f278c46184006282021-10-06 1:33:1722 days 13 hrs ago Geist Finance: Deployer 1  Contract Creation0 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Similar Match)
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x59353C21c7543b72D2e27E8Fdc88299589034430

Contract Name:
ChefIncentivesController

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at FtmScan.com on 2021-10-02
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.7.6;



// Part: Address

/**
 * @dev Collection of functions related to the address type
 */
library Address {
  /**
   * @dev Returns true if `account` is a contract.
   *
   * [IMPORTANT]
   * ====
   * It is unsafe to assume that an address for which this function returns
   * false is an externally-owned account (EOA) and not a contract.
   *
   * Among others, `isContract` will return false for the following
   * types of addresses:
   *
   *  - an externally-owned account
   *  - a contract in construction
   *  - an address where a contract will be created
   *  - an address where a contract lived, but was destroyed
   * ====
   */
  function isContract(address account) internal view returns (bool) {
    // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
    // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
    // for accounts without code, i.e. `keccak256('')`
    bytes32 codehash;
    bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
    // solhint-disable-next-line no-inline-assembly
    assembly {
      codehash := extcodehash(account)
    }
    return (codehash != accountHash && codehash != 0x0);
  }

  /**
   * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
   * `recipient`, forwarding all available gas and reverting on errors.
   *
   * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
   * of certain opcodes, possibly making contracts go over the 2300 gas limit
   * imposed by `transfer`, making them unable to receive funds via
   * `transfer`. {sendValue} removes this limitation.
   *
   * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
   *
   * IMPORTANT: because control is transferred to `recipient`, care must be
   * taken to not create reentrancy vulnerabilities. Consider using
   * {ReentrancyGuard} or the
   * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
   */
  function sendValue(address payable recipient, uint256 amount) internal {
    require(address(this).balance >= amount, 'Address: insufficient balance');

    // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
    (bool success, ) = recipient.call{value: amount}('');
    require(success, 'Address: unable to send value, recipient may have reverted');
  }
}

// Part: Context

/*
 * @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 GSN 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 payable) {
    return msg.sender;
  }

  function _msgData() internal view virtual returns (bytes memory) {
    this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
    return msg.data;
  }
}

// Part: IERC20

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

// Part: IMultiFeeDistribution

interface IMultiFeeDistribution {

    function addReward(address rewardsToken) external;
    function mint(address user, uint256 amount, bool withPenalty) external;

}

// Part: IOnwardIncentivesController

interface IOnwardIncentivesController {
    function handleAction(
        address _token,
        address _user,
        uint256 _balance,
        uint256 _totalSupply
    ) external;
}

// Part: SafeMath

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

    return c;
  }

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

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

    return c;
  }

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

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

    return c;
  }

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

  /**
   * @dev Returns the integer division of two unsigned integers. Reverts 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) {
    // Solidity only automatically asserts when dividing by 0
    require(b > 0, errorMessage);
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;
  }

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

  /**
   * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
   * Reverts with custom message 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,
    string memory errorMessage
  ) internal pure returns (uint256) {
    require(b != 0, errorMessage);
    return a % b;
  }
}

// Part: Ownable

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

// Part: SafeERC20

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
  using SafeMath for uint256;
  using Address for address;

  function safeTransfer(
    IERC20 token,
    address to,
    uint256 value
  ) internal {
    callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
  }

  function safeTransferFrom(
    IERC20 token,
    address from,
    address to,
    uint256 value
  ) internal {
    callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
  }

  function safeApprove(
    IERC20 token,
    address spender,
    uint256 value
  ) internal {
    require(
      (value == 0) || (token.allowance(address(this), spender) == 0),
      'SafeERC20: approve from non-zero to non-zero allowance'
    );
    callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
  }

  function callOptionalReturn(IERC20 token, bytes memory data) private {
    require(address(token).isContract(), 'SafeERC20: call to non-contract');

    // solhint-disable-next-line avoid-low-level-calls
    (bool success, bytes memory returndata) = address(token).call(data);
    require(success, 'SafeERC20: low-level call failed');

    if (returndata.length > 0) {
      // Return data is optional
      // solhint-disable-next-line max-line-length
      require(abi.decode(returndata, (bool)), 'SafeERC20: ERC20 operation did not succeed');
    }
  }
}

// File: ChefIncentivesController.sol

// based on the Sushi MasterChef
// https://github.com/sushiswap/sushiswap/blob/master/contracts/MasterChef.sol
contract ChefIncentivesController is Ownable {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    // Info of each user.
    struct UserInfo {
        uint256 amount;
        uint256 rewardDebt;
    }
    // Info of each pool.
    struct PoolInfo {
        uint256 totalSupply;
        uint256 allocPoint; // How many allocation points assigned to this pool.
        uint256 lastRewardTime; // Last second that reward distribution occurs.
        uint256 accRewardPerShare; // Accumulated rewards per share, times 1e12. See below.
        IOnwardIncentivesController onwardIncentives;
    }
    // Info about token emissions for a given time period.
    struct EmissionPoint {
        uint128 startTimeOffset;
        uint128 rewardsPerSecond;
    }

    address public poolConfigurator;

    IMultiFeeDistribution public rewardMinter;
    uint256 public rewardsPerSecond;
    uint256 public immutable maxMintableTokens;
    uint256 public mintedTokens;

    // Info of each pool.
    address[] public registeredTokens;
    mapping(address => PoolInfo) public poolInfo;

    // Data about the future reward rates. emissionSchedule stored in reverse chronological order,
    // whenever the number of blocks since the start block exceeds the next block offset a new
    // reward rate is applied.
    EmissionPoint[] public emissionSchedule;
    // token => user => Info of each user that stakes LP tokens.
    mapping(address => mapping(address => UserInfo)) public userInfo;
    // Total allocation poitns. Must be the sum of all allocation points in all pools.
    uint256 public totalAllocPoint = 0;
    // The block number when reward mining starts.
    uint256 public startTime;

    // account earning rewards => receiver of rewards for this account
    // if receiver is set to address(0), rewards are paid to the earner
    // this is used to aid 3rd party contract integrations
    mapping (address => address) public claimReceiver;

    event BalanceUpdated(
        address indexed token,
        address indexed user,
        uint256 balance,
        uint256 totalSupply
    );

    constructor(
        uint128[] memory _startTimeOffset,
        uint128[] memory _rewardsPerSecond,
        address _poolConfigurator,
        IMultiFeeDistribution _rewardMinter,
        uint256 _maxMintable
    )
        Ownable()
    {
        poolConfigurator = _poolConfigurator;
        rewardMinter = _rewardMinter;
        uint256 length = _startTimeOffset.length;
        for (uint256 i = length - 1; i + 1 != 0; i--) {
            emissionSchedule.push(
                EmissionPoint({
                    startTimeOffset: _startTimeOffset[i],
                    rewardsPerSecond: _rewardsPerSecond[i]
                })
            );
        }
        maxMintableTokens = _maxMintable;
    }

    // Start the party
    function start() public onlyOwner {
        require(startTime == 0);
        startTime = block.timestamp;
    }

    // Add a new lp to the pool. Can only be called by the poolConfigurator.
    function addPool(address _token, uint256 _allocPoint) external {
        require(msg.sender == poolConfigurator);
        require(poolInfo[_token].lastRewardTime == 0);
        _updateEmissions();
        totalAllocPoint = totalAllocPoint.add(_allocPoint);
        registeredTokens.push(_token);
        poolInfo[_token] = PoolInfo({
            totalSupply: 0,
            allocPoint: _allocPoint,
            lastRewardTime: block.timestamp,
            accRewardPerShare: 0,
            onwardIncentives: IOnwardIncentivesController(0)
        });
    }

    // Update the given pool's allocation point. Can only be called by the owner.
    function batchUpdateAllocPoint(
        address[] calldata _tokens,
        uint256[] calldata _allocPoints
    ) public onlyOwner {
        require(_tokens.length == _allocPoints.length);
        _massUpdatePools();
        uint256 _totalAllocPoint = totalAllocPoint;
        for (uint256 i = 0; i < _tokens.length; i++) {
            PoolInfo storage pool = poolInfo[_tokens[i]];
            require(pool.lastRewardTime > 0);
            _totalAllocPoint = _totalAllocPoint.sub(pool.allocPoint).add(_allocPoints[i]);
            pool.allocPoint = _allocPoints[i];
        }
        totalAllocPoint = _totalAllocPoint;
    }

    function setOnwardIncentives(
        address _token,
        IOnwardIncentivesController _incentives
    )
        external
        onlyOwner
    {
        require(poolInfo[_token].lastRewardTime != 0);
        poolInfo[_token].onwardIncentives = _incentives;
    }

    function setClaimReceiver(address _user, address _receiver) external {
        require(msg.sender == _user || msg.sender == owner());
        claimReceiver[_user] = _receiver;
    }

    function poolLength() external view returns (uint256) {
        return registeredTokens.length;
    }

    function claimableReward(address _user, address[] calldata _tokens)
        external
        view
        returns (uint256[] memory)
    {
        uint256[] memory claimable = new uint256[](_tokens.length);
        for (uint256 i = 0; i < _tokens.length; i++) {
            address token = _tokens[i];
            PoolInfo storage pool = poolInfo[token];
            UserInfo storage user = userInfo[token][_user];
            uint256 accRewardPerShare = pool.accRewardPerShare;
            uint256 lpSupply = pool.totalSupply;
            if (block.timestamp > pool.lastRewardTime && lpSupply != 0) {
                uint256 duration = block.timestamp.sub(pool.lastRewardTime);
                uint256 reward = duration.mul(rewardsPerSecond).mul(pool.allocPoint).div(totalAllocPoint);
                accRewardPerShare = accRewardPerShare.add(reward.mul(1e12).div(lpSupply));
            }
            claimable[i] = user.amount.mul(accRewardPerShare).div(1e12).sub(user.rewardDebt);
        }
        return claimable;
    }


    function _updateEmissions() internal {
        uint256 length = emissionSchedule.length;
        if (startTime > 0 && length > 0) {
            EmissionPoint memory e = emissionSchedule[length-1];
            if (block.timestamp.sub(startTime) > e.startTimeOffset) {
                 _massUpdatePools();
                rewardsPerSecond = uint256(e.rewardsPerSecond);
                emissionSchedule.pop();
            }
        }
    }

    // Update reward variables for all pools
    function _massUpdatePools() internal {
        uint256 totalAP = totalAllocPoint;
        uint256 length = registeredTokens.length;
        for (uint256 i = 0; i < length; ++i) {
            _updatePool(registeredTokens[i], totalAP);
        }
    }

    // Update reward variables of the given pool to be up-to-date.
    function _updatePool(address _token, uint256 _totalAllocPoint) internal {
        PoolInfo storage pool = poolInfo[_token];
        if (block.timestamp <= pool.lastRewardTime) {
            return;
        }
        uint256 lpSupply = pool.totalSupply;
        if (lpSupply == 0) {
            pool.lastRewardTime = block.timestamp;
            return;
        }
        uint256 duration = block.timestamp.sub(pool.lastRewardTime);
        uint256 reward = duration.mul(rewardsPerSecond).mul(pool.allocPoint).div(_totalAllocPoint);
        pool.accRewardPerShare = pool.accRewardPerShare.add(reward.mul(1e12).div(lpSupply));
        pool.lastRewardTime = block.timestamp;
    }

    function _mint(address _user, uint256 _amount) internal {
        uint256 minted = mintedTokens;
        if (minted.add(_amount) > maxMintableTokens) {
            _amount = maxMintableTokens.sub(minted);
        }
        if (_amount > 0) {
            mintedTokens = minted.add(_amount);
            address receiver = claimReceiver[_user];
            if (receiver == address(0)) receiver = _user;
            rewardMinter.mint(receiver, _amount, true);
        }
    }

    function handleAction(address _user, uint256 _balance, uint256 _totalSupply) external {
        PoolInfo storage pool = poolInfo[msg.sender];
        require(pool.lastRewardTime > 0);
        _updateEmissions();
        _updatePool(msg.sender, totalAllocPoint);
        UserInfo storage user = userInfo[msg.sender][_user];
        if (user.amount > 0) {
            uint256 pending =
                user.amount.mul(pool.accRewardPerShare).div(1e12).sub(
                    user.rewardDebt
                );
            _mint(_user, pending);
        }
        user.amount = _balance;
        user.rewardDebt = user.amount.mul(pool.accRewardPerShare).div(1e12);
        pool.totalSupply = _totalSupply;
        if (pool.onwardIncentives != IOnwardIncentivesController(0)) {
            pool.onwardIncentives.handleAction(msg.sender, _user, _balance, _totalSupply);
        }
        emit BalanceUpdated(msg.sender, _user, _balance, _totalSupply);
    }

    // Claim pending rewards for one or more pools.
    // Rewards are not received directly, they are minted by the rewardMinter.
    function claim(address _user, address[] calldata _tokens) external {
        _updateEmissions();
        uint256 pending;
        uint256 _totalAllocPoint = totalAllocPoint;
        for (uint i = 0; i < _tokens.length; i++) {
            PoolInfo storage pool = poolInfo[_tokens[i]];
            require(pool.lastRewardTime > 0);
            _updatePool(_tokens[i], _totalAllocPoint);
            UserInfo storage user = userInfo[_tokens[i]][_user];
            pending = pending.add(user.amount.mul(pool.accRewardPerShare).div(1e12).sub(user.rewardDebt));
            user.rewardDebt = user.amount.mul(pool.accRewardPerShare).div(1e12);
        }
        _mint(_user, pending);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint128[]","name":"_startTimeOffset","type":"uint128[]"},{"internalType":"uint128[]","name":"_rewardsPerSecond","type":"uint128[]"},{"internalType":"address","name":"_poolConfigurator","type":"address"},{"internalType":"contract IMultiFeeDistribution","name":"_rewardMinter","type":"address"},{"internalType":"uint256","name":"_maxMintable","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalSupply","type":"uint256"}],"name":"BalanceUpdated","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"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"}],"name":"addPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_allocPoints","type":"uint256[]"}],"name":"batchUpdateAllocPoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"claimableReward","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"emissionSchedule","outputs":[{"internalType":"uint128","name":"startTimeOffset","type":"uint128"},{"internalType":"uint128","name":"rewardsPerSecond","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_balance","type":"uint256"},{"internalType":"uint256","name":"_totalSupply","type":"uint256"}],"name":"handleAction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxMintableTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolConfigurator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTime","type":"uint256"},{"internalType":"uint256","name":"accRewardPerShare","type":"uint256"},{"internalType":"contract IOnwardIncentivesController","name":"onwardIncentives","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"registeredTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardMinter","outputs":[{"internalType":"contract IMultiFeeDistribution","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"setClaimReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"contract IOnwardIncentivesController","name":"_incentives","type":"address"}],"name":"setOnwardIncentives","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"start","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","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":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"}]

60a060405260006009553480156200001657600080fd5b50604051620019b5380380620019b5833981810160405260a08110156200003c57600080fd5b81019080805160405193929190846401000000008211156200005d57600080fd5b9083019060208201858111156200007357600080fd5b82518660208202830111640100000000821117156200009157600080fd5b82525081516020918201928201910280838360005b83811015620000c0578181015183820152602001620000a6565b5050505090500160405260200180516040519392919084640100000000821115620000ea57600080fd5b9083019060208201858111156200010057600080fd5b82518660208202830111640100000000821117156200011e57600080fd5b82525081516020918201928201910280838360005b838110156200014d57818101518382015260200162000133565b50505050919091016040908152602083015190830151606090930151909450919250600090506200017d620002b8565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180546001600160a01b038086166001600160a01b0319928316179092556002805492851692909116919091179055845160001981015b6001810115620002a857600760405180604001604052808984815181106200022357fe5b60200260200101516001600160801b031681526020018884815181106200024657fe5b6020908102919091018101516001600160801b03908116909252835460018101855560009485529381902083519401805493909101518216600160801b029382166001600160801b0319909316929092171691909117905560001901620001ff565b505060805250620002bc92505050565b3390565b6080516116d4620002e160003980610631528061138c52806113c052506116d46000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c80638da5cb5b116100c3578063cd1a4d861161007c578063cd1a4d86146104a7578063de7e410c146104d5578063e20c5a8a146104dd578063e5b5349814610503578063eacdaabc146105d1578063f2fde38b146105d957610158565b80638da5cb5b1461037e5780638e2eba09146103a25780639a0ba2ea146104205780639a7b5f111461043d5780639b8e556314610497578063be9a65551461049f57610158565b80633328756411610115578063332875641461022e578063334d0bbd1461025c57806334c54230146102a8578063715018a61461036657806378e979251461036e5780638d75fe051461037657610158565b8063081e3eda1461015d5780630f208beb1461017757806317caf6f1146101be5780631a848e01146101c657806331873e2e146101ce57806332a9caba14610202575b600080fd5b6101656105ff565b60408051918252519081900360200190f35b6101a56004803603604081101561018d57600080fd5b506001600160a01b0381358116916020013516610605565b6040805192835260208301919091528051918290030190f35b610165610629565b61016561062f565b610200600480360360608110156101e457600080fd5b506001600160a01b038135169060208101359060400135610653565b005b6102006004803603604081101561021857600080fd5b506001600160a01b0381351690602001356107fc565b6102006004803603604081101561024457600080fd5b506001600160a01b0381358116916020013516610903565b6102796004803603602081101561027257600080fd5b5035610969565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b610200600480360360408110156102be57600080fd5b810190602081018135600160201b8111156102d857600080fd5b8201836020820111156102ea57600080fd5b803590602001918460208302840111600160201b8311171561030b57600080fd5b919390929091602081019035600160201b81111561032857600080fd5b82018360208201111561033a57600080fd5b803590602001918460208302840111600160201b8311171561035b57600080fd5b50909250905061099e565b610200610acd565b610165610b6f565b610165610b75565b610386610b7b565b604080516001600160a01b039092168252519081900360200190f35b610200600480360360408110156103b857600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156103e257600080fd5b8201836020820111156103f457600080fd5b803590602001918460208302840111600160201b8311171561041557600080fd5b509092509050610b8a565b6103866004803603602081101561043657600080fd5b5035610d02565b6104636004803603602081101561045357600080fd5b50356001600160a01b0316610d2c565b6040805195865260208601949094528484019290925260608401526001600160a01b03166080830152519081900360a00190f35b610386610d64565b610200610d73565b610200600480360360408110156104bd57600080fd5b506001600160a01b0381358116916020013516610dde565b610386610e8c565b610386600480360360208110156104f357600080fd5b50356001600160a01b0316610e9b565b6105816004803603604081101561051957600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561054357600080fd5b82018360208201111561055557600080fd5b803590602001918460208302840111600160201b8311171561057657600080fd5b509092509050610eb6565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156105bd5781810151838201526020016105a5565b505050509050019250505060405180910390f35b610165611035565b610200600480360360208110156105ef57600080fd5b50356001600160a01b031661103b565b60055490565b60086020908152600092835260408084209091529082529020805460019091015482565b60095481565b7f000000000000000000000000000000000000000000000000000000000000000081565b336000908152600660205260409020600281015461067057600080fd5b610678611133565b610684336009546111ed565b3360009081526008602090815260408083206001600160a01b038816845290915290208054156106f65760006106e882600101546106e264e8d4a510006106dc876003015487600001546112a190919063ffffffff16565b90611303565b90611345565b90506106f48682611387565b505b83815560038201546107149064e8d4a51000906106dc9087906112a1565b600182015582825560048201546001600160a01b0316156107ad576004808301546040805163ae0b537160e01b815233938101939093526001600160a01b0388811660248501526044840188905260648401879052905191169163ae0b537191608480830192600092919082900301818387803b15801561079457600080fd5b505af11580156107a8573d6000803e3d6000fd5b505050505b604080518581526020810185905281516001600160a01b0388169233927f526824944047da5b81071fb6349412005c5da81380b336103fbe5dd34556c776929081900390910190a35050505050565b6001546001600160a01b0316331461081357600080fd5b6001600160a01b0382166000908152600660205260409020600201541561083957600080fd5b610841611133565b60095461084e9082611499565b6009556005805460018181019092557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b039485166001600160a01b031991821681179092556040805160a081018252600080825260208281019788524283850190815260608401838152608085018481529784526006909252939091209151825595519481019490945551600284015592516003830155516004919091018054919093169116179055565b336001600160a01b0383161480610932575061091d610b7b565b6001600160a01b0316336001600160a01b0316145b61093b57600080fd5b6001600160a01b039182166000908152600b6020526040902080546001600160a01b03191691909216179055565b6007818154811061097957600080fd5b6000918252602090912001546001600160801b038082169250600160801b9091041682565b6109a66114f3565b6000546001600160a01b039081169116146109f6576040805162461bcd60e51b8152602060048201819052602482015260008051602061167f833981519152604482015290519081900360640190fd5b828114610a0257600080fd5b610a0a6114f7565b60095460005b84811015610ac357600060066000888885818110610a2a57fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002090506000816002015411610a6d57600080fd5b610aa0858584818110610a7c57fe5b90506020020135610a9a83600101548661134590919063ffffffff16565b90611499565b9250848483818110610aae57fe5b60200291909101356001928301555001610a10565b5060095550505050565b610ad56114f3565b6000546001600160a01b03908116911614610b25576040805162461bcd60e51b8152602060048201819052602482015260008051602061167f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600a5481565b60045481565b6000546001600160a01b031690565b610b92611133565b600954600090815b83811015610cf057600060066000878785818110610bb457fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002090506000816002015411610bf757600080fd5b610c1c868684818110610c0657fe5b905060200201356001600160a01b0316846111ed565b600060086000888886818110610c2e57fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020016000206000896001600160a01b03166001600160a01b031681526020019081526020016000209050610cb9610cb282600101546106e264e8d4a510006106dc876003015487600001546112a190919063ffffffff16565b8690611499565b9450610cdf64e8d4a510006106dc846003015484600001546112a190919063ffffffff16565b600191820155919091019050610b9a565b50610cfb8583611387565b5050505050565b60058181548110610d1257600080fd5b6000918252602090912001546001600160a01b0316905081565b60066020526000908152604090208054600182015460028301546003840154600490940154929391929091906001600160a01b031685565b6002546001600160a01b031681565b610d7b6114f3565b6000546001600160a01b03908116911614610dcb576040805162461bcd60e51b8152602060048201819052602482015260008051602061167f833981519152604482015290519081900360640190fd5b600a5415610dd857600080fd5b42600a55565b610de66114f3565b6000546001600160a01b03908116911614610e36576040805162461bcd60e51b8152602060048201819052602482015260008051602061167f833981519152604482015290519081900360640190fd5b6001600160a01b038216600090815260066020526040902060020154610e5b57600080fd5b6001600160a01b03918216600090815260066020526040902060040180546001600160a01b03191691909216179055565b6001546001600160a01b031681565b600b602052600090815260409020546001600160a01b031681565b606060008267ffffffffffffffff81118015610ed157600080fd5b50604051908082528060200260200182016040528015610efb578160200160208202803683370190505b50905060005b8381101561102c576000858583818110610f1757fe5b6001600160a01b03602091820293909301358316600081815260068352604080822060088552818320968e16835295909352919091206003840154845460028601549396509193509142118015610f6d57508015155b15610fdc576000610f8b85600201544261134590919063ffffffff16565b90506000610fb86009546106dc8860010154610fb2600354876112a190919063ffffffff16565b906112a1565b9050610fd7610fd0846106dc8464e8d4a510006112a1565b8590611499565b935050505b61100483600101546106e264e8d4a510006106dc8688600001546112a190919063ffffffff16565b87878151811061101057fe5b6020908102919091010152505060019093019250610f01915050565b50949350505050565b60035481565b6110436114f3565b6000546001600160a01b03908116911614611093576040805162461bcd60e51b8152602060048201819052602482015260008051602061167f833981519152604482015290519081900360640190fd5b6001600160a01b0381166110d85760405162461bcd60e51b81526004018080602001828103825260268152602001806116386026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600754600a54158015906111475750600081115b156111ea5760006007600183038154811061115e57fe5b6000918252602091829020604080518082019091529101546001600160801b03808216808452600160801b9092041692820192909252600a549092506111a5904290611345565b11156111e8576111b36114f7565b60208101516001600160801b031660035560078054806111cf57fe5b6000828152602081208201600019908101919091550190555b505b50565b6001600160a01b03821660009081526006602052604090206002810154421161121657506111e8565b80548061122a5750426002909101556111e8565b600061124383600201544261134590919063ffffffff16565b90506000611268856106dc8660010154610fb2600354876112a190919063ffffffff16565b905061128b611280846106dc8464e8d4a510006112a1565b600386015490611499565b6003850155505042600290920191909155505050565b6000826112b0575060006112fd565b828202828482816112bd57fe5b04146112fa5760405162461bcd60e51b815260040180806020018281038252602181526020018061165e6021913960400191505060405180910390fd5b90505b92915050565b60006112fa83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061153b565b60006112fa83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506115dd565b6004547f00000000000000000000000000000000000000000000000000000000000000006113b58284611499565b11156113e8576113e57f000000000000000000000000000000000000000000000000000000000000000082611345565b91505b8115611494576113f88183611499565b6004556001600160a01b038084166000908152600b6020526040902054168061141e5750825b600254604080516334686fad60e21b81526001600160a01b03848116600483015260248201879052600160448301529151919092169163d1a1beb491606480830192600092919082900301818387803b15801561147a57600080fd5b505af115801561148e573d6000803e3d6000fd5b50505050505b505050565b6000828201838110156112fa576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b60095460055460005b81811015611494576115336005828154811061151857fe5b6000918252602090912001546001600160a01b0316846111ed565b600101611500565b600081836115c75760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561158c578181015183820152602001611574565b50505050905090810190601f1680156115b95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816115d357fe5b0495945050505050565b6000818484111561162f5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561158c578181015183820152602001611574565b50505090039056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220f5e0bdfacb289222962c8c065a4469947fdda80c97d2e6e875a7b3629ecfeb9e64736f6c6343000706003300000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000088000000000000000000000000055d4e207dd0a53cf587da0afe726dcb6f652a0d7000000000000000000000000fd59d4725bf972a7bfdf125caaa191fe8ff99c1b0000000000000000000000000000000000000000014adf4b7320334b90000000000000000000000000000000000000000000000000000000000000000000003e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000279b1000000000000000000000000000000000000000000000000000000000004f2810000000000000000000000000000000000000000000000000000000000076b51000000000000000000000000000000000000000000000000000000000009e42100000000000000000000000000000000000000000000000000000000000c5cf100000000000000000000000000000000000000000000000000000000000ed5c10000000000000000000000000000000000000000000000000000000000114e91000000000000000000000000000000000000000000000000000000000013c7610000000000000000000000000000000000000000000000000000000000164031000000000000000000000000000000000000000000000000000000000018b90100000000000000000000000000000000000000000000000000000000001b31d100000000000000000000000000000000000000000000000000000000001daaa100000000000000000000000000000000000000000000000000000000002023710000000000000000000000000000000000000000000000000000000000229c4100000000000000000000000000000000000000000000000000000000002515110000000000000000000000000000000000000000000000000000000000278de100000000000000000000000000000000000000000000000000000000002a06b100000000000000000000000000000000000000000000000000000000002c7f8100000000000000000000000000000000000000000000000000000000002ef8510000000000000000000000000000000000000000000000000000000000317121000000000000000000000000000000000000000000000000000000000033e9f100000000000000000000000000000000000000000000000000000000003662c1000000000000000000000000000000000000000000000000000000000038db9100000000000000000000000000000000000000000000000000000000003b546100000000000000000000000000000000000000000000000000000000003dcd310000000000000000000000000000000000000000000000000000000000404601000000000000000000000000000000000000000000000000000000000042bed100000000000000000000000000000000000000000000000000000000004537a1000000000000000000000000000000000000000000000000000000000047b07100000000000000000000000000000000000000000000000000000000004a294100000000000000000000000000000000000000000000000000000000004ca21100000000000000000000000000000000000000000000000000000000004f1ae100000000000000000000000000000000000000000000000000000000005193b10000000000000000000000000000000000000000000000000000000000540c810000000000000000000000000000000000000000000000000000000000568551000000000000000000000000000000000000000000000000000000000058fe2100000000000000000000000000000000000000000000000000000000005b76f100000000000000000000000000000000000000000000000000000000005defc10000000000000000000000000000000000000000000000000000000000606891000000000000000000000000000000000000000000000000000000000062e1610000000000000000000000000000000000000000000000000000000000655a31000000000000000000000000000000000000000000000000000000000067d30100000000000000000000000000000000000000000000000000000000006a4bd100000000000000000000000000000000000000000000000000000000006cc4a100000000000000000000000000000000000000000000000000000000006f3d71000000000000000000000000000000000000000000000000000000000071b6410000000000000000000000000000000000000000000000000000000000742f11000000000000000000000000000000000000000000000000000000000076a7e100000000000000000000000000000000000000000000000000000000007920b100000000000000000000000000000000000000000000000000000000007b998100000000000000000000000000000000000000000000000000000000007e12510000000000000000000000000000000000000000000000000000000000808b2100000000000000000000000000000000000000000000000000000000008303f10000000000000000000000000000000000000000000000000000000000857cc1000000000000000000000000000000000000000000000000000000000087f59100000000000000000000000000000000000000000000000000000000008a6e6100000000000000000000000000000000000000000000000000000000008ce73100000000000000000000000000000000000000000000000000000000008f6001000000000000000000000000000000000000000000000000000000000091d8d100000000000000000000000000000000000000000000000000000000009451a10000000000000000000000000000000000000000000000000000000000000003e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b278309a7665b825000000000000000000000000000000000000000000000000a3ac64dc9b6a54fc000000000000000000000000000000000000000000000000961aa0739a763a6b00000000000000000000000000000000000000000000000089a8da4e7a3b86e90000000000000000000000000000000000000000000000007e3f32b4dcc9114800000000000000000000000000000000000000000000000073c7c334bfb8693c0000000000000000000000000000000000000000000000006a2e77afba74bf810000000000000000000000000000000000000000000000006160e54d46cad3a7000000000000000000000000000000000000000000000000594e2817be3c500000000000000000000000000000000000000000000000000051e6c30e20a89f030000000000000000000000000000000000000000000000004b1c814355d13de000000000000000000000000000000000000000000000000044e25be7018901ed0000000000000000000000000000000000000000000000003f2c604e57e35e1200000000000000000000000000000000000000000000000039ef997f35949edd0000000000000000000000000000000000000000000000003521fac8b32da3b400000000000000000000000000000000000000000000000030ba4d8428ea0fa70000000000000000000000000000000000000000000000002cb01dc8b7a2fd0900000000000000000000000000000000000000000000000028fbab54bd2fa5c70000000000000000000000000000000000000000000000002595da7748c60bc000000000000000000000000000000000000000000000000022782660ddd59d610000000000000000000000000000000000000000000000001f9c94db855bd6780000000000000000000000000000000000000000000000001cfda9a90b9a61f90000000000000000000000000000000000000000000000001a965e17293b308b0000000000000000000000000000000000000000000000001862151168439865000000000000000000000000000000000000000000000000165c94766f50e7290000000000000000000000000000000000000000000000001481fb44dc427c2500000000000000000000000000000000000000000000000012cebaf08f765a2c000000000000000000000000000000000000000000000000113f905e23673a520000000000000000000000000000000000000000000000000fd17d3837e91dc70000000000000000000000000000000000000000000000000e81c3b986bb59160000000000000000000000000000000000000000000000000d4ddfa85b26a6e90000000000000000000000000000000000000000000000000c338220a68f334f0000000000000000000000000000000000000000000000000b308db7e8a526060000000000000000000000000000000000000000000000000a4310dff57cb187000000000000000000000000000000000000000000000000096944d97ab295d300000000000000000000000000000000000000000000000008a187094aa8b24500000000000000000000000000000000000000000000000007ea5844b5490774000000000000000000000000000000000000000000000000074259a917733fa700000000000000000000000000000000000000000000000006a84865ef8eba12000000000000000000000000000000000000000000000000061afd09364d8cbd000000000000000000000000000000000000000000000000059968b0c1b88c000000000000000000000000000000000000000000000000000522923ba83b520600000000000000000000000000000000000000000000000004b595f06d05bfc00000000000000000000000000000000000000000000000000451a30836b6837400000000000000000000000000000000000000000000000003f5f93a06059f4f00000000000000000000000000000000000000000000000003a1e8bab5c469610000000000000000000000000000000000000000000000000354d07bd8c51058000000000000000000000000000000000000000000000000030e1cc46b609f3500000000000000000000000000000000000000000000000002cd456fb15e82060000000000000000000000000000000000000000000000000291cded35f485e0000000000000000000000000000000000000000000000000025b44e6f82859d300000000000000000000000000000000000000000000000002294172cddb966b00000000000000000000000000000000000000000000000001fb631263cbbdad00000000000000000000000000000000000000000000000001d15266e4cf393c00000000000000000000000000000000000000000000000001aabe625ce161d300000000000000000000000000000000000000000000000001875d5533fdfc7e0000000000000000000000000000000000000000000000000166eb2d0c08bf4200000000000000000000000000000000000000000000000001492974c0cd5122000000000000000000000000000000000000000000000000012ddf5467ff4a1f0000000000000000000000000000000000000000000000000114d883d65eb60600000000000000000000000000000000000000000000000000fde4f0cc199561

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
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.