ETH Price: $2,977.37 (-8.72%)
 

Overview

Max Total Supply

0 E3EB

Holders

90

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
2020224.eth
Balance
1 E3EB
0x674ffe523f7e72cd4a6d8b0b1a63086ac9c88da4
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Easy3EarlyBird

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 9999 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-04-09
*/

// SPDX-License-Identifier: MIT
pragma solidity ^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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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");

        (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");

        (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");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

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

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) internal 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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

/**
 * @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 meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

abstract contract SignerValidator {
    address public remoteSigner;

    constructor(address remoteSigner_) {
        _setRemoteSigner(remoteSigner_);
    }

    function _setRemoteSigner(address remoteSigner_) internal {
        remoteSigner = remoteSigner_;
    }

    function _validSignature(bytes32 msgHash, bytes memory signature) internal view {
        address signer = ECDSA.recover(ECDSA.toEthSignedMessageHash(msgHash), signature);
        require(signer == remoteSigner, "invalid signature");
    }
}

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all");

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(address from, address to, uint256 tokenId) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");
        _safeTransfer(from, to, tokenId, data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {
        _mint(to, tokenId);
        require(_checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(address from, address to, uint256 tokenId) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 tokenId) internal virtual {}
}

contract Easy3EarlyBird is ERC721, SignerValidator, Ownable {
    uint256 public constant MAX_SUPPLY = 1000;
    uint256 public constant MAX_MINT = 500;
    uint256 public mintCounter = 0;
    uint256 public reserveCounter = MAX_SUPPLY - MAX_MINT;

    mapping(address account => bool minted) public isMinted;

    string private _uri;

    constructor(address remoteSigner_, string memory uri_) ERC721("Easy3 Early Bird NFT", "E3EB") SignerValidator(remoteSigner_) {
        _uri = uri_;
    }

    function setBaseURI(string memory uri_) external onlyOwner {
        _uri = uri_;
    }

    function setRemoteSigner(address remoteSigner_) external onlyOwner {
        _setRemoteSigner(remoteSigner_);
    }

    function mint(address to, bool isReserved, bytes memory signature) external {
        require(!isMinted[to], "already minted");
        isMinted[to] = true;

        bytes32 msgHash = keccak256(abi.encode(to, isReserved));
        _validSignature(msgHash, signature);
        uint256 tokenId;
        if (isReserved) {
            tokenId = reserveCounter;
            require(tokenId < MAX_SUPPLY, "max reserve reached");
            reserveCounter = tokenId + 1;
        } else {
            tokenId = mintCounter;
            require(tokenId < MAX_MINT, "max mint reached");
            mintCounter = tokenId + 1;
        }
        _safeMint(to, tokenId);
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _uri;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"remoteSigner_","type":"address"},{"internalType":"string","name":"uri_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinted","outputs":[{"internalType":"bool","name":"minted","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"isReserved","type":"bool"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remoteSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"remoteSigner_","type":"address"}],"name":"setRemoteSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600855620000196101f46103e86200016b565b6009553480156200002957600080fd5b506040516200283f3803806200283f8339810160408190526200004c91620001a9565b816040518060400160405280601481526020017f4561737933204561726c792042697264204e4654000000000000000000000000815250604051806040016040528060048152602001632299a2a160e11b8152508160009081620000b191906200032e565b506001620000c082826200032e565b505050620000d481620000f760201b60201c565b50620000e03362000119565b600b620000ee82826200032e565b505050620003fa565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b818103818111156200018d57634e487b7160e01b600052601160045260246000fd5b92915050565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215620001bd57600080fd5b82516001600160a01b0381168114620001d557600080fd5b602084810151919350906001600160401b0380821115620001f557600080fd5b818601915086601f8301126200020a57600080fd5b8151818111156200021f576200021f62000193565b604051601f8201601f19908116603f011681019083821181831017156200024a576200024a62000193565b8160405282815289868487010111156200026357600080fd5b600093505b8284101562000287578484018601518185018701529285019262000268565b60008684830101528096505050505050509250929050565b600181811c90821680620002b457607f821691505b602082108103620002d557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200032957600081815260208120601f850160051c81016020861015620003045750805b601f850160051c820191505b81811015620003255782815560010162000310565b5050505b505050565b81516001600160401b038111156200034a576200034a62000193565b62000362816200035b84546200029f565b84620002db565b602080601f8311600181146200039a5760008415620003815750858301515b600019600386901b1c1916600185901b17855562000325565b600085815260208120601f198616915b82811015620003cb57888601518255948401946001909101908401620003aa565b5085821015620003ea5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612435806200040a6000396000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c806370a08231116100ee578063b88d4fde11610097578063f0292a0311610071578063f0292a031461039d578063f2fde38b146103a6578063f9f2a7ce146103b9578063fce5ec95146103dc57600080fd5b8063b88d4fde1461032e578063c87b56dd14610341578063e985e9c51461035457600080fd5b80638da5cb5b116100c85780638da5cb5b146102f557806395d89b4114610313578063a22cb4651461031b57600080fd5b806370a08231146102c7578063715018a6146102da5780638b87da4b146102e257600080fd5b806332cb6b0c1161015057806346aa52ce1161012a57806346aa52ce1461029857806355f804b3146102a15780636352211e146102b457600080fd5b806332cb6b0c1461025c5780633408a2371461026557806342842e0e1461028557600080fd5b8063081812fc11610181578063081812fc146101fc578063095ea7b31461023457806323b872dd1461024957600080fd5b806301ffc9a7146101a8578063058e2994146101d057806306fdde03146101e7575b600080fd5b6101bb6101b6366004611d07565b6103ef565b60405190151581526020015b60405180910390f35b6101d960095481565b6040519081526020016101c7565b6101ef6104d4565b6040516101c79190611d74565b61020f61020a366004611d87565b610566565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c7565b610247610242366004611dc9565b61059a565b005b610247610257366004611df3565b610722565b6101d96103e881565b60065461020f9073ffffffffffffffffffffffffffffffffffffffff1681565b610247610293366004611df3565b6107a9565b6101d960085481565b6102476102af366004611ed4565b6107c4565b61020f6102c2366004611d87565b6107dc565b6101d96102d5366004611f1d565b61084e565b610247610902565b6102476102f0366004611f1d565b610916565b60075473ffffffffffffffffffffffffffffffffffffffff1661020f565b6101ef610964565b610247610329366004611f48565b610973565b61024761033c366004611f9b565b61097e565b6101ef61034f366004611d87565b610a0c565b6101bb610362366004612003565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b6101d96101f481565b6102476103b4366004611f1d565b610a73565b6101bb6103c7366004611f1d565b600a6020526000908152604090205460ff1681565b6102476103ea36600461202d565b610b0d565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061048257507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806104ce57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060600080546104e39061208b565b80601f016020809104026020016040519081016040528092919081815260200182805461050f9061208b565b801561055c5780601f106105315761010080835404028352916020019161055c565b820191906000526020600020905b81548152906001019060200180831161053f57829003601f168201915b5050505050905090565b600061057182610d0d565b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60006105a5826107dc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361064d5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821614806106a1575073ffffffffffffffffffffffffffffffffffffffff8116600090815260056020908152604080832033845290915290205460ff165b6107135760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610644565b61071d8383610d7e565b505050565b61072c3382610e1e565b61079e5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f7665640000000000000000000000000000000000006064820152608401610644565b61071d838383610ede565b61071d8383836040518060200160405280600081525061097e565b6107cc611111565b600b6107d8828261212c565b5050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16806104ce5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610644565b600073ffffffffffffffffffffffffffffffffffffffff82166108d95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152608401610644565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b61090a611111565b6109146000611178565b565b61091e611111565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831617905550565b50565b6060600180546104e39061208b565b6107d83383836111ef565b6109883383610e1e565b6109fa5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f7665640000000000000000000000000000000000006064820152608401610644565b610a0684848484611302565b50505050565b6060610a1782610d0d565b6000610a2161138b565b90506000815111610a415760405180602001604052806000815250610a6c565b80610a4b8461139a565b604051602001610a5c929190612228565b6040516020818303038152906040525b9392505050565b610a7b611111565b73ffffffffffffffffffffffffffffffffffffffff8116610b045760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610644565b61096181611178565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600a602052604090205460ff1615610b835760405162461bcd60e51b815260206004820152600e60248201527f616c7265616479206d696e7465640000000000000000000000000000000000006044820152606401610644565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600a6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905551610c0691869186910173ffffffffffffffffffffffffffffffffffffffff9290921682521515602082015260400190565b604051602081830303815290604052805190602001209050610c2881836114cf565b60008315610c9857506009546103e88110610c855760405162461bcd60e51b815260206004820152601360248201527f6d617820726573657276652072656163686564000000000000000000000000006044820152606401610644565b610c90816001612286565b600955610cfc565b506008546101f48110610ced5760405162461bcd60e51b815260206004820152601060248201527f6d6178206d696e742072656163686564000000000000000000000000000000006044820152606401610644565b610cf8816001612286565b6008555b610d06858261159e565b5050505050565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff166109615760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610644565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190610dd8826107dc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610e2a836107dc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610e98575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b80610ed657508373ffffffffffffffffffffffffffffffffffffffff16610ebe84610566565b73ffffffffffffffffffffffffffffffffffffffff16145b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff16610efe826107dc565b73ffffffffffffffffffffffffffffffffffffffff1614610f875760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610644565b73ffffffffffffffffffffffffffffffffffffffff821661100f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610644565b61101a600082610d7e565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120805460019290611050908490612299565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040812080546001929061108b908490612286565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60075473ffffffffffffffffffffffffffffffffffffffff1633146109145760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610644565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361126a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610644565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61130d848484610ede565b611319848484846115b8565b610a065760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610644565b6060600b80546104e39061208b565b6060816000036113dd57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561140757806113f1816122ac565b91506114009050600a83612313565b91506113e1565b60008167ffffffffffffffff81111561142257611422611e2f565b6040519080825280601f01601f19166020018201604052801561144c576020820181803683370190505b5090505b8415610ed657611461600183612299565b915061146e600a86612327565b611479906030612286565b60f81b81838151811061148e5761148e61233b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506114c8600a86612313565b9450611450565b600061153161152b846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b83611773565b60065490915073ffffffffffffffffffffffffffffffffffffffff80831691161461071d5760405162461bcd60e51b815260206004820152601160248201527f696e76616c6964207369676e61747572650000000000000000000000000000006044820152606401610644565b6107d8828260405180602001604052806000815250611797565b600073ffffffffffffffffffffffffffffffffffffffff84163b15611768576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061162f90339089908890889060040161236a565b6020604051808303816000875af192505050801561166a575060408051601f3d908101601f19168201909252611667918101906123b3565b60015b61171d573d808015611698576040519150601f19603f3d011682016040523d82523d6000602084013e61169d565b606091505b5080516000036117155760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610644565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050610ed6565b506001949350505050565b60008060006117828585611820565b9150915061178f81611865565b509392505050565b6117a18383611a51565b6117ae60008484846115b8565b61071d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610644565b60008082516041036118565760208301516040840151606085015160001a61184a87828585611bdf565b9450945050505061185e565b506000905060025b9250929050565b6000816004811115611879576118796123d0565b036118815750565b6001816004811115611895576118956123d0565b036118e25760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610644565b60028160048111156118f6576118f66123d0565b036119435760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610644565b6003816004811115611957576119576123d0565b036119ca5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610644565b60048160048111156119de576119de6123d0565b036109615760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610644565b73ffffffffffffffffffffffffffffffffffffffff8216611ab45760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610644565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1615611b265760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610644565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805460019290611b5c908490612286565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611c165750600090506003611cd0565b8460ff16601b14158015611c2e57508460ff16601c14155b15611c3f5750600090506004611cd0565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611c93573d6000803e3d6000fd5b5050604051601f19015191505073ffffffffffffffffffffffffffffffffffffffff8116611cc957600060019250925050611cd0565b9150600090505b94509492505050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461096157600080fd5b600060208284031215611d1957600080fd5b8135610a6c81611cd9565b60005b83811015611d3f578181015183820152602001611d27565b50506000910152565b60008151808452611d60816020860160208601611d24565b601f01601f19169290920160200192915050565b602081526000610a6c6020830184611d48565b600060208284031215611d9957600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611dc457600080fd5b919050565b60008060408385031215611ddc57600080fd5b611de583611da0565b946020939093013593505050565b600080600060608486031215611e0857600080fd5b611e1184611da0565b9250611e1f60208501611da0565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115611e7957611e79611e2f565b604051601f8501601f19908116603f01168101908282118183101715611ea157611ea1611e2f565b81604052809350858152868686011115611eba57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611ee657600080fd5b813567ffffffffffffffff811115611efd57600080fd5b8201601f81018413611f0e57600080fd5b610ed684823560208401611e5e565b600060208284031215611f2f57600080fd5b610a6c82611da0565b80358015158114611dc457600080fd5b60008060408385031215611f5b57600080fd5b611f6483611da0565b9150611f7260208401611f38565b90509250929050565b600082601f830112611f8c57600080fd5b610a6c83833560208501611e5e565b60008060008060808587031215611fb157600080fd5b611fba85611da0565b9350611fc860208601611da0565b925060408501359150606085013567ffffffffffffffff811115611feb57600080fd5b611ff787828801611f7b565b91505092959194509250565b6000806040838503121561201657600080fd5b61201f83611da0565b9150611f7260208401611da0565b60008060006060848603121561204257600080fd5b61204b84611da0565b925061205960208501611f38565b9150604084013567ffffffffffffffff81111561207557600080fd5b61208186828701611f7b565b9150509250925092565b600181811c9082168061209f57607f821691505b6020821081036120d8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561071d57600081815260208120601f850160051c810160208610156121055750805b601f850160051c820191505b8181101561212457828155600101612111565b505050505050565b815167ffffffffffffffff81111561214657612146611e2f565b61215a81612154845461208b565b846120de565b602080601f8311600181146121ad57600084156121775750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612124565b600085815260208120601f198616915b828110156121dc578886015182559484019460019091019084016121bd565b508582101561221857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000835161223a818460208801611d24565b83519083019061224e818360208801611d24565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104ce576104ce612257565b818103818111156104ce576104ce612257565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036122dd576122dd612257565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612322576123226122e4565b500490565b600082612336576123366122e4565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526123a96080830184611d48565b9695505050505050565b6000602082840312156123c557600080fd5b8151610a6c81611cd9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea2646970667358221220ee7a3cebd1cfd7b3055aded12f278f82b4b43c684c3bd344c3998b0475a65ebf64736f6c63430008130033000000000000000000000000423e3e1de6dcdafdae15b4bb13b32db7dd671dec0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003868747470733a2f2f6170692e65617379332e6170703a31353030312f6170692f66726f6e74656e642f6561726c7942697264746f6b656e2f0000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101a35760003560e01c806370a08231116100ee578063b88d4fde11610097578063f0292a0311610071578063f0292a031461039d578063f2fde38b146103a6578063f9f2a7ce146103b9578063fce5ec95146103dc57600080fd5b8063b88d4fde1461032e578063c87b56dd14610341578063e985e9c51461035457600080fd5b80638da5cb5b116100c85780638da5cb5b146102f557806395d89b4114610313578063a22cb4651461031b57600080fd5b806370a08231146102c7578063715018a6146102da5780638b87da4b146102e257600080fd5b806332cb6b0c1161015057806346aa52ce1161012a57806346aa52ce1461029857806355f804b3146102a15780636352211e146102b457600080fd5b806332cb6b0c1461025c5780633408a2371461026557806342842e0e1461028557600080fd5b8063081812fc11610181578063081812fc146101fc578063095ea7b31461023457806323b872dd1461024957600080fd5b806301ffc9a7146101a8578063058e2994146101d057806306fdde03146101e7575b600080fd5b6101bb6101b6366004611d07565b6103ef565b60405190151581526020015b60405180910390f35b6101d960095481565b6040519081526020016101c7565b6101ef6104d4565b6040516101c79190611d74565b61020f61020a366004611d87565b610566565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c7565b610247610242366004611dc9565b61059a565b005b610247610257366004611df3565b610722565b6101d96103e881565b60065461020f9073ffffffffffffffffffffffffffffffffffffffff1681565b610247610293366004611df3565b6107a9565b6101d960085481565b6102476102af366004611ed4565b6107c4565b61020f6102c2366004611d87565b6107dc565b6101d96102d5366004611f1d565b61084e565b610247610902565b6102476102f0366004611f1d565b610916565b60075473ffffffffffffffffffffffffffffffffffffffff1661020f565b6101ef610964565b610247610329366004611f48565b610973565b61024761033c366004611f9b565b61097e565b6101ef61034f366004611d87565b610a0c565b6101bb610362366004612003565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b6101d96101f481565b6102476103b4366004611f1d565b610a73565b6101bb6103c7366004611f1d565b600a6020526000908152604090205460ff1681565b6102476103ea36600461202d565b610b0d565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061048257507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806104ce57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060600080546104e39061208b565b80601f016020809104026020016040519081016040528092919081815260200182805461050f9061208b565b801561055c5780601f106105315761010080835404028352916020019161055c565b820191906000526020600020905b81548152906001019060200180831161053f57829003601f168201915b5050505050905090565b600061057182610d0d565b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60006105a5826107dc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361064d5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821614806106a1575073ffffffffffffffffffffffffffffffffffffffff8116600090815260056020908152604080832033845290915290205460ff165b6107135760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610644565b61071d8383610d7e565b505050565b61072c3382610e1e565b61079e5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f7665640000000000000000000000000000000000006064820152608401610644565b61071d838383610ede565b61071d8383836040518060200160405280600081525061097e565b6107cc611111565b600b6107d8828261212c565b5050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16806104ce5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610644565b600073ffffffffffffffffffffffffffffffffffffffff82166108d95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152608401610644565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b61090a611111565b6109146000611178565b565b61091e611111565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831617905550565b50565b6060600180546104e39061208b565b6107d83383836111ef565b6109883383610e1e565b6109fa5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f7665640000000000000000000000000000000000006064820152608401610644565b610a0684848484611302565b50505050565b6060610a1782610d0d565b6000610a2161138b565b90506000815111610a415760405180602001604052806000815250610a6c565b80610a4b8461139a565b604051602001610a5c929190612228565b6040516020818303038152906040525b9392505050565b610a7b611111565b73ffffffffffffffffffffffffffffffffffffffff8116610b045760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610644565b61096181611178565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600a602052604090205460ff1615610b835760405162461bcd60e51b815260206004820152600e60248201527f616c7265616479206d696e7465640000000000000000000000000000000000006044820152606401610644565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600a6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905551610c0691869186910173ffffffffffffffffffffffffffffffffffffffff9290921682521515602082015260400190565b604051602081830303815290604052805190602001209050610c2881836114cf565b60008315610c9857506009546103e88110610c855760405162461bcd60e51b815260206004820152601360248201527f6d617820726573657276652072656163686564000000000000000000000000006044820152606401610644565b610c90816001612286565b600955610cfc565b506008546101f48110610ced5760405162461bcd60e51b815260206004820152601060248201527f6d6178206d696e742072656163686564000000000000000000000000000000006044820152606401610644565b610cf8816001612286565b6008555b610d06858261159e565b5050505050565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff166109615760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610644565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190610dd8826107dc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610e2a836107dc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610e98575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b80610ed657508373ffffffffffffffffffffffffffffffffffffffff16610ebe84610566565b73ffffffffffffffffffffffffffffffffffffffff16145b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff16610efe826107dc565b73ffffffffffffffffffffffffffffffffffffffff1614610f875760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610644565b73ffffffffffffffffffffffffffffffffffffffff821661100f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610644565b61101a600082610d7e565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120805460019290611050908490612299565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040812080546001929061108b908490612286565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60075473ffffffffffffffffffffffffffffffffffffffff1633146109145760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610644565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361126a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610644565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61130d848484610ede565b611319848484846115b8565b610a065760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610644565b6060600b80546104e39061208b565b6060816000036113dd57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561140757806113f1816122ac565b91506114009050600a83612313565b91506113e1565b60008167ffffffffffffffff81111561142257611422611e2f565b6040519080825280601f01601f19166020018201604052801561144c576020820181803683370190505b5090505b8415610ed657611461600183612299565b915061146e600a86612327565b611479906030612286565b60f81b81838151811061148e5761148e61233b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506114c8600a86612313565b9450611450565b600061153161152b846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b83611773565b60065490915073ffffffffffffffffffffffffffffffffffffffff80831691161461071d5760405162461bcd60e51b815260206004820152601160248201527f696e76616c6964207369676e61747572650000000000000000000000000000006044820152606401610644565b6107d8828260405180602001604052806000815250611797565b600073ffffffffffffffffffffffffffffffffffffffff84163b15611768576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061162f90339089908890889060040161236a565b6020604051808303816000875af192505050801561166a575060408051601f3d908101601f19168201909252611667918101906123b3565b60015b61171d573d808015611698576040519150601f19603f3d011682016040523d82523d6000602084013e61169d565b606091505b5080516000036117155760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610644565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050610ed6565b506001949350505050565b60008060006117828585611820565b9150915061178f81611865565b509392505050565b6117a18383611a51565b6117ae60008484846115b8565b61071d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610644565b60008082516041036118565760208301516040840151606085015160001a61184a87828585611bdf565b9450945050505061185e565b506000905060025b9250929050565b6000816004811115611879576118796123d0565b036118815750565b6001816004811115611895576118956123d0565b036118e25760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610644565b60028160048111156118f6576118f66123d0565b036119435760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610644565b6003816004811115611957576119576123d0565b036119ca5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610644565b60048160048111156119de576119de6123d0565b036109615760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610644565b73ffffffffffffffffffffffffffffffffffffffff8216611ab45760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610644565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1615611b265760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610644565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805460019290611b5c908490612286565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611c165750600090506003611cd0565b8460ff16601b14158015611c2e57508460ff16601c14155b15611c3f5750600090506004611cd0565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611c93573d6000803e3d6000fd5b5050604051601f19015191505073ffffffffffffffffffffffffffffffffffffffff8116611cc957600060019250925050611cd0565b9150600090505b94509492505050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461096157600080fd5b600060208284031215611d1957600080fd5b8135610a6c81611cd9565b60005b83811015611d3f578181015183820152602001611d27565b50506000910152565b60008151808452611d60816020860160208601611d24565b601f01601f19169290920160200192915050565b602081526000610a6c6020830184611d48565b600060208284031215611d9957600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611dc457600080fd5b919050565b60008060408385031215611ddc57600080fd5b611de583611da0565b946020939093013593505050565b600080600060608486031215611e0857600080fd5b611e1184611da0565b9250611e1f60208501611da0565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115611e7957611e79611e2f565b604051601f8501601f19908116603f01168101908282118183101715611ea157611ea1611e2f565b81604052809350858152868686011115611eba57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611ee657600080fd5b813567ffffffffffffffff811115611efd57600080fd5b8201601f81018413611f0e57600080fd5b610ed684823560208401611e5e565b600060208284031215611f2f57600080fd5b610a6c82611da0565b80358015158114611dc457600080fd5b60008060408385031215611f5b57600080fd5b611f6483611da0565b9150611f7260208401611f38565b90509250929050565b600082601f830112611f8c57600080fd5b610a6c83833560208501611e5e565b60008060008060808587031215611fb157600080fd5b611fba85611da0565b9350611fc860208601611da0565b925060408501359150606085013567ffffffffffffffff811115611feb57600080fd5b611ff787828801611f7b565b91505092959194509250565b6000806040838503121561201657600080fd5b61201f83611da0565b9150611f7260208401611da0565b60008060006060848603121561204257600080fd5b61204b84611da0565b925061205960208501611f38565b9150604084013567ffffffffffffffff81111561207557600080fd5b61208186828701611f7b565b9150509250925092565b600181811c9082168061209f57607f821691505b6020821081036120d8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561071d57600081815260208120601f850160051c810160208610156121055750805b601f850160051c820191505b8181101561212457828155600101612111565b505050505050565b815167ffffffffffffffff81111561214657612146611e2f565b61215a81612154845461208b565b846120de565b602080601f8311600181146121ad57600084156121775750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612124565b600085815260208120601f198616915b828110156121dc578886015182559484019460019091019084016121bd565b508582101561221857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000835161223a818460208801611d24565b83519083019061224e818360208801611d24565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104ce576104ce612257565b818103818111156104ce576104ce612257565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036122dd576122dd612257565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612322576123226122e4565b500490565b600082612336576123366122e4565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526123a96080830184611d48565b9695505050505050565b6000602082840312156123c557600080fd5b8151610a6c81611cd9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea2646970667358221220ee7a3cebd1cfd7b3055aded12f278f82b4b43c684c3bd344c3998b0475a65ebf64736f6c63430008130033

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

000000000000000000000000423e3e1de6dcdafdae15b4bb13b32db7dd671dec0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003868747470733a2f2f6170692e65617379332e6170703a31353030312f6170692f66726f6e74656e642f6561726c7942697264746f6b656e2f0000000000000000

-----Decoded View---------------
Arg [0] : remoteSigner_ (address): 0x423e3E1de6dCdaFdae15b4BB13B32db7dd671Dec
Arg [1] : uri_ (string): https://api.easy3.app:15001/api/frontend/earlyBirdtoken/

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000423e3e1de6dcdafdae15b4bb13b32db7dd671dec
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000038
Arg [3] : 68747470733a2f2f6170692e65617379332e6170703a31353030312f6170692f
Arg [4] : 66726f6e74656e642f6561726c7942697264746f6b656e2f0000000000000000


Deployed Bytecode Sourcemap

44427:1533:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31725:266;;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;31725:266:0;;;;;;;;44624:53;;;;;;;;;784:25:1;;;772:2;757:18;44624:53:0;638:177:1;32613:100:0;;;:::i;:::-;;;;;;;:::i;34089:171::-;;;;;;:::i;:::-;;:::i;:::-;;;1996:42:1;1984:55;;;1966:74;;1954:2;1939:18;34089:171:0;1820:226:1;33643:380:0;;;;;;:::i;:::-;;:::i;:::-;;34789:302;;;;;;:::i;:::-;;:::i;44494:41::-;;44531:4;44494:41;;23967:27;;;;;;;;;35162:151;;;;;;:::i;:::-;;:::i;44587:30::-;;;;;;44941:89;;;;;;:::i;:::-;;:::i;32324:222::-;;;;;;:::i;:::-;;:::i;32055:207::-;;;;;;:::i;:::-;;:::i;14680:103::-;;;:::i;45038:117::-;;;;;;:::i;:::-;;:::i;14032:87::-;14105:6;;;;14032:87;;32782:104;;;:::i;34332:155::-;;;;;;:::i;:::-;;:::i;35384:280::-;;;;;;:::i;:::-;;:::i;32957:281::-;;;;;;:::i;:::-;;:::i;34558:164::-;;;;;;:::i;:::-;34679:25;;;;34655:4;34679:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34558:164;44542:38;;44577:3;44542:38;;14938:201;;;;;;:::i;:::-;;:::i;44686:55::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;45163:681;;;;;;:::i;:::-;;:::i;31725:266::-;31827:4;31851:40;;;31866:25;31851:40;;:92;;-1:-1:-1;31895:48:0;;;31910:33;31895:48;31851:92;:132;;;-1:-1:-1;9818:25:0;9803:40;;;;31947:36;31844:139;31725:266;-1:-1:-1;;31725:266:0:o;32613:100::-;32667:13;32700:5;32693:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32613:100;:::o;34089:171::-;34165:7;34185:23;34200:7;34185:14;:23::i;:::-;-1:-1:-1;34228:24:0;;;;:15;:24;;;;;;;;;34089:171::o;33643:380::-;33724:13;33740:23;33755:7;33740:14;:23::i;:::-;33724:39;;33788:5;33782:11;;:2;:11;;;33774:57;;;;-1:-1:-1;;;33774:57:0;;6944:2:1;33774:57:0;;;6926:21:1;6983:2;6963:18;;;6956:30;7022:34;7002:18;;;6995:62;7093:3;7073:18;;;7066:31;7114:19;;33774:57:0;;;;;;;;;12821:10;33852:21;;;;;:62;;-1:-1:-1;34679:25:0;;;34655:4;34679:25;;;:18;:25;;;;;;;;12821:10;34679:35;;;;;;;;;;33877:37;33844:137;;;;-1:-1:-1;;;33844:137:0;;7346:2:1;33844:137:0;;;7328:21:1;7385:2;7365:18;;;7358:30;7424:34;7404:18;;;7397:62;7495:32;7475:18;;;7468:60;7545:19;;33844:137:0;7144:426:1;33844:137:0;33994:21;34003:2;34007:7;33994:8;:21::i;:::-;33713:310;33643:380;;:::o;34789:302::-;34950:41;12821:10;34983:7;34950:18;:41::i;:::-;34942:100;;;;-1:-1:-1;;;34942:100:0;;7777:2:1;34942:100:0;;;7759:21:1;7816:2;7796:18;;;7789:30;7855:34;7835:18;;;7828:62;7926:16;7906:18;;;7899:44;7960:19;;34942:100:0;7575:410:1;34942:100:0;35055:28;35065:4;35071:2;35075:7;35055:9;:28::i;35162:151::-;35266:39;35283:4;35289:2;35293:7;35266:39;;;;;;;;;;;;:16;:39::i;44941:89::-;13918:13;:11;:13::i;:::-;45011:4:::1;:11;45018:4:::0;45011;:11:::1;:::i;:::-;;44941:89:::0;:::o;32324:222::-;32396:7;32432:16;;;:7;:16;;;;;;;;;32459:56;;;;-1:-1:-1;;;32459:56:0;;10575:2:1;32459:56:0;;;10557:21:1;10614:2;10594:18;;;10587:30;10653:26;10633:18;;;10626:54;10697:18;;32459:56:0;10373:348:1;32055:207:0;32127:7;32155:19;;;32147:73;;;;-1:-1:-1;;;32147:73:0;;10928:2:1;32147:73:0;;;10910:21:1;10967:2;10947:18;;;10940:30;11006:34;10986:18;;;10979:62;11077:11;11057:18;;;11050:39;11106:19;;32147:73:0;10726:405:1;32147:73:0;-1:-1:-1;32238:16:0;;;;;;:9;:16;;;;;;;32055:207::o;14680:103::-;13918:13;:11;:13::i;:::-;14745:30:::1;14772:1;14745:18;:30::i;:::-;14680:103::o:0;45038:117::-;13918:13;:11;:13::i;:::-;24165:12;:28;;;;;;;;;;45038:117;:::o;45116:31::-:1;45038:117:::0;:::o;32782:104::-;32838:13;32871:7;32864:14;;;;;:::i;34332:155::-;34427:52;12821:10;34460:8;34470;34427:18;:52::i;35384:280::-;35515:41;12821:10;35548:7;35515:18;:41::i;:::-;35507:100;;;;-1:-1:-1;;;35507:100:0;;7777:2:1;35507:100:0;;;7759:21:1;7816:2;7796:18;;;7789:30;7855:34;7835:18;;;7828:62;7926:16;7906:18;;;7899:44;7960:19;;35507:100:0;7575:410:1;35507:100:0;35618:38;35632:4;35638:2;35642:7;35651:4;35618:13;:38::i;:::-;35384:280;;;;:::o;32957:281::-;33030:13;33056:23;33071:7;33056:14;:23::i;:::-;33092:21;33116:10;:8;:10::i;:::-;33092:34;;33168:1;33150:7;33144:21;:25;:86;;;;;;;;;;;;;;;;;33196:7;33205:18;:7;:16;:18::i;:::-;33179:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33144:86;33137:93;32957:281;-1:-1:-1;;;32957:281:0:o;14938:201::-;13918:13;:11;:13::i;:::-;15027:22:::1;::::0;::::1;15019:73;;;::::0;-1:-1:-1;;;15019:73:0;;11839:2:1;15019:73:0::1;::::0;::::1;11821:21:1::0;11878:2;11858:18;;;11851:30;11917:34;11897:18;;;11890:62;11988:8;11968:18;;;11961:36;12014:19;;15019:73:0::1;11637:402:1::0;15019:73:0::1;15103:28;15122:8;15103:18;:28::i;45163:681::-:0;45259:12;;;;;;;:8;:12;;;;;;;;45258:13;45250:40;;;;-1:-1:-1;;;45250:40:0;;12246:2:1;45250:40:0;;;12228:21:1;12285:2;12265:18;;;12258:30;12324:16;12304:18;;;12297:44;12358:18;;45250:40:0;12044:338:1;45250:40:0;45301:12;;;;;;;:8;:12;;;;;;;;:19;;;;45316:4;45301:19;;;45361:26;;;45310:2;;45376:10;;45361:26;12585:42:1;12573:55;;;;12555:74;;12672:14;12665:22;12660:2;12645:18;;12638:50;12543:2;12528:18;;12387:307;45361:26:0;;;;;;;;;;;;;45351:37;;;;;;45333:55;;45399:35;45415:7;45424:9;45399:15;:35::i;:::-;45445:15;45475:10;45471:333;;;-1:-1:-1;45512:14:0;;44531:4;45549:20;;45541:52;;;;-1:-1:-1;;;45541:52:0;;12901:2:1;45541:52:0;;;12883:21:1;12940:2;12920:18;;;12913:30;12979:21;12959:18;;;12952:49;13018:18;;45541:52:0;12699:343:1;45541:52:0;45625:11;:7;45635:1;45625:11;:::i;:::-;45608:14;:28;45471:333;;;-1:-1:-1;45679:11:0;;44577:3;45713:18;;45705:47;;;;-1:-1:-1;;;45705:47:0;;13568:2:1;45705:47:0;;;13550:21:1;13607:2;13587:18;;;13580:30;13646:18;13626;;;13619:46;13682:18;;45705:47:0;13366:340:1;45705:47:0;45781:11;:7;45791:1;45781:11;:::i;:::-;45767;:25;45471:333;45814:22;45824:2;45828:7;45814:9;:22::i;:::-;45239:605;;45163:681;;;:::o;41771:135::-;37193:4;37217:16;;;:7;:16;;;;;;:30;:16;41845:53;;;;-1:-1:-1;;;41845:53:0;;10575:2:1;41845:53:0;;;10557:21:1;10614:2;10594:18;;;10587:30;10653:26;10633:18;;;10626:54;10697:18;;41845:53:0;10373:348:1;41084:174:0;41159:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;41213:23;41159:24;41213:14;:23::i;:::-;41204:46;;;;;;;;;;;;41084:174;;:::o;37422:264::-;37515:4;37532:13;37548:23;37563:7;37548:14;:23::i;:::-;37532:39;;37601:5;37590:16;;:7;:16;;;:52;;;-1:-1:-1;34679:25:0;;;;34655:4;34679:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;37610:32;37590:87;;;;37670:7;37646:31;;:20;37658:7;37646:11;:20::i;:::-;:31;;;37590:87;37582:96;37422:264;-1:-1:-1;;;;37422:264:0:o;40374:591::-;40499:4;40472:31;;:23;40487:7;40472:14;:23::i;:::-;:31;;;40464:81;;;;-1:-1:-1;;;40464:81:0;;13913:2:1;40464:81:0;;;13895:21:1;13952:2;13932:18;;;13925:30;13991:34;13971:18;;;13964:62;14062:7;14042:18;;;14035:35;14087:19;;40464:81:0;13711:401:1;40464:81:0;40564:16;;;40556:65;;;;-1:-1:-1;;;40556:65:0;;14319:2:1;40556:65:0;;;14301:21:1;14358:2;14338:18;;;14331:30;14397:34;14377:18;;;14370:62;14468:6;14448:18;;;14441:34;14492:19;;40556:65:0;14117:400:1;40556:65:0;40738:29;40755:1;40759:7;40738:8;:29::i;:::-;40780:15;;;;;;;:9;:15;;;;;:20;;40799:1;;40780:15;:20;;40799:1;;40780:20;:::i;:::-;;;;-1:-1:-1;;40811:13:0;;;;;;;:9;:13;;;;;:18;;40828:1;;40811:13;:18;;40828:1;;40811:18;:::i;:::-;;;;-1:-1:-1;;40840:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;;40879:27;;40840:16;;40879:27;;;;;;;33713:310;33643:380;;:::o;14197:132::-;14105:6;;14261:23;14105:6;12821:10;14261:23;14253:68;;;;-1:-1:-1;;;14253:68:0;;14857:2:1;14253:68:0;;;14839:21:1;;;14876:18;;;14869:30;14935:34;14915:18;;;14908:62;14987:18;;14253:68:0;14655:356:1;15299:191:0;15392:6;;;;15409:17;;;;;;;;;;;15442:40;;15392:6;;;15409:17;15392:6;;15442:40;;15373:16;;15442:40;15362:128;15299:191;:::o;41401:281::-;41522:8;41513:17;;:5;:17;;;41505:55;;;;-1:-1:-1;;;41505:55:0;;15218:2:1;41505:55:0;;;15200:21:1;15257:2;15237:18;;;15230:30;15296:27;15276:18;;;15269:55;15341:18;;41505:55:0;15016:349:1;41505:55:0;41571:25;;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;41633:41;;586::1;;;41633::0;;559:18:1;41633:41:0;;;;;;;41401:281;;;:::o;36545:270::-;36658:28;36668:4;36674:2;36678:7;36658:9;:28::i;:::-;36705:47;36728:4;36734:2;36738:7;36747:4;36705:22;:47::i;:::-;36697:110;;;;-1:-1:-1;;;36697:110:0;;15572:2:1;36697:110:0;;;15554:21:1;15611:2;15591:18;;;15584:30;15650:34;15630:18;;;15623:62;15721:20;15701:18;;;15694:48;15759:19;;36697:110:0;15370:414:1;45852:105:0;45912:13;45945:4;45938:11;;;;;:::i;10134:723::-;10190:13;10411:5;10420:1;10411:10;10407:53;;-1:-1:-1;;10438:10:0;;;;;;;;;;;;;;;;;;10134:723::o;10407:53::-;10485:5;10470:12;10526:78;10533:9;;10526:78;;10559:8;;;;:::i;:::-;;-1:-1:-1;10582:10:0;;-1:-1:-1;10590:2:0;10582:10;;:::i;:::-;;;10526:78;;;10614:19;10646:6;10636:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10636:17:0;;10614:39;;10664:154;10671:10;;10664:154;;10698:11;10708:1;10698:11;;:::i;:::-;;-1:-1:-1;10767:10:0;10775:2;10767:5;:10;:::i;:::-;10754:24;;:2;:24;:::i;:::-;10741:39;;10724:6;10731;10724:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;10795:11:0;10804:2;10795:11;;:::i;:::-;;;10664:154;;24209:242;24300:14;24317:63;24331:37;24360:7;22813:58;;17968:66:1;22813:58:0;;;17956:79:1;18051:12;;;18044:28;;;22680:7:0;;18088:12:1;;22813:58:0;;;;;;;;;;;;22803:69;;;;;;22796:76;;22611:269;;;;24331:37;24370:9;24317:13;:63::i;:::-;24409:12;;24300:80;;-1:-1:-1;24409:12:0;24399:22;;;24409:12;;24399:22;24391:52;;;;-1:-1:-1;;;24391:52:0;;16811:2:1;24391:52:0;;;16793:21:1;16850:2;16830:18;;;16823:30;16889:19;16869:18;;;16862:47;16926:18;;24391:52:0;16609:341:1;38028:110:0;38104:26;38114:2;38118:7;38104:26;;;;;;;;;;;;:9;:26::i;42470:810::-;42581:4;42602:13;;;1434:19;:23;42598:675;;42638:71;;;;;:36;;;;;;:71;;12821:10;;42689:4;;42695:7;;42704:4;;42638:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42638:71:0;;;;;;;;-1:-1:-1;;42638:71:0;;;;;;;;;;;;:::i;:::-;;;42634:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42879:6;:13;42896:1;42879:18;42875:328;;42922:60;;-1:-1:-1;;;42922:60:0;;15572:2:1;42922:60:0;;;15554:21:1;15611:2;15591:18;;;15584:30;15650:34;15630:18;;;15623:62;15721:20;15701:18;;;15694:48;15759:19;;42922:60:0;15370:414:1;42875:328:0;43153:6;43147:13;43138:6;43134:2;43130:15;43123:38;42634:584;42760:51;;42770:41;42760:51;;-1:-1:-1;42753:58:0;;42598:675;-1:-1:-1;43257:4:0;42470:810;;;;;;:::o;18963:231::-;19041:7;19062:17;19081:18;19103:27;19114:4;19120:9;19103:10;:27::i;:::-;19061:69;;;;19141:18;19153:5;19141:11;:18::i;:::-;-1:-1:-1;19177:9:0;18963:231;-1:-1:-1;;;18963:231:0:o;38365:248::-;38460:18;38466:2;38470:7;38460:5;:18::i;:::-;38497:53;38528:1;38532:2;38536:7;38545:4;38497:22;:53::i;:::-;38489:116;;;;-1:-1:-1;;;38489:116:0;;15572:2:1;38489:116:0;;;15554:21:1;15611:2;15591:18;;;15584:30;15650:34;15630:18;;;15623:62;15721:20;15701:18;;;15694:48;15759:19;;38489:116:0;15370:414:1;17414:747:0;17495:7;17504:12;17533:9;:16;17553:2;17533:22;17529:625;;17877:4;17862:20;;17856:27;17927:4;17912:20;;17906:27;17985:4;17970:20;;17964:27;17572:9;17956:36;18028:25;18039:4;17956:36;17856:27;17906;18028:10;:25::i;:::-;18021:32;;;;;;;;;17529:625;-1:-1:-1;18102:1:0;;-1:-1:-1;18106:35:0;17529:625;17414:747;;;;;:::o;15685:643::-;15763:20;15754:5;:29;;;;;;;;:::i;:::-;;15750:571;;15685:643;:::o;15750:571::-;15861:29;15852:5;:38;;;;;;;;:::i;:::-;;15848:473;;15907:34;;-1:-1:-1;;;15907:34:0;;18502:2:1;15907:34:0;;;18484:21:1;18541:2;18521:18;;;18514:30;18580:26;18560:18;;;18553:54;18624:18;;15907:34:0;18300:348:1;15848:473:0;15972:35;15963:5;:44;;;;;;;;:::i;:::-;;15959:362;;16024:41;;-1:-1:-1;;;16024:41:0;;18855:2:1;16024:41:0;;;18837:21:1;18894:2;18874:18;;;18867:30;18933:33;18913:18;;;18906:61;18984:18;;16024:41:0;18653:355:1;15959:362:0;16096:30;16087:5;:39;;;;;;;;:::i;:::-;;16083:238;;16143:44;;-1:-1:-1;;;16143:44:0;;19215:2:1;16143:44:0;;;19197:21:1;19254:2;19234:18;;;19227:30;19293:34;19273:18;;;19266:62;19364:4;19344:18;;;19337:32;19386:19;;16143:44:0;19013:398:1;16083:238:0;16218:30;16209:5;:39;;;;;;;;:::i;:::-;;16205:116;;16265:44;;-1:-1:-1;;;16265:44:0;;19618:2:1;16265:44:0;;;19600:21:1;19657:2;19637:18;;;19630:30;19696:34;19676:18;;;19669:62;19767:4;19747:18;;;19740:32;19789:19;;16265:44:0;19416:398:1;38949:439:0;39029:16;;;39021:61;;;;-1:-1:-1;;;39021:61:0;;20021:2:1;39021:61:0;;;20003:21:1;;;20040:18;;;20033:30;20099:34;20079:18;;;20072:62;20151:18;;39021:61:0;19819:356:1;39021:61:0;37193:4;37217:16;;;:7;:16;;;;;;:30;:16;:30;39093:58;;;;-1:-1:-1;;;39093:58:0;;20382:2:1;39093:58:0;;;20364:21:1;20421:2;20401:18;;;20394:30;20460;20440:18;;;20433:58;20508:18;;39093:58:0;20180:352:1;39093:58:0;39222:13;;;;;;;:9;:13;;;;;:18;;39239:1;;39222:13;:18;;39239:1;;39222:18;:::i;:::-;;;;-1:-1:-1;;39251:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;39290:33;;39251:16;;;39290:33;;39251:16;;39290:33;45011:11:::1;44941:89:::0;:::o;20347:1589::-;20435:7;;21369:66;21356:79;;21352:163;;;-1:-1:-1;21468:1:0;;-1:-1:-1;21472:30:0;21452:51;;21352:163;21529:1;:7;;21534:2;21529:7;;:18;;;;;21540:1;:7;;21545:2;21540:7;;21529:18;21525:102;;;-1:-1:-1;21580:1:0;;-1:-1:-1;21584:30:0;21564:51;;21525:102;21741:24;;;21724:14;21741:24;;;;;;;;;20764:25:1;;;20837:4;20825:17;;20805:18;;;20798:45;;;;20859:18;;;20852:34;;;20902:18;;;20895:34;;;21741:24:0;;20736:19:1;;21741:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21741:24:0;;-1:-1:-1;;21741:24:0;;;-1:-1:-1;;21780:20:0;;;21776:103;;21833:1;21837:29;21817:50;;;;;;;21776:103;21899:6;-1:-1:-1;21907:20:0;;-1:-1:-1;20347:1589:0;;;;;;;;:::o;14:177:1:-;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;820:250::-;905:1;915:113;929:6;926:1;923:13;915:113;;;1005:11;;;999:18;986:11;;;979:39;951:2;944:10;915:113;;;-1:-1:-1;;1062:1:1;1044:16;;1037:27;820:250::o;1075:330::-;1117:3;1155:5;1149:12;1182:6;1177:3;1170:19;1198:76;1267:6;1260:4;1255:3;1251:14;1244:4;1237:5;1233:16;1198:76;:::i;:::-;1319:2;1307:15;-1:-1:-1;;1303:88:1;1294:98;;;;1394:4;1290:109;;1075:330;-1:-1:-1;;1075:330:1:o;1410:220::-;1559:2;1548:9;1541:21;1522:4;1579:45;1620:2;1609:9;1605:18;1597:6;1579:45;:::i;1635:180::-;1694:6;1747:2;1735:9;1726:7;1722:23;1718:32;1715:52;;;1763:1;1760;1753:12;1715:52;-1:-1:-1;1786:23:1;;1635:180;-1:-1:-1;1635:180:1:o;2051:196::-;2119:20;;2179:42;2168:54;;2158:65;;2148:93;;2237:1;2234;2227:12;2148:93;2051:196;;;:::o;2252:254::-;2320:6;2328;2381:2;2369:9;2360:7;2356:23;2352:32;2349:52;;;2397:1;2394;2387:12;2349:52;2420:29;2439:9;2420:29;:::i;:::-;2410:39;2496:2;2481:18;;;;2468:32;;-1:-1:-1;;;2252:254:1:o;2511:328::-;2588:6;2596;2604;2657:2;2645:9;2636:7;2632:23;2628:32;2625:52;;;2673:1;2670;2663:12;2625:52;2696:29;2715:9;2696:29;:::i;:::-;2686:39;;2744:38;2778:2;2767:9;2763:18;2744:38;:::i;:::-;2734:48;;2829:2;2818:9;2814:18;2801:32;2791:42;;2511:328;;;;;:::o;2844:184::-;2896:77;2893:1;2886:88;2993:4;2990:1;2983:15;3017:4;3014:1;3007:15;3033:691;3098:5;3128:18;3169:2;3161:6;3158:14;3155:40;;;3175:18;;:::i;:::-;3309:2;3303:9;3375:2;3363:15;;-1:-1:-1;;3359:24:1;;;3385:2;3355:33;3351:42;3339:55;;;3409:18;;;3429:22;;;3406:46;3403:72;;;3455:18;;:::i;:::-;3495:10;3491:2;3484:22;3524:6;3515:15;;3554:6;3546;3539:22;3594:3;3585:6;3580:3;3576:16;3573:25;3570:45;;;3611:1;3608;3601:12;3570:45;3661:6;3656:3;3649:4;3641:6;3637:17;3624:44;3716:1;3709:4;3700:6;3692;3688:19;3684:30;3677:41;;;;3033:691;;;;;:::o;3729:451::-;3798:6;3851:2;3839:9;3830:7;3826:23;3822:32;3819:52;;;3867:1;3864;3857:12;3819:52;3907:9;3894:23;3940:18;3932:6;3929:30;3926:50;;;3972:1;3969;3962:12;3926:50;3995:22;;4048:4;4040:13;;4036:27;-1:-1:-1;4026:55:1;;4077:1;4074;4067:12;4026:55;4100:74;4166:7;4161:2;4148:16;4143:2;4139;4135:11;4100:74;:::i;4185:186::-;4244:6;4297:2;4285:9;4276:7;4272:23;4268:32;4265:52;;;4313:1;4310;4303:12;4265:52;4336:29;4355:9;4336:29;:::i;4376:160::-;4441:20;;4497:13;;4490:21;4480:32;;4470:60;;4526:1;4523;4516:12;4541:254;4606:6;4614;4667:2;4655:9;4646:7;4642:23;4638:32;4635:52;;;4683:1;4680;4673:12;4635:52;4706:29;4725:9;4706:29;:::i;:::-;4696:39;;4754:35;4785:2;4774:9;4770:18;4754:35;:::i;:::-;4744:45;;4541:254;;;;;:::o;4800:221::-;4842:5;4895:3;4888:4;4880:6;4876:17;4872:27;4862:55;;4913:1;4910;4903:12;4862:55;4935:80;5011:3;5002:6;4989:20;4982:4;4974:6;4970:17;4935:80;:::i;5026:537::-;5121:6;5129;5137;5145;5198:3;5186:9;5177:7;5173:23;5169:33;5166:53;;;5215:1;5212;5205:12;5166:53;5238:29;5257:9;5238:29;:::i;:::-;5228:39;;5286:38;5320:2;5309:9;5305:18;5286:38;:::i;:::-;5276:48;;5371:2;5360:9;5356:18;5343:32;5333:42;;5426:2;5415:9;5411:18;5398:32;5453:18;5445:6;5442:30;5439:50;;;5485:1;5482;5475:12;5439:50;5508:49;5549:7;5540:6;5529:9;5525:22;5508:49;:::i;:::-;5498:59;;;5026:537;;;;;;;:::o;5568:260::-;5636:6;5644;5697:2;5685:9;5676:7;5672:23;5668:32;5665:52;;;5713:1;5710;5703:12;5665:52;5736:29;5755:9;5736:29;:::i;:::-;5726:39;;5784:38;5818:2;5807:9;5803:18;5784:38;:::i;5833:462::-;5916:6;5924;5932;5985:2;5973:9;5964:7;5960:23;5956:32;5953:52;;;6001:1;5998;5991:12;5953:52;6024:29;6043:9;6024:29;:::i;:::-;6014:39;;6072:35;6103:2;6092:9;6088:18;6072:35;:::i;:::-;6062:45;;6158:2;6147:9;6143:18;6130:32;6185:18;6177:6;6174:30;6171:50;;;6217:1;6214;6207:12;6171:50;6240:49;6281:7;6272:6;6261:9;6257:22;6240:49;:::i;:::-;6230:59;;;5833:462;;;;;:::o;6300:437::-;6379:1;6375:12;;;;6422;;;6443:61;;6497:4;6489:6;6485:17;6475:27;;6443:61;6550:2;6542:6;6539:14;6519:18;6516:38;6513:218;;6587:77;6584:1;6577:88;6688:4;6685:1;6678:15;6716:4;6713:1;6706:15;6513:218;;6300:437;;;:::o;8116:545::-;8218:2;8213:3;8210:11;8207:448;;;8254:1;8279:5;8275:2;8268:17;8324:4;8320:2;8310:19;8394:2;8382:10;8378:19;8375:1;8371:27;8365:4;8361:38;8430:4;8418:10;8415:20;8412:47;;;-1:-1:-1;8453:4:1;8412:47;8508:2;8503:3;8499:12;8496:1;8492:20;8486:4;8482:31;8472:41;;8563:82;8581:2;8574:5;8571:13;8563:82;;;8626:17;;;8607:1;8596:13;8563:82;;;8567:3;;;8116:545;;;:::o;8897:1471::-;9023:3;9017:10;9050:18;9042:6;9039:30;9036:56;;;9072:18;;:::i;:::-;9101:97;9191:6;9151:38;9183:4;9177:11;9151:38;:::i;:::-;9145:4;9101:97;:::i;:::-;9253:4;;9317:2;9306:14;;9334:1;9329:782;;;;10155:1;10172:6;10169:89;;;-1:-1:-1;10224:19:1;;;10218:26;10169:89;8803:66;8794:1;8790:11;;;8786:84;8782:89;8772:100;8878:1;8874:11;;;8769:117;10271:81;;9299:1063;;9329:782;8063:1;8056:14;;;8100:4;8087:18;;-1:-1:-1;;9365:79:1;;;9542:236;9556:7;9553:1;9550:14;9542:236;;;9645:19;;;9639:26;9624:42;;9737:27;;;;9705:1;9693:14;;;;9572:19;;9542:236;;;9546:3;9806:6;9797:7;9794:19;9791:261;;;9867:19;;;9861:26;9968:66;9950:1;9946:14;;;9962:3;9942:24;9938:97;9934:102;9919:118;9904:134;;9791:261;-1:-1:-1;;;;;10098:1:1;10082:14;;;10078:22;10065:36;;-1:-1:-1;8897:1471:1:o;11136:496::-;11315:3;11353:6;11347:13;11369:66;11428:6;11423:3;11416:4;11408:6;11404:17;11369:66;:::i;:::-;11498:13;;11457:16;;;;11520:70;11498:13;11457:16;11567:4;11555:17;;11520:70;:::i;:::-;11606:20;;11136:496;-1:-1:-1;;;;11136:496:1:o;13047:184::-;13099:77;13096:1;13089:88;13196:4;13193:1;13186:15;13220:4;13217:1;13210:15;13236:125;13301:9;;;13322:10;;;13319:36;;;13335:18;;:::i;14522:128::-;14589:9;;;14610:11;;;14607:37;;;14624:18;;:::i;15789:195::-;15828:3;15859:66;15852:5;15849:77;15846:103;;15929:18;;:::i;:::-;-1:-1:-1;15976:1:1;15965:13;;15789:195::o;15989:184::-;16041:77;16038:1;16031:88;16138:4;16135:1;16128:15;16162:4;16159:1;16152:15;16178:120;16218:1;16244;16234:35;;16249:18;;:::i;:::-;-1:-1:-1;16283:9:1;;16178:120::o;16303:112::-;16335:1;16361;16351:35;;16366:18;;:::i;:::-;-1:-1:-1;16400:9:1;;16303:112::o;16420:184::-;16472:77;16469:1;16462:88;16569:4;16566:1;16559:15;16593:4;16590:1;16583:15;16955:512;17149:4;17178:42;17259:2;17251:6;17247:15;17236:9;17229:34;17311:2;17303:6;17299:15;17294:2;17283:9;17279:18;17272:43;;17351:6;17346:2;17335:9;17331:18;17324:34;17394:3;17389:2;17378:9;17374:18;17367:31;17415:46;17456:3;17445:9;17441:19;17433:6;17415:46;:::i;:::-;17407:54;16955:512;-1:-1:-1;;;;;;16955:512:1:o;17472:249::-;17541:6;17594:2;17582:9;17573:7;17569:23;17565:32;17562:52;;;17610:1;17607;17600:12;17562:52;17642:9;17636:16;17661:30;17685:5;17661:30;:::i;18111:184::-;18163:77;18160:1;18153:88;18260:4;18257:1;18250:15;18284:4;18281:1;18274:15

Swarm Source

ipfs://ee7a3cebd1cfd7b3055aded12f278f82b4b43c684c3bd344c3998b0475a65ebf
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.