Contract 0xc172c84587bea6d593269bfe08632bf2da2bc0f6 4

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x0009f764fbf448951c3c087f2ca7d6793ad9a2ad1eb088cd86a0ff3979fb0c12Get Reward232377242022-12-05 8:45:024 mins ago0x103ecf9566843f09597fe8f975588452d887a7b8 IN  0xc172c84587bea6d593269bfe08632bf2da2bc0f60 AVAX0.004929 30
0x2ece6c2f07f5dc22dc40968c86af3c7b94e90251c3c086327afaa6ff7cdbeb20Get Reward232376862022-12-05 8:43:436 mins ago0x4c5422270018177dd731bcb38aeaaeb86c730e1a IN  0xc172c84587bea6d593269bfe08632bf2da2bc0f60 AVAX0.0071948730
0xc125a7de6967f24bf26921b7b17954352b91ec915795c649f0748dc8f59bc435Get Reward232370672022-12-05 8:22:1127 mins ago0x870856d10bff4308fb549b3fef00163112c0bf3b IN  0xc172c84587bea6d593269bfe08632bf2da2bc0f60 AVAX0.004929 30
0x1bd31f74c92af0d633b027c04b6a6666091a957d97597830f36f773fa6934f84Get Reward232369982022-12-05 8:19:4230 mins ago0x9420c3eb183a218f18156a289e0a4e4d7decd24a IN  0xc172c84587bea6d593269bfe08632bf2da2bc0f60 AVAX0.00548075727
0x65dbb2dc545737bcffa38ba959791978175cdd40b60385127c9d8a6528e4b091Get Reward232369482022-12-05 8:18:0131 mins ago0xc3d631a2c1a31c5671c16db450945555f3ab0774 IN  0xc172c84587bea6d593269bfe08632bf2da2bc0f60 AVAX0.004929 30
0x552669a1558dc7c25214a1013e86b31e528c7e341937933e4f9974745bada985Get Reward232365642022-12-05 8:04:5044 mins ago0x1c9dc8321e8751fc94ead58e52de4038eed4b208 IN  0xc172c84587bea6d593269bfe08632bf2da2bc0f60 AVAX0.00604359 30
0xbc62c57ed73a39921b2907d51afb53a918fc999ddb36bd05c2ac716cfc8eef99Get Reward232365452022-12-05 8:04:1245 mins ago0xe5630bb90639c5a55deab38cc6bad0c9d7ea80a2 IN  0xc172c84587bea6d593269bfe08632bf2da2bc0f60 AVAX0.004929 30
0xcb937dee3300c1bf17aade81ed101c83e9ed19fa3fd3ab5f33052827c7afcabbGet Reward232361882022-12-05 7:51:5857 mins ago0x80e57320ee6eb682eede08f9f2d7d94dbda606cf IN  0xc172c84587bea6d593269bfe08632bf2da2bc0f60 AVAX0.005442 30
0x96826be69484d71fa925f99ceea7fb068ca7440bf5b83abc5662be5deeec7dd9Get Reward232359792022-12-05 7:44:551 hr 4 mins ago0xca4effac52943fdc9504bc30fb2a825eaed1a381 IN  0xc172c84587bea6d593269bfe08632bf2da2bc0f60 AVAX0.00997374 30
0xb4ac0607011d30d48ad201dfaa86c0c063b1e70681a06bcbc34cec94220e360aGet Reward232350462022-12-05 7:12:341 hr 37 mins ago0x55b675fc360714d6cee43a58eb05673339d7ba36 IN  0xc172c84587bea6d593269bfe08632bf2da2bc0f60 AVAX0.005442 30
0xea8efaf04ac1bee14a2247eb2ede76ea55f62493c56f85b6a60f476d61b8c68dWithdraw232350412022-12-05 7:12:241 hr 37 mins ago0x5979cb3110f1ebf7734894d8eb6c3cbb223922df IN  0xc172c84587bea6d593269bfe08632bf2da2bc0f60 AVAX0.00375369 30
0x6ce28f52f2db7a63a4e751e7f1dd936894b2c48180478ee98e6da307f0d76fecWithdraw232350382022-12-05 7:12:151 hr 37 mins ago0x5979cb3110f1ebf7734894d8eb6c3cbb223922df IN  0xc172c84587bea6d593269bfe08632bf2da2bc0f60 AVAX0.00496779 30
0x1bec1e4da5c96d18ff1334fc0d669147446077ada8762e5a85bc0fbbe493836fStake232350222022-12-05 7:11:371 hr 38 mins ago0x937bcfb0acabc675c7d4c6e21433eb50f80ca47c IN  0xc172c84587bea6d593269bfe08632bf2da2bc0f60 AVAX0.00527796 30
0x1e84f622c178b08ded26c8611f62c981b25d633b7cbe24553e22a62a9260cb2aGet Reward232350092022-12-05 7:11:091 hr 38 mins ago0x5979cb3110f1ebf7734894d8eb6c3cbb223922df IN  0xc172c84587bea6d593269bfe08632bf2da2bc0f60 AVAX0.004929 30
0x3d01efb89982c975b6947cc5290c3cf5f50842616aa8ee1e665efaffe0db8c81Get Reward232349222022-12-05 7:08:041 hr 41 mins ago0x937bcfb0acabc675c7d4c6e21433eb50f80ca47c IN  0xc172c84587bea6d593269bfe08632bf2da2bc0f60 AVAX0.004929 30
0x1ab36ccb5de513091781f10e21ee9eb541db4915d4d081aa4393e42b36be430cStake232348562022-12-05 7:05:491 hr 43 mins ago0xce3292ad101a35878c69f39bc46da9ab070d322e IN  0xc172c84587bea6d593269bfe08632bf2da2bc0f60 AVAX0.00749244 30
0x1efbd07e2fb57387c3a13e80f82f872c4af87598628095ef8ccbdd19766f0ec7Get Reward232348472022-12-05 7:05:311 hr 44 mins ago0x5979cb3110f1ebf7734894d8eb6c3cbb223922df IN  0xc172c84587bea6d593269bfe08632bf2da2bc0f60 AVAX0.005442 30
0x141f989e802ff3e9d29a698ccbfad6e278e8d3caebd5c7f1f9db2cfbb2bad562Get Reward232347572022-12-05 7:02:271 hr 47 mins ago0xb61aea7c2954deb88fd4495e79f882ba5e1a0e8e IN  0xc172c84587bea6d593269bfe08632bf2da2bc0f60 AVAX0.00946074 30
0x9e7e2bf5c2164312834b3daa0facf7b11f0041f20c85ad19ff7945d8948d281fGet Reward232346882022-12-05 7:00:031 hr 49 mins ago0xdc848fd7342273f2234ee39b5d38515f25af53bc IN  0xc172c84587bea6d593269bfe08632bf2da2bc0f60 AVAX0.004929 30
0x1da95d6cc6e1fd440e49feec227b4dab9db04639f943dfef4f7d0c27c89519acGet Reward232340582022-12-05 6:38:182 hrs 11 mins ago0x0921ae8da2b2274d25e621abaad1b76ebd6614fb IN  0xc172c84587bea6d593269bfe08632bf2da2bc0f60 AVAX0.005442 30
0x0e3ef09e318f3f028d2b9e915260c3b4e4f154db98e586fc7bb72f3d254f0549Get Reward232340392022-12-05 6:37:372 hrs 12 mins ago0xa02037aaaef5930d56d9f01b8240a7f4ea169da4 IN  0xc172c84587bea6d593269bfe08632bf2da2bc0f60 AVAX0.00492930
0x5fa2e74c557ff3bc4a92474c3c1cecb9136953f12bfadb885b0ce7dd1412348bWithdraw232337442022-12-05 6:27:332 hrs 22 mins ago0x5400a12a82bc5676af7ab10d703e441563915808 IN  0xc172c84587bea6d593269bfe08632bf2da2bc0f60 AVAX0.00556551 30
0xa9a31d0981a25c00eb53fda77abcfe36b3bec3e4cb45772c3385755dbc421ab8Get Reward232336072022-12-05 6:22:532 hrs 26 mins ago0xbf953da71bee0317949aec908c279de81956ebb7 IN  0xc172c84587bea6d593269bfe08632bf2da2bc0f60 AVAX0.004929 30
0x6f3cfa381ccf258d33a7474328604b02e2f5de94537149ace7cce3ce7e14fd47Stake232335952022-12-05 6:22:292 hrs 27 mins ago0xc797a3c73fa4f06eb66d7beb784f9aea60cb75b4 IN  0xc172c84587bea6d593269bfe08632bf2da2bc0f60 AVAX0.00638244 30
0xba3bd8123b48da14c2360bb363912db0b9ac8b74140fbba332c709b5dd28af09Get Reward232335432022-12-05 6:20:452 hrs 29 mins ago0x9924b48860fab5d23efa93843d9eb04c9dc0e6f8 IN  0xc172c84587bea6d593269bfe08632bf2da2bc0f60 AVAX0.00946074 30
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MultiRewards

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 500 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at snowtrace.io on 2022-03-31
*/

pragma solidity 0.5.17;


library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * This test is non-exhaustive, and there may be false-negatives: during the
     * execution of a contract's constructor, its address will be reported as
     * not containing a contract.
     *
     * > It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }
}

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


library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }
}

contract Owned {
    address public owner;
    address public nominatedOwner;

    constructor(address _owner) public {
        require(_owner != address(0), "Owner address cannot be 0");
        owner = _owner;
        emit OwnerChanged(address(0), _owner);
    }

    function nominateNewOwner(address _owner) external onlyOwner {
        nominatedOwner = _owner;
        emit OwnerNominated(_owner);
    }

    function acceptOwnership() external {
        require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership");
        emit OwnerChanged(owner, nominatedOwner);
        owner = nominatedOwner;
        nominatedOwner = address(0);
    }

    modifier onlyOwner {
        _onlyOwner();
        _;
    }

    function _onlyOwner() private view {
        require(msg.sender == owner, "Only the contract owner may perform this action");
    }

    event OwnerNominated(address newOwner);
    event OwnerChanged(address oldOwner, address newOwner);
}

contract Pausable is Owned {
    uint public lastPauseTime;
    bool public paused;

    constructor() internal {
        // This contract is abstract, and thus cannot be instantiated directly
        require(owner != address(0), "Owner must be set");
        // Paused will be false, and lastPauseTime will be 0 upon initialisation
    }

    /**
     * @notice Change the paused state of the contract
     * @dev Only the contract owner may call this.
     */
    function setPaused(bool _paused) external onlyOwner {
        // Ensure we're actually changing the state before we do anything
        if (_paused == paused) {
            return;
        }

        // Set our paused state.
        paused = _paused;

        // If applicable, set the last pause time.
        if (paused) {
            lastPauseTime = now;
        }

        // Let everyone know that our pause state has changed.
        emit PauseChanged(paused);
    }

    event PauseChanged(bool isPaused);

    modifier notPaused {
        require(!paused, "This action cannot be performed while the contract is paused");
        _;
    }
}

contract ReentrancyGuard {
    /// @dev counter to allow mutex lock with only one SSTORE operation
    uint256 private _guardCounter;

    constructor () internal {
        // The counter starts at one to prevent changing it from zero to a non-zero
        // value, which is a more expensive operation.
        _guardCounter = 1;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _guardCounter += 1;
        uint256 localCounter = _guardCounter;
        _;
        require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call");
    }
}


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 {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        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 safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length
        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");
        }
    }
}

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

        return c;
    }

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

        return c;
    }

    /**
     * @dev Returns the 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-solidity/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

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

        return c;
    }

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

contract MultiRewards is ReentrancyGuard, Pausable {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    /* ========== STATE VARIABLES ========== */

    struct Reward {
        address rewardsDistributor;
        uint256 rewardsDuration;
        uint256 periodFinish;
        uint256 rewardRate;
        uint256 lastUpdateTime;
        uint256 rewardPerTokenStored;
    }
    IERC20 public stakingToken;
    mapping(address => Reward) public rewardData;
    address[] public rewardTokens;

    // user -> reward token -> amount
    mapping(address => mapping(address => uint256)) public userRewardPerTokenPaid;
    mapping(address => mapping(address => uint256)) public rewards;

    uint256 private _totalSupply;
    mapping(address => uint256) private _balances;

    /* ========== CONSTRUCTOR ========== */

    constructor(
        address _owner,
        address _stakingToken
    ) public Owned(_owner) {
        stakingToken = IERC20(_stakingToken);
    }

    function addReward(
        address _rewardsToken,
        address _rewardsDistributor,
        uint256 _rewardsDuration
    )
        public
        onlyOwner
    {
        require(rewardData[_rewardsToken].rewardsDuration == 0);
        rewardTokens.push(_rewardsToken);
        rewardData[_rewardsToken].rewardsDistributor = _rewardsDistributor;
        rewardData[_rewardsToken].rewardsDuration = _rewardsDuration;
    }

    /* ========== VIEWS ========== */

    function rewardTokenLength() external view returns (uint256) {
        return rewardTokens.length;
    }

    function totalSupply() external view returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) external view returns (uint256) {
        return _balances[account];
    }

    function lastTimeRewardApplicable(address _rewardsToken) public view returns (uint256) {
        return Math.min(block.timestamp, rewardData[_rewardsToken].periodFinish);
    }

    function rewardPerToken(address _rewardsToken) public view returns (uint256) {
        if (_totalSupply == 0) {
            return rewardData[_rewardsToken].rewardPerTokenStored;
        }
        return
            rewardData[_rewardsToken].rewardPerTokenStored.add(
                lastTimeRewardApplicable(_rewardsToken).sub(rewardData[_rewardsToken].lastUpdateTime).mul(rewardData[_rewardsToken].rewardRate).mul(1e18).div(_totalSupply)
            );
    }

    function earned(address account, address _rewardsToken) public view returns (uint256) {
        return _balances[account].mul(rewardPerToken(_rewardsToken).sub(userRewardPerTokenPaid[account][_rewardsToken])).div(1e18).add(rewards[account][_rewardsToken]);
    }

    function getRewardForDuration(address _rewardsToken) external view returns (uint256) {
        return rewardData[_rewardsToken].rewardRate.mul(rewardData[_rewardsToken].rewardsDuration);
    }

    /* ========== MUTATIVE FUNCTIONS ========== */

    function setRewardsDistributor(address _rewardsToken, address _rewardsDistributor) external onlyOwner {
        rewardData[_rewardsToken].rewardsDistributor = _rewardsDistributor;
    }

    function stake(uint256 amount) external nonReentrant notPaused updateReward(msg.sender) {
        require(amount > 0, "Cannot stake 0");
        _totalSupply = _totalSupply.add(amount);
        _balances[msg.sender] = _balances[msg.sender].add(amount);
        stakingToken.safeTransferFrom(msg.sender, address(this), amount);
        emit Staked(msg.sender, amount);
    }

    function withdraw(uint256 amount) public nonReentrant updateReward(msg.sender) {
        require(amount > 0, "Cannot withdraw 0");
        _totalSupply = _totalSupply.sub(amount);
        _balances[msg.sender] = _balances[msg.sender].sub(amount);
        stakingToken.safeTransfer(msg.sender, amount);
        emit Withdrawn(msg.sender, amount);
    }

    function getReward() public nonReentrant updateReward(msg.sender) {

        for (uint i; i < rewardTokens.length; i++) {
            address _rewardsToken = rewardTokens[i];
            uint256 reward = rewards[msg.sender][_rewardsToken];
            if (reward > 0) {
                rewards[msg.sender][_rewardsToken] = 0;
                IERC20(_rewardsToken).safeTransfer(msg.sender, reward);
                emit RewardPaid(msg.sender, _rewardsToken, reward);
            }
    }
    }

    function exit() external {
        withdraw(_balances[msg.sender]);
        getReward();
    }

    /* ========== RESTRICTED FUNCTIONS ========== */

    function notifyRewardAmount(address _rewardsToken, uint256 reward) external updateReward(address(0)) {
        require(rewardData[_rewardsToken].rewardsDistributor == msg.sender);
        // handle the transfer of reward tokens via `transferFrom` to reduce the number
        // of transactions required and ensure correctness of the reward amount
        IERC20(_rewardsToken).safeTransferFrom(msg.sender, address(this), reward);

        if (block.timestamp >= rewardData[_rewardsToken].periodFinish) {
            rewardData[_rewardsToken].rewardRate = reward.div(rewardData[_rewardsToken].rewardsDuration);
        } else {
            uint256 remaining = rewardData[_rewardsToken].periodFinish.sub(block.timestamp);
            uint256 leftover = remaining.mul(rewardData[_rewardsToken].rewardRate);
            rewardData[_rewardsToken].rewardRate = reward.add(leftover).div(rewardData[_rewardsToken].rewardsDuration);
        }

        rewardData[_rewardsToken].lastUpdateTime = block.timestamp;
        rewardData[_rewardsToken].periodFinish = block.timestamp.add(rewardData[_rewardsToken].rewardsDuration);
        emit RewardAdded(reward);
    }

    // Added to support recovering LP Rewards from other systems such as BAL to be distributed to holders
    function recoverERC20(address tokenAddress, uint256 tokenAmount) external onlyOwner {
        require(tokenAddress != address(stakingToken), "Cannot withdraw staking token");
        require(rewardData[tokenAddress].lastUpdateTime == 0, "Cannot withdraw reward token");
        IERC20(tokenAddress).safeTransfer(owner, tokenAmount);
        emit Recovered(tokenAddress, tokenAmount);
    }

    function setRewardsDuration(address _rewardsToken, uint256 _rewardsDuration) external {
        require(
            block.timestamp > rewardData[_rewardsToken].periodFinish,
            "Reward period still active"
        );
        require(rewardData[_rewardsToken].rewardsDistributor == msg.sender);
        require(_rewardsDuration > 0, "Reward duration must be non-zero");
        rewardData[_rewardsToken].rewardsDuration = _rewardsDuration;
        emit RewardsDurationUpdated(_rewardsToken, rewardData[_rewardsToken].rewardsDuration);
    }

    /* ========== MODIFIERS ========== */

    modifier updateReward(address account) {
        for (uint i; i < rewardTokens.length; i++) {
            address token = rewardTokens[i];
            rewardData[token].rewardPerTokenStored = rewardPerToken(token);
            rewardData[token].lastUpdateTime = lastTimeRewardApplicable(token);
            if (account != address(0)) {
                rewards[account][token] = earned(account, token);
                userRewardPerTokenPaid[account][token] = rewardData[token].rewardPerTokenStored;
            }
        }
        _;
    }

    /* ========== EVENTS ========== */

    event RewardAdded(uint256 reward);
    event Staked(address indexed user, uint256 amount);
    event Withdrawn(address indexed user, uint256 amount);
    event RewardPaid(address indexed user, address indexed rewardsToken, uint256 reward);
    event RewardsDurationUpdated(address token, uint256 newDuration);
    event Recovered(address token, uint256 amount);
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_stakingToken","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isPaused","type":"bool"}],"name":"PauseChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"rewardsToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"newDuration","type":"uint256"}],"name":"RewardsDurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_rewardsDistributor","type":"address"},{"internalType":"uint256","name":"_rewardsDuration","type":"uint256"}],"name":"addReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"exit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"getReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"getRewardForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastPauseTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"nominateNewOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardData","outputs":[{"internalType":"address","name":"rewardsDistributor","type":"address"},{"internalType":"uint256","name":"rewardsDuration","type":"uint256"},{"internalType":"uint256","name":"periodFinish","type":"uint256"},{"internalType":"uint256","name":"rewardRate","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"uint256","name":"rewardPerTokenStored","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"}],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardTokenLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_rewardsDistributor","type":"address"}],"name":"setRewardsDistributor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"uint256","name":"_rewardsDuration","type":"uint256"}],"name":"setRewardsDuration","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50604051611dfd380380611dfd8339818101604052604081101561003357600080fd5b5080516020909101516001600055816001600160a01b03811661009d576040805162461bcd60e51b815260206004820152601960248201527f4f776e657220616464726573732063616e6e6f74206265203000000000000000604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040805160008152602081019290925280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a1506001546001600160a01b0316610149576040805162461bcd60e51b815260206004820152601160248201527013dddb995c881b5d5cdd081899481cd95d607a1b604482015290519081900360640190fd5b600480546001600160a01b0390921661010002610100600160a81b031990921691909117905550611c7e8061017f6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806372f702f3116100f9578063a694fc3a11610097578063d0ed26ae11610071578063d0ed26ae146104d4578063e70b9e271461050a578063e9fad8ee14610538578063f122977714610540576101c4565b8063a694fc3a14610465578063b66503cf14610482578063bcd11014146104ae576101c4565b8063857cb94a116100d3578063857cb94a146104215780638980f11f146104295780638da5cb5b1461045557806391b4ded91461045d576101c4565b806372f702f3146103f457806379ba5097146103fc5780637bb7bed114610404576101c4565b80633f695b45116101665780635c975abb116101405780635c975abb1461035e578063638634ee1461037a5780637035ab98146103a057806370a08231146103ce576101c4565b80633f695b45146102a957806348e5d9f8146102d757806353a47bb71461033a576101c4565b8063211dc32d116101a2578063211dc32d1461022a5780632378bea6146102585780632e1a7d4d146102845780633d18b912146102a1576101c4565b80631627540c146101c957806316c38b3c146101f157806318160ddd14610210575b600080fd5b6101ef600480360360208110156101df57600080fd5b50356001600160a01b0316610566565b005b6101ef6004803603602081101561020757600080fd5b503515156105c2565b61021861063c565b60408051918252519081900360200190f35b6102186004803603604081101561024057600080fd5b506001600160a01b0381358116916020013516610642565b6101ef6004803603604081101561026e57600080fd5b506001600160a01b0381351690602001356106f5565b6101ef6004803603602081101561029a57600080fd5b503561083b565b6101ef610a81565b6101ef600480360360408110156102bf57600080fd5b506001600160a01b0381358116916020013516610ca3565b6102fd600480360360208110156102ed57600080fd5b50356001600160a01b0316610cd9565b604080516001600160a01b0390971687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b610342610d18565b604080516001600160a01b039092168252519081900360200190f35b610366610d27565b604080519115158252519081900360200190f35b6102186004803603602081101561039057600080fd5b50356001600160a01b0316610d30565b610218600480360360408110156103b657600080fd5b506001600160a01b0381358116916020013516610d5f565b610218600480360360208110156103e457600080fd5b50356001600160a01b0316610d7c565b610342610d97565b6101ef610dab565b6103426004803603602081101561041a57600080fd5b5035610e67565b610218610e8e565b6101ef6004803603604081101561043f57600080fd5b506001600160a01b038135169060200135610e94565b610342610fda565b610218610fe9565b6101ef6004803603602081101561047b57600080fd5b5035610fef565b6101ef6004803603604081101561049857600080fd5b506001600160a01b038135169060200135611275565b610218600480360360208110156104c457600080fd5b50356001600160a01b031661154f565b6101ef600480360360608110156104ea57600080fd5b506001600160a01b03813581169160208101359091169060400135611581565b6102186004803603604081101561052057600080fd5b506001600160a01b038135811691602001351661161d565b6101ef61163a565b6102186004803603602081101561055657600080fd5b50356001600160a01b031661165d565b61056e611710565b600280546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229181900360200190a150565b6105ca611710565b60045460ff16151581151514156105e057610639565b6004805460ff1916821515179081905560ff16156105fd57426003555b6004546040805160ff90921615158252517f8fb6c181ee25a520cf3dd6565006ef91229fcfe5a989566c2a3b8c115570cec59181900360200190a15b50565b60095490565b6001600160a01b0380831660008181526008602090815260408083209486168084529482528083205493835260078252808320948352939052918220546106ec91906106e090670de0b6b3a7640000906106d4906106af906106a38961165d565b9063ffffffff61175916565b6001600160a01b0389166000908152600a60205260409020549063ffffffff6117b616565b9063ffffffff61180f16565b9063ffffffff61187916565b90505b92915050565b6001600160a01b0382166000908152600560205260409020600201544211610764576040805162461bcd60e51b815260206004820152601a60248201527f52657761726420706572696f64207374696c6c20616374697665000000000000604482015290519081900360640190fd5b6001600160a01b0382811660009081526005602052604090205416331461078a57600080fd5b600081116107df576040805162461bcd60e51b815260206004820181905260248201527f526577617264206475726174696f6e206d757374206265206e6f6e2d7a65726f604482015290519081900360640190fd5b6001600160a01b0382166000818152600560209081526040918290206001018490558151928352820183905280517fad2f86b01ed93b4b3a150d448c61a4f5d8d38075d3c0c64cc0a26fd6e1f495459281900390910190a15050565b600080546001018082559033905b60065481101561092e5760006006828154811061086257fe5b6000918252602090912001546001600160a01b031690506108828161165d565b6001600160a01b038216600090815260056020819052604090912001556108a881610d30565b6001600160a01b03808316600090815260056020526040902060040191909155831615610925576108d98382610642565b6001600160a01b03808516600081815260086020908152604080832094871680845294825280832095909555600580825285832001549282526007815284822093825292909252919020555b50600101610849565b5060008311610984576040805162461bcd60e51b815260206004820152601160248201527f43616e6e6f742077697468647261772030000000000000000000000000000000604482015290519081900360640190fd5b600954610997908463ffffffff61175916565b600955336000908152600a60205260409020546109ba908463ffffffff61175916565b336000818152600a60205260409020919091556004546109f0916101009091046001600160a01b0316908563ffffffff6118d316565b60408051848152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a2506000548114610a7d576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b5050565b600080546001018082559033905b600654811015610b7457600060068281548110610aa857fe5b6000918252602090912001546001600160a01b03169050610ac88161165d565b6001600160a01b03821660009081526005602081905260409091200155610aee81610d30565b6001600160a01b03808316600090815260056020526040902060040191909155831615610b6b57610b1f8382610642565b6001600160a01b03808516600081815260086020908152604080832094871680845294825280832095909555600580825285832001549282526007815284822093825292909252919020555b50600101610a8f565b5060005b600654811015610c4b57600060068281548110610b9157fe5b60009182526020808320909101543383526008825260408084206001600160a01b03909216808552919092529120549091508015610c41573360008181526008602090815260408083206001600160a01b0387168085529252822091909155610c00918363ffffffff6118d316565b6040805182815290516001600160a01b0384169133917f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e9181900360200190a35b5050600101610b78565b50506000548114610639576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b610cab611710565b6001600160a01b03918216600090815260056020526040902080546001600160a01b03191691909216179055565b60056020819052600091825260409091208054600182015460028301546003840154600485015494909501546001600160a01b03909316949193909286565b6002546001600160a01b031681565b60045460ff1681565b6001600160a01b038116600090815260056020526040812060020154610d5790429061192a565b90505b919050565b600760209081526000928352604080842090915290825290205481565b6001600160a01b03166000908152600a602052604090205490565b60045461010090046001600160a01b031681565b6002546001600160a01b03163314610df45760405162461bcd60e51b8152600401808060200182810382526035815260200180611b5f6035913960400191505060405180910390fd5b600154600254604080516001600160a01b03938416815292909116602083015280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a160028054600180546001600160a01b03199081166001600160a01b03841617909155169055565b60068181548110610e7457fe5b6000918252602090912001546001600160a01b0316905081565b60065490565b610e9c611710565b6004546001600160a01b03838116610100909204161415610f04576040805162461bcd60e51b815260206004820152601d60248201527f43616e6e6f74207769746864726177207374616b696e6720746f6b656e000000604482015290519081900360640190fd5b6001600160a01b03821660009081526005602052604090206004015415610f72576040805162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742077697468647261772072657761726420746f6b656e00000000604482015290519081900360640190fd5b600154610f92906001600160a01b0384811691168363ffffffff6118d316565b604080516001600160a01b03841681526020810183905281517f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa28929181900390910190a15050565b6001546001600160a01b031681565b60035481565b600080546001019081905560045460ff161561103c5760405162461bcd60e51b815260040180806020018281038252603c815260200180611be4603c913960400191505060405180910390fd5b3360005b6006548110156111255760006006828154811061105957fe5b6000918252602090912001546001600160a01b031690506110798161165d565b6001600160a01b0382166000908152600560208190526040909120015561109f81610d30565b6001600160a01b0380831660009081526005602052604090206004019190915583161561111c576110d08382610642565b6001600160a01b03808516600081815260086020908152604080832094871680845294825280832095909555600580825285832001549282526007815284822093825292909252919020555b50600101611040565b506000831161117b576040805162461bcd60e51b815260206004820152600e60248201527f43616e6e6f74207374616b652030000000000000000000000000000000000000604482015290519081900360640190fd5b60095461118e908463ffffffff61187916565b600955336000908152600a60205260409020546111b1908463ffffffff61187916565b336000818152600a60205260409020919091556004546111e8916101009091046001600160a01b031690308663ffffffff61194016565b60408051848152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a2506000548114610a7d576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805b60065481101561135e5760006006828154811061129257fe5b6000918252602090912001546001600160a01b031690506112b28161165d565b6001600160a01b038216600090815260056020819052604090912001556112d881610d30565b6001600160a01b03808316600090815260056020526040902060040191909155831615611355576113098382610642565b6001600160a01b03808516600081815260086020908152604080832094871680845294825280832095909555600580825285832001549282526007815284822093825292909252919020555b50600101611279565b506001600160a01b0383811660009081526005602052604090205416331461138557600080fd5b6113a06001600160a01b03841633308563ffffffff61194016565b6001600160a01b0383166000908152600560205260409020600201544210611410576001600160a01b0383166000908152600560205260409020600101546113ef90839063ffffffff61180f16565b6001600160a01b0384166000908152600560205260409020600301556114bf565b6001600160a01b03831660009081526005602052604081206002015461143c904263ffffffff61175916565b6001600160a01b0385166000908152600560205260408120600301549192509061146d90839063ffffffff6117b616565b6001600160a01b0386166000908152600560205260409020600101549091506114a0906106d4868463ffffffff61187916565b6001600160a01b03861660009081526005602052604090206003015550505b6001600160a01b038316600090815260056020526040902042600482018190556001909101546114f5919063ffffffff61187916565b6001600160a01b03841660009081526005602090815260409182902060020192909255805184815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d929181900390910190a1505050565b6001600160a01b03811660009081526005602052604081206001810154600390910154610d579163ffffffff6117b616565b611589611710565b6001600160a01b038316600090815260056020526040902060010154156115af57600080fd5b6006805460018181019092557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b039586166001600160a01b031991821681179092556000918252600560205260409091208054949095169316929092178355910155565b600860209081526000928352604080842090915290825290205481565b336000908152600a60205260409020546116539061083b565b61165b610a81565b565b60006009546000141561168d57506001600160a01b03811660009081526005602081905260409091200154610d5a565b6009546001600160a01b03831660009081526005602052604090206003810154600490910154610d57926116e79290916106d491670de0b6b3a7640000916116db919082906106a38b610d30565b9063ffffffff6117b616565b6001600160a01b038416600090815260056020819052604090912001549063ffffffff61187916565b6001546001600160a01b0316331461165b5760405162461bcd60e51b815260040180806020018281038252602f815260200180611b94602f913960400191505060405180910390fd5b6000828211156117b0576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000826117c5575060006106ef565b828202828482816117d257fe5b04146106ec5760405162461bcd60e51b8152600401808060200182810382526021815260200180611bc36021913960400191505060405180910390fd5b6000808211611865576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b600082848161187057fe5b04949350505050565b6000828201838110156106ec576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526119259084906119a0565b505050565b600081831061193957816106ec565b5090919050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261199a9085906119a0565b50505050565b6119b2826001600160a01b0316611b58565b611a03576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310611a415780518252601f199092019160209182019101611a22565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611aa3576040519150601f19603f3d011682016040523d82523d6000602084013e611aa8565b606091505b509150915081611aff576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561199a57808060200190516020811015611b1b57600080fd5b505161199a5760405162461bcd60e51b815260040180806020018281038252602a815260200180611c20602a913960400191505060405180910390fd5b3b15159056fe596f75206d757374206265206e6f6d696e61746564206265666f726520796f752063616e20616363657074206f776e6572736869704f6e6c792074686520636f6e7472616374206f776e6572206d617920706572666f726d207468697320616374696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775468697320616374696f6e2063616e6e6f7420626520706572666f726d6564207768696c652074686520636f6e7472616374206973207061757365645361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a72315820bb8fd8e19a968bdc82bf2aad812ab336eb4c0721d3c2252862f6b9057c9d35da64736f6c63430005110032000000000000000000000000ff8f089128f53d6c54f769843defaaf5fbf021980000000000000000000000000da67235dd5787d67955420c84ca1cecd4e5bb3b

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

000000000000000000000000ff8f089128f53d6c54f769843defaaf5fbf021980000000000000000000000000da67235dd5787d67955420c84ca1cecd4e5bb3b

-----Decoded View---------------
Arg [0] : _owner (address): 0xff8f089128f53d6c54f769843defaaf5fbf02198
Arg [1] : _stakingToken (address): 0x0da67235dd5787d67955420c84ca1cecd4e5bb3b

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000ff8f089128f53d6c54f769843defaaf5fbf02198
Arg [1] : 0000000000000000000000000da67235dd5787d67955420c84ca1cecd4e5bb3b


Deployed ByteCode Sourcemap

13606:7918:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13606:7918:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4524:141;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4524:141:0;-1:-1:-1;;;;;4524:141:0;;:::i;:::-;;5750:488;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5750:488:0;;;;:::i;15225:93::-;;;:::i;:::-;;;;;;;;;;;;;;;;16108:264;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;16108:264:0;;;;;;;;;;:::i;19944:558::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19944:558:0;;;;;;;;:::i;17218:357::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17218:357:0;;:::i;17583:502::-;;;:::i;16636:187::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;16636:187:0;;;;;;;;;;:::i;14047:44::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14047:44:0;-1:-1:-1;;;;;14047:44:0;;:::i;:::-;;;;-1:-1:-1;;;;;14047:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4293:29;;;:::i;:::-;;;;-1:-1:-1;;;;;4293:29:0;;;;;;;;;;;;;;5336:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;15446:178;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15446:178:0;-1:-1:-1;;;;;15446:178:0;;:::i;14175:77::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14175:77:0;;;;;;;;;;:::i;15326:112::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15326:112:0;-1:-1:-1;;;;;15326:112:0;;:::i;14014:26::-;;;:::i;4673:271::-;;;:::i;14098:29::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14098:29:0;;:::i;15111:106::-;;;:::i;19542:394::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19542:394:0;;;;;;;;:::i;4266:20::-;;;:::i;5304:25::-;;;:::i;16831:379::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16831:379:0;;:::i;18254:1173::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;18254:1173:0;;;;;;;;:::i;16380:194::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16380:194:0;-1:-1:-1;;;;;16380:194:0;;:::i;14626:436::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14626:436:0;;;;;;;;;;;;;;;;;:::i;14259:62::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14259:62:0;;;;;;;;;;:::i;18093:97::-;;;:::i;15632:468::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15632:468:0;-1:-1:-1;;;;;15632:468:0;;:::i;4524:141::-;4982:12;:10;:12::i;:::-;4596:14;:23;;-1:-1:-1;;;;;4596:23:0;;-1:-1:-1;;;;;;4596:23:0;;;;;;;;4635:22;;;;;;;;;;;;;;;;4524:141;:::o;5750:488::-;4982:12;:10;:12::i;:::-;5903:6;;;;5892:17;;;;;;5888:56;;;5926:7;;5888:56;5990:6;:16;;-1:-1:-1;;5990:16:0;;;;;;;;;;6075:6;6071:58;;;6114:3;6098:13;:19;6071:58;6223:6;;6210:20;;;6223:6;;;;6210:20;;;;;;;;;;;;;;5005:1;5750:488;:::o;15225:93::-;15298:12;;15225:93;:::o;16108:264::-;-1:-1:-1;;;;;16332:16:0;;;16185:7;16332:16;;;:7;:16;;;;;;;;:31;;;;;;;;;;;;;16269;;;:22;:31;;;;;:46;;;;;;;;;;16212:152;;16332:31;16212:115;;16322:4;;16212:105;;16235:81;;:29;16349:13;16235:14;:29::i;:::-;:33;:81;:33;:81;:::i;:::-;-1:-1:-1;;;;;16212:18:0;;;;;;:9;:18;;;;;;;:105;:22;:105;:::i;:::-;:109;:115;:109;:115;:::i;:::-;:119;:152;:119;:152;:::i;:::-;16205:159;;16108:264;;;;;:::o;19944:558::-;-1:-1:-1;;;;;20081:25:0;;;;;;:10;:25;;;;;:38;;;20063:15;:56;20041:132;;;;;-1:-1:-1;;;20041:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20192:25:0;;;;;;;:10;:25;;;;;:44;;20240:10;20192:58;20184:67;;;;;;20289:1;20270:16;:20;20262:65;;;;;-1:-1:-1;;;20262:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20338:25:0;;;;;;:10;:25;;;;;;;;;:41;;:60;;;20414:80;;;;;;;;;;;;;;;;;;;;;;19944:558;;:::o;17218:357::-;7188:13;:18;;7205:1;7188:18;;;;;17285:10;;20605:481;20622:12;:19;20618:23;;20605:481;;;20663:13;20679:12;20692:1;20679:15;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20679:15:0;;-1:-1:-1;20750:21:0;20679:15;20750:14;:21::i;:::-;-1:-1:-1;;;;;20709:17:0;;;;;;:10;:17;;;;;;;;:38;:62;20821:31;20720:5;20821:24;:31::i;:::-;-1:-1:-1;;;;;20786:17:0;;;;;;;:10;:17;;;;;:32;;:66;;;;20871:21;;;20867:208;;20939:22;20946:7;20955:5;20939:6;:22::i;:::-;-1:-1:-1;;;;;20913:16:0;;;;;;;:7;:16;;;;;;;;:23;;;;;;;;;;;;:48;;;;21021:10;:17;;;;;;:38;;20980:31;;;:22;:31;;;;;:38;;;;;;;;;;:79;20867:208;-1:-1:-1;20643:3:0;;20605:481;;;;17325:1;17316:6;:10;17308:40;;;;;-1:-1:-1;;;17308:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17374:12;;:24;;17391:6;17374:24;:16;:24;:::i;:::-;17359:12;:39;17443:10;17433:21;;;;:9;:21;;;;;;:33;;17459:6;17433:33;:25;:33;:::i;:::-;17419:10;17409:21;;;;:9;:21;;;;;:57;;;;17477:12;;:45;;:12;;;;-1:-1:-1;;;;;17477:12:0;;17515:6;17477:45;:25;:45;:::i;:::-;17538:29;;;;;;;;17548:10;;17538:29;;;;;;;;;;7264:1;7300:13;;7284:12;:29;7276:73;;;;;-1:-1:-1;;;7276:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17218:357;;:::o;17583:502::-;7188:13;:18;;7205:1;7188:18;;;;;17637:10;;20605:481;20622:12;:19;20618:23;;20605:481;;;20663:13;20679:12;20692:1;20679:15;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20679:15:0;;-1:-1:-1;20750:21:0;20679:15;20750:14;:21::i;:::-;-1:-1:-1;;;;;20709:17:0;;;;;;:10;:17;;;;;;;;:38;:62;20821:31;20720:5;20821:24;:31::i;:::-;-1:-1:-1;;;;;20786:17:0;;;;;;;:10;:17;;;;;:32;;:66;;;;20871:21;;;20867:208;;20939:22;20946:7;20955:5;20939:6;:22::i;:::-;-1:-1:-1;;;;;20913:16:0;;;;;;;:7;:16;;;;;;;;:23;;;;;;;;;;;;:48;;;;21021:10;:17;;;;;;:38;;20980:31;;;:22;:31;;;;;:38;;;;;;;;;;:79;20867:208;-1:-1:-1;20643:3:0;;20605:481;;;;17667:6;17662:416;17679:12;:19;17675:23;;17662:416;;;17720:21;17744:12;17757:1;17744:15;;;;;;;;;;;;;;;;;;;;17799:10;17791:19;;:7;:19;;;;;;-1:-1:-1;;;;;17744:15:0;;;17791:34;;;;;;;;;;17744:15;;-1:-1:-1;17844:10:0;;17840:231;;17883:10;17912:1;17875:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;17875:34:0;;;;;;;;;:38;;;;17932:54;;17979:6;17932:54;:34;:54;:::i;:::-;18010:45;;;;;;;;-1:-1:-1;;;;;18010:45:0;;;18021:10;;18010:45;;;;;;;;;17840:231;-1:-1:-1;;17700:3:0;;17662:416;;;;7264:1;7300:13;;7284:12;:29;7276:73;;;;;-1:-1:-1;;;7276:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;16636:187;4982:12;:10;:12::i;:::-;-1:-1:-1;;;;;16749:25:0;;;;;;;:10;:25;;;;;:66;;-1:-1:-1;;;;;;16749:66:0;;;;;;;;16636:187::o;14047:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14047:44:0;;;;;;;;;:::o;4293:29::-;;;-1:-1:-1;;;;;4293:29:0;;:::o;5336:18::-;;;;;;:::o;15446:178::-;-1:-1:-1;;;;;15577:25:0;;15524:7;15577:25;;;:10;:25;;;;;:38;;;15551:65;;15560:15;;15551:8;:65::i;:::-;15544:72;;15446:178;;;;:::o;14175:77::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;15326:112::-;-1:-1:-1;;;;;15412:18:0;15385:7;15412:18;;;:9;:18;;;;;;;15326:112::o;14014:26::-;;;;;;-1:-1:-1;;;;;14014:26:0;;:::o;4673:271::-;4742:14;;-1:-1:-1;;;;;4742:14:0;4728:10;:28;4720:94;;;;-1:-1:-1;;;4720:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4843:5;;4850:14;;4830:35;;;-1:-1:-1;;;;;4843:5:0;;;4830:35;;4850:14;;;;4830:35;;;;;;;;;;;;;;;;4884:14;;;;4876:22;;-1:-1:-1;;;;;;4876:22:0;;;-1:-1:-1;;;;;4884:14:0;;4876:22;;;;4909:27;;;4673:271::o;14098:29::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14098:29:0;;-1:-1:-1;14098:29:0;:::o;15111:106::-;15190:12;:19;15111:106;:::o;19542:394::-;4982:12;:10;:12::i;:::-;19669;;-1:-1:-1;;;;;19645:37:0;;;19669:12;;;;;19645:37;;19637:79;;;;;-1:-1:-1;;;19637:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19735:24:0;;;;;;:10;:24;;;;;:39;;;:44;19727:85;;;;;-1:-1:-1;;;19727:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19857:5;;19823:53;;-1:-1:-1;;;;;19823:33:0;;;;19857:5;19864:11;19823:53;:33;:53;:::i;:::-;19892:36;;;-1:-1:-1;;;;;19892:36:0;;;;;;;;;;;;;;;;;;;;;;;19542:394;;:::o;4266:20::-;;;-1:-1:-1;;;;;4266:20:0;;:::o;5304:25::-;;;;:::o;16831:379::-;7188:13;:18;;7205:1;7188:18;;;;;6327:6;;;;6326:7;6318:80;;;;-1:-1:-1;;;6318:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16907:10;20610:6;20605:481;20622:12;:19;20618:23;;20605:481;;;20663:13;20679:12;20692:1;20679:15;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20679:15:0;;-1:-1:-1;20750:21:0;20679:15;20750:14;:21::i;:::-;-1:-1:-1;;;;;20709:17:0;;;;;;:10;:17;;;;;;;;:38;:62;20821:31;20720:5;20821:24;:31::i;:::-;-1:-1:-1;;;;;20786:17:0;;;;;;;:10;:17;;;;;:32;;:66;;;;20871:21;;;20867:208;;20939:22;20946:7;20955:5;20939:6;:22::i;:::-;-1:-1:-1;;;;;20913:16:0;;;;;;;:7;:16;;;;;;;;:23;;;;;;;;;;;;:48;;;;21021:10;:17;;;;;;:38;;20980:31;;;:22;:31;;;;;:38;;;;;;;;;;:79;20867:208;-1:-1:-1;20643:3:0;;20605:481;;;;16947:1;16938:6;:10;16930:37;;;;;-1:-1:-1;;;16930:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16993:12;;:24;;17010:6;16993:24;:16;:24;:::i;:::-;16978:12;:39;17062:10;17052:21;;;;:9;:21;;;;;;:33;;17078:6;17052:33;:25;:33;:::i;:::-;17038:10;17028:21;;;;:9;:21;;;;;:57;;;;17096:12;;:64;;:12;;;;-1:-1:-1;;;;;17096:12:0;;17146:4;17153:6;17096:64;:29;:64;:::i;:::-;17176:26;;;;;;;;17183:10;;17176:26;;;;;;;;;;6409:1;7300:13;;7284:12;:29;7276:73;;;;;-1:-1:-1;;;7276:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;18254:1173;18351:1;20610:6;20605:481;20622:12;:19;20618:23;;20605:481;;;20663:13;20679:12;20692:1;20679:15;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20679:15:0;;-1:-1:-1;20750:21:0;20679:15;20750:14;:21::i;:::-;-1:-1:-1;;;;;20709:17:0;;;;;;:10;:17;;;;;;;;:38;:62;20821:31;20720:5;20821:24;:31::i;:::-;-1:-1:-1;;;;;20786:17:0;;;;;;;:10;:17;;;;;:32;;:66;;;;20871:21;;;20867:208;;20939:22;20946:7;20955:5;20939:6;:22::i;:::-;-1:-1:-1;;;;;20913:16:0;;;;;;;:7;:16;;;;;;;;:23;;;;;;;;;;;;:48;;;;21021:10;:17;;;;;;:38;;20980:31;;;:22;:31;;;;;:38;;;;;;;;;;:79;20867:208;-1:-1:-1;20643:3:0;;20605:481;;;-1:-1:-1;;;;;;18374:25:0;;;;;;;:10;:25;;;;;:44;;18422:10;18374:58;18366:67;;;;;;18614:73;-1:-1:-1;;;;;18614:38:0;;18653:10;18673:4;18680:6;18614:73;:38;:73;:::i;:::-;-1:-1:-1;;;;;18723:25:0;;;;;;:10;:25;;;;;:38;;;18704:15;:57;18700:500;;-1:-1:-1;;;;;18828:25:0;;;;;;:10;:25;;;;;:41;;;18817:53;;:6;;:53;:10;:53;:::i;:::-;-1:-1:-1;;;;;18778:25:0;;;;;;:10;:25;;;;;:36;;:92;18700:500;;;-1:-1:-1;;;;;18923:25:0;;18903:17;18923:25;;;:10;:25;;;;;:38;;;:59;;18966:15;18923:59;:42;:59;:::i;:::-;-1:-1:-1;;;;;19030:25:0;;18997:16;19030:25;;;:10;:25;;;;;:36;;;18903:79;;-1:-1:-1;18997:16:0;19016:51;;18903:79;;19016:51;:13;:51;:::i;:::-;-1:-1:-1;;;;;19146:25:0;;;;;;:10;:25;;;;;:41;;;18997:70;;-1:-1:-1;19121:67:0;;:20;:6;18997:70;19121:20;:10;:20;:::i;:67::-;-1:-1:-1;;;;;19082:25:0;;;;;;:10;:25;;;;;:36;;:106;-1:-1:-1;;18700:500:0;-1:-1:-1;;;;;19212:25:0;;;;;;:10;:25;;;;;19255:15;19212:40;;;:58;;;19342:41;;;;;19322:62;;19255:15;19322:62;:19;:62;:::i;:::-;-1:-1:-1;;;;;19281:25:0;;;;;;:10;:25;;;;;;;;;:38;;:103;;;;19400:19;;;;;;;;;;;;;;;;;;18254:1173;;;:::o;16380:194::-;-1:-1:-1;;;;;16524:25:0;;16456:7;16524:25;;;:10;:25;;;;;:41;;;;16483:36;;;;;:83;;;:40;:83;:::i;14626:436::-;4982:12;:10;:12::i;:::-;-1:-1:-1;;;;;14816:25:0;;;;;;:10;:25;;;;;:41;;;:46;14808:55;;;;;;14874:12;27:10:-1;;39:1;23:18;;;45:23;;;14874:32:0;;;;-1:-1:-1;;;;;14874:32:0;;;-1:-1:-1;;;;;;14874:32:0;;;;;;;;-1:-1:-1;14917:25:0;;;:10;14874:32;14917:25;;;;;:66;;;;;;;;;;;;;;14994:41;;:60;14626:436::o;14259:62::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;18093:97::-;18148:10;18138:21;;;;:9;:21;;;;;;18129:31;;:8;:31::i;:::-;18171:11;:9;:11::i;:::-;18093:97::o;15632:468::-;15700:7;15724:12;;15740:1;15724:17;15720:103;;;-1:-1:-1;;;;;;15765:25:0;;;;;;:10;:25;;;;;;;;:46;;15758:53;;15720:103;16064:12;;-1:-1:-1;;;;;16012:25:0;;;;;;:10;:25;;;;;:36;;;;15966:40;;;;;15853:239;;15922:155;;16064:12;;15922:137;;16054:4;;15922:127;;16012:36;15922:127;;:39;16023:13;15922:24;:39::i;:85::-;:89;:127;:89;:127;:::i;:155::-;-1:-1:-1;;;;;15853:25:0;;;;;;:10;:25;;;;;;;;:46;;;:239;:50;:239;:::i;5022:133::-;5090:5;;-1:-1:-1;;;;;5090:5:0;5076:10;:19;5068:79;;;;-1:-1:-1;;;5068:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11284:184;11342:7;11375:1;11370;:6;;11362:49;;;;;-1:-1:-1;;;11362:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11434:5:0;;;11284:184::o;11719:470::-;11777:7;12021:6;12017:47;;-1:-1:-1;12051:1:0;12044:8;;12017:47;12088:5;;;12092:1;12088;:5;:1;12112:5;;;;;:10;12104:56;;;;-1:-1:-1;;;12104:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12657:333;12715:7;12814:1;12810;:5;12802:44;;;;;-1:-1:-1;;;12802:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12857:9;12873:1;12869;:5;;;;;;;12657:333;-1:-1:-1;;;;12657:333:0:o;10828:181::-;10886:7;10918:5;;;10942:6;;;;10934:46;;;;;-1:-1:-1;;;10934:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;7458:176;7567:58;;;-1:-1:-1;;;;;7567:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;7567:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;7541:85:0;;7560:5;;7541:18;:85::i;:::-;7458:176;;;:::o;3819:106::-;3877:7;3908:1;3904;:5;:13;;3916:1;3904:13;;;-1:-1:-1;3912:1:0;;3819:106;-1:-1:-1;3819:106:0:o;7642:204::-;7769:68;;;-1:-1:-1;;;;;7769:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;7769:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;7743:95:0;;7762:5;;7743:18;:95::i;:::-;7642:204;;;;:::o;9452:1114::-;10056:27;10064:5;-1:-1:-1;;;;;10056:25:0;;:27::i;:::-;10048:71;;;;;-1:-1:-1;;;10048:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10193:12;10207:23;10242:5;-1:-1:-1;;;;;10234:19:0;10254:4;10234:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;10234:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;10192:67:0;;;;10278:7;10270:52;;;;;-1:-1:-1;;;10270:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10339:17;;:21;10335:224;;10481:10;10470:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10470:30:0;10462:85;;;;-1:-1:-1;;;10462:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;488:422;855:20;894:8;;;488:422::o

Swarm Source

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