Contract 0x07306aCcCB482C8619e7ed119dAA2BDF2b4389D0 2

 

Contract Overview

Balance:
0 Ether

EtherValue:
$0.00

Token:
Txn Hash
Method
Block
From
To
Value
0x2a7a03e4b7af884aac0a96e7e2052d379251a9b64572230f84eee79db79fcf32Deposit156486052022-09-30 20:41:232 hrs 54 mins agoENS Name dvp202.eth IN  0x07306acccb482c8619e7ed119daa2bdf2b4389d00 Ether0.00499535 22.67793307
0x59e1ed696c2db6d4155545ab696899d070c5c556e5b1b3e63caeb8e5911f3268Deposit156354272022-09-29 0:29:591 day 23 hrs ago0xc8867663a3190244f434955cca7764e943b608aa IN  0x07306acccb482c8619e7ed119daa2bdf2b4389d00 Ether0.00164567 8.09982013
0x25bfaad71ad255ae74dbf5d068f552a1629fb1c8a2b174841090ce69e2373c1eDeposit156354272022-09-29 0:29:591 day 23 hrs ago0xc8867663a3190244f434955cca7764e943b608aa IN  0x07306acccb482c8619e7ed119daa2bdf2b4389d00 Ether0.00164628 7.19569523
0x55ad60fe30ffe71677b8ebfaa22d43346e78acfd1470cd3623c9a33822338201Deposit156328772022-09-28 15:57:232 days 7 hrs ago0xb89039a9e26388967b7b1a87b872318f102cbdd3 IN  0x07306acccb482c8619e7ed119daa2bdf2b4389d00 Ether0.00312455 14.18484537
0x72f079532fe398efc108b91d30e1c63f5ed0e353fbaf621221479c674c105bffDeposit156095552022-09-25 9:41:115 days 13 hrs ago0x8adace41ec579423f149d7402f282301fcfaff36 IN  0x07306acccb482c8619e7ed119daa2bdf2b4389d00 Ether0.00137918 6.35000046
0x600192bf57658bc024ed27041c1754592fa4523982ea7278fda27208a09459f3Deposit156067292022-09-25 0:13:595 days 23 hrs agoENS Name dvp202.eth IN  0x07306acccb482c8619e7ed119daa2bdf2b4389d00 Ether0.00129353 5.87241186
0x613ddbc6d8745632e47cdf032ee0f11c6dfbf1647187173f647799e74fcd034fDeposit156024332022-09-24 9:50:356 days 13 hrs ago0x3843377c1617c909e0044ea3bbd050f62737f316 IN  0x07306acccb482c8619e7ed119daa2bdf2b4389d00 Ether0.00147013 5.69222499
0x677a3e4fa2defd5578b7edc0e7a1d745186f9e8ed2d59e42d88690de10ebb716Deposit156024082022-09-24 9:45:356 days 13 hrs ago0x3843377c1617c909e0044ea3bbd050f62737f316 IN  0x07306acccb482c8619e7ed119daa2bdf2b4389d00 Ether0.00109384 5.25002862
0xce34d52e9171415abecaec82d14bc87c758b2d8e7c0c94c84a0015ddfddd70f3Deposit155857232022-09-22 1:51:238 days 21 hrs ago0xc8867663a3190244f434955cca7764e943b608aa IN  0x07306acccb482c8619e7ed119daa2bdf2b4389d00 Ether0.00118048 5.28150587
0xf89aba00d0cda63719b4114d4e764c5d0174a3c625c5034d706bc5bdcae35b94Deposit155841332022-09-21 20:30:479 days 3 hrs agoENS Name dvp202.eth IN  0x07306acccb482c8619e7ed119daa2bdf2b4389d00 Ether0.0033982 15.42716153
0xe7d3b8345de6da63dbb23149652616c16d0734e3571f338b0a27ca7d699be861Deposit155553912022-09-17 19:30:1113 days 4 hrs agoENS Name dvp202.eth IN  0x07306acccb482c8619e7ed119daa2bdf2b4389d00 Ether0.00133454 6.05855538
0x81aa055fa787a8eb87de1a16e7e085db999f5136caa4f7257508f470268e51fdDeposit155427552022-09-16 0:51:5914 days 22 hrs ago0xc8867663a3190244f434955cca7764e943b608aa IN  0x07306acccb482c8619e7ed119daa2bdf2b4389d00 Ether0.00161884 6.26802454
0x628cfc4875c29f72a7dd8530cb6528b6ba91951b0c520d7b3d609e13f29b78c7Deposit155427372022-09-16 0:48:2314 days 22 hrs ago0xc8867663a3190244f434955cca7764e943b608aa IN  0x07306acccb482c8619e7ed119daa2bdf2b4389d00 Ether0.00148381 6.48556577
0x97faaf6da62d84c14329bad1dfe17c00c0d797621d147e0266e96723adda6919Deposit155355432022-09-14 23:04:5116 days 30 mins agoENS Name dvp202.eth IN  0x07306acccb482c8619e7ed119daa2bdf2b4389d00 Ether0.00257598 11.69443593
0xaa90edbcc02eb5203746f5d1b6552da986509f4c2308b7058cb67d024b423451Withdraw155319592022-09-14 8:36:3916 days 14 hrs ago0x7d1b68ae2665b99369e39e6bc722c127f24efeb7 IN  0x07306acccb482c8619e7ed119daa2bdf2b4389d00 Ether0.00179746 10.93692233
0x51be7542c530375a78545c3c4a8d70f0008c05d41e5cc71173a775426f1f7354Withdraw155088282022-09-10 12:33:4520 days 11 hrs ago0xecab3ed0d13c9172f54d433106ece2a8aa0e674a IN  0x07306acccb482c8619e7ed119daa2bdf2b4389d00 Ether0.00221519 8.9745081
0x8ab9600da81856d42e39abc6550eb867ebd19889fb0d9c594693a813c53cfd2aWithdraw155088262022-09-10 12:32:4020 days 11 hrs ago0xecab3ed0d13c9172f54d433106ece2a8aa0e674a IN  0x07306acccb482c8619e7ed119daa2bdf2b4389d00 Ether0.00124504 7.40642545
0xfb25136ef4d8c59b8b7c46a651f9f1fbed9aea1b679805b6771e43184c08dd3fDeposit155088242022-09-10 12:32:2720 days 11 hrs ago0xecab3ed0d13c9172f54d433106ece2a8aa0e674a IN  0x07306acccb482c8619e7ed119daa2bdf2b4389d00 Ether0.00162861 8.01584088
0xb32fc2f37c90ea0a4d0da51df1b9981f52da47b669b292aefe8a8ad1e1e50389Withdraw155088202022-09-10 12:31:5920 days 11 hrs ago0xecab3ed0d13c9172f54d433106ece2a8aa0e674a IN  0x07306acccb482c8619e7ed119daa2bdf2b4389d00 Ether0.00188431 9.16204938
0x3e2760e9ac583a6840fb1c84feaeda10368e6c59eb8da5f1e2054d70b60fb7baDeposit155066632022-09-10 3:59:3820 days 19 hrs ago0xc8867663a3190244f434955cca7764e943b608aa IN  0x07306acccb482c8619e7ed119daa2bdf2b4389d00 Ether0.00141191 6.94927358
0xab9a288f2d5acb5c2ed4b771a31a0b4593966baba4c5eca4355f71c59e56c39bDeposit155065252022-09-10 3:28:0320 days 20 hrs ago0xc8867663a3190244f434955cca7764e943b608aa IN  0x07306acccb482c8619e7ed119daa2bdf2b4389d00 Ether0.00168944 7.98080339
0x72201e680bbdf4420e0a8b673e1c0f1ba121bd8db1af92f5f947dddf072138d8Deposit155036552022-09-09 16:08:0521 days 7 hrs agoENS Name dvp202.eth IN  0x07306acccb482c8619e7ed119daa2bdf2b4389d00 Ether0.00945277 42.9136952
0xb914f360a3ccaa2ebad9b47784d0bf94857bb293cdaaf3e14e8d1efa870af30fDeposit155012372022-09-09 6:21:2521 days 17 hrs ago0x3d74a3d1e1811f539628c966bcb8d49596551e64 IN  0x07306acccb482c8619e7ed119daa2bdf2b4389d00 Ether0.00253871 12.49528211
0x65f6f196cd91e69df842713cecf2009916ef34038235475e4b785d4733cea8afDeposit154839642022-09-06 12:07:5924 days 11 hrs ago0xb236051287e027a4c5551cbc8300af222bc7fe53 IN  0x07306acccb482c8619e7ed119daa2bdf2b4389d00 Ether0.00122324 6.02065358
0xdeb41b16802a6b318fb2037184457e2dfefd322abd8a7d00dddfea34893fbbf0Deposit154722092022-09-04 14:46:0126 days 8 hrs agoENS Name dvp202.eth IN  0x07306acccb482c8619e7ed119daa2bdf2b4389d00 Ether0.00299655 13.60374954
[ Download CSV Export 
View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
UniclyXUnicVault

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-07-28
*/

// File: @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2 <0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library AddressUpgradeable {
    /**
     * @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);
    }

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

// File: @openzeppelin/contracts-upgradeable/proxy/Initializable.sol



// solhint-disable-next-line compiler-version
pragma solidity >=0.4.24 <0.8.0;


/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 */
abstract contract Initializable {

    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        require(_initializing || _isConstructor() || !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }

    /// @dev Returns true if and only if the function is running in the constructor
    function _isConstructor() private view returns (bool) {
        return !AddressUpgradeable.isContract(address(this));
    }
}

// File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol



pragma solidity >=0.6.0 <0.8.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 ContextUpgradeable is Initializable {
    function __Context_init() internal initializer {
        __Context_init_unchained();
    }

    function __Context_init_unchained() internal initializer {
    }
    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;
    }
    uint256[50] private __gap;
}

// File: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol



pragma solidity >=0.6.0 <0.8.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.
 */
abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    function __Ownable_init() internal initializer {
        __Context_init_unchained();
        __Ownable_init_unchained();
    }

    function __Ownable_init_unchained() internal initializer {
        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;
    }
    uint256[49] private __gap;
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol



pragma solidity >=0.6.0 <0.8.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);
}

// File: @openzeppelin/contracts/math/SafeMath.sol



pragma solidity >=0.6.0 <0.8.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: @openzeppelin/contracts/utils/Address.sol



pragma solidity >=0.6.2 <0.8.0;

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

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

// File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol



pragma solidity >=0.6.0 <0.8.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: contracts/interfaces/IUnicFarm.sol


pragma solidity 0.6.12;


interface IUnicFarm {
    //struct PoolInfo {
        //IERC20 lpToken; // Address of LP token contract.
        //uint256 allocPoint; // How many allocation points assigned to this pool. UNICs to distribute per block.
        //uint256 lastRewardBlock; // Last block number that UNICs distribution occurs.
        //uint256 accUnicPerShare; // Accumulated UNICs per share, times 1e12. See below.
        //address uToken;
    //}

    function pendingUnic(uint256 _pid, address _user) external view returns (uint256);

    function deposit(uint256 _pid, uint256 _amount) external;

    function poolInfo(uint256 _pid) external view returns (IERC20, uint256, uint256, uint256, address);

    function poolLength() external view returns (uint256);

    function withdraw(uint256 _pid, uint256 _amount) external;
}

// File: contracts/interfaces/IUnicGallery.sol


// solhint-disable
pragma solidity 0.6.12;

interface IUnicGallery {
    function enter(uint256 _amount) external;
}

// File: contracts/UniclyXUnicVault.sol


pragma solidity 0.6.12;







