Contract 0x67f4d5fb485bbb4d307a2e17fa94010871bf1675

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x128a394d27e814a2e87ca5292fb9ecc2d0b6bfe080fb3d2dd418a066c830fb24Get Reward93307392021-10-22 7:02:5823 mins ago0x3e10f173c502a4badfeec7d6ae8dfef0b4589d75 IN  0x67f4d5fb485bbb4d307a2e17fa94010871bf16750 HT0.0001873215 2.25
0x5b6a5ef553aa738a3c07de364e8025f345fed1c3ed4eb10fd843d7f552b66a6eGet Reward93286532021-10-22 5:18:402 hrs 7 mins ago0xfcb39967a92c6cc1e83c4d9b0209f0e6e48e5815 IN  0x67f4d5fb485bbb4d307a2e17fa94010871bf16750 HT0.00022579652.25
0xdf732b545dbd54da60b3cc68164fe66c244d37ba540f8ebf1f931c95f8caf558Get Reward93275612021-10-22 4:24:043 hrs 2 mins ago0xafa591adee92de0f2d95768815a47317e6cf1eac IN  0x67f4d5fb485bbb4d307a2e17fa94010871bf16750 HT0.00018732152.25
0x7b61f5455902cf92f658cc23a74ae86255792f1a2d461dac2642c56ec093875dGet Reward93247722021-10-22 2:04:375 hrs 21 mins ago0xfcb39967a92c6cc1e83c4d9b0209f0e6e48e5815 IN  0x67f4d5fb485bbb4d307a2e17fa94010871bf16750 HT0.00022129652.25
0xf934ccbc77cfc6ffdf4194aeb3f1897d6b1c64340cf0c905dd2677899f579eeaGet Reward93233302021-10-22 0:52:316 hrs 33 mins ago0xe178bacfc3430ab86d3ed6faa452c1357d6b251c IN  0x67f4d5fb485bbb4d307a2e17fa94010871bf16750 HT0.00018732152.25
0x6c23d7dd97035d774680c72bdb81534172d45414be612a5cb1a2eb08b9d4bea0Get Reward93198372021-10-21 21:57:519 hrs 28 mins ago0xfcb39967a92c6cc1e83c4d9b0209f0e6e48e5815 IN  0x67f4d5fb485bbb4d307a2e17fa94010871bf16750 HT0.00022579652.25
0x7e8f48326ad1fdafbe07861d444e320dce9ce85d84f1879fdb65bfdbf56c55d3Get Reward93143642021-10-21 17:24:1214 hrs 1 min ago0xe178bacfc3430ab86d3ed6faa452c1357d6b251c IN  0x67f4d5fb485bbb4d307a2e17fa94010871bf16750 HT0.00018732152.25
0xa5cc100f9de05ec5add8612fc55509bd9d94fff1b7e7b0f063fc1d6f7113fbe3Get Reward93118032021-10-21 15:16:0916 hrs 9 mins ago0xf22fbeb62aac5bf797d140fbf28552c3f0a70fb7 IN  0x67f4d5fb485bbb4d307a2e17fa94010871bf16750 HT0.00018732152.25
0x3d59fc4154215c829fbbfc6b49b3378b282bd8c6447d90a1a64d530f551446f5Get Reward93116482021-10-21 15:08:2416 hrs 17 mins ago0xfcb39967a92c6cc1e83c4d9b0209f0e6e48e5815 IN  0x67f4d5fb485bbb4d307a2e17fa94010871bf16750 HT0.00022129652.25
0xb7c0c39e31414bd0c20ce4ed765e3a2265e849338c9a08947979f7a97e929376Get Reward93103542021-10-21 14:03:4217 hrs 22 mins ago0x7ed63f1b442beb94ccff00950ef2a258b0c4e6bb IN  0x67f4d5fb485bbb4d307a2e17fa94010871bf16750 HT0.0002257965 2.25
0x01746199e9a905ff3858649256b58c1d3cb0096cb8582eb6dfcb12e51b9a8c71Get Reward93100012021-10-21 13:46:0317 hrs 40 mins ago0xfcb39967a92c6cc1e83c4d9b0209f0e6e48e5815 IN  0x67f4d5fb485bbb4d307a2e17fa94010871bf16750 HT0.00022579652.25
0x3448bdc687e1580c16381b59761a95e7f031edd782ed2055f9d790a68dc1af99Get Reward93086112021-10-21 12:36:3318 hrs 49 mins ago0xff8b37329037393ed3b0a286be7e556e53b4ce88 IN  0x67f4d5fb485bbb4d307a2e17fa94010871bf16750 HT0.00018732152.25
0xd55456819d88fde57d431acadf38b69ba803092e55cc72cd0408509b09e962a7Get Reward93078892021-10-21 12:00:2719 hrs 25 mins ago0xfcb39967a92c6cc1e83c4d9b0209f0e6e48e5815 IN  0x67f4d5fb485bbb4d307a2e17fa94010871bf16750 HT0.00022579652.25
0xa116d39241330c6c87bab2df18d6a29ba4016a07579ce04c6e4513c77c0c7c39Get Reward93071582021-10-21 11:23:5420 hrs 2 mins ago0x938324dc0f1831c00c62983f523c26242e97f7e4 IN  0x67f4d5fb485bbb4d307a2e17fa94010871bf16750 HT0.00018732152.25
0x02230a049b06852e8ac5bc7cce05de4b7d53fdfa6903e62b69dca5176cce0c2aGet Reward93058752021-10-21 10:19:4521 hrs 6 mins ago0x6c3ab18c705d16970cd284442f52e4d7ff8e1189 IN  0x67f4d5fb485bbb4d307a2e17fa94010871bf16750 HT0.00018282152.25
0x762aa4c612a043c6dccf44884580eb217e25e0f6399dfb05ef71877d6a135696Get Reward93052862021-10-21 9:50:1821 hrs 35 mins ago0xe178bacfc3430ab86d3ed6faa452c1357d6b251c IN  0x67f4d5fb485bbb4d307a2e17fa94010871bf16750 HT0.00018732152.25
0x0af34f80517a6a04947f6900eebde50afdd5db4a3dbb2c79dee6a3521c575f35Get Reward93052002021-10-21 9:46:0021 hrs 40 mins ago0xfcb39967a92c6cc1e83c4d9b0209f0e6e48e5815 IN  0x67f4d5fb485bbb4d307a2e17fa94010871bf16750 HT0.00022579652.25
0x54941cf47eaf66985f6bbcb56f5beaf2257125ac9bdbca20b1d5815d51a61c68Get Reward93035932021-10-21 8:25:3923 hrs ago0xafa591adee92de0f2d95768815a47317e6cf1eac IN  0x67f4d5fb485bbb4d307a2e17fa94010871bf16750 HT0.00018732152.25
0xdee69b30a41630afbc48f951f51bac19156f02e03110e311cce8f301882923dcGet Reward93026192021-10-21 7:36:5723 hrs 49 mins ago0xfcb39967a92c6cc1e83c4d9b0209f0e6e48e5815 IN  0x67f4d5fb485bbb4d307a2e17fa94010871bf16750 HT0.00022129652.25
0x0f1ef3c079409d024a01ed91d302f59956fecb80548ed3c67551a0d5b0afdbf8Get Reward93009452021-10-21 6:13:151 day 1 hr ago0xfcb39967a92c6cc1e83c4d9b0209f0e6e48e5815 IN  0x67f4d5fb485bbb4d307a2e17fa94010871bf16750 HT0.00022579652.25
0xf8e1b7b3b02909d17d63a65116d6c4b4275425e58d8cf29eaa9310e345fe8f12Get Reward92999392021-10-21 5:22:571 day 2 hrs ago0x07305a58a8eea20dd6efb7a48cad439980bbe8bc IN  0x67f4d5fb485bbb4d307a2e17fa94010871bf16750 HT0.00018732152.25
0x42a7ffa35e8755b5a7b403c9e429817d9e199d501fc8192b048d8336d93e3e81Get Reward92992752021-10-21 4:49:451 day 2 hrs ago0xf59a548405d9d57c05e63426ebfcc9779f9327ca IN  0x67f4d5fb485bbb4d307a2e17fa94010871bf16750 HT0.00018732152.25
0xf244aeee5778c8d26972995f75b69ffc22ec75ea9b33a045d06cfe7038ed410cGet Reward92991442021-10-21 4:43:121 day 2 hrs ago0xfcb39967a92c6cc1e83c4d9b0209f0e6e48e5815 IN  0x67f4d5fb485bbb4d307a2e17fa94010871bf16750 HT0.00022579652.25
0xdd583f86f795a18bef5e2c4bce69f538fb1bcf0607bf60dc341114d74c8b5f46Get Reward92984732021-10-21 4:09:391 day 3 hrs ago0x4b1718580ea31f34beecfc41a67f9731066d35fa IN  0x67f4d5fb485bbb4d307a2e17fa94010871bf16750 HT0.0001828215 2.25
0xe28237a47ea1e9dc5f34981e391705d7c28000ebfb04f44677128b15efbdb232Get Reward92975902021-10-21 3:25:301 day 4 hrs ago0xfcb39967a92c6cc1e83c4d9b0209f0e6e48e5815 IN  0x67f4d5fb485bbb4d307a2e17fa94010871bf16750 HT0.00022579652.25
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0xa37a04493850aa05181e5d7633c162e8c753194699d1717b2c4adeb524200fb050717962021-05-27 9:51:09147 days 21 hrs ago 0x048183d647236cae9e43767388bfb643603c5cbb  Contract Creation0 HT
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LpStakingRewards

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at hecoinfo.com on 2021-05-27
*/

/**
 *Submitted for verification at hecoinfo.com on 2021-05-06
*/

pragma solidity ^0.5.16;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see `ERC20Detailed`.
 */
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);

    function mint(address account, uint amount) external;

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

    function burn(address account, uint256 amount) external;
    
    /**
     * @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);
}

/**
 * @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.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be aplied to your functions to restrict their use to
 * the owner.
 */
contract Ownable {
    address private _owner;

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

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

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

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

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _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 onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

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

        return c;
    }

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

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
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);
    }
}

/**
 * @dev Optional functions from the ERC20 standard.
 */
contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of
     * these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol, uint8 decimals) public {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }

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

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

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

/**
 * @dev Collection of functions related to the address type,
 */
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;
    }
}

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

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

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

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // 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");
        }
    }
}

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the `nonReentrant` modifier
 * available, which can be aplied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 */
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");
    }
}

// Inheritance
interface IStakingRewards {
    // Views
    function lastTimeRewardApplicable() external view returns (uint256);

    function rewardPerToken() external view returns (uint256);

    function earned(address account) external view returns (uint256);

    function getRewardForDuration() external view returns (uint256);

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    // Mutative

    function stake(uint256 amount, address user) external;

    function withdraw(uint256 amount, address user) external;

    function getReward() external;
}

contract RewardsDistributionRecipient {
    address public rewardsDistribution;

    function notifyRewardAmount(uint256 reward) external;

    modifier onlyRewardsDistribution() {
        require(msg.sender == rewardsDistribution, "Caller is not RewardsDistribution contract");
        _;
    }
}

interface IHecoPool {
    function deposit(uint256 pid, uint256 amount) external;

    function withdraw(uint256 pid, uint256 amount) external;

    function emergencyWithdraw(uint256 _pid) external;
}

contract LpStakingRewards is IStakingRewards, RewardsDistributionRecipient, ReentrancyGuard {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

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

    address public operator;
    IERC20 public rewardsToken;
    IERC20 public stakingToken;
    uint256 public startTime = 0;
    uint256 public periodFinish = 0;
    uint256 public rewardRate = 0;
    uint256 public rewardsDuration;
    uint256 public lastUpdateTime;
    uint256 public rewardPerTokenStored;
    uint256 public rewardsPaid = 0;
    uint256 public rewardsed = 0;

    int public poolId;
    IHecoPool public pool;
    IERC20 public earnToken;

    mapping(address => uint256) public userRewardPerTokenPaid;
    mapping(address => uint256) public rewards;

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

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

    constructor(
        address _rewardsDistribution,
        address _rewardsToken,
        address _stakingToken,
        address _pool,
        int _poolId,
        address _earnToken,
        uint256 _period
    ) public {
        operator = address(0);
        rewardsToken = IERC20(_rewardsToken);
        stakingToken = IERC20(_stakingToken);
        rewardsDistribution = _rewardsDistribution;
        pool = IHecoPool(_pool);
        poolId = _poolId;
        earnToken = IERC20(_earnToken);
        rewardsDuration = _period;
    }

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

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

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

    function lastTimeRewardApplicable() public view returns (uint256) {
        return Math.min(block.timestamp, periodFinish);
    }

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

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

    function getRewardForDuration() external view returns (uint256) {
        return rewardRate.mul(rewardsDuration);
    }

    function stake(uint256 amount, address user) external nonReentrant updateReward(user) checkStart checkOperator(user, msg.sender) {
        require(amount > 0, "Cannot stake 0");
        require(user != address(0), "user cannot be 0");
        address from = operator != address(0) ? operator : user;
        _totalSupply = _totalSupply.add(amount);
        _balances[user] = _balances[user].add(amount);
        stakingToken.safeTransferFrom(from, address(this), amount);
        if (address(pool) != address(0) && poolId >= 0) {
            stakingToken.safeApprove(address(pool), 0);
            stakingToken.safeApprove(address(pool), uint256(-1));
            pool.deposit(uint256(poolId), amount);
            emit StakedHecoPool(from, amount);
        }
        emit Staked(from, amount);
    }

    function withdraw(uint256 amount, address user) public nonReentrant updateReward(user) checkStart checkOperator(user, msg.sender) {
        require(amount > 0, "Cannot withdraw 0");
        require(user != address(0), "user cannot be 0");
        require(_balances[user] >= amount, "not enough");
        address to = operator != address(0) ? operator : user;
        if (address(pool) != address(0) && poolId >= 0) {
            // withdraw lp token back
            pool.withdraw(uint256(poolId), amount);
            emit WithdrawnHecoPool(to, amount);
        }
        _totalSupply = _totalSupply.sub(amount);
        _balances[user] = _balances[user].sub(amount);
        stakingToken.safeTransfer(to, amount);
        emit Withdrawn(to, amount);
    }

    function getReward() public nonReentrant updateReward(msg.sender) checkStart {
        require(msg.sender != address(0), "user cannot be 0");
        uint256 reward = rewards[msg.sender];
        if (reward > 0) {
            rewards[msg.sender] = 0;
            rewardsPaid = rewardsPaid.add(reward);
            rewardsToken.safeTransfer(msg.sender, reward);
            emit RewardPaid(msg.sender, reward);
        }
    }

    function burn(uint256 amount) external onlyRewardsDistribution {
        rewardsToken.burn(address(this), amount);
    }

    modifier updateReward(address account) {
        rewardPerTokenStored = rewardPerToken();
        lastUpdateTime = lastTimeRewardApplicable();
        if (account != address(0)) {
            rewards[account] = earned(account);
            userRewardPerTokenPaid[account] = rewardPerTokenStored;
        }
        _;
    }

    modifier checkStart(){
        require(block.timestamp > startTime && startTime != 0,"not start");
        _;
    }

    modifier checkOperator(address user, address sender) {
        require((operator == address(0) && user == sender) || (operator != address(0) && operator == sender));
        _;
    }

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

    function notifyRewardAmount(uint256 reward) external onlyRewardsDistribution updateReward(address(0)) {
        require(block.timestamp >= periodFinish, "time isn't up");
        rewardRate = reward.div(rewardsDuration);
        rewardsToken.mint(address(this),reward);
        rewardsed = rewardsed.add(reward);
        lastUpdateTime = block.timestamp;
        periodFinish = block.timestamp.add(rewardsDuration);
        emit RewardAdded(reward);
    }

    function setOperator(address _operator) external onlyRewardsDistribution {
        operator = _operator;
    }

    function setStartTime(uint _startTime) external onlyRewardsDistribution {
        require(startTime == 0, 'setted');
        startTime = _startTime;
    }

    function setPool(address _pool) external onlyRewardsDistribution {
        require(_pool != address(0) && address(pool) == address(0), 'pool can not be update');
        pool = IHecoPool(_pool);
        if (poolId >= 0) {
            stakingToken.safeApprove(address(pool), 0);
            stakingToken.safeApprove(address(pool), uint256(-1));
            pool.deposit(uint256(poolId), _totalSupply);
            emit StakedHecoPool(address(this), _totalSupply);
        }
    }

    function setPoolId(int _poolId) external onlyRewardsDistribution {
        require(_poolId >= 0 && poolId < 0, 'pool id can not be update');
        poolId = _poolId;
        if (address(pool) != address(0)) {
            stakingToken.safeApprove(address(pool), 0);
            stakingToken.safeApprove(address(pool), uint256(-1));
            pool.deposit(uint256(poolId), _totalSupply);
            emit StakedHecoPool(address(this), _totalSupply);
        }
    }

    function setEarnToken(address _earnToken) external onlyRewardsDistribution {
        earnToken = IERC20(_earnToken);
    }

    function emergencyWithdraw(address to) external onlyRewardsDistribution {
        pool.emergencyWithdraw(uint256(poolId));
        stakingToken.safeTransfer(to, stakingToken.balanceOf(address(this)));
    }

    function claim(address to) external onlyRewardsDistribution {
        uint256 amount = earnToken.balanceOf(address(this));
        earnToken.transfer(to, amount);
        emit Claim(to, amount);
    }

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

    event RewardAdded(uint256 reward);
    event Staked(address indexed user, uint256 amount);
    event Withdrawn(address indexed user, uint256 amount);
    event RewardPaid(address indexed user, uint256 reward);
    event StakedHecoPool(address indexed user, uint256 amount);
    event WithdrawnHecoPool(address indexed user, uint256 amount);
    event Claim(address indexed to, uint256 amount);
}

contract LpStakingRewardsFactory is Ownable {
    // immutables
    address public rewardsToken;

    // the staking tokens for which the rewards contract has been deployed
    address[] public stakingTokens;

    // info about rewards for a particular staking token
    struct LpStakingRewardsInfo {
        address lpStakingRewards;
        uint rewardAmount;
    }

    // rewards info by staking token
    mapping(address => LpStakingRewardsInfo) public lpStakingRewardsInfoByStakingToken;

    constructor(
        address _rewardsToken
    ) Ownable() public {
        rewardsToken = _rewardsToken;
    }

    ///// permissioned functions

    // deploy a staking reward contract for the staking token, and store the total reward amount
    // hecoPoolId: set -1 if not stake lpToken to Heco
    function deploy(address stakingToken, address pool, int poolId, address earnToken, uint period) public onlyOwner {
        LpStakingRewardsInfo storage info = lpStakingRewardsInfoByStakingToken[stakingToken];
        require(info.lpStakingRewards == address(0), 'LpStakingRewardsFactory::deploy: already deployed');
        info.lpStakingRewards = address(new LpStakingRewards(/*_rewardsDistribution=*/ address(this), rewardsToken, stakingToken, pool, poolId, earnToken, period));
        stakingTokens.push(stakingToken);
    }

    // notify initial reward amount for an individual staking token.
    function notifyRewardAmount(address stakingToken, uint256 rewardAmount) public onlyOwner {
        require(rewardAmount > 0, 'amount should > 0');
        LpStakingRewardsInfo storage info = lpStakingRewardsInfoByStakingToken[stakingToken];
        require(info.lpStakingRewards != address(0), 'LpStakingRewardsFactory::notifyRewardAmount: not deployed');
        info.rewardAmount = rewardAmount;
        LpStakingRewards(info.lpStakingRewards).notifyRewardAmount(rewardAmount);
    }

    function setOperator(address stakingToken, address operator) public onlyOwner {
        LpStakingRewardsInfo storage info = lpStakingRewardsInfoByStakingToken[stakingToken];
        require(info.lpStakingRewards != address(0), 'LpStakingRewardsFactory::setOperator: not deployed');
        LpStakingRewards(info.lpStakingRewards).setOperator(operator);
    }

    function setPool(address stakingToken, address pool) public onlyOwner {
        LpStakingRewardsInfo storage info = lpStakingRewardsInfoByStakingToken[stakingToken];
        require(info.lpStakingRewards != address(0), 'LpStakingRewardsFactory::setOperator: not deployed');
        LpStakingRewards(info.lpStakingRewards).setPool(pool);
    }

    function setPoolId(address stakingToken, int poolId) public onlyOwner {
        LpStakingRewardsInfo storage info = lpStakingRewardsInfoByStakingToken[stakingToken];
        require(info.lpStakingRewards != address(0), 'LpStakingRewardsFactory::setOperator: not deployed');
        LpStakingRewards(info.lpStakingRewards).setPoolId(poolId);
    }

    function setStartTime(address stakingToken, uint startTime) public onlyOwner {
        LpStakingRewardsInfo storage info = lpStakingRewardsInfoByStakingToken[stakingToken];
        require(info.lpStakingRewards != address(0), 'LpStakingRewardsFactory::setOperator: not deployed');
        LpStakingRewards(info.lpStakingRewards).setStartTime(startTime);
    }

    function claim(address stakingToken, address to) public onlyOwner {
        LpStakingRewardsInfo storage info = lpStakingRewardsInfoByStakingToken[stakingToken];
        require(info.lpStakingRewards != address(0), 'LpStakingRewardsFactory::claim: not deployed');
        LpStakingRewards(info.lpStakingRewards).claim(to);
    }

    function setEarnToken(address stakingToken, address token) public onlyOwner {
        LpStakingRewardsInfo storage info = lpStakingRewardsInfoByStakingToken[stakingToken];
        require(info.lpStakingRewards != address(0), 'LpStakingRewardsFactory::setEarnToken: not deployed');
        LpStakingRewards(info.lpStakingRewards).setEarnToken(token);
    }

    function emergencyWithdraw(address stakingToken, address to) public onlyOwner {
        LpStakingRewardsInfo storage info = lpStakingRewardsInfoByStakingToken[stakingToken];
        require(info.lpStakingRewards != address(0), 'LpStakingRewardsFactory::emergencyWithdraw: not deployed');
        LpStakingRewards(info.lpStakingRewards).emergencyWithdraw(to);
    }

    function burn(address stakingToken, uint256 amount) public onlyOwner {
        LpStakingRewardsInfo storage info = lpStakingRewardsInfoByStakingToken[stakingToken];
        require(info.lpStakingRewards != address(0), 'LpStakingRewardsFactory::burn: not deployed');
        LpStakingRewards(info.lpStakingRewards).burn(amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_rewardsDistribution","type":"address"},{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_stakingToken","type":"address"},{"internalType":"address","name":"_pool","type":"address"},{"internalType":"int256","name":"_poolId","type":"int256"},{"internalType":"address","name":"_earnToken","type":"address"},{"internalType":"uint256","name":"_period","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","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":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","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":"StakedHecoPool","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawnHecoPool","type":"event"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"claim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"earnToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"emergencyWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"getReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getRewardForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pool","outputs":[{"internalType":"contract IHecoPool","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"poolId","outputs":[{"internalType":"int256","name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardsDistribution","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardsDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardsPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardsed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_earnToken","type":"address"}],"name":"setEarnToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"setOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_pool","type":"address"}],"name":"setPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"int256","name":"_poolId","type":"int256"}],"name":"setPoolId","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"setStartTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"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":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}],"name":"userRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040526000600555600060065560006007556000600b556000600c5534801561002957600080fd5b50604051612149380380612149833981810160405260e081101561004c57600080fd5b508051602082015160408301516060840151608085015160a086015160c09096015160018055600280546001600160a01b0319908116909155600380546001600160a01b0397881690831617905560048054958716958216959095179094556000805496861696851696909617909555600e805492851692841692909217909155600d55600f805492909416911617909155600855612059806100f06000396000f3fe608060405234801561001057600080fd5b506004361061020f5760003560e01c806369d8d6d211610125578063aef7e096116100ad578063d1af0c7d1161007c578063d1af0c7d146104de578063df136d65146104e6578063e32d2a74146104ee578063ebe2b12b146104f6578063f1f98e12146104fe5761020f565b8063aef7e09614610482578063b3ab15fb146104a8578063c8f33c91146104ce578063cd3daf9d146104d65761020f565b806378e97925116100f457806378e97925146104185780637acb7757146104205780637b0a47ee1461044c57806380faa57d146104545780638b8763471461045c5761020f565b806369d8d6d2146103bc5780636ff1c9bc146103c457806370a08231146103ea57806372f702f3146104105761020f565b80633c6b16ab116101a85780633fc6df6e116101775780633fc6df6e1461034c57806342966c68146103545780634437152a14610371578063570ca73514610397578063630fe06f1461039f5761020f565b80633c6b16ab146103025780633d18b9121461031f5780633e0a322d146103275780633e0dc34e146103445761020f565b806318160ddd116101e457806318160ddd146102c45780631c1f78eb146102cc5780631e83409a146102d4578063386a9525146102fa5761020f565b80628cc26214610214578062f714ce1461024c5780630700037d1461027a57806316f0115b146102a0575b600080fd5b61023a6004803603602081101561022a57600080fd5b50356001600160a01b0316610506565b60408051918252519081900360200190f35b6102786004803603604081101561026257600080fd5b50803590602001356001600160a01b031661059c565b005b61023a6004803603602081101561029057600080fd5b50356001600160a01b03166109ae565b6102a86109c0565b604080516001600160a01b039092168252519081900360200190f35b61023a6109cf565b61023a6109d6565b610278600480360360208110156102ea57600080fd5b50356001600160a01b03166109f4565b61023a610b7b565b6102786004803603602081101561031857600080fd5b5035610b81565b610278610d59565b6102786004803603602081101561033d57600080fd5b5035610f3d565b61023a610fc9565b6102a8610fcf565b6102786004803603602081101561036a57600080fd5b5035610fde565b6102786004803603602081101561038757600080fd5b50356001600160a01b0316611095565b6102a8611265565b610278600480360360208110156103b557600080fd5b5035611274565b61023a61135b565b610278600480360360208110156103da57600080fd5b50356001600160a01b0316611361565b61023a6004803603602081101561040057600080fd5b50356001600160a01b03166114a9565b6102a86114c4565b61023a6114d3565b6102786004803603604081101561043657600080fd5b50803590602001356001600160a01b03166114d9565b61023a6118d3565b61023a6118d9565b61023a6004803603602081101561047257600080fd5b50356001600160a01b03166118e7565b6102786004803603602081101561049857600080fd5b50356001600160a01b03166118f9565b610278600480360360208110156104be57600080fd5b50356001600160a01b0316611964565b61023a6119cf565b61023a6119d5565b6102a8611a2f565b61023a611a3e565b61023a611a44565b61023a611a4a565b6102a8611a50565b6001600160a01b0381166000908152601160209081526040808320546010909252822054610596919061058a90670de0b6b3a76400009061057e906105599061054d6119d5565b9063ffffffff611a5f16565b6001600160a01b0388166000908152601360205260409020549063ffffffff611abc16565b9063ffffffff611b1c16565b9063ffffffff611b8616565b92915050565b60018054810190819055816105af6119d5565b600a556105ba6118d9565b6009556001600160a01b03811615610601576105d581610506565b6001600160a01b038216600090815260116020908152604080832093909355600a546010909152919020555b60055442118015610613575060055415155b610650576040805162461bcd60e51b81526020600482015260096024820152681b9bdd081cdd185c9d60ba1b604482015290519081900360640190fd5b600254839033906001600160a01b031615801561067e5750806001600160a01b0316826001600160a01b0316145b806106ab57506002546001600160a01b0316158015906106ab57506002546001600160a01b038281169116145b6106b457600080fd5b600086116106fd576040805162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015290519081900360640190fd5b6001600160a01b03851661074b576040805162461bcd60e51b815260206004820152601060248201526f0757365722063616e6e6f7420626520360841b604482015290519081900360640190fd5b6001600160a01b0385166000908152601360205260409020548611156107a5576040805162461bcd60e51b815260206004820152600a6024820152690dcdee840cadcdeeaced60b31b604482015290519081900360640190fd5b6002546000906001600160a01b03166107be57856107cb565b6002546001600160a01b03165b600e549091506001600160a01b0316158015906107eb57506000600d5412155b1561089f57600e54600d5460408051630441a3e760e41b81526004810192909252602482018a9052516001600160a01b039092169163441a3e709160448082019260009290919082900301818387803b15801561084757600080fd5b505af115801561085b573d6000803e3d6000fd5b5050604080518a815290516001600160a01b03851693507f7fa37ab6c306eaa3e99af03510c8c7795b777788e002ead5ee703219a5be9ec592509081900360200190a25b6012546108b2908863ffffffff611a5f16565b6012556001600160a01b0386166000908152601360205260409020546108de908863ffffffff611a5f16565b6001600160a01b038088166000908152601360205260409020919091556004546109109116828963ffffffff611be016565b6040805188815290516001600160a01b038316917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a25050505060015481146109a9576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b505050565b60116020526000908152604090205481565b600e546001600160a01b031681565b6012545b90565b60006109ef600854600754611abc90919063ffffffff16565b905090565b6000546001600160a01b03163314610a3d5760405162461bcd60e51b815260040180806020018281038252602a815260200180611f9b602a913960400191505060405180910390fd5b600f54604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610a8857600080fd5b505afa158015610a9c573d6000803e3d6000fd5b505050506040513d6020811015610ab257600080fd5b5051600f546040805163a9059cbb60e01b81526001600160a01b03868116600483015260248201859052915193945091169163a9059cbb916044808201926020929091908290030181600087803b158015610b0c57600080fd5b505af1158015610b20573d6000803e3d6000fd5b505050506040513d6020811015610b3657600080fd5b50506040805182815290516001600160a01b038416917f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d4919081900360200190a25050565b60085481565b6000546001600160a01b03163314610bca5760405162461bcd60e51b815260040180806020018281038252602a815260200180611f9b602a913960400191505060405180910390fd5b6000610bd46119d5565b600a55610bdf6118d9565b6009556001600160a01b03811615610c2657610bfa81610506565b6001600160a01b038216600090815260116020908152604080832093909355600a546010909152919020555b600654421015610c6d576040805162461bcd60e51b815260206004820152600d60248201526c074696d652069736e277420757609c1b604482015290519081900360640190fd5b600854610c8190839063ffffffff611b1c16565b600755600354604080516340c10f1960e01b81523060048201526024810185905290516001600160a01b03909216916340c10f199160448082019260009290919082900301818387803b158015610cd757600080fd5b505af1158015610ceb573d6000803e3d6000fd5b5050600c54610d03925090508363ffffffff611b8616565b600c55426009819055600854610d1f919063ffffffff611b8616565b6006556040805183815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a15050565b6001805481019081905533610d6c6119d5565b600a55610d776118d9565b6009556001600160a01b03811615610dbe57610d9281610506565b6001600160a01b038216600090815260116020908152604080832093909355600a546010909152919020555b60055442118015610dd0575060055415155b610e0d576040805162461bcd60e51b81526020600482015260096024820152681b9bdd081cdd185c9d60ba1b604482015290519081900360640190fd5b33610e52576040805162461bcd60e51b815260206004820152601060248201526f0757365722063616e6e6f7420626520360841b604482015290519081900360640190fd5b336000908152601160205260409020548015610ee25733600090815260116020526040812055600b54610e8b908263ffffffff611b8616565b600b55600354610eab906001600160a01b0316338363ffffffff611be016565b60408051828152905133917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b50506001548114610f3a576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b50565b6000546001600160a01b03163314610f865760405162461bcd60e51b815260040180806020018281038252602a815260200180611f9b602a913960400191505060405180910390fd5b60055415610fc4576040805162461bcd60e51b81526020600482015260066024820152651cd95d1d195960d21b604482015290519081900360640190fd5b600555565b600d5481565b6000546001600160a01b031681565b6000546001600160a01b031633146110275760405162461bcd60e51b815260040180806020018281038252602a815260200180611f9b602a913960400191505060405180910390fd5b60035460408051632770a7eb60e21b81523060048201526024810184905290516001600160a01b0390921691639dc29fac9160448082019260009290919082900301818387803b15801561107a57600080fd5b505af115801561108e573d6000803e3d6000fd5b5050505050565b6000546001600160a01b031633146110de5760405162461bcd60e51b815260040180806020018281038252602a815260200180611f9b602a913960400191505060405180910390fd5b6001600160a01b038116158015906110ff5750600e546001600160a01b0316155b611149576040805162461bcd60e51b8152602060048201526016602482015275706f6f6c2063616e206e6f742062652075706461746560501b604482015290519081900360640190fd5b600e80546001600160a01b0319166001600160a01b038316179055600d54600013610f3a57600e54600454611192916001600160a01b039182169116600063ffffffff611c3216565b600e546004546111b7916001600160a01b03918216911660001963ffffffff611c3216565b600e54600d5460125460408051631c57762b60e31b815260048101939093526024830191909152516001600160a01b039092169163e2bbb1589160448082019260009290919082900301818387803b15801561121257600080fd5b505af1158015611226573d6000803e3d6000fd5b505060125460408051918252513093507fd141f18ef8acbeecd5f988b51fa559f0ab440df805d57c69cb4736ba5250ddc492509081900360200190a250565b6002546001600160a01b031681565b6000546001600160a01b031633146112bd5760405162461bcd60e51b815260040180806020018281038252602a815260200180611f9b602a913960400191505060405180910390fd5b600081121580156112d057506000600d54125b611321576040805162461bcd60e51b815260206004820152601960248201527f706f6f6c2069642063616e206e6f742062652075706461746500000000000000604482015290519081900360640190fd5b600d819055600e546001600160a01b031615610f3a57600e54600454611192916001600160a01b039182169116600063ffffffff611c3216565b600b5481565b6000546001600160a01b031633146113aa5760405162461bcd60e51b815260040180806020018281038252602a815260200180611f9b602a913960400191505060405180910390fd5b600e54600d5460408051632989754760e11b81526004810192909252516001600160a01b0390921691635312ea8e9160248082019260009290919082900301818387803b1580156113fa57600080fd5b505af115801561140e573d6000803e3d6000fd5b505060048054604080516370a0823160e01b8152309381019390935251610f3a94508593506001600160a01b03909116916370a08231916024808301926020929190829003018186803b15801561146457600080fd5b505afa158015611478573d6000803e3d6000fd5b505050506040513d602081101561148e57600080fd5b50516004546001600160a01b0316919063ffffffff611be016565b6001600160a01b031660009081526013602052604090205490565b6004546001600160a01b031681565b60055481565b60018054810190819055816114ec6119d5565b600a556114f76118d9565b6009556001600160a01b0381161561153e5761151281610506565b6001600160a01b038216600090815260116020908152604080832093909355600a546010909152919020555b60055442118015611550575060055415155b61158d576040805162461bcd60e51b81526020600482015260096024820152681b9bdd081cdd185c9d60ba1b604482015290519081900360640190fd5b600254839033906001600160a01b03161580156115bb5750806001600160a01b0316826001600160a01b0316145b806115e857506002546001600160a01b0316158015906115e857506002546001600160a01b038281169116145b6115f157600080fd5b60008611611637576040805162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b604482015290519081900360640190fd5b6001600160a01b038516611685576040805162461bcd60e51b815260206004820152601060248201526f0757365722063616e6e6f7420626520360841b604482015290519081900360640190fd5b6002546000906001600160a01b031661169e57856116ab565b6002546001600160a01b03165b6012549091506116c1908863ffffffff611b8616565b6012556001600160a01b0386166000908152601360205260409020546116ed908863ffffffff611b8616565b6001600160a01b03808816600090815260136020526040902091909155600454611720911682308a63ffffffff611d4516565b600e546001600160a01b03161580159061173d57506000600d5412155b1561183a57600e54600454611766916001600160a01b039182169116600063ffffffff611c3216565b600e5460045461178b916001600160a01b03918216911660001963ffffffff611c3216565b600e54600d5460408051631c57762b60e31b81526004810192909252602482018a9052516001600160a01b039092169163e2bbb1589160448082019260009290919082900301818387803b1580156117e257600080fd5b505af11580156117f6573d6000803e3d6000fd5b5050604080518a815290516001600160a01b03851693507fd141f18ef8acbeecd5f988b51fa559f0ab440df805d57c69cb4736ba5250ddc492509081900360200190a25b6040805188815290516001600160a01b038316917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a25050505060015481146109a9576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60075481565b60006109ef42600654611da5565b60106020526000908152604090205481565b6000546001600160a01b031633146119425760405162461bcd60e51b815260040180806020018281038252602a815260200180611f9b602a913960400191505060405180910390fd5b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146119ad5760405162461bcd60e51b815260040180806020018281038252602a815260200180611f9b602a913960400191505060405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60095481565b6000601254600014156119eb5750600a546109d3565b6109ef611a2060125461057e670de0b6b3a7640000611a14600754611a1460095461054d6118d9565b9063ffffffff611abc16565b600a549063ffffffff611b8616565b6003546001600160a01b031681565b600a5481565b600c5481565b60065481565b600f546001600160a01b031681565b600082821115611ab6576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082611acb57506000610596565b82820282848281611ad857fe5b0414611b155760405162461bcd60e51b8152600401808060200182810382526021815260200180611f7a6021913960400191505060405180910390fd5b9392505050565b6000808211611b72576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b6000828481611b7d57fe5b04949350505050565b600082820183811015611b15576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526109a9908490611dbb565b801580611cb8575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015611c8a57600080fd5b505afa158015611c9e573d6000803e3d6000fd5b505050506040513d6020811015611cb457600080fd5b5051155b611cf35760405162461bcd60e51b8152600401808060200182810382526036815260200180611fef6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526109a9908490611dbb565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611d9f908590611dbb565b50505050565b6000818310611db45781611b15565b5090919050565b611dcd826001600160a01b0316611f73565b611e1e576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310611e5c5780518252601f199092019160209182019101611e3d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611ebe576040519150601f19603f3d011682016040523d82523d6000602084013e611ec3565b606091505b509150915081611f1a576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115611d9f57808060200190516020811015611f3657600080fd5b5051611d9f5760405162461bcd60e51b815260040180806020018281038252602a815260200180611fc5602a913960400191505060405180910390fd5b3b15159056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7743616c6c6572206973206e6f742052657761726473446973747269627574696f6e20636f6e74726163745361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a72315820db3742ed996178c49b198aa3e0e455104c98ddb76f9280b721a8122b0535dcb564736f6c63430005100032000000000000000000000000048183d647236cae9e43767388bfb643603c5cbb00000000000000000000000052ee54dd7a68e9cf131b0a57fd6015c74d7140e2000000000000000000000000615e6285c5944540fd8bd921c9c8c56739fd1e13000000000000000000000000fb03e11d93632d97a8981158a632dd5986f5e909000000000000000000000000000000000000000000000000000000000000001000000000000000000000000025d2e80cb6b86881fd7e07dd263fb79f4abe033c0000000000000000000000000000000000000000000000000000000000093a80

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

000000000000000000000000048183d647236cae9e43767388bfb643603c5cbb00000000000000000000000052ee54dd7a68e9cf131b0a57fd6015c74d7140e2000000000000000000000000615e6285c5944540fd8bd921c9c8c56739fd1e13000000000000000000000000fb03e11d93632d97a8981158a632dd5986f5e909000000000000000000000000000000000000000000000000000000000000001000000000000000000000000025d2e80cb6b86881fd7e07dd263fb79f4abe033c0000000000000000000000000000000000000000000000000000000000093a80

-----Decoded View---------------
Arg [0] : _rewardsDistribution (address): 0x048183d647236cae9e43767388bfb643603c5cbb
Arg [1] : _rewardsToken (address): 0x52ee54dd7a68e9cf131b0a57fd6015c74d7140e2
Arg [2] : _stakingToken (address): 0x615e6285c5944540fd8bd921c9c8c56739fd1e13
Arg [3] : _pool (address): 0xfb03e11d93632d97a8981158a632dd5986f5e909
Arg [4] : _poolId (int256): 16
Arg [5] : _earnToken (address): 0x25d2e80cb6b86881fd7e07dd263fb79f4abe033c
Arg [6] : _period (uint256): 604800

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000048183d647236cae9e43767388bfb643603c5cbb
Arg [1] : 00000000000000000000000052ee54dd7a68e9cf131b0a57fd6015c74d7140e2
Arg [2] : 000000000000000000000000615e6285c5944540fd8bd921c9c8c56739fd1e13
Arg [3] : 000000000000000000000000fb03e11d93632d97a8981158a632dd5986f5e909
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [5] : 00000000000000000000000025d2e80cb6b86881fd7e07dd263fb79f4abe033c
Arg [6] : 0000000000000000000000000000000000000000000000000000000000093a80


Deployed ByteCode Sourcemap

18639:8210:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18639:8210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20888:198;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20888:198:0;-1:-1:-1;;;;;20888:198:0;;:::i;:::-;;;;;;;;;;;;;;;;22045:772;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22045:772:0;;;;;;-1:-1:-1;;;;;22045:772:0;;:::i;:::-;;19399:42;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19399:42:0;-1:-1:-1;;;;;19399:42:0;;:::i;19275:21::-;;;:::i;:::-;;;;-1:-1:-1;;;;;19275:21:0;;;;;;;;;;;;;;20190:93;;;:::i;21094:121::-;;;:::i;26193:204::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26193:204:0;-1:-1:-1;;;;;26193:204:0;;:::i;19062:30::-;;;:::i;24110:463::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24110:463:0;;:::i;22825:434::-;;;:::i;24701:157::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24701:157:0;;:::i;19251:17::-;;;:::i;18163:34::-;;;:::i;23267:122::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23267:122:0;;:::i;24866:487::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24866:487:0;-1:-1:-1;;;;;24866:487:0;;:::i;18857:23::-;;;:::i;25361:475::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25361:475:0;;:::i;19177:30::-;;;:::i;25976:209::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25976:209:0;-1:-1:-1;;;;;25976:209:0;;:::i;20291:112::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20291:112:0;-1:-1:-1;;;;;20291:112:0;;:::i;18920:26::-;;;:::i;18953:28::-;;;:::i;21223:814::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21223:814:0;;;;;;-1:-1:-1;;;;;21223:814:0;;:::i;19026:29::-;;;:::i;20411:131::-;;;:::i;19335:57::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19335:57:0;-1:-1:-1;;;;;19335:57:0;;:::i;25844:124::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25844:124:0;-1:-1:-1;;;;;25844:124:0;;:::i;24581:112::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24581:112:0;-1:-1:-1;;;;;24581:112:0;;:::i;19099:29::-;;;:::i;20550:330::-;;;:::i;18887:26::-;;;:::i;19135:35::-;;;:::i;19214:28::-;;;:::i;18988:31::-;;;:::i;19303:23::-;;;:::i;20888:198::-;-1:-1:-1;;;;;21061:16:0;;20942:7;21061:16;;;:7;:16;;;;;;;;;21013:22;:31;;;;;;20969:109;;21061:16;20969:87;;21051:4;;20969:77;;20992:53;;:16;:14;:16::i;:::-;:20;:53;:20;:53;:::i;:::-;-1:-1:-1;;;;;20969:18:0;;;;;;:9;:18;;;;;;;:22;:77::i;:::-;:81;:87;:81;:87;:::i;:::-;:91;:109;:91;:109;:::i;:::-;20962:116;20888:198;-1:-1:-1;;20888:198:0:o;22045:772::-;17287:1;17270:18;;;;;;;;22126:4;23470:16;:14;:16::i;:::-;23447:20;:39;23514:26;:24;:26::i;:::-;23497:14;:43;-1:-1:-1;;;;;23555:21:0;;;23551:157;;23612:15;23619:7;23612:6;:15::i;:::-;-1:-1:-1;;;;;23593:16:0;;;;;;:7;:16;;;;;;;;:34;;;;23676:20;;23642:22;:31;;;;;;:54;23551:157;23793:9;;23775:15;:27;:45;;;;-1:-1:-1;23806:9:0;;:14;;23775:45;23767:66;;;;;-1:-1:-1;;;23767:66:0;;;;;;;;;;;;-1:-1:-1;;;23767:66:0;;;;;;;;;;;;;;;23934:8;;22157:4;;22163:10;;-1:-1:-1;;;;;23934:8:0;:22;:40;;;;-1:-1:-1;;;;;;23960:14:0;;;;;;;23934:40;23933:92;;;-1:-1:-1;23980:8:0;;-1:-1:-1;;;;;23980:8:0;:22;;;;:44;;-1:-1:-1;24006:8:0;;-1:-1:-1;;;;;24006:18:0;;;:8;;:18;23980:44;23925:101;;;;;;22203:1;22194:6;:10;22186:40;;;;;-1:-1:-1;;;22186:40:0;;;;;;;;;;;;-1:-1:-1;;;22186:40:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;22245:18:0;;22237:47;;;;;-1:-1:-1;;;22237:47:0;;;;;;;;;;;;-1:-1:-1;;;22237:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;22303:15:0;;;;;;:9;:15;;;;;;-1:-1:-1;;22303:25:0;22295:48;;;;;-1:-1:-1;;;22295:48:0;;;;;;;;;;;;-1:-1:-1;;;22295:48:0;;;;;;;;;;;;;;;22367:8;;22354:10;;-1:-1:-1;;;;;22367:8:0;:40;;22403:4;22367:40;;;22392:8;;-1:-1:-1;;;;;22392:8:0;22367:40;22430:4;;22354:53;;-1:-1:-1;;;;;;22430:4:0;22422:27;;;;:42;;;22463:1;22453:6;;:11;;22422:42;22418:201;;;22520:4;;22542:6;;22520:38;;;-1:-1:-1;;;22520:38:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22520:4:0;;;;:13;;:38;;;;;-1:-1:-1;;22520:38:0;;;;;;;;-1:-1:-1;22520:4:0;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;22520:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;22578:29:0;;;;;;;;-1:-1:-1;;;;;22578:29:0;;;-1:-1:-1;22578:29:0;;-1:-1:-1;22578:29:0;;;;;;;;22418:201;22644:12;;:24;;22661:6;22644:24;:16;:24;:::i;:::-;22629:12;:39;-1:-1:-1;;;;;22697:15:0;;;;;;:9;:15;;;;;;:27;;22717:6;22697:19;:27::i;:::-;-1:-1:-1;;;;;22679:15:0;;;;;;;:9;:15;;;;;:45;;;;22735:12;;:37;;:12;22761:2;22765:6;22735:25;:37::i;:::-;22788:21;;;;;;;;-1:-1:-1;;;;;22788:21:0;;;;;;;;;;;;;24037:1;23844;;17346;17382:13;;17366:12;:29;17358:73;;;;;-1:-1:-1;;;17358:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22045:772;;;:::o;19399:42::-;;;;;;;;;;;;;:::o;19275:21::-;;;-1:-1:-1;;;;;19275:21:0;;:::o;20190:93::-;20263:12;;20190:93;;:::o;21094:121::-;21149:7;21176:31;21191:15;;21176:10;;:14;;:31;;;;:::i;:::-;21169:38;;21094:121;:::o;26193:204::-;18335:19;;-1:-1:-1;;;;;18335:19:0;18321:10;:33;18313:88;;;;-1:-1:-1;;;18313:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26281:9;;:34;;;-1:-1:-1;;;26281:34:0;;26309:4;26281:34;;;;;;-1:-1:-1;;;;;;;26281:9:0;;-1:-1:-1;;26281:34:0;;;;;;;;;;;;;;:9;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;26281:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26281:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26281:34:0;26326:9;;:30;;;-1:-1:-1;;;26326:30:0;;-1:-1:-1;;;;;26326:30:0;;;;;;;;;;;;;;;26281:34;;-1:-1:-1;26326:9:0;;;-1:-1:-1;;26326:30:0;;;;;26281:34;;26326:30;;;;;;;;-1:-1:-1;26326:9:0;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;26326:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26326:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;26372:17:0;;;;;;;;-1:-1:-1;;;;;26372:17:0;;;;;;;;;26326:30;26372:17;;;18412:1;26193:204;:::o;19062:30::-;;;;:::o;24110:463::-;18335:19;;-1:-1:-1;;;;;18335:19:0;18321:10;:33;18313:88;;;;-1:-1:-1;;;18313:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24208:1;23470:16;:14;:16::i;:::-;23447:20;:39;23514:26;:24;:26::i;:::-;23497:14;:43;-1:-1:-1;;;;;23555:21:0;;;23551:157;;23612:15;23619:7;23612:6;:15::i;:::-;-1:-1:-1;;;;;23593:16:0;;;;;;:7;:16;;;;;;;;:34;;;;23676:20;;23642:22;:31;;;;;;:54;23551:157;24250:12;;24231:15;:31;;24223:57;;;;;-1:-1:-1;;;24223:57:0;;;;;;;;;;;;-1:-1:-1;;;24223:57:0;;;;;;;;;;;;;;;24315:15;;24304:27;;:6;;:27;:10;:27;:::i;:::-;24291:10;:40;24342:12;;:39;;;-1:-1:-1;;;24342:39:0;;24368:4;24342:39;;;;;;;;;;;;-1:-1:-1;;;;;24342:12:0;;;;-1:-1:-1;;24342:39:0;;;;;-1:-1:-1;;24342:39:0;;;;;;;;-1:-1:-1;24342:12:0;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;24342:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;24404:9:0;;:21;;-1:-1:-1;24404:9:0;-1:-1:-1;24418:6:0;24404:21;:13;:21;:::i;:::-;24392:9;:33;24453:15;24436:14;:32;;;24514:15;;24494:36;;24453:15;24494:36;:19;:36;:::i;:::-;24479:12;:51;24546:19;;;;;;;;;;;;;;;;;18412:1;24110:463;:::o;22825:434::-;17287:1;17270:18;;;;;;;;22879:10;23470:16;:14;:16::i;:::-;23447:20;:39;23514:26;:24;:26::i;:::-;23497:14;:43;-1:-1:-1;;;;;23555:21:0;;;23551:157;;23612:15;23619:7;23612:6;:15::i;:::-;-1:-1:-1;;;;;23593:16:0;;;;;;:7;:16;;;;;;;;:34;;;;23676:20;;23642:22;:31;;;;;;:54;23551:157;23793:9;;23775:15;:27;:45;;;;-1:-1:-1;23806:9:0;;:14;;23775:45;23767:66;;;;;-1:-1:-1;;;23767:66:0;;;;;;;;;;;;-1:-1:-1;;;23767:66:0;;;;;;;;;;;;;;;22921:10;22913:53;;;;;-1:-1:-1;;;22913:53:0;;;;;;;;;;;;-1:-1:-1;;;22913:53:0;;;;;;;;;;;;;;;23002:10;22977:14;22994:19;;;:7;:19;;;;;;23028:10;;23024:228;;23063:10;23077:1;23055:19;;;:7;:19;;;;;:23;23107:11;;:23;;23123:6;23107:23;:15;:23;:::i;:::-;23093:11;:37;23145:12;;:45;;-1:-1:-1;;;;;23145:12:0;23171:10;23183:6;23145:25;:45::i;:::-;23210:30;;;;;;;;23221:10;;23210:30;;;;;;;;;;23024:228;23844:1;17346;17382:13;;17366:12;:29;17358:73;;;;;-1:-1:-1;;;17358:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22825:434;:::o;24701:157::-;18335:19;;-1:-1:-1;;;;;18335:19:0;18321:10;:33;18313:88;;;;-1:-1:-1;;;18313:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24792:9;;:14;24784:33;;;;;-1:-1:-1;;;24784:33:0;;;;;;;;;;;;-1:-1:-1;;;24784:33:0;;;;;;;;;;;;;;;24828:9;:22;24701:157::o;19251:17::-;;;;:::o;18163:34::-;;;-1:-1:-1;;;;;18163:34:0;;:::o;23267:122::-;18335:19;;-1:-1:-1;;;;;18335:19:0;18321:10;:33;18313:88;;;;-1:-1:-1;;;18313:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23341:12;;:40;;;-1:-1:-1;;;23341:40:0;;23367:4;23341:40;;;;;;;;;;;;-1:-1:-1;;;;;23341:12:0;;;;:17;;:40;;;;;-1:-1:-1;;23341:40:0;;;;;;;;-1:-1:-1;23341:12:0;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;23341:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23341:40:0;;;;23267:122;:::o;24866:487::-;18335:19;;-1:-1:-1;;;;;18335:19:0;18321:10;:33;18313:88;;;;-1:-1:-1;;;18313:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24950:19:0;;;;;;:50;;-1:-1:-1;24981:4:0;;-1:-1:-1;;;;;24981:4:0;24973:27;24950:50;24942:85;;;;;-1:-1:-1;;;24942:85:0;;;;;;;;;;;;-1:-1:-1;;;24942:85:0;;;;;;;;;;;;;;;25038:4;:23;;-1:-1:-1;;;;;;25038:23:0;-1:-1:-1;;;;;25038:23:0;;;;;25076:6;;-1:-1:-1;;25072:274:0;;25137:4;;25104:12;;:42;;-1:-1:-1;;;;;25104:12:0;;;;25137:4;;25104:24;:42::i;:::-;25194:4;;25161:12;;:52;;-1:-1:-1;;;;;25161:12:0;;;;25194:4;-1:-1:-1;;25161:24:0;:52::i;:::-;25228:4;;25249:6;;25258:12;;25228:43;;;-1:-1:-1;;;25228:43:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25228:4:0;;;;:12;;:43;;;;;-1:-1:-1;;25228:43:0;;;;;;;;-1:-1:-1;25228:4:0;:43;;;5:2:-1;;;;30:1;27;20:12;5:2;25228:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;25321:12:0;;25291:43;;;;;;;25314:4;;-1:-1:-1;25291:43:0;;-1:-1:-1;25291:43:0;;;;;;;;24866:487;:::o;18857:23::-;;;-1:-1:-1;;;;;18857:23:0;;:::o;25361:475::-;18335:19;;-1:-1:-1;;;;;18335:19:0;18321:10;:33;18313:88;;;;-1:-1:-1;;;18313:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25456:1;25445:7;:12;;:26;;;;;25470:1;25461:6;;:10;25445:26;25437:64;;;;;-1:-1:-1;;;25437:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25512:6;:16;;;25551:4;;-1:-1:-1;;;;;25551:4:0;25543:27;25539:290;;25620:4;;25587:12;;:42;;-1:-1:-1;;;;;25587:12:0;;;;25620:4;;25587:24;:42::i;19177:30::-;;;;:::o;25976:209::-;18335:19;;-1:-1:-1;;;;;18335:19:0;18321:10;:33;18313:88;;;;-1:-1:-1;;;18313:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26059:4;;26090:6;;26059:39;;;-1:-1:-1;;;26059:39:0;;;;;;;;;;-1:-1:-1;;;;;26059:4:0;;;;:22;;:39;;;;;-1:-1:-1;;26059:39:0;;;;;;;;-1:-1:-1;26059:4:0;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;26059:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;26139:12:0;;;:37;;;-1:-1:-1;;;26139:37:0;;26170:4;26139:37;;;;;;;;26109:68;;-1:-1:-1;26135:2:0;;-1:-1:-1;;;;;;26139:12:0;;;;-1:-1:-1;;26139:37:0;;;;;;;;;;;;;;:12;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;26139:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26139:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26139:37:0;26109:12;;-1:-1:-1;;;;;26109:12:0;;;:25;:68::i;20291:112::-;-1:-1:-1;;;;;20377:18:0;20350:7;20377:18;;;:9;:18;;;;;;;20291:112::o;18920:26::-;;;-1:-1:-1;;;;;18920:26:0;;:::o;18953:28::-;;;;:::o;21223:814::-;17287:1;17270:18;;;;;;;;21303:4;23470:16;:14;:16::i;:::-;23447:20;:39;23514:26;:24;:26::i;:::-;23497:14;:43;-1:-1:-1;;;;;23555:21:0;;;23551:157;;23612:15;23619:7;23612:6;:15::i;:::-;-1:-1:-1;;;;;23593:16:0;;;;;;:7;:16;;;;;;;;:34;;;;23676:20;;23642:22;:31;;;;;;:54;23551:157;23793:9;;23775:15;:27;:45;;;;-1:-1:-1;23806:9:0;;:14;;23775:45;23767:66;;;;;-1:-1:-1;;;23767:66:0;;;;;;;;;;;;-1:-1:-1;;;23767:66:0;;;;;;;;;;;;;;;23934:8;;21334:4;;21340:10;;-1:-1:-1;;;;;23934:8:0;:22;:40;;;;-1:-1:-1;;;;;;23960:14:0;;;;;;;23934:40;23933:92;;;-1:-1:-1;23980:8:0;;-1:-1:-1;;;;;23980:8:0;:22;;;;:44;;-1:-1:-1;24006:8:0;;-1:-1:-1;;;;;24006:18:0;;;:8;;:18;23980:44;23925:101;;;;;;21380:1;21371:6;:10;21363:37;;;;;-1:-1:-1;;;21363:37:0;;;;;;;;;;;;-1:-1:-1;;;21363:37:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;21419:18:0;;21411:47;;;;;-1:-1:-1;;;21411:47:0;;;;;;;;;;;;-1:-1:-1;;;21411:47:0;;;;;;;;;;;;;;;21484:8;;21469:12;;-1:-1:-1;;;;;21484:8:0;:40;;21520:4;21484:40;;;21509:8;;-1:-1:-1;;;;;21509:8:0;21484:40;21550:12;;21469:55;;-1:-1:-1;21550:24:0;;21567:6;21550:24;:16;:24;:::i;:::-;21535:12;:39;-1:-1:-1;;;;;21603:15:0;;;;;;:9;:15;;;;;;:27;;21623:6;21603:19;:27::i;:::-;-1:-1:-1;;;;;21585:15:0;;;;;;;:9;:15;;;;;:45;;;;21641:12;;:58;;:12;21671:4;21685;21692:6;21641:29;:58::i;:::-;21722:4;;-1:-1:-1;;;;;21722:4:0;21714:27;;;;:42;;;21755:1;21745:6;;:11;;21714:42;21710:284;;;21806:4;;21773:12;;:42;;-1:-1:-1;;;;;21773:12:0;;;;21806:4;;21773:24;:42::i;:::-;21863:4;;21830:12;;:52;;-1:-1:-1;;;;;21830:12:0;;;;21863:4;-1:-1:-1;;21830:24:0;:52::i;:::-;21897:4;;21918:6;;21897:37;;;-1:-1:-1;;;21897:37:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21897:4:0;;;;:12;;:37;;;;;-1:-1:-1;;21897:37:0;;;;;;;;-1:-1:-1;21897:4:0;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;21897:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;21954:28:0;;;;;;;;-1:-1:-1;;;;;21954:28:0;;;-1:-1:-1;21954:28:0;;-1:-1:-1;21954:28:0;;;;;;;;21710:284;22009:20;;;;;;;;-1:-1:-1;;;;;22009:20:0;;;;;;;;;;;;;24037:1;23844;;17346;17382:13;;17366:12;:29;17358:73;;;;;-1:-1:-1;;;17358:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;19026:29;;;;:::o;20411:131::-;20468:7;20495:39;20504:15;20521:12;;20495:8;:39::i;19335:57::-;;;;;;;;;;;;;:::o;25844:124::-;18335:19;;-1:-1:-1;;;;;18335:19:0;18321:10;:33;18313:88;;;;-1:-1:-1;;;18313:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25930:9;:30;;-1:-1:-1;;;;;;25930:30:0;-1:-1:-1;;;;;25930:30:0;;;;;;;;;;25844:124::o;24581:112::-;18335:19;;-1:-1:-1;;;;;18335:19:0;18321:10;:33;18313:88;;;;-1:-1:-1;;;18313:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24665:8;:20;;-1:-1:-1;;;;;;24665:20:0;-1:-1:-1;;;;;24665:20:0;;;;;;;;;;24581:112::o;19099:29::-;;;;:::o;20550:330::-;20597:7;20621:12;;20637:1;20621:17;20617:77;;;-1:-1:-1;20662:20:0;;20655:27;;20617:77;20724:148;20767:90;20844:12;;20767:72;20834:4;20767:62;20818:10;;20767:46;20798:14;;20767:26;:24;:26::i;:46::-;:50;:62;:50;:62;:::i;:90::-;20724:20;;;:148;:24;:148;:::i;18887:26::-;;;-1:-1:-1;;;;;18887:26:0;;:::o;19135:35::-;;;;:::o;19214:28::-;;;;:::o;18988:31::-;;;;:::o;19303:23::-;;;-1:-1:-1;;;;;19303:23:0;;:::o;6672:184::-;6730:7;6763:1;6758;:6;;6750:49;;;;;-1:-1:-1;;;6750:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6822:5:0;;;6672:184::o;7107:470::-;7165:7;7409:6;7405:47;;-1:-1:-1;7439:1:0;7432:8;;7405:47;7476:5;;;7480:1;7476;:5;:1;7500:5;;;;;:10;7492:56;;;;-1:-1:-1;;;7492:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7568:1;7107:470;-1:-1:-1;;;7107:470:0:o;8045:333::-;8103:7;8202:1;8198;:5;8190:44;;;;;-1:-1:-1;;;8190:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8245:9;8261:1;8257;:5;;;;;;;8045:333;-1:-1:-1;;;;8045:333:0:o;6216:181::-;6274:7;6306:5;;;6330:6;;;;6322:46;;;;;-1:-1:-1;;;6322:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;12849:176;12958:58;;;-1:-1:-1;;;;;12958:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;12958:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;12932:85:0;;12951:5;;12932:18;:85::i;13245:621::-;13615:10;;;13614:62;;-1:-1:-1;13631:39:0;;;-1:-1:-1;;;13631:39:0;;13655:4;13631:39;;;;-1:-1:-1;;;;;13631:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;13631:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13631:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13631:39:0;:44;13614:62;13606:152;;;;-1:-1:-1;;;13606:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13795:62;;;-1:-1:-1;;;;;13795:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;13795:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;13769:89:0;;13788:5;;13769:18;:89::i;13033:204::-;13160:68;;;-1:-1:-1;;;;;13160:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;13160:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;13134:95:0;;13153:5;;13134:18;:95::i;:::-;13033:204;;;;:::o;9341:106::-;9399:7;9430:1;9426;:5;:13;;9438:1;9426:13;;;-1:-1:-1;9434:1:0;;9419:20;-1:-1:-1;9341:106:0:o;14843:1114::-;15447:27;-1:-1:-1;;;;;15447:25:0;;;:27::i;:::-;15439:71;;;;;-1:-1:-1;;;15439:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15584:12;15598:23;15633:5;-1:-1:-1;;;;;15625:19:0;15645:4;15625: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;;;15625: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;;15583:67:0;;;;15669:7;15661:52;;;;;-1:-1:-1;;;15661:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15730:17;;:21;15726:224;;15872:10;15861:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15861:30:0;15853:85;;;;-1:-1:-1;;;15853:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11862:422;12229:20;12268:8;;;11862:422::o

Swarm Source

bzzr://db3742ed996178c49b198aa3e0e455104c98ddb76f9280b721a8122b0535dcb5
Block Transaction Gas Used Reward
Age Block Fee Address Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading