Contract 0x15364310bd305fb3ea197d8d13da116ad478331b

Txn Hash
Block
From
To
Value [Txn Fee]
0x58e4035d265455bdc67e3068ce743ffd47b32731c5dc290540f59f9085aa3cc956248502021-06-15 14:44:373 days 3 hrs ago0x53f74cd948d70abdef9d8c0d723d25691e6ee4e0 IN  0x15364310bd305fb3ea197d8d13da116ad478331b0 HT0.000051357
0xdf87db64694e6ad5b6547fab81d6665c3f8bb4b606bc8070e899d8cb42309f1e56248042021-06-15 14:42:193 days 3 hrs ago0xadaec6995a2b22a6817731523fd4ec8253fa4501 IN  0x15364310bd305fb3ea197d8d13da116ad478331b0 HT0.000187046
0x395e4fd1b65f0c0477eb11407b0d58d11f6491ddca7048282156cca1a4d511e556247502021-06-15 14:39:373 days 3 hrs ago0x53f74cd948d70abdef9d8c0d723d25691e6ee4e0 IN  0x15364310bd305fb3ea197d8d13da116ad478331b0 HT0.000021333
0x36334f56a9476785c21025876e3ceb3b75c7f0dfe1a5e60f4c3d4de3127906e055968012021-06-14 15:22:104 days 3 hrs ago0x412bdfc13a4ed4075f938161e650364d4e93ba95 IN  0x15364310bd305fb3ea197d8d13da116ad478331b0 HT0.000063232
0x7e3099fc80eaa04d6fd082097efb7c85e9fd4cf6c21b628bcb27b4127e65c91b55940752021-06-14 13:05:524 days 5 hrs ago0x412bdfc13a4ed4075f938161e650364d4e93ba95 IN  0x15364310bd305fb3ea197d8d13da116ad478331b0 HT0.000063232
0x0e6f6ee27b96d62afda4b2c04df2f3bf995bf414858ffbd689f8ea4a705ddbfd55914452021-06-14 10:54:224 days 7 hrs ago0x412bdfc13a4ed4075f938161e650364d4e93ba95 IN  0x15364310bd305fb3ea197d8d13da116ad478331b0 HT0.000063232
0xb9992cefe4e78879d2fe3f796f140858318b9efdfce017b1d9836fbcfae3e18655913752021-06-14 10:50:524 days 7 hrs ago0xa9a66ee641ba224d9dc606c96bc1269b6203f260 IN  0x15364310bd305fb3ea197d8d13da116ad478331b0 HT0.000063232
0x87b83104346d317edb45474fe08ad79f47cdd8d54a0d1410c5cc9f42f1a7a33b55894272021-06-14 9:13:274 days 9 hrs ago0xaf458e4e6c770d783136bfb8aaeabf0f4e51aad6 IN  0x15364310bd305fb3ea197d8d13da116ad478331b0 HT0.000063232
0xcc851484ef358905a0a4c6a486bb35cfccd37057cbdf7531f02544f9c9cff7ae55881232021-06-14 8:08:154 days 10 hrs ago0xa9a66ee641ba224d9dc606c96bc1269b6203f260 IN  0x15364310bd305fb3ea197d8d13da116ad478331b0 HT0.000063232
0x41e03f9a9b8bf72234513e4158f01841a49fa22d3c6861799241b85c32b392a155870212021-06-14 7:13:094 days 11 hrs ago0xa9a66ee641ba224d9dc606c96bc1269b6203f260 IN  0x15364310bd305fb3ea197d8d13da116ad478331b0 HT0.000063232
0x95be4a00b6b48dea37e95d5ae7556671c8eca7a50ab6fd612c74992331fcee6555864762021-06-14 6:45:544 days 11 hrs ago0xa9a66ee641ba224d9dc606c96bc1269b6203f260 IN  0x15364310bd305fb3ea197d8d13da116ad478331b0 HT0.000063232
0x5cc50d173033e5db65de141cca10f6deab9730aef6d337a19ccbb7053d69808455860432021-06-14 6:24:154 days 12 hrs ago0x592ad554210d694fbafc01748889df1ced493356 IN  0x15364310bd305fb3ea197d8d13da116ad478331b0 HT0.00137782528
0xc4a9c04107ea60936459b65581f9a7b740f5c2e2775849790770754de7b19a3455860312021-06-14 6:23:394 days 12 hrs ago0x592ad554210d694fbafc01748889df1ced493356 IN  0x15364310bd305fb3ea197d8d13da116ad478331b0 HT0.00106482688
0x2efad55918278fb1da6f353589818c1607f1be7e30a87d431d1e474ff211ed3755860192021-06-14 6:23:034 days 12 hrs ago0x592ad554210d694fbafc01748889df1ced493356 IN  0x15364310bd305fb3ea197d8d13da116ad478331b0 HT0.0011898004
0x3f4b3c82e455188c31a46a5c514a89d912cfd1f513d3eb757973fcaf3f95493655857942021-06-14 6:11:484 days 12 hrs ago0x5905753fc1e3c0376335841f636d761bf73fe397 IN  0x15364310bd305fb3ea197d8d13da116ad478331b0 HT0.000063232
0xb1e2ef48b997ba051234dc874d6f589b1dfd316e710b9deb85ae9515451ced1a55856992021-06-14 6:07:024 days 12 hrs ago0x1bbbd7abdc6f8d29ad2ba606b360abcea3550614 IN  0x15364310bd305fb3ea197d8d13da116ad478331b0 HT0.000063232
0x0906fe051e989764f577a6713efb508df45c6fb1844f1e16c3afbc3d4ebaaf5a55854632021-06-14 5:55:144 days 12 hrs ago0x1bbbd7abdc6f8d29ad2ba606b360abcea3550614 IN  0x15364310bd305fb3ea197d8d13da116ad478331b0 HT0.000063232
0xc4e7f474b8617d813f74001df37a55a7ecba8ba1d2ad73b2b2f85b1b5f42f36c55850012021-06-14 5:32:084 days 13 hrs ago0x1bbbd7abdc6f8d29ad2ba606b360abcea3550614 IN  0x15364310bd305fb3ea197d8d13da116ad478331b0 HT0.000063232
0xd0e631d411b05c119f31255174efb18dab58456975eec0373cef77c3e9d7bc1155848042021-06-14 5:22:174 days 13 hrs ago0x1bbbd7abdc6f8d29ad2ba606b360abcea3550614 IN  0x15364310bd305fb3ea197d8d13da116ad478331b0 HT0.000063232
0xda0da2a88013aabd89f4a2dd73d3fade46ca18e793c5ae1a8aac9328784cad7d55846592021-06-14 5:15:024 days 13 hrs ago0x33be5446a37114e02f57acf7da171060a85aac18 IN  0x15364310bd305fb3ea197d8d13da116ad478331b0 HT0.0001011712
0x36a39242ce9db01b82ad135d751af2f67754edbcdd3da2df5b60f6c90c2fa8de55845382021-06-14 5:08:594 days 13 hrs ago0x1bbbd7abdc6f8d29ad2ba606b360abcea3550614 IN  0x15364310bd305fb3ea197d8d13da116ad478331b0 HT0.000063232
0x7c6039999a87df8107d6f7908b785b9da99b9f52d3dce606816c88142f2aa19d55845322021-06-14 5:08:414 days 13 hrs ago0x1bbbd7abdc6f8d29ad2ba606b360abcea3550614 IN  0x15364310bd305fb3ea197d8d13da116ad478331b0 HT0.000063232
0x97cc2cad4f28efb0f0bb233245dab20db51fc8f3e8ece09b89c8b6d14fc7cd4a55813922021-06-14 2:31:414 days 16 hrs ago0x9bff75aa21f05da9977cd9cc286869d6ef132efd IN  0x15364310bd305fb3ea197d8d13da116ad478331b0 HT0.000063232
0x602c058f9732d441f7ec1f2c89e823baeb075cb28c14989787f0e4fb00a0293f55811202021-06-14 2:18:054 days 16 hrs ago0xd32f6c0ddf6dfb3b05696452085d54556a584b82 IN  0x15364310bd305fb3ea197d8d13da116ad478331b0 HT0.000063232
0x56fb180ad1f609248735661995b77cd6cb6062f2ae59adcce0c9f4e0a2e3a93255806392021-06-14 1:54:024 days 16 hrs ago0x23fc9220dee9e23948f6b4484707555c7ccb90ee IN  0x15364310bd305fb3ea197d8d13da116ad478331b0 HT0.000063232
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MasterChef

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

pragma solidity 0.6.12;




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










/**
 * @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, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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 (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

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

    /**
     * @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) {
        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, reverting 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) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting 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 Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * 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);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * 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);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * 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;
    }
}




/**
 * @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 on 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");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        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");
        }
    }
}




/**
 * @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.3.0, sets of type `bytes32` (`Bytes32Set`), `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];
    }

    // Bytes32Set

    struct Bytes32Set {
        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(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, 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(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

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

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set 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(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, 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(uint160(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(uint160(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(uint160(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(uint160(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));
    }
}






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

/**
 * @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.
 */
abstract 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 virtual 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;
    }
}


interface IMigratorChef {

    // Take the current LP token address and return the new LP token address.
    // Migrator should have full access to the caller's LP token.
    // Return the new LP token address.
    //
    // XXX Migrator must have allowance access to UniswapV2 LP tokens.
  
    // else something bad will happen. Traditional UniswapV2 does not
    // do that so be careful!
    function migrate(IERC20 token) external returns (IERC20);
}





interface LbToken {
    /**
     * @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);
}





//
// Note that it's ownable and the owner wields tremendous power. The ownership
// will be transferred to a governance smart contract once LB is sufficiently
// distributed and the community can show to govern itself.
//
// Have fun reading it. Hopefully it's bug-free. God bless.
contract MasterChef is Ownable {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;
    // Info of each user.
    struct UserInfo {
		uint256 id;
        uint256 amount; // How many LP tokens the user has provided.
        uint256 rewardDebt; // Reward debt. See explanation below.
        uint256 startBlock;

      


        // entitled to a user but is pending to be distributed is:
        //
        //   pending reward = (user.amount * pool.accLbPerShare) - user.rewardDebt
        //
        // Whenever a user deposits or withdraws LP tokens to a pool. Here's what happens:
        //   1. The pool's `accLbPerShare` (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.
    }
	
	
	uint256 public lastId = 0;
	uint256 public totalDeposit;
	uint256 public totalUser;
	
	
    // Info of each pool.
    struct PoolInfo {
        IERC20 lpToken; // Address of LP token contract.
        uint256 allocPoint; // How many allocation points assigned to this pool. 
        uint256 lastRewardBlock; 
        uint256 accLbPerShare; 
        uint256 totalDeposit;
    }
    // The LB TOKEN!
    LbToken public lb;
    // Dev address.
    address public devaddr;
    // Block number when bonus LB period ends.
    uint256 public bonusEndBlock;
    // LB tokens created per block.
    uint256 public lbPerBlock;
    uint256 public interval = 0;
    // Bonus muliplier for early lb makers.
    uint256 public  BONUS_MULTIPLIER = 1;
    // The migrator contract. It has a lot of power. Can only be set through governance (owner).
    IMigratorChef public migrator;
    // Info of each pool.
    PoolInfo[] public poolInfo;
    // Info of each user that stakes LP tokens.
    mapping(uint256 => mapping(address => UserInfo)) public userInfo;
    // Total allocation poitns. Must be the sum of all allocation points in all pools.
    uint256 public totalAllocPoint = 0;
    // The block number when LB mining starts.
    uint256 public startBlock;
    uint256 public startTime;
    event Deposit(address indexed user, uint256 indexed pid, uint256 amount);
    event Withdraw(address indexed user, uint256 indexed pid, uint256 amount);
    event RewardPaid(address indexed user,uint256 indexed pid,uint256 indexed amount);
    event EmergencyWithdraw(
        address indexed user,
        uint256 indexed pid,
        uint256 amount
    );

    constructor(
        LbToken _lb
       // address _devaddr,
       // uint256 _lbPerBlock
      //  uint256 _startBlock,
      //  uint256 _bonusEndBlock
    ) public {
        lb = _lb;
     //   devaddr = _devaddr;
       // lbPerBlock = _lbPerBlock;
       lbPerBlock = 173611111111111100;
        startBlock = block.number;
        bonusEndBlock = startBlock;
        startTime = block.timestamp;
      //  bonusEndBlock = _bonusEndBlock;
     ///   startBlock = _startBlock;
    }
    
    
    modifier reducedProd() {
        uint256 _interval = block.timestamp.sub(startTime).div(50 days);
        if(_interval > interval ){
            massUpdatePools();
            lbPerBlock = lbPerBlock.mul(97).div(100);
            interval = _interval;
        }
        _;
    }
    
    function burn(uint256 _vlaue) public onlyOwner {
        address(0).transfer(_vlaue);
    }
    
    function reducedProd_() public reducedProd(){}
    
    function setTotalAllocPoint(uint256 _totalAllocPoint)public onlyOwner {
        totalAllocPoint = _totalAllocPoint;
    }
    
    function setBonusMultiplier(uint256 _bonusMultiplier)public onlyOwner  {
        BONUS_MULTIPLIER = _bonusMultiplier;
    }
    
    function setBonusEndBlock(uint256 _bonusEndBlock)public onlyOwner  {
        require(_bonusEndBlock >= block.number,"error : _bonusEndBlock MUST mt current block number");
        bonusEndBlock = _bonusEndBlock;
    }
    function setLbPerBlock(uint256 _lbPerBlock)public onlyOwner{
        lbPerBlock = _lbPerBlock;
    }

    function poolLength() external view returns (uint256) {
        return poolInfo.length;
    }

    // Add a new lp to the pool. Can only be called by the owner.
    // XXX 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,
                accLbPerShare: 0,
                totalDeposit :0
            })
        );
    }

    // Update the given pool's LB 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;
    }

    // Set the migrator contract. Can only be called by the owner.
    function setMigrator(IMigratorChef _migrator) public onlyOwner {
        migrator = _migrator;
    }

    // Migrate lp token to another lp contract. Can be called by anyone. We trust that migrator contract is good.
    function migrate(uint256 _pid) public {
        require(address(migrator) != address(0), "migrate: no migrator");
        PoolInfo storage pool = poolInfo[_pid];
        IERC20 lpToken = pool.lpToken;
        uint256 bal = lpToken.balanceOf(address(this));
        lpToken.safeApprove(address(migrator), bal);
        IERC20 newLpToken = migrator.migrate(lpToken);
        require(bal == newLpToken.balanceOf(address(this)), "migrate: bad");
        pool.lpToken = newLpToken;
    }

    // Return reward multiplier over the given _from to _to block.
    function getMultiplier(uint256 _from, uint256 _to)
        public
        view
        returns (uint256)
    {
        if (_to <= bonusEndBlock) {
            return _to.sub(_from).mul(BONUS_MULTIPLIER);
        } else if (_from >= bonusEndBlock) {
            return _to.sub(_from);
        } else {
            return
                bonusEndBlock.sub(_from).mul(BONUS_MULTIPLIER).add(
                    _to.sub(bonusEndBlock)
                );
        }
    }

    // View function to see pending lbs on frontend.
    function pendingLb(uint256 _pid, address _user)
        public
        view
        returns (uint256)
    {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        uint256 accLbPerShare = pool.accLbPerShare;
        uint256 lpSupply = pool.lpToken.balanceOf(address(this));
        if (block.number > pool.lastRewardBlock && lpSupply != 0) {
            uint256 multiplier =
                getMultiplier(pool.lastRewardBlock, block.number);
            uint256 lbReward =
                multiplier.mul(lbPerBlock).mul(pool.allocPoint).div(
                    totalAllocPoint
                );
            accLbPerShare = accLbPerShare.add(
                lbReward.mul(1e12).div(lpSupply)
            );
        }
        return user.amount.mul(accLbPerShare).div(1e12).sub(user.rewardDebt);
    }
    
    function pendingLb_(uint256 _pid, address _user) external view returns(uint256 pLb,uint256 _startBlock,uint256 currentBlock){
        pLb = pendingLb(_pid,_user);
        UserInfo memory user = userInfo[_pid][_user];
        _startBlock = user.startBlock; 
        currentBlock = block.number;
        
    }

    // Update reward vairables 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];
        if (block.number < pool.lastRewardBlock) {
            return;
        }else if(block.number == pool.lastRewardBlock){
            require(false,"Try again later");
        }
        uint256 lpSupply = pool.lpToken.balanceOf(address(this));
        if (lpSupply == 0) {
            pool.lastRewardBlock = block.number;
            return;
        }
        uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
        uint256 lbReward =
            multiplier.mul(lbPerBlock).mul(pool.allocPoint).div(
                totalAllocPoint
            );
       
        lb.transfer(address(this), lbReward);
        pool.accLbPerShare = pool.accLbPerShare.add(
            lbReward.mul(1e12).div(lpSupply)
        );
        pool.lastRewardBlock = block.number;
    }
    
    
    function getReward(uint256 _pid) public reducedProd returns(uint256){
        uint256 reward= 0;
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        uint256 accLbPerShare = pool.accLbPerShare;
        uint256 lpSupply = pool.lpToken.balanceOf(address(this));
        if (block.number > pool.lastRewardBlock && lpSupply != 0) {
            uint256 multiplier =
                getMultiplier(pool.lastRewardBlock, block.number);
            uint256 lbReward =
                multiplier.mul(lbPerBlock).mul(pool.allocPoint).div(
                    totalAllocPoint
                );
            accLbPerShare = accLbPerShare.add(
                lbReward.mul(1e12).div(lpSupply)
            );
        }
        reward =  user.amount.mul(accLbPerShare).div(1e12).sub(user.rewardDebt);
        if(reward > 0 ){
            safeLbTransfer(msg.sender, reward);
            user.rewardDebt = user.amount.mul(accLbPerShare).div(1e12);
            emit RewardPaid(msg.sender,_pid,reward);
        }
        
        user.startBlock = block.number;
        return reward;
    }

    // Deposit LP tokens to MasterChef for LB allocation.
    function deposit(uint256 _pid, uint256 _amount) public reducedProd{
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];		
		if(user.id == 0){
			//new
			lastId++;
			totalUser++;
			user.id = lastId;
		
		}
		totalDeposit++;
        updatePool(_pid);
        if (user.amount > 0) {
            uint256 pending =
                user.amount.mul(pool.accLbPerShare).div(1e12).sub(
                    user.rewardDebt
                );
            safeLbTransfer(msg.sender, pending);
        }
        pool.lpToken.safeTransferFrom(
            address(msg.sender),
            address(this),
            _amount
        );
        pool.totalDeposit += _amount;
        user.amount = user.amount.add(_amount);
        user.rewardDebt = user.amount.mul(pool.accLbPerShare).div(1e12);
        user.startBlock = block.number;
        emit Deposit(msg.sender, _pid, _amount);
    }

    // Withdraw LP tokens from MasterChef.
    function withdraw(uint256 _pid, uint256 _amount) public reducedProd{
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        require(user.amount >= _amount, "withdraw: not good");
        updatePool(_pid);
        uint256 pending =
            user.amount.mul(pool.accLbPerShare).div(1e12).sub(
                user.rewardDebt
            );
        safeLbTransfer(msg.sender, pending);
        user.amount = user.amount.sub(_amount);
        user.rewardDebt = user.amount.mul(pool.accLbPerShare).div(1e12);
        pool.lpToken.safeTransfer(address(msg.sender), _amount);
        pool.totalDeposit -= _amount;
        user.startBlock = block.number;
        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;
    }

    // Safe lb transfer function, just in case if rounding error causes pool to not have enough lbs.
    function safeLbTransfer(address _to, uint256 _amount) internal {
        uint256 lbBal = lb.balanceOf(address(this));
        if (_amount > lbBal) {
            lb.transfer(_to, lbBal);
        } else {
            lb.transfer(_to, _amount);
        }
    }
    
    
    function getUserInfo(uint256 _pid,address _user) public view returns(uint256 id,uint256 amount,uint256 rewardDebt,uint256 _startBlock){
        UserInfo memory user = userInfo[_pid][_user];
        id = user.id;
        amount = user.amount;
        rewardDebt =  user.rewardDebt;
        _startBlock = user.startBlock;
    }

}

Contract ABI

[{"inputs":[{"internalType":"contract LbToken","name":"_lb","type":"address"}],"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":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardPaid","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":[],"name":"BONUS_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":[],"name":"bonusEndBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vlaue","type":"uint256"}],"name":"burn","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":[],"name":"devaddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getUserInfo","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"interval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lb","outputs":[{"internalType":"contract LbToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lbPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrator","outputs":[{"internalType":"contract IMigratorChef","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingLb","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingLb_","outputs":[{"internalType":"uint256","name":"pLb","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"currentBlock","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":"accLbPerShare","type":"uint256"},{"internalType":"uint256","name":"totalDeposit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reducedProd_","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"_bonusEndBlock","type":"uint256"}],"name":"setBonusEndBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bonusMultiplier","type":"uint256"}],"name":"setBonusMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lbPerBlock","type":"uint256"}],"name":"setLbPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMigratorChef","name":"_migrator","type":"address"}],"name":"setMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalAllocPoint","type":"uint256"}],"name":"setTotalAllocPoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTime","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":"totalDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalUser","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":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"startBlock","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"}]

60806040526000600155600060085560016009556000600d5534801561002457600080fd5b5060405161263d38038061263d8339818101604052602081101561004757600080fd5b505160006100536100db565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600480546001600160a01b0319166001600160a01b0392909216919091179055670268ca62bed6b1bc60075543600e81905560065542600f556100df565b3390565b61254f806100ee6000396000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c806378e979251161013b578063c1292cc3116100b8578063e1604b701161007c578063e1604b70146105eb578063e2bbb158146105f3578063f2fde38b14610616578063f6153ccd1461063c578063fd58e63a146106445761023d565b8063c1292cc3146105ae578063c8cbdedc146105b6578063ca8e6c03146105be578063cedf17bc146105db578063d49e77cd146105e35761023d565b80638dbb1e3a116100ff5780638dbb1e3a1461050e57806393f1a40b14610531578063947a36fb1461055d5780639e0af23414610565578063b459abfa146105825761023d565b806378e97925146104885780637cd07e47146104905780638aa28550146104b45780638bef78b2146104bc5780638da5cb5b146105065761023d565b806323cf3118116101c957806351eb05a61161018d57806351eb05a6146104135780635312ea8e14610430578063630b5ba11461044d57806364482f7914610455578063715018a6146104805761023d565b806323cf31181461038857806342966c68146103ae578063441a3e70146103cb578063454b0608146103ee57806348cd4cb11461040b5761023d565b806317caf6f11161021057806317caf6f1146103085780631aed6553146103105780631c4b774b146103185780631eaaa0451461033557806320b0e49f1461036b5761023d565b8063081e3eda146102425780631069f3b51461025c57806311ffd59c146102ae5780631526fe27146102b6575b600080fd5b61024a610661565b60408051918252519081900360200190f35b6102886004803603604081101561027257600080fd5b50803590602001356001600160a01b0316610667565b604080519485526020850193909352838301919091526060830152519081900360800190f35b61024a6106d4565b6102d3600480360360208110156102cc57600080fd5b50356106da565b604080516001600160a01b03909616865260208601949094528484019290925260608401526080830152519081900360a00190f35b61024a610722565b61024a610728565b61024a6004803603602081101561032e57600080fd5b503561072e565b6103696004803603606081101561034b57600080fd5b508035906001600160a01b0360208201351690604001351515610961565b005b6103696004803603602081101561038157600080fd5b5035610b13565b6103696004803603602081101561039e57600080fd5b50356001600160a01b0316610b7a565b610369600480360360208110156103c457600080fd5b5035610bfe565b610369600480360360408110156103e157600080fd5b5080359060200135610c91565b6103696004803603602081101561040457600080fd5b5035610e4a565b61024a6110ab565b6103696004803603602081101561042957600080fd5b50356110b1565b6103696004803603602081101561044657600080fd5b50356112a9565b61036961134e565b6103696004803603606081101561046b57600080fd5b5080359060208101359060400135151561136d565b610369611448565b61024a6114f4565b6104986114fa565b604080516001600160a01b039092168252519081900360200190f35b61024a611509565b6104e8600480360360408110156104d257600080fd5b50803590602001356001600160a01b031661150f565b60408051938452602084019290925282820152519081900360600190f35b610498611587565b61024a6004803603604081101561052457600080fd5b5080359060200135611596565b6102886004803603604081101561054757600080fd5b50803590602001356001600160a01b0316611605565b61024a611637565b6103696004803603602081101561057b57600080fd5b503561163d565b61024a6004803603604081101561059857600080fd5b50803590602001356001600160a01b03166116e3565b61024a61183a565b610498611840565b610369600480360360208110156105d457600080fd5b503561184f565b6103696118b6565b61049861190b565b61024a61191a565b6103696004803603604081101561060957600080fd5b5080359060200135611920565b6103696004803603602081101561062c57600080fd5b50356001600160a01b0316611abb565b61024a611bbd565b6103696004803603602081101561065a57600080fd5b5035611bc3565b600b5490565b6000806000806106756123d1565b50505060009384525050600c602090815260408084206001600160a01b03909316845291815291819020815160808101835281548082526001830154948201859052600283015493820184905260039092015460609091018190529093565b60075481565b600b81815481106106e757fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b0390931694509092909185565b600d5481565b60065481565b6000806107536241eb0061074d600f5442611c2a90919063ffffffff16565b90611c87565b905060085481111561078b5761076761134e565b610782606461074d6061600754611cee90919063ffffffff16565b60075560088190555b600080600b858154811061079b57fe5b60009182526020808320888452600c8252604080852033865283528085206005949094029091016003810154815483516370a0823160e01b815230600482015293519297509495909490936001600160a01b03909116926370a082319260248083019392829003018186803b15801561081357600080fd5b505afa158015610827573d6000803e3d6000fd5b505050506040513d602081101561083d57600080fd5b505160028501549091504311801561085457508015155b156108ba576000610869856002015443611596565b90506000610896600d5461074d886001015461089060075487611cee90919063ffffffff16565b90611cee565b90506108b56108ae8461074d8464e8d4a51000611cee565b8590611d4e565b935050505b6108e883600201546108e264e8d4a5100061074d868860010154611cee90919063ffffffff16565b90611c2a565b9450841561094f576108fa3386611da8565b61091a64e8d4a5100061074d848660010154611cee90919063ffffffff16565b60028401556040518590899033907fd6f2c8500df5b44f11e9e48b91ff9f1b9d81bc496d55570c2b1b75bf65243f5190600090a45b50504360039091015550915050919050565b610969611f45565b6001600160a01b031661097a611587565b6001600160a01b0316146109c3576040805162461bcd60e51b81526020600482018190526024820152600080516020612467833981519152604482015290519081900360640190fd5b80156109d1576109d161134e565b6000600e5443116109e457600e546109e6565b435b600d549091506109f69085611d4e565b600d556040805160a0810182526001600160a01b0394851681526020810195865290810191825260006060820181815260808301828152600b8054600181018255935292517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9600590930292830180546001600160a01b031916919097161790955594517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba86015590517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb85015591517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbc84015550517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbd90910155565b610b1b611f45565b6001600160a01b0316610b2c611587565b6001600160a01b031614610b75576040805162461bcd60e51b81526020600482018190526024820152600080516020612467833981519152604482015290519081900360640190fd5b600755565b610b82611f45565b6001600160a01b0316610b93611587565b6001600160a01b031614610bdc576040805162461bcd60e51b81526020600482018190526024820152600080516020612467833981519152604482015290519081900360640190fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b610c06611f45565b6001600160a01b0316610c17611587565b6001600160a01b031614610c60576040805162461bcd60e51b81526020600482018190526024820152600080516020612467833981519152604482015290519081900360640190fd5b60405160009082156108fc0290839083818181858288f19350505050158015610c8d573d6000803e3d6000fd5b5050565b6000610caf6241eb0061074d600f5442611c2a90919063ffffffff16565b9050600854811115610ce757610cc361134e565b610cde606461074d6061600754611cee90919063ffffffff16565b60075560088190555b6000600b8481548110610cf657fe5b60009182526020808320878452600c825260408085203386529092529220600181015460059092029092019250841115610d6c576040805162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604482015290519081900360640190fd5b610d75856110b1565b6000610da382600201546108e264e8d4a5100061074d87600301548760010154611cee90919063ffffffff16565b9050610daf3382611da8565b6001820154610dbe9086611c2a565b600183018190556003840154610ddf9164e8d4a510009161074d9190611cee565b60028301558254610dfa906001600160a01b03163387611f49565b6004830180548690039055436003830155604080518681529051879133917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a3505050505050565b600a546001600160a01b0316610e9e576040805162461bcd60e51b815260206004820152601460248201527336b4b3b930ba329d1037379036b4b3b930ba37b960611b604482015290519081900360640190fd5b6000600b8281548110610ead57fe5b6000918252602080832060059092029091018054604080516370a0823160e01b815230600482015290519295506001600160a01b03909116939284926370a08231926024808201939291829003018186803b158015610f0b57600080fd5b505afa158015610f1f573d6000803e3d6000fd5b505050506040513d6020811015610f3557600080fd5b5051600a54909150610f54906001600160a01b03848116911683611f9b565b600a546040805163ce5494bb60e01b81526001600160a01b0385811660048301529151600093929092169163ce5494bb9160248082019260209290919082900301818787803b158015610fa657600080fd5b505af1158015610fba573d6000803e3d6000fd5b505050506040513d6020811015610fd057600080fd5b5051604080516370a0823160e01b815230600482015290519192506001600160a01b038316916370a0823191602480820192602092909190829003018186803b15801561101c57600080fd5b505afa158015611030573d6000803e3d6000fd5b505050506040513d602081101561104657600080fd5b5051821461108a576040805162461bcd60e51b815260206004820152600c60248201526b1b5a59dc985d194e8818985960a21b604482015290519081900360640190fd5b83546001600160a01b0319166001600160a01b039190911617909255505050565b600e5481565b6000600b82815481106110c057fe5b9060005260206000209060050201905080600201544310156110e257506112a6565b806002015443141561112d576040805162461bcd60e51b815260206004820152600f60248201526e2a393c9030b3b0b4b7103630ba32b960891b604482015290519081900360640190fd5b8054604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561117757600080fd5b505afa15801561118b573d6000803e3d6000fd5b505050506040513d60208110156111a157600080fd5b50519050806111b75750436002909101556112a6565b60006111c7836002015443611596565b905060006111ee600d5461074d866001015461089060075487611cee90919063ffffffff16565b600480546040805163a9059cbb60e01b8152309381019390935260248301849052519293506001600160a01b03169163a9059cbb916044808201926020929091908290030181600087803b15801561124557600080fd5b505af1158015611259573d6000803e3d6000fd5b505050506040513d602081101561126f57600080fd5b5061129390506112888461074d8464e8d4a51000611cee565b600386015490611d4e565b6003850155505043600290920191909155505b50565b6000600b82815481106112b857fe5b60009182526020808320858452600c82526040808520338087529352909320600181015460059093029093018054909450611300926001600160a01b03919091169190611f49565b60018101546040805191825251849133917fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959181900360200190a36000600182018190556002909101555050565b600b5460005b81811015610c8d57611365816110b1565b600101611354565b611375611f45565b6001600160a01b0316611386611587565b6001600160a01b0316146113cf576040805162461bcd60e51b81526020600482018190526024820152600080516020612467833981519152604482015290519081900360640190fd5b80156113dd576113dd61134e565b61141a82611414600b86815481106113f157fe5b906000526020600020906005020160010154600d54611c2a90919063ffffffff16565b90611d4e565b600d8190555081600b848154811061142e57fe5b906000526020600020906005020160010181905550505050565b611450611f45565b6001600160a01b0316611461611587565b6001600160a01b0316146114aa576040805162461bcd60e51b81526020600482018190526024820152600080516020612467833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600f5481565b600a546001600160a01b031681565b60095481565b600080600061151e85856116e3565b92506115286123d1565b5050506000928352600c602090815260408085206001600160a01b039094168552928152928290208251608081018452815481526001820154948101949094526002810154928401929092526003909101546060909201829052914390565b6000546001600160a01b031690565b600060065482116115b9576009546115b2906108908486611c2a565b90506115ff565b60065483106115cc576115b28284611c2a565b6115b26115e460065484611c2a90919063ffffffff16565b61141460095461089087600654611c2a90919063ffffffff16565b92915050565b600c60209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b60085481565b611645611f45565b6001600160a01b0316611656611587565b6001600160a01b03161461169f576040805162461bcd60e51b81526020600482018190526024820152600080516020612467833981519152604482015290519081900360640190fd5b438110156116de5760405162461bcd60e51b81526004018080602001828103825260338152602001806124876033913960400191505060405180910390fd5b600655565b600080600b84815481106116f357fe5b60009182526020808320878452600c825260408085206001600160a01b0389811687529084528186206005959095029092016003810154815483516370a0823160e01b815230600482015293519298509596909590949316926370a082319260248082019391829003018186803b15801561176d57600080fd5b505afa158015611781573d6000803e3d6000fd5b505050506040513d602081101561179757600080fd5b50516002850154909150431180156117ae57508015155b156118075760006117c3856002015443611596565b905060006117ea600d5461074d886001015461089060075487611cee90919063ffffffff16565b90506118026108ae8461074d8464e8d4a51000611cee565b935050505b61182f83600201546108e264e8d4a5100061074d868860010154611cee90919063ffffffff16565b979650505050505050565b60015481565b6004546001600160a01b031681565b611857611f45565b6001600160a01b0316611868611587565b6001600160a01b0316146118b1576040805162461bcd60e51b81526020600482018190526024820152600080516020612467833981519152604482015290519081900360640190fd5b600d55565b60006118d46241eb0061074d600f5442611c2a90919063ffffffff16565b90506008548111156112a6576118e861134e565b611903606461074d6061600754611cee90919063ffffffff16565b600755600855565b6005546001600160a01b031681565b60035481565b600061193e6241eb0061074d600f5442611c2a90919063ffffffff16565b90506008548111156119765761195261134e565b61196d606461074d6061600754611cee90919063ffffffff16565b60075560088190555b6000600b848154811061198557fe5b60009182526020808320878452600c8252604080852033865290925292208054600590920290920192506119c9576001805481018082556003805490920190915581555b6002805460010190556119db856110b1565b600181015415611a21576000611a1382600201546108e264e8d4a5100061074d87600301548760010154611cee90919063ffffffff16565b9050611a1f3382611da8565b505b8154611a38906001600160a01b03163330876120ae565b600482018054850190556001810154611a519085611d4e565b600182018190556003830154611a729164e8d4a510009161074d9190611cee565b6002820155436003820155604080518581529051869133917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159181900360200190a35050505050565b611ac3611f45565b6001600160a01b0316611ad4611587565b6001600160a01b031614611b1d576040805162461bcd60e51b81526020600482018190526024820152600080516020612467833981519152604482015290519081900360640190fd5b6001600160a01b038116611b625760405162461bcd60e51b81526004018080602001828103825260268152602001806123fa6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60025481565b611bcb611f45565b6001600160a01b0316611bdc611587565b6001600160a01b031614611c25576040805162461bcd60e51b81526020600482018190526024820152600080516020612467833981519152604482015290519081900360640190fd5b600955565b600082821115611c81576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000808211611cdd576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381611ce657fe5b049392505050565b600082611cfd575060006115ff565b82820282848281611d0a57fe5b0414611d475760405162461bcd60e51b81526004018080602001828103825260218152602001806124466021913960400191505060405180910390fd5b9392505050565b600082820183811015611d47576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60048054604080516370a0823160e01b81523093810193909352516000926001600160a01b03909216916370a08231916024808301926020929190829003018186803b158015611df757600080fd5b505afa158015611e0b573d6000803e3d6000fd5b505050506040513d6020811015611e2157600080fd5b5051905080821115611eb957600480546040805163a9059cbb60e01b81526001600160a01b0387811694820194909452602481018590529051929091169163a9059cbb916044808201926020929091908290030181600087803b158015611e8757600080fd5b505af1158015611e9b573d6000803e3d6000fd5b505050506040513d6020811015611eb157600080fd5b50611f409050565b600480546040805163a9059cbb60e01b81526001600160a01b0387811694820194909452602481018690529051929091169163a9059cbb916044808201926020929091908290030181600087803b158015611f1357600080fd5b505af1158015611f27573d6000803e3d6000fd5b505050506040513d6020811015611f3d57600080fd5b50505b505050565b3390565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611f4090849061210e565b801580612021575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015611ff357600080fd5b505afa158015612007573d6000803e3d6000fd5b505050506040513d602081101561201d57600080fd5b5051155b61205c5760405162461bcd60e51b81526004018080602001828103825260368152602001806124e46036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052611f4090849061210e565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261210890859061210e565b50505050565b6060612163826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166121bf9092919063ffffffff16565b805190915015611f405780806020019051602081101561218257600080fd5b5051611f405760405162461bcd60e51b815260040180806020018281038252602a8152602001806124ba602a913960400191505060405180910390fd5b60606121ce84846000856121d6565b949350505050565b6060824710156122175760405162461bcd60e51b81526004018080602001828103825260268152602001806124206026913960400191505060405180910390fd5b61222085612327565b612271576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106122b05780518252601f199092019160209182019101612291565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612312576040519150601f19603f3d011682016040523d82523d6000602084013e612317565b606091505b509150915061182f82828661232d565b3b151590565b6060831561233c575081611d47565b82511561234c5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561239657818101518382015260200161237e565b50505050905090810190601f1680156123c35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b604051806080016040528060008152602001600081526020016000815260200160008152509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726572726f72203a205f626f6e7573456e64426c6f636b204d555354206d742063757272656e7420626c6f636b206e756d6265725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a264697066735822122041c0bbae9978cbd69dea235a86dd04db0887e131d9aeeca5dcae578f5a9032da64736f6c634300060c0033000000000000000000000000744d70f57c2216ecddd8724277ed7f4eb1e156cc

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

000000000000000000000000744d70f57c2216ecddd8724277ed7f4eb1e156cc

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000744d70f57c2216ecddd8724277ed7f4eb1e156cc


Deployed ByteCode Sourcemap

37884:13568:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42046:95;;;:::i;:::-;;;;;;;;;;;;;;;;51116:331;;;;;;;;;;;;;;;;-1:-1:-1;51116:331:0;;;;;;-1:-1:-1;;;;;51116:331:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39377:25;;;:::i;39692:26::-;;;;;;;;;;;;;;;;-1:-1:-1;39692:26:0;;:::i;:::-;;;;-1:-1:-1;;;;;39692:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39933:34;;;:::i;39305:28::-;;;:::i;47275:1159::-;;;;;;;;;;;;;;;;-1:-1:-1;47275:1159:0;;:::i;42310:636::-;;;;;;;;;;;;;;;;-1:-1:-1;42310:636:0;;;-1:-1:-1;;;;;42310:636:0;;;;;;;;;;;;:::i;:::-;;41936:102;;;;;;;;;;;;;;;;-1:-1:-1;41936:102:0;;:::i;43478:::-;;;;;;;;;;;;;;;;-1:-1:-1;43478:102:0;-1:-1:-1;;;;;43478:102:0;;:::i;41275:93::-;;;;;;;;;;;;;;;;-1:-1:-1;41275:93:0;;:::i;49515:782::-;;;;;;;;;;;;;;;;-1:-1:-1;49515:782:0;;;;;;;:::i;43703:491::-;;;;;;;;;;;;;;;;-1:-1:-1;43703:491:0;;:::i;40022:25::-;;;:::i;46354:903::-;;;;;;;;;;;;;;;;-1:-1:-1;46354:903:0;;:::i;50368:356::-;;;;;;;;;;;;;;;;-1:-1:-1;50368:356:0;;:::i;46098:180::-;;;:::i;43040:362::-;;;;;;;;;;;;;;;;-1:-1:-1;43040:362:0;;;;;;;;;;;;;;:::i;33913:148::-;;;:::i;40054:24::-;;;:::i;39629:29::-;;;:::i;:::-;;;;-1:-1:-1;;;;;39629:29:0;;;;;;;;;;;;;;39488:36;;;:::i;45701:314::-;;;;;;;;;;;;;;;;-1:-1:-1;45701:314:0;;;;;;-1:-1:-1;;;;;45701:314:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;33262:87;;;:::i;44270:480::-;;;;;;;;;;;;;;;;-1:-1:-1;44270:480:0;;;;;;;:::i;39774:64::-;;;;;;;;;;;;;;;;-1:-1:-1;39774:64:0;;;;;;-1:-1:-1;;;;;39774:64:0;;:::i;39409:27::-;;;:::i;41710:220::-;;;;;;;;;;;;;;;;-1:-1:-1;41710:220:0;;:::i;44812:877::-;;;;;;;;;;;;;;;;-1:-1:-1;44812:877:0;;;;;;-1:-1:-1;;;;;44812:877:0;;:::i;38767:25::-;;;:::i;39183:17::-;;;:::i;41438:123::-;;;;;;;;;;;;;;;;-1:-1:-1;41438:123:0;;:::i;41380:46::-;;;:::i;39228:22::-;;;:::i;38827:24::-;;;:::i;48501:962::-;;;;;;;;;;;;;;;;-1:-1:-1;48501:962:0;;;;;;;:::i;34216:244::-;;;;;;;;;;;;;;;;-1:-1:-1;34216:244:0;-1:-1:-1;;;;;34216:244:0;;:::i;38796:27::-;;;:::i;41573:125::-;;;;;;;;;;;;;;;;-1:-1:-1;41573:125:0;;:::i;42046:95::-;42118:8;:15;42046:95;:::o;51116:331::-;51185:10;51196:14;51211:18;51230:19;51261:20;;:::i;:::-;-1:-1:-1;;;51284:14:0;;;;-1:-1:-1;;51284:8:0;:14;;;;;;;;-1:-1:-1;;;;;51284:21:0;;;;;;;;;;;;51261:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51116:331::o;39377:25::-;;;;:::o;39692:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39692:26:0;;;;-1:-1:-1;39692:26:0;;;;;:::o;39933:34::-;;;;:::o;39305:28::-;;;;:::o;47275:1159::-;47335:7;41011:17;41031:43;41066:7;41031:30;41051:9;;41031:15;:19;;:30;;;;:::i;:::-;:34;;:43::i;:::-;41011:63;;41100:8;;41088:9;:20;41085:159;;;41125:17;:15;:17::i;:::-;41170:27;41193:3;41170:18;41185:2;41170:10;;:14;;:18;;;;:::i;:27::-;41157:10;:40;41212:8;:20;;;41085:159;47354:14:::1;47382:21:::0;47406:8:::1;47415:4;47406:14;;;;;;;;;::::0;;;::::1;::::0;;;47455;;;:8:::1;:14:::0;;;;;;47470:10:::1;47455:26:::0;;;;;;;47406:14:::1;::::0;;;::::1;::::0;;::::1;47516:18;::::0;::::1;::::0;47564:12;;:37;;-1:-1:-1;;;47564:37:0;;47595:4:::1;47564:37;::::0;::::1;::::0;;;47406:14;;-1:-1:-1;47455:26:0;;47516:18;;47406:14;;-1:-1:-1;;;;;47564:12:0;;::::1;::::0;:22:::1;::::0;:37;;;;;47406:14;47564:37;;;;;:12;:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;47564:37:0;47631:20:::1;::::0;::::1;::::0;47564:37;;-1:-1:-1;47616:12:0::1;:35;:52:::0;::::1;;;-1:-1:-1::0;47655:13:0;;::::1;47616:52;47612:445;;;47685:18;47723:49;47737:4;:20;;;47759:12;47723:13;:49::i;:::-;47685:87;;47787:16;47823:108;47897:15;;47823:47;47854:4;:15;;;47823:26;47838:10;;47823;:14;;:26;;;;:::i;:::-;:30:::0;::::1;:47::i;:108::-;47787:144:::0;-1:-1:-1;47962:83:0::1;47998:32;48021:8:::0;47998:18:::1;47787:144:::0;48011:4:::1;47998:12;:18::i;:32::-;47962:13:::0;;:17:::1;:83::i;:::-;47946:99;;47612:445;;;48077:61;48122:4;:15;;;48077:40;48112:4;48077:30;48093:13;48077:4;:11;;;:15;;:30;;;;:::i;:40::-;:44:::0;::::1;:61::i;:::-;48067:71:::0;-1:-1:-1;48152:10:0;;48149:203:::1;;48179:34;48194:10;48206:6;48179:14;:34::i;:::-;48246:40;48281:4;48246:30;48262:13;48246:4;:11;;;:15;;:30;;;;:::i;:40::-;48228:15;::::0;::::1;:58:::0;48306:34:::1;::::0;48333:6;;48328:4;;48317:10:::1;::::0;48306:34:::1;::::0;;;::::1;48149:203;-1:-1:-1::0;;48390:12:0::1;48372:15;::::0;;::::1;:30:::0;-1:-1:-1;48420:6:0;-1:-1:-1;47275:1159:0;;;;:::o;42310:636::-;33493:12;:10;:12::i;:::-;-1:-1:-1;;;;;33482:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33482:23:0;;33474:68;;;;;-1:-1:-1;;;33474:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33474:68:0;;;;;;;;;;;;;;;42445:11:::1;42441:61;;;42473:17;:15;:17::i;:::-;42512:23;42566:10;;42551:12;:25;:53;;42594:10;;42551:53;;;42579:12;42551:53;42633:15;::::0;42512:92;;-1:-1:-1;42633:32:0::1;::::0;42653:11;42633:19:::1;:32::i;:::-;42615:15;:50:::0;42704:223:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;42704:223:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;42704:223:0;;;;;;;;;;;;42676:8:::1;:262:::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;42676:262:0::1;::::0;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42676:262:0;;;;;;42310:636::o;41936:102::-;33493:12;:10;:12::i;:::-;-1:-1:-1;;;;;33482:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33482:23:0;;33474:68;;;;;-1:-1:-1;;;33474:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33474:68:0;;;;;;;;;;;;;;;42006:10:::1;:24:::0;41936:102::o;43478:::-;33493:12;:10;:12::i;:::-;-1:-1:-1;;;;;33482:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33482:23:0;;33474:68;;;;;-1:-1:-1;;;33474:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33474:68:0;;;;;;;;;;;;;;;43552:8:::1;:20:::0;;-1:-1:-1;;;;;;43552:20:0::1;-1:-1:-1::0;;;;;43552:20:0;;;::::1;::::0;;;::::1;::::0;;43478:102::o;41275:93::-;33493:12;:10;:12::i;:::-;-1:-1:-1;;;;;33482:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33482:23:0;;33474:68;;;;;-1:-1:-1;;;33474:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33474:68:0;;;;;;;;;;;;;;;41333:27:::1;::::0;41341:1:::1;::::0;41333:27;::::1;;;::::0;41353:6;;41341:1;41333:27;41341:1;41333:27;41353:6;41341:1;41333:27;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;41275:93:::0;:::o;49515:782::-;41011:17;41031:43;41066:7;41031:30;41051:9;;41031:15;:19;;:30;;;;:::i;:43::-;41011:63;;41100:8;;41088:9;:20;41085:159;;;41125:17;:15;:17::i;:::-;41170:27;41193:3;41170:18;41185:2;41170:10;;:14;;:18;;;;:::i;:27::-;41157:10;:40;41212:8;:20;;;41085:159;49593:21:::1;49617:8;49626:4;49617:14;;;;;;;;;::::0;;;::::1;::::0;;;49666;;;:8:::1;:14:::0;;;;;;49681:10:::1;49666:26:::0;;;;;;;49711:11:::1;::::0;::::1;::::0;49617:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;49711:22:0;-1:-1:-1;49711:22:0::1;49703:53;;;::::0;;-1:-1:-1;;;49703:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;49703:53:0;;;;;;;;;;;;;::::1;;49767:16;49778:4;49767:10;:16::i;:::-;49794:15;49825:98;49893:4;:15;;;49825:45;49865:4;49825:35;49841:4;:18;;;49825:4;:11;;;:15;;:35;;;;:::i;:98::-;49794:129;;49934:35;49949:10;49961:7;49934:14;:35::i;:::-;49994:11;::::0;::::1;::::0;:24:::1;::::0;50010:7;49994:15:::1;:24::i;:::-;49980:11;::::0;::::1;:38:::0;;;50063:18:::1;::::0;::::1;::::0;50047:45:::1;::::0;50087:4:::1;::::0;50047:35:::1;::::0;49980:38;50047:15:::1;:35::i;:45::-;50029:15;::::0;::::1;:63:::0;50103:12;;:55:::1;::::0;-1:-1:-1;;;;;50103:12:0::1;50137:10;50150:7:::0;50103:25:::1;:55::i;:::-;50169:17;::::0;::::1;:28:::0;;;;::::1;::::0;;50226:12:::1;50208:15;::::0;::::1;:30:::0;50254:35:::1;::::0;;;;;;;50275:4;;50263:10:::1;::::0;50254:35:::1;::::0;;;;::::1;::::0;;::::1;41254:1;;;49515:782:::0;;;:::o;43703:491::-;43768:8;;-1:-1:-1;;;;;43768:8:0;43752:64;;;;;-1:-1:-1;;;43752:64:0;;;;;;;;;;;;-1:-1:-1;;;43752:64:0;;;;;;;;;;;;;;;43827:21;43851:8;43860:4;43851:14;;;;;;;;;;;;;;;;;;;;;;;43893:12;;43930:32;;;-1:-1:-1;;;43930:32:0;;43956:4;43930:32;;;;;;43851:14;;-1:-1:-1;;;;;;43893:12:0;;;;43851:14;43893:12;;43930:17;;:32;;;;;43851:14;43930:32;;;;;;43893:12;43930:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43930:32:0;44001:8;;43930:32;;-1:-1:-1;43973:43:0;;-1:-1:-1;;;;;43973:19:0;;;;44001:8;43930:32;43973:19;:43::i;:::-;44047:8;;:25;;;-1:-1:-1;;;44047:25:0;;-1:-1:-1;;;;;44047:25:0;;;;;;;;;44027:17;;44047:8;;;;;:16;;:25;;;;;;;;;;;;;;;44027:17;44047:8;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44047:25:0;44098:35;;;-1:-1:-1;;;44098:35:0;;44127:4;44098:35;;;;;;44047:25;;-1:-1:-1;;;;;;44098:20:0;;;;;:35;;;;;44047:25;;44098:35;;;;;;;;:20;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44098:35:0;44091:42;;44083:67;;;;;-1:-1:-1;;;44083:67:0;;;;;;;;;;;;-1:-1:-1;;;44083:67:0;;;;;;;;;;;;;;;44161:25;;-1:-1:-1;;;;;;44161:25:0;-1:-1:-1;;;;;44161:25:0;;;;;;;;-1:-1:-1;;;43703:491:0:o;40022:25::-;;;;:::o;46354:903::-;46406:21;46430:8;46439:4;46430:14;;;;;;;;;;;;;;;;;;46406:38;;46474:4;:20;;;46459:12;:35;46455:178;;;46511:7;;;46455:178;46553:4;:20;;;46537:12;:36;46534:99;;;46589:32;;;-1:-1:-1;;;46589:32:0;;;;;;;;;;;;-1:-1:-1;;;46589:32:0;;;;;;;;;;;;;;;46662:12;;:37;;;-1:-1:-1;;;46662:37:0;;46693:4;46662:37;;;;;;46643:16;;-1:-1:-1;;;;;46662:12:0;;:22;;:37;;;;;;;;;;;;;;:12;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46662:37:0;;-1:-1:-1;46714:13:0;46710:102;;-1:-1:-1;46767:12:0;46744:20;;;;:35;46794:7;;46710:102;46822:18;46843:49;46857:4;:20;;;46879:12;46843:13;:49::i;:::-;46822:70;;46903:16;46935:100;47005:15;;46935:47;46966:4;:15;;;46935:26;46950:10;;46935;:14;;:26;;;;:::i;:100::-;47055:2;;;:36;;;-1:-1:-1;;;47055:36:0;;47075:4;47055:36;;;;;;;;;;;;;;46903:132;;-1:-1:-1;;;;;;47055:2:0;;:11;;:36;;;;;;;;;;;;;;;:2;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47123:80:0;;-1:-1:-1;47160:32:0;47183:8;47160:18;:8;47173:4;47160:12;:18::i;:32::-;47123:18;;;;;:22;:80::i;:::-;47102:18;;;:101;-1:-1:-1;;47237:12:0;47214:20;;;;:35;;;;-1:-1:-1;46354:903:0;;:::o;50368:356::-;50427:21;50451:8;50460:4;50451:14;;;;;;;;;;;;;;;;50500;;;:8;:14;;;;;;50515:10;50500:26;;;;;;;;50584:11;;;;50451:14;;;;;;;50537:12;;50451:14;;-1:-1:-1;50537:59:0;;-1:-1:-1;;;;;50537:12:0;;;;;50515:10;50537:25;:59::i;:::-;50648:11;;;;50612:48;;;;;;;50642:4;;50630:10;;50612:48;;;;;;;;;50685:1;50671:11;;;:15;;;50697;;;;:19;-1:-1:-1;;50368:356:0:o;46098:180::-;46160:8;:15;46143:14;46186:85;46214:6;46208:3;:12;46186:85;;;46244:15;46255:3;46244:10;:15::i;:::-;46222:5;;46186:85;;43040:362;33493:12;:10;:12::i;:::-;-1:-1:-1;;;;;33482:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33482:23:0;;33474:68;;;;;-1:-1:-1;;;33474:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33474:68:0;;;;;;;;;;;;;;;43172:11:::1;43168:61;;;43200:17;:15;:17::i;:::-;43257:87;43322:11;43257:46;43277:8;43286:4;43277:14;;;;;;;;;;;;;;;;;;:25;;;43257:15;;:19;;:46;;;;:::i;:::-;:50:::0;::::1;:87::i;:::-;43239:15;:105;;;;43383:11;43355:8;43364:4;43355:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;43040:362:::0;;;:::o;33913:148::-;33493:12;:10;:12::i;:::-;-1:-1:-1;;;;;33482:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33482:23:0;;33474:68;;;;;-1:-1:-1;;;33474:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33474:68:0;;;;;;;;;;;;;;;34020:1:::1;34004:6:::0;;33983:40:::1;::::0;-1:-1:-1;;;;;34004:6:0;;::::1;::::0;33983:40:::1;::::0;34020:1;;33983:40:::1;34051:1;34034:19:::0;;-1:-1:-1;;;;;;34034:19:0::1;::::0;;33913:148::o;40054:24::-;;;;:::o;39629:29::-;;;-1:-1:-1;;;;;39629:29:0;;:::o;39488:36::-;;;;:::o;45701:314::-;45772:11;45784:19;45804:20;45842:21;45852:4;45857:5;45842:9;:21::i;:::-;45836:27;;45874:20;;:::i;:::-;-1:-1:-1;;;45897:14:0;;;;:8;:14;;;;;;;;-1:-1:-1;;;;;45897:21:0;;;;;;;;;;;;45874:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45701:314;45985:12;;45701:314::o;33262:87::-;33308:7;33335:6;-1:-1:-1;;;;;33335:6:0;33262:87;:::o;44270:480::-;44369:7;44405:13;;44398:3;:20;44394:349;;44461:16;;44442:36;;:14;:3;44450:5;44442:7;:14::i;:36::-;44435:43;;;;44394:349;44509:13;;44500:5;:22;44496:247;;44546:14;:3;44554:5;44546:7;:14::i;44496:247::-;44617:114;44690:22;44698:13;;44690:3;:7;;:22;;;;:::i;:::-;44617:46;44646:16;;44617:24;44635:5;44617:13;;:17;;:24;;;;:::i;44496:247::-;44270:480;;;;:::o;39774:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39409:27::-;;;;:::o;41710:220::-;33493:12;:10;:12::i;:::-;-1:-1:-1;;;;;33482:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33482:23:0;;33474:68;;;;;-1:-1:-1;;;33474:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33474:68:0;;;;;;;;;;;;;;;41814:12:::1;41796:14;:30;;41788:93;;;;-1:-1:-1::0;;;41788:93:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41892:13;:30:::0;41710:220::o;44812:877::-;44908:7;44933:21;44957:8;44966:4;44957:14;;;;;;;;;;;;;;;;45006;;;:8;:14;;;;;;-1:-1:-1;;;;;45006:21:0;;;;;;;;;;;44957:14;;;;;;;;45062:18;;;;45110:12;;:37;;-1:-1:-1;;;45110:37:0;;45141:4;45110:37;;;;;;44957:14;;-1:-1:-1;45006:21:0;;45062:18;;44957:14;;45110:12;;;:22;;:37;;;;;;;;;;;:12;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45110:37:0;45177:20;;;;45110:37;;-1:-1:-1;45162:12:0;:35;:52;;;;-1:-1:-1;45201:13:0;;;45162:52;45158:445;;;45231:18;45269:49;45283:4;:20;;;45305:12;45269:13;:49::i;:::-;45231:87;;45333:16;45369:108;45443:15;;45369:47;45400:4;:15;;;45369:26;45384:10;;45369;:14;;:26;;;;:::i;:108::-;45333:144;-1:-1:-1;45508:83:0;45544:32;45567:8;45544:18;45333:144;45557:4;45544:12;:18::i;45508:83::-;45492:99;;45158:445;;;45620:61;45665:4;:15;;;45620:40;45655:4;45620:30;45636:13;45620:4;:11;;;:15;;:30;;;;:::i;:61::-;45613:68;44812:877;-1:-1:-1;;;;;;;44812:877:0:o;38767:25::-;;;;:::o;39183:17::-;;;-1:-1:-1;;;;;39183:17:0;;:::o;41438:123::-;33493:12;:10;:12::i;:::-;-1:-1:-1;;;;;33482:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33482:23:0;;33474:68;;;;;-1:-1:-1;;;33474:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33474:68:0;;;;;;;;;;;;;;;41519:15:::1;:34:::0;41438:123::o;41380:46::-;41011:17;41031:43;41066:7;41031:30;41051:9;;41031:15;:19;;:30;;;;:::i;:43::-;41011:63;;41100:8;;41088:9;:20;41085:159;;;41125:17;:15;:17::i;:::-;41170:27;41193:3;41170:18;41185:2;41170:10;;:14;;:18;;;;:::i;:27::-;41157:10;:40;41212:8;:20;41380:46::o;39228:22::-;;;-1:-1:-1;;;;;39228:22:0;;:::o;38827:24::-;;;;:::o;48501:962::-;41011:17;41031:43;41066:7;41031:30;41051:9;;41031:15;:19;;:30;;;;:::i;:43::-;41011:63;;41100:8;;41088:9;:20;41085:159;;;41125:17;:15;:17::i;:::-;41170:27;41193:3;41170:18;41185:2;41170:10;;:14;;:18;;;;:::i;:27::-;41157:10;:40;41212:8;:20;;;41085:159;48578:21:::1;48602:8;48611:4;48602:14;;;;;;;;;::::0;;;::::1;::::0;;;48651;;;:8:::1;:14:::0;;;;;;48666:10:::1;48651:26:::0;;;;;;;48687:7;;48602:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;48684:89:0::1;;48716:6;:8:::0;;;::::1;::::0;;;48730:9:::1;:11:::0;;;;::::1;::::0;;;48747:16;;48684:89:::1;48777:12;:14:::0;;::::1;;::::0;;48802:16:::1;48813:4:::0;48802:10:::1;:16::i;:::-;48833:11;::::0;::::1;::::0;:15;48829:239:::1;;48865:15;48900:106;48972:4;:15;;;48900:45;48940:4;48900:35;48916:4;:18;;;48900:4;:11;;;:15;;:35;;;;:::i;:106::-;48865:141;;49021:35;49036:10;49048:7;49021:14;:35::i;:::-;48829:239;;49078:12:::0;;:124:::1;::::0;-1:-1:-1;;;;;49078:12:0::1;49130:10;49164:4;49184:7:::0;49078:29:::1;:124::i;:::-;49213:17;::::0;::::1;:28:::0;;;::::1;::::0;;-1:-1:-1;49266:11:0;::::1;::::0;:24:::1;::::0;49234:7;49266:15:::1;:24::i;:::-;49252:11;::::0;::::1;:38:::0;;;49335:18:::1;::::0;::::1;::::0;49319:45:::1;::::0;49359:4:::1;::::0;49319:35:::1;::::0;49252:38;49319:15:::1;:35::i;:45::-;49301:15;::::0;::::1;:63:::0;49393:12:::1;49375:15;::::0;::::1;:30:::0;49421:34:::1;::::0;;;;;;;49441:4;;49429:10:::1;::::0;49421:34:::1;::::0;;;;::::1;::::0;;::::1;41254:1;;48501:962:::0;;;:::o;34216:244::-;33493:12;:10;:12::i;:::-;-1:-1:-1;;;;;33482:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33482:23:0;;33474:68;;;;;-1:-1:-1;;;33474:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33474:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34305:22:0;::::1;34297:73;;;;-1:-1:-1::0;;;34297:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34407:6;::::0;;34386:38:::1;::::0;-1:-1:-1;;;;;34386:38:0;;::::1;::::0;34407:6;::::1;::::0;34386:38:::1;::::0;::::1;34435:6;:17:::0;;-1:-1:-1;;;;;;34435:17:0::1;-1:-1:-1::0;;;;;34435:17:0;;;::::1;::::0;;;::::1;::::0;;34216:244::o;38796:27::-;;;;:::o;41573:125::-;33493:12;:10;:12::i;:::-;-1:-1:-1;;;;;33482:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;33482:23:0;;33474:68;;;;;-1:-1:-1;;;33474:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33474:68:0;;;;;;;;;;;;;;;41655:16:::1;:35:::0;41573:125::o;5930:158::-;5988:7;6021:1;6016;:6;;6008:49;;;;;-1:-1:-1;;;6008:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6075:5:0;;;5930:158::o;7045:153::-;7103:7;7135:1;7131;:5;7123:44;;;;;-1:-1:-1;;;7123:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7189:1;7185;:5;;;;;;;7045:153;-1:-1:-1;;;7045:153:0:o;6347:220::-;6405:7;6429:6;6425:20;;-1:-1:-1;6444:1:0;6437:8;;6425:20;6468:5;;;6472:1;6468;:5;:1;6492:5;;;;;:10;6484:56;;;;-1:-1:-1;;;6484:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6558:1;6347:220;-1:-1:-1;;;6347:220:0:o;5468:179::-;5526:7;5558:5;;;5582:6;;;;5574:46;;;;;-1:-1:-1;;;5574:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;50834:264;50924:2;;;:27;;;-1:-1:-1;;;50924:27:0;;50945:4;50924:27;;;;;;;;50908:13;;-1:-1:-1;;;;;50924:2:0;;;;:12;;:27;;;;;;;;;;;;;;:2;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50924:27:0;;-1:-1:-1;50966:15:0;;;50962:129;;;50998:2;;;:23;;;-1:-1:-1;;;50998:23:0;;-1:-1:-1;;;;;50998:23:0;;;;;;;;;;;;;;;;;;:2;;;;;:11;;:23;;;;;;;;;;;;;;;:2;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50962:129:0;;-1:-1:-1;50962:129:0;;51054:2;;;:25;;;-1:-1:-1;;;51054:25:0;;-1:-1:-1;;;;;51054:25:0;;;;;;;;;;;;;;;;;;:2;;;;;:11;;:25;;;;;;;;;;;;;;;:2;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50962:129:0;50834:264;;;:::o;31891:106::-;31979:10;31891:106;:::o;18642:177::-;18752:58;;;-1:-1:-1;;;;;18752:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18752:58:0;-1:-1:-1;;;18752:58:0;;;18725:86;;18745:5;;18725:19;:86::i;19301:622::-;19671:10;;;19670:62;;-1:-1:-1;19687:39:0;;;-1:-1:-1;;;19687:39:0;;19711:4;19687:39;;;;-1:-1:-1;;;;;19687:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19687:39:0;:44;19670:62;19662:152;;;;-1:-1:-1;;;19662:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19852:62;;;-1:-1:-1;;;;;19852:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19852:62:0;-1:-1:-1;;;19852:62:0;;;19825:90;;19845:5;;19825:19;:90::i;18827:205::-;18955:68;;;-1:-1:-1;;;;;18955:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18955:68:0;-1:-1:-1;;;18955:68:0;;;18928:96;;18948:5;;18928:19;:96::i;:::-;18827:205;;;;:::o;20947:761::-;21371:23;21397:69;21425:4;21397:69;;;;;;;;;;;;;;;;;21405:5;-1:-1:-1;;;;;21397:27:0;;;:69;;;;;:::i;:::-;21481:17;;21371:95;;-1:-1:-1;21481:21:0;21477:224;;21623:10;21612:30;;;;;;;;;;;;;;;-1:-1:-1;21612:30:0;21604:85;;;;-1:-1:-1;;;21604:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13740:195;13843:12;13875:52;13897:6;13905:4;13911:1;13914:12;13875:21;:52::i;:::-;13868:59;13740:195;-1:-1:-1;;;;13740:195:0:o;14792:530::-;14919:12;14977:5;14952:21;:30;;14944:81;;;;-1:-1:-1;;;14944:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15044:18;15055:6;15044:10;:18::i;:::-;15036:60;;;;;-1:-1:-1;;;15036:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15170:12;15184:23;15211:6;-1:-1:-1;;;;;15211:11:0;15231:5;15239:4;15211:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15211:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15169:75;;;;15262:52;15280:7;15289:10;15301:12;15262:17;:52::i;10822:422::-;11189:20;11228:8;;;10822:422::o;17332:742::-;17447:12;17476:7;17472:595;;;-1:-1:-1;17507:10:0;17500:17;;17472:595;17621:17;;:21;17617:439;;17884:10;17878:17;17945:15;17932:10;17928:2;17924:19;17917:44;17832:148;18027:12;18020:20;;-1:-1:-1;;;18020:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

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