contract UniclyXUnicVault is OwnableUpgradeable {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    address public constant XUNIC = address(0xA62fB0c2Fb3C7b27797dC04e1fEA06C0a2Db919a);
    address public constant UNIC = address(0x94E0BAb2F6Ab1F19F4750E42d7349f2740513aD5);
    address public constant UNIC_MASTERCHEF = address(0x4A25E4DF835B605A5848d2DB450fA600d96ee818);

    // Info of each user.
    struct UserInfo {
        uint256 amount; // How many LP tokens the user has provided.
        uint256 rewardDebt; // How much to remove when calculating user shares
    }

    // Info of each pool.
    struct PoolInfo {
        uint256 totalLPTokens; // The total LP tokens staked (we must keep this, see readme file)
        uint256 accXUNICPerShare; //Accumulated UNICs per share, times 1e12
    }

    // Info of each user that stakes LP tokens.
    mapping(uint256 => mapping(address => UserInfo)) public userInfo;

    // Info of each pool.
    mapping(uint256 => PoolInfo) public poolInfo;

    // Gas optimization for approving tokens to unic chef
    mapping(address => bool) public haveApprovedToken;

    address public devaddr;
    // For better precision
    uint256 public devFeeDenominator = 1000;
    // For gas optimization, do not update every pool in do hard work, only the ones that haven't been updated for ~12 hours
    uint256 public  minBlocksToUpdatePoolInDoHardWork = 3600;

    // Events
    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);
    event UpdatePool(uint256 pid);
    event Dev(address devaddr);
    event DoHardWork(uint256 numberOfUpdatedPools);

    function initialize(address _devaddr) external initializer {
        __Ownable_init();
        devaddr = _devaddr;
        IERC20(UNIC).approve(XUNIC, uint256(~0));
    }

    // Withdraw LP tokens from MasterChef.
    function withdraw(uint256 _pid, uint256 _amount) public {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        require(user.amount >= _amount, "withdraw: not good");
        updatePool(_pid);
        uint256 pending = (pool.accXUNICPerShare.mul(user.amount).div(1e12)).sub(user.rewardDebt);
        if (pending > 0) {
            safexUNICTransfer(msg.sender, pending);
        }
        if (_amount > 0) {
            user.amount = user.amount.sub(_amount);
            pool.totalLPTokens = pool.totalLPTokens.sub(_amount);
            IUnicFarm(UNIC_MASTERCHEF).withdraw(_pid, _amount);
            (IERC20 lpToken,,,,) = IUnicFarm(UNIC_MASTERCHEF).poolInfo(_pid);
            lpToken.safeTransfer(address(msg.sender), _amount);
        }
        user.rewardDebt = user.amount.mul(pool.accXUNICPerShare).div(1e12);
        emit Withdraw(msg.sender, _pid, _amount);
    }

    // Deposit LP tokens to MasterChef for unics allocation.
    function deposit(uint256 _pid, uint256 _amount) public {
        depositFor(_pid, _amount, msg.sender);
    }

    // Deposit LP tokens for someone else than msg.sender, mainly for zap functionality
    function depositFor(uint256 _pid, uint256 _amount, address _user) public {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        updatePool(_pid);
        if (user.amount > 0) {
            uint256 pending = (pool.accXUNICPerShare.mul(user.amount).div(1e12)).sub(user.rewardDebt);
            if (pending > 0) {
                safexUNICTransfer(_user, pending);
            }
        }
        if (_amount > 0) {
            (IERC20 lpToken,,,,) = IUnicFarm(UNIC_MASTERCHEF).poolInfo(_pid);
            lpToken.safeTransferFrom(
                address(msg.sender),
                address(this),
                _amount
            );
            if (!haveApprovedToken[address(lpToken)]) {
                lpToken.approve(UNIC_MASTERCHEF, uint256(~0));
                haveApprovedToken[address(lpToken)] = true;
            }
            IUnicFarm(UNIC_MASTERCHEF).deposit(_pid, _amount);
            user.amount = user.amount.add(_amount);
            pool.totalLPTokens = pool.totalLPTokens.add(_amount);
        }
        user.rewardDebt = user.amount.mul(pool.accXUNICPerShare).div(1e12);
        emit Deposit(_user, _pid, _amount);
    }

    function doHardWork() public {
        uint256 numberOfUpdatedPools = 0;
        for (uint256 _pid = 0; _pid < IUnicFarm(UNIC_MASTERCHEF).poolLength(); _pid++) {
            if (poolInfo[_pid].totalLPTokens > 0) {
                (,,uint256 lastRewardBlock,,) = IUnicFarm(UNIC_MASTERCHEF).poolInfo(_pid);
                if (block.number - minBlocksToUpdatePoolInDoHardWork > lastRewardBlock) {
                    numberOfUpdatedPools = numberOfUpdatedPools.add(1);
                    updatePool(_pid);
                }
            }
        }
        emit DoHardWork(numberOfUpdatedPools);
    }

    function updatePool(uint256 _pid) public {
        PoolInfo storage pool = poolInfo[_pid];

        uint256 prevXUNICBalance = IERC20(XUNIC).balanceOf(address(this));
        IUnicFarm(UNIC_MASTERCHEF).deposit(_pid, 0);
        uint256 UNICBalance = IERC20(UNIC).balanceOf(address(this));
        if (UNICBalance > 0 && pool.totalLPTokens > 0) {
            IUnicGallery(XUNIC).enter(UNICBalance);
            uint256 addedXUNICs = IERC20(XUNIC).balanceOf(address(this)).sub(prevXUNICBalance);
            uint256 devAmount = addedXUNICs.mul(100).div(devFeeDenominator); // For better precision
            IERC20(XUNIC).transfer(devaddr, devAmount);
            addedXUNICs = addedXUNICs.sub(devAmount);
            pool.accXUNICPerShare = pool.accXUNICPerShare.add(addedXUNICs.mul(1e12).div(pool.totalLPTokens));
        }

        emit UpdatePool(_pid);
    }

    // Withdraw without caring about rewards. EMERGENCY ONLY.
    function emergencyWithdraw(uint256 _pid) external {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        uint256 amount = user.amount;
        user.amount = 0;
        user.rewardDebt = 0;
        pool.totalLPTokens = pool.totalLPTokens.sub(amount);
        IUnicFarm(UNIC_MASTERCHEF).withdraw(_pid, amount);
        (IERC20 lpToken,,,,) = IUnicFarm(UNIC_MASTERCHEF).poolInfo(_pid);
        lpToken.safeTransfer(address(msg.sender), amount);
        if (pool.totalLPTokens > 0) {
            // In case there are still users in that pool, we are using the claimed UNICs from `withdraw` to add to the share
            // In case there aren't anymore users in that pool, the next pool that will get updated will receive the claimed UNICs
            updatePool(_pid);
        }
        emit EmergencyWithdraw(msg.sender, _pid, amount);
    }

    // salvage purpose only for when stupid people send tokens here
    function withdrawToken(address tokenToWithdraw, uint256 amount) external onlyOwner {
        require(tokenToWithdraw != XUNIC, "Can't salvage xunic");
        IERC20(tokenToWithdraw).transfer(msg.sender, amount);
    }

    // Safe unic transfer function, just in case if rounding error causes pool to not have enough xUNICs.
    function safexUNICTransfer(address _to, uint256 _amount) internal {
        uint256 xUNICBal = IERC20(XUNIC).balanceOf(address(this));
        if (_amount > xUNICBal) {
            IERC20(XUNIC).transfer(_to, xUNICBal);
        } else {
            IERC20(XUNIC).transfer(_to, _amount);
        }
    }

    // Update dev address by the previous dev.
    function dev(address _devaddr) public {
        require(msg.sender == devaddr, "dev: wut?");
        devaddr = _devaddr;

        emit Dev(_devaddr);
    }

    // ------------- VIEW --------------

    // Current rate of xUNIC
    function getxUNICRate() public view returns (uint256) {
        uint256 xUNICBalance = IERC20(UNIC).balanceOf(XUNIC);
        uint256 xUNICSupply = IERC20(XUNIC).totalSupply();

        return xUNICBalance.mul(1e18).div(xUNICSupply);
    }

    function pendingxUNICs(uint256 _pid, address _user) public view returns (uint256) {
        PoolInfo memory pool = poolInfo[_pid];
        UserInfo memory user = userInfo[_pid][_user];

        // for frontend
        uint256 notClaimedUNICs = IUnicFarm(UNIC_MASTERCHEF).pendingUnic(_pid, address(this));
        if (notClaimedUNICs > 0) {
            uint256 xUNICRate = getxUNICRate();
            uint256 accXUNICPerShare = pool.accXUNICPerShare.add(notClaimedUNICs.mul(1e18).div(xUNICRate).mul(1e12).div(pool.totalLPTokens));
            return (accXUNICPerShare.mul(user.amount).div(1e12)).sub(user.rewardDebt);
        }
        uint256 pendingXUNICs = (pool.accXUNICPerShare.mul(user.amount).div(1e12)).sub(user.rewardDebt);
        return pendingXUNICs;
    }

}

Contract Security Audit

Contract ABI

