ETH Price: $1,996.15 (+0.24%)

Contract

0x04136CcFd17C2CECE18A63A09aEaDcfB4Ad2eae5
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Feed199574432024-05-26 23:50:47671 days ago1716767447IN
0x04136CcF...B4Ad2eae5
0 ETH0.000448534
Feed199145182024-05-20 23:50:35677 days ago1716249035IN
0x04136CcF...B4Ad2eae5
0 ETH0.0018056419
Feed199073732024-05-19 23:50:35678 days ago1716162635IN
0x04136CcF...B4Ad2eae5
0 ETH0.000475285
Feed199002212024-05-18 23:50:35679 days ago1716076235IN
0x04136CcF...B4Ad2eae5
0 ETH0.000380224
Feed198930742024-05-17 23:50:35680 days ago1715989835IN
0x04136CcF...B4Ad2eae5
0 ETH0.000380224
Feed198859292024-05-16 23:50:35681 days ago1715903435IN
0x04136CcF...B4Ad2eae5
0 ETH0.000560785
Feed198787742024-05-15 23:50:35682 days ago1715817035IN
0x04136CcF...B4Ad2eae5
0 ETH0.000570336
Feed198716052024-05-14 23:50:35683 days ago1715730635IN
0x04136CcF...B4Ad2eae5
0 ETH0.000475285
Feed198644862024-05-13 23:50:35684 days ago1715644235IN
0x04136CcF...B4Ad2eae5
0 ETH0.000380224
Feed198573312024-05-12 23:50:35685 days ago1715557835IN
0x04136CcF...B4Ad2eae5
0 ETH0.000475285
Feed198501822024-05-11 23:50:35686 days ago1715471435IN
0x04136CcF...B4Ad2eae5
0 ETH0.000380224
Feed198430282024-05-10 23:50:35687 days ago1715385035IN
0x04136CcF...B4Ad2eae5
0 ETH0.000570336
Feed198358752024-05-09 23:50:35688 days ago1715298635IN
0x04136CcF...B4Ad2eae5
0 ETH0.000448624
Feed198287242024-05-08 23:50:47689 days ago1715212247IN
0x04136CcF...B4Ad2eae5
0 ETH0.000380224
Feed198215762024-05-07 23:50:35690 days ago1715125835IN
0x04136CcF...B4Ad2eae5
0 ETH0.000475285
Feed198144312024-05-06 23:50:35691 days ago1715039435IN
0x04136CcF...B4Ad2eae5
0 ETH0.000380224
Feed198072832024-05-05 23:50:35692 days ago1714953035IN
0x04136CcF...B4Ad2eae5
0 ETH0.000570336
Feed198001322024-05-04 23:50:35693 days ago1714866635IN
0x04136CcF...B4Ad2eae5
0 ETH0.000475285
Feed197929752024-05-03 23:50:35694 days ago1714780235IN
0x04136CcF...B4Ad2eae5
0 ETH0.000570336
Feed197858222024-05-02 23:50:35695 days ago1714693835IN
0x04136CcF...B4Ad2eae5
0 ETH0.000672936
Feed197786792024-05-01 23:50:47696 days ago1714607447IN
0x04136CcF...B4Ad2eae5
0 ETH0.000665397
Feed197715122024-04-30 23:50:35697 days ago1714521035IN
0x04136CcF...B4Ad2eae5
0 ETH0.000760448
Feed197643532024-04-29 23:50:35698 days ago1714434635IN
0x04136CcF...B4Ad2eae5
0 ETH0.000665397
Feed197572032024-04-28 23:50:35699 days ago1714348235IN
0x04136CcF...B4Ad2eae5
0 ETH0.000475285
Feed197500552024-04-27 23:50:35700 days ago1714261835IN
0x04136CcF...B4Ad2eae5
0 ETH0.000475285
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GFFeeder01

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;

import "@openzeppelin/contracts/interfaces/IERC20.sol";

import "./base/BaseFeeder.sol";
import "./interfaces/IxGF.sol";
import "./interfaces/IStakingPoolManager.sol";
import "./SafeToken.sol";

contract GFFeeder01 is BaseFeeder {
  using SafeToken for address;

  struct Snapshot {
    uint112 stakingPoolTvl;
    uint112 xGFTvl;
    uint32 blockNumber;
  }

  uint256 public constant MAX_BIAS = 10000;

  IStakingPoolManager public stakingPoolManager;
  address public stakingPool;

  uint256 public bias = 3000; // 30%

  /// @dev Mapping ( round off timestamp to week => Snapshot ) to keep track of each week snapshot
  mapping(uint256 => Snapshot) public weeklySnapshotOf;

  event MissingSnapshot(uint40 fromBlock, uint40 toBlock);
  event SetBias(uint256 oldBias, uint256 newBias);


  constructor(
    address _stakingPool,
    address _stakingPoolManager,
    address _rewardManager,
    address _rewardSource,
    uint256 _rewardRatePerBlock,
    uint40 _lastRewardBlock,
    uint40 _rewardEndBlock
  ) BaseFeeder(_rewardManager, _rewardSource, _rewardRatePerBlock, _lastRewardBlock, _rewardEndBlock) {
    stakingPoolManager = IStakingPoolManager(_stakingPoolManager);
    stakingPool = _stakingPool;

    require(stakingPoolManager.reward() == rewardManager.rewardToken(), "invalid legacy reward");

    token.safeApprove(_rewardManager, type(uint256).max);
  }

  function stakingPoolTvl() public view returns (uint256) {
    return IERC20(token).balanceOf(stakingPool);
  }

  function xGFTvl() public view returns (uint256) {
    return IxGF(rewardManager.xGF()).supply() + rewardManager.lastTokenBalance();
  }

  function getRate(uint256 timestamp) external view returns (uint256, uint256) {
    uint256 _weekCursor = _timestampToFloorWeek(timestamp);
    return _getRate(weeklySnapshotOf[_weekCursor], rewardRatePerBlock);
  }

  function _feed() override internal  {
    // 1. Feed reward for this week
    Snapshot memory _thisWeekSnapshot = weeklySnapshotOf[_timestampToFloorWeek(block.timestamp)];

    if (_thisWeekSnapshot.blockNumber == 0) {
      // missing a call to snapshot this week, need to fix with inject reward
      emit MissingSnapshot(lastRewardBlock, uint40(block.number));
    } else {
      _updatePools(_thisWeekSnapshot, lastRewardBlock);
    }
    _updateLastRewardBlock(uint40(block.number));
    // 3. Record Snapshot to be used for next week
    _takeSnapshot(_timestampToFloorWeek(block.timestamp + WEEK - 1));
  }

  function _updateLastRewardBlock(uint40 blockNumber) internal {
    uint40 _rewardEndBlock = rewardEndBlock;
    lastRewardBlock = blockNumber > _rewardEndBlock ? _rewardEndBlock : blockNumber;
  }

  function _updatePools(Snapshot memory _snapshot, uint40 _lastRewardBlock) internal {
    (uint256 rate1, uint256 rate2) = _getRate(_snapshot, rewardRatePerBlock);
    _setStakingPoolManagerRate(rate1);
    uint256 _feedAmount = _feedRewardManager(rate2, _lastRewardBlock, block.number);
    emit Feed(_feedAmount);
  }


  function _takeSnapshot(uint256 _weekCursor) internal {
    weeklySnapshotOf[_weekCursor] = Snapshot({
      stakingPoolTvl: uint112(stakingPoolTvl()),
      xGFTvl: uint112(xGFTvl()),
      blockNumber: uint32(block.number)
    });
  }

  function _setStakingPoolManagerRate(uint256 _rate) internal {
    if (stakingPoolManager.rewardPerBlock() == _rate) {
      stakingPoolManager.distributeRewards();
    } else {
      stakingPoolManager.setRewardPerBlock(_rate);
    }
  }

  function _feedRewardManager(
    uint256 _rate,
    uint256 _fromBlock,
    uint256 _toBlock
  ) internal returns (uint256) {
    uint256 blockDelta = _getMultiplier(_fromBlock, _toBlock, rewardEndBlock);
    if (blockDelta == 0) {
      return 0;
    }
    uint256 _toDistribute = _rate * blockDelta;
    if (_toDistribute > 0) {
      token.safeTransferFrom(rewardSource, address(this), _toDistribute);
      rewardManager.feed(_toDistribute);
    }

    return _toDistribute;
  }

  function _getMultiplier(
    uint256 _from,
    uint256 _to,
    uint256 _endBlock
  ) internal pure returns (uint256) {
    if ((_from >= _endBlock) || (_from > _to)) {
      return 0;
    }

    if (_to <= _endBlock) {
      return _to - _from;
    }
    return _endBlock - _from;
  }

  function _getRate(Snapshot memory _snapshot, uint256 _maxRatePerBlock)
    internal
    view
    returns (uint256 rate1, uint256 rate2)
  {
    if (_snapshot.stakingPoolTvl == 0 || _snapshot.xGFTvl == 0) {
      rate1 = 0;
      rate2 = 0;
      return (rate1, rate2);
    }

    uint256 _bias = bias;
    uint256 _adjustedV1Weight = uint256(_snapshot.stakingPoolTvl) * (MAX_BIAS - _bias);
    uint256 _adjustedV2Weight = uint256(_snapshot.xGFTvl) * (MAX_BIAS + _bias);
    uint256 _totalWeight = _adjustedV1Weight + _adjustedV2Weight;

    rate1 = (_maxRatePerBlock * _adjustedV1Weight) / _totalWeight;
    rate2 = (_maxRatePerBlock * _adjustedV2Weight) / _totalWeight;
  }

  function _timestampToFloorWeek(uint256 _timestamp) internal pure returns (uint256) {
    return (_timestamp / WEEK) * WEEK;
  }

  function setBias(uint256 _newBias, bool _distribute) external onlyOwner {
    require(_newBias <= MAX_BIAS, "exceed MAX_BIAS");
    if (_distribute) {
      _feed();
    }

    uint256 _oldBias = bias;
    bias = _newBias;
    emit SetBias(_oldBias, _newBias);
  }

  function injectSnapshot(uint256 _timestamp, Snapshot memory _snapshot) external onlyOwner {
    uint256 _weekCursor = _timestampToFloorWeek(_timestamp);
    weeklySnapshotOf[_weekCursor] = _snapshot;
  }

  function setRewardRatePerBlock(uint256 _newRate) override external onlyOwner {
    // 1. feed
    Snapshot memory _thisWeekSnapshot = weeklySnapshotOf[_timestampToFloorWeek(block.timestamp)];
    require(_thisWeekSnapshot.blockNumber != 0, "!thisWeekSnapshot");
    _updatePools(_thisWeekSnapshot, lastRewardBlock);
    _updateLastRewardBlock(uint40(block.number));
    _takeSnapshot(_timestampToFloorWeek(block.timestamp + WEEK - 1));
    
    // 2. update rate
    uint256 _nextWeekCursor = _timestampToFloorWeek(block.timestamp + WEEK - 1);
    _takeSnapshot(_nextWeekCursor);

    uint256 _prevRate = rewardRatePerBlock;
    rewardRatePerBlock = _newRate;

    // 3. apply new rate to staking pool
    (uint newRate1,) = _getRate(_thisWeekSnapshot, _newRate);
    _setStakingPoolManagerRate(newRate1);

    emit SetNewRewardRatePerBlock(msg.sender, _prevRate, _newRate);
  }
}

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

pragma solidity ^0.8.0;

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

// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;

import "@openzeppelin/contracts/access/Ownable.sol";

import "../interfaces/IRewardManager.sol";

abstract contract BaseFeeder is Ownable {
  /// @dev Time-related constants
  uint256 public constant WEEK = 7 days;

  address public token;
  address public rewardSource;

  IRewardManager public rewardManager;
  uint40 public lastRewardBlock;
  uint40 public rewardEndBlock;

  uint256 public rewardRatePerBlock;

  mapping(address => bool) public whitelistedFeedCallers;

  event Feed(uint256 feedAmount);
  event SetCanDistributeRewards(bool canDistributeRewards);
  event SetNewRewardEndBlock(address indexed caller, uint256 preRewardEndBlock, uint256 newRewardEndBlock);
  event SetNewRewardRatePerBlock(address indexed caller, uint256 prevRate, uint256 newRate);
  event SetNewRewardSource(address indexed caller, address prevSource, address newSource);
  event SetNewRewardManager(address indexed caller, address prevManager, address newManager);
  event SetWhitelistedFeedCaller(address indexed caller, address indexed addr, bool ok);

  constructor(
    address _rewardManager,
    address _rewardSource,
    uint256 _rewardRatePerBlock,
    uint40 _lastRewardBlock,
    uint40 _rewardEndBlock
  ) {
    rewardManager = IRewardManager(_rewardManager);
    token = rewardManager.rewardToken();
    rewardSource = _rewardSource;
    lastRewardBlock = _lastRewardBlock;
    rewardEndBlock = _rewardEndBlock;
    rewardRatePerBlock = _rewardRatePerBlock;
    
    require(_lastRewardBlock < _rewardEndBlock, "bad _lastRewardBlock");
  }

  function feed() external {
    require(whitelistedFeedCallers[msg.sender],"!whitelisted");
    _feed();
  }

  function _feed() virtual internal;

  function setRewardRatePerBlock(uint256 _newRate) virtual external onlyOwner   {
    _feed();
    uint256 _prevRate = rewardRatePerBlock;
    rewardRatePerBlock = _newRate;
    emit SetNewRewardRatePerBlock(msg.sender, _prevRate, _newRate);
  }

  function setRewardEndBlock(uint40 _newRewardEndBlock) external onlyOwner {
    uint40 _prevRewardEndBlock = rewardEndBlock;
    require(_newRewardEndBlock > rewardEndBlock, "!future");
    rewardEndBlock = _newRewardEndBlock;
    emit SetNewRewardEndBlock(msg.sender, _prevRewardEndBlock, _newRewardEndBlock);
  }


  function setRewardSource(address _rewardSource) external onlyOwner {
    address _prevSource = rewardSource;
    rewardSource = _rewardSource;
    emit SetNewRewardSource(msg.sender, _prevSource , _rewardSource);
  }

  function setRewardManager(address _newManager) external onlyOwner {
    address _prevManager = address(rewardManager);
    rewardManager = IRewardManager(_newManager);
    emit SetNewRewardManager(msg.sender, _prevManager, _newManager);
  }

  function setWhitelistedFeedCallers(address[] calldata callers, bool ok) external onlyOwner {
    for (uint256 idx = 0; idx < callers.length; idx++) {
      whitelistedFeedCallers[callers[idx]] = ok;
      emit SetWhitelistedFeedCaller(msg.sender, callers[idx], ok);
    }
  }
}

// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;

struct Point {
  int128 bias; // Voting weight
  int128 slope; // Multiplier factor to get voting weight at a given time
  uint256 timestamp;
  uint256 blockNumber;
}

interface IxGF {
  /// @dev Return the max epoch of the given "_user"
  function userPointEpoch(address _user) external view returns (uint256);

  /// @dev Return the max global epoch
  function epoch() external view returns (uint256);

  /// @dev Return the recorded point for _user at specific _epoch
  function userPointHistory(address _user, uint256 _epoch) external view returns (Point memory);

  /// @dev Return the recorded global point at specific _epoch
  function pointHistory(uint256 _epoch) external view returns (Point memory);

  /// @dev Trigger global check point
  function checkpoint() external;

  function supply() external view returns (uint256);
}

// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;

interface IStakingPoolManager {
  function reward() external view returns (address);

  function rewardPerBlock() external view returns (uint256);
  
  function setRewardPerBlock(uint256 _rewardPerBlock) external;

  function distributeRewards() external;
}

// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;

interface ERC20Interface {
  function balanceOf(address user) external view returns (uint256);
}

library SafeToken {
  function myBalance(address token) internal view returns (uint256) {
    return ERC20Interface(token).balanceOf(address(this));
  }

  function safeTransfer(address token, address to, uint256 value) internal {
    // bytes4(keccak256(bytes('transfer(address,uint256)')));
    // solhint-disable-next-line avoid-low-level-calls
    require(token.code.length > 0, "!contract");
    (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
    require(success && (data.length == 0 || abi.decode(data, (bool))), "!safeTransfer");
  }

  function safeTransferFrom(address token, address from, address to, uint256 value) internal {
    // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
    // solhint-disable-next-line avoid-low-level-calls
    require(token.code.length > 0, "!contract");
    (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
    require(success && (data.length == 0 || abi.decode(data, (bool))), "!safeTransferFrom");
  }

  function safeApprove(address token, address to, uint256 value) internal {
    // bytes4(keccak256(bytes('approve(address,uint256)')));
    require(token.code.length > 0, "!contract");
    (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
    require(success && (data.length == 0 || abi.decode(data, (bool))), "!safeApprove");
  }

  function safeTransferETH(address to, uint256 value) internal {
    // solhint-disable-next-line no-call-value
    (bool success, ) = to.call{ value: value }(new bytes(0));
    require(success, "!safeTransferETH");
  }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `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);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

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() {
        _transferOwnership(_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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;

interface IRewardManager {
  function xGF() external view returns (address);

  function rewardToken() external returns (address);

  function feed(uint256 _amount) external returns (bool);

  function claim(address _for) external returns (uint256);

  function pendingRewardsOf(address _user) external returns (uint256);

  function lastTokenBalance() external view returns (uint256);

  function checkpointToken() external view returns (uint256);
}

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

pragma solidity ^0.8.0;

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

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

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_stakingPool","type":"address"},{"internalType":"address","name":"_stakingPoolManager","type":"address"},{"internalType":"address","name":"_rewardManager","type":"address"},{"internalType":"address","name":"_rewardSource","type":"address"},{"internalType":"uint256","name":"_rewardRatePerBlock","type":"uint256"},{"internalType":"uint40","name":"_lastRewardBlock","type":"uint40"},{"internalType":"uint40","name":"_rewardEndBlock","type":"uint40"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feedAmount","type":"uint256"}],"name":"Feed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint40","name":"fromBlock","type":"uint40"},{"indexed":false,"internalType":"uint40","name":"toBlock","type":"uint40"}],"name":"MissingSnapshot","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":false,"internalType":"uint256","name":"oldBias","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBias","type":"uint256"}],"name":"SetBias","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"canDistributeRewards","type":"bool"}],"name":"SetCanDistributeRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"preRewardEndBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRewardEndBlock","type":"uint256"}],"name":"SetNewRewardEndBlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"address","name":"prevManager","type":"address"},{"indexed":false,"internalType":"address","name":"newManager","type":"address"}],"name":"SetNewRewardManager","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"prevRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"SetNewRewardRatePerBlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"address","name":"prevSource","type":"address"},{"indexed":false,"internalType":"address","name":"newSource","type":"address"}],"name":"SetNewRewardSource","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"bool","name":"ok","type":"bool"}],"name":"SetWhitelistedFeedCaller","type":"event"},{"inputs":[],"name":"MAX_BIAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WEEK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bias","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"components":[{"internalType":"uint112","name":"stakingPoolTvl","type":"uint112"},{"internalType":"uint112","name":"xGFTvl","type":"uint112"},{"internalType":"uint32","name":"blockNumber","type":"uint32"}],"internalType":"struct GFFeeder01.Snapshot","name":"_snapshot","type":"tuple"}],"name":"injectSnapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastRewardBlock","outputs":[{"internalType":"uint40","name":"","type":"uint40"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardEndBlock","outputs":[{"internalType":"uint40","name":"","type":"uint40"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardManager","outputs":[{"internalType":"contract IRewardManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRatePerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardSource","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newBias","type":"uint256"},{"internalType":"bool","name":"_distribute","type":"bool"}],"name":"setBias","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint40","name":"_newRewardEndBlock","type":"uint40"}],"name":"setRewardEndBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newManager","type":"address"}],"name":"setRewardManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newRate","type":"uint256"}],"name":"setRewardRatePerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardSource","type":"address"}],"name":"setRewardSource","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"callers","type":"address[]"},{"internalType":"bool","name":"ok","type":"bool"}],"name":"setWhitelistedFeedCallers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingPoolManager","outputs":[{"internalType":"contract IStakingPoolManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingPoolTvl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"weeklySnapshotOf","outputs":[{"internalType":"uint112","name":"stakingPoolTvl","type":"uint112"},{"internalType":"uint112","name":"xGFTvl","type":"uint112"},{"internalType":"uint32","name":"blockNumber","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistedFeedCallers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"xGFTvl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604052610bb86008553480156200001757600080fd5b5060405162002006380380620020068339810160408190526200003a916200051d565b84848484846200004a336200033e565b600380546001600160a01b0319166001600160a01b0387169081179091556040805163f7c618c160e01b8152905163f7c618c19160048082019260209290919082900301816000875af1158015620000a6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000cc9190620005a9565b600180546001600160a01b03199081166001600160a01b03938416179091556002805490911691861691909117905560038054600160a01b600160f01b031916600160a01b64ffffffffff85811691820264ffffffffff60c81b191692909217600160c81b92851692830217909255600485905511620001935760405162461bcd60e51b815260206004820152601460248201527f626164205f6c617374526577617264426c6f636b00000000000000000000000060448201526064015b60405180910390fd5b5050600680546001600160a01b03808c166001600160a01b031992831617909255600780548d841692169190911790556003546040805163f7c618c160e01b8152905191909216945063f7c618c193506004808301935060209282900301816000875af115801562000209573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022f9190620005a9565b6001600160a01b0316600660009054906101000a90046001600160a01b03166001600160a01b031663228cb7336040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200028c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b29190620005a9565b6001600160a01b0316146200030a5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206c656761637920726577617264000000000000000000000060448201526064016200018a565b60015462000331906001600160a01b0316866000196200038e602090811b62000da217901c565b5050505050505062000630565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000836001600160a01b03163b11620003d65760405162461bcd60e51b81526020600482015260096024820152680858dbdb9d1c9858dd60ba1b60448201526064016200018a565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b1790529151600092839290871691620004349190620005ce565b6000604051808303816000865af19150503d806000811462000473576040519150601f19603f3d011682016040523d82523d6000602084013e62000478565b606091505b5091509150818015620004a6575080511580620004a6575080806020019051810190620004a691906200060c565b620004e35760405162461bcd60e51b815260206004820152600c60248201526b2173616665417070726f766560a01b60448201526064016200018a565b5050505050565b80516001600160a01b03811681146200050257600080fd5b919050565b805164ffffffffff811681146200050257600080fd5b600080600080600080600060e0888a0312156200053957600080fd5b6200054488620004ea565b96506200055460208901620004ea565b95506200056460408901620004ea565b94506200057460608901620004ea565b9350608088015192506200058b60a0890162000507565b91506200059b60c0890162000507565b905092959891949750929550565b600060208284031215620005bc57600080fd5b620005c782620004ea565b9392505050565b6000825160005b81811015620005f15760208186018101518583015201620005d5565b8181111562000601576000828501525b509190910192915050565b6000602082840312156200061f57600080fd5b81518015158114620005c757600080fd5b6119c680620006406000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c806373568dc3116100f9578063b2f196f611610097578063f15e683e11610071578063f15e683e146103f6578063f2fde38b14610409578063f4359ce51461041c578063fc0c546a1461042657600080fd5b8063b2f196f6146103bd578063b619691a146103d0578063d600af40146103e357600080fd5b80638f05f844116100d35780638f05f8441461035657806390870492146103895780639cfbc00214610392578063a9f8d181146103a557600080fd5b806373568dc3146103295780637b8d2be01461033c5780638da5cb5b1461034557600080fd5b806337a7b7d8116101665780635776409411610140578063577640941461025b578063604ef2e514610283578063628d24cd146102b1578063715018a61461032157600080fd5b806337a7b7d81461023857806344aac9a71461024057806349e9a2891461025357600080fd5b8063054816cc146101ae5780630c56ae3b146101ca5780630f4ef8a6146101f5578063153ee554146102085780631d3257e21461021d57806321f3640314610230575b600080fd5b6101b760085481565b6040519081526020015b60405180910390f35b6007546101dd906001600160a01b031681565b6040516001600160a01b0390911681526020016101c1565b6003546101dd906001600160a01b031681565b61021b610216366004611634565b610439565b005b61021b61022b36600461165f565b6104d0565b6101b76105e6565b61021b61073b565b61021b61024e366004611634565b610793565b6101b7610819565b61026e6102693660046116e5565b61088e565b604080519283526020830191909152016101c1565b60035461029b90600160c81b900464ffffffffff1681565b60405164ffffffffff90911681526020016101c1565b6102f56102bf3660046116e5565b6009602052600090815260409020546001600160701b0380821691600160701b810490911690600160e01b900463ffffffff1683565b604080516001600160701b03948516815293909216602084015263ffffffff16908201526060016101c1565b61021b610902565b61021b61033736600461171a565b610936565b6101b761271081565b6000546001600160a01b03166101dd565b610379610364366004611634565b60056020526000908152604090205460ff1681565b60405190151581526020016101c1565b6101b760045481565b6002546101dd906001600160a01b031681565b60035461029b90600160a01b900464ffffffffff1681565b61021b6103cb3660046116e5565b6109d3565b61021b6103de3660046117bf565b610b6b565b6006546101dd906001600160a01b031681565b61021b6104043660046117ef565b610c2d565b61021b610417366004611634565b610d07565b6101b762093a8081565b6001546101dd906001600160a01b031681565b6000546001600160a01b0316331461046c5760405162461bcd60e51b815260040161046390611816565b60405180910390fd5b600380546001600160a01b038381166001600160a01b0319831681179093556040805191909216808252602082019390935233917f5915dd0ceab51d6f9250fe2c8e9407fdc9107e17dc9b5ab0b0e5ff8db1859e1c91015b60405180910390a25050565b6000546001600160a01b031633146104fa5760405162461bcd60e51b815260040161046390611816565b60005b828110156105e057816005600086868581811061051c5761051c61184b565b90506020020160208101906105319190611634565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905583838281811061056b5761056b61184b565b90506020020160208101906105809190611634565b6001600160a01b0316336001600160a01b03167f3e04bad06656d11b5a65d510d72748a09e347ec2f41fe2ad195013d0c4f25cf2846040516105c6911515815260200190565b60405180910390a3806105d881611877565b9150506104fd565b50505050565b6003546040805163862a9f2f60e01b815290516000926001600160a01b03169163862a9f2f9160048083019260209291908290030181865afa158015610630573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106549190611892565b600360009054906101000a90046001600160a01b03166001600160a01b031663f5fdaba26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106cb91906118ab565b6001600160a01b031663047fc9aa6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610708573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072c9190611892565b61073691906118c8565b905090565b3360009081526005602052604090205460ff166107895760405162461bcd60e51b815260206004820152600c60248201526b085dda1a5d195b1a5cdd195960a21b6044820152606401610463565b610791610ef2565b565b6000546001600160a01b031633146107bd5760405162461bcd60e51b815260040161046390611816565b600280546001600160a01b038381166001600160a01b0319831681179093556040805191909216808252602082019390935233917fe5ea988bce75d719b93c6766991c2ec43296f472964e908e7c7585b9567eef2491016104c4565b6001546007546040516370a0823160e01b81526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa15801561086a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107369190611892565b600080600061089c84610fe0565b600081815260096020908152604091829020825160608101845290546001600160701b038082168352600160701b82041692820192909252600160e01b90910463ffffffff16918101919091526004549192506108f891611000565b9250925050915091565b6000546001600160a01b0316331461092c5760405162461bcd60e51b815260040161046390611816565b61079160006110cf565b6000546001600160a01b031633146109605760405162461bcd60e51b815260040161046390611816565b600061096b83610fe0565b6000908152600960209081526040918290208451815492860151939095015163ffffffff16600160e01b026001600160e01b036001600160701b03948516600160701b026001600160e01b031990941694909616939093179190911793909316179091555050565b6000546001600160a01b031633146109fd5760405162461bcd60e51b815260040161046390611816565b600060096000610a0c42610fe0565b81526020808201929092526040908101600020815160608101835290546001600160701b038082168352600160701b82041693820193909352600160e01b90920463ffffffff16908201819052909150610a9c5760405162461bcd60e51b8152602060048201526011602482015270085d1a1a5cd5d9595ad4db985c1cda1bdd607a1b6044820152606401610463565b600354610ab8908290600160a01b900464ffffffffff1661111f565b610ac143611191565b610aea610ae56001610ad662093a80426118c8565b610ae091906118e0565b610fe0565b6111db565b6000610afe6001610ad662093a80426118c8565b9050610b09816111db565b60048054908490556000610b1d8486611000565b509050610b2981611276565b604080518381526020810187905233917fe2d585ca44df8b3a1162faf72c4db2ff738e95fcf1006995bd75d781b187fa27910160405180910390a25050505050565b6000546001600160a01b03163314610b955760405162461bcd60e51b815260040161046390611816565b612710821115610bd95760405162461bcd60e51b815260206004820152600f60248201526e657863656564204d41585f4249415360881b6044820152606401610463565b8015610be757610be7610ef2565b600880549083905560408051828152602081018590527f67f4724377be925ea349f77530d1018be9089fd01377d3a882fc804a9aefb0bf910160405180910390a1505050565b6000546001600160a01b03163314610c575760405162461bcd60e51b815260040161046390611816565b60035464ffffffffff600160c81b90910481169082168110610ca55760405162461bcd60e51b81526020600482015260076024820152662166757475726560c81b6044820152606401610463565b6003805464ffffffffff60c81b1916600160c81b64ffffffffff85811691820292909217909255604080519184168252602082019290925233917fbf5a0a0875eaa2b61c067a17ac1b69a307917fefec902ea7d469ff3082b6204091016104c4565b6000546001600160a01b03163314610d315760405162461bcd60e51b815260040161046390611816565b6001600160a01b038116610d965760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610463565b610d9f816110cf565b50565b6000836001600160a01b03163b11610de85760405162461bcd60e51b81526020600482015260096024820152680858dbdb9d1c9858dd60ba1b6044820152606401610463565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b1790529151600092839290871691610e4491906118f7565b6000604051808303816000865af19150503d8060008114610e81576040519150601f19603f3d011682016040523d82523d6000602084013e610e86565b606091505b5091509150818015610eb0575080511580610eb0575080806020019051810190610eb09190611932565b610eeb5760405162461bcd60e51b815260206004820152600c60248201526b2173616665417070726f766560a01b6044820152606401610463565b5050505050565b600060096000610f0142610fe0565b81526020808201929092526040908101600020815160608101835290546001600160701b038082168352600160701b82041693820193909352600160e01b90920463ffffffff16908201819052909150610fa65760035460408051600160a01b90920464ffffffffff9081168352431660208301527f39f637ee8ed5afb0722c78c3202eb9485f5127e42c6e1f5e4c097483d375194c910160405180910390a1610fc2565b600354610fc2908290600160a01b900464ffffffffff1661111f565b610fcb43611191565b610d9f610ae56001610ad662093a80426118c8565b600062093a80610ff0818461194f565b610ffa9190611971565b92915050565b815160009081906001600160701b03161580611027575060208401516001600160701b0316155b15611037575060009050806110c8565b6008546000611048826127106118e0565b865161105d91906001600160701b0316611971565b9050600061106d836127106118c8565b87602001516001600160701b03166110859190611971565b9050600061109382846118c8565b9050806110a08489611971565b6110aa919061194f565b9550806110b78389611971565b6110c1919061194f565b9450505050505b9250929050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008061112e84600454611000565b9150915061113b82611276565b600061114f828564ffffffffff1643611393565b90507faee7b00ca0359ab0727fb54b350e15a1ed46fb12dc0d04ca9bb5f4e7c313249a8160405161118291815260200190565b60405180910390a15050505050565b60035464ffffffffff600160c81b909104811690821681106111b357816111b5565b805b600360146101000a81548164ffffffffff021916908364ffffffffff1602179055505050565b60405180606001604052806111ee610819565b6001600160701b031681526020016112046105e6565b6001600160701b03908116825263ffffffff43811660209384015260009485526009835260409485902084518154948601519590960151909116600160e01b026001600160e01b03948316600160701b026001600160e01b031990941695909216949094179190911791909116179055565b600654604080516322b8e72b60e21b8152905183926001600160a01b031691638ae39cac9160048083019260209291908290030181865afa1580156112bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e39190611892565b141561134d57600660009054906101000a90046001600160a01b03166001600160a01b0316636f4a2cd06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561133957600080fd5b505af1158015610eeb573d6000803e3d6000fd5b600654604051635dc395a560e11b8152600481018390526001600160a01b039091169063bb872b4a90602401600060405180830381600087803b15801561133957600080fd5b6000806113bb8484600360199054906101000a900464ffffffffff1664ffffffffff1661147a565b9050806113cc576000915050611473565b60006113d88287611971565b9050801561146f576002546001546113fe916001600160a01b03918216911630846114c1565b60035460405163f59dfdfb60e01b8152600481018390526001600160a01b039091169063f59dfdfb906024016020604051808303816000875af1158015611449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146d9190611932565b505b9150505b9392505050565b6000818410158061148a57508284115b1561149757506000611473565b8183116114af576114a884846118e0565b9050611473565b6114b984836118e0565b949350505050565b6000846001600160a01b03163b116115075760405162461bcd60e51b81526020600482015260096024820152680858dbdb9d1c9858dd60ba1b6044820152606401610463565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161156b91906118f7565b6000604051808303816000865af19150503d80600081146115a8576040519150601f19603f3d011682016040523d82523d6000602084013e6115ad565b606091505b50915091508180156115d75750805115806115d75750808060200190518101906115d79190611932565b6116175760405162461bcd60e51b815260206004820152601160248201527021736166655472616e7366657246726f6d60781b6044820152606401610463565b505050505050565b6001600160a01b0381168114610d9f57600080fd5b60006020828403121561164657600080fd5b81356114738161161f565b8015158114610d9f57600080fd5b60008060006040848603121561167457600080fd5b833567ffffffffffffffff8082111561168c57600080fd5b818601915086601f8301126116a057600080fd5b8135818111156116af57600080fd5b8760208260051b85010111156116c457600080fd5b602092830195509350508401356116da81611651565b809150509250925092565b6000602082840312156116f757600080fd5b5035919050565b80356001600160701b038116811461171557600080fd5b919050565b600080828403608081121561172e57600080fd5b833592506060601f198201121561174457600080fd5b506040516060810181811067ffffffffffffffff8211171561177657634e487b7160e01b600052604160045260246000fd5b604052611785602085016116fe565b8152611793604085016116fe565b6020820152606084013563ffffffff811681146117af57600080fd5b6040820152919491935090915050565b600080604083850312156117d257600080fd5b8235915060208301356117e481611651565b809150509250929050565b60006020828403121561180157600080fd5b813564ffffffffff8116811461147357600080fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561188b5761188b611861565b5060010190565b6000602082840312156118a457600080fd5b5051919050565b6000602082840312156118bd57600080fd5b81516114738161161f565b600082198211156118db576118db611861565b500190565b6000828210156118f2576118f2611861565b500390565b6000825160005b8181101561191857602081860181015185830152016118fe565b81811115611927576000828501525b509190910192915050565b60006020828403121561194457600080fd5b815161147381611651565b60008261196c57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561198b5761198b611861565b50029056fea2646970667358221220ca307db0e7b75caac1eee5e22f686a0502399c18d5b9d14f54181f7b1dc7a09d64736f6c634300080a0033000000000000000000000000c747f9d3e6b34596977e79f09a2ab122042673e100000000000000000000000061030d2d0106ee3b1251642b098f3da2b781b55600000000000000000000000026034cc54f92ca04400d84bc1b9e09a1d8ba8a11000000000000000000000000e86fb860e8fcc93e05db3d4386d4e20bc9e9f0570000000000000000000000000000000000000000000000002f86d3e1fe21dcee0000000000000000000000000000000000000000000000000000000000fc3b1800000000000000000000000000000000000000000000000000000000012225c0

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101a95760003560e01c806373568dc3116100f9578063b2f196f611610097578063f15e683e11610071578063f15e683e146103f6578063f2fde38b14610409578063f4359ce51461041c578063fc0c546a1461042657600080fd5b8063b2f196f6146103bd578063b619691a146103d0578063d600af40146103e357600080fd5b80638f05f844116100d35780638f05f8441461035657806390870492146103895780639cfbc00214610392578063a9f8d181146103a557600080fd5b806373568dc3146103295780637b8d2be01461033c5780638da5cb5b1461034557600080fd5b806337a7b7d8116101665780635776409411610140578063577640941461025b578063604ef2e514610283578063628d24cd146102b1578063715018a61461032157600080fd5b806337a7b7d81461023857806344aac9a71461024057806349e9a2891461025357600080fd5b8063054816cc146101ae5780630c56ae3b146101ca5780630f4ef8a6146101f5578063153ee554146102085780631d3257e21461021d57806321f3640314610230575b600080fd5b6101b760085481565b6040519081526020015b60405180910390f35b6007546101dd906001600160a01b031681565b6040516001600160a01b0390911681526020016101c1565b6003546101dd906001600160a01b031681565b61021b610216366004611634565b610439565b005b61021b61022b36600461165f565b6104d0565b6101b76105e6565b61021b61073b565b61021b61024e366004611634565b610793565b6101b7610819565b61026e6102693660046116e5565b61088e565b604080519283526020830191909152016101c1565b60035461029b90600160c81b900464ffffffffff1681565b60405164ffffffffff90911681526020016101c1565b6102f56102bf3660046116e5565b6009602052600090815260409020546001600160701b0380821691600160701b810490911690600160e01b900463ffffffff1683565b604080516001600160701b03948516815293909216602084015263ffffffff16908201526060016101c1565b61021b610902565b61021b61033736600461171a565b610936565b6101b761271081565b6000546001600160a01b03166101dd565b610379610364366004611634565b60056020526000908152604090205460ff1681565b60405190151581526020016101c1565b6101b760045481565b6002546101dd906001600160a01b031681565b60035461029b90600160a01b900464ffffffffff1681565b61021b6103cb3660046116e5565b6109d3565b61021b6103de3660046117bf565b610b6b565b6006546101dd906001600160a01b031681565b61021b6104043660046117ef565b610c2d565b61021b610417366004611634565b610d07565b6101b762093a8081565b6001546101dd906001600160a01b031681565b6000546001600160a01b0316331461046c5760405162461bcd60e51b815260040161046390611816565b60405180910390fd5b600380546001600160a01b038381166001600160a01b0319831681179093556040805191909216808252602082019390935233917f5915dd0ceab51d6f9250fe2c8e9407fdc9107e17dc9b5ab0b0e5ff8db1859e1c91015b60405180910390a25050565b6000546001600160a01b031633146104fa5760405162461bcd60e51b815260040161046390611816565b60005b828110156105e057816005600086868581811061051c5761051c61184b565b90506020020160208101906105319190611634565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905583838281811061056b5761056b61184b565b90506020020160208101906105809190611634565b6001600160a01b0316336001600160a01b03167f3e04bad06656d11b5a65d510d72748a09e347ec2f41fe2ad195013d0c4f25cf2846040516105c6911515815260200190565b60405180910390a3806105d881611877565b9150506104fd565b50505050565b6003546040805163862a9f2f60e01b815290516000926001600160a01b03169163862a9f2f9160048083019260209291908290030181865afa158015610630573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106549190611892565b600360009054906101000a90046001600160a01b03166001600160a01b031663f5fdaba26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106cb91906118ab565b6001600160a01b031663047fc9aa6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610708573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072c9190611892565b61073691906118c8565b905090565b3360009081526005602052604090205460ff166107895760405162461bcd60e51b815260206004820152600c60248201526b085dda1a5d195b1a5cdd195960a21b6044820152606401610463565b610791610ef2565b565b6000546001600160a01b031633146107bd5760405162461bcd60e51b815260040161046390611816565b600280546001600160a01b038381166001600160a01b0319831681179093556040805191909216808252602082019390935233917fe5ea988bce75d719b93c6766991c2ec43296f472964e908e7c7585b9567eef2491016104c4565b6001546007546040516370a0823160e01b81526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa15801561086a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107369190611892565b600080600061089c84610fe0565b600081815260096020908152604091829020825160608101845290546001600160701b038082168352600160701b82041692820192909252600160e01b90910463ffffffff16918101919091526004549192506108f891611000565b9250925050915091565b6000546001600160a01b0316331461092c5760405162461bcd60e51b815260040161046390611816565b61079160006110cf565b6000546001600160a01b031633146109605760405162461bcd60e51b815260040161046390611816565b600061096b83610fe0565b6000908152600960209081526040918290208451815492860151939095015163ffffffff16600160e01b026001600160e01b036001600160701b03948516600160701b026001600160e01b031990941694909616939093179190911793909316179091555050565b6000546001600160a01b031633146109fd5760405162461bcd60e51b815260040161046390611816565b600060096000610a0c42610fe0565b81526020808201929092526040908101600020815160608101835290546001600160701b038082168352600160701b82041693820193909352600160e01b90920463ffffffff16908201819052909150610a9c5760405162461bcd60e51b8152602060048201526011602482015270085d1a1a5cd5d9595ad4db985c1cda1bdd607a1b6044820152606401610463565b600354610ab8908290600160a01b900464ffffffffff1661111f565b610ac143611191565b610aea610ae56001610ad662093a80426118c8565b610ae091906118e0565b610fe0565b6111db565b6000610afe6001610ad662093a80426118c8565b9050610b09816111db565b60048054908490556000610b1d8486611000565b509050610b2981611276565b604080518381526020810187905233917fe2d585ca44df8b3a1162faf72c4db2ff738e95fcf1006995bd75d781b187fa27910160405180910390a25050505050565b6000546001600160a01b03163314610b955760405162461bcd60e51b815260040161046390611816565b612710821115610bd95760405162461bcd60e51b815260206004820152600f60248201526e657863656564204d41585f4249415360881b6044820152606401610463565b8015610be757610be7610ef2565b600880549083905560408051828152602081018590527f67f4724377be925ea349f77530d1018be9089fd01377d3a882fc804a9aefb0bf910160405180910390a1505050565b6000546001600160a01b03163314610c575760405162461bcd60e51b815260040161046390611816565b60035464ffffffffff600160c81b90910481169082168110610ca55760405162461bcd60e51b81526020600482015260076024820152662166757475726560c81b6044820152606401610463565b6003805464ffffffffff60c81b1916600160c81b64ffffffffff85811691820292909217909255604080519184168252602082019290925233917fbf5a0a0875eaa2b61c067a17ac1b69a307917fefec902ea7d469ff3082b6204091016104c4565b6000546001600160a01b03163314610d315760405162461bcd60e51b815260040161046390611816565b6001600160a01b038116610d965760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610463565b610d9f816110cf565b50565b6000836001600160a01b03163b11610de85760405162461bcd60e51b81526020600482015260096024820152680858dbdb9d1c9858dd60ba1b6044820152606401610463565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b1790529151600092839290871691610e4491906118f7565b6000604051808303816000865af19150503d8060008114610e81576040519150601f19603f3d011682016040523d82523d6000602084013e610e86565b606091505b5091509150818015610eb0575080511580610eb0575080806020019051810190610eb09190611932565b610eeb5760405162461bcd60e51b815260206004820152600c60248201526b2173616665417070726f766560a01b6044820152606401610463565b5050505050565b600060096000610f0142610fe0565b81526020808201929092526040908101600020815160608101835290546001600160701b038082168352600160701b82041693820193909352600160e01b90920463ffffffff16908201819052909150610fa65760035460408051600160a01b90920464ffffffffff9081168352431660208301527f39f637ee8ed5afb0722c78c3202eb9485f5127e42c6e1f5e4c097483d375194c910160405180910390a1610fc2565b600354610fc2908290600160a01b900464ffffffffff1661111f565b610fcb43611191565b610d9f610ae56001610ad662093a80426118c8565b600062093a80610ff0818461194f565b610ffa9190611971565b92915050565b815160009081906001600160701b03161580611027575060208401516001600160701b0316155b15611037575060009050806110c8565b6008546000611048826127106118e0565b865161105d91906001600160701b0316611971565b9050600061106d836127106118c8565b87602001516001600160701b03166110859190611971565b9050600061109382846118c8565b9050806110a08489611971565b6110aa919061194f565b9550806110b78389611971565b6110c1919061194f565b9450505050505b9250929050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008061112e84600454611000565b9150915061113b82611276565b600061114f828564ffffffffff1643611393565b90507faee7b00ca0359ab0727fb54b350e15a1ed46fb12dc0d04ca9bb5f4e7c313249a8160405161118291815260200190565b60405180910390a15050505050565b60035464ffffffffff600160c81b909104811690821681106111b357816111b5565b805b600360146101000a81548164ffffffffff021916908364ffffffffff1602179055505050565b60405180606001604052806111ee610819565b6001600160701b031681526020016112046105e6565b6001600160701b03908116825263ffffffff43811660209384015260009485526009835260409485902084518154948601519590960151909116600160e01b026001600160e01b03948316600160701b026001600160e01b031990941695909216949094179190911791909116179055565b600654604080516322b8e72b60e21b8152905183926001600160a01b031691638ae39cac9160048083019260209291908290030181865afa1580156112bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e39190611892565b141561134d57600660009054906101000a90046001600160a01b03166001600160a01b0316636f4a2cd06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561133957600080fd5b505af1158015610eeb573d6000803e3d6000fd5b600654604051635dc395a560e11b8152600481018390526001600160a01b039091169063bb872b4a90602401600060405180830381600087803b15801561133957600080fd5b6000806113bb8484600360199054906101000a900464ffffffffff1664ffffffffff1661147a565b9050806113cc576000915050611473565b60006113d88287611971565b9050801561146f576002546001546113fe916001600160a01b03918216911630846114c1565b60035460405163f59dfdfb60e01b8152600481018390526001600160a01b039091169063f59dfdfb906024016020604051808303816000875af1158015611449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146d9190611932565b505b9150505b9392505050565b6000818410158061148a57508284115b1561149757506000611473565b8183116114af576114a884846118e0565b9050611473565b6114b984836118e0565b949350505050565b6000846001600160a01b03163b116115075760405162461bcd60e51b81526020600482015260096024820152680858dbdb9d1c9858dd60ba1b6044820152606401610463565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161156b91906118f7565b6000604051808303816000865af19150503d80600081146115a8576040519150601f19603f3d011682016040523d82523d6000602084013e6115ad565b606091505b50915091508180156115d75750805115806115d75750808060200190518101906115d79190611932565b6116175760405162461bcd60e51b815260206004820152601160248201527021736166655472616e7366657246726f6d60781b6044820152606401610463565b505050505050565b6001600160a01b0381168114610d9f57600080fd5b60006020828403121561164657600080fd5b81356114738161161f565b8015158114610d9f57600080fd5b60008060006040848603121561167457600080fd5b833567ffffffffffffffff8082111561168c57600080fd5b818601915086601f8301126116a057600080fd5b8135818111156116af57600080fd5b8760208260051b85010111156116c457600080fd5b602092830195509350508401356116da81611651565b809150509250925092565b6000602082840312156116f757600080fd5b5035919050565b80356001600160701b038116811461171557600080fd5b919050565b600080828403608081121561172e57600080fd5b833592506060601f198201121561174457600080fd5b506040516060810181811067ffffffffffffffff8211171561177657634e487b7160e01b600052604160045260246000fd5b604052611785602085016116fe565b8152611793604085016116fe565b6020820152606084013563ffffffff811681146117af57600080fd5b6040820152919491935090915050565b600080604083850312156117d257600080fd5b8235915060208301356117e481611651565b809150509250929050565b60006020828403121561180157600080fd5b813564ffffffffff8116811461147357600080fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561188b5761188b611861565b5060010190565b6000602082840312156118a457600080fd5b5051919050565b6000602082840312156118bd57600080fd5b81516114738161161f565b600082198211156118db576118db611861565b500190565b6000828210156118f2576118f2611861565b500390565b6000825160005b8181101561191857602081860181015185830152016118fe565b81811115611927576000828501525b509190910192915050565b60006020828403121561194457600080fd5b815161147381611651565b60008261196c57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561198b5761198b611861565b50029056fea2646970667358221220ca307db0e7b75caac1eee5e22f686a0502399c18d5b9d14f54181f7b1dc7a09d64736f6c634300080a0033

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

000000000000000000000000c747f9d3e6b34596977e79f09a2ab122042673e100000000000000000000000061030d2d0106ee3b1251642b098f3da2b781b55600000000000000000000000026034cc54f92ca04400d84bc1b9e09a1d8ba8a11000000000000000000000000e86fb860e8fcc93e05db3d4386d4e20bc9e9f0570000000000000000000000000000000000000000000000002f86d3e1fe21dcee0000000000000000000000000000000000000000000000000000000000fc3b1800000000000000000000000000000000000000000000000000000000012225c0

-----Decoded View---------------
Arg [0] : _stakingPool (address): 0xc747F9D3E6B34596977e79F09a2aB122042673E1
Arg [1] : _stakingPoolManager (address): 0x61030D2D0106Ee3b1251642b098F3dA2b781B556
Arg [2] : _rewardManager (address): 0x26034cC54f92cA04400D84BC1B9E09A1D8Ba8A11
Arg [3] : _rewardSource (address): 0xe86Fb860e8FcC93E05db3D4386d4E20Bc9E9F057
Arg [4] : _rewardRatePerBlock (uint256): 3424657534246575342
Arg [5] : _lastRewardBlock (uint40): 16530200
Arg [6] : _rewardEndBlock (uint40): 19015104

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000c747f9d3e6b34596977e79f09a2ab122042673e1
Arg [1] : 00000000000000000000000061030d2d0106ee3b1251642b098f3da2b781b556
Arg [2] : 00000000000000000000000026034cc54f92ca04400d84bc1b9e09a1d8ba8a11
Arg [3] : 000000000000000000000000e86fb860e8fcc93e05db3d4386d4e20bc9e9f057
Arg [4] : 0000000000000000000000000000000000000000000000002f86d3e1fe21dcee
Arg [5] : 0000000000000000000000000000000000000000000000000000000000fc3b18
Arg [6] : 00000000000000000000000000000000000000000000000000000000012225c0


Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.