Contract 0x00381de0715d54737274f97369b515b48174bd57 1

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x6c5db28aa6e051cf8bf2c5165e203bde0be32bb0c7e5d86d08a1f901db879fb1Stake92405382021-10-19 3:52:5059 mins ago0x4ed9dfe0a7ebdde408371e222df914c954fbee45 IN  0x00381de0715d54737274f97369b515b48174bd570 HT0.00028716752.25
0x7bb6f4b075adde2baacafa8e1f919f70154e1afa0557a485595d99c4cbda8eb6Stake92403202021-10-19 3:41:561 hr 10 mins ago0x4ed9dfe0a7ebdde408371e222df914c954fbee45 IN  0x00381de0715d54737274f97369b515b48174bd570 HT0.000394850252.25
0x77d2b43cf06809007fba442e8445ac17ec0486de0039db774169dc7491b42849Stake92402992021-10-19 3:40:531 hr 11 mins ago0x4ed9dfe0a7ebdde408371e222df914c954fbee45 IN  0x00381de0715d54737274f97369b515b48174bd570 HT0.000319146752.25
0x641412c64f1cd9955ecd810819e2fd3511f9ce4dfd480afbb79b535b1db25ce0Stake92402552021-10-19 3:38:411 hr 13 mins ago0x2973f66e15b3c6f8fce973f208829cc33c4615d7 IN  0x00381de0715d54737274f97369b515b48174bd570 HT0.00028719452.25
0x184300126f63f65172241bd38e0f8fc50e7510c545d27d99655544affbe49226Get Reward92402292021-10-19 3:37:231 hr 14 mins ago0x2973f66e15b3c6f8fce973f208829cc33c4615d7 IN  0x00381de0715d54737274f97369b515b48174bd570 HT0.0002024372.25
0x8eb757e4ef2f0977a183380eafdb6a9483f4ff149a48cfcb2c0bb17d81f3139aStake92399872021-10-19 3:25:171 hr 26 mins ago0x4ed9dfe0a7ebdde408371e222df914c954fbee45 IN  0x00381de0715d54737274f97369b515b48174bd570 HT0.000319146752.25
0x2612ed59b927d77df5043d1d0ff9e303c3e29898b60255476ce534ebeed62917Stake92399532021-10-19 3:23:351 hr 28 mins ago0x4ed9dfe0a7ebdde408371e222df914c954fbee45 IN  0x00381de0715d54737274f97369b515b48174bd570 HT0.000319173752.25
0x5ae75471e8a4a31a40988f0dd32cedfad08701182a88fbd669d44c3243477d29Stake92399372021-10-19 3:22:471 hr 29 mins ago0x4ed9dfe0a7ebdde408371e222df914c954fbee45 IN  0x00381de0715d54737274f97369b515b48174bd570 HT0.000319146752.25
0xa07d31d70275fd4c5130fdd5838d6ba67d4abc69a5919111353d9725c71eeeb7Get Reward92391102021-10-19 2:41:262 hrs 10 mins ago0xf1158a2035d80e5937cd71583f13546f1b034602 IN  0x00381de0715d54737274f97369b515b48174bd570 HT0.0002069372.25
0x5879f5153e64893d281fff69f4386de78362f4d0907291c1ec9344b67e56cda8Stake92377372021-10-19 1:32:473 hrs 19 mins ago0x4c06a397107d668b1fc8c637db10bea09d1f077f IN  0x00381de0715d54737274f97369b515b48174bd570 HT0.00028716752.25
0x39ad16ceea5de5ab4efd705a522636bfa5c11a454fbd35705a7969d20903b061Get Reward92377032021-10-19 1:31:053 hrs 20 mins ago0x4c06a397107d668b1fc8c637db10bea09d1f077f IN  0x00381de0715d54737274f97369b515b48174bd570 HT0.0002024372.25
0x03122d615209b441bc6293d1f9fa66533c8491a029e4d1a2d54264fd1c2b7144Get Reward92368432021-10-19 0:48:054 hrs 3 mins ago0x56aa6fd35ee45f1edfcb746747c03325521f93e2 IN  0x00381de0715d54737274f97369b515b48174bd570 HT0.000207038252.25
0x3c83a69712ea88d4199c874754a18315ecdc201202d2a80124cfa2b8dacd50e6Stake92367122021-10-19 0:41:324 hrs 10 mins ago0x3102b8765da29cc4fe53f18d0b607e0b964154fe IN  0x00381de0715d54737274f97369b515b48174bd570 HT0.00027644852.25
0xfc4828213c5fbeb1257d71fe744b61d9cd84d761cca6a140f7410a02a79b0793Get Reward92366882021-10-19 0:40:204 hrs 11 mins ago0x3102b8765da29cc4fe53f18d0b607e0b964154fe IN  0x00381de0715d54737274f97369b515b48174bd570 HT0.0002024372.25
0xda3df35164b168225eb825fd6f8fbb9304968d1bd46a6147f3bc1c0f8a17ee17Get Reward92363662021-10-19 0:24:144 hrs 27 mins ago0x6e08e0ee1a8d019232ea3cb02da7da20346590db IN  0x00381de0715d54737274f97369b515b48174bd570 HT0.0002454122.25
0x2a01bcd982c5ca30d9a195a95cf329d6f6401c9573974b3a70560e4f4e6478a4Get Reward92359972021-10-19 0:05:474 hrs 46 mins ago0xd6e44a744c18ef16fcd48a8956c15497a18d5af7 IN  0x00381de0715d54737274f97369b515b48174bd570 HT0.0002069372.25
0x5072f66c0ce3479ee721e8540510571effc5931fe77f0ec924604eeb7e1de3d4Get Reward92359772021-10-19 0:04:474 hrs 47 mins ago0xc0c84d3d521ca998bf1f79a12eddeeb671797dff IN  0x00381de0715d54737274f97369b515b48174bd570 HT0.000202335752.25
0xd944bacc7125e4380ef34dad7ee4291d4f86b3b138f14ea1fb00a508c787dc59Withdraw92359722021-10-19 0:04:324 hrs 47 mins ago0xc0c84d3d521ca998bf1f79a12eddeeb671797dff IN  0x00381de0715d54737274f97369b515b48174bd570 HT0.0003394442.25
0x144d0f7eaf7ba0cae447c29930d20ef707e86976fceb1c793042ed10d652c58dGet Reward92354012021-10-18 23:35:595 hrs 15 mins ago0x534be6a3000fdcb44f081bcca3fd07378ff5fa2f IN  0x00381de0715d54737274f97369b515b48174bd570 HT0.0002069372.25
0xa6a4b77e05c9e5ca4f94d81850eea02baa053bac6cd858911ed7655c62de875fGet Reward92350072021-10-18 23:16:175 hrs 35 mins ago0x2cad728d2510d1477c6127995852cb972aa39502 IN  0x00381de0715d54737274f97369b515b48174bd570 HT0.0002454122.25
0xb84488b42df48620c15dbf8b0e9d505f46228a490df487535eb854e6da88c739Get Reward92347082021-10-18 23:01:205 hrs 50 mins ago0xb7064bedb653bda4e998ff1459ef31072e0b695e IN  0x00381de0715d54737274f97369b515b48174bd570 HT0.0002069372.25
0xb973725b6fbc684c27385d0d1424e68cbc77fe565b81d3cc5d8f9d22c9456240Stake92343482021-10-18 22:43:206 hrs 8 mins ago0x4782a60739a754462f9cef34c747cb3609b167a5 IN  0x00381de0715d54737274f97369b515b48174bd570 HT0.00027644852.25
0x673d674fd6e1fdfe932c37ec77ed12ae3226f6f2307a372e38ec26009967c79cStake92338832021-10-18 22:20:056 hrs 31 mins ago0x4782a60739a754462f9cef34c747cb3609b167a5 IN  0x00381de0715d54737274f97369b515b48174bd570 HT0.000311204252.25
0x3c3fe7a2f2e1606d5ebf95605fa8c9c9fc0fd3d6994070fedc6dab84799f4691Get Reward92310142021-10-18 19:56:388 hrs 55 mins ago0x012a92e5eacf760496d1c677720ab28df01a5229 IN  0x00381de0715d54737274f97369b515b48174bd570 HT0.0002069372.25
0x73b46729a97fa5b4fa4c1de622dee1efb67cb02aa0033863641401b722fc31c1Get Reward92306802021-10-18 19:39:569 hrs 12 mins ago0xd6265fe315e8476f3b13b69d48c0d33816af91ab IN  0x00381de0715d54737274f97369b515b48174bd570 HT0.0002454122.25
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

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

Contract Name:
StakingRewards

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at hecoinfo.com on 2021-02-19
*/

pragma solidity ^0.5.16;

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

    function mint(address account, uint amount) external;

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through `transferFrom`. This is
     * zero by default.
     *
     * This value changes when `approve` or `transferFrom` are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * > Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an `Approval` event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a `Transfer` event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to `approve`. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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

// Inheritancea
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 referrer) external;

    function withdraw(uint256 amount) external;

    function getReward() external;

    function exit() external;
}


// File: @openzeppelin/contracts/GSN/Context.sol
/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

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

// File: @openzeppelin/contracts/ownership/Ownable.sol
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        _owner = _msgSender();
        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 _msgSender() == _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;
    }
}

contract RewardsDistributionRecipient is Ownable {
    address public rewardsDistribution;

    function notifyRewardAmount(uint256 reward) external;

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

    function setRewardDistribution(address _rewardDistribution)
        external
        onlyOwner
    {
        rewardsDistribution = _rewardDistribution;
    }
}

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

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

    IERC20 public rewardsToken;
    IERC20 public stakingToken;
    uint256 public periodFinish = 0;
    uint256 public rewardsDuration = 60 days;


    // ------------------------------------------------------
    // R1 rewards start
    uint256 public rewardRate = 0;
    uint256 public lastUpdateTime;
    uint256 public rewardPerTokenStored;
    mapping(address => uint256) public userRewardPerTokenPaid;
    mapping(address => uint256) public rewards;

    // R1 rewards end
    // ------------------------------------------------------



    // ------------------------------------------------------
    // R2 rewards start
    uint256 public rewardRateByWeight = 0;
    uint256 public rewardPerWeightStored;
    mapping(address => uint256) public userRewardPerWeightPaid;
    mapping(address => uint256) public rewardsByWeight;

    uint256 public totalWeight;
    // R2 rewards end
    // ------------------------------------------------------

    mapping(address => address) public referrerMap;
    mapping(address => uint256) public weight;
    mapping(address => uint256) public weightIneligible; // cache the weight in case of balance less than minStake

    uint256 public lowWaterMark = 2000e18;
    uint256 public highWaterMark = 10000000000e18;
    uint256 public minStake = 10e18;
    uint256 public maxLevel = 30;
    uint256 public tokenRewardRatio = 50;
    uint256 public freezeDuration = 7 days;

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

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

    constructor(
        address _rewardsDistribution,
        address _rewardsToken,
        address _stakingToken,
        uint256 _minStake,
        uint256 _lowWaterMark,
        uint256 _highWaterMark,
        uint256 _maxLevel,
        uint256 _tokenRewardRatio,
        uint256 _freezeDuration
    ) public {
        require(_tokenRewardRatio >= 0 && _tokenRewardRatio <= 100, "Invalid tokenRewardRatio");

        rewardsToken = IERC20(_rewardsToken);
        stakingToken = IERC20(_stakingToken);
        rewardsDistribution = _rewardsDistribution;
        minStake = _minStake;
        lowWaterMark = _lowWaterMark;
        if (_highWaterMark > 0) {
            highWaterMark = _highWaterMark;
        }
        maxLevel = _maxLevel;
        tokenRewardRatio = _tokenRewardRatio;
        if (_freezeDuration == 0) {
            freezeDuration = 7 days;
        } else {
            freezeDuration = _freezeDuration;
        }
    }

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


    // --------------------------------------------------------
    // reward by token
    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);
    }
    // reward by token
    // --------------------------------------------------------


    // ========================================================
    // ========================================================


    // --------------------------------------------------------
    // reward by weight
    function rewardPerWeight() public view returns (uint256) {
        if (totalWeight == 0) {
            return rewardPerWeightStored;
        }
        return rewardPerWeightStored.add(
            lastTimeRewardApplicable().sub(lastUpdateTime).mul(rewardRateByWeight).mul(1e18).div(totalWeight)
        );
    }

    function earnedByWeight(address account) public view returns (uint256) {
        uint256 weightw = weight[account];
        return weightw.mul(rewardPerWeight().sub(userRewardPerWeightPaid[account])).div(1e18).add(rewardsByWeight[account]);
    }
    function getWeightForDuration() external view returns (uint256) {
        return rewardRateByWeight.mul(rewardsDuration);
    }
    // reward by weight
    // --------------------------------------------------------



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

    // 1. stake: balance is total staked before stake. amount is the number you stake.
    // 2. withdraw: balance is total staked after withdraw. amount is the number you withdraw.
    function getDeltaWeight(uint256 balance, uint256 amount) public view returns (uint256) {
        uint256 deltaWeight = 0;
        uint256 min = lowWaterMark;
        uint256 max = highWaterMark;
        uint256 total = balance.add(amount);

        if (balance > min) {
            if (balance > max) {
                deltaWeight = 0;
            } else {
                if (total >= max) {
                    deltaWeight = max.sub(balance);
                } else {
                    deltaWeight = amount;
                }
            }
        } else if (balance <= min) {
            if (total >= max) {
                deltaWeight = max;
            } else {
                if (total >= min) {
                    deltaWeight = balance.add(amount);
                } else {
                    deltaWeight = 0;
                }
            }
            if (balance == min) {
                deltaWeight = deltaWeight.sub(balance);
            }
        }

        return deltaWeight;
    }

    function onStake(address account, uint256 balanceBeforeStake, uint256 amount) internal{
        if (balanceBeforeStake < minStake && (balanceBeforeStake + amount) >= minStake)  {
            updateRewardInt(account);
            weight[account] = weightIneligible[account];
            weightIneligible[account] = 0;
            totalWeight = updateByDetal(totalWeight, weight[account], true);
        }
    }

    function setReferrer(address account, address referrer) internal returns (address) {
        uint256 balance = _balances[account];
        uint256 weightAcc = weight[account];
        address existingReferrer = referrerMap[account];

        if (balance == 0 && weightAcc == 0 && existingReferrer == address(0)) {
            if (initialStakeTime[referrer] > 0 && referrerMap[referrer] != account) {
                referrerMap[account] = referrer;
                existingReferrer = referrer;
            }
        }

        return existingReferrer;
    }

    function stake(uint256 amount, address ref) external nonReentrant updateReward(msg.sender) {
        require(amount > 0, "Cannot stake 0");
        uint256 beforeStake = _balances[msg.sender];

        address referrer = setReferrer(msg.sender, ref);

        if (referrer != address(0)) {
            uint256 deltaWeight = getDeltaWeight(_balances[msg.sender], amount);
            if (deltaWeight > 0) {
                for (uint24 i = 0; i < maxLevel; i++) {
                    updateReferrerWeight(referrer, deltaWeight, true);
                    referrer = referrerMap[referrer];
                    if (referrer == address(0)) {
                        break;
                    }
                }
            }
        }

        // update totalWeight base on my min stake
        onStake(msg.sender, beforeStake, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[msg.sender] = _balances[msg.sender].add(amount);
        stakingToken.safeTransferFrom(msg.sender, address(this), amount);
        if (initialStakeTime[msg.sender] == 0) {
            initialStakeTime[msg.sender] = block.timestamp;
        }
        emit Staked(msg.sender, amount);
    }


    function onWithdraw(address account, uint256 balanceAfterWithdraw, uint256 amount) internal{
        if (balanceAfterWithdraw < minStake && (balanceAfterWithdraw + amount) >= minStake)  {
            require(totalWeight >= weight[account], "onWithdraw: invalid delta weight");
            updateRewardInt(account);
            weightIneligible[account] = weight[account];
            weight[account] = 0;
            totalWeight = updateByDetal(totalWeight, weightIneligible[account], false);
        }
    }
    
    function withdraw(uint256 amount) public nonReentrant updateReward(msg.sender) {
        require(amount > 0, "Cannot withdraw 0");
        require(initialStakeTime[msg.sender].add(freezeDuration) <= block.timestamp,"Freezed, cannot withdraw");
        uint256 afterWithdraw = _balances[msg.sender].sub(amount);

        address referrer = referrerMap[msg.sender];
        if (referrer != address(0)) {
            uint256 deltaWeight = getDeltaWeight(afterWithdraw, amount);
            if (deltaWeight > 0) {
                for (uint24 i = 0; i < maxLevel; i++) {
                    updateReferrerWeight(referrer, deltaWeight, false);
                    referrer = referrerMap[referrer];
                    if (referrer == address(0)) {
                        break;
                    }
                }
            }
        }

        // update totalWeight base on my min stake
        onWithdraw(msg.sender, afterWithdraw, amount);

        _totalSupply = _totalSupply.sub(amount);
        _balances[msg.sender] = _balances[msg.sender].sub(amount);
        stakingToken.safeTransfer(msg.sender, amount);
        emit Withdrawn(msg.sender, amount);
    }

    
    
    function getReward() public nonReentrant updateReward(msg.sender) {
        uint256 reward = rewards[msg.sender];
        if (reward > 0) {
            rewards[msg.sender] = 0;
            rewardsToken.safeTransfer(msg.sender, reward);
            emit RewardPaid(msg.sender, reward);
        }

    }
    
    function getRewardWeight() public nonReentrant updateReward(msg.sender) {
        uint256 rewardw = rewardsByWeight[msg.sender];
        if (rewardw > 0) {
            rewardsByWeight[msg.sender] = 0;
            rewardsToken.safeTransfer(msg.sender, rewardw);
            emit RewardPaid(msg.sender, rewardw);
        }
    }
    
    function getRewardAll() public  updateReward(msg.sender) {
        getReward();
        getRewardWeight();
    }

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

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

    function notifyRewardAmount(uint256 reward) external onlyRewardsDistribution updateReward(address(0)) {
        require(tokenRewardRatio <= 100 && tokenRewardRatio >= 0, "Invalid ratio");

        uint256 reward4Token = reward.mul(tokenRewardRatio).div(100);
        uint256 reward4Weight = reward.sub(reward4Token);

        if (block.timestamp >= periodFinish) {
            rewardRate = reward4Token.div(rewardsDuration);
            rewardRateByWeight = reward4Weight.div(rewardsDuration);
        } else {
            uint256 remaining = periodFinish.sub(block.timestamp);
            uint256 leftover = remaining.mul(rewardRate);
            rewardRate = reward4Token.add(leftover).div(rewardsDuration);

            uint256 leftover4Weight = remaining.mul(rewardRateByWeight);
            rewardRateByWeight = reward4Weight.add(leftover4Weight).div(rewardsDuration);
        }

        rewardsToken.mint(address(this), reward);
        // Ensure the provided reward amount is not more than the balance in the contract.
        // This keeps the reward rate in the right range, preventing overflows due to
        // very high values of rewardRate in the earned and rewardsPerToken functions;
        // Reward + leftover must be less than 2^256 / 10^18 to avoid overflow.
        uint balance = rewardsToken.balanceOf(address(this));
        require(rewardRate.add(rewardRateByWeight) <= balance.div(rewardsDuration), "Provided reward too high");

        lastUpdateTime = block.timestamp;
        periodFinish = block.timestamp.add(rewardsDuration);
        emit RewardAdded(reward);
    }

    function updateByDetal(uint256 target, uint256 detal, bool add) pure public returns (uint256){
        if (add) {
            target = target.add(detal);
        } else {
            target = target.sub(detal);
        }
        return target;
    }
    
    function updateRewardInt(address account) internal{
        rewardPerTokenStored = rewardPerToken();
        rewardPerWeightStored = rewardPerWeight();
        lastUpdateTime = lastTimeRewardApplicable();
        if (account != address(0)) {
            rewards[account] = earned(account);
            userRewardPerTokenPaid[account] = rewardPerTokenStored;

            rewardsByWeight[account] = earnedByWeight(account);
            userRewardPerWeightPaid[account] = rewardPerWeightStored;
        }
    }

    function updateReferrerWeight(address referrer, uint256 deltaWeight, bool isStake)  internal{
        if (_balances[referrer] >= minStake) {
            updateRewardInt(referrer);
            weight[referrer] = updateByDetal(weight[referrer], deltaWeight, isStake);
            totalWeight = updateByDetal(totalWeight, deltaWeight, isStake);
        } else {
            require(weight[referrer] == 0, "invalid weight[referrer]");
            weightIneligible[referrer] = updateByDetal(weightIneligible[referrer], deltaWeight, isStake);
        }
    }

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

    modifier updateReward(address account) {
        updateRewardInt(account);
        _;
    }

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

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":"uint256","name":"_minStake","type":"uint256"},{"internalType":"uint256","name":"_lowWaterMark","type":"uint256"},{"internalType":"uint256","name":"_highWaterMark","type":"uint256"},{"internalType":"uint256","name":"_maxLevel","type":"uint256"},{"internalType":"uint256","name":"_tokenRewardRatio","type":"uint256"},{"internalType":"uint256","name":"_freezeDuration","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"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":"Withdrawn","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":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earnedByWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"exit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"freezeDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getDeltaWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"getReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"getRewardAll","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":false,"inputs":[],"name":"getRewardWeight","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getWeightForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"highWaterMark","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"initialStakeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":true,"inputs":[],"name":"lowWaterMark","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minStake","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":"owner","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":[{"internalType":"address","name":"","type":"address"}],"name":"referrerMap","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"rewardPerWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardPerWeightStored","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":[],"name":"rewardRateByWeight","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":[{"internalType":"address","name":"","type":"address"}],"name":"rewardsByWeight","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":"rewardsToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rewardDistribution","type":"address"}],"name":"setRewardDistribution","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"ref","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":"tokenRewardRatio","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":[],"name":"totalWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"uint256","name":"detal","type":"uint256"},{"internalType":"bool","name":"add","type":"bool"}],"name":"updateByDetal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","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":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userRewardPerWeightPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"weight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"weightIneligible","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040526000600555624f1a0060065560006007556000600c55686c6b935b8bbd4000006014556b204fce5e3e25026110000000601555678ac7230489e80000601655601e601755603260185562093a806019553480156200006157600080fd5b506040516200210d3803806200210d83398181016040526101208110156200008857600080fd5b508051602082015160408301516060840151608085015160a086015160c087015160e088015161010090980151969795969495939492939192909190620000d76001600160e01b036200020116565b600080546001600160a01b0319166001600160a01b03928316178082556040519216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600160025560648211156200017b576040805162461bcd60e51b815260206004820152601860248201527f496e76616c696420746f6b656e526577617264526174696f0000000000000000604482015290519081900360640190fd5b600380546001600160a01b03808b166001600160a01b031992831617909255600480548a841690831617905560018054928c1692909116919091179055601686905560148590558315620001cf5760158490555b6017839055601882905580620001ec5762093a80601955620001f2565b60198190555b50505050505050505062000205565b3390565b611ef880620002156000396000f3fe608060405234801561001057600080fd5b506004361061029f5760003560e01c80637acb775711610167578063ce647b91116100ce578063ebe2b12b11610087578063ebe2b12b1461060e578063f2fde38b14610616578063f4396e2a1461063c578063f7281ccb14610662578063fb8b2fc51461066a578063fde8744d146106725761029f565b8063ce647b91146105a2578063d146ef4e146105c8578063d1af0c7d146105d0578063d9dd6430146105d8578063df136d65146105fe578063e9fad8ee146106065761029f565b80638f32d59b116101205780638f32d59b1461055e57806396c82e571461057a578063bce40ee214610582578063c8f33c911461058a578063cc06c35914610592578063cd3daf9d1461059a5761029f565b80637acb7757146104ce5780637b0a47ee146104fa57806380faa57d1461050257806389f99dc91461050a5780638b876347146105305780638da5cb5b146105565761029f565b80633c6b16ab1161020b5780635173b53c116101c45780635173b53c14610444578063589e0f111461044c5780635c29c30e1461047257806370a0823114610498578063715018a6146104be57806372f702f3146104c65761029f565b80633c6b16ab146103a25780633d18b912146103bf5780633e7d7a47146103c75780633fc6df6e146103f2578063440991bd146104165780634a51f9c51461041e5761029f565b80631e8410da1161025d5780631e8410da1461035d5780632ac3f450146103655780632e1a7d4d1461036d5780633228dd591461038a578063375b3c0a14610392578063386a95251461039a5761029f565b80628cc262146102a45780630700037d146102dc5780630d68b7611461030257806318160ddd1461032a5780631c1f78eb146103325780631d01ff5a1461033a575b600080fd5b6102ca600480360360208110156102ba57600080fd5b50356001600160a01b031661067a565b60408051918252519081900360200190f35b6102ca600480360360208110156102f257600080fd5b50356001600160a01b0316610710565b6103286004803603602081101561031857600080fd5b50356001600160a01b0316610722565b005b6102ca61079d565b6102ca6107a4565b6102ca6004803603604081101561035057600080fd5b50803590602001356107c2565b6102ca61087f565b6102ca610885565b6103286004803603602081101561038357600080fd5b50356108df565b6102ca610b5d565b6102ca610b63565b6102ca610b69565b610328600480360360208110156103b857600080fd5b5035610b6f565b610328610ec0565b6102ca600480360360608110156103dd57600080fd5b50803590602081013590604001351515610fa6565b6103fa610fe0565b604080516001600160a01b039092168252519081900360200190f35b6102ca610fef565b6102ca6004803603602081101561043457600080fd5b50356001600160a01b0316610ff5565b610328611007565b6102ca6004803603602081101561046257600080fd5b50356001600160a01b031661105b565b6102ca6004803603602081101561048857600080fd5b50356001600160a01b03166110c0565b6102ca600480360360208110156104ae57600080fd5b50356001600160a01b03166110d2565b6103286110ed565b6103fa611190565b610328600480360360408110156104e457600080fd5b50803590602001356001600160a01b031661119f565b6102ca6113c3565b6102ca6113c9565b6102ca6004803603602081101561052057600080fd5b50356001600160a01b03166113d7565b6102ca6004803603602081101561054657600080fd5b50356001600160a01b03166113e9565b6103fa6113fb565b61056661140a565b604080519115158252519081900360200190f35b6102ca61142e565b610328611434565b6102ca61144e565b6102ca611454565b6102ca61145a565b6102ca600480360360208110156105b857600080fd5b50356001600160a01b03166114a8565b6102ca6114ba565b6103fa6114d3565b6103fa600480360360208110156105ee57600080fd5b50356001600160a01b03166114e2565b6102ca6114fd565b610328611503565b6102ca611526565b6103286004803603602081101561062c57600080fd5b50356001600160a01b031661152c565b6102ca6004803603602081101561065257600080fd5b50356001600160a01b031661158e565b6102ca6115a0565b6102ca6115a6565b6102ca6115ac565b6001600160a01b0381166000908152600b6020908152604080832054600a90925282205461070a91906106fe90670de0b6b3a7640000906106f2906106cd906106c161145a565b9063ffffffff6115b216565b6001600160a01b0388166000908152601b60205260409020549063ffffffff61160f16565b9063ffffffff61166816565b9063ffffffff6116d216565b92915050565b600b6020526000908152604090205481565b61072a61140a565b61077b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b601a545b90565b60006107bd60065460075461160f90919063ffffffff16565b905090565b6014546015546000918291826107de878763ffffffff6116d216565b90508287111561082057818711156107f9576000935061081b565b81811061081757610810828863ffffffff6115b216565b935061081b565b8593505b610874565b8287116108745781811061083657819350610859565b8281106108545761084d878763ffffffff6116d216565b9350610859565b600093505b8287141561087457610871848863ffffffff6115b216565b93505b509195945050505050565b60155481565b60006010546000141561089b5750600d546107a1565b6107bd6108d06010546106f2670de0b6b3a76400006108c4600c546108c46008546106c16113c9565b9063ffffffff61160f16565b600d549063ffffffff6116d216565b6002805460010190819055336108f48161172c565b6000831161093d576040805162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b604482015290519081900360640190fd5b601954336000908152601c60205260409020544291610962919063ffffffff6116d216565b11156109b5576040805162461bcd60e51b815260206004820152601860248201527f467265657a65642c2063616e6e6f742077697468647261770000000000000000604482015290519081900360640190fd5b336000908152601b60205260408120546109d5908563ffffffff6115b216565b336000908152601160205260409020549091506001600160a01b03168015610a5d576000610a0383876107c2565b90508015610a5b5760005b6017548162ffffff161015610a5957610a29838360006117c7565b6001600160a01b039283166000908152601160205260409020549092169182610a5157610a59565b600101610a0e565b505b505b610a683383876118f1565b601a54610a7b908663ffffffff6115b216565b601a55336000908152601b6020526040902054610a9e908663ffffffff6115b216565b336000818152601b6020526040902091909155600454610aca916001600160a01b0390911690876119c4565b60408051868152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a25050506002548114610b59576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b5050565b600d5481565b60165481565b60065481565b6001546001600160a01b03163314610bb85760405162461bcd60e51b815260040180806020018281038252602a815260200180611e70602a913960400191505060405180910390fd5b6000610bc38161172c565b606460185411158015610bd4575060015b610c15576040805162461bcd60e51b815260206004820152600d60248201526c496e76616c696420726174696f60981b604482015290519081900360640190fd5b6000610c3160646106f26018548661160f90919063ffffffff16565b90506000610c45848363ffffffff6115b216565b90506005544210610c8357600654610c6490839063ffffffff61166816565b600755600654610c7b90829063ffffffff61166816565b600c55610d07565b600554600090610c99904263ffffffff6115b216565b90506000610cb26007548361160f90919063ffffffff16565b600654909150610ccc906106f2868463ffffffff6116d216565b600755600c54600090610ce690849063ffffffff61160f16565b600654909150610d00906106f2868463ffffffff6116d216565b600c555050505b600354604080516340c10f1960e01b81523060048201526024810187905290516001600160a01b03909216916340c10f199160448082019260009290919082900301818387803b158015610d5a57600080fd5b505af1158015610d6e573d6000803e3d6000fd5b5050600354604080516370a0823160e01b81523060048201529051600094506001600160a01b0390921692506370a08231916024808301926020929190829003018186803b158015610dbf57600080fd5b505afa158015610dd3573d6000803e3d6000fd5b505050506040513d6020811015610de957600080fd5b5051600654909150610e0290829063ffffffff61166816565b600c54600754610e179163ffffffff6116d216565b1115610e6a576040805162461bcd60e51b815260206004820152601860248201527f50726f76696465642072657761726420746f6f20686967680000000000000000604482015290519081900360640190fd5b426008819055600654610e83919063ffffffff6116d216565b6005556040805186815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a15050505050565b600280546001019081905533610ed58161172c565b336000908152600b60205260409020548015610f4b57336000818152600b6020526040812055600354610f14916001600160a01b0390911690836119c4565b60408051828152905133917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b50506002548114610fa3576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b50565b60008115610fc557610fbe848463ffffffff6116d216565b9350610fd8565b610fd5848463ffffffff6115b216565b93505b509192915050565b6001546001600160a01b031681565b60195481565b601c6020526000908152604090205481565b60028054600101908190553361101c8161172c565b336000908152600f60205260409020548015610f4b57336000818152600f6020526040812055600354610f14916001600160a01b0390911690836119c4565b6001600160a01b038116600090815260126020908152604080832054600f835281842054600e9093529083205490916110b9916106fe90670de0b6b3a7640000906106f2906110ac906106c1610885565b869063ffffffff61160f16565b9392505050565b600e6020526000908152604090205481565b6001600160a01b03166000908152601b602052604090205490565b6110f561140a565b611146576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6004546001600160a01b031681565b6002805460010190819055336111b48161172c565b600084116111fa576040805162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b604482015290519081900360640190fd5b336000818152601b6020526040812054916112159086611a16565b90506001600160a01b0381161561129a57336000908152601b602052604081205461124090886107c2565b905080156112985760005b6017548162ffffff16101561129657611266838360016117c7565b6001600160a01b03928316600090815260116020526040902054909216918261128e57611296565b60010161124b565b505b505b6112a5338388611af0565b601a546112b8908763ffffffff6116d216565b601a55336000908152601b60205260409020546112db908763ffffffff6116d216565b336000818152601b6020526040902091909155600454611308916001600160a01b03909116903089611b50565b336000908152601c602052604090205461132f57336000908152601c602052604090204290555b60408051878152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a250505060025481146113be576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b505050565b60075481565b60006107bd42600554611bb0565b600f6020526000908152604090205481565b600a6020526000908152604090205481565b6000546001600160a01b031690565b600080546001600160a01b031661141f611bc6565b6001600160a01b031614905090565b60105481565b3361143e8161172c565b611446610ec0565b610fa3611007565b60085481565b60175481565b6000601a546000141561147057506009546107a1565b6107bd611499601a546106f2670de0b6b3a76400006108c46007546108c46008546106c16113c9565b6009549063ffffffff6116d216565b60136020526000908152604090205481565b60006107bd600654600c5461160f90919063ffffffff16565b6003546001600160a01b031681565b6011602052600090815260409020546001600160a01b031681565b60095481565b336000908152601b602052604090205461151c906108df565b611524611434565b565b60055481565b61153461140a565b611585576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b610fa381611bca565b60126020526000908152604090205481565b600c5481565b60185481565b60145481565b600082821115611609576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008261161e5750600061070a565b8282028284828161162b57fe5b04146110b95760405162461bcd60e51b8152600401808060200182810382526021815260200180611e4f6021913960400191505060405180910390fd5b60008082116116be576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816116c957fe5b04949350505050565b6000828201838110156110b9576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b61173461145a565b60095561173f610885565b600d5561174a6113c9565b6008556001600160a01b03811615610fa3576117658161067a565b6001600160a01b0382166000908152600b6020908152604080832093909355600954600a909152919020556117998161105b565b6001600160a01b0382166000908152600f6020908152604080832093909355600d54600e9091529190205550565b6016546001600160a01b0384166000908152601b602052604090205410611844576117f18361172c565b6001600160a01b038316600090815260126020526040902054611815908383610fa6565b6001600160a01b03841660009081526012602052604090205560105461183c908383610fa6565b6010556113be565b6001600160a01b038316600090815260126020526040902054156118af576040805162461bcd60e51b815260206004820152601860248201527f696e76616c6964207765696768745b72656665727265725d0000000000000000604482015290519081900360640190fd5b6001600160a01b0383166000908152601360205260409020546118d3908383610fa6565b6001600160a01b038416600090815260136020526040902055505050565b60165482108015611906575060165481830110155b156113be576001600160a01b038316600090815260126020526040902054601054101561197a576040805162461bcd60e51b815260206004820181905260248201527f6f6e57697468647261773a20696e76616c69642064656c746120776569676874604482015290519081900360640190fd5b6119838361172c565b6001600160a01b03831660009081526012602090815260408083208054601390935290832091825582905560105490546119bc92610fa6565b601055505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526113be908490611c6a565b6001600160a01b038083166000908152601b60209081526040808320546012835281842054601190935290832054929390921682158015611a55575081155b8015611a6857506001600160a01b038116155b15611ae7576001600160a01b0385166000908152601c602052604090205415801590611ab157506001600160a01b03858116600090815260116020526040902054811690871614155b15611ae757506001600160a01b03858116600090815260116020526040902080546001600160a01b031916918616919091179055835b95945050505050565b60165482108015611b05575060165481830110155b156113be57611b138361172c565b6001600160a01b0383166000908152601360209081526040808320805460129093529083209182559190915560105490546119bc91906001610fa6565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611baa908590611c6a565b50505050565b6000818310611bbf57816110b9565b5090919050565b3390565b6001600160a01b038116611c0f5760405162461bcd60e51b8152600401808060200182810382526026815260200180611e296026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b611c7c826001600160a01b0316611e22565b611ccd576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310611d0b5780518252601f199092019160209182019101611cec565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611d6d576040519150601f19603f3d011682016040523d82523d6000602084013e611d72565b606091505b509150915081611dc9576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115611baa57808060200190516020811015611de557600080fd5b5051611baa5760405162461bcd60e51b815260040180806020018281038252602a815260200180611e9a602a913960400191505060405180910390fd5b3b15159056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7743616c6c6572206973206e6f742052657761726473446973747269627574696f6e20636f6e74726163745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a72315820fdd267498f1cfac47488df4fc196394f51b7664377bb5d4e3647f1cb3ee807bf64736f6c6343000510003200000000000000000000000073bb4b96d5cdc1e1ed24eae77f6458870a8f16eb000000000000000000000000a78e888599747389dea47c2c106e47f2853bb005000000000000000000000000a78e888599747389dea47c2c106e47f2853bb0050000000000000000000000000000000000000000000000008ac7230489e800000000000000000000000000000000000000000000000000008ac7230489e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000000

Deployed ByteCode Sourcemap

19731:14736:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19731:14736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23394:198;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23394:198:0;-1:-1:-1;;;;;23394:198:0;;:::i;:::-;;;;;;;;;;;;;;;;20368:42;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20368:42:0;-1:-1:-1;;;;;20368:42:0;;:::i;19562:162::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19562:162:0;-1:-1:-1;;;;;19562:162:0;;:::i;:::-;;22617:93;;;:::i;23600:121::-;;;:::i;25094:1034::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25094:1034:0;;;;;;;:::i;21194:45::-;;;:::i;24044:318::-;;;:::i;28895:1191::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28895:1191:0;;:::i;20643:36::-;;;:::i;21246:31::-;;;:::i;20051:40::-;;;:::i;31059:1626::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31059:1626:0;;:::i;30106:309::-;;;:::i;32693:256::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32693:256:0;;;;;;;;;;;;;;:::i;19296:34::-;;;:::i;:::-;;;;-1:-1:-1;;;;;19296:34:0;;;;;;;;;;;;;;21362:38;;;:::i;21496:51::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21496:51:0;-1:-1:-1;;;;;21496:51:0;;:::i;30427:333::-;;;:::i;24370:249::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24370:249:0;-1:-1:-1;;;;;24370:249:0;;:::i;20686:58::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20686:58:0;-1:-1:-1;;;;;20686:58:0;;:::i;22718:112::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22718:112:0;-1:-1:-1;;;;;22718:112:0;;:::i;18494:140::-;;;:::i;19980:26::-;;;:::i;27138:1219::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27138:1219:0;;;;;;-1:-1:-1;;;;;27138:1219:0;;:::i;20190:29::-;;;:::i;22838:131::-;;;:::i;20751:50::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20751:50:0;-1:-1:-1;;;;;20751:50:0;;:::i;20304:57::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20304:57:0;-1:-1:-1;;;;;20304:57:0;;:::i;17683:79::-;;;:::i;18049:94::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;20810:26;;;:::i;30772:115::-;;;:::i;20226:29::-;;;:::i;21284:28::-;;;:::i;23068:318::-;;;:::i;21032:51::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21032:51:0;-1:-1:-1;;;;;21032:51:0;;:::i;24625:129::-;;;:::i;19947:26::-;;;:::i;20931:46::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20931:46:0;-1:-1:-1;;;;;20931:46:0;;:::i;20262:35::-;;;:::i;30895:100::-;;;:::i;20013:31::-;;;:::i;18789:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18789:109:0;-1:-1:-1;;;;;18789:109:0;;:::i;20984:41::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20984:41:0;-1:-1:-1;;;;;20984:41:0;;:::i;20599:37::-;;;:::i;21319:36::-;;;:::i;21150:37::-;;;:::i;23394:198::-;-1:-1:-1;;;;;23567:16:0;;23448:7;23567:16;;;:7;:16;;;;;;;;;23519:22;:31;;;;;;23475:109;;23567:16;23475:87;;23557:4;;23475:77;;23498:53;;:16;:14;:16::i;:::-;:20;:53;:20;:53;:::i;:::-;-1:-1:-1;;;;;23475:18:0;;;;;;:9;:18;;;;;;;:77;:22;:77;:::i;:::-;:81;:87;:81;:87;:::i;:::-;:91;:109;:91;:109;:::i;:::-;23468:116;23394:198;-1:-1:-1;;23394:198:0:o;20368:42::-;;;;;;;;;;;;;:::o;19562:162::-;17895:9;:7;:9::i;:::-;17887:54;;;;;-1:-1:-1;;;17887:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19675:19;:41;;-1:-1:-1;;;;;;19675:41:0;-1:-1:-1;;;;;19675:41:0;;;;;;;;;;19562:162::o;22617:93::-;22690:12;;22617:93;;:::o;23600:121::-;23655:7;23682:31;23697:15;;23682:10;;:14;;:31;;;;:::i;:::-;23675:38;;23600:121;:::o;25094:1034::-;25240:12;;25277:13;;25172:7;;;;;25317:19;:7;25329:6;25317:19;:11;:19;:::i;:::-;25301:35;;25363:3;25353:7;:13;25349:741;;;25397:3;25387:7;:13;25383:269;;;25435:1;25421:15;;25383:269;;;25490:3;25481:5;:12;25477:160;;25532:16;:3;25540:7;25532:16;:7;:16;:::i;:::-;25518:30;;25477:160;;;25611:6;25597:20;;25477:160;25349:741;;;25684:3;25673:7;:14;25669:421;;25717:3;25708:5;:12;25704:268;;25755:3;25741:17;;25704:268;;;25812:3;25803:5;:12;25799:158;;25854:19;:7;25866:6;25854:19;:11;:19;:::i;:::-;25840:33;;25799:158;;;25936:1;25922:15;;25799:158;26001:3;25990:7;:14;25986:93;;;26039:24;:11;26055:7;26039:24;:15;:24;:::i;:::-;26025:38;;25986:93;-1:-1:-1;26109:11:0;;25094:1034;-1:-1:-1;;;;;25094:1034:0:o;21194:45::-;;;;:::o;24044:318::-;24092:7;24116:11;;24131:1;24116:16;24112:77;;;-1:-1:-1;24156:21:0;;24149:28;;24112:77;24206:148;24246:97;24331:11;;24246:80;24321:4;24246:70;24297:18;;24246:46;24277:14;;24246:26;:24;:26::i;:46::-;:50;:70;:50;:70;:::i;:97::-;24206:21;;;:148;:25;:148;:::i;28895:1191::-;14759:13;:18;;14776:1;14759:18;;;;;28962:10;34152:24;28962:10;34152:15;:24::i;:::-;29002:1;28993:6;:10;28985:40;;;;;-1:-1:-1;;;28985:40:0;;;;;;;;;;;;-1:-1:-1;;;28985:40:0;;;;;;;;;;;;;;;29077:14;;29061:10;29044:28;;;;:16;:28;;;;;;29096:15;;29044:48;;:28;:48;:32;:48;:::i;:::-;:67;;29036:103;;;;;-1:-1:-1;;;29036:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29184:10;29150:21;29174;;;:9;:21;;;;;;:33;;29200:6;29174:33;:25;:33;:::i;:::-;29251:10;29220:16;29239:23;;;:11;:23;;;;;;29150:57;;-1:-1:-1;;;;;;29239:23:0;29277:22;;29273:475;;29316:19;29338:37;29353:13;29368:6;29338:14;:37::i;:::-;29316:59;-1:-1:-1;29394:15:0;;29390:347;;29435:8;29430:292;29453:8;;29449:1;:12;;;29430:292;;;29491:50;29512:8;29522:11;29535:5;29491:20;:50::i;:::-;-1:-1:-1;;;;;29575:21:0;;;;;;;:11;:21;;;;;;;;;;29623:22;29619:84;;29674:5;;29619:84;29463:3;;29430:292;;;;29390:347;29273:475;;29812:45;29823:10;29835:13;29850:6;29812:10;:45::i;:::-;29885:12;;:24;;29902:6;29885:24;:16;:24;:::i;:::-;29870:12;:39;29954:10;29944:21;;;;:9;:21;;;;;;:33;;29970:6;29944:33;:25;:33;:::i;:::-;29930:10;29920:21;;;;:9;:21;;;;;:57;;;;29988:12;;:45;;-1:-1:-1;;;;;29988:12:0;;;;30026:6;29988:25;:45::i;:::-;30049:29;;;;;;;;30059:10;;30049:29;;;;;;;;;;34187:1;;14835;14871:13;;14855:12;:29;14847:73;;;;;-1:-1:-1;;;14847:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28895:1191;;:::o;20643:36::-;;;;:::o;21246:31::-;;;;:::o;20051:40::-;;;;:::o;31059:1626::-;19468:19;;-1:-1:-1;;;;;19468:19:0;19454:10;:33;19446:88;;;;-1:-1:-1;;;19446:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31157:1;34152:24;34168:7;34152:15;:24::i;:::-;31200:3;31180:16;;:23;;:48;;;;-1:-1:-1;31207:21:0;31180:48;31172:74;;;;;-1:-1:-1;;;31172:74:0;;;;;;;;;;;;-1:-1:-1;;;31172:74:0;;;;;;;;;;;;;;;31259:20;31282:37;31315:3;31282:28;31293:16;;31282:6;:10;;:28;;;;:::i;:37::-;31259:60;-1:-1:-1;31330:21:0;31354:24;:6;31259:60;31354:24;:10;:24;:::i;:::-;31330:48;;31414:12;;31395:15;:31;31391:567;;31473:15;;31456:33;;:12;;:33;:16;:33;:::i;:::-;31443:10;:46;31543:15;;31525:34;;:13;;:34;:17;:34;:::i;:::-;31504:18;:55;31391:567;;;31612:12;;31592:17;;31612:33;;31629:15;31612:33;:16;:33;:::i;:::-;31592:53;;31660:16;31679:25;31693:10;;31679:9;:13;;:25;;;;:::i;:::-;31763:15;;31660:44;;-1:-1:-1;31732:47:0;;:26;:12;31660:44;31732:26;:16;:26;:::i;:47::-;31719:10;:60;31836:18;;31796:23;;31822:33;;:9;;:33;:13;:33;:::i;:::-;31930:15;;31796:59;;-1:-1:-1;31891:55:0;;:34;:13;31796:59;31891:34;:17;:34;:::i;:55::-;31870:18;:76;-1:-1:-1;;;31391:567:0;31970:12;;:40;;;-1:-1:-1;;;31970:40:0;;31996:4;31970:40;;;;;;;;;;;;-1:-1:-1;;;;;31970:12:0;;;;:17;;:40;;;;;:12;;:40;;;;;;;;:12;;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;31970:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;32384:12:0;;:37;;;-1:-1:-1;;;32384:37:0;;32415:4;32384:37;;;;;;32369:12;;-1:-1:-1;;;;;;32384:12:0;;;;-1:-1:-1;32384:22:0;;:37;;;;;;;;;;;;;;:12;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;32384:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32384:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32384:37:0;32490:15;;32384:37;;-1:-1:-1;32478:28:0;;32384:37;;32478:28;:11;:28;:::i;:::-;32455:18;;32440:10;;:34;;;:14;:34;:::i;:::-;:66;;32432:103;;;;;-1:-1:-1;;;32432:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32565:15;32548:14;:32;;;32626:15;;32606:36;;32565:15;32606:36;:19;:36;:::i;:::-;32591:12;:51;32658:19;;;;;;;;;;;;;;;;;34187:1;;;19545;31059:1626;:::o;30106:309::-;14759:13;:18;;14776:1;14759:18;;;;;30160:10;34152:24;30160:10;34152:15;:24::i;:::-;30208:10;30183:14;30200:19;;;:7;:19;;;;;;30234:10;;30230:176;;30269:10;30283:1;30261:19;;;:7;:19;;;;;:23;30299:12;;:45;;-1:-1:-1;;;;;30299:12:0;;;;30337:6;30299:25;:45::i;:::-;30364:30;;;;;;;;30375:10;;30364:30;;;;;;;;;;30230:176;34187:1;14835;14871:13;;14855:12;:29;14847:73;;;;;-1:-1:-1;;;14847:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30106:309;:::o;32693:256::-;32778:7;32801:3;32797:121;;;32830:17;:6;32841:5;32830:17;:10;:17;:::i;:::-;32821:26;;32797:121;;;32889:17;:6;32900:5;32889:17;:10;:17;:::i;:::-;32880:26;;32797:121;-1:-1:-1;32935:6:0;;32693:256;-1:-1:-1;;32693:256:0:o;19296:34::-;;;-1:-1:-1;;;;;19296:34:0;;:::o;21362:38::-;;;;:::o;21496:51::-;;;;;;;;;;;;;:::o;30427:333::-;14759:13;:18;;14776:1;14759:18;;;;;30487:10;34152:24;30487:10;34152:15;:24::i;:::-;30544:10;30510:15;30528:27;;;:15;:27;;;;;;30570:11;;30566:187;;30614:10;30628:1;30598:27;;;:15;:27;;;;;:31;30644:12;;:46;;-1:-1:-1;;;;;30644:12:0;;;;30682:7;30644:25;:46::i;24370:249::-;-1:-1:-1;;;;;24470:15:0;;24432:7;24470:15;;;:6;:15;;;;;;;;;24586;:24;;;;;;24537:23;:32;;;;;;;24470:15;;24503:108;;:78;;24576:4;;24503:68;;24515:55;;:17;:15;:17::i;:55::-;24503:7;;:68;:11;:68;:::i;:108::-;24496:115;24370:249;-1:-1:-1;;;24370:249:0:o;20686:58::-;;;;;;;;;;;;;:::o;22718:112::-;-1:-1:-1;;;;;22804:18:0;22777:7;22804:18;;;:9;:18;;;;;;;22718:112::o;18494:140::-;17895:9;:7;:9::i;:::-;17887:54;;;;;-1:-1:-1;;;17887:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18593:1;18577:6;;18556:40;;-1:-1:-1;;;;;18577:6:0;;;;18556:40;;18593:1;;18556:40;18624:1;18607:19;;-1:-1:-1;;;;;;18607:19:0;;;18494:140::o;19980:26::-;;;-1:-1:-1;;;;;19980:26:0;;:::o;27138:1219::-;14759:13;:18;;14776:1;14759:18;;;;;27217:10;34152:24;27217:10;34152:15;:24::i;:::-;27257:1;27248:6;:10;27240:37;;;;;-1:-1:-1;;;27240:37:0;;;;;;;;;;;;-1:-1:-1;;;27240:37:0;;;;;;;;;;;;;;;27320:10;27288:19;27310:21;;;:9;:21;;;;;;;27363:28;;27387:3;27363:11;:28::i;:::-;27344:47;-1:-1:-1;;;;;;27408:22:0;;;27404:482;;27494:10;27447:19;27484:21;;;:9;:21;;;;;;27469:45;;27507:6;27469:14;:45::i;:::-;27447:67;-1:-1:-1;27533:15:0;;27529:346;;27574:8;27569:291;27592:8;;27588:1;:12;;;27569:291;;;27630:49;27651:8;27661:11;27674:4;27630:20;:49::i;:::-;-1:-1:-1;;;;;27713:21:0;;;;;;;:11;:21;;;;;;;;;;27761:22;27757:84;;27812:5;;27757:84;27602:3;;27569:291;;;;27529:346;27404:482;;27950:40;27958:10;27970:11;27983:6;27950:7;:40::i;:::-;28018:12;;:24;;28035:6;28018:24;:16;:24;:::i;:::-;28003:12;:39;28087:10;28077:21;;;;:9;:21;;;;;;:33;;28103:6;28077:33;:25;:33;:::i;:::-;28063:10;28053:21;;;;:9;:21;;;;;:57;;;;28121:12;;:64;;-1:-1:-1;;;;;28121:12:0;;;;28171:4;28178:6;28121:29;:64::i;:::-;28217:10;28200:28;;;;:16;:28;;;;;;28196:112;;28267:10;28250:28;;;;:16;:28;;;;;28281:15;28250:46;;28196:112;28323:26;;;;;;;;28330:10;;28323:26;;;;;;;;;;34187:1;;14835;14871:13;;14855:12;:29;14847:73;;;;;-1:-1:-1;;;14847:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27138:1219;;;:::o;20190:29::-;;;;:::o;22838:131::-;22895:7;22922:39;22931:15;22948:12;;22922:8;:39::i;20751:50::-;;;;;;;;;;;;;:::o;20304:57::-;;;;;;;;;;;;;:::o;17683:79::-;17721:7;17748:6;-1:-1:-1;;;;;17748:6:0;17683:79;:::o;18049:94::-;18089:4;18129:6;;-1:-1:-1;;;;;18129:6:0;18113:12;:10;:12::i;:::-;-1:-1:-1;;;;;18113:22:0;;18106:29;;18049:94;:::o;20810:26::-;;;;:::o;30772:115::-;30817:10;34152:24;34168:7;34152:15;:24::i;:::-;30840:11;:9;:11::i;:::-;30862:17;:15;:17::i;20226:29::-;;;;:::o;21284:28::-;;;;:::o;23068:318::-;23115:7;23139:12;;23155:1;23139:17;23135:77;;;-1:-1:-1;23180:20:0;;23173:27;;23135:77;23238:140;23277:90;23354:12;;23277:72;23344:4;23277:62;23328:10;;23277:46;23308:14;;23277:26;:24;:26::i;:90::-;23238:20;;;:140;:24;:140;:::i;21032:51::-;;;;;;;;;;;;;:::o;24625:129::-;24680:7;24707:39;24730:15;;24707:18;;:22;;:39;;;;:::i;19947:26::-;;;-1:-1:-1;;;;;19947:26:0;;:::o;20931:46::-;;;;;;;;;;;;-1:-1:-1;;;;;20931:46:0;;:::o;20262:35::-;;;;:::o;30895:100::-;30950:10;30940:21;;;;:9;:21;;;;;;30931:31;;:8;:31::i;:::-;30973:14;:12;:14::i;:::-;30895:100::o;20013:31::-;;;;:::o;18789:109::-;17895:9;:7;:9::i;:::-;17887:54;;;;;-1:-1:-1;;;17887:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18862:28;18881:8;18862:18;:28::i;20984:41::-;;;;;;;;;;;;;:::o;20599:37::-;;;;:::o;21319:36::-;;;;:::o;21150:37::-;;;;:::o;2088:184::-;2146:7;2179:1;2174;:6;;2166:49;;;;;-1:-1:-1;;;2166:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2238:5:0;;;2088:184::o;2523:470::-;2581:7;2825:6;2821:47;;-1:-1:-1;2855:1:0;2848:8;;2821:47;2892:5;;;2896:1;2892;:5;:1;2916:5;;;;;:10;2908:56;;;;-1:-1:-1;;;2908:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3461:333;3519:7;3618:1;3614;:5;3606:44;;;;;-1:-1:-1;;;3606:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3661:9;3677:1;3673;:5;;;;;;;3461:333;-1:-1:-1;;;;3461:333:0:o;1632:181::-;1690:7;1722:5;;;1746:6;;;;1738:46;;;;;-1:-1:-1;;;1738:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;32961:519;33045:16;:14;:16::i;:::-;33022:20;:39;33096:17;:15;:17::i;:::-;33072:21;:41;33141:26;:24;:26::i;:::-;33124:14;:43;-1:-1:-1;;;;;33182:21:0;;;33178:295;;33239:15;33246:7;33239:6;:15::i;:::-;-1:-1:-1;;;;;33220:16:0;;;;;;:7;:16;;;;;;;;:34;;;;33303:20;;33269:22;:31;;;;;;:54;33367:23;33228:7;33367:14;:23::i;:::-;-1:-1:-1;;;;;33340:24:0;;;;;;:15;:24;;;;;;;;:50;;;;33440:21;;33405:23;:32;;;;;;:56;32961:519;:::o;33488:561::-;33618:8;;-1:-1:-1;;;;;33595:19:0;;;;;;:9;:19;;;;;;:31;33591:451;;33643:25;33659:8;33643:15;:25::i;:::-;-1:-1:-1;;;;;33716:16:0;;;;;;:6;:16;;;;;;33702:53;;33734:11;33747:7;33702:13;:53::i;:::-;-1:-1:-1;;;;;33683:16:0;;;;;;:6;:16;;;;;:72;33798:11;;33784:48;;33811:11;33824:7;33784:13;:48::i;:::-;33770:11;:62;33591:451;;;-1:-1:-1;;;;;33873:16:0;;;;;;:6;:16;;;;;;:21;33865:58;;;;;-1:-1:-1;;;33865:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33981:26:0;;;;;;:16;:26;;;;;;33967:63;;34009:11;34022:7;33967:13;:63::i;:::-;-1:-1:-1;;;;;33938:26:0;;;;;;:16;:26;;;;;:92;33488:561;;;:::o;28367:516::-;28496:8;;28473:20;:31;:78;;;;;28543:8;;28532:6;28509:20;:29;28508:43;;28473:78;28469:407;;;-1:-1:-1;;;;;28592:15:0;;;;;;:6;:15;;;;;;28577:11;;:30;;28569:75;;;;;-1:-1:-1;;;28569:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28659:24;28675:7;28659:15;:24::i;:::-;-1:-1:-1;;;;;28726:15:0;;;;;;:6;:15;;;;;;;;;;28698:16;:25;;;;;;:43;;;28756:19;;;28818:11;;28831:25;;28804:60;;:13;:60::i;:::-;28790:11;:74;28367:516;;;:::o;10339:176::-;10448:58;;;-1:-1:-1;;;;;10448:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;10448:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;10422:85:0;;10441:5;;10422:18;:85::i;26560:570::-;-1:-1:-1;;;;;26672:18:0;;;26634:7;26672:18;;;:9;:18;;;;;;;;;26721:6;:15;;;;;;26774:11;:20;;;;;;;26634:7;;26672:18;;26774:20;26811:12;;:30;;;;-1:-1:-1;26827:14:0;;26811:30;:64;;;;-1:-1:-1;;;;;;26845:30:0;;;26811:64;26807:280;;;-1:-1:-1;;;;;26896:26:0;;26925:1;26896:26;;;:16;:26;;;;;;:30;;;;:66;;-1:-1:-1;;;;;;26930:21:0;;;;;;;:11;:21;;;;;;;;:32;;;;;26896:66;26892:184;;;-1:-1:-1;;;;;;26983:20:0;;;;;;;:11;:20;;;;;:31;;-1:-1:-1;;;;;;26983:31:0;;;;;;;;;;;26892:184;27106:16;26560:570;-1:-1:-1;;;;;26560:570:0:o;26136:416::-;26258:8;;26237:18;:29;:74;;;;;26303:8;;26292:6;26271:18;:27;26270:41;;26237:74;26233:312;;;26329:24;26345:7;26329:15;:24::i;:::-;-1:-1:-1;;;;;26386:25:0;;;;;;:16;:25;;;;;;;;;;26368:6;:15;;;;;;:43;;;26426:29;;;;26498:11;;26511:15;;26484:49;;26498:11;-1:-1:-1;26484:13:0;:49::i;10523:204::-;10650:68;;;-1:-1:-1;;;;;10650:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;10650:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;10624:95:0;;10643:5;;10624:18;:95::i;:::-;10523:204;;;;:::o;375:106::-;433:7;464:1;460;:5;:13;;472:1;460:13;;;-1:-1:-1;468:1:0;;453:20;-1:-1:-1;375:106:0:o;16461:98::-;16541:10;16461:98;:::o;19004:229::-;-1:-1:-1;;;;;19078:22:0;;19070:73;;;;-1:-1:-1;;;19070:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19180:6;;;19159:38;;-1:-1:-1;;;;;19159:38:0;;;;19180:6;;;19159:38;;;19208:6;:17;;-1:-1:-1;;;;;;19208:17:0;-1:-1:-1;;;;;19208:17:0;;;;;;;;;;19004:229::o;12333:1113::-;12937:27;12945:5;-1:-1:-1;;;;;12937:25:0;;:27::i;:::-;12929:71;;;;;-1:-1:-1;;;12929:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13074:12;13088:23;13123:5;-1:-1:-1;;;;;13115:19:0;13135:4;13115: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;;;13115: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;;13073:67:0;;;;13159:7;13151:52;;;;;-1:-1:-1;;;13151:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13220:17;;:21;13216:223;;13361:10;13350:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13350:30:0;13342:85;;;;-1:-1:-1;;;13342:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9354:420;9720:20;9758:8;;;9354:420::o

Swarm Source

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