[{"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":false,"internalType":"address","name":"devaddr","type":"address"}],"name":"Dev","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"numberOfUpdatedPools","type":"uint256"}],"name":"DoHardWork","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":false,"internalType":"uint256","name":"pid","type":"uint256"}],"name":"UpdatePool","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":"UNIC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNIC_MASTERCHEF","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"XUNIC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"depositFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devaddr","type":"address"}],"name":"dev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devFeeDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devaddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"doHardWork","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getxUNICRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"haveApprovedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_devaddr","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minBlocksToUpdatePoolInDoHardWork","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"pendingxUNICs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"totalLPTokens","type":"uint256"},{"internalType":"uint256","name":"accXUNICPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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"},{"inputs":[{"internalType":"address","name":"tokenToWithdraw","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526103e8606955610e10606a5534801561001c57600080fd5b506136998061002c6000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806390210d7e116100c3578063b08659ce1161007c578063b08659ce146104c0578063c4d66de81461051a578063d49e77cd1461055e578063e2bbb15814610592578063f2fde38b146105ca578063fedaca2f1461060e5761014d565b806390210d7e1461032b57806393b890461461038357806393f1a40b146103b75780639e281a9814610420578063a0e59acd1461046e578063add056b71461048c5761014d565b80634fa5d854116101155780634fa5d8541461024357806351eb05a61461024d5780635312ea8e1461027b578063715018a6146102a95780638d88a90e146102b35780638da5cb5b146102f75761014d565b80630c12821f146101525780631526fe271461018657806319795a68146101cf5780631a70be17146101ed578063441a3e701461020b575b600080fd5b61015a610670565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101b26004803603602081101561019c57600080fd5b8101908080359060200190929190505050610688565b604051808381526020018281526020019250505060405180910390f35b6101d76106ac565b6040518082815260200191505060405180910390f35b6101f5610848565b6040518082815260200191505060405180910390f35b6102416004803603604081101561022157600080fd5b81019080803590602001909291908035906020019092919050505061084e565b005b61024b610bf7565b005b6102796004803603602081101561026357600080fd5b8101908080359060200190929190505050610dfc565b005b6102a76004803603602081101561029157600080fd5b8101908080359060200190929190505050611323565b005b6102b16115b9565b005b6102f5600480360360208110156102c957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611729565b005b6102ff61187d565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103816004803603606081101561034157600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118a7565b005b61038b611d72565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610403600480360360408110156103cd57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d8a565b604051808381526020018281526020019250505060405180910390f35b61046c6004803603604081101561043657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611dbb565b005b610476611fd1565b6040518082815260200191505060405180910390f35b610494611fd7565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610502600480360360208110156104d657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fef565b60405180821515815260200191505060405180910390f35b61055c6004803603602081101561053057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061200f565b005b61056661224c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105c8600480360360408110156105a857600080fd5b810190808035906020019092919080359060200190929190505050612272565b005b61060c600480360360208110156105e057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612281565b005b61065a6004803603604081101561062457600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612476565b6040518082815260200191505060405180910390f35b73a62fb0c2fb3c7b27797dc04e1fea06c0a2db919a81565b60666020528060005260406000206000915090508060000154908060010154905082565b6000807394e0bab2f6ab1f19f4750e42d7349f2740513ad573ffffffffffffffffffffffffffffffffffffffff166370a0823173a62fb0c2fb3c7b27797dc04e1fea06c0a2db919a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561073e57600080fd5b505afa158015610752573d6000803e3d6000fd5b505050506040513d602081101561076857600080fd5b81019080805190602001909291905050509050600073a62fb0c2fb3c7b27797dc04e1fea06c0a2db919a73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156107d757600080fd5b505afa1580156107eb573d6000803e3d6000fd5b505050506040513d602081101561080157600080fd5b8101908080519060200190929190505050905061084181610833670de0b6b3a76400008561272290919063ffffffff16565b6127a890919063ffffffff16565b9250505090565b606a5481565b600060666000848152602001908152602001600020905060006065600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508281600001541015610933576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f77697468647261773a206e6f7420676f6f64000000000000000000000000000081525060200191505060405180910390fd5b61093c84610dfc565b6000610986826001015461097864e8d4a5100061096a8660000154886001015461272290919063ffffffff16565b6127a890919063ffffffff16565b6127f290919063ffffffff16565b9050600081111561099c5761099b338261283c565b5b6000841115610b67576109bc8483600001546127f290919063ffffffff16565b82600001819055506109db8484600001546127f290919063ffffffff16565b8360000181905550734a25e4df835b605a5848d2db450fa600d96ee81873ffffffffffffffffffffffffffffffffffffffff1663441a3e7086866040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b158015610a5257600080fd5b505af1158015610a66573d6000803e3d6000fd5b505050506000734a25e4df835b605a5848d2db450fa600d96ee81873ffffffffffffffffffffffffffffffffffffffff16631526fe27876040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b158015610ad157600080fd5b505afa158015610ae5573d6000803e3d6000fd5b505050506040513d60a0811015610afb57600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050505050509050610b6533868373ffffffffffffffffffffffffffffffffffffffff16612a8b9092919063ffffffff16565b505b610b9964e8d4a51000610b8b8560010154856000015461272290919063ffffffff16565b6127a890919063ffffffff16565b8260010181905550843373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568866040518082815260200191505060405180910390a35050505050565b6000805b734a25e4df835b605a5848d2db450fa600d96ee81873ffffffffffffffffffffffffffffffffffffffff1663081e3eda6040518163ffffffff1660e01b815260040160206040518083038186803b158015610c5557600080fd5b505afa158015610c69573d6000803e3d6000fd5b505050506040513d6020811015610c7f57600080fd5b8101908080519060200190929190505050811015610dc157600060666000838152602001908152602001600020600001541115610db4576000734a25e4df835b605a5848d2db450fa600d96ee81873ffffffffffffffffffffffffffffffffffffffff16631526fe27836040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b158015610d1d57600080fd5b505afa158015610d31573d6000803e3d6000fd5b505050506040513d60a0811015610d4757600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919050505050509250505080606a5443031115610db257610da6600184612b2d90919063ffffffff16565b9250610db182610dfc565b5b505b8080600101915050610bfb565b507f43e9e58d899d0850c765e9c263078f0d32b15e35e2c1c63c94e94d2daf54ce89816040518082815260200191505060405180910390a150565b6000606660008381526020019081526020016000209050600073a62fb0c2fb3c7b27797dc04e1fea06c0a2db919a73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610e9057600080fd5b505afa158015610ea4573d6000803e3d6000fd5b505050506040513d6020811015610eba57600080fd5b81019080805190602001909291905050509050734a25e4df835b605a5848d2db450fa600d96ee81873ffffffffffffffffffffffffffffffffffffffff1663e2bbb1588460006040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b158015610f3d57600080fd5b505af1158015610f51573d6000803e3d6000fd5b5050505060007394e0bab2f6ab1f19f4750e42d7349f2740513ad573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610fd257600080fd5b505afa158015610fe6573d6000803e3d6000fd5b505050506040513d6020811015610ffc57600080fd5b81019080805190602001909291905050509050600081118015611023575060008360000154115b156112e65773a62fb0c2fb3c7b27797dc04e1fea06c0a2db919a73ffffffffffffffffffffffffffffffffffffffff1663a59f3e0c826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561108f57600080fd5b505af11580156110a3573d6000803e3d6000fd5b5050505060006111718373a62fb0c2fb3c7b27797dc04e1fea06c0a2db919a73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561112857600080fd5b505afa15801561113c573d6000803e3d6000fd5b505050506040513d602081101561115257600080fd5b81019080805190602001909291905050506127f290919063ffffffff16565b9050600061119d60695461118f60648561272290919063ffffffff16565b6127a890919063ffffffff16565b905073a62fb0c2fb3c7b27797dc04e1fea06c0a2db919a73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb606860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561124657600080fd5b505af115801561125a573d6000803e3d6000fd5b505050506040513d602081101561127057600080fd5b81019080805190602001909291905050505061129581836127f290919063ffffffff16565b91506112db6112c886600001546112ba64e8d4a510008661272290919063ffffffff16565b6127a890919063ffffffff16565b8660010154612b2d90919063ffffffff16565b856001018190555050505b7f20f73897541b01c2d01f4eca5ac07cb2c486d778aadf60fac2d2dcfd3c1389f1846040518082815260200191505060405180910390a150505050565b600060666000838152602001908152602001600020905060006065600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154905060008260000181905550600082600101819055506113c28184600001546127f290919063ffffffff16565b8360000181905550734a25e4df835b605a5848d2db450fa600d96ee81873ffffffffffffffffffffffffffffffffffffffff1663441a3e7085836040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b15801561143957600080fd5b505af115801561144d573d6000803e3d6000fd5b505050506000734a25e4df835b605a5848d2db450fa600d96ee81873ffffffffffffffffffffffffffffffffffffffff16631526fe27866040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b1580156114b857600080fd5b505afa1580156114cc573d6000803e3d6000fd5b505050506040513d60a08110156114e257600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919050505050505050905061154c33838373ffffffffffffffffffffffffffffffffffffffff16612a8b9092919063ffffffff16565b6000846000015411156115635761156285610dfc565b5b843373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae0595846040518082815260200191505060405180910390a35050505050565b6115c1612bb5565b73ffffffffffffffffffffffffffffffffffffffff166115df61187d565b73ffffffffffffffffffffffffffffffffffffffff1614611668576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b606860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f6465763a207775743f000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80606860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f6787ec2e213b45f8a55bfa91346e72127488bde333c0e349257df192b861855581604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600060666000858152602001908152602001600020905060006065600086815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061191b85610dfc565b60008160000154111561198a576000611972826001015461196464e8d4a510006119568660000154886001015461272290919063ffffffff16565b6127a890919063ffffffff16565b6127f290919063ffffffff16565b9050600081111561198857611987848261283c565b5b505b6000841115611ce2576000734a25e4df835b605a5848d2db450fa600d96ee81873ffffffffffffffffffffffffffffffffffffffff16631526fe27876040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b1580156119fa57600080fd5b505afa158015611a0e573d6000803e3d6000fd5b505050506040513d60a0811015611a2457600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050505050509050611a903330878473ffffffffffffffffffffffffffffffffffffffff16612bbd909392919063ffffffff16565b606760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611c1b578073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3734a25e4df835b605a5848d2db450fa600d96ee8187fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611b8657600080fd5b505af1158015611b9a573d6000803e3d6000fd5b505050506040513d6020811015611bb057600080fd5b8101908080519060200190929190505050506001606760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b734a25e4df835b605a5848d2db450fa600d96ee81873ffffffffffffffffffffffffffffffffffffffff1663e2bbb15887876040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b158015611c8a57600080fd5b505af1158015611c9e573d6000803e3d6000fd5b50505050611cb9858360000154612b2d90919063ffffffff16565b8260000181905550611cd8858460000154612b2d90919063ffffffff16565b8360000181905550505b611d1464e8d4a51000611d068460010154846000015461272290919063ffffffff16565b6127a890919063ffffffff16565b8160010181905550848373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15866040518082815260200191505060405180910390a35050505050565b7394e0bab2f6ab1f19f4750e42d7349f2740513ad581565b6065602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b611dc3612bb5565b73ffffffffffffffffffffffffffffffffffffffff16611de161187d565b73ffffffffffffffffffffffffffffffffffffffff1614611e6a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b73a62fb0c2fb3c7b27797dc04e1fea06c0a2db919a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f20576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f43616e27742073616c766167652078756e69630000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611f9157600080fd5b505af1158015611fa5573d6000803e3d6000fd5b505050506040513d6020811015611fbb57600080fd5b8101908080519060200190929190505050505050565b60695481565b734a25e4df835b605a5848d2db450fa600d96ee81881565b60676020528060005260406000206000915054906101000a900460ff1681565b600060019054906101000a900460ff168061202e575061202d612c7e565b5b80612044575060008054906101000a900460ff16155b612099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806135eb602e913960400191505060405180910390fd5b60008060019054906101000a900460ff1615905080156120e9576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6120f1612c8f565b81606860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507394e0bab2f6ab1f19f4750e42d7349f2740513ad573ffffffffffffffffffffffffffffffffffffffff1663095ea7b373a62fb0c2fb3c7b27797dc04e1fea06c0a2db919a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156121eb57600080fd5b505af11580156121ff573d6000803e3d6000fd5b505050506040513d602081101561221557600080fd5b81019080805190602001909291905050505080156122485760008060016101000a81548160ff0219169083151502179055505b5050565b606860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61227d8282336118a7565b5050565b612289612bb5565b73ffffffffffffffffffffffffffffffffffffffff166122a761187d565b73ffffffffffffffffffffffffffffffffffffffff1614612330576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061359f6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061248061356a565b606660008581526020019081526020016000206040518060400160405290816000820154815260200160018201548152505090506124bc613584565b6065600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820154815260200160018201548152505090506000734a25e4df835b605a5848d2db450fa600d96ee81873ffffffffffffffffffffffffffffffffffffffff1663de15297e87306040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b1580156125b257600080fd5b505afa1580156125c6573d6000803e3d6000fd5b505050506040513d60208110156125dc57600080fd5b8101908080519060200190929190505050905060008111156126c85760006126026106ac565b90506000612676612663866000015161265564e8d4a5100061264787612639670de0b6b3a76400008b61272290919063ffffffff16565b6127a890919063ffffffff16565b61272290919063ffffffff16565b6127a890919063ffffffff16565b8660200151612b2d90919063ffffffff16565b90506126bc84602001516126ae64e8d4a510006126a088600001518661272290919063ffffffff16565b6127a890919063ffffffff16565b6127f290919063ffffffff16565b9550505050505061271c565b6000612712836020015161270464e8d4a510006126f68760000151896020015161272290919063ffffffff16565b6127a890919063ffffffff16565b6127f290919063ffffffff16565b9050809450505050505b92915050565b60008083141561273557600090506127a2565b600082840290508284828161274657fe5b041461279d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806136196021913960400191505060405180910390fd5b809150505b92915050565b60006127ea83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612d9d565b905092915050565b600061283483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612e63565b905092915050565b600073a62fb0c2fb3c7b27797dc04e1fea06c0a2db919a73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156128b957600080fd5b505afa1580156128cd573d6000803e3d6000fd5b505050506040513d60208110156128e357600080fd5b81019080805190602001909291905050509050808211156129c45773a62fb0c2fb3c7b27797dc04e1fea06c0a2db919a73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561298357600080fd5b505af1158015612997573d6000803e3d6000fd5b505050506040513d60208110156129ad57600080fd5b810190808051906020019092919050505050612a86565b73a62fb0c2fb3c7b27797dc04e1fea06c0a2db919a73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612a4957600080fd5b505af1158015612a5d573d6000803e3d6000fd5b505050506040513d6020811015612a7357600080fd5b8101908080519060200190929190505050505b505050565b612b288363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612f23565b505050565b600080828401905083811015612bab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600033905090565b612c78846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612f23565b50505050565b6000612c8930613012565b15905090565b600060019054906101000a900460ff1680612cae5750612cad612c7e565b5b80612cc4575060008054906101000a900460ff16155b612d19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806135eb602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015612d69576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b612d71613025565b612d79613123565b8015612d9a5760008060016101000a81548160ff0219169083151502179055505b50565b60008083118290612e49576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e0e578082015181840152602081019050612df3565b50505050905090810190601f168015612e3b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612e5557fe5b049050809150509392505050565b6000838311158290612f10576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612ed5578082015181840152602081019050612eba565b50505050905090810190601f168015612f025780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6060612f85826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166132ca9092919063ffffffff16565b905060008151111561300d57808060200190516020811015612fa657600080fd5b810190808051906020019092919050505061300c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061363a602a913960400191505060405180910390fd5b5b505050565b600080823b905060008111915050919050565b600060019054906101000a900460ff16806130445750613043612c7e565b5b8061305a575060008054906101000a900460ff16155b6130af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806135eb602e913960400191505060405180910390fd5b60008060019054906101000a900460ff1615905080156130ff576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b80156131205760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806131425750613141612c7e565b5b80613158575060008054906101000a900460ff16155b6131ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806135eb602e913960400191505060405180910390fd5b60008060019054906101000a900460ff1615905080156131fd576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6000613207612bb5565b905080603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080156132c75760008060016101000a81548160ff0219169083151502179055505b50565b60606132d984846000856132e2565b90509392505050565b60608247101561333d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806135c56026913960400191505060405180910390fd5b6133468561348b565b6133b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061340857805182526020820191506020810190506020830392506133e5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461346a576040519150601f19603f3d011682016040523d82523d6000602084013e61346f565b606091505b509150915061347f82828661349e565b92505050949350505050565b600080823b905060008111915050919050565b606083156134ae57829050613563565b6000835111156134c15782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561352857808201518184015260208101905061350d565b50505050905090810190601f1680156135555780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b9392505050565b604051806040016040528060008152602001600081525090565b60405180604001604052806000815260200160008152509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220c362a43b71deb3817e1b475673787c3846e63a9258f509e2b5bf9e5819af069864736f6c634300060c0033

Deployed ByteCode Sourcemap

33198:9088:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33321:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34195:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;41249:244;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34595:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35273:953;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37742:611;;;:::i;:::-;;38361:878;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39310:919;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12467:148;;;:::i;:::-;;41007:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11816:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36504:1230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33411:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34095:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;40306:221;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34423:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33500:93;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34307:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35047:174;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34365:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36296:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12770:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41501:780;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33321:83;33361:42;33321:83;:::o;34195:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41249:244::-;41294:7;41314:20;33450:42;41337:22;;;33361:42;41337:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41314:52;;41377:19;33361:42;41399:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41377:49;;41446:39;41473:11;41446:22;41463:4;41446:12;:16;;:22;;;;:::i;:::-;:26;;:39;;;;:::i;:::-;41439:46;;;;41249:244;:::o;34595:56::-;;;;:::o;35273:953::-;35340:21;35364:8;:14;35373:4;35364:14;;;;;;;;;;;35340:38;;35389:21;35413:8;:14;35422:4;35413:14;;;;;;;;;;;:26;35428:10;35413:26;;;;;;;;;;;;;;;35389:50;;35473:7;35458:4;:11;;;:22;;35450:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35514:16;35525:4;35514:10;:16::i;:::-;35541:15;35559:71;35614:4;:15;;;35560:48;35603:4;35560:38;35586:4;:11;;;35560:4;:21;;;:25;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;35559:54;;:71;;;;:::i;:::-;35541:89;;35655:1;35645:7;:11;35641:82;;;35673:38;35691:10;35703:7;35673:17;:38::i;:::-;35641:82;35747:1;35737:7;:11;35733:358;;;35779:24;35795:7;35779:4;:11;;;:15;;:24;;;;:::i;:::-;35765:4;:11;;:38;;;;35839:31;35862:7;35839:4;:18;;;:22;;:31;;;;:::i;:::-;35818:4;:18;;:52;;;;33550:42;35885:35;;;35921:4;35927:7;35885:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35951:14;33550:42;35973:35;;;36009:4;35973:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35950:64;;;;;;36029:50;36058:10;36071:7;36029;:20;;;;:50;;;;;:::i;:::-;35733:358;;36119:48;36162:4;36119:38;36135:4;:21;;;36119:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;36101:4;:15;;:66;;;;36204:4;36192:10;36183:35;;;36210:7;36183:35;;;;;;;;;;;;;;;;;;35273:953;;;;;:::o;37742:611::-;37782:28;37830:12;37825:473;33550:42;37855:37;;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37848:4;:46;37825:473;;;37954:1;37923:8;:14;37932:4;37923:14;;;;;;;;;;;:28;;;:32;37919:368;;;37979:23;33550:42;38008:35;;;38044:4;38008:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37976:73;;;;;;38123:15;38087:33;;38072:12;:48;:66;38068:204;;;38186:27;38211:1;38186:20;:24;;:27;;;;:::i;:::-;38163:50;;38236:16;38247:4;38236:10;:16::i;:::-;38068:204;37919:368;;37896:6;;;;;;;37825:473;;;;38313:32;38324:20;38313:32;;;;;;;;;;;;;;;;;;37742:611;:::o;38361:878::-;38413:21;38437:8;:14;38446:4;38437:14;;;;;;;;;;;38413:38;;38464:24;33361:42;38491:23;;;38523:4;38491:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38464:65;;33550:42;38540:34;;;38575:4;38581:1;38540:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38594:19;33450:42;38616:22;;;38647:4;38616:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38594:59;;38682:1;38668:11;:15;:41;;;;;38708:1;38687:4;:18;;;:22;38668:41;38664:534;;;33361:42;38726:25;;;38752:11;38726:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38779:19;38801:60;38844:16;33361:42;38801:23;;;38833:4;38801:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:42;;:60;;;;:::i;:::-;38779:82;;38876:17;38896:43;38921:17;;38896:20;38912:3;38896:11;:15;;:20;;;;:::i;:::-;:24;;:43;;;;:::i;:::-;38876:63;;33361:42;38978:22;;;39001:7;;;;;;;;;;;39010:9;38978:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39049:26;39065:9;39049:11;:15;;:26;;;;:::i;:::-;39035:40;;39114:72;39140:45;39166:4;:18;;;39140:21;39156:4;39140:11;:15;;:21;;;;:::i;:::-;:25;;:45;;;;:::i;:::-;39114:4;:21;;;:25;;:72;;;;:::i;:::-;39090:4;:21;;:96;;;;38664:534;;;39215:16;39226:4;39215:16;;;;;;;;;;;;;;;;;;38361:878;;;;:::o;39310:919::-;39371:21;39395:8;:14;39404:4;39395:14;;;;;;;;;;;39371:38;;39420:21;39444:8;:14;39453:4;39444:14;;;;;;;;;;;:26;39459:10;39444:26;;;;;;;;;;;;;;;39420:50;;39481:14;39498:4;:11;;;39481:28;;39534:1;39520:4;:11;;:15;;;;39564:1;39546:4;:15;;:19;;;;39597:30;39620:6;39597:4;:18;;;:22;;:30;;;;:::i;:::-;39576:4;:18;;:51;;;;33550:42;39638:35;;;39674:4;39680:6;39638:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39699:14;33550:42;39721:35;;;39757:4;39721:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39698:64;;;;;;39773:49;39802:10;39815:6;39773:7;:20;;;;:49;;;;;:::i;:::-;39858:1;39837:4;:18;;;:22;39833:330;;;40135:16;40146:4;40135:10;:16::i;:::-;39833:330;40208:4;40196:10;40178:43;;;40214:6;40178:43;;;;;;;;;;;;;;;;;;39310:919;;;;;:::o;12467:148::-;12047:12;:10;:12::i;:::-;12036:23;;:7;:5;:7::i;:::-;:23;;;12028:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12574:1:::1;12537:40;;12558:6;;;;;;;;;;;12537:40;;;;;;;;;;;;12605:1;12588:6;;:19;;;;;;;;;;;;;;;;;;12467:148::o:0;41007:160::-;41078:7;;;;;;;;;;;41064:21;;:10;:21;;;41056:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41120:8;41110:7;;:18;;;;;;;;;;;;;;;;;;41146:13;41150:8;41146:13;;;;;;;;;;;;;;;;;;;;41007:160;:::o;11816:87::-;11862:7;11889:6;;;;;;;;;;;11882:13;;11816:87;:::o;36504:1230::-;36588:21;36612:8;:14;36621:4;36612:14;;;;;;;;;;;36588:38;;36637:21;36661:8;:14;36670:4;36661:14;;;;;;;;;;;:21;36676:5;36661:21;;;;;;;;;;;;;;;36637:45;;36693:16;36704:4;36693:10;:16::i;:::-;36738:1;36724:4;:11;;;:15;36720:236;;;36756:15;36774:71;36829:4;:15;;;36775:48;36818:4;36775:38;36801:4;:11;;;36775:4;:21;;;:25;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;36774:54;;:71;;;;:::i;:::-;36756:89;;36874:1;36864:7;:11;36860:85;;;36896:33;36914:5;36921:7;36896:17;:33::i;:::-;36860:85;36720:236;;36980:1;36970:7;:11;36966:639;;;36999:14;33550:42;37021:35;;;37057:4;37021:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36998:64;;;;;;37077:135;37128:10;37166:4;37190:7;37077;:24;;;;:135;;;;;;:::i;:::-;37232:17;:35;37258:7;37232:35;;;;;;;;;;;;;;;;;;;;;;;;;37227:183;;37288:7;:15;;;33550:42;37329:2;37288:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37390:4;37352:17;:35;37378:7;37352:35;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;37227:183;33550:42;37424:34;;;37459:4;37465:7;37424:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37502:24;37518:7;37502:4;:11;;;:15;;:24;;;;:::i;:::-;37488:4;:11;;:38;;;;37562:31;37585:7;37562:4;:18;;;:22;;:31;;;;:::i;:::-;37541:4;:18;;:52;;;;36966:639;;37633:48;37676:4;37633:38;37649:4;:21;;;37633:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;37615:4;:15;;:66;;;;37712:4;37705:5;37697:29;;;37718:7;37697:29;;;;;;;;;;;;;;;;;;36504:1230;;;;;:::o;33411:82::-;33450:42;33411:82;:::o;34095:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40306:221::-;12047:12;:10;:12::i;:::-;12036:23;;:7;:5;:7::i;:::-;:23;;;12028:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33361:42:::1;40408:24;;:15;:24;;;;40400:56;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;40474:15;40467:32;;;40500:10;40512:6;40467:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;40306:221:::0;;:::o;34423:39::-;;;;:::o;33500:93::-;33550:42;33500:93;:::o;34307:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;35047:174::-;8639:13;;;;;;;;;;;:33;;;;8656:16;:14;:16::i;:::-;8639:33;:50;;;;8677:12;;;;;;;;;;8676:13;8639:50;8631:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8753:19;8776:13;;;;;;;;;;;8775:14;8753:36;;8804:14;8800:101;;;8851:4;8835:13;;:20;;;;;;;;;;;;;;;;;;8885:4;8870:12;;:19;;;;;;;;;;;;;;;;;;8800:101;35117:16:::1;:14;:16::i;:::-;35154:8;35144:7;;:18;;;;;;;;;;;;;;;;;;33450:42;35173:20;;;33361:42;35209:2;35173:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;8931:14:::0;8927:68;;;8978:5;8962:13;;:21;;;;;;;;;;;;;;;;;;8927:68;35047:174;;:::o;34365:22::-;;;;;;;;;;;;;:::o;36296:111::-;36362:37;36373:4;36379:7;36388:10;36362;:37::i;:::-;36296:111;;:::o;12770:244::-;12047:12;:10;:12::i;:::-;12036:23;;:7;:5;:7::i;:::-;:23;;;12028:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12879:1:::1;12859:22;;:8;:22;;;;12851:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12969:8;12940:38;;12961:6;;;;;;;;;;;12940:38;;;;;;;;;;;;12998:8;12989:6;;:17;;;;;;;;;;;;;;;;;;12770:244:::0;:::o;41501:780::-;41574:7;41594:20;;:::i;:::-;41617:8;:14;41626:4;41617:14;;;;;;;;;;;41594:37;;;;;;;;;;;;;;;;;;;;;;;;;;;41642:20;;:::i;:::-;41665:8;:14;41674:4;41665:14;;;;;;;;;;;:21;41680:5;41665:21;;;;;;;;;;;;;;;41642:44;;;;;;;;;;;;;;;;;;;;;;;;;;;41724:23;33550:42;41750:38;;;41789:4;41803;41750:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41724:85;;41842:1;41824:15;:19;41820:317;;;41860:17;41880:14;:12;:14::i;:::-;41860:34;;41909:24;41936:101;41962:74;42017:4;:18;;;41962:50;42007:4;41962:40;41992:9;41962:25;41982:4;41962:15;:19;;:25;;;;:::i;:::-;:29;;:40;;;;:::i;:::-;:44;;:50;;;;:::i;:::-;:54;;:74;;;;:::i;:::-;41936:4;:21;;;:25;;:101;;;;:::i;:::-;41909:128;;42059:66;42109:4;:15;;;42060:43;42098:4;42060:33;42081:4;:11;;;42060:16;:20;;:33;;;;:::i;:::-;:37;;:43;;;;:::i;:::-;42059:49;;:66;;;;:::i;:::-;42052:73;;;;;;;;;41820:317;42147:21;42171:71;42226:4;:15;;;42172:48;42215:4;42172:38;42198:4;:11;;;42172:4;:21;;;:25;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;42171:54;;:71;;;;:::i;:::-;42147:95;;42260:13;42253:20;;;;;;41501:780;;;;;:::o;18151:471::-;18209:7;18459:1;18454;:6;18450:47;;;18484:1;18477:8;;;;18450:47;18509:9;18525:1;18521;:5;18509:17;;18554:1;18549;18545;:5;;;;;;:10;18537:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18613:1;18606:8;;;18151:471;;;;;:::o;19098:132::-;19156:7;19183:39;19187:1;19190;19183:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;19176:46;;19098:132;;;;:::o;17261:136::-;17319:7;17346:43;17350:1;17353;17346:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;17339:50;;17261:136;;;;:::o;40642:309::-;40719:16;33361:42;40738:23;;;40770:4;40738:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40719:57;;40801:8;40791:7;:18;40787:157;;;33361:42;40826:22;;;40849:3;40854:8;40826:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40787:157;;;33361:42;40896:22;;;40919:3;40924:7;40896:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40787:157;40642:309;;;:::o;28952:177::-;29035:86;29055:5;29085:23;;;29110:2;29114:5;29062:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29035:19;:86::i;:::-;28952:177;;;:::o;16797:181::-;16855:7;16875:9;16891:1;16887;:5;16875:17;;16916:1;16911;:6;;16903:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16969:1;16962:8;;;16797:181;;;;:::o;10087:106::-;10140:15;10175:10;10168:17;;10087:106;:::o;29137:205::-;29238:96;29258:5;29288:27;;;29317:4;29323:2;29327:5;29265:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29238:19;:96::i;:::-;29137:205;;;;:::o;9095:125::-;9143:4;9168:44;9206:4;9168:29;:44::i;:::-;9167:45;9160:52;;9095:125;:::o;11402:129::-;8639:13;;;;;;;;;;;:33;;;;8656:16;:14;:16::i;:::-;8639:33;:50;;;;8677:12;;;;;;;;;;8676:13;8639:50;8631:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8753:19;8776:13;;;;;;;;;;;8775:14;8753:36;;8804:14;8800:101;;;8851:4;8835:13;;:20;;;;;;;;;;;;;;;;;;8885:4;8870:12;;:19;;;;;;;;;;;;;;;;;;8800:101;11460:26:::1;:24;:26::i;:::-;11497;:24;:26::i;:::-;8931:14:::0;8927:68;;;8978:5;8962:13;;:21;;;;;;;;;;;;;;;;;;8927:68;11402:129;:::o;19726:278::-;19812:7;19844:1;19840;:5;19847:12;19832:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19871:9;19887:1;19883;:5;;;;;;19871:17;;19995:1;19988:8;;;19726:278;;;;;:::o;17700:192::-;17786:7;17819:1;17814;:6;;17822:12;17806:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17846:9;17862:1;17858;:5;17846:17;;17883:1;17876:8;;;17700:192;;;;;:::o;31257:761::-;31681:23;31707:69;31735:4;31707:69;;;;;;;;;;;;;;;;;31715:5;31707:27;;;;:69;;;;;:::i;:::-;31681:95;;31811:1;31791:10;:17;:21;31787:224;;;31933:10;31922:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31914:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31787:224;31257:761;;;:::o;839:422::-;899:4;1107:12;1218:7;1206:20;1198:28;;1252:1;1245:4;:8;1238:15;;;839:422;;;:::o;10016:65::-;8639:13;;;;;;;;;;;:33;;;;8656:16;:14;:16::i;:::-;8639:33;:50;;;;8677:12;;;;;;;;;;8676:13;8639:50;8631:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8753:19;8776:13;;;;;;;;;;;8775:14;8753:36;;8804:14;8800:101;;;8851:4;8835:13;;:20;;;;;;;;;;;;;;;;;;8885:4;8870:12;;:19;;;;;;;;;;;;;;;;;;8800:101;8931:14;8927:68;;;8978:5;8962:13;;:21;;;;;;;;;;;;;;;;;;8927:68;10016:65;:::o;11539:196::-;8639:13;;;;;;;;;;;:33;;;;8656:16;:14;:16::i;:::-;8639:33;:50;;;;8677:12;;;;;;;;;;8676:13;8639:50;8631:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8753:19;8776:13;;;;;;;;;;;8775:14;8753:36;;8804:14;8800:101;;;8851:4;8835:13;;:20;;;;;;;;;;;;;;;;;;8885:4;8870:12;;:19;;;;;;;;;;;;;;;;;;8800:101;11607:17:::1;11627:12;:10;:12::i;:::-;11607:32;;11659:9;11650:6;;:18;;;;;;;;;;;;;;;;;;11717:9;11684:43;;11713:1;11684:43;;;;;;;;;;;;8913:1;8931:14:::0;8927:68;;;8978:5;8962:13;;:21;;;;;;;;;;;;;;;;;;8927:68;11539:196;:::o;24949:195::-;25052:12;25084:52;25106:6;25114:4;25120:1;25123:12;25084:21;:52::i;:::-;25077:59;;24949:195;;;;;:::o;26001:530::-;26128:12;26186:5;26161:21;:30;;26153:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26253:18;26264:6;26253:10;:18::i;:::-;26245:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26379:12;26393:23;26420:6;:11;;26440:5;26448:4;26420:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26378:75;;;;26471:52;26489:7;26498:10;26510:12;26471:17;:52::i;:::-;26464:59;;;;26001:530;;;;;;:::o;22031:422::-;22091:4;22299:12;22410:7;22398:20;22390:28;;22444:1;22437:4;:8;22430:15;;;22031:422;;;:::o;27537:742::-;27652:12;27681:7;27677:595;;;27712:10;27705:17;;;;27677:595;27846:1;27826:10;:17;:21;27822:439;;;28089:10;28083:17;28150:15;28137:10;28133:2;28129:19;28122:44;28037:148;28232:12;28225:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27537:742;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://c362a43b71deb3817e1b475673787c3846e63a9258f509e2b5bf9e5819af0698
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.