Contract 0xbe9c8dbba0e8b0f58e3d731da0759f44eb82729d

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x6fb3c7a9a3b30877d44105155a230b32e3c6ef638bcfc568e5768a209f60cce6Get Reward103920892021-11-28 3:31:392 hrs 20 mins ago0x1a1e7a3b925476a3d81fddaa113dceb94257e88a IN  0xbe9c8dbba0e8b0f58e3d731da0759f44eb82729d0 HT0.000187605 2.25
0x15375737d4584df516701b46a65228ed12539381cf679a0162e8445afbbd96baGet Reward103919102021-11-28 3:22:422 hrs 29 mins ago0x1a1e7a3b925476a3d81fddaa113dceb94257e88a IN  0xbe9c8dbba0e8b0f58e3d731da0759f44eb82729d0 HT0.000187605 2.25
0xfdef1853852bd38dbe1940f21b4ad9660bf9097c9e2f17bd8b6899e0a46f3ceaGet Reward103917782021-11-28 3:16:062 hrs 35 mins ago0x1a1e7a3b925476a3d81fddaa113dceb94257e88a IN  0xbe9c8dbba0e8b0f58e3d731da0759f44eb82729d0 HT0.000187605 2.25
0x8dd8747bfbebc5d4c693880ab3dd95079847e15eda8c56b98f51b64b9841b3dbGet Reward103910042021-11-28 2:37:243 hrs 14 mins ago0xff9c6e3acc07792649644e97e358ec60ad22b018 IN  0xbe9c8dbba0e8b0f58e3d731da0759f44eb82729d0 HT0.0001876052.25
0xd639b682c4279f209e2884151dc29853b2e75b1744c571e693c4ead696cd2d58Get Reward103895812021-11-28 1:26:154 hrs 25 mins ago0x1a1e7a3b925476a3d81fddaa113dceb94257e88a IN  0xbe9c8dbba0e8b0f58e3d731da0759f44eb82729d0 HT0.000187605 2.25
0x05ce3c276da49ef29211762412bcc8bba109c9cbe494162653e78e54ed5cf5b3Get Reward103895112021-11-28 1:22:454 hrs 28 mins ago0x1a1e7a3b925476a3d81fddaa113dceb94257e88a IN  0xbe9c8dbba0e8b0f58e3d731da0759f44eb82729d0 HT0.000187605 2.25
0x542e0597100bad406cbdfa37270cccc51aeb2febf3c5205aef9658e01ab1b0caGet Reward103833922021-11-27 20:16:489 hrs 34 mins ago0x702ff9797a2b9335efc11fca263fa0685e298952 IN  0xbe9c8dbba0e8b0f58e3d731da0759f44eb82729d0 HT0.00027015123.24
0xd9f32220422b5f74f77bbd276119cd717db37294e789009c7ba4c4f04b5a1859Get Reward103786302021-11-27 16:18:4213 hrs 33 mins ago0x1a1e7a3b925476a3d81fddaa113dceb94257e88a IN  0xbe9c8dbba0e8b0f58e3d731da0759f44eb82729d0 HT0.000187605 2.25
0x8a74b404e3cfe3dad9dd8270bb262d92d45abdf7c05cfe86e27ad60884db9345Get Reward103785032021-11-27 16:12:2113 hrs 39 mins ago0x1a1e7a3b925476a3d81fddaa113dceb94257e88a IN  0xbe9c8dbba0e8b0f58e3d731da0759f44eb82729d0 HT0.000187605 2.25
0x3940cc37d6358a981ebd552624ff428e5458d3c738ff791a69c16b0f880350a1Get Reward103784552021-11-27 16:09:5713 hrs 41 mins ago0x1a1e7a3b925476a3d81fddaa113dceb94257e88a IN  0xbe9c8dbba0e8b0f58e3d731da0759f44eb82729d0 HT0.000187605 2.25
0xc820a01f956e83e4bf5916ab84cf5d21b5aacde7f6ceea36c6e74acc1a01f798Get Reward103728612021-11-27 11:30:1518 hrs 21 mins ago0x1a1e7a3b925476a3d81fddaa113dceb94257e88a IN  0xbe9c8dbba0e8b0f58e3d731da0759f44eb82729d0 HT0.000187605 2.25
0x3597666f41623fe4bcd63b92e295c4c30affc63252838f5b604fe55b1cce9a4dGet Reward103728182021-11-27 11:28:0618 hrs 23 mins ago0x1a1e7a3b925476a3d81fddaa113dceb94257e88a IN  0xbe9c8dbba0e8b0f58e3d731da0759f44eb82729d0 HT0.000187605 2.25
0x59efac12433f0697f656a627915c401a43625694430f069050587cec9b4de2fcGet Reward103726342021-11-27 11:18:5418 hrs 32 mins ago0x1a1e7a3b925476a3d81fddaa113dceb94257e88a IN  0xbe9c8dbba0e8b0f58e3d731da0759f44eb82729d0 HT0.0002435985 2.25
0xa475788e4fdd1f0a3ddd6b267a678e2fdfd7404db6447568545b021de2bcada9Get Reward103704562021-11-27 9:30:0020 hrs 21 mins ago0x1a65b1b323147d2e4326c6ed1af979588d67639e IN  0xbe9c8dbba0e8b0f58e3d731da0759f44eb82729d0 HT0.0001876052.25
0x50efa323f2ee19a3744d6d2b1196b1250ec2f817a00e4f42c64b2e9beb19afbbGet Reward103704482021-11-27 9:29:3620 hrs 22 mins ago0x1a65b1b323147d2e4326c6ed1af979588d67639e IN  0xbe9c8dbba0e8b0f58e3d731da0759f44eb82729d0 HT0.0001831052.25
0x3b4f4087b2d2dab54e8e87571d17a13b2cc6f6f93d403529215d64b3a043fe31Get Reward103700412021-11-27 9:09:1520 hrs 42 mins ago0x167c99c9701348d12cebfa52bf3bf40e8ae4f282 IN  0xbe9c8dbba0e8b0f58e3d731da0759f44eb82729d0 HT0.0001876052.25
0x4d2e01a0a9f58e66461c6d7e9538717fb1b84dbb7acc7ec04eb405ef30b3295eGet Reward103689662021-11-27 8:15:3021 hrs 36 mins ago0x1a1e7a3b925476a3d81fddaa113dceb94257e88a IN  0xbe9c8dbba0e8b0f58e3d731da0759f44eb82729d0 HT0.000187605 2.25
0x0935a7f8c5807a1534924a3d191e2952aef3c5208567d0d08eda1e421fa88aaeGet Reward103686972021-11-27 8:02:0321 hrs 49 mins ago0x1a1e7a3b925476a3d81fddaa113dceb94257e88a IN  0xbe9c8dbba0e8b0f58e3d731da0759f44eb82729d0 HT0.000187605 2.25
0x4a96f4dbe914c91b5498094c7bfb1acffbeadcc9690a22592e3da055e9ef9393Get Reward103628712021-11-27 3:10:451 day 2 hrs ago0x1a1e7a3b925476a3d81fddaa113dceb94257e88a IN  0xbe9c8dbba0e8b0f58e3d731da0759f44eb82729d0 HT0.000187605 2.25
0xdf989c76c750fd22de3dd1b2572db2cbdd6e732b7fac6d7e07ced033e81a2787Get Reward103626142021-11-27 2:57:541 day 2 hrs ago0x1a1e7a3b925476a3d81fddaa113dceb94257e88a IN  0xbe9c8dbba0e8b0f58e3d731da0759f44eb82729d0 HT0.000187605 2.25
0x596b741cf33aaf3040a321ecee31884686a5ae280dfb3eae4ae1011f37d32426Get Reward103625532021-11-27 2:54:511 day 2 hrs ago0x1a1e7a3b925476a3d81fddaa113dceb94257e88a IN  0xbe9c8dbba0e8b0f58e3d731da0759f44eb82729d0 HT0.000187605 2.25
0x0d1d77a834817f0dd10ebf5a74c60a9349f97562ac5ec6b22c878f4069a87ae8Get Reward103625112021-11-27 2:52:451 day 2 hrs ago0x1a1e7a3b925476a3d81fddaa113dceb94257e88a IN  0xbe9c8dbba0e8b0f58e3d731da0759f44eb82729d0 HT0.000187605 2.25
0x028c82c5a2bed8fafda903635e32df667b20711b75290f5b2594df8be7edfa21Get Reward103498362021-11-26 16:19:001 day 13 hrs ago0x4490902d8eb72a0ac0487ef1658400fd80fc41f5 IN  0xbe9c8dbba0e8b0f58e3d731da0759f44eb82729d0 HT0.0001876052.25
0x2a53f021216fbeeefaafb028d466f9fe1385c82c1d6934a09904de9be0439b7eGet Reward103474172021-11-26 14:18:031 day 15 hrs ago0x167c99c9701348d12cebfa52bf3bf40e8ae4f282 IN  0xbe9c8dbba0e8b0f58e3d731da0759f44eb82729d0 HT0.0001876052.25
0xc327499c1e577e6c0afa229ea3a3a09d4a6c03023527cc899c362a53f744d892Get Reward103461552021-11-26 13:14:571 day 16 hrs ago0x8aadf9913f9416ad72312ab00186ecea93946c58 IN  0xbe9c8dbba0e8b0f58e3d731da0759f44eb82729d0 HT0.000187605 2.25
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x3347780bbd5aa8ac04cb3230ca2fa0dac4aac7c096b2ae28261c22c4f917f09768560262021-07-28 8:44:03122 days 21 hrs ago 0xfdb9a40bc0910aa4f953610a08e94aa1676e5d6d  Contract Creation0 HT
[ Download CSV Export 
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x615b42e82e2cf69d0af345b73e5558ad63569e07

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-07-27
*/

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 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");
    }
}

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 RewardsDistributionRecipient, ReentrancyGuard {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

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

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

    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 _startTime,
        uint256 _period
    ) public {
        operator = address(0);
        rewardsToken = IERC20(_rewardsToken);
        stakingToken = IERC20(_stakingToken);
        rewardsDistribution = _rewardsDistribution;
        pool = IHecoPool(_pool);
        poolId = _poolId;
        earnToken = IERC20(_earnToken);
        startTime = _startTime;
        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) checkhalve 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) checkhalve 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) checkhalve 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);
        }
    }
    
    /* ========== MODIFIERS ========== */

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

    modifier checkhalve(){
        if (block.timestamp >= periodFinish && rewardAmount > 0) {
            rewardsed = rewardsed.add(rewardAmount);
            rewardRate = rewardAmount.div(rewardsDuration);
            lastUpdateTime = block.timestamp;
            periodFinish = block.timestamp.add(rewardsDuration);
            rewardsToken.mint(address(this), rewardAmount);
            emit RewardAdded(rewardAmount);
        }
        _;
    }

    modifier checkStart(){
        require(startTime > 0 && block.timestamp > startTime,"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(startTime > 0, 'invalid start time');
        if (block.timestamp >= periodFinish) {
            rewardRate = reward.div(rewardsDuration);
        } else {
            uint256 remaining = periodFinish.sub(block.timestamp);
            uint256 leftover = remaining.mul(rewardRate);
            rewardRate = reward.add(leftover).div(rewardsDuration);
        }
        rewardsed = rewardsed.add(reward);
        rewardAmount = reward;
        rewardsToken.mint(address(this),reward);
        lastUpdateTime = block.timestamp < startTime ? startTime : block.timestamp;
        periodFinish = block.timestamp < startTime ? startTime.add(rewardsDuration) : block.timestamp.add(rewardsDuration);
        emit RewardAdded(reward);
    }

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

    function setRewardAmount(uint256 _rewardAmount) external onlyRewardsDistribution {
        rewardAmount = _rewardAmount;
    }

    function setPool(address _pool) external onlyRewardsDistribution {
        pool = IHecoPool(_pool);
        if (poolId >= 0 && _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 setPoolId(int _poolId) external onlyRewardsDistribution {
        poolId = _poolId;
        if (address(pool) != address(0) && poolId >= 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 claim(address token, address to) external onlyRewardsDistribution {
        if (token == address(0))    token = address(earnToken);
        uint256 amount = IERC20(token).balanceOf(address(this));
        IERC20(token).transfer(to, amount);
        emit Claim(token, to, amount);
    }

    function emergencyWithdraw(uint256 amount) external onlyRewardsDistribution {
        if (amount > 0) {
            pool.withdraw(uint256(poolId), amount);
        } else {
            pool.emergencyWithdraw(uint256(poolId));
        }
    }

    function burn(uint256 amount) external onlyRewardsDistribution {
        rewardAmount = 0;
        rewardsToken.burn(address(this), 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 token, address indexed to, uint256 amount);
}

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

    mapping(address => bool) public stakingRewards;

    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, uint256 startTime, uint256 period) public onlyOwner {
        address stakingReward = address(new LpStakingRewards(/*_rewardsDistribution=*/ address(this), rewardsToken, stakingToken, pool, poolId, earnToken, startTime, period));
        stakingRewards[stakingReward] = true;
        emit Deploy(stakingToken, stakingReward);
    }

    // notify initial reward amount for an individual staking token.
    function notifyRewardAmount(address stakingReward, uint256 rewardAmount) public onlyOwner {
        require(stakingRewards[stakingReward], 'not exist');
        LpStakingRewards(stakingReward).notifyRewardAmount(rewardAmount);
    }

    function setOperator(address stakingReward, address operator) public onlyOwner {
        require(stakingRewards[stakingReward], 'not exist');
        LpStakingRewards(stakingReward).setOperator(operator);
    }

    function setRewardAmount(address stakingReward, uint256 rewardAmount) public onlyOwner {
        require(stakingRewards[stakingReward], 'not exist');
        LpStakingRewards(stakingReward).setRewardAmount(rewardAmount);
    }

    function setPool(address stakingReward, address pool) public onlyOwner {
        require(stakingRewards[stakingReward], 'not exist');
        LpStakingRewards(stakingReward).setPool(pool);
    }

    function setPoolId(address stakingReward, int poolId) public onlyOwner {
        require(stakingRewards[stakingReward], 'not exist');
        LpStakingRewards(stakingReward).setPoolId(poolId);
    }

    function setEarnToken(address stakingReward, address token) public onlyOwner {
        require(stakingRewards[stakingReward], 'not exist');
        LpStakingRewards(stakingReward).setEarnToken(token);
    }

    function claim(address stakingReward, address token, address to) public onlyOwner {
        require(stakingRewards[stakingReward], 'not exist');
        LpStakingRewards(stakingReward).claim(token, to);
    }

    function emergencyWithdraw(address stakingReward, uint256 amount) public onlyOwner {
        require(stakingRewards[stakingReward], 'not exist');
        LpStakingRewards(stakingReward).emergencyWithdraw(amount);
    }

    function burn(address stakingReward, uint256 amount) public onlyOwner {
        require(stakingRewards[stakingReward], 'not exist');
        LpStakingRewards(stakingReward).burn(amount);
    }

    event Deploy(address stakingToken, address stakingReward);
}

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":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"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":"token","type":"address"},{"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":"uint256","name":"amount","type":"uint256"}],"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":"rewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_rewardAmount","type":"uint256"}],"name":"setRewardAmount","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"}]

608060405234801561001057600080fd5b506040516123ed3803806123ed833981810160405261010081101561003457600080fd5b508051602082015160408301516060840151608085015160a086015160c087015160e09097015160018055600280546001600160a01b0319908116909155600380546001600160a01b0398891690831617905560048054968816968216969096179095556000805497871697861697909717909655600f805493861693851693909317909255600e55601080549390911692909116919091179055600591909155600855612306806100e76000396000f3fe608060405234801561001057600080fd5b506004361061021a5760003560e01c806370a0823111610125578063b3ab15fb116100ad578063df136d651161007c578063df136d65146104f0578063e32d2a74146104f8578063ebe2b12b14610500578063f1f98e1214610508578063f7b2a7be146105105761021a565b8063b3ab15fb146104b2578063c8f33c91146104d8578063cd3daf9d146104e0578063d1af0c7d146104e85761021a565b80637b0a47ee116100f45780637b0a47ee1461043957806380faa57d146104415780638b87634714610449578063a8a65a781461046f578063aef7e0961461048c5761021a565b806370a08231146103d757806372f702f3146103fd57806378e97925146104055780637acb77571461040d5761021a565b80633d18b912116101a85780634437152a116101775780634437152a146103675780635312ea8e1461038d578063570ca735146103aa578063630fe06f146103b257806369d8d6d2146103cf5761021a565b80633d18b912146103325780633e0dc34e1461033a5780633fc6df6e1461034257806342966c681461034a5761021a565b806318160ddd116101ef57806318160ddd146102cf5780631c1f78eb146102d757806321c0b342146102df578063386a95251461030d5780633c6b16ab146103155761021a565b80628cc2621461021f578062f714ce146102575780630700037d1461028557806316f0115b146102ab575b600080fd5b6102456004803603602081101561023557600080fd5b50356001600160a01b0316610518565b60408051918252519081900360200190f35b6102836004803603604081101561026d57600080fd5b50803590602001356001600160a01b03166105ae565b005b6102456004803603602081101561029b57600080fd5b50356001600160a01b0316610ab9565b6102b3610acb565b604080516001600160a01b039092168252519081900360200190f35b610245610ada565b610245610ae1565b610283600480360360408110156102f557600080fd5b506001600160a01b0381358116916020013516610aff565b610245610ca5565b6102836004803603602081101561032b57600080fd5b5035610cab565b610283610f0b565b6102456111e8565b6102b36111ee565b6102836004803603602081101561036057600080fd5b50356111fd565b6102836004803603602081101561037d57600080fd5b50356001600160a01b03166112b5565b610283600480360360208110156103a357600080fd5b5035611430565b6102b3611543565b610283600480360360208110156103c857600080fd5b5035611552565b6102456115e3565b610245600480360360208110156103ed57600080fd5b50356001600160a01b03166115e9565b6102b3611604565b610245611613565b6102836004803603604081101561042357600080fd5b50803590602001356001600160a01b0316611619565b610245611b0c565b610245611b12565b6102456004803603602081101561045f57600080fd5b50356001600160a01b0316611b20565b6102836004803603602081101561048557600080fd5b5035611b32565b610283600480360360208110156104a257600080fd5b50356001600160a01b0316611b80565b610283600480360360208110156104c857600080fd5b50356001600160a01b0316611beb565b610245611c56565b610245611c5c565b6102b3611cb6565b610245611cc5565b610245611ccb565b610245611cd1565b6102b3611cd7565b610245611ce6565b6001600160a01b03811660009081526012602090815260408083205460119092528220546105a8919061059c90670de0b6b3a7640000906105909061056b9061055f611c5c565b9063ffffffff611cec16565b6001600160a01b0388166000908152601460205260409020549063ffffffff611d4916565b9063ffffffff611da916565b9063ffffffff611e1316565b92915050565b60018054810190819055816105c1611c5c565b600a556105cc611b12565b6009556001600160a01b03811615610613576105e781610518565b6001600160a01b038216600090815260126020908152604080832093909355600a546011909152919020555b600654421015801561062757506000600d54115b1561070b57600d54600c546106419163ffffffff611e1316565b600c55600854600d546106599163ffffffff611da916565b600755426009819055600854610675919063ffffffff611e1316565b600655600354600d54604080516340c10f1960e01b81523060048201526024810192909252516001600160a01b03909216916340c10f199160448082019260009290919082900301818387803b1580156106ce57600080fd5b505af11580156106e2573d6000803e3d6000fd5b5050600d5460408051918252516000805160206122078339815191529350908190036020019150a15b600060055411801561071e575060055442115b61075b576040805162461bcd60e51b81526020600482015260096024820152681b9bdd081cdd185c9d60ba1b604482015290519081900360640190fd5b600254839033906001600160a01b03161580156107895750806001600160a01b0316826001600160a01b0316145b806107b657506002546001600160a01b0316158015906107b657506002546001600160a01b038281169116145b6107bf57600080fd5b60008611610808576040805162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015290519081900360640190fd5b6001600160a01b038516610856576040805162461bcd60e51b815260206004820152601060248201526f0757365722063616e6e6f7420626520360841b604482015290519081900360640190fd5b6001600160a01b0385166000908152601460205260409020548611156108b0576040805162461bcd60e51b815260206004820152600a6024820152690dcdee840cadcdeeaced60b31b604482015290519081900360640190fd5b6002546000906001600160a01b03166108c957856108d6565b6002546001600160a01b03165b600f549091506001600160a01b0316158015906108f657506000600e5412155b156109aa57600f54600e5460408051630441a3e760e41b81526004810192909252602482018a9052516001600160a01b039092169163441a3e709160448082019260009290919082900301818387803b15801561095257600080fd5b505af1158015610966573d6000803e3d6000fd5b5050604080518a815290516001600160a01b03851693507f7fa37ab6c306eaa3e99af03510c8c7795b777788e002ead5ee703219a5be9ec592509081900360200190a25b6013546109bd908863ffffffff611cec16565b6013556001600160a01b0386166000908152601460205260409020546109e9908863ffffffff611cec16565b6001600160a01b03808816600090815260146020526040902091909155600454610a1b9116828963ffffffff611e6d16565b6040805188815290516001600160a01b038316917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a2505050506001548114610ab4576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b505050565b60126020526000908152604090205481565b600f546001600160a01b031681565b6013545b90565b6000610afa600854600754611d4990919063ffffffff16565b905090565b6000546001600160a01b03163314610b485760405162461bcd60e51b815260040180806020018281038252602a815260200180612248602a913960400191505060405180910390fd5b6001600160a01b038216610b65576010546001600160a01b031691505b604080516370a0823160e01b815230600482015290516000916001600160a01b038516916370a0823191602480820192602092909190829003018186803b158015610baf57600080fd5b505afa158015610bc3573d6000803e3d6000fd5b505050506040513d6020811015610bd957600080fd5b50516040805163a9059cbb60e01b81526001600160a01b0385811660048301526024820184905291519293509085169163a9059cbb916044808201926020929091908290030181600087803b158015610c3157600080fd5b505af1158015610c45573d6000803e3d6000fd5b505050506040513d6020811015610c5b57600080fd5b50506040805182815290516001600160a01b0380851692908616917f70eb43c4a8ae8c40502dcf22436c509c28d6ff421cf07c491be56984bd9870689181900360200190a3505050565b60085481565b6000546001600160a01b03163314610cf45760405162461bcd60e51b815260040180806020018281038252602a815260200180612248602a913960400191505060405180910390fd5b6000610cfe611c5c565b600a55610d09611b12565b6009556001600160a01b03811615610d5057610d2481610518565b6001600160a01b038216600090815260126020908152604080832093909355600a546011909152919020555b600060055411610d9c576040805162461bcd60e51b8152602060048201526012602482015271696e76616c69642073746172742074696d6560701b604482015290519081900360640190fd5b6006544210610dc157600854610db990839063ffffffff611da916565b600755610e10565b600654600090610dd7904263ffffffff611cec16565b90506000610df060075483611d4990919063ffffffff16565b600854909150610e0a90610590868463ffffffff611e1316565b60075550505b600c54610e23908363ffffffff611e1316565b600c55600d829055600354604080516340c10f1960e01b81523060048201526024810185905290516001600160a01b03909216916340c10f199160448082019260009290919082900301818387803b158015610e7e57600080fd5b505af1158015610e92573d6000803e3d6000fd5b505050506005544210610ea55742610ea9565b6005545b6009556005544210610ece57600854610ec990429063ffffffff611e1316565b610ee3565b600854600554610ee39163ffffffff611e1316565b6006556040805183815290516000805160206122078339815191529181900360200190a15050565b6001805481019081905533610f1e611c5c565b600a55610f29611b12565b6009556001600160a01b03811615610f7057610f4481610518565b6001600160a01b038216600090815260126020908152604080832093909355600a546011909152919020555b6006544210158015610f8457506000600d54115b1561106857600d54600c54610f9e9163ffffffff611e1316565b600c55600854600d54610fb69163ffffffff611da916565b600755426009819055600854610fd2919063ffffffff611e1316565b600655600354600d54604080516340c10f1960e01b81523060048201526024810192909252516001600160a01b03909216916340c10f199160448082019260009290919082900301818387803b15801561102b57600080fd5b505af115801561103f573d6000803e3d6000fd5b5050600d5460408051918252516000805160206122078339815191529350908190036020019150a15b600060055411801561107b575060055442115b6110b8576040805162461bcd60e51b81526020600482015260096024820152681b9bdd081cdd185c9d60ba1b604482015290519081900360640190fd5b336110fd576040805162461bcd60e51b815260206004820152601060248201526f0757365722063616e6e6f7420626520360841b604482015290519081900360640190fd5b33600090815260126020526040902054801561118d5733600090815260126020526040812055600b54611136908263ffffffff611e1316565b600b55600354611156906001600160a01b0316338363ffffffff611e6d16565b60408051828152905133917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b505060015481146111e5576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b50565b600e5481565b6000546001600160a01b031681565b6000546001600160a01b031633146112465760405162461bcd60e51b815260040180806020018281038252602a815260200180612248602a913960400191505060405180910390fd5b6000600d81905560035460408051632770a7eb60e21b81523060048201526024810185905290516001600160a01b0390921692639dc29fac9260448084019382900301818387803b15801561129a57600080fd5b505af11580156112ae573d6000803e3d6000fd5b5050505050565b6000546001600160a01b031633146112fe5760405162461bcd60e51b815260040180806020018281038252602a815260200180612248602a913960400191505060405180910390fd5b600f80546001600160a01b0319166001600160a01b038316179055600e5460001380159061133457506001600160a01b03811615155b156111e557600f5460045461135d916001600160a01b039182169116600063ffffffff611ebf16565b600f54600454611382916001600160a01b03918216911660001963ffffffff611ebf16565b600f54600e5460135460408051631c57762b60e31b815260048101939093526024830191909152516001600160a01b039092169163e2bbb1589160448082019260009290919082900301818387803b1580156113dd57600080fd5b505af11580156113f1573d6000803e3d6000fd5b505060135460408051918252513093507fd141f18ef8acbeecd5f988b51fa559f0ab440df805d57c69cb4736ba5250ddc492509081900360200190a250565b6000546001600160a01b031633146114795760405162461bcd60e51b815260040180806020018281038252602a815260200180612248602a913960400191505060405180910390fd5b80156114f357600f54600e5460408051630441a3e760e41b8152600481019290925260248201849052516001600160a01b039092169163441a3e709160448082019260009290919082900301818387803b1580156114d657600080fd5b505af11580156114ea573d6000803e3d6000fd5b505050506111e5565b600f54600e5460408051632989754760e11b81526004810192909252516001600160a01b0390921691635312ea8e9160248082019260009290919082900301818387803b15801561129a57600080fd5b6002546001600160a01b031681565b6000546001600160a01b0316331461159b5760405162461bcd60e51b815260040180806020018281038252602a815260200180612248602a913960400191505060405180910390fd5b600e819055600f546001600160a01b03161580159061133457506000600e54126111e557600f5460045461135d916001600160a01b039182169116600063ffffffff611ebf16565b600b5481565b6001600160a01b031660009081526014602052604090205490565b6004546001600160a01b031681565b60055481565b600180548101908190558161162c611c5c565b600a55611637611b12565b6009556001600160a01b0381161561167e5761165281610518565b6001600160a01b038216600090815260126020908152604080832093909355600a546011909152919020555b600654421015801561169257506000600d54115b1561177657600d54600c546116ac9163ffffffff611e1316565b600c55600854600d546116c49163ffffffff611da916565b6007554260098190556008546116e0919063ffffffff611e1316565b600655600354600d54604080516340c10f1960e01b81523060048201526024810192909252516001600160a01b03909216916340c10f199160448082019260009290919082900301818387803b15801561173957600080fd5b505af115801561174d573d6000803e3d6000fd5b5050600d5460408051918252516000805160206122078339815191529350908190036020019150a15b6000600554118015611789575060055442115b6117c6576040805162461bcd60e51b81526020600482015260096024820152681b9bdd081cdd185c9d60ba1b604482015290519081900360640190fd5b600254839033906001600160a01b03161580156117f45750806001600160a01b0316826001600160a01b0316145b8061182157506002546001600160a01b03161580159061182157506002546001600160a01b038281169116145b61182a57600080fd5b60008611611870576040805162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b604482015290519081900360640190fd5b6001600160a01b0385166118be576040805162461bcd60e51b815260206004820152601060248201526f0757365722063616e6e6f7420626520360841b604482015290519081900360640190fd5b6002546000906001600160a01b03166118d757856118e4565b6002546001600160a01b03165b6013549091506118fa908863ffffffff611e1316565b6013556001600160a01b038616600090815260146020526040902054611926908863ffffffff611e1316565b6001600160a01b03808816600090815260146020526040902091909155600454611959911682308a63ffffffff611fd216565b600f546001600160a01b03161580159061197657506000600e5412155b15611a7357600f5460045461199f916001600160a01b039182169116600063ffffffff611ebf16565b600f546004546119c4916001600160a01b03918216911660001963ffffffff611ebf16565b600f54600e5460408051631c57762b60e31b81526004810192909252602482018a9052516001600160a01b039092169163e2bbb1589160448082019260009290919082900301818387803b158015611a1b57600080fd5b505af1158015611a2f573d6000803e3d6000fd5b5050604080518a815290516001600160a01b03851693507fd141f18ef8acbeecd5f988b51fa559f0ab440df805d57c69cb4736ba5250ddc492509081900360200190a25b6040805188815290516001600160a01b038316917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a2505050506001548114610ab4576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60075481565b6000610afa42600654612032565b60116020526000908152604090205481565b6000546001600160a01b03163314611b7b5760405162461bcd60e51b815260040180806020018281038252602a815260200180612248602a913960400191505060405180910390fd5b600d55565b6000546001600160a01b03163314611bc95760405162461bcd60e51b815260040180806020018281038252602a815260200180612248602a913960400191505060405180910390fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611c345760405162461bcd60e51b815260040180806020018281038252602a815260200180612248602a913960400191505060405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60095481565b600060135460001415611c725750600a54610ade565b610afa611ca7601354610590670de0b6b3a7640000611c9b600754611c9b60095461055f611b12565b9063ffffffff611d4916565b600a549063ffffffff611e1316565b6003546001600160a01b031681565b600a5481565b600c5481565b60065481565b6010546001600160a01b031681565b600d5481565b600082821115611d43576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082611d58575060006105a8565b82820282848281611d6557fe5b0414611da25760405162461bcd60e51b81526004018080602001828103825260218152602001806122276021913960400191505060405180910390fd5b9392505050565b6000808211611dff576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b6000828481611e0a57fe5b04949350505050565b600082820183811015611da2576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ab4908490612048565b801580611f45575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015611f1757600080fd5b505afa158015611f2b573d6000803e3d6000fd5b505050506040513d6020811015611f4157600080fd5b5051155b611f805760405162461bcd60e51b815260040180806020018281038252603681526020018061229c6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610ab4908490612048565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261202c908590612048565b50505050565b60008183106120415781611da2565b5090919050565b61205a826001600160a01b0316612200565b6120ab576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106120e95780518252601f1990920191602091820191016120ca565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461214b576040519150601f19603f3d011682016040523d82523d6000602084013e612150565b606091505b5091509150816121a7576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561202c578080602001905160208110156121c357600080fd5b505161202c5760405162461bcd60e51b815260040180806020018281038252602a815260200180612272602a913960400191505060405180910390fd5b3b15159056fede88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7743616c6c6572206973206e6f742052657761726473446973747269627574696f6e20636f6e74726163745361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a72315820e75fdf3413b58bf457ebab0ac2cfe21285febf39b110db80965a9b56b7c8ca4a64736f6c63430005100032000000000000000000000000fdb9a40bc0910aa4f953610a08e94aa1676e5d6d00000000000000000000000052ee54dd7a68e9cf131b0a57fd6015c74d7140e20000000000000000000000000e58a31f01f97eaf4dd6ba7e96c46cfbf020ee4d00000000000000000000000093df4c60cec7bb4bd2affac8065b09b5ff514bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000008871da134f113f6819ba106df2b95af5bac90eb80000000000000000000000000000000000000000000000000000000060f682800000000000000000000000000000000000000000000000000000000000015180

Deployed ByteCode Sourcemap

16331:9234:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16331:9234:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18639:198;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18639:198:0;-1:-1:-1;;;;;18639:198:0;;:::i;:::-;;;;;;;;;;;;;;;;19807:783;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19807:783:0;;;;;;-1:-1:-1;;;;;19807:783:0;;:::i;:::-;;17088:42;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17088:42:0;-1:-1:-1;;;;;17088:42:0;;:::i;16964:21::-;;;:::i;:::-;;;;-1:-1:-1;;;;;16964:21:0;;;;;;;;;;;;;;17941:93;;;:::i;18845:121::-;;;:::i;24379:299::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24379:299:0;;;;;;;;;;:::i;16725:30::-;;;:::i;22274:864::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22274:864:0;;:::i;20598:445::-;;;:::i;16940:17::-;;;:::i;15855:34::-;;;:::i;24941:149::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24941:149:0;;:::i;23402:414::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23402:414:0;-1:-1:-1;;;;;23402:414:0;;:::i;24686:247::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24686:247:0;;:::i;16532:23::-;;;:::i;23824:415::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23824:415:0;;:::i;16840:26::-;;;:::i;18042:112::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18042:112:0;-1:-1:-1;;;;;18042:112:0;;:::i;16595:26::-;;;:::i;16628:24::-;;;:::i;18974:825::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18974:825:0;;;;;;-1:-1:-1;;;;;18974:825:0;;:::i;16693:25::-;;;:::i;18162:131::-;;;:::i;17024:57::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17024:57:0;-1:-1:-1;;;;;17024:57:0;;:::i;23266:128::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23266:128:0;;:::i;24247:124::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24247:124:0;-1:-1:-1;;;;;24247:124:0;;:::i;23146:112::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23146:112:0;-1:-1:-1;;;;;23146:112:0;;:::i;16762:29::-;;;:::i;18301:330::-;;;:::i;16562:26::-;;;:::i;16798:35::-;;;:::i;16873:24::-;;;:::i;16659:27::-;;;:::i;16992:23::-;;;:::i;16904:27::-;;;:::i;18639:198::-;-1:-1:-1;;;;;18812:16:0;;18693:7;18812:16;;;:7;:16;;;;;;;;;18764:22;:31;;;;;;18720:109;;18812:16;18720:87;;18802:4;;18720:77;;18743:53;;:16;:14;:16::i;:::-;:20;:53;:20;:53;:::i;:::-;-1:-1:-1;;;;;18720:18:0;;;;;;:9;:18;;;;;;;:22;:77::i;:::-;:81;:87;:81;:87;:::i;:::-;:91;:109;:91;:109;:::i;:::-;18713:116;18639:198;-1:-1:-1;;18639:198:0:o;19807:783::-;15651:1;15634:18;;;;;;;;19888:4;21173:16;:14;:16::i;:::-;21150:20;:39;21217:26;:24;:26::i;:::-;21200:14;:43;-1:-1:-1;;;;;21258:21:0;;;21254:157;;21315:15;21322:7;21315:6;:15::i;:::-;-1:-1:-1;;;;;21296:16:0;;;;;;:7;:16;;;;;;;;:34;;;;21379:20;;21345:22;:31;;;;;;:54;21254:157;21493:12;;21474:15;:31;;:51;;;;;21524:1;21509:12;;:16;21474:51;21470:403;;;21568:12;;21554:9;;:27;;;:13;:27;:::i;:::-;21542:9;:39;21626:15;;21609:12;;:33;;;:16;:33;:::i;:::-;21596:10;:46;21674:15;21657:14;:32;;;21739:15;;21719:36;;21674:15;21719:36;:19;:36;:::i;:::-;21704:12;:51;21770:12;;21803;;21770:46;;;-1:-1:-1;;;21770:46:0;;21796:4;21770:46;;;;;;;;;;;;-1:-1:-1;;;;;21770:12:0;;;;-1:-1:-1;;21770:46:0;;;;;-1:-1:-1;;21770:46:0;;;;;;;;-1:-1:-1;21770:12:0;:46;;;5:2:-1;;;;30:1;27;20:12;5:2;21770:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;21848:12:0;;21836:25;;;;;;;-1:-1:-1;;;;;;;;;;;21836:25:0;-1:-1:-1;21836:25:0;;;;;;;-1:-1:-1;21836:25:0;21470:403;21952:1;21940:9;;:13;:44;;;;;21975:9;;21957:15;:27;21940:44;21932:65;;;;;-1:-1:-1;;;21932:65:0;;;;;;;;;;;;-1:-1:-1;;;21932:65:0;;;;;;;;;;;;;;;22098:8;;19930:4;;19936:10;;-1:-1:-1;;;;;22098:8:0;:22;:40;;;;-1:-1:-1;;;;;;22124:14:0;;;;;;;22098:40;22097:92;;;-1:-1:-1;22144:8:0;;-1:-1:-1;;;;;22144:8:0;:22;;;;:44;;-1:-1:-1;22170:8:0;;-1:-1:-1;;;;;22170:18:0;;;:8;;:18;22144:44;22089:101;;;;;;19976:1;19967:6;:10;19959:40;;;;;-1:-1:-1;;;19959:40:0;;;;;;;;;;;;-1:-1:-1;;;19959:40:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;20018:18:0;;20010:47;;;;;-1:-1:-1;;;20010:47:0;;;;;;;;;;;;-1:-1:-1;;;20010:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;20076:15:0;;;;;;:9;:15;;;;;;-1:-1:-1;;20076:25:0;20068:48;;;;;-1:-1:-1;;;20068:48:0;;;;;;;;;;;;-1:-1:-1;;;20068:48:0;;;;;;;;;;;;;;;20140:8;;20127:10;;-1:-1:-1;;;;;20140:8:0;:40;;20176:4;20140:40;;;20165:8;;-1:-1:-1;;;;;20165:8:0;20140:40;20203:4;;20127:53;;-1:-1:-1;;;;;;20203:4:0;20195:27;;;;:42;;;20236:1;20226:6;;:11;;20195:42;20191:201;;;20293:4;;20315:6;;20293:38;;;-1:-1:-1;;;20293:38:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20293:4:0;;;;:13;;:38;;;;;-1:-1:-1;;20293:38:0;;;;;;;;-1:-1:-1;20293:4:0;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;20293:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;20351:29:0;;;;;;;;-1:-1:-1;;;;;20351:29:0;;;-1:-1:-1;20351:29:0;;-1:-1:-1;20351:29:0;;;;;;;;20191:201;20417:12;;:24;;20434:6;20417:24;:16;:24;:::i;:::-;20402:12;:39;-1:-1:-1;;;;;20470:15:0;;;;;;:9;:15;;;;;;:27;;20490:6;20470:19;:27::i;:::-;-1:-1:-1;;;;;20452:15:0;;;;;;;:9;:15;;;;;:45;;;;20508:12;;:37;;:12;20534:2;20538:6;20508:25;:37::i;:::-;20561:21;;;;;;;;-1:-1:-1;;;;;20561:21:0;;;;;;;;;;;;;22201:1;22008;;15710;15746:13;;15730:12;:29;15722:73;;;;;-1:-1:-1;;;15722:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19807:783;;;:::o;17088:42::-;;;;;;;;;;;;;:::o;16964:21::-;;;-1:-1:-1;;;;;16964:21:0;;:::o;17941:93::-;18014:12;;17941:93;;:::o;18845:121::-;18900:7;18927:31;18942:15;;18927:10;;:14;;:31;;;;:::i;:::-;18920:38;;18845:121;:::o;24379:299::-;16027:19;;-1:-1:-1;;;;;16027:19:0;16013:10;:33;16005:88;;;;-1:-1:-1;;;16005:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24469:19:0;;24465:54;;24509:9;;-1:-1:-1;;;;;24509:9:0;;-1:-1:-1;24465:54:0;24547:38;;;-1:-1:-1;;;24547:38:0;;24579:4;24547:38;;;;;;-1:-1:-1;;;;;;;24547:23:0;;;-1:-1:-1;;24547:38:0;;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;24547:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24547:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24547:38:0;24596:34;;;-1:-1:-1;;;24596:34:0;;-1:-1:-1;;;;;24596:34:0;;;;;;;;;;;;;;;24547:38;;-1:-1:-1;24596:22:0;;;;-1:-1:-1;;24596:34:0;;;;;24547:38;;24596:34;;;;;;;;-1:-1:-1;24596:22:0;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;24596:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24596:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;24646:24:0;;;;;;;;-1:-1:-1;;;;;24646:24:0;;;;;;;;;;;;;24596:34;24646:24;;;16104:1;24379:299;;:::o;16725:30::-;;;;:::o;22274:864::-;16027:19;;-1:-1:-1;;;;;16027:19:0;16013:10;:33;16005:88;;;;-1:-1:-1;;;16005:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22372:1;21173:16;:14;:16::i;:::-;21150:20;:39;21217:26;:24;:26::i;:::-;21200:14;:43;-1:-1:-1;;;;;21258:21:0;;;21254:157;;21315:15;21322:7;21315:6;:15::i;:::-;-1:-1:-1;;;;;21296:16:0;;;;;;:7;:16;;;;;;;;:34;;;;21379:20;;21345:22;:31;;;;;;:54;21254:157;22407:1;22395:9;;:13;22387:44;;;;;-1:-1:-1;;;22387:44:0;;;;;;;;;;;;-1:-1:-1;;;22387:44:0;;;;;;;;;;;;;;;22465:12;;22446:15;:31;22442:318;;22518:15;;22507:27;;:6;;:27;:10;:27;:::i;:::-;22494:10;:40;22442:318;;;22587:12;;22567:17;;22587:33;;22604:15;22587:33;:16;:33;:::i;:::-;22567:53;;22635:16;22654:25;22668:10;;22654:9;:13;;:25;;;;:::i;:::-;22732:15;;22635:44;;-1:-1:-1;22707:41:0;;:20;:6;22635:44;22707:20;:10;:20;:::i;:41::-;22694:10;:54;-1:-1:-1;;22442:318:0;22782:9;;:21;;22796:6;22782:21;:13;:21;:::i;:::-;22770:9;:33;22814:12;:21;;;22846:12;;:39;;;-1:-1:-1;;;22846:39:0;;22872:4;22846:39;;;;;;;;;;;;-1:-1:-1;;;;;22846:12:0;;;;-1:-1:-1;;22846:39:0;;;;;-1:-1:-1;;22846:39:0;;;;;;;;-1:-1:-1;22846:12:0;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;22846:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22846:39:0;;;;22931:9;;22913:15;:27;:57;;22955:15;22913:57;;;22943:9;;22913:57;22896:14;:74;23014:9;;22996:15;:27;:99;;23079:15;;23059:36;;:15;;:36;:19;:36;:::i;:::-;22996:99;;;23040:15;;23026:9;;:30;;;:13;:30;:::i;:::-;22981:12;:114;23111:19;;;;;;;;-1:-1:-1;;;;;;;;;;;23111:19:0;;;;;;;;16104:1;22274:864;:::o;20598:445::-;15651:1;15634:18;;;;;;;;20652:10;21173:16;:14;:16::i;:::-;21150:20;:39;21217:26;:24;:26::i;:::-;21200:14;:43;-1:-1:-1;;;;;21258:21:0;;;21254:157;;21315:15;21322:7;21315:6;:15::i;:::-;-1:-1:-1;;;;;21296:16:0;;;;;;:7;:16;;;;;;;;:34;;;;21379:20;;21345:22;:31;;;;;;:54;21254:157;21493:12;;21474:15;:31;;:51;;;;;21524:1;21509:12;;:16;21474:51;21470:403;;;21568:12;;21554:9;;:27;;;:13;:27;:::i;:::-;21542:9;:39;21626:15;;21609:12;;:33;;;:16;:33;:::i;:::-;21596:10;:46;21674:15;21657:14;:32;;;21739:15;;21719:36;;21674:15;21719:36;:19;:36;:::i;:::-;21704:12;:51;21770:12;;21803;;21770:46;;;-1:-1:-1;;;21770:46:0;;21796:4;21770:46;;;;;;;;;;;;-1:-1:-1;;;;;21770:12:0;;;;-1:-1:-1;;21770:46:0;;;;;-1:-1:-1;;21770:46:0;;;;;;;;-1:-1:-1;21770:12:0;:46;;;5:2:-1;;;;30:1;27;20:12;5:2;21770:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;21848:12:0;;21836:25;;;;;;;-1:-1:-1;;;;;;;;;;;21836:25:0;-1:-1:-1;21836:25:0;;;;;;;-1:-1:-1;21836:25:0;21470:403;21952:1;21940:9;;:13;:44;;;;;21975:9;;21957:15;:27;21940:44;21932:65;;;;;-1:-1:-1;;;21932:65:0;;;;;;;;;;;;-1:-1:-1;;;21932:65:0;;;;;;;;;;;;;;;20705:10;20697:53;;;;;-1:-1:-1;;;20697:53:0;;;;;;;;;;;;-1:-1:-1;;;20697:53:0;;;;;;;;;;;;;;;20786:10;20761:14;20778:19;;;:7;:19;;;;;;20812:10;;20808:228;;20847:10;20861:1;20839:19;;;:7;:19;;;;;:23;20891:11;;:23;;20907:6;20891:23;:15;:23;:::i;:::-;20877:11;:37;20929:12;;:45;;-1:-1:-1;;;;;20929:12:0;20955:10;20967:6;20929:25;:45::i;:::-;20994:30;;;;;;;;21005:10;;20994:30;;;;;;;;;;20808:228;22008:1;15710;15746:13;;15730:12;:29;15722:73;;;;;-1:-1:-1;;;15722:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20598:445;:::o;16940:17::-;;;;:::o;15855:34::-;;;-1:-1:-1;;;;;15855:34:0;;:::o;24941:149::-;16027:19;;-1:-1:-1;;;;;16027:19:0;16013:10;:33;16005:88;;;;-1:-1:-1;;;16005:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25030:1;25015:12;:16;;;25042:12;;:40;;;-1:-1:-1;;;25042:40:0;;25068:4;25042:40;;;;;;;;;;;;-1:-1:-1;;;;;25042:12:0;;;;:17;;:40;;;;;;;;;;25030:1;25042:12;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;25042:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25042:40:0;;;;24941:149;:::o;23402:414::-;16027:19;;-1:-1:-1;;;;;16027:19:0;16013:10;:33;16005:88;;;;-1:-1:-1;;;16005:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23478:4;:23;;-1:-1:-1;;;;;;23478:23:0;-1:-1:-1;;;;;23478:23:0;;;;;23516:6;;-1:-1:-1;;23516:11:0;;;:34;;-1:-1:-1;;;;;;23531:19:0;;;;23516:34;23512:297;;;23600:4;;23567:12;;:42;;-1:-1:-1;;;;;23567:12:0;;;;23600:4;;23567:24;:42::i;:::-;23657:4;;23624:12;;:52;;-1:-1:-1;;;;;23624:12:0;;;;23657:4;-1:-1:-1;;23624:24:0;:52::i;:::-;23691:4;;23712:6;;23721:12;;23691:43;;;-1:-1:-1;;;23691:43:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23691:4:0;;;;:12;;:43;;;;;-1:-1:-1;;23691:43:0;;;;;;;;-1:-1:-1;23691:4:0;:43;;;5:2:-1;;;;30:1;27;20:12;5:2;23691:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;23784:12:0;;23754:43;;;;;;;23777:4;;-1:-1:-1;23754:43:0;;-1:-1:-1;23754:43:0;;;;;;;;23402:414;:::o;24686:247::-;16027:19;;-1:-1:-1;;;;;16027:19:0;16013:10;:33;16005:88;;;;-1:-1:-1;;;16005:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24777:10;;24773:153;;24804:4;;24826:6;;24804:38;;;-1:-1:-1;;;24804:38:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24804:4:0;;;;:13;;:38;;;;;-1:-1:-1;;24804:38:0;;;;;;;;-1:-1:-1;24804:4:0;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;24804:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24804:38:0;;;;24773:153;;;24875:4;;24906:6;;24875:39;;;-1:-1:-1;;;24875:39:0;;;;;;;;;;-1:-1:-1;;;;;24875:4:0;;;;:22;;:39;;;;;-1:-1:-1;;24875:39:0;;;;;;;;-1:-1:-1;24875:4:0;:39;;;5:2:-1;;;;30:1;27;20:12;16532:23:0;;;-1:-1:-1;;;;;16532:23:0;;:::o;23824:415::-;16027:19;;-1:-1:-1;;;;;16027:19:0;16013:10;:33;16005:88;;;;-1:-1:-1;;;16005:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23900:6;:16;;;23939:4;;-1:-1:-1;;;;;23939:4:0;23931:27;;;;:42;;;23972:1;23962:6;;:11;23927:305;;24023:4;;23990:12;;:42;;-1:-1:-1;;;;;23990:12:0;;;;24023:4;;23990:24;:42::i;16840:26::-;;;;:::o;18042:112::-;-1:-1:-1;;;;;18128:18:0;18101:7;18128:18;;;:9;:18;;;;;;;18042:112::o;16595:26::-;;;-1:-1:-1;;;;;16595:26:0;;:::o;16628:24::-;;;;:::o;18974:825::-;15651:1;15634:18;;;;;;;;19054:4;21173:16;:14;:16::i;:::-;21150:20;:39;21217:26;:24;:26::i;:::-;21200:14;:43;-1:-1:-1;;;;;21258:21:0;;;21254:157;;21315:15;21322:7;21315:6;:15::i;:::-;-1:-1:-1;;;;;21296:16:0;;;;;;:7;:16;;;;;;;;:34;;;;21379:20;;21345:22;:31;;;;;;:54;21254:157;21493:12;;21474:15;:31;;:51;;;;;21524:1;21509:12;;:16;21474:51;21470:403;;;21568:12;;21554:9;;:27;;;:13;:27;:::i;:::-;21542:9;:39;21626:15;;21609:12;;:33;;;:16;:33;:::i;:::-;21596:10;:46;21674:15;21657:14;:32;;;21739:15;;21719:36;;21674:15;21719:36;:19;:36;:::i;:::-;21704:12;:51;21770:12;;21803;;21770:46;;;-1:-1:-1;;;21770:46:0;;21796:4;21770:46;;;;;;;;;;;;-1:-1:-1;;;;;21770:12:0;;;;-1:-1:-1;;21770:46:0;;;;;-1:-1:-1;;21770:46:0;;;;;;;;-1:-1:-1;21770:12:0;:46;;;5:2:-1;;;;30:1;27;20:12;5:2;21770:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;21848:12:0;;21836:25;;;;;;;-1:-1:-1;;;;;;;;;;;21836:25:0;-1:-1:-1;21836:25:0;;;;;;;-1:-1:-1;21836:25:0;21470:403;21952:1;21940:9;;:13;:44;;;;;21975:9;;21957:15;:27;21940:44;21932:65;;;;;-1:-1:-1;;;21932:65:0;;;;;;;;;;;;-1:-1:-1;;;21932:65:0;;;;;;;;;;;;;;;22098:8;;19096:4;;19102:10;;-1:-1:-1;;;;;22098:8:0;:22;:40;;;;-1:-1:-1;;;;;;22124:14:0;;;;;;;22098:40;22097:92;;;-1:-1:-1;22144:8:0;;-1:-1:-1;;;;;22144:8:0;:22;;;;:44;;-1:-1:-1;22170:8:0;;-1:-1:-1;;;;;22170:18:0;;;:8;;:18;22144:44;22089:101;;;;;;19142:1;19133:6;:10;19125:37;;;;;-1:-1:-1;;;19125:37:0;;;;;;;;;;;;-1:-1:-1;;;19125:37:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;19181:18:0;;19173:47;;;;;-1:-1:-1;;;19173:47:0;;;;;;;;;;;;-1:-1:-1;;;19173:47:0;;;;;;;;;;;;;;;19246:8;;19231:12;;-1:-1:-1;;;;;19246:8:0;:40;;19282:4;19246:40;;;19271:8;;-1:-1:-1;;;;;19271:8:0;19246:40;19312:12;;19231:55;;-1:-1:-1;19312:24:0;;19329:6;19312:24;:16;:24;:::i;:::-;19297:12;:39;-1:-1:-1;;;;;19365:15:0;;;;;;:9;:15;;;;;;:27;;19385:6;19365:19;:27::i;:::-;-1:-1:-1;;;;;19347:15:0;;;;;;;:9;:15;;;;;:45;;;;19403:12;;:58;;:12;19433:4;19447;19454:6;19403:29;:58::i;:::-;19484:4;;-1:-1:-1;;;;;19484:4:0;19476:27;;;;:42;;;19517:1;19507:6;;:11;;19476:42;19472:284;;;19568:4;;19535:12;;:42;;-1:-1:-1;;;;;19535:12:0;;;;19568:4;;19535:24;:42::i;:::-;19625:4;;19592:12;;:52;;-1:-1:-1;;;;;19592:12:0;;;;19625:4;-1:-1:-1;;19592:24:0;:52::i;:::-;19659:4;;19680:6;;19659:37;;;-1:-1:-1;;;19659:37:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19659:4:0;;;;:12;;:37;;;;;-1:-1:-1;;19659:37:0;;;;;;;;-1:-1:-1;19659:4:0;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;19659:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;19716:28:0;;;;;;;;-1:-1:-1;;;;;19716:28:0;;;-1:-1:-1;19716:28:0;;-1:-1:-1;19716:28:0;;;;;;;;19472:284;19771:20;;;;;;;;-1:-1:-1;;;;;19771:20:0;;;;;;;;;;;;;22201:1;22008;;15710;15746:13;;15730:12;:29;15722:73;;;;;-1:-1:-1;;;15722:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;16693:25;;;;:::o;18162:131::-;18219:7;18246:39;18255:15;18272:12;;18246:8;:39::i;17024:57::-;;;;;;;;;;;;;:::o;23266:128::-;16027:19;;-1:-1:-1;;;;;16027:19:0;16013:10;:33;16005:88;;;;-1:-1:-1;;;16005:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23358:12;:28;23266:128::o;24247:124::-;16027:19;;-1:-1:-1;;;;;16027:19:0;16013:10;:33;16005:88;;;;-1:-1:-1;;;16005:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24333:9;:30;;-1:-1:-1;;;;;;24333:30:0;-1:-1:-1;;;;;24333:30:0;;;;;;;;;;24247:124::o;23146:112::-;16027:19;;-1:-1:-1;;;;;16027:19:0;16013:10;:33;16005:88;;;;-1:-1:-1;;;16005:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23230:8;:20;;-1:-1:-1;;;;;;23230:20:0;-1:-1:-1;;;;;23230:20:0;;;;;;;;;;23146:112::o;16762:29::-;;;;:::o;18301:330::-;18348:7;18372:12;;18388:1;18372:17;18368:77;;;-1:-1:-1;18413:20:0;;18406:27;;18368:77;18475:148;18518:90;18595:12;;18518:72;18585:4;18518:62;18569:10;;18518:46;18549:14;;18518:26;:24;:26::i;:46::-;:50;:62;:50;:62;:::i;:90::-;18475:20;;;:148;:24;:148;:::i;16562:26::-;;;-1:-1:-1;;;;;16562:26:0;;:::o;16798:35::-;;;;:::o;16873:24::-;;;;:::o;16659:27::-;;;;:::o;16992:23::-;;;-1:-1:-1;;;;;16992:23:0;;:::o;16904:27::-;;;;:::o;6601:184::-;6659:7;6692:1;6687;:6;;6679:49;;;;;-1:-1:-1;;;6679:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6751:5:0;;;6601:184::o;7036:470::-;7094:7;7338:6;7334:47;;-1:-1:-1;7368:1:0;7361:8;;7334:47;7405:5;;;7409:1;7405;:5;:1;7429:5;;;;;:10;7421:56;;;;-1:-1:-1;;;7421:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7497:1;7036:470;-1:-1:-1;;;7036:470:0:o;7974:333::-;8032:7;8131:1;8127;:5;8119:44;;;;;-1:-1:-1;;;8119:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8174:9;8190:1;8186;:5;;;;;;;7974:333;-1:-1:-1;;;;7974:333:0:o;6145:181::-;6203:7;6235:5;;;6259:6;;;;6251:46;;;;;-1:-1:-1;;;6251:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;11213:176;11322:58;;;-1:-1:-1;;;;;11322:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;11322:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;11296:85:0;;11315:5;;11296:18;:85::i;11609:621::-;11979:10;;;11978:62;;-1:-1:-1;11995:39:0;;;-1:-1:-1;;;11995:39:0;;12019:4;11995:39;;;;-1:-1:-1;;;;;11995:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;11995:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11995:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11995:39:0;:44;11978:62;11970:152;;;;-1:-1:-1;;;11970:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12159:62;;;-1:-1:-1;;;;;12159:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;12159:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;12133:89:0;;12152:5;;12133:18;:89::i;11397:204::-;11524:68;;;-1:-1:-1;;;;;11524:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;11524:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;11498:95:0;;11517:5;;11498:18;:95::i;:::-;11397:204;;;;:::o;9270:106::-;9328:7;9359:1;9355;:5;:13;;9367:1;9355:13;;;-1:-1:-1;9363:1:0;;9348:20;-1:-1:-1;9270:106:0:o;13207:1114::-;13811:27;-1:-1:-1;;;;;13811:25:0;;;:27::i;:::-;13803:71;;;;;-1:-1:-1;;;13803:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13948:12;13962:23;13997:5;-1:-1:-1;;;;;13989:19:0;14009:4;13989: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;;;13989: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;;13947:67:0;;;;14033:7;14025:52;;;;;-1:-1:-1;;;14025:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14094:17;;:21;14090:224;;14236:10;14225:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14225:30:0;14217:85;;;;-1:-1:-1;;;14217:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10226:422;10593:20;10632:8;;;10226:422::o

Swarm Source

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