Contract 0x132a39366ec1c9541a7f782edf602f2d84e19a87

Contract Overview

Balance:
0 BNB

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x5ddb3937e2b92c0c164e7d588ed0f1ea1751f669039c1faa8335c82f7cf4a385Withdraw156237362022-01-06 10:31:4111 days 15 hrs ago0x6082bcb75b7ac5eab352f3941990e1a59308e958 IN  0x132a39366ec1c9541a7f782edf602f2d84e19a870 BNB0.00074469
0x390486b12e504810b8e78aa8ae7b9de7217d764f26463b500ef66ff356a186beWithdraw156237042022-01-06 10:30:0511 days 15 hrs ago0x6082bcb75b7ac5eab352f3941990e1a59308e958 IN  0x132a39366ec1c9541a7f782edf602f2d84e19a870 BNB0.00029459
0x2b311f3333ad0e46db8a7851ad61481d93bd117c464311a05098609f5a9e0aedWithdraw156237022022-01-06 10:29:5911 days 15 hrs ago0x6082bcb75b7ac5eab352f3941990e1a59308e958 IN  0x132a39366ec1c9541a7f782edf602f2d84e19a870 BNB0.00074469
0x48aa61e43d2bf2f0fb5f47b601984a33f41379865168e9facb1695240ae10e1eWithdraw156237012022-01-06 10:29:5611 days 15 hrs ago0x6082bcb75b7ac5eab352f3941990e1a59308e958 IN  0x132a39366ec1c9541a7f782edf602f2d84e19a870 BNB0.00074469
0x55ae07d286022cde4482b1a51480a11cddab66fc99b3a9b2f8ca0100603d51aaWithdraw156236852022-01-06 10:29:0811 days 15 hrs ago0x6082bcb75b7ac5eab352f3941990e1a59308e958 IN  0x132a39366ec1c9541a7f782edf602f2d84e19a870 BNB0.00074469
0x63fe7ebf6c9514a935aba54a286db25e9c7edfdece9dafb2718f86f8c7135dbaWithdraw156236832022-01-06 10:29:0211 days 15 hrs ago0x6082bcb75b7ac5eab352f3941990e1a59308e958 IN  0x132a39366ec1c9541a7f782edf602f2d84e19a870 BNB0.00074469
0x2c9c3ee6c4acac5cf3f9b5cbf2168fc1ecdfa06d3f3221641d21ba1907029565Withdraw156236822022-01-06 10:28:5911 days 15 hrs ago0x6082bcb75b7ac5eab352f3941990e1a59308e958 IN  0x132a39366ec1c9541a7f782edf602f2d84e19a870 BNB0.00074469
0x0c21bfca5a83cc8521099826d10c1e1345a2ae2ac30626f4cb2c1e413da1a62aWithdraw156236812022-01-06 10:28:5611 days 15 hrs ago0x6082bcb75b7ac5eab352f3941990e1a59308e958 IN  0x132a39366ec1c9541a7f782edf602f2d84e19a870 BNB0.00074469
0x1e4f416ad000f6abdec2bb3bdf3aa44649ff77d725e7fc77dc92e8c24a228090Withdraw156236732022-01-06 10:28:3211 days 15 hrs ago0x6082bcb75b7ac5eab352f3941990e1a59308e958 IN  0x132a39366ec1c9541a7f782edf602f2d84e19a870 BNB0.00074469
0xf8cdb38d81d054690b89a032b5397656808456788fbca3fbc5ee4155f90d0dc5Withdraw156236532022-01-06 10:27:3211 days 15 hrs ago0x6082bcb75b7ac5eab352f3941990e1a59308e958 IN  0x132a39366ec1c9541a7f782edf602f2d84e19a870 BNB0.00074469
0x5b3ddc13c621d9036ab3672c598f0cefcef0f393ff5313f20f825b5d274a42bdWithdraw156236192022-01-06 10:25:5011 days 15 hrs ago0x6082bcb75b7ac5eab352f3941990e1a59308e958 IN  0x132a39366ec1c9541a7f782edf602f2d84e19a870 BNB0.00029459
0x20e1333be4e40ab6c459b96916ac1a898ad59d5a53bf34b0489f9bdce68288b3Withdraw156235952022-01-06 10:24:3811 days 15 hrs ago0x6082bcb75b7ac5eab352f3941990e1a59308e958 IN  0x132a39366ec1c9541a7f782edf602f2d84e19a870 BNB0.00074469
0xe441204d11b87de315dbb0dd8a3baaff9e1318917ca9c00890c9cdc0a01933a1Withdraw156235652022-01-06 10:23:0811 days 15 hrs ago0x6082bcb75b7ac5eab352f3941990e1a59308e958 IN  0x132a39366ec1c9541a7f782edf602f2d84e19a870 BNB0.00074409
0xa160f2f48a97789d06221da034bd4e960d6baa60fb65a34ec1392e0809088e07Withdraw156235382022-01-06 10:21:4711 days 15 hrs ago0x6082bcb75b7ac5eab352f3941990e1a59308e958 IN  0x132a39366ec1c9541a7f782edf602f2d84e19a870 BNB0.00074409
0xe35caee7a9f78ba567fd57aded89a2cd81e2426f2bda48de2f9237215c042378Withdraw156235142022-01-06 10:20:3511 days 15 hrs ago0x6082bcb75b7ac5eab352f3941990e1a59308e958 IN  0x132a39366ec1c9541a7f782edf602f2d84e19a870 BNB0.00074445
0xb4b7ca38031a7e289e0fab3b68516cc6d633309b4841fed4caeef83e5e723897Withdraw156234612022-01-06 10:17:5611 days 15 hrs ago0x6082bcb75b7ac5eab352f3941990e1a59308e958 IN  0x132a39366ec1c9541a7f782edf602f2d84e19a870 BNB0.00074409
0x10d5066d1aeb7d12a5c2a4fecf4cae9f77224d483e877fe4628f0c043c860193Deposit156230202022-01-06 9:55:5311 days 16 hrs ago0x6082bcb75b7ac5eab352f3941990e1a59308e958 IN  0x132a39366ec1c9541a7f782edf602f2d84e19a870 BNB0.00135983
0xa010e2917116aa65f2719a3db24383a56ea456c21b76278957cb1bf65a95cb6bDeposit138136372021-11-04 7:02:3274 days 19 hrs ago0x9b6a04053f7374a18ed4ae6c2eeaf60666ee7e8b IN  0x132a39366ec1c9541a7f782edf602f2d84e19a870 BNB0.00130988
0x8fc75f3e5b7d4d917cf9b72666054889e49116a7cd0e1d2ff49c06d599003042Withdraw138136272021-11-04 7:02:0274 days 19 hrs ago0x9b6a04053f7374a18ed4ae6c2eeaf60666ee7e8b IN  0x132a39366ec1c9541a7f782edf602f2d84e19a870 BNB0.00105036
0x86e49a0ed34061ea94418374c02247dacd21fc71016766af191891d4bea81ec9Withdraw138136152021-11-04 7:01:2674 days 19 hrs ago0x9b6a04053f7374a18ed4ae6c2eeaf60666ee7e8b IN  0x132a39366ec1c9541a7f782edf602f2d84e19a870 BNB0.00092364
0x75090cbf58089cf277227153a2694edc6bfc8a28a025bac5f4fa78bae4d6e3ccDeposit137887322021-11-03 10:17:1775 days 15 hrs ago0x9b6a04053f7374a18ed4ae6c2eeaf60666ee7e8b IN  0x132a39366ec1c9541a7f782edf602f2d84e19a870 BNB0.00130988
0xbb777c0deb8d873e8a1eaaa8623ba3cb9b6e56a4943399420f89eecc067df73aDeposit137887172021-11-03 10:16:3275 days 15 hrs ago0x7805fa0360110ea6deb508b00e3d19290c9fd0e5 IN  0x132a39366ec1c9541a7f782edf602f2d84e19a870 BNB0.00134092
0xc62fb58132dc541ce2a6b35a4e1be79e4b5e74b17abb4100a5a9b40af0938f4aWithdraw137887112021-11-03 10:16:1475 days 15 hrs ago0x9b6a04053f7374a18ed4ae6c2eeaf60666ee7e8b IN  0x132a39366ec1c9541a7f782edf602f2d84e19a870 BNB0.00106228
0x4cb2c16fd0c161bb5323a4bed72fd29b92022fec2a027bfbda3068fb0478a5cdDeposit137887082021-11-03 10:16:0575 days 15 hrs ago0x7805fa0360110ea6deb508b00e3d19290c9fd0e5 IN  0x132a39366ec1c9541a7f782edf602f2d84e19a870 BNB0.00134104
0xe498d485bf7bc7f69e9293a5ab7780eeb955cae20e7208452a416fe73fe854beDeposit137886942021-11-03 10:15:2375 days 15 hrs ago0x9b6a04053f7374a18ed4ae6c2eeaf60666ee7e8b IN  0x132a39366ec1c9541a7f782edf602f2d84e19a870 BNB0.0013408
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x5ddb3937e2b92c0c164e7d588ed0f1ea1751f669039c1faa8335c82f7cf4a385156237362022-01-06 10:31:4111 days 15 hrs ago 0x132a39366ec1c9541a7f782edf602f2d84e19a87 0xc9f654d481e79d01448030b08516b7f9fcf71e130 BNB
0x5ddb3937e2b92c0c164e7d588ed0f1ea1751f669039c1faa8335c82f7cf4a385156237362022-01-06 10:31:4111 days 15 hrs ago 0x132a39366ec1c9541a7f782edf602f2d84e19a87 0x025a522ebf4eaa663d717d917d6833d6b0ea39460 BNB
0x2b311f3333ad0e46db8a7851ad61481d93bd117c464311a05098609f5a9e0aed156237022022-01-06 10:29:5911 days 15 hrs ago 0x132a39366ec1c9541a7f782edf602f2d84e19a87 0xc9f654d481e79d01448030b08516b7f9fcf71e130 BNB
0x2b311f3333ad0e46db8a7851ad61481d93bd117c464311a05098609f5a9e0aed156237022022-01-06 10:29:5911 days 15 hrs ago 0x132a39366ec1c9541a7f782edf602f2d84e19a87 0x025a522ebf4eaa663d717d917d6833d6b0ea39460 BNB
0x48aa61e43d2bf2f0fb5f47b601984a33f41379865168e9facb1695240ae10e1e156237012022-01-06 10:29:5611 days 15 hrs ago 0x132a39366ec1c9541a7f782edf602f2d84e19a87 0xc9f654d481e79d01448030b08516b7f9fcf71e130 BNB
0x48aa61e43d2bf2f0fb5f47b601984a33f41379865168e9facb1695240ae10e1e156237012022-01-06 10:29:5611 days 15 hrs ago 0x132a39366ec1c9541a7f782edf602f2d84e19a87 0x025a522ebf4eaa663d717d917d6833d6b0ea39460 BNB
0x55ae07d286022cde4482b1a51480a11cddab66fc99b3a9b2f8ca0100603d51aa156236852022-01-06 10:29:0811 days 15 hrs ago 0x132a39366ec1c9541a7f782edf602f2d84e19a87 0xc9f654d481e79d01448030b08516b7f9fcf71e130 BNB
0x55ae07d286022cde4482b1a51480a11cddab66fc99b3a9b2f8ca0100603d51aa156236852022-01-06 10:29:0811 days 15 hrs ago 0x132a39366ec1c9541a7f782edf602f2d84e19a87 0x025a522ebf4eaa663d717d917d6833d6b0ea39460 BNB
0x63fe7ebf6c9514a935aba54a286db25e9c7edfdece9dafb2718f86f8c7135dba156236832022-01-06 10:29:0211 days 15 hrs ago 0x132a39366ec1c9541a7f782edf602f2d84e19a87 0xc9f654d481e79d01448030b08516b7f9fcf71e130 BNB
0x63fe7ebf6c9514a935aba54a286db25e9c7edfdece9dafb2718f86f8c7135dba156236832022-01-06 10:29:0211 days 15 hrs ago 0x132a39366ec1c9541a7f782edf602f2d84e19a87 0x025a522ebf4eaa663d717d917d6833d6b0ea39460 BNB
0x2c9c3ee6c4acac5cf3f9b5cbf2168fc1ecdfa06d3f3221641d21ba1907029565156236822022-01-06 10:28:5911 days 15 hrs ago 0x132a39366ec1c9541a7f782edf602f2d84e19a87 0xc9f654d481e79d01448030b08516b7f9fcf71e130 BNB
0x2c9c3ee6c4acac5cf3f9b5cbf2168fc1ecdfa06d3f3221641d21ba1907029565156236822022-01-06 10:28:5911 days 15 hrs ago 0x132a39366ec1c9541a7f782edf602f2d84e19a87 0x025a522ebf4eaa663d717d917d6833d6b0ea39460 BNB
0x0c21bfca5a83cc8521099826d10c1e1345a2ae2ac30626f4cb2c1e413da1a62a156236812022-01-06 10:28:5611 days 15 hrs ago 0x132a39366ec1c9541a7f782edf602f2d84e19a87 0xc9f654d481e79d01448030b08516b7f9fcf71e130 BNB
0x0c21bfca5a83cc8521099826d10c1e1345a2ae2ac30626f4cb2c1e413da1a62a156236812022-01-06 10:28:5611 days 15 hrs ago 0x132a39366ec1c9541a7f782edf602f2d84e19a87 0x025a522ebf4eaa663d717d917d6833d6b0ea39460 BNB
0x1e4f416ad000f6abdec2bb3bdf3aa44649ff77d725e7fc77dc92e8c24a228090156236732022-01-06 10:28:3211 days 15 hrs ago 0x132a39366ec1c9541a7f782edf602f2d84e19a87 0xc9f654d481e79d01448030b08516b7f9fcf71e130 BNB
0x1e4f416ad000f6abdec2bb3bdf3aa44649ff77d725e7fc77dc92e8c24a228090156236732022-01-06 10:28:3211 days 15 hrs ago 0x132a39366ec1c9541a7f782edf602f2d84e19a87 0x025a522ebf4eaa663d717d917d6833d6b0ea39460 BNB
0xf8cdb38d81d054690b89a032b5397656808456788fbca3fbc5ee4155f90d0dc5156236532022-01-06 10:27:3211 days 15 hrs ago 0x132a39366ec1c9541a7f782edf602f2d84e19a87 0xc9f654d481e79d01448030b08516b7f9fcf71e130 BNB
0xf8cdb38d81d054690b89a032b5397656808456788fbca3fbc5ee4155f90d0dc5156236532022-01-06 10:27:3211 days 15 hrs ago 0x132a39366ec1c9541a7f782edf602f2d84e19a87 0x025a522ebf4eaa663d717d917d6833d6b0ea39460 BNB
0x20e1333be4e40ab6c459b96916ac1a898ad59d5a53bf34b0489f9bdce68288b3156235952022-01-06 10:24:3811 days 15 hrs ago 0x132a39366ec1c9541a7f782edf602f2d84e19a87 0xc9f654d481e79d01448030b08516b7f9fcf71e130 BNB
0x20e1333be4e40ab6c459b96916ac1a898ad59d5a53bf34b0489f9bdce68288b3156235952022-01-06 10:24:3811 days 15 hrs ago 0x132a39366ec1c9541a7f782edf602f2d84e19a87 0x025a522ebf4eaa663d717d917d6833d6b0ea39460 BNB
0xe441204d11b87de315dbb0dd8a3baaff9e1318917ca9c00890c9cdc0a01933a1156235652022-01-06 10:23:0811 days 15 hrs ago 0x132a39366ec1c9541a7f782edf602f2d84e19a87 0xc9f654d481e79d01448030b08516b7f9fcf71e130 BNB
0xe441204d11b87de315dbb0dd8a3baaff9e1318917ca9c00890c9cdc0a01933a1156235652022-01-06 10:23:0811 days 15 hrs ago 0x132a39366ec1c9541a7f782edf602f2d84e19a87 0x025a522ebf4eaa663d717d917d6833d6b0ea39460 BNB
0xa160f2f48a97789d06221da034bd4e960d6baa60fb65a34ec1392e0809088e07156235382022-01-06 10:21:4711 days 15 hrs ago 0x132a39366ec1c9541a7f782edf602f2d84e19a87 0xc9f654d481e79d01448030b08516b7f9fcf71e130 BNB
0xa160f2f48a97789d06221da034bd4e960d6baa60fb65a34ec1392e0809088e07156235382022-01-06 10:21:4711 days 15 hrs ago 0x132a39366ec1c9541a7f782edf602f2d84e19a87 0x025a522ebf4eaa663d717d917d6833d6b0ea39460 BNB
0xe35caee7a9f78ba567fd57aded89a2cd81e2426f2bda48de2f9237215c042378156235142022-01-06 10:20:3511 days 15 hrs ago 0x132a39366ec1c9541a7f782edf602f2d84e19a87 0xc9f654d481e79d01448030b08516b7f9fcf71e130 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Farm

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-10-28
*/

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.2.0/contracts/GSN/Context.sol
pragma solidity ^0.6.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.2.0/contracts/access/Ownable.sol
pragma solidity ^0.6.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

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

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

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.2.0/contracts/utils/EnumerableSet.sol
pragma solidity ^0.6.0;

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

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

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

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

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

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

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

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

            bytes32 lastvalue = set._values[lastIndex];

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

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

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

            return true;
        } else {
            return false;
        }
    }

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

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

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

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

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

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

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

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

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


    // UintSet

    struct UintSet {
        Set _inner;
    }

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.2.0/contracts/utils/Address.sol
pragma solidity ^0.6.2;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.2.0/contracts/math/SafeMath.sol
pragma solidity ^0.6.0;

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

        return c;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.2.0/contracts/token/ERC20/SafeERC20.sol
pragma solidity ^0.6.0;




/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for 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");
        }
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.2.0/contracts/token/ERC20/IERC20.sol
pragma solidity ^0.6.0;

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

pragma solidity 0.6.12;
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () internal {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// Farm distributes the ERC20 rewards based on staked LP to each user.
//
// Cloned from https://github.com/SashimiProject/sashimiswap/blob/master/contracts/MasterChef.sol
// Modified by Manhattan Finance to work for non-mintable ERC20.


// SPDX-License-Identifier: MIT

contract Farm is Ownable, ReentrancyGuard {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

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

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

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

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

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

    // Deposit Fee address
    address public feeAddress;

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

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

    function setFeeAddress(address _feeAddress) public {
        require(msg.sender == feeAddress, "setFeeAddress: FORBIDDEN");
        feeAddress = _feeAddress;
    }

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

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

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

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

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

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

    // View function to see pending ERC20s for a user.
    function pending(uint256 _pid, address _user) external view returns (uint256) {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        uint256 accERC20PerShare = pool.accERC20PerShare;
        uint256 lpSupply = pool.lpToken.balanceOf(address(this));

        if (block.number > pool.lastRewardBlock && lpSupply != 0) {
            uint256 lastBlock = block.number < endBlock ? block.number : endBlock;
            uint256 nrOfBlocks = lastBlock.sub(pool.lastRewardBlock);
            uint256 erc20Reward = nrOfBlocks.mul(rewardPerBlock).mul(pool.allocPoint).div(totalAllocPoint);
            accERC20PerShare = accERC20PerShare.add(erc20Reward.mul(1e12).div(lpSupply));
        }

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

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

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

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

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

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

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

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

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

        if (_amount > 0) {
            pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount);
            if (pool.depositFeeBP > 0) {
                uint256 depositFee = _amount.mul(pool.depositFeeBP).div(10000);
                pool.lpToken.safeTransfer(feeAddress, depositFee);
                user.amount = user.amount.add(_amount).sub(depositFee);
            } else {
                user.amount = user.amount.add(_amount);
            }
        }
        user.rewardDebt = user.amount.mul(pool.accERC20PerShare).div(1e12);
        emit Deposit(msg.sender, _pid, _amount);
    }

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

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

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

Contract ABI

[{"inputs":[{"internalType":"contract IERC20","name":"_erc20","type":"address"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"address","name":"_feeAddress","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":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"},{"internalType":"uint16","name":"_depositFeeBP","type":"uint16"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"deposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"erc20","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"fund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paidOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pending","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accERC20PerShare","type":"uint256"},{"internalType":"uint16","name":"depositFeeBP","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPending","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600355600060075534801561001a57600080fd5b50604051611aaf380380611aaf8339818101604052608081101561003d57600080fd5b5080516020820151604083015160609093015191929091600061005e6100ee565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060018055600280546001600160a01b039586166001600160a01b0319918216179091556004939093556008829055600991909155600a80549190931691161790556100f2565b3390565b6119ae806101016000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c8063630b5ba1116100de5780638da5cb5b11610097578063ca1d209d11610071578063ca1d209d146103bb578063e2bbb158146103d8578063e4c75c27146103fb578063f2fde38b1461042757610173565b80638da5cb5b1461034257806393f1a40b1461034a578063a23831061461038f57610173565b8063630b5ba1146102d157806364482f79146102d9578063715018a614610304578063785e9e861461030c5780638705fcd4146103145780638ae39cac1461033a57610173565b8063441a3e7011610130578063441a3e701461022457806347a55b7c1461024957806348cd4cb11461028757806351eb05a61461028f5780635312ea8e146102ac5780635c76ca2d146102c957610173565b8063081e3eda14610178578063083c6323146101925780631526fe271461019a57806317caf6f1146101f05780633f90916a146101f85780634127535814610200575b600080fd5b61018061044d565b60408051918252519081900360200190f35b610180610454565b6101b7600480360360208110156101b057600080fd5b503561045a565b604080516001600160a01b039096168652602086019490945284840192909252606084015261ffff166080830152519081900360a00190f35b6101806104a6565b6101806104ac565b610208610501565b604080516001600160a01b039092168252519081900360200190f35b6102476004803603604081101561023a57600080fd5b5080359060200135610510565b005b6102476004803603608081101561025f57600080fd5b5080359060208101356001600160a01b03169060408101351515906060013561ffff166106b6565b6101806108be565b610247600480360360208110156102a557600080fd5b50356108c4565b610247600480360360208110156102c257600080fd5b5035610a15565b610180610b12565b610247610b18565b610247600480360360608110156102ef57600080fd5b50803590602081013590604001351515610b3b565b610247610c0c565b610208610cae565b6102476004803603602081101561032a57600080fd5b50356001600160a01b0316610cbd565b610180610d3e565b610208610d44565b6103766004803603604081101561036057600080fd5b50803590602001356001600160a01b0316610d53565b6040805192835260208301919091528051918290030190f35b610180600480360360408110156103a557600080fd5b50803590602001356001600160a01b0316610d77565b610247600480360360208110156103d157600080fd5b5035610da1565b610247600480360360408110156103ee57600080fd5b5080359060200135610e6b565b6101806004803603604081101561041157600080fd5b50803590602001356001600160a01b0316611041565b6102476004803603602081101561043d57600080fd5b50356001600160a01b03166111c0565b6005545b90565b60095481565b6005818154811061046757fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b0390931694509092909161ffff1685565b60075481565b600060085443116104bf57506000610451565b600060095443106104d2576009546104d4565b435b90506104fb6003546104f560085484036004546112b890919063ffffffff16565b90611318565b91505090565b600a546001600160a01b031681565b60026001541415610568576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260018190555060006005838154811061057f57fe5b6000918252602080832086845260068252604080852033865290925292208054600590920290920192508311156105e75760405162461bcd60e51b815260040180806020018281038252602a815260200180611925602a913960400191505060405180910390fd5b6105f0846108c4565b600061062482600101546104f564e8d4a5100061061e876003015487600001546112b890919063ffffffff16565b9061135a565b9050610630338261139c565b815461063c9085611318565b80835560038401546106599164e8d4a510009161061e91906112b8565b60018301558254610674906001600160a01b0316338661142a565b604080518581529051869133917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a3505060018055505050565b6106be611481565b6000546001600160a01b0390811691161461070e576040805162461bcd60e51b815260206004820181905260248201526000805160206118e3833981519152604482015290519081900360640190fd5b6127108161ffff1611156107535760405162461bcd60e51b81526004018080602001828103825260258152602001806118776025913960400191505060405180910390fd5b811561076157610761610b18565b6000600854431161077457600854610776565b435b6007549091506107869086611485565b6007556040805160a0810182526001600160a01b0395861681526020810196875290810191825260006060820181815261ffff94851660808401908152600580546001810182559381905293517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db09390940292830180546001600160a01b031916949098169390931790965595517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db187015590517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db286015592517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db385015591517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db4909301805461ffff19169390921692909217905550565b60085481565b6000600582815481106108d357fe5b90600052602060002090600502019050600060095443106108f6576009546108f8565b435b90508160020154811161090c575050610a12565b8154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561095657600080fd5b505afa15801561096a573d6000803e3d6000fd5b505050506040513d602081101561098057600080fd5b50519050806109955750600290910155610a12565b60006109ae84600201548461131890919063ffffffff16565b905060006109db60075461061e87600101546109d5600454876112b890919063ffffffff16565b906112b8565b90506109fe6109f38461061e8464e8d4a510006112b8565b600387015490611485565b600386015550504360029093019290925550505b50565b60026001541415610a6d576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600181905550600060058281548110610a8457fe5b60009182526020808320858452600682526040808520338087529352909320805460059093029093018054909450610ac9926001600160a01b0391909116919061142a565b80546040805191825251849133917fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959181900360200190a3600080825560019182015580555050565b60035481565b60055460005b81811015610b3757610b2f816108c4565b600101610b1e565b5050565b610b43611481565b6000546001600160a01b03908116911614610b93576040805162461bcd60e51b815260206004820181905260248201526000805160206118e3833981519152604482015290519081900360640190fd5b8015610ba157610ba1610b18565b610bde82610bd860058681548110610bb557fe5b90600052602060002090600502016001015460075461131890919063ffffffff16565b90611485565b6007819055508160058481548110610bf257fe5b906000526020600020906005020160010181905550505050565b610c14611481565b6000546001600160a01b03908116911614610c64576040805162461bcd60e51b815260206004820181905260248201526000805160206118e3833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6002546001600160a01b031681565b600a546001600160a01b03163314610d1c576040805162461bcd60e51b815260206004820152601860248201527f736574466565416464726573733a20464f5242494444454e0000000000000000604482015290519081900360640190fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60045481565b6000546001600160a01b031690565b60066020908152600092835260408084209091529082529020805460019091015482565b60008281526006602090815260408083206001600160a01b03851684529091529020545b92915050565b610da9611481565b6000546001600160a01b03908116911614610df9576040805162461bcd60e51b815260206004820181905260248201526000805160206118e3833981519152604482015290519081900360640190fd5b6009544310610e395760405162461bcd60e51b81526004018080602001828103825260228152602001806119036022913960400191505060405180910390fd5b600254610e51906001600160a01b03163330846114df565b600454610e5f90829061135a565b60098054909101905550565b60026001541415610ec3576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600181905550600060058381548110610eda57fe5b60009182526020808320868452600682526040808520338652909252922060059091029091019150610f0b846108c4565b805415610f4e576000610f4082600101546104f564e8d4a5100061061e876003015487600001546112b890919063ffffffff16565b9050610f4c338261139c565b505b8215610fe0578154610f6b906001600160a01b03163330866114df565b600482015461ffff1615610fd1576004820154600090610f98906127109061061e90879061ffff166112b8565b600a548454919250610fb7916001600160a01b0390811691168361142a565b8154610fc99082906104f59087611485565b825550610fe0565b8054610fdd9084611485565b81555b60038201548154610ffb9164e8d4a510009161061e916112b8565b6001820155604080518481529051859133917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159181900360200190a35050600180555050565b6000806005848154811061105157fe5b600091825260208083208784526006825260408085206001600160a01b0389811687529084528186206005959095029092016003810154815483516370a0823160e01b815230600482015293519298509596909590949316926370a082319260248082019391829003018186803b1580156110cb57600080fd5b505afa1580156110df573d6000803e3d6000fd5b505050506040513d60208110156110f557600080fd5b505160028501549091504311801561110c57508015155b1561118d576000600954431061112457600954611126565b435b9050600061114186600201548361131890919063ffffffff16565b9050600061116860075461061e89600101546109d5600454876112b890919063ffffffff16565b90506111876111808561061e8464e8d4a510006112b8565b8690611485565b94505050505b6111b583600101546104f564e8d4a5100061061e8688600001546112b890919063ffffffff16565b979650505050505050565b6111c8611481565b6000546001600160a01b03908116911614611218576040805162461bcd60e51b815260206004820181905260248201526000805160206118e3833981519152604482015290519081900360640190fd5b6001600160a01b03811661125d5760405162461bcd60e51b815260040180806020018281038252602681526020018061189c6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000826112c757506000610d9b565b828202828482816112d457fe5b04146113115760405162461bcd60e51b81526004018080602001828103825260218152602001806118c26021913960400191505060405180910390fd5b9392505050565b600061131183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061153f565b600061131183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506115d6565b6002546040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156113f257600080fd5b505af1158015611406573d6000803e3d6000fd5b505050506040513d602081101561141c57600080fd5b505060038054909101905550565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261147c90849061163b565b505050565b3390565b600082820183811015611311576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261153990859061163b565b50505050565b600081848411156115ce5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561159357818101518382015260200161157b565b50505050905090810190601f1680156115c05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836116255760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561159357818101518382015260200161157b565b50600083858161163157fe5b0495945050505050565b6060611690826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166116ec9092919063ffffffff16565b80519091501561147c578080602001905160208110156116af57600080fd5b505161147c5760405162461bcd60e51b815260040180806020018281038252602a81526020018061194f602a913960400191505060405180910390fd5b60606116fb8484600085611703565b949350505050565b606061170e85611870565b61175f576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061179e5780518252601f19909201916020918201910161177f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611800576040519150601f19603f3d011682016040523d82523d6000602084013e611805565b606091505b509150915081156118195791506116fb9050565b8051156118295780518082602001fd5b60405162461bcd60e51b815260206004820181815286516024840152865187939192839260440191908501908083836000831561159357818101518382015260200161157b565b3b15159056fe6164643a20696e76616c6964206465706f7369742066656520626173697320706f696e74734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657266756e643a20746f6f206c6174652c20746865206661726d20697320636c6f73656477697468647261773a2063616e2774207769746864726177206d6f7265207468616e206465706f7369745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122062b393edfb032cbcd1c5678b2801c9ca0515e2389bbaae5aa0c0677cdc78653c64736f6c634300060c0033000000000000000000000000025a522ebf4eaa663d717d917d6833d6b0ea394600000000000000000000000000000000000000000000000029a2241af62c00000000000000000000000000000000000000000000000000000000000000d05787000000000000000000000000c205eed63cd1a066e54c6fe64acb8eeb17190663

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

000000000000000000000000025a522ebf4eaa663d717d917d6833d6b0ea394600000000000000000000000000000000000000000000000029a2241af62c00000000000000000000000000000000000000000000000000000000000000d05787000000000000000000000000c205eed63cd1a066e54c6fe64acb8eeb17190663
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000025a522ebf4eaa663d717d917d6833d6b0ea3946
Arg [1] : 00000000000000000000000000000000000000000000000029a2241af62c0000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000d05787
Arg [3] : 000000000000000000000000c205eed63cd1a066e54c6fe64acb8eeb17190663


Deployed ByteCode Sourcemap

31826:9711:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34780:95;;;:::i;:::-;;;;;;;;;;;;;;;;33947:23;;;:::i;33539:26::-;;;;;;;;;;;;;;;;-1:-1:-1;33539:26:0;;:::i;:::-;;;;-1:-1:-1;;;;;33539:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33782:34;;;:::i;37637:296::-;;;:::i;34007:25::-;;;:::i;:::-;;;;-1:-1:-1;;;;;34007:25:0;;;;;;;;;;;;;;40173:700;;;;;;;;;;;;;;;;-1:-1:-1;40173:700:0;;;;;;;:::i;:::-;;35361:662;;;;;;;;;;;;;;;;-1:-1:-1;35361:662:0;;;;;;;-1:-1:-1;;;;;35361:662:0;;;;;;;;;;;;;;;:::i;33871:25::-;;;:::i;38272:757::-;;;;;;;;;;;;;;;;-1:-1:-1;38272:757:0;;:::i;40944:369::-;;;;;;;;;;;;;;;;-1:-1:-1;40944:369:0;;:::i;33400:26::-;;;:::i;38016:180::-;;;:::i;36120:304::-;;;;;;;;;;;;;;;;-1:-1:-1;36120:304:0;;;;;;;;;;;;;;:::i;2826:148::-;;;:::i;33313:19::-;;;:::i;34579:166::-;;;;;;;;;;;;;;;;-1:-1:-1;34579:166:0;-1:-1:-1;;;;;34579:166:0;;:::i;33474:29::-;;;:::i;2184:79::-;;;:::i;33621:66::-;;;;;;;;;;;;;;;;-1:-1:-1;33621:66:0;;;;;;-1:-1:-1;;;;;33621:66:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36486:173;;;;;;;;;;;;;;;;-1:-1:-1;36486:173:0;;;;;;-1:-1:-1;;;;;36486:173:0;;:::i;34929:267::-;;;;;;;;;;;;;;;;-1:-1:-1;34929:267:0;;:::i;39093:1034::-;;;;;;;;;;;;;;;;-1:-1:-1;39093:1034:0;;;;;;;:::i;36723:838::-;;;;;;;;;;;;;;;;-1:-1:-1;36723:838:0;;;;;;-1:-1:-1;;;;;36723:838:0;;:::i;3129:244::-;;;;;;;;;;;;;;;;-1:-1:-1;3129:244:0;-1:-1:-1;;;;;3129:244:0;;:::i;34780:95::-;34852:8;:15;34780:95;;:::o;33947:23::-;;;;:::o;33539:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33539:26:0;;;;-1:-1:-1;33539:26:0;;;;;;;:::o;33782:34::-;;;;:::o;37637:296::-;37684:7;37724:10;;37708:12;:26;37704:67;;-1:-1:-1;37758:1:0;37751:8;;37704:67;37783:17;37818:8;;37803:12;:23;:49;;37844:8;;37803:49;;;37829:12;37803:49;37783:69;;37870:55;37917:7;;37870:42;37901:10;;37889:9;:22;37870:14;;:18;;:42;;;;:::i;:::-;:46;;:55::i;:::-;37863:62;;;37637:296;:::o;34007:25::-;;;-1:-1:-1;;;;;34007:25:0;;:::o;40173:700::-;30591:1;31197:7;;:19;;31189:63;;;;;-1:-1:-1;;;31189:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30591:1;31330:7;:18;;;;40253:21:::1;40277:8;40286:4;40277:14;;;;;;;;;::::0;;;::::1;::::0;;;40326;;;:8:::1;:14:::0;;;;;;40341:10:::1;40326:26:::0;;;;;;;40371:11;;40277:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;40371:22:0;-1:-1:-1;40371:22:0::1;40363:77;;;;-1:-1:-1::0;;;40363:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40451:16;40462:4;40451:10;:16::i;:::-;40478:21;40502:69;40555:4;:15;;;40502:48;40545:4;40502:38;40518:4;:21;;;40502:4;:11;;;:15;;:38;;;;:::i;:::-;:42:::0;::::1;:48::i;:69::-;40478:93;;40582:40;40596:10;40608:13;40582;:40::i;:::-;40647:11:::0;;:24:::1;::::0;40663:7;40647:15:::1;:24::i;:::-;40633:38:::0;;;40716:21:::1;::::0;::::1;::::0;40700:48:::1;::::0;40743:4:::1;::::0;40700:38:::1;::::0;40633;40700:15:::1;:38::i;:48::-;40682:15;::::0;::::1;:66:::0;40759:12;;:55:::1;::::0;-1:-1:-1;;;;;40759:12:0::1;40793:10;40806:7:::0;40759:25:::1;:55::i;:::-;40830:35;::::0;;;;;;;40851:4;;40839:10:::1;::::0;40830:35:::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;;30547:1:0;31509:22;;-1:-1:-1;;;40173:700:0:o;35361:662::-;2406:12;:10;:12::i;:::-;2396:6;;-1:-1:-1;;;;;2396:6:0;;;:22;;;2388:67;;;;;-1:-1:-1;;;2388:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2388:67:0;;;;;;;;;;;;;;;35505:5:::1;35488:13;:22;;;;35480:72;;;;-1:-1:-1::0;;;35480:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35567:11;35563:61;;;35595:17;:15;:17::i;:::-;35634:23;35675:10;;35660:12;:25;:53;;35703:10;;35660:53;;;35688:12;35660:53;35742:15;::::0;35634:79;;-1:-1:-1;35742:32:0::1;::::0;35762:11;35742:19:::1;:32::i;:::-;35724:15;:50:::0;35799:215:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;35799:215:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;35799:215:0;;;;;;::::1;::::0;;::::1;::::0;;;;;;35785:8:::1;:230:::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;35785:230:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35785:230:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;35361:662:0:o;33871:25::-;;;;:::o;38272:757::-;38324:21;38348:8;38357:4;38348:14;;;;;;;;;;;;;;;;;;38324:38;;38373:17;38408:8;;38393:12;:23;:49;;38434:8;;38393:49;;;38419:12;38393:49;38373:69;;38472:4;:20;;;38459:9;:33;38455:72;;38509:7;;;;38455:72;38556:12;;:37;;;-1:-1:-1;;;38556:37:0;;38587:4;38556:37;;;;;;38537:16;;-1:-1:-1;;;;;38556:12:0;;:22;;:37;;;;;;;;;;;;;;:12;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38556:37:0;;-1:-1:-1;38608:13:0;38604:99;;-1:-1:-1;38638:20:0;;;;:32;38685:7;;38604:99;38715:18;38736:35;38750:4;:20;;;38736:9;:13;;:35;;;;:::i;:::-;38715:56;;38782:19;38804:72;38860:15;;38804:51;38839:4;:15;;;38804:30;38819:14;;38804:10;:14;;:30;;;;:::i;:::-;:34;;:51::i;:72::-;38782:94;-1:-1:-1;38913:62:0;38939:35;38965:8;38939:21;38782:94;38955:4;38939:15;:21::i;:35::-;38913:21;;;;;:25;:62::i;:::-;38889:21;;;:86;-1:-1:-1;;39009:12:0;38986:20;;;;:35;;;;-1:-1:-1;;38272:757:0;;:::o;40944:369::-;30591:1;31197:7;;:19;;31189:63;;;;;-1:-1:-1;;;31189:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30591:1;31330:7;:18;;;;41016:21:::1;41040:8;41049:4;41040:14;;;;;;;;;::::0;;;::::1;::::0;;;41089;;;:8:::1;:14:::0;;;;;;41104:10:::1;41089:26:::0;;;;;;;;41173:11;;41040:14:::1;::::0;;::::1;::::0;;::::1;41126:12:::0;;41040:14;;-1:-1:-1;41126:59:0::1;::::0;-1:-1:-1;;;;;41126:12:0;;;::::1;::::0;41104:10;41126:25:::1;:59::i;:::-;41237:11:::0;;41201:48:::1;::::0;;;;;;41231:4;;41219:10:::1;::::0;41201:48:::1;::::0;;;;::::1;::::0;;::::1;41274:1;41260:15:::0;;;41286::::1;::::0;;::::1;:19:::0;31509:22;;-1:-1:-1;;40944:369:0:o;33400:26::-;;;;:::o;38016:180::-;38078:8;:15;38061:14;38104:85;38132:6;38126:3;:12;38104:85;;;38162:15;38173:3;38162:10;:15::i;:::-;38140:5;;38104:85;;;;38016:180;:::o;36120:304::-;2406:12;:10;:12::i;:::-;2396:6;;-1:-1:-1;;;;;2396:6:0;;;:22;;;2388:67;;;;;-1:-1:-1;;;2388:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2388:67:0;;;;;;;;;;;;;;;36218:11:::1;36214:61;;;36246:17;:15;:17::i;:::-;36303:63;36354:11;36303:46;36323:8;36332:4;36323:14;;;;;;;;;;;;;;;;;;:25;;;36303:15;;:19;;:46;;;;:::i;:::-;:50:::0;::::1;:63::i;:::-;36285:15;:81;;;;36405:11;36377:8;36386:4;36377:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;36120:304:::0;;;:::o;2826:148::-;2406:12;:10;:12::i;:::-;2396:6;;-1:-1:-1;;;;;2396:6:0;;;:22;;;2388:67;;;;;-1:-1:-1;;;2388:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2388:67:0;;;;;;;;;;;;;;;2933:1:::1;2917:6:::0;;2896:40:::1;::::0;-1:-1:-1;;;;;2917:6:0;;::::1;::::0;2896:40:::1;::::0;2933:1;;2896:40:::1;2964:1;2947:19:::0;;-1:-1:-1;;;;;;2947:19:0::1;::::0;;2826:148::o;33313:19::-;;;-1:-1:-1;;;;;33313:19:0;;:::o;34579:166::-;34663:10;;-1:-1:-1;;;;;34663:10:0;34649;:24;34641:61;;;;;-1:-1:-1;;;34641:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34713:10;:24;;-1:-1:-1;;;;;;34713:24:0;-1:-1:-1;;;;;34713:24:0;;;;;;;;;;34579:166::o;33474:29::-;;;;:::o;2184:79::-;2222:7;2249:6;-1:-1:-1;;;;;2249:6:0;2184:79;:::o;33621:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36486:173::-;36557:7;36601:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;36601:21:0;;;;;;;;;36640:11;36486:173;;;;;:::o;34929:267::-;2406:12;:10;:12::i;:::-;2396:6;;-1:-1:-1;;;;;2396:6:0;;;:22;;;2388:67;;;;;-1:-1:-1;;;2388:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2388:67:0;;;;;;;;;;;;;;;35011:8:::1;;34996:12;:23;34988:70;;;;-1:-1:-1::0;;;34988:70:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35071:5;::::0;:67:::1;::::0;-1:-1:-1;;;;;35071:5:0::1;35102:10;35123:4;35130:7:::0;35071:22:::1;:67::i;:::-;35173:14;::::0;35161:27:::1;::::0;:7;;:11:::1;:27::i;:::-;35149:8;:39:::0;;;;::::1;::::0;;-1:-1:-1;34929:267:0:o;39093:1034::-;30591:1;31197:7;;:19;;31189:63;;;;;-1:-1:-1;;;31189:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30591:1;31330:7;:18;;;;39172:21:::1;39196:8;39205:4;39196:14;;;;;;;;;::::0;;;::::1;::::0;;;39245;;;:8:::1;:14:::0;;;;;;39260:10:::1;39245:26:::0;;;;;;;39196:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;39282:16:0::1;39254:4:::0;39282:10:::1;:16::i;:::-;39313:11:::0;;:15;39309:196:::1;;39345:21;39369:69;39422:4;:15;;;39369:48;39412:4;39369:38;39385:4;:21;;;39369:4;:11;;;:15;;:38;;;;:::i;:69::-;39345:93;;39453:40;39467:10;39479:13;39453;:40::i;:::-;39309:196;;39521:11:::0;;39517:476:::1;;39549:12:::0;;:74:::1;::::0;-1:-1:-1;;;;;39549:12:0::1;39587:10;39608:4;39615:7:::0;39549:29:::1;:74::i;:::-;39642:17;::::0;::::1;::::0;::::1;;:21:::0;39638:344:::1;;39717:17;::::0;::::1;::::0;39684:18:::1;::::0;39705:41:::1;::::0;39740:5:::1;::::0;39705:30:::1;::::0;:7;;39717:17:::1;;39705:11;:30::i;:41::-;39791:10;::::0;39765:12;;39684:62;;-1:-1:-1;39765:49:0::1;::::0;-1:-1:-1;;;;;39765:12:0;;::::1;::::0;39791:10:::1;39684:62:::0;39765:25:::1;:49::i;:::-;39847:11:::0;;:40:::1;::::0;39876:10;;39847:24:::1;::::0;39863:7;39847:15:::1;:24::i;:40::-;39833:54:::0;;-1:-1:-1;39638:344:0::1;;;39942:11:::0;;:24:::1;::::0;39958:7;39942:15:::1;:24::i;:::-;39928:38:::0;;39638:344:::1;40037:21;::::0;::::1;::::0;40021:11;;:48:::1;::::0;40064:4:::1;::::0;40021:38:::1;::::0;:15:::1;:38::i;:48::-;40003:15;::::0;::::1;:66:::0;40085:34:::1;::::0;;;;;;;40105:4;;40093:10:::1;::::0;40085:34:::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;;30547:1:0;31509:22;;-1:-1:-1;;39093:1034:0:o;36723:838::-;36792:7;36812:21;36836:8;36845:4;36836:14;;;;;;;;;;;;;;;;36885;;;:8;:14;;;;;;-1:-1:-1;;;;;36885:21:0;;;;;;;;;;;36836:14;;;;;;;;36944:21;;;;36995:12;;:37;;-1:-1:-1;;;36995:37:0;;37026:4;36995:37;;;;;;36836:14;;-1:-1:-1;36885:21:0;;36944;;36836:14;;36995:12;;;:22;;:37;;;;;;;;;;;:12;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36995:37:0;37064:20;;;;36995:37;;-1:-1:-1;37049:12:0;:35;:52;;;;-1:-1:-1;37088:13:0;;;37049:52;37045:425;;;37118:17;37153:8;;37138:12;:23;:49;;37179:8;;37138:49;;;37164:12;37138:49;37118:69;;37202:18;37223:35;37237:4;:20;;;37223:9;:13;;:35;;;;:::i;:::-;37202:56;;37273:19;37295:72;37351:15;;37295:51;37330:4;:15;;;37295:30;37310:14;;37295:10;:14;;:30;;;;:::i;:72::-;37273:94;-1:-1:-1;37401:57:0;37422:35;37448:8;37422:21;37273:94;37438:4;37422:15;:21::i;:35::-;37401:16;;:20;:57::i;:::-;37382:76;;37045:425;;;;37489:64;37537:4;:15;;;37489:43;37527:4;37489:33;37505:16;37489:4;:11;;;:15;;:33;;;;:::i;:64::-;37482:71;36723:838;-1:-1:-1;;;;;;;36723:838:0:o;3129:244::-;2406:12;:10;:12::i;:::-;2396:6;;-1:-1:-1;;;;;2396:6:0;;;:22;;;2388:67;;;;;-1:-1:-1;;;2388:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2388:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;3218:22:0;::::1;3210:73;;;;-1:-1:-1::0;;;3210:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3320:6;::::0;;3299:38:::1;::::0;-1:-1:-1;;;;;3299:38:0;;::::1;::::0;3320:6;::::1;::::0;3299:38:::1;::::0;::::1;3348:6;:17:::0;;-1:-1:-1;;;;;;3348:17:0::1;-1:-1:-1::0;;;;;3348:17:0;;;::::1;::::0;;;::::1;::::0;;3129:244::o;19932:471::-;19990:7;20235:6;20231:47;;-1:-1:-1;20265:1:0;20258:8;;20231:47;20302:5;;;20306:1;20302;:5;:1;20326:5;;;;;:10;20318:56;;;;-1:-1:-1;;;20318:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20394:1;19932:471;-1:-1:-1;;;19932:471:0:o;19042:136::-;19100:7;19127:43;19131:1;19134;19127:43;;;;;;;;;;;;;;;;;:3;:43::i;20879:132::-;20937:7;20964:39;20968:1;20971;20964:39;;;;;;;;;;;;;;;;;:3;:39::i;41396:138::-;41469:5;;:28;;;-1:-1:-1;;;41469:28:0;;-1:-1:-1;;;;;41469:28:0;;;;;;;;;;;;;;;:5;;;;;:14;;:28;;;;;;;;;;;;;;:5;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41508:7:0;:18;;;;;;;-1:-1:-1;41396:138:0:o;23751:177::-;23861:58;;;-1:-1:-1;;;;;23861:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23861:58:0;-1:-1:-1;;;23861:58:0;;;23834:86;;23854:5;;23834:19;:86::i;:::-;23751:177;;;:::o;681:106::-;769:10;681:106;:::o;18578:181::-;18636:7;18668:5;;;18692:6;;;;18684:46;;;;;-1:-1:-1;;;18684:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;23936:205;24064:68;;;-1:-1:-1;;;;;24064:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24064:68:0;-1:-1:-1;;;24064:68:0;;;24037:96;;24057:5;;24037:19;:96::i;:::-;23936:205;;;;:::o;19481:192::-;19567:7;19603:12;19595:6;;;;19587:29;;;;-1:-1:-1;;;19587:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;19639:5:0;;;19481:192::o;21507:278::-;21593:7;21628:12;21621:5;21613:28;;;;-1:-1:-1;;;21613:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21652:9;21668:1;21664;:5;;;;;;;21507:278;-1:-1:-1;;;;;21507:278:0:o;26056:761::-;26480:23;26506:69;26534:4;26506:69;;;;;;;;;;;;;;;;;26514:5;-1:-1:-1;;;;;26506:27:0;;;:69;;;;;:::i;:::-;26590:17;;26480:95;;-1:-1:-1;26590:21:0;26586:224;;26732:10;26721:30;;;;;;;;;;;;;;;-1:-1:-1;26721:30:0;26713:85;;;;-1:-1:-1;;;26713:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15235:196;15338:12;15370:53;15393:6;15401:4;15407:1;15410:12;15370:22;:53::i;:::-;15363:60;15235:196;-1:-1:-1;;;;15235:196:0:o;16612:979::-;16742:12;16775:18;16786:6;16775:10;:18::i;:::-;16767:60;;;;;-1:-1:-1;;;16767:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16901:12;16915:23;16942:6;-1:-1:-1;;;;;16942:11:0;16962:8;16973:4;16942:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16942:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16900:78;;;;16993:7;16989:595;;;17024:10;-1:-1:-1;17017:17:0;;-1:-1:-1;17017:17:0;16989:595;17138:17;;:21;17134:439;;17401:10;17395:17;17462:15;17449:10;17445:2;17441:19;17434:44;17349:148;17537:20;;-1:-1:-1;;;17537:20:0;;;;;;;;;;;;;;;;;17544:12;;17537:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12317:422;12684:20;12723:8;;;12317:422::o

Swarm Source

ipfs://62b393edfb032cbcd1c5678b2801c9ca0515e2389bbaae5aa0c0677cdc78653c
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading