Contract 0x861187321F9a40A987deE5148e5c9490Bc1948a1 1

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x5a38dfd41c51f3c12169fb9b93dec568674913c921ee88130174acd97cfecca9Deposit94696022021-10-27 2:46:144 hrs 7 mins ago0xb9f8bde2e1876b2c116056c007be3e96fdeb4eae IN  0x861187321f9a40a987dee5148e5c9490bc1948a10 HT0.000214589252.25
0xb9b06ea1229442f9de5d42400a02124c07ddcdec11b29c28782906c66d5460b6Deposit94442772021-10-26 5:39:561 day 1 hr ago0xcef97d244dcbd4438691e242c590e1be1eb3f1d2 IN  0x861187321f9a40a987dee5148e5c9490bc1948a10 HT0.000222932252.25
0xf06c95067a5fe5ff32010a175079f6c294cc7a5136d6260ef3eddb6d4e68a012Deposit94379422021-10-26 0:23:111 day 6 hrs ago0xb9f8bde2e1876b2c116056c007be3e96fdeb4eae IN  0x861187321f9a40a987dee5148e5c9490bc1948a10 HT0.000214589252.25
0x401175f2adf3e61f3cb9320482ac3908e1072ce0be24f32503af208e45e53c06Deposit94341262021-10-25 21:12:231 day 9 hrs ago0xd4cc78ced0f9a07a613f7f962308edea0984f285 IN  0x861187321f9a40a987dee5148e5c9490bc1948a10 HT0.000214589252.25
0x549824e1e205c1c68280696a8a6c0eaf15e0cf6d367c463835b093e4ee9c18c5Deposit94203412021-10-25 9:43:041 day 21 hrs ago0xd9431b9c57010718b6cd71916efd46844caf8fe5 IN  0x861187321f9a40a987dee5148e5c9490bc1948a10 HT0.00021458925 2.25
0x7df743ed4da2f99f5ef5152bbb9f4028f3ff01537cf93250d4a8026c23a1a691Deposit94084212021-10-24 23:47:042 days 7 hrs ago0xb9f8bde2e1876b2c116056c007be3e96fdeb4eae IN  0x861187321f9a40a987dee5148e5c9490bc1948a10 HT0.000214589252.25
0x0641e9995929e3fb4269e2b9eac4efbf5d6178bf753ecea78d2664cae5080474Deposit93648052021-10-23 11:26:163 days 19 hrs ago0x63456657bc7627f4876cf5b3ecadf51234d00339 IN  0x861187321f9a40a987dee5148e5c9490bc1948a10 HT0.000253064252.25
0x6365b1009c9a022f9fe6538d7e575bfb4f41d610c46d39c98af27c8cf8858f9bWithdraw93397992021-10-22 14:35:584 days 16 hrs ago0x487463ea8fe777579f9fd8bd13867aaffa510874 IN  0x861187321f9a40a987dee5148e5c9490bc1948a10 HT0.00024506552.25
0xb0df7f0a5e9a12d2d299ded1545a47c538af2e4b488a05f121ff8303a1e3dee3Deposit93397902021-10-22 14:35:314 days 16 hrs ago0x487463ea8fe777579f9fd8bd13867aaffa510874 IN  0x861187321f9a40a987dee5148e5c9490bc1948a10 HT0.000214589252.25
0xafb539e79b6104edfdb83fe3310015a446096034ea03bd0497a565ed98973345Deposit93384682021-10-22 13:29:254 days 17 hrs ago0x63456657bc7627f4876cf5b3ecadf51234d00339 IN  0x861187321f9a40a987dee5148e5c9490bc1948a10 HT0.000253064252.25
0x2e22040da1637603298d929b3d21fef7a49c9ff30bbb218bd5f0bf0795a96d54Deposit93295942021-10-22 6:05:435 days 48 mins ago0x9323343d6ff4a66988400c9a62d1c65b297d6437 IN  0x861187321f9a40a987dee5148e5c9490bc1948a10 HT0.000214589252.25
0x6058d2baccf719463786108162d8fb5526f5e1c85d75de227af79c13e8caceceDeposit93214942021-10-21 23:20:425 days 7 hrs ago0xe3a94d97817f26c87bddb1e3718ca3e40b9862d4 IN  0x861187321f9a40a987dee5148e5c9490bc1948a10 HT0.00033380553.5
0x8c34e67655f5697a4c2ab8bb493a69f926485ef69eef0d156aa7ff06d543d612Deposit93195362021-10-21 21:42:485 days 9 hrs ago0xb9f8bde2e1876b2c116056c007be3e96fdeb4eae IN  0x861187321f9a40a987dee5148e5c9490bc1948a10 HT0.000214589252.25
0x3f1eb2392f3d28cc9bb4eaa80638fe1e4ed863f90db111bd17e24fd7033fbaaaDeposit93120552021-10-21 15:28:455 days 15 hrs ago0xdf3f4a4acf6fc69c3946d0e40171fb206b0a8ed2 IN  0x861187321f9a40a987dee5148e5c9490bc1948a10 HT0.000214589252.25
0x53858ccfa0c5395ee9cfe5bd8ef1da9901dc29c9f663ba14d8f3e40a6e57f1ceDeposit93066062021-10-21 10:56:185 days 19 hrs ago0x63456657bc7627f4876cf5b3ecadf51234d00339 IN  0x861187321f9a40a987dee5148e5c9490bc1948a10 HT0.000253064252.25
0x32ca475a59250a47ba6e35cea7384fb4922fd85257d894eef0ffbac20a7a9311Withdraw93006772021-10-21 5:59:516 days 54 mins ago0xd2ae0f9fd7ddc22d96fb6520c1fdca5643065fd1 IN  0x861187321f9a40a987dee5148e5c9490bc1948a10 HT0.00040325763.2
0xa36067275e1fa9d9899f1db17c76004ce16c8a75b07f2f3fd20f5deb79cf7b35Deposit92793942021-10-20 12:15:416 days 18 hrs ago0x63456657bc7627f4876cf5b3ecadf51234d00339 IN  0x861187321f9a40a987dee5148e5c9490bc1948a10 HT0.000253064252.25
0xca0d418f829b955b4c1047fea070877a617f738b9186646a5ac2a48f13686010Deposit92545322021-10-19 15:32:337 days 15 hrs ago0xb9f8bde2e1876b2c116056c007be3e96fdeb4eae IN  0x861187321f9a40a987dee5148e5c9490bc1948a10 HT0.000214589252.25
0xc7ab7bd11b0ae5f52f6fa608e569c6b7becfa8168c5d4f4343ca8b9d3d8fc65aDeposit92474182021-10-19 9:36:507 days 21 hrs ago0x63456657bc7627f4876cf5b3ecadf51234d00339 IN  0x861187321f9a40a987dee5148e5c9490bc1948a10 HT0.000253064252.25
0xd060ede05e0bcde234df2366ea36a905b1252c90537cfe5e8bb7d2ae0408e529Deposit92383592021-10-19 2:03:538 days 4 hrs ago0x838266d7c059019271769074c642e026f4fcf923 IN  0x861187321f9a40a987dee5148e5c9490bc1948a10 HT0.000214589252.25
0x19aab7b951309170e9bd2e9f7506b77e6e4b14baf13ab7598ea033bff603555aDeposit92351402021-10-18 23:22:568 days 7 hrs ago0xba8a1f989debae56ae725ea1f5365fc7bb297ede IN  0x861187321f9a40a987dee5148e5c9490bc1948a10 HT0.000214589252.25
0x1cd8d072615fc95da8c79c3fc3ce571fc8a8f0fa0508bcbf1e35c46ebffcbd02Deposit92133732021-10-18 5:14:289 days 1 hr ago0x63456657bc7627f4876cf5b3ecadf51234d00339 IN  0x861187321f9a40a987dee5148e5c9490bc1948a10 HT0.000253064252.25
0x257522e182519f3a5c45879948aecb06ba59b6ab8f55575b3949528e6a45d6c6Deposit91929432021-10-17 12:12:589 days 18 hrs ago0xd4cc78ced0f9a07a613f7f962308edea0984f285 IN  0x861187321f9a40a987dee5148e5c9490bc1948a10 HT0.000214589252.25
0xc4e4cbd5020184aa34688fbe714235b024139eb5c670e03899e1ef1cd34046a3Deposit91863942021-10-17 6:45:3110 days 8 mins ago0x63456657bc7627f4876cf5b3ecadf51234d00339 IN  0x861187321f9a40a987dee5148e5c9490bc1948a10 HT0.000253064252.25
0xe565c7de66ac7180a28ecad7de24c8d3458752f97f2a75825d204d4fbb610ac8Deposit91863482021-10-17 6:43:1310 days 10 mins ago0x5e1f693da07ce72171b83ad3b50913facdf6c970 IN  0x861187321f9a40a987dee5148e5c9490bc1948a10 HT0.000253064252.25
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Farm

Compiler Version
v0.6.2+commit.bacdbe57

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


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

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

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

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

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

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

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



// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @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) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        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-contracts/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) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        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) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.2;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    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;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


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

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    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, "SafeERC20: decreased allowance below zero");
        _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. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "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");
        }
    }
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256`
 * (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(value)));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(value)));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(value)));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint256(_at(set._inner, index)));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}



// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with 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.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
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 {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @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(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        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 virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

pragma solidity ^0.6.2;
// Farm distributes the ERC20 rewards based on staked LP to each user.
//
// Cloned from https://github.com/SashimiProject/sashimiswap/blob/master/contracts/MasterChef.sol
// Modified by LTO Network to work for non-mintable ERC20.
contract Farm is Ownable {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    // Info of each user.
    struct UserInfo {
        uint256 amount;     // How many LP tokens the user has provided.
        uint256 rewardDebt; // Reward debt. See explanation below.
        //
        // We do some fancy math here. Basically, any point in time, the amount of ERC20s
        // entitled to a user but is pending to be distributed is:
        //
        //   pending reward = (user.amount * pool.accERC20PerShare) - user.rewardDebt
        //
        // Whenever a user deposits or withdraws LP tokens to a pool. Here's what happens:
        //   1. The pool's `accERC20PerShare` (and `lastRewardBlock`) gets updated.
        //   2. User receives the pending reward sent to his/her address.
        //   3. User's `amount` gets updated.
        //   4. User's `rewardDebt` gets updated.
    }

    // Info of each pool.
    struct PoolInfo {
        IERC20 lpToken;             // Address of LP token contract.
        uint256 allocPoint;         // How many allocation points assigned to this pool. ERC20s to distribute per block.
        uint256 lastRewardBlock;    // Last block number that ERC20s distribution occurs.
        uint256 accERC20PerShare;   // Accumulated ERC20s per share, times 1e36.
    }

    // Address of the ERC20 Token contract.
    IERC20 public erc20;
    // The total amount of ERC20 that's paid out as reward.
    uint256 public paidOut = 0;
    // ERC20 tokens rewarded per block.
    uint256 public rewardPerBlock;

    // Info of each pool.
    PoolInfo[] public poolInfo;
    // Info of each user that stakes LP tokens.
    mapping (uint256 => mapping (address => UserInfo)) public userInfo;
    // Total allocation points. Must be the sum of all allocation points in all pools.
    uint256 public totalAllocPoint = 0;

    // The block number when farming starts.
    uint256 public startBlock;
    // The block number when farming ends.
    uint256 public endBlock;

    event Deposit(address indexed user, uint256 indexed pid, uint256 amount);
    event Withdraw(address indexed user, uint256 indexed pid, uint256 amount);
    event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount);

    constructor(IERC20 _erc20, uint256 _rewardPerBlock, uint256 _startBlock) public {
        erc20 = _erc20;
        rewardPerBlock = _rewardPerBlock;
        startBlock = _startBlock;
        endBlock = _startBlock;
    }

    // Number of LP pools
    function poolLength() external view returns (uint256) {
        return poolInfo.length;
    }

    // Fund the farm, increase the end block
    function fund(uint256 _amount) public {
        require(block.number < endBlock, "fund: too late, the farm is closed");

        erc20.safeTransferFrom(address(msg.sender), address(this), _amount);
        endBlock += _amount.div(rewardPerBlock);
    }

    // Add a new lp to the pool. Can only be called by the owner.
    // DO NOT add the same LP token more than once. Rewards will be messed up if you do.
    function add(uint256 _allocPoint, IERC20 _lpToken, bool _withUpdate) public onlyOwner {
        if (_withUpdate) {
            massUpdatePools();
        }
        uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock;
        totalAllocPoint = totalAllocPoint.add(_allocPoint);
        poolInfo.push(PoolInfo({
            lpToken: _lpToken,
            allocPoint: _allocPoint,
            lastRewardBlock: lastRewardBlock,
            accERC20PerShare: 0
        }));
    }

    // Update the given pool's ERC20 allocation point. Can only be called by the owner.
    function set(uint256 _pid, uint256 _allocPoint, bool _withUpdate) public onlyOwner {
        if (_withUpdate) {
            massUpdatePools();
        }
        totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
        poolInfo[_pid].allocPoint = _allocPoint;
    }

    // View function to see deposited LP for a user.
    function deposited(uint256 _pid, address _user) external view returns (uint256) {
        UserInfo storage user = userInfo[_pid][_user];
        return user.amount;
    }

    // View function to see pending ERC20s for a user.
    function pending(uint256 _pid, address _user) external view returns (uint256) {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        uint256 accERC20PerShare = pool.accERC20PerShare;
        uint256 lpSupply = pool.lpToken.balanceOf(address(this));
        uint256 lastBlock = block.number < endBlock ? block.number : endBlock;
        if (lastBlock > pool.lastRewardBlock && block.number > pool.lastRewardBlock && lpSupply != 0) {
        // if (block.number > pool.lastRewardBlock && lpSupply != 0) {
            // uint256 lastBlock = block.number < endBlock ? block.number : endBlock;
            uint256 nrOfBlocks = lastBlock.sub(pool.lastRewardBlock);
            uint256 erc20Reward = nrOfBlocks.mul(rewardPerBlock).mul(pool.allocPoint).div(totalAllocPoint);
            accERC20PerShare = accERC20PerShare.add(erc20Reward.mul(1e36).div(lpSupply));
        }

        return user.amount.mul(accERC20PerShare).div(1e36).sub(user.rewardDebt);
    }

    // View function for total reward the farm has yet to pay out.
    function totalPending() external view returns (uint256) {
        if (block.number <= startBlock) {
            return 0;
        }

        uint256 lastBlock = block.number < endBlock ? block.number : endBlock;
        return rewardPerBlock.mul(lastBlock - startBlock).sub(paidOut);
    }

    // Update reward variables for all pools. Be careful of gas spending!
    function massUpdatePools() public {
        uint256 length = poolInfo.length;
        for (uint256 pid = 0; pid < length; ++pid) {
            updatePool(pid);
        }
    }

    // Update reward variables of the given pool to be up-to-date.
    function updatePool(uint256 _pid) public {
        PoolInfo storage pool = poolInfo[_pid];
        uint256 lastBlock = block.number < endBlock ? block.number : endBlock;

        if (lastBlock <= pool.lastRewardBlock) {
            return;
        }
        uint256 lpSupply = pool.lpToken.balanceOf(address(this));
        if (lpSupply == 0) {
            pool.lastRewardBlock = lastBlock;
            return;
        }

        uint256 nrOfBlocks = lastBlock.sub(pool.lastRewardBlock);
        uint256 erc20Reward = nrOfBlocks.mul(rewardPerBlock).mul(pool.allocPoint).div(totalAllocPoint);

        pool.accERC20PerShare = pool.accERC20PerShare.add(erc20Reward.mul(1e36).div(lpSupply));
        pool.lastRewardBlock = block.number;
    }

    // Deposit LP tokens to Farm for ERC20 allocation.
    function deposit(uint256 _pid, uint256 _amount) public {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        updatePool(_pid);
        if (user.amount > 0) {
            uint256 pendingAmount = user.amount.mul(pool.accERC20PerShare).div(1e36).sub(user.rewardDebt);
            erc20Transfer(msg.sender, pendingAmount);
        }
        pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount);
        user.amount = user.amount.add(_amount);
        user.rewardDebt = user.amount.mul(pool.accERC20PerShare).div(1e36);
        emit Deposit(msg.sender, _pid, _amount);
    }

    // Withdraw LP tokens from Farm.
    function withdraw(uint256 _pid, uint256 _amount) public {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        require(user.amount >= _amount, "withdraw: can't withdraw more than deposit");
        updatePool(_pid);
        uint256 pendingAmount = user.amount.mul(pool.accERC20PerShare).div(1e36).sub(user.rewardDebt);
        erc20Transfer(msg.sender, pendingAmount);
        user.amount = user.amount.sub(_amount);
        user.rewardDebt = user.amount.mul(pool.accERC20PerShare).div(1e36);
        pool.lpToken.safeTransfer(address(msg.sender), _amount);
        emit Withdraw(msg.sender, _pid, _amount);
    }

    // Withdraw without caring about rewards. EMERGENCY ONLY.
    function emergencyWithdraw(uint256 _pid) public {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        pool.lpToken.safeTransfer(address(msg.sender), user.amount);
        emit EmergencyWithdraw(msg.sender, _pid, user.amount);
        user.amount = 0;
        user.rewardDebt = 0;
    }

    // Transfer ERC20 and update the required ERC20 to payout all rewards
    function erc20Transfer(address _to, uint256 _amount) internal {
        erc20.transfer(_to, _amount);
        paidOut += _amount;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IERC20","name":"_erc20","type":"address"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"deposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"erc20","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"fund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paidOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pending","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accERC20PerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPending","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600255600060065534801561001a57600080fd5b5060405161254d38038061254d8339818101604052606081101561003d57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190505050600061007261016e60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35082600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816003819055508060078190555080600881905550505050610176565b600033905090565b6123c8806101856000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c8063630b5ba1116100c357806393f1a40b1161007c57806393f1a40b14610481578063a2383106146104ea578063ca1d209d1461054c578063e2bbb1581461057a578063e4c75c27146105b2578063f2fde38b146106145761014d565b8063630b5ba11461037757806364482f7914610381578063715018a6146103c5578063785e9e86146103cf5780638ae39cac146104195780638da5cb5b146104375761014d565b80633f90916a116101155780633f90916a14610289578063441a3e70146102a757806348cd4cb1146102df57806351eb05a6146102fd5780635312ea8e1461032b5780635c76ca2d146103595761014d565b8063081e3eda14610152578063083c6323146101705780631526fe271461018e57806317caf6f1146102115780631eaaa0451461022f575b600080fd5b61015a610658565b6040518082815260200191505060405180910390f35b610178610665565b6040518082815260200191505060405180910390f35b6101ba600480360360208110156101a457600080fd5b810190808035906020019092919050505061066b565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390f35b6102196106c8565b6040518082815260200191505060405180910390f35b6102876004803603606081101561024557600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506106ce565b005b6102916108a8565b6040518082815260200191505060405180910390f35b6102dd600480360360408110156102bd57600080fd5b810190808035906020019092919080359060200190929190505050610907565b005b6102e7610b48565b6040518082815260200191505060405180910390f35b6103296004803603602081101561031357600080fd5b8101908080359060200190929190505050610b4e565b005b6103576004803603602081101561034157600080fd5b8101908080359060200190929190505050610d52565b005b610361610e84565b6040518082815260200191505060405180910390f35b61037f610e8a565b005b6103c36004803603606081101561039757600080fd5b810190808035906020019092919080359060200190929190803515159060200190929190505050610eba565b005b6103cd611005565b005b6103d761118d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104216111b3565b6040518082815260200191505060405180910390f35b61043f6111b9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104cd6004803603604081101561049757600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506111e2565b604051808381526020018281526020019250505060405180910390f35b6105366004803603604081101561050057600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611213565b6040518082815260200191505060405180910390f35b6105786004803603602081101561056257600080fd5b8101908080359060200190929190505050611276565b005b6105b06004803603604081101561059057600080fd5b810190808035906020019092919080359060200190929190505050611346565b005b6105fe600480360360408110156105c857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061153a565b6040518082815260200191505060405180910390f35b6106566004803603602081101561062a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506117da565b005b6000600480549050905090565b60085481565b6004818154811061067857fe5b90600052602060002090600402016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b60065481565b6106d66119e7565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610797576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80156107a6576107a5610e8a565b5b600060075443116107b9576007546107bb565b435b90506107d2846006546119ef90919063ffffffff16565b600681905550600460405180608001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018381526020016000815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002015560608201518160030155505050505050565b600060075443116108bc5760009050610904565b600060085443106108cf576008546108d1565b435b90506109006002546108f26007548403600354611a7790919063ffffffff16565b611afd90919063ffffffff16565b9150505b90565b60006004838154811061091657fe5b9060005260206000209060040201905060006005600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905082816000015410156109d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061233f602a913960400191505060405180910390fd5b6109e084610b4e565b6000610a348260010154610a266ec097ce7bc90715b34b9f1000000000610a1887600301548760000154611a7790919063ffffffff16565b611b4790919063ffffffff16565b611afd90919063ffffffff16565b9050610a403382611b91565b610a57848360000154611afd90919063ffffffff16565b8260000181905550610a9b6ec097ce7bc90715b34b9f1000000000610a8d85600301548560000154611a7790919063ffffffff16565b611b4790919063ffffffff16565b8260010181905550610af233858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611c8a9092919063ffffffff16565b843373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568866040518082815260200191505060405180910390a35050505050565b60075481565b600060048281548110610b5d57fe5b9060005260206000209060040201905060006008544310610b8057600854610b82565b435b905081600201548111610b96575050610d4f565b60008260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610c3957600080fd5b505afa158015610c4d573d6000803e3d6000fd5b505050506040513d6020811015610c6357600080fd5b810190808051906020019092919050505090506000811415610c9057818360020181905550505050610d4f565b6000610ca9846002015484611afd90919063ffffffff16565b90506000610cec600654610cde8760010154610cd060035487611a7790919063ffffffff16565b611a7790919063ffffffff16565b611b4790919063ffffffff16565b9050610d38610d2584610d176ec097ce7bc90715b34b9f100000000085611a7790919063ffffffff16565b611b4790919063ffffffff16565b86600301546119ef90919063ffffffff16565b856003018190555043856002018190555050505050505b50565b600060048281548110610d6157fe5b9060005260206000209060040201905060006005600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050610e183382600001548460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611c8a9092919063ffffffff16565b823373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae059583600001546040518082815260200191505060405180910390a36000816000018190555060008160010181905550505050565b60025481565b6000600480549050905060008090505b81811015610eb657610eab81610b4e565b806001019050610e9a565b5050565b610ec26119e7565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f83576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8015610f9257610f91610e8a565b5b610fd782610fc960048681548110610fa657fe5b906000526020600020906004020160010154600654611afd90919063ffffffff16565b6119ef90919063ffffffff16565b6006819055508160048481548110610feb57fe5b906000526020600020906004020160010181905550505050565b61100d6119e7565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6005602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b6000806005600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015491505092915050565b60085443106112d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061231d6022913960400191505060405180910390fd5b61131f333083600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611d42909392919063ffffffff16565b61133460035482611b4790919063ffffffff16565b60086000828254019250508190555050565b60006004838154811061135557fe5b9060005260206000209060040201905060006005600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506113c284610b4e565b60008160000154111561143157600061142382600101546114156ec097ce7bc90715b34b9f100000000061140787600301548760000154611a7790919063ffffffff16565b611b4790919063ffffffff16565b611afd90919063ffffffff16565b905061142f3382611b91565b505b6114823330858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611d42909392919063ffffffff16565b6114998382600001546119ef90919063ffffffff16565b81600001819055506114dd6ec097ce7bc90715b34b9f10000000006114cf84600301548460000154611a7790919063ffffffff16565b611b4790919063ffffffff16565b8160010181905550833373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040518082815260200191505060405180910390a350505050565b6000806004848154811061154a57fe5b9060005260206000209060040201905060006005600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260030154905060008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561165a57600080fd5b505afa15801561166e573d6000803e3d6000fd5b505050506040513d602081101561168457600080fd5b81019080805190602001909291905050509050600060085443106116aa576008546116ac565b435b90508460020154811180156116c45750846002015443115b80156116d1575060008214155b1561177f5760006116ef866002015483611afd90919063ffffffff16565b90506000611732600654611724896001015461171660035487611a7790919063ffffffff16565b611a7790919063ffffffff16565b611b4790919063ffffffff16565b905061177a61176b8561175d6ec097ce7bc90715b34b9f100000000085611a7790919063ffffffff16565b611b4790919063ffffffff16565b866119ef90919063ffffffff16565b945050505b6117cd84600101546117bf6ec097ce7bc90715b34b9f10000000006117b1878960000154611a7790919063ffffffff16565b611b4790919063ffffffff16565b611afd90919063ffffffff16565b9550505050505092915050565b6117e26119e7565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118a3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611929576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806122d66026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600080828401905083811015611a6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600080831415611a8a5760009050611af7565b6000828402905082848281611a9b57fe5b0414611af2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806122fc6021913960400191505060405180910390fd5b809150505b92915050565b6000611b3f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611e2f565b905092915050565b6000611b8983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611eef565b905092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611c3a57600080fd5b505af1158015611c4e573d6000803e3d6000fd5b505050506040513d6020811015611c6457600080fd5b810190808051906020019092919050505050806002600082825401925050819055505050565b611d3d8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611fb5565b505050565b611e29846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611fb5565b50505050565b6000838311158290611edc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611ea1578082015181840152602081019050611e86565b50505050905090810190601f168015611ece5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083118290611f9b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611f60578082015181840152602081019050611f45565b50505050905090810190601f168015611f8d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611fa757fe5b049050809150509392505050565b6060612017826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166120a49092919063ffffffff16565b905060008151111561209f5780806020019051602081101561203857600080fd5b810190808051906020019092919050505061209e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612369602a913960400191505060405180910390fd5b5b505050565b60606120b384846000856120bc565b90509392505050565b60606120c7856122c2565b612139576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106121895780518252602082019150602081019050602083039250612166565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146121eb576040519150601f19603f3d011682016040523d82523d6000602084013e6121f0565b606091505b509150915081156122055780925050506122ba565b6000815111156122185780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561227f578082015181840152602081019050612264565b50505050905090810190601f1680156122ac5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b90506000811191505091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7766756e643a20746f6f206c6174652c20746865206661726d20697320636c6f73656477697468647261773a2063616e2774207769746864726177206d6f7265207468616e206465706f7369745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220231b1725c03fdce8153b752f712b7ce8ce31f394d710efaf662b596f89e7cf1664736f6c63430006020033000000000000000000000000526fd564b1e04d407a5c90fbe29e8eb28557bf57000000000000000000000000000000000000000000000001e5b8fa8fe2ac0000000000000000000000000000000000000000000000000000000000000051d2bf

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

000000000000000000000000526fd564b1e04d407a5c90fbe29e8eb28557bf57000000000000000000000000000000000000000000000001e5b8fa8fe2ac0000000000000000000000000000000000000000000000000000000000000051d2bf

-----Decoded View---------------
Arg [0] : _erc20 (address): 0x526fd564b1e04d407a5c90fbe29e8eb28557bf57
Arg [1] : _rewardPerBlock (uint256): 35000000000000000000
Arg [2] : _startBlock (uint256): 5362367

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000526fd564b1e04d407a5c90fbe29e8eb28557bf57
Arg [1] : 000000000000000000000000000000000000000000000001e5b8fa8fe2ac0000
Arg [2] : 000000000000000000000000000000000000000000000000000000000051d2bf


Deployed ByteCode Sourcemap

29319:8972:0:-:0;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29319:8972:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31896:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31355:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30947:26;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30947:26:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31190:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32467:514;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32467:514:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34784:296;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36953:687;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36953:687:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31279:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35419:757;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35419:757:0;;;;;;;;;;;;;;;;;:::i;:::-;;37711:356;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37711:356:0;;;;;;;;;;;;;;;;;:::i;:::-;;30808:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35163:180;;;:::i;:::-;;33078:304;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33078:304:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28505:148;;;:::i;:::-;;30721:19;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;30882:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27863:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31029:66;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31029:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;33444:173;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33444:173:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32045:257;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32045:257:0;;;;;;;;;;;;;;;;;:::i;:::-;;36240:667;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36240:667:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33681:1027;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33681:1027:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28808:244;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28808:244:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;31896:95;31941:7;31968:8;:15;;;;31961:22;;31896:95;:::o;31355:23::-;;;;:::o;30947:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31190:34::-;;;;:::o;32467:514::-;28085:12;:10;:12::i;:::-;28075:22;;:6;;;;;;;;;;;:22;;;28067:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32568:11:::1;32564:61;;;32596:17;:15;:17::i;:::-;32564:61;32635:23;32676:10;;32661:12;:25;:53;;32704:10;;32661:53;;;32689:12;32661:53;32635:79;;32743:32;32763:11;32743:15;;:19;;:32;;;;:::i;:::-;32725:15;:50;;;;32786:8;32800:172;;;;;;;;32833:8;32800:172;;;;;;32868:11;32800:172;;;;32911:15;32800:172;;;;32959:1;32800:172;;::::0;32786:187:::1;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;32786:187:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28145:1;32467:514:::0;;;:::o;34784:296::-;34831:7;34871:10;;34855:12;:26;34851:67;;34905:1;34898:8;;;;34851:67;34930:17;34965:8;;34950:12;:23;:49;;34991:8;;34950:49;;;34976:12;34950:49;34930:69;;35017:55;35064:7;;35017:42;35048:10;;35036:9;:22;35017:14;;:18;;:42;;;;:::i;:::-;:46;;:55;;;;:::i;:::-;35010:62;;;34784:296;;:::o;36953:687::-;37020:21;37044:8;37053:4;37044:14;;;;;;;;;;;;;;;;;;37020:38;;37069:21;37093:8;:14;37102:4;37093:14;;;;;;;;;;;:26;37108:10;37093:26;;;;;;;;;;;;;;;37069:50;;37153:7;37138:4;:11;;;:22;;37130:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37218:16;37229:4;37218:10;:16::i;:::-;37245:21;37269:69;37322:4;:15;;;37269:48;37312:4;37269:38;37285:4;:21;;;37269:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;:52;;:69;;;;:::i;:::-;37245:93;;37349:40;37363:10;37375:13;37349;:40::i;:::-;37414:24;37430:7;37414:4;:11;;;:15;;:24;;;;:::i;:::-;37400:4;:11;;:38;;;;37467:48;37510:4;37467:38;37483:4;:21;;;37467:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;37449:4;:15;;:66;;;;37526:55;37560:10;37573:7;37526:4;:12;;;;;;;;;;;;:25;;;;:55;;;;;:::i;:::-;37618:4;37606:10;37597:35;;;37624:7;37597:35;;;;;;;;;;;;;;;;;;36953:687;;;;;:::o;31279:25::-;;;;:::o;35419:757::-;35471:21;35495:8;35504:4;35495:14;;;;;;;;;;;;;;;;;;35471:38;;35520:17;35555:8;;35540:12;:23;:49;;35581:8;;35540:49;;;35566:12;35540:49;35520:69;;35619:4;:20;;;35606:9;:33;35602:72;;35656:7;;;;35602:72;35684:16;35703:4;:12;;;;;;;;;;;;:22;;;35734:4;35703:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35703:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35703:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35703:37:0;;;;;;;;;;;;;;;;35684:56;;35767:1;35755:8;:13;35751:99;;;35808:9;35785:4;:20;;:32;;;;35832:7;;;;;35751:99;35862:18;35883:35;35897:4;:20;;;35883:9;:13;;:35;;;;:::i;:::-;35862:56;;35929:19;35951:72;36007:15;;35951:51;35986:4;:15;;;35951:30;35966:14;;35951:10;:14;;:30;;;;:::i;:::-;:34;;:51;;;;:::i;:::-;:55;;:72;;;;:::i;:::-;35929:94;;36060:62;36086:35;36112:8;36086:21;36102:4;36086:11;:15;;:21;;;;:::i;:::-;:25;;:35;;;;:::i;:::-;36060:4;:21;;;:25;;:62;;;;:::i;:::-;36036:4;:21;;:86;;;;36156:12;36133:4;:20;;:35;;;;35419:757;;;;;;;:::o;37711:356::-;37770:21;37794:8;37803:4;37794:14;;;;;;;;;;;;;;;;;;37770:38;;37819:21;37843:8;:14;37852:4;37843:14;;;;;;;;;;;:26;37858:10;37843:26;;;;;;;;;;;;;;;37819:50;;37880:59;37914:10;37927:4;:11;;;37880:4;:12;;;;;;;;;;;;:25;;;;:59;;;;;:::i;:::-;37985:4;37973:10;37955:48;;;37991:4;:11;;;37955:48;;;;;;;;;;;;;;;;;;38028:1;38014:4;:11;;:15;;;;38058:1;38040:4;:15;;:19;;;;37711:356;;;:::o;30808:26::-;;;;:::o;35163:180::-;35208:14;35225:8;:15;;;;35208:32;;35256:11;35270:1;35256:15;;35251:85;35279:6;35273:3;:12;35251:85;;;35309:15;35320:3;35309:10;:15::i;:::-;35287:5;;;;;35251:85;;;;35163:180;:::o;33078:304::-;28085:12;:10;:12::i;:::-;28075:22;;:6;;;;;;;;;;;:22;;;28067:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33176:11:::1;33172:61;;;33204:17;:15;:17::i;:::-;33172:61;33261:63;33312:11;33261:46;33281:8;33290:4;33281:14;;;;;;;;;;;;;;;;;;:25;;;33261:15;;:19;;:46;;;;:::i;:::-;:50;;:63;;;;:::i;:::-;33243:15;:81;;;;33363:11;33335:8;33344:4;33335:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;33078:304:::0;;;:::o;28505:148::-;28085:12;:10;:12::i;:::-;28075:22;;:6;;;;;;;;;;;:22;;;28067:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28612:1:::1;28575:40;;28596:6;::::0;::::1;;;;;;;;;28575:40;;;;;;;;;;;;28643:1;28626:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;28505:148::o:0;30721:19::-;;;;;;;;;;;;;:::o;30882:29::-;;;;:::o;27863:79::-;27901:7;27928:6;;;;;;;;;;;27921:13;;27863:79;:::o;31029:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33444:173::-;33515:7;33535:21;33559:8;:14;33568:4;33559:14;;;;;;;;;;;:21;33574:5;33559:21;;;;;;;;;;;;;;;33535:45;;33598:4;:11;;;33591:18;;;33444:173;;;;:::o;32045:257::-;32117:8;;32102:12;:23;32094:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32177:67;32208:10;32229:4;32236:7;32177:5;;;;;;;;;;;:22;;;;:67;;;;;;:::i;:::-;32267:27;32279:14;;32267:7;:11;;:27;;;;:::i;:::-;32255:8;;:39;;;;;;;;;;;32045:257;:::o;36240:667::-;36306:21;36330:8;36339:4;36330:14;;;;;;;;;;;;;;;;;;36306:38;;36355:21;36379:8;:14;36388:4;36379:14;;;;;;;;;;;:26;36394:10;36379:26;;;;;;;;;;;;;;;36355:50;;36416:16;36427:4;36416:10;:16::i;:::-;36461:1;36447:4;:11;;;:15;36443:196;;;36479:21;36503:69;36556:4;:15;;;36503:48;36546:4;36503:38;36519:4;:21;;;36503:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;:52;;:69;;;;:::i;:::-;36479:93;;36587:40;36601:10;36613:13;36587;:40::i;:::-;36443:196;;36649:74;36687:10;36708:4;36715:7;36649:4;:12;;;;;;;;;;;;:29;;;;:74;;;;;;:::i;:::-;36748:24;36764:7;36748:4;:11;;;:15;;:24;;;;:::i;:::-;36734:4;:11;;:38;;;;36801:48;36844:4;36801:38;36817:4;:21;;;36801:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;36783:4;:15;;:66;;;;36885:4;36873:10;36865:34;;;36891:7;36865:34;;;;;;;;;;;;;;;;;;36240:667;;;;:::o;33681:1027::-;33750:7;33770:21;33794:8;33803:4;33794:14;;;;;;;;;;;;;;;;;;33770:38;;33819:21;33843:8;:14;33852:4;33843:14;;;;;;;;;;;:21;33858:5;33843:21;;;;;;;;;;;;;;;33819:45;;33875:24;33902:4;:21;;;33875:48;;33934:16;33953:4;:12;;;;;;;;;;;;:22;;;33984:4;33953:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33953:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33953:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33953:37:0;;;;;;;;;;;;;;;;33934:56;;34001:17;34036:8;;34021:12;:23;:49;;34062:8;;34021:49;;;34047:12;34021:49;34001:69;;34097:4;:20;;;34085:9;:32;:71;;;;;34136:4;:20;;;34121:12;:35;34085:71;:88;;;;;34172:1;34160:8;:13;;34085:88;34081:536;;;34349:18;34370:35;34384:4;:20;;;34370:9;:13;;:35;;;;:::i;:::-;34349:56;;34420:19;34442:72;34498:15;;34442:51;34477:4;:15;;;34442:30;34457:14;;34442:10;:14;;:30;;;;:::i;:::-;:34;;:51;;;;:::i;:::-;:55;;:72;;;;:::i;:::-;34420:94;;34548:57;34569:35;34595:8;34569:21;34585:4;34569:11;:15;;:21;;;;:::i;:::-;:25;;:35;;;;:::i;:::-;34548:16;:20;;:57;;;;:::i;:::-;34529:76;;34081:536;;;34636:64;34684:4;:15;;;34636:43;34674:4;34636:33;34652:16;34636:4;:11;;;:15;;:33;;;;:::i;:::-;:37;;:43;;;;:::i;:::-;:47;;:64;;;;:::i;:::-;34629:71;;;;;;;33681:1027;;;;:::o;28808:244::-;28085:12;:10;:12::i;:::-;28075:22;;:6;;;;;;;;;;;:22;;;28067:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28917:1:::1;28897:22;;:8;:22;;;;28889:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29007:8;28978:38;;28999:6;::::0;::::1;;;;;;;;;28978:38;;;;;;;;;;;;29036:8;29027:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;28808:244:::0;:::o;26439:106::-;26492:15;26527:10;26520:17;;26439:106;:::o;3680:181::-;3738:7;3758:9;3774:1;3770;:5;3758:17;;3799:1;3794;:6;;3786:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3852:1;3845:8;;;3680:181;;;;:::o;5034:471::-;5092:7;5342:1;5337;:6;5333:47;;;5367:1;5360:8;;;;5333:47;5392:9;5408:1;5404;:5;5392:17;;5437:1;5432;5428;:5;;;;;;:10;5420:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5496:1;5489:8;;;5034:471;;;;;:::o;4144:136::-;4202:7;4229:43;4233:1;4236;4229:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4222:50;;4144:136;;;;:::o;5981:132::-;6039:7;6066:39;6070:1;6073;6066:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;6059:46;;5981:132;;;;:::o;38150:138::-;38223:5;;;;;;;;;;;:14;;;38238:3;38243:7;38223:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38223:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38223:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38223:28:0;;;;;;;;;;;;;;;;;38273:7;38262;;:18;;;;;;;;;;;38150:138;;:::o;14725:177::-;14808:86;14828:5;14858:23;;;14883:2;14887:5;14835:58;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;14835:58:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;14835:58:0;14808:19;:86::i;:::-;14725:177;;;:::o;14910:205::-;15011:96;15031:5;15061:27;;;15090:4;15096:2;15100:5;15038:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;15038:68:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;15038:68:0;15011:19;:96::i;:::-;14910:205;;;;:::o;4583:192::-;4669:7;4702:1;4697;:6;;4705:12;4689:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;4689:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4729:9;4745:1;4741;:5;4729:17;;4766:1;4759:8;;;4583:192;;;;;:::o;6609:278::-;6695:7;6727:1;6723;:5;6730:12;6715:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;6715:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6754:9;6770:1;6766;:5;;;;;;6754:17;;6878:1;6871:8;;;6609:278;;;;;:::o;17030:761::-;17454:23;17480:69;17508:4;17480:69;;;;;;;;;;;;;;;;;17488:5;17480:27;;;;:69;;;;;:::i;:::-;17454:95;;17584:1;17564:10;:17;:21;17560:224;;;17706:10;17695:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17695:30:0;;;;;;;;;;;;;;;;17687:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17560:224;17030:761;;;:::o;11801:196::-;11904:12;11936:53;11959:6;11967:4;11973:1;11976:12;11936:22;:53::i;:::-;11929:60;;11801:196;;;;;:::o;13178:979::-;13308:12;13341:18;13352:6;13341:10;:18::i;:::-;13333:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13467:12;13481:23;13508:6;:11;;13528:8;13539:4;13508:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;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;;;13508:36:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;13466:78:0;;;;13559:7;13555:595;;;13590:10;13583:17;;;;;;13555:595;13724:1;13704:10;:17;:21;13700:439;;;13967:10;13961:17;14028:15;14015:10;14011:2;14007:19;14000:44;13915:148;14110:12;14103:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;14103:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13178:979;;;;;;;:::o;8883:422::-;8943:4;9151:12;9262:7;9250:20;9242:28;;9296:1;9289:4;:8;9282:15;;;8883:422;;;:::o

Swarm Source

ipfs://231b1725c03fdce8153b752f712b7ce8ce31f394d710efaf662b596f89e7cf16
Block Transaction Gas Used Reward
Age Block Fee Address Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading