ETH Price: $3,286.63 (-0.40%)

Token

Nug Life (Nugs)
 

Overview

Max Total Supply

4,200 Nugs

Holders

174

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
4 Nugs
0xfa9a7ad60eb8e2552a3fb2b5abecc75ae7b3bf45
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:
NugLifeNFT

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-11
*/

// SPDX-License-Identifier: GPL-3.0
// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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


// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @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`, 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 be 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 Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

// File: SMSC.sol



pragma solidity ^0.8.4;

interface IERC20 {
    function totalSupply() external view returns (uint256);

    function decimals() external view returns (uint8);

    function symbol() external view returns (string memory);

    function name() external view returns (string memory);

    function getOwner() external view returns (address);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount) external returns (bool);

    function allowance(address _owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);
}



error TransferToNonERC721ReceiverImplementer();

contract Ownable {
    address public owner;

    constructor() {
        owner = msg.sender;
    }

    // ownership
    modifier onlyOwner() {
        require(msg.sender == owner, "ERROR! Access denied");
        _;
    }

    function transferOwnership(address _newOwner) external onlyOwner {
        owner = _newOwner;
    }

    function renounceOwnership() external onlyOwner {
        owner = address(0);
    }
}

contract NugLifeNFT is IERC721, Ownable {
    using Address for address;
    using Strings for uint256;

    string private _name = "Nug Life";
    string private _symbol = "Nugs";

    uint public totalSupply;

    bool public revealed;
    uint256 internal _currentIndex = 1;

    mapping(address => uint256) private _balances;
    mapping(uint256 => address) public ownership;

    string public baseURI;
    string public norevealedURI;
    string public baseExtension;

    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    modifier onlyTokenOwner(uint256 tokenId) {
        require(
            ownerOf(tokenId) == msg.sender,
            "ERROR! You must be the token owner"
        );
        _;
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        require(
            tokenId <= totalSupply,
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        _setApprovalForAll(msg.sender, operator, approved);
    }

    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }

    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ownerOf(tokenId), to, tokenId);
    }

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

    function balanceOf(address owner) public view override returns (uint256) {
        return _balances[owner];
    }

    function ownerOf(uint256 tokenId) public view override returns (address) {
        if (tokenId >= _currentIndex) {
            return address(0);
        }

        uint256 id = tokenId;
        while (id > 1 && ownership[id] == address(0)) {
            id -= 1;
        }
        return ownership[id];
    }

    function premint(uint256 amount, address to) external onlyOwner {

        for (uint256 i = 0; i < amount; i += 1) {
            emit Transfer(address(0), to, _currentIndex + i);
        }

        ownership[_currentIndex] = to;
        _mint(to, amount);

        totalSupply += amount;
    }

    function _mint(address to, uint256 amount) internal {
        _balances[to] += amount;
        _currentIndex += amount;
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);

        if (!_checkOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal {
        address preOwner = ownerOf(tokenId);

        require(from != to, "You cannot transfer to yourself");
        require(from == preOwner, "Invalid from address");
        require(
            msg.sender == preOwner ||
                isApprovedForAll(preOwner, msg.sender) ||
                getApproved(tokenId) == msg.sender,
            "Access denied"
        );

        _approve(address(0), tokenId);

        ownership[tokenId] = to;

        uint256 nextId = tokenId + 1;

        if (ownership[nextId] == address(0) && nextId < _currentIndex) {
            ownership[nextId] = preOwner;
        }

        _balances[preOwner] -= 1;
        _balances[to] += 1;

        emit Transfer(from, to, tokenId);
    }

    function tokenURI(uint256 tokenId) public view returns (string memory) {
        require(
            tokenId <= totalSupply,
            "ERC721Metadata: URI query for nonexistent token"
        );

        if (revealed == false) {
            return norevealedURI;
        }

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

    function setBaseURI(string memory _baseURI) external onlyOwner {
        baseURI = _baseURI;
    }

    function setUnrevealedURI(string memory _uri) external onlyOwner {
        norevealedURI = _uri;
    }

    function setBaseExtension(string memory _ext) external onlyOwner {
        baseExtension = _ext;
    }

    function reveal() external onlyOwner {
        revealed = true;
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            interfaceId == type(IERC165).interfaceId;
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                IERC721Receiver(to).onERC721Received(
                    msg.sender,
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert TransferToNonERC721ReceiverImplementer();
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    function withdraw(address payable to) external onlyOwner {
        Address.sendValue(to, address(this).balance);
    }

    function recoverToken(address token, address to) external onlyOwner {
        IERC20(token).transfer(to, IERC20(token).balanceOf(address(this)));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"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":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"norevealedURI","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownership","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"premint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"_ext","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setUnrevealedURI","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":[],"name":"totalSupply","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":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c060405260086080819052674e7567204c69666560c01b60a09081526200002b916001919062000085565b50604080518082019091526004808252634e75677360e01b6020909201918252620000599160029162000085565b5060016005553480156200006c57600080fd5b50600080546001600160a01b0319163317905562000168565b82805462000093906200012b565b90600052602060002090601f016020900481019282620000b7576000855562000102565b82601f10620000d257805160ff191683800117855562000102565b8280016001018555821562000102579182015b8281111562000102578251825591602001919060010190620000e5565b506200011092915062000114565b5090565b5b8082111562000110576000815560010162000115565b600181811c908216806200014057607f821691505b602082108114156200016257634e487b7160e01b600052602260045260246000fd5b50919050565b611b7f80620001786000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063715018a611610104578063b88d4fde116100a2578063e985e9c511610071578063e985e9c5146103c8578063f2fde38b146103db578063fe2c7fee146103ee578063feaea5861461040157600080fd5b8063b88d4fde14610387578063c66828621461039a578063c87b56dd146103a2578063da3ef23f146103b557600080fd5b8063a0f45b69116100de578063a0f45b691461033b578063a22cb46514610364578063a475b5dd14610377578063b584b78d1461037f57600080fd5b8063715018a6146103185780638da5cb5b1461032057806395d89b411461033357600080fd5b8063518302271161017157806355f804b31161014b57806355f804b3146102c15780636352211e146102d45780636c0360eb146102e757806370a08231146102ef57600080fd5b8063518302271461028e57806351cff8d91461029b578063538dba3e146102ae57600080fd5b8063095ea7b3116101ad578063095ea7b31461023c57806318160ddd1461025157806323b872dd1461026857806342842e0e1461027b57600080fd5b806301ffc9a7146101d457806306fdde03146101fc578063081812fc14610211575b600080fd5b6101e76101e23660046117b7565b610414565b60405190151581526020015b60405180910390f35b610204610466565b6040516101f391906119b4565b61022461021f366004611835565b6104f8565b6040516001600160a01b0390911681526020016101f3565b61024f61024a366004611770565b610582565b005b61025a60035481565b6040519081526020016101f3565b61024f610276366004611686565b610698565b61024f610289366004611686565b6106a3565b6004546101e79060ff1681565b61024f6102a9366004611632565b6106be565b61024f6102bc366004611865565b6106f5565b61024f6102cf3660046117ef565b6107d0565b6102246102e2366004611835565b610811565b610204610880565b61025a6102fd366004611632565b6001600160a01b031660009081526006602052604090205490565b61024f61090e565b600054610224906001600160a01b031681565b61020461094a565b610224610349366004611835565b6007602052600090815260409020546001600160a01b031681565b61024f610372366004611743565b610959565b61024f610964565b61020461099d565b61024f6103953660046116c6565b6109aa565b6102046109e4565b6102046103b0366004611835565b6109f1565b61024f6103c33660046117ef565b610bdb565b6101e76103d636600461164e565b610c18565b61024f6103e9366004611632565b610c46565b61024f6103fc3660046117ef565b610c92565b61024f61040f36600461164e565b610ccf565b60006001600160e01b031982166380ac58cd60e01b148061044557506001600160e01b03198216635b5e139f60e01b145b8061046057506001600160e01b031982166301ffc9a760e01b145b92915050565b60606001805461047590611a64565b80601f01602080910402602001604051908101604052809291908181526020018280546104a190611a64565b80156104ee5780601f106104c3576101008083540402835291602001916104ee565b820191906000526020600020905b8154815290600101906020018083116104d157829003601f168201915b5050505050905090565b60006003548211156105665760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600b60205260409020546001600160a01b031690565b600061058d82610811565b9050806001600160a01b0316836001600160a01b031614156105fb5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161055d565b336001600160a01b038216148061061757506106178133610c18565b6106895760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161055d565b6106938383610df8565b505050565b610693838383610e66565b610693838383604051806020016040528060008152506109aa565b6000546001600160a01b031633146106e85760405162461bcd60e51b815260040161055d906119c7565b6106f281476110d1565b50565b6000546001600160a01b0316331461071f5760405162461bcd60e51b815260040161055d906119c7565b60005b82811015610780578060055461073891906119f5565b6040516001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46107796001826119f5565b9050610722565b50600554600090815260076020526040902080546001600160a01b0319166001600160a01b0383161790556107b581836111ea565b81600360008282546107c791906119f5565b90915550505050565b6000546001600160a01b031633146107fa5760405162461bcd60e51b815260040161055d906119c7565b805161080d906008906020840190611523565b5050565b6000600554821061082457506000919050565b815b60018111801561084b57506000818152600760205260409020546001600160a01b0316155b156108625761085b600182611a21565b9050610826565b6000908152600760205260409020546001600160a01b031692915050565b6008805461088d90611a64565b80601f01602080910402602001604051908101604052809291908181526020018280546108b990611a64565b80156109065780601f106108db57610100808354040283529160200191610906565b820191906000526020600020905b8154815290600101906020018083116108e957829003601f168201915b505050505081565b6000546001600160a01b031633146109385760405162461bcd60e51b815260040161055d906119c7565b600080546001600160a01b0319169055565b60606002805461047590611a64565b61080d33838361122b565b6000546001600160a01b0316331461098e5760405162461bcd60e51b815260040161055d906119c7565b6004805460ff19166001179055565b6009805461088d90611a64565b6109b5848484610e66565b6109c1848484846112fa565b6109de576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b600a805461088d90611a64565b6060600354821115610a5d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161055d565b60045460ff16610af95760098054610a7490611a64565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa090611a64565b8015610aed5780601f10610ac257610100808354040283529160200191610aed565b820191906000526020600020905b815481529060010190602001808311610ad057829003601f168201915b50505050509050919050565b600060088054610b0890611a64565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3490611a64565b8015610b815780601f10610b5657610100808354040283529160200191610b81565b820191906000526020600020905b815481529060010190602001808311610b6457829003601f168201915b505050505090506000815111610ba65760405180602001604052806000815250610bd4565b80610bb084611409565b600a604051602001610bc4939291906118b5565b6040516020818303038152906040525b9392505050565b6000546001600160a01b03163314610c055760405162461bcd60e51b815260040161055d906119c7565b805161080d90600a906020840190611523565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205460ff1690565b6000546001600160a01b03163314610c705760405162461bcd60e51b815260040161055d906119c7565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610cbc5760405162461bcd60e51b815260040161055d906119c7565b805161080d906009906020840190611523565b6000546001600160a01b03163314610cf95760405162461bcd60e51b815260040161055d906119c7565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a082319060240160206040518083038186803b158015610d4257600080fd5b505afa158015610d56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7a919061184d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015610dc057600080fd5b505af1158015610dd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610693919061179b565b6000818152600b6020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610e2d82610811565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610e7182610811565b9050826001600160a01b0316846001600160a01b03161415610ed55760405162461bcd60e51b815260206004820152601f60248201527f596f752063616e6e6f74207472616e7366657220746f20796f757273656c6600604482015260640161055d565b806001600160a01b0316846001600160a01b031614610f2d5760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642066726f6d206164647265737360601b604482015260640161055d565b336001600160a01b0382161480610f495750610f498133610c18565b80610f64575033610f59836104f8565b6001600160a01b0316145b610fa05760405162461bcd60e51b815260206004820152600d60248201526c1058d8d95cdcc819195b9a5959609a1b604482015260640161055d565b610fab600083610df8565b600082815260076020526040812080546001600160a01b0319166001600160a01b038616179055610fdd8360016119f5565b6000818152600760205260409020549091506001600160a01b0316158015611006575060055481105b1561103357600081815260076020526040902080546001600160a01b0319166001600160a01b0384161790555b6001600160a01b038216600090815260066020526040812080546001929061105c908490611a21565b90915550506001600160a01b038416600090815260066020526040812080546001929061108a9084906119f5565b909155505060405183906001600160a01b0380871691908816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90600090a45050505050565b804710156111215760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161055d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461116e576040519150601f19603f3d011682016040523d82523d6000602084013e611173565b606091505b50509050806106935760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161055d565b6001600160a01b038216600090815260066020526040812080548392906112129084906119f5565b9250508190555080600560008282546107c791906119f5565b816001600160a01b0316836001600160a01b0316141561128d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161055d565b6001600160a01b038381166000818152600c6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60006001600160a01b0384163b156113fd57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061133e903390899088908890600401611977565b602060405180830381600087803b15801561135857600080fd5b505af1925050508015611388575060408051601f3d908101601f19168201909252611385918101906117d3565b60015b6113e3573d8080156113b6576040519150601f19603f3d011682016040523d82523d6000602084013e6113bb565b606091505b5080516113db576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611401565b5060015b949350505050565b60608161142d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611457578061144181611a9f565b91506114509050600a83611a0d565b9150611431565b60008167ffffffffffffffff81111561148057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156114aa576020820181803683370190505b5090505b8415611401576114bf600183611a21565b91506114cc600a86611aba565b6114d79060306119f5565b60f81b8183815181106114fa57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061151c600a86611a0d565b94506114ae565b82805461152f90611a64565b90600052602060002090601f0160209004810192826115515760008555611597565b82601f1061156a57805160ff1916838001178555611597565b82800160010185558215611597579182015b8281111561159757825182559160200191906001019061157c565b506115a39291506115a7565b5090565b5b808211156115a357600081556001016115a8565b600067ffffffffffffffff808411156115d7576115d7611afa565b604051601f8501601f19908116603f011681019082821181831017156115ff576115ff611afa565b8160405280935085815286868601111561161857600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611643578081fd5b8135610bd481611b10565b60008060408385031215611660578081fd5b823561166b81611b10565b9150602083013561167b81611b10565b809150509250929050565b60008060006060848603121561169a578081fd5b83356116a581611b10565b925060208401356116b581611b10565b929592945050506040919091013590565b600080600080608085870312156116db578081fd5b84356116e681611b10565b935060208501356116f681611b10565b925060408501359150606085013567ffffffffffffffff811115611718578182fd5b8501601f81018713611728578182fd5b611737878235602084016115bc565b91505092959194509250565b60008060408385031215611755578182fd5b823561176081611b10565b9150602083013561167b81611b25565b60008060408385031215611782578182fd5b823561178d81611b10565b946020939093013593505050565b6000602082840312156117ac578081fd5b8151610bd481611b25565b6000602082840312156117c8578081fd5b8135610bd481611b33565b6000602082840312156117e4578081fd5b8151610bd481611b33565b600060208284031215611800578081fd5b813567ffffffffffffffff811115611816578182fd5b8201601f81018413611826578182fd5b611401848235602084016115bc565b600060208284031215611846578081fd5b5035919050565b60006020828403121561185e578081fd5b5051919050565b60008060408385031215611877578182fd5b82359150602083013561167b81611b10565b600081518084526118a1816020860160208601611a38565b601f01601f19169290920160200192915050565b6000845160206118c88285838a01611a38565b8551918401916118db8184848a01611a38565b85549201918390600181811c90808316806118f757607f831692505b85831081141561191557634e487b7160e01b88526022600452602488fd5b808015611929576001811461193a57611966565b60ff19851688528388019550611966565b60008b815260209020895b8581101561195e5781548a820152908401908801611945565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906119aa90830184611889565b9695505050505050565b602081526000610bd46020830184611889565b60208082526014908201527311549493d488481058d8d95cdcc819195b9a595960621b604082015260600190565b60008219821115611a0857611a08611ace565b500190565b600082611a1c57611a1c611ae4565b500490565b600082821015611a3357611a33611ace565b500390565b60005b83811015611a53578181015183820152602001611a3b565b838111156109de5750506000910152565b600181811c90821680611a7857607f821691505b60208210811415611a9957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611ab357611ab3611ace565b5060010190565b600082611ac957611ac9611ae4565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146106f257600080fd5b80151581146106f257600080fd5b6001600160e01b0319811681146106f257600080fdfea26469706673582212204c6e1fd9835f175d6482491f22d55f8ebe0566d8f0634d984e92adca1212dbdf64736f6c63430008040033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063715018a611610104578063b88d4fde116100a2578063e985e9c511610071578063e985e9c5146103c8578063f2fde38b146103db578063fe2c7fee146103ee578063feaea5861461040157600080fd5b8063b88d4fde14610387578063c66828621461039a578063c87b56dd146103a2578063da3ef23f146103b557600080fd5b8063a0f45b69116100de578063a0f45b691461033b578063a22cb46514610364578063a475b5dd14610377578063b584b78d1461037f57600080fd5b8063715018a6146103185780638da5cb5b1461032057806395d89b411461033357600080fd5b8063518302271161017157806355f804b31161014b57806355f804b3146102c15780636352211e146102d45780636c0360eb146102e757806370a08231146102ef57600080fd5b8063518302271461028e57806351cff8d91461029b578063538dba3e146102ae57600080fd5b8063095ea7b3116101ad578063095ea7b31461023c57806318160ddd1461025157806323b872dd1461026857806342842e0e1461027b57600080fd5b806301ffc9a7146101d457806306fdde03146101fc578063081812fc14610211575b600080fd5b6101e76101e23660046117b7565b610414565b60405190151581526020015b60405180910390f35b610204610466565b6040516101f391906119b4565b61022461021f366004611835565b6104f8565b6040516001600160a01b0390911681526020016101f3565b61024f61024a366004611770565b610582565b005b61025a60035481565b6040519081526020016101f3565b61024f610276366004611686565b610698565b61024f610289366004611686565b6106a3565b6004546101e79060ff1681565b61024f6102a9366004611632565b6106be565b61024f6102bc366004611865565b6106f5565b61024f6102cf3660046117ef565b6107d0565b6102246102e2366004611835565b610811565b610204610880565b61025a6102fd366004611632565b6001600160a01b031660009081526006602052604090205490565b61024f61090e565b600054610224906001600160a01b031681565b61020461094a565b610224610349366004611835565b6007602052600090815260409020546001600160a01b031681565b61024f610372366004611743565b610959565b61024f610964565b61020461099d565b61024f6103953660046116c6565b6109aa565b6102046109e4565b6102046103b0366004611835565b6109f1565b61024f6103c33660046117ef565b610bdb565b6101e76103d636600461164e565b610c18565b61024f6103e9366004611632565b610c46565b61024f6103fc3660046117ef565b610c92565b61024f61040f36600461164e565b610ccf565b60006001600160e01b031982166380ac58cd60e01b148061044557506001600160e01b03198216635b5e139f60e01b145b8061046057506001600160e01b031982166301ffc9a760e01b145b92915050565b60606001805461047590611a64565b80601f01602080910402602001604051908101604052809291908181526020018280546104a190611a64565b80156104ee5780601f106104c3576101008083540402835291602001916104ee565b820191906000526020600020905b8154815290600101906020018083116104d157829003601f168201915b5050505050905090565b60006003548211156105665760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600b60205260409020546001600160a01b031690565b600061058d82610811565b9050806001600160a01b0316836001600160a01b031614156105fb5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161055d565b336001600160a01b038216148061061757506106178133610c18565b6106895760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161055d565b6106938383610df8565b505050565b610693838383610e66565b610693838383604051806020016040528060008152506109aa565b6000546001600160a01b031633146106e85760405162461bcd60e51b815260040161055d906119c7565b6106f281476110d1565b50565b6000546001600160a01b0316331461071f5760405162461bcd60e51b815260040161055d906119c7565b60005b82811015610780578060055461073891906119f5565b6040516001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46107796001826119f5565b9050610722565b50600554600090815260076020526040902080546001600160a01b0319166001600160a01b0383161790556107b581836111ea565b81600360008282546107c791906119f5565b90915550505050565b6000546001600160a01b031633146107fa5760405162461bcd60e51b815260040161055d906119c7565b805161080d906008906020840190611523565b5050565b6000600554821061082457506000919050565b815b60018111801561084b57506000818152600760205260409020546001600160a01b0316155b156108625761085b600182611a21565b9050610826565b6000908152600760205260409020546001600160a01b031692915050565b6008805461088d90611a64565b80601f01602080910402602001604051908101604052809291908181526020018280546108b990611a64565b80156109065780601f106108db57610100808354040283529160200191610906565b820191906000526020600020905b8154815290600101906020018083116108e957829003601f168201915b505050505081565b6000546001600160a01b031633146109385760405162461bcd60e51b815260040161055d906119c7565b600080546001600160a01b0319169055565b60606002805461047590611a64565b61080d33838361122b565b6000546001600160a01b0316331461098e5760405162461bcd60e51b815260040161055d906119c7565b6004805460ff19166001179055565b6009805461088d90611a64565b6109b5848484610e66565b6109c1848484846112fa565b6109de576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b600a805461088d90611a64565b6060600354821115610a5d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161055d565b60045460ff16610af95760098054610a7490611a64565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa090611a64565b8015610aed5780601f10610ac257610100808354040283529160200191610aed565b820191906000526020600020905b815481529060010190602001808311610ad057829003601f168201915b50505050509050919050565b600060088054610b0890611a64565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3490611a64565b8015610b815780601f10610b5657610100808354040283529160200191610b81565b820191906000526020600020905b815481529060010190602001808311610b6457829003601f168201915b505050505090506000815111610ba65760405180602001604052806000815250610bd4565b80610bb084611409565b600a604051602001610bc4939291906118b5565b6040516020818303038152906040525b9392505050565b6000546001600160a01b03163314610c055760405162461bcd60e51b815260040161055d906119c7565b805161080d90600a906020840190611523565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205460ff1690565b6000546001600160a01b03163314610c705760405162461bcd60e51b815260040161055d906119c7565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610cbc5760405162461bcd60e51b815260040161055d906119c7565b805161080d906009906020840190611523565b6000546001600160a01b03163314610cf95760405162461bcd60e51b815260040161055d906119c7565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a082319060240160206040518083038186803b158015610d4257600080fd5b505afa158015610d56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7a919061184d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015610dc057600080fd5b505af1158015610dd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610693919061179b565b6000818152600b6020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610e2d82610811565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610e7182610811565b9050826001600160a01b0316846001600160a01b03161415610ed55760405162461bcd60e51b815260206004820152601f60248201527f596f752063616e6e6f74207472616e7366657220746f20796f757273656c6600604482015260640161055d565b806001600160a01b0316846001600160a01b031614610f2d5760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642066726f6d206164647265737360601b604482015260640161055d565b336001600160a01b0382161480610f495750610f498133610c18565b80610f64575033610f59836104f8565b6001600160a01b0316145b610fa05760405162461bcd60e51b815260206004820152600d60248201526c1058d8d95cdcc819195b9a5959609a1b604482015260640161055d565b610fab600083610df8565b600082815260076020526040812080546001600160a01b0319166001600160a01b038616179055610fdd8360016119f5565b6000818152600760205260409020549091506001600160a01b0316158015611006575060055481105b1561103357600081815260076020526040902080546001600160a01b0319166001600160a01b0384161790555b6001600160a01b038216600090815260066020526040812080546001929061105c908490611a21565b90915550506001600160a01b038416600090815260066020526040812080546001929061108a9084906119f5565b909155505060405183906001600160a01b0380871691908816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90600090a45050505050565b804710156111215760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161055d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461116e576040519150601f19603f3d011682016040523d82523d6000602084013e611173565b606091505b50509050806106935760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161055d565b6001600160a01b038216600090815260066020526040812080548392906112129084906119f5565b9250508190555080600560008282546107c791906119f5565b816001600160a01b0316836001600160a01b0316141561128d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161055d565b6001600160a01b038381166000818152600c6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60006001600160a01b0384163b156113fd57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061133e903390899088908890600401611977565b602060405180830381600087803b15801561135857600080fd5b505af1925050508015611388575060408051601f3d908101601f19168201909252611385918101906117d3565b60015b6113e3573d8080156113b6576040519150601f19603f3d011682016040523d82523d6000602084013e6113bb565b606091505b5080516113db576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611401565b5060015b949350505050565b60608161142d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611457578061144181611a9f565b91506114509050600a83611a0d565b9150611431565b60008167ffffffffffffffff81111561148057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156114aa576020820181803683370190505b5090505b8415611401576114bf600183611a21565b91506114cc600a86611aba565b6114d79060306119f5565b60f81b8183815181106114fa57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061151c600a86611a0d565b94506114ae565b82805461152f90611a64565b90600052602060002090601f0160209004810192826115515760008555611597565b82601f1061156a57805160ff1916838001178555611597565b82800160010185558215611597579182015b8281111561159757825182559160200191906001019061157c565b506115a39291506115a7565b5090565b5b808211156115a357600081556001016115a8565b600067ffffffffffffffff808411156115d7576115d7611afa565b604051601f8501601f19908116603f011681019082821181831017156115ff576115ff611afa565b8160405280935085815286868601111561161857600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611643578081fd5b8135610bd481611b10565b60008060408385031215611660578081fd5b823561166b81611b10565b9150602083013561167b81611b10565b809150509250929050565b60008060006060848603121561169a578081fd5b83356116a581611b10565b925060208401356116b581611b10565b929592945050506040919091013590565b600080600080608085870312156116db578081fd5b84356116e681611b10565b935060208501356116f681611b10565b925060408501359150606085013567ffffffffffffffff811115611718578182fd5b8501601f81018713611728578182fd5b611737878235602084016115bc565b91505092959194509250565b60008060408385031215611755578182fd5b823561176081611b10565b9150602083013561167b81611b25565b60008060408385031215611782578182fd5b823561178d81611b10565b946020939093013593505050565b6000602082840312156117ac578081fd5b8151610bd481611b25565b6000602082840312156117c8578081fd5b8135610bd481611b33565b6000602082840312156117e4578081fd5b8151610bd481611b33565b600060208284031215611800578081fd5b813567ffffffffffffffff811115611816578182fd5b8201601f81018413611826578182fd5b611401848235602084016115bc565b600060208284031215611846578081fd5b5035919050565b60006020828403121561185e578081fd5b5051919050565b60008060408385031215611877578182fd5b82359150602083013561167b81611b10565b600081518084526118a1816020860160208601611a38565b601f01601f19169290920160200192915050565b6000845160206118c88285838a01611a38565b8551918401916118db8184848a01611a38565b85549201918390600181811c90808316806118f757607f831692505b85831081141561191557634e487b7160e01b88526022600452602488fd5b808015611929576001811461193a57611966565b60ff19851688528388019550611966565b60008b815260209020895b8581101561195e5781548a820152908401908801611945565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906119aa90830184611889565b9695505050505050565b602081526000610bd46020830184611889565b60208082526014908201527311549493d488481058d8d95cdcc819195b9a595960621b604082015260600190565b60008219821115611a0857611a08611ace565b500190565b600082611a1c57611a1c611ae4565b500490565b600082821015611a3357611a33611ace565b500390565b60005b83811015611a53578181015183820152602001611a3b565b838111156109de5750506000910152565b600181811c90821680611a7857607f821691505b60208210811415611a9957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611ab357611ab3611ace565b5060010190565b600082611ac957611ac9611ae4565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146106f257600080fd5b80151581146106f257600080fd5b6001600160e01b0319811681146106f257600080fdfea26469706673582212204c6e1fd9835f175d6482491f22d55f8ebe0566d8f0634d984e92adca1212dbdf64736f6c63430008040033

Deployed Bytecode Sourcemap

20804:7770:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27002:351;;;;;;:::i;:::-;;:::i;:::-;;;8758:14:1;;8751:22;8733:41;;8721:2;8706:18;27002:351:0;;;;;;;;21634:83;;;:::i;:::-;;;;;;;:::i;22228:314::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7777:32:1;;;7759:51;;7747:2;7732:18;22228:314:0;7714:102:1;21820:400:0;;;;;;:::i;:::-;;:::i;:::-;;20997:23;;;;;;;;;13350:25:1;;;13338:2;13323:18;20997:23:0;13305:76:1;24360:162:0;;;;;;:::i;:::-;;:::i;24530:177::-;;;;;;:::i;:::-;;:::i;21029:20::-;;;;;;;;;28290:120;;;;;;:::i;:::-;;:::i;23913:303::-;;;;;;:::i;:::-;;:::i;26591:100::-;;;;;;:::i;:::-;;:::i;23586:319::-;;;;;;:::i;:::-;;:::i;21204:21::-;;;:::i;23463:115::-;;;;;;:::i;:::-;-1:-1:-1;;;;;23554:16:0;23527:7;23554:16;;;:9;:16;;;;;;;23463:115;20712:85;;;:::i;20385:20::-;;;;;-1:-1:-1;;;;;20385:20:0;;;21725:87;;;:::i;21151:44::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;21151:44:0;;;22550:185;;;;;;:::i;:::-;;:::i;26923:71::-;;;:::i;21232:27::-;;;:::i;24715:336::-;;;;;;:::i;:::-;;:::i;21266:27::-;;;:::i;25923:660::-;;;;;;:::i;:::-;;:::i;26811:104::-;;;;;;:::i;:::-;;:::i;22743:214::-;;;;;;:::i;:::-;;:::i;20603:101::-;;;;;;:::i;:::-;;:::i;26699:104::-;;;;;;:::i;:::-;;:::i;28418:153::-;;;;;;:::i;:::-;;:::i;27002:351::-;27141:4;-1:-1:-1;;;;;;27183:40:0;;-1:-1:-1;;;27183:40:0;;:105;;-1:-1:-1;;;;;;;27240:48:0;;-1:-1:-1;;;27240:48:0;27183:105;:162;;;-1:-1:-1;;;;;;;27305:40:0;;-1:-1:-1;;;27305:40:0;27183:162;27163:182;27002:351;-1:-1:-1;;27002:351:0:o;21634:83::-;21671:13;21704:5;21697:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21634:83;:::o;22228:314::-;22349:7;22407:11;;22396:7;:22;;22374:116;;;;-1:-1:-1;;;22374:116:0;;11124:2:1;22374:116:0;;;11106:21:1;11163:2;11143:18;;;11136:30;11202:34;11182:18;;;11175:62;-1:-1:-1;;;11253:18:1;;;11246:42;11305:19;;22374:116:0;;;;;;;;;-1:-1:-1;22510:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;22510:24:0;;22228:314::o;21820:400::-;21901:13;21917:16;21925:7;21917;:16::i;:::-;21901:32;;21958:5;-1:-1:-1;;;;;21952:11:0;:2;-1:-1:-1;;;;;21952:11:0;;;21944:57;;;;-1:-1:-1;;;21944:57:0;;11953:2:1;21944:57:0;;;11935:21:1;11992:2;11972:18;;;11965:30;12031:34;12011:18;;;12004:62;-1:-1:-1;;;12082:18:1;;;12075:31;12123:19;;21944:57:0;11925:223:1;21944:57:0;22036:10;-1:-1:-1;;;;;22036:19:0;;;;:58;;;22059:35;22076:5;22083:10;22059:16;:35::i;:::-;22014:164;;;;-1:-1:-1;;;22014:164:0;;10699:2:1;22014:164:0;;;10681:21:1;10738:2;10718:18;;;10711:30;10777:34;10757:18;;;10750:62;10848:26;10828:18;;;10821:54;10892:19;;22014:164:0;10671:246:1;22014:164:0;22191:21;22200:2;22204:7;22191:8;:21::i;:::-;21820:400;;;:::o;24360:162::-;24486:28;24496:4;24502:2;24506:7;24486:9;:28::i;24530:177::-;24660:39;24677:4;24683:2;24687:7;24660:39;;;;;;;;;;;;:16;:39::i;28290:120::-;20545:5;;-1:-1:-1;;;;;20545:5:0;20531:10;:19;20523:52;;;;-1:-1:-1;;;20523:52:0;;;;;;;:::i;:::-;28358:44:::1;28376:2;28380:21;28358:17;:44::i;:::-;28290:120:::0;:::o;23913:303::-;20545:5;;-1:-1:-1;;;;;20545:5:0;20531:10;:19;20523:52;;;;-1:-1:-1;;;20523:52:0;;;;;;;:::i;:::-;23995:9:::1;23990:115;24014:6;24010:1;:10;23990:115;;;24091:1;24075:13;;:17;;;;:::i;:::-;24050:43;::::0;-1:-1:-1;;;;;24050:43:0;::::1;::::0;24067:1:::1;::::0;24050:43:::1;::::0;24067:1;;24050:43:::1;24022:6;24027:1;24022:6:::0;::::1;:::i;:::-;;;23990:115;;;-1:-1:-1::0;24127:13:0::1;::::0;24117:24:::1;::::0;;;:9:::1;:24;::::0;;;;:29;;-1:-1:-1;;;;;;24117:29:0::1;-1:-1:-1::0;;;;;24117:29:0;::::1;;::::0;;24157:17:::1;24117:29:::0;24167:6;24157:5:::1;:17::i;:::-;24202:6;24187:11;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;23913:303:0:o;26591:100::-;20545:5;;-1:-1:-1;;;;;20545:5:0;20531:10;:19;20523:52;;;;-1:-1:-1;;;20523:52:0;;;;;;;:::i;:::-;26665:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;26591:100:::0;:::o;23586:319::-;23650:7;23685:13;;23674:7;:24;23670:74;;-1:-1:-1;23730:1:0;;23586:319;-1:-1:-1;23586:319:0:o;23670:74::-;23769:7;23787:80;23799:1;23794:2;:6;:37;;;;-1:-1:-1;23829:1:0;23804:13;;;:9;:13;;;;;;-1:-1:-1;;;;;23804:13:0;:27;23794:37;23787:80;;;23848:7;23854:1;23848:7;;:::i;:::-;;;23787:80;;;23884:13;;;;:9;:13;;;;;;-1:-1:-1;;;;;23884:13:0;;23586:319;-1:-1:-1;;23586:319:0:o;21204:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20712:85::-;20545:5;;-1:-1:-1;;;;;20545:5:0;20531:10;:19;20523:52;;;;-1:-1:-1;;;20523:52:0;;;;;;;:::i;:::-;20787:1:::1;20771:18:::0;;-1:-1:-1;;;;;;20771:18:0::1;::::0;;20712:85::o;21725:87::-;21764:13;21797:7;21790:14;;;;;:::i;22550:185::-;22677:50;22696:10;22708:8;22718;22677:18;:50::i;26923:71::-;20545:5;;-1:-1:-1;;;;;20545:5:0;20531:10;:19;20523:52;;;;-1:-1:-1;;;20523:52:0;;;;;;;:::i;:::-;26971:8:::1;:15:::0;;-1:-1:-1;;26971:15:0::1;26982:4;26971:15;::::0;;26923:71::o;21232:27::-;;;;;;;:::i;24715:336::-;24874:28;24884:4;24890:2;24894:7;24874:9;:28::i;:::-;24920:48;24943:4;24949:2;24953:7;24962:5;24920:22;:48::i;:::-;24915:129;;24992:40;;-1:-1:-1;;;24992:40:0;;;;;;;;;;;24915:129;24715:336;;;;:::o;21266:27::-;;;;;;;:::i;25923:660::-;25979:13;26038:11;;26027:7;:22;;26005:119;;;;-1:-1:-1;;;26005:119:0;;11537:2:1;26005:119:0;;;11519:21:1;11576:2;11556:18;;;11549:30;11615:34;11595:18;;;11588:62;-1:-1:-1;;;11666:18:1;;;11659:45;11721:19;;26005:119:0;11509:237:1;26005:119:0;26141:8;;;;26137:70;;26182:13;26175:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25923:660;;;:::o;26137:70::-;26219:28;26250:7;26219:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26319:1;26294:14;26288:28;:32;:287;;;;;;;;;;;;;;;;;26412:14;26453:18;:7;:16;:18::i;:::-;26498:13;26369:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26288:287;26268:307;25923:660;-1:-1:-1;;;25923:660:0:o;26811:104::-;20545:5;;-1:-1:-1;;;;;20545:5:0;20531:10;:19;20523:52;;;;-1:-1:-1;;;20523:52:0;;;;;;;:::i;:::-;26887:20;;::::1;::::0;:13:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;22743:214::-:0;-1:-1:-1;;;;;22914:25:0;;;22885:4;22914:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;22743:214::o;20603:101::-;20545:5;;-1:-1:-1;;;;;20545:5:0;20531:10;:19;20523:52;;;;-1:-1:-1;;;20523:52:0;;;;;;;:::i;:::-;20679:5:::1;:17:::0;;-1:-1:-1;;;;;;20679:17:0::1;-1:-1:-1::0;;;;;20679:17:0;;;::::1;::::0;;;::::1;::::0;;20603:101::o;26699:104::-;20545:5;;-1:-1:-1;;;;;20545:5:0;20531:10;:19;20523:52;;;;-1:-1:-1;;;20523:52:0;;;;;;;:::i;:::-;26775:20;;::::1;::::0;:13:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;28418:153::-:0;20545:5;;-1:-1:-1;;;;;20545:5:0;20531:10;:19;20523:52;;;;-1:-1:-1;;;20523:52:0;;;;;;;:::i;:::-;28524:38:::1;::::0;-1:-1:-1;;;28524:38:0;;28556:4:::1;28524:38;::::0;::::1;7759:51:1::0;-1:-1:-1;;;;;28497:22:0;::::1;::::0;::::1;::::0;28520:2;;28497:22;;28524:23:::1;::::0;7732:18:1;;28524:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28497:66;::::0;-1:-1:-1;;;;;;28497:66:0::1;::::0;;;;;;-1:-1:-1;;;;;8506:32:1;;;28497:66:0::1;::::0;::::1;8488:51:1::0;8555:18;;;8548:34;8461:18;;28497:66:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;22965:167::-:0;23040:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;23040:29:0;-1:-1:-1;;;;;23040:29:0;;;;;;;;:24;;23094:16;23040:24;23094:7;:16::i;:::-;-1:-1:-1;;;;;23085:39:0;;;;;;;;;;;22965:167;;:::o;25059:856::-;25175:16;25194;25202:7;25194;:16::i;:::-;25175:35;;25239:2;-1:-1:-1;;;;;25231:10:0;:4;-1:-1:-1;;;;;25231:10:0;;;25223:54;;;;-1:-1:-1;;;25223:54:0;;13046:2:1;25223:54:0;;;13028:21:1;13085:2;13065:18;;;13058:30;13124:33;13104:18;;;13097:61;13175:18;;25223:54:0;13018:181:1;25223:54:0;25304:8;-1:-1:-1;;;;;25296:16:0;:4;-1:-1:-1;;;;;25296:16:0;;25288:49;;;;-1:-1:-1;;;25288:49:0;;10350:2:1;25288:49:0;;;10332:21:1;10389:2;10369:18;;;10362:30;-1:-1:-1;;;10408:18:1;;;10401:50;10468:18;;25288:49:0;10322:170:1;25288:49:0;25370:10;-1:-1:-1;;;;;25370:22:0;;;;:81;;;25413:38;25430:8;25440:10;25413:16;:38::i;:::-;25370:136;;;-1:-1:-1;25496:10:0;25472:20;25484:7;25472:11;:20::i;:::-;-1:-1:-1;;;;;25472:34:0;;25370:136;25348:199;;;;-1:-1:-1;;;25348:199:0;;12704:2:1;25348:199:0;;;12686:21:1;12743:2;12723:18;;;12716:30;-1:-1:-1;;;12762:18:1;;;12755:43;12815:18;;25348:199:0;12676:163:1;25348:199:0;25560:29;25577:1;25581:7;25560:8;:29::i;:::-;25602:18;;;;:9;:18;;;;;:23;;-1:-1:-1;;;;;;25602:23:0;-1:-1:-1;;;;;25602:23:0;;;;;25655:11;25602:18;-1:-1:-1;25655:11:0;:::i;:::-;25712:1;25683:17;;;:9;:17;;;;;;25638:28;;-1:-1:-1;;;;;;25683:17:0;:31;:57;;;;;25727:13;;25718:6;:22;25683:57;25679:118;;;25757:17;;;;:9;:17;;;;;:28;;-1:-1:-1;;;;;;25757:28:0;-1:-1:-1;;;;;25757:28:0;;;;;25679:118;-1:-1:-1;;;;;25809:19:0;;;;;;:9;:19;;;;;:24;;25832:1;;25809:19;:24;;25832:1;;25809:24;:::i;:::-;;;;-1:-1:-1;;;;;;;25844:13:0;;;;;;:9;:13;;;;;:18;;25861:1;;25844:13;:18;;25861:1;;25844:18;:::i;:::-;;;;-1:-1:-1;;25880:27:0;;25899:7;;-1:-1:-1;;;;;25880:27:0;;;;;;;;;;;;;25059:856;;;;;:::o;4657:317::-;4772:6;4747:21;:31;;4739:73;;;;-1:-1:-1;;;4739:73:0;;9992:2:1;4739:73:0;;;9974:21:1;10031:2;10011:18;;;10004:30;10070:31;10050:18;;;10043:59;10119:18;;4739:73:0;9964:179:1;4739:73:0;4826:12;4844:9;-1:-1:-1;;;;;4844:14:0;4866:6;4844:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4825:52;;;4896:7;4888:78;;;;-1:-1:-1;;;4888:78:0;;9565:2:1;4888:78:0;;;9547:21:1;9604:2;9584:18;;;9577:30;9643:34;9623:18;;;9616:62;9714:28;9694:18;;;9687:56;9760:19;;4888:78:0;9537:248:1;24224:128:0;-1:-1:-1;;;;;24287:13:0;;;;;;:9;:13;;;;;:23;;24304:6;;24287:13;:23;;24304:6;;24287:23;:::i;:::-;;;;;;;;24338:6;24321:13;;:23;;;;;;;:::i;23140:315::-;23295:8;-1:-1:-1;;;;;23286:17:0;:5;-1:-1:-1;;;;;23286:17:0;;;23278:55;;;;-1:-1:-1;;;23278:55:0;;9211:2:1;23278:55:0;;;9193:21:1;9250:2;9230:18;;;9223:30;9289:27;9269:18;;;9262:55;9334:18;;23278:55:0;9183:175:1;23278:55:0;-1:-1:-1;;;;;23344:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;23344:46:0;;;;;;;;;;23406:41;;8733::1;;;23406::0;;8706:18:1;23406:41:0;;;;;;;23140:315;;;:::o;27361:921::-;27516:4;-1:-1:-1;;;;;27537:13:0;;3691:19;:23;27533:742;;27590:173;;-1:-1:-1;;;27590:173:0;;-1:-1:-1;;;;;27590:36:0;;;;;:173;;27649:10;;27682:4;;27709:7;;27739:5;;27590:173;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27590:173:0;;;;;;;;-1:-1:-1;;27590:173:0;;;;;;;;;;;;:::i;:::-;;;27569:651;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27950:13:0;;27946:259;;28000:40;;-1:-1:-1;;;28000:40:0;;;;;;;;;;;27946:259;28155:6;28149:13;28140:6;28136:2;28132:15;28125:38;27569:651;-1:-1:-1;;;;;;27827:55:0;-1:-1:-1;;;27827:55:0;;-1:-1:-1;27820:62:0;;27533:742;-1:-1:-1;28259:4:0;27533:742;27361:921;;;;;;:::o;402:723::-;458:13;679:10;675:53;;-1:-1:-1;;706:10:0;;;;;;;;;;;;-1:-1:-1;;;706:10:0;;;;;402:723::o;675:53::-;753:5;738:12;794:78;801:9;;794:78;;827:8;;;;:::i;:::-;;-1:-1:-1;850:10:0;;-1:-1:-1;858:2:0;850:10;;:::i;:::-;;;794:78;;;882:19;914:6;904:17;;;;;;-1:-1:-1;;;904:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;904:17:0;;882:39;;932:154;939:10;;932:154;;966:11;976:1;966:11;;:::i;:::-;;-1:-1:-1;1035:10:0;1043:2;1035:5;:10;:::i;:::-;1022:24;;:2;:24;:::i;:::-;1009:39;;992:6;999;992:14;;;;;;-1:-1:-1;;;992:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;992:56:0;;;;;;;;-1:-1:-1;1063:11:0;1072:2;1063:11;;:::i;:::-;;;932:154;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:257::-;709:6;762:2;750:9;741:7;737:23;733:32;730:2;;;783:6;775;768:22;730:2;827:9;814:23;846:31;871:5;846:31;:::i;1182:398::-;1250:6;1258;1311:2;1299:9;1290:7;1286:23;1282:32;1279:2;;;1332:6;1324;1317:22;1279:2;1376:9;1363:23;1395:31;1420:5;1395:31;:::i;:::-;1445:5;-1:-1:-1;1502:2:1;1487:18;;1474:32;1515:33;1474:32;1515:33;:::i;:::-;1567:7;1557:17;;;1269:311;;;;;:::o;1585:466::-;1662:6;1670;1678;1731:2;1719:9;1710:7;1706:23;1702:32;1699:2;;;1752:6;1744;1737:22;1699:2;1796:9;1783:23;1815:31;1840:5;1815:31;:::i;:::-;1865:5;-1:-1:-1;1922:2:1;1907:18;;1894:32;1935:33;1894:32;1935:33;:::i;:::-;1689:362;;1987:7;;-1:-1:-1;;;2041:2:1;2026:18;;;;2013:32;;1689:362::o;2056:824::-;2151:6;2159;2167;2175;2228:3;2216:9;2207:7;2203:23;2199:33;2196:2;;;2250:6;2242;2235:22;2196:2;2294:9;2281:23;2313:31;2338:5;2313:31;:::i;:::-;2363:5;-1:-1:-1;2420:2:1;2405:18;;2392:32;2433:33;2392:32;2433:33;:::i;:::-;2485:7;-1:-1:-1;2539:2:1;2524:18;;2511:32;;-1:-1:-1;2594:2:1;2579:18;;2566:32;2621:18;2610:30;;2607:2;;;2658:6;2650;2643:22;2607:2;2686:22;;2739:4;2731:13;;2727:27;-1:-1:-1;2717:2:1;;2773:6;2765;2758:22;2717:2;2801:73;2866:7;2861:2;2848:16;2843:2;2839;2835:11;2801:73;:::i;:::-;2791:83;;;2186:694;;;;;;;:::o;2885:392::-;2950:6;2958;3011:2;2999:9;2990:7;2986:23;2982:32;2979:2;;;3032:6;3024;3017:22;2979:2;3076:9;3063:23;3095:31;3120:5;3095:31;:::i;:::-;3145:5;-1:-1:-1;3202:2:1;3187:18;;3174:32;3215:30;3174:32;3215:30;:::i;3282:325::-;3350:6;3358;3411:2;3399:9;3390:7;3386:23;3382:32;3379:2;;;3432:6;3424;3417:22;3379:2;3476:9;3463:23;3495:31;3520:5;3495:31;:::i;:::-;3545:5;3597:2;3582:18;;;;3569:32;;-1:-1:-1;;;3369:238:1:o;3612:255::-;3679:6;3732:2;3720:9;3711:7;3707:23;3703:32;3700:2;;;3753:6;3745;3738:22;3700:2;3790:9;3784:16;3809:28;3831:5;3809:28;:::i;3872:255::-;3930:6;3983:2;3971:9;3962:7;3958:23;3954:32;3951:2;;;4004:6;3996;3989:22;3951:2;4048:9;4035:23;4067:30;4091:5;4067:30;:::i;4132:259::-;4201:6;4254:2;4242:9;4233:7;4229:23;4225:32;4222:2;;;4275:6;4267;4260:22;4222:2;4312:9;4306:16;4331:30;4355:5;4331:30;:::i;4396:480::-;4465:6;4518:2;4506:9;4497:7;4493:23;4489:32;4486:2;;;4539:6;4531;4524:22;4486:2;4584:9;4571:23;4617:18;4609:6;4606:30;4603:2;;;4654:6;4646;4639:22;4603:2;4682:22;;4735:4;4727:13;;4723:27;-1:-1:-1;4713:2:1;;4769:6;4761;4754:22;4713:2;4797:73;4862:7;4857:2;4844:16;4839:2;4835;4831:11;4797:73;:::i;4881:190::-;4940:6;4993:2;4981:9;4972:7;4968:23;4964:32;4961:2;;;5014:6;5006;4999:22;4961:2;-1:-1:-1;5042:23:1;;4951:120;-1:-1:-1;4951:120:1:o;5076:194::-;5146:6;5199:2;5187:9;5178:7;5174:23;5170:32;5167:2;;;5220:6;5212;5205:22;5167:2;-1:-1:-1;5248:16:1;;5157:113;-1:-1:-1;5157:113:1:o;5275:325::-;5343:6;5351;5404:2;5392:9;5383:7;5379:23;5375:32;5372:2;;;5425:6;5417;5410:22;5372:2;5466:9;5453:23;5443:33;;5526:2;5515:9;5511:18;5498:32;5539:31;5564:5;5539:31;:::i;5605:257::-;5646:3;5684:5;5678:12;5711:6;5706:3;5699:19;5727:63;5783:6;5776:4;5771:3;5767:14;5760:4;5753:5;5749:16;5727:63;:::i;:::-;5844:2;5823:15;-1:-1:-1;;5819:29:1;5810:39;;;;5851:4;5806:50;;5654:208;-1:-1:-1;;5654:208:1:o;5867:1531::-;6091:3;6129:6;6123:13;6155:4;6168:51;6212:6;6207:3;6202:2;6194:6;6190:15;6168:51;:::i;:::-;6282:13;;6241:16;;;;6304:55;6282:13;6241:16;6326:15;;;6304:55;:::i;:::-;6450:13;;6381:20;;;6421:3;;6510:1;6532:18;;;;6585;;;;6612:2;;6690:4;6680:8;6676:19;6664:31;;6612:2;6753;6743:8;6740:16;6720:18;6717:40;6714:2;;;-1:-1:-1;;;6780:33:1;;6836:4;6833:1;6826:15;6866:4;6787:3;6854:17;6714:2;6897:18;6924:110;;;;7048:1;7043:330;;;;6890:483;;6924:110;-1:-1:-1;;6959:24:1;;6945:39;;7004:20;;;;-1:-1:-1;6924:110:1;;7043:330;13433:4;13452:17;;;13502:4;13486:21;;7138:3;7154:169;7168:8;7165:1;7162:15;7154:169;;;7250:14;;7235:13;;;7228:37;7293:16;;;;7185:10;;7154:169;;;7158:3;;7354:8;7347:5;7343:20;7336:27;;6890:483;-1:-1:-1;7389:3:1;;6099:1299;-1:-1:-1;;;;;;;;;;;6099:1299:1:o;7821:488::-;-1:-1:-1;;;;;8090:15:1;;;8072:34;;8142:15;;8137:2;8122:18;;8115:43;8189:2;8174:18;;8167:34;;;8237:3;8232:2;8217:18;;8210:31;;;8015:4;;8258:45;;8283:19;;8275:6;8258:45;:::i;:::-;8250:53;8024:285;-1:-1:-1;;;;;;8024:285:1:o;8785:219::-;8934:2;8923:9;8916:21;8897:4;8954:44;8994:2;8983:9;8979:18;8971:6;8954:44;:::i;12153:344::-;12355:2;12337:21;;;12394:2;12374:18;;;12367:30;-1:-1:-1;;;12428:2:1;12413:18;;12406:50;12488:2;12473:18;;12327:170::o;13518:128::-;13558:3;13589:1;13585:6;13582:1;13579:13;13576:2;;;13595:18;;:::i;:::-;-1:-1:-1;13631:9:1;;13566:80::o;13651:120::-;13691:1;13717;13707:2;;13722:18;;:::i;:::-;-1:-1:-1;13756:9:1;;13697:74::o;13776:125::-;13816:4;13844:1;13841;13838:8;13835:2;;;13849:18;;:::i;:::-;-1:-1:-1;13886:9:1;;13825:76::o;13906:258::-;13978:1;13988:113;14002:6;13999:1;13996:13;13988:113;;;14078:11;;;14072:18;14059:11;;;14052:39;14024:2;14017:10;13988:113;;;14119:6;14116:1;14113:13;14110:2;;;-1:-1:-1;;14154:1:1;14136:16;;14129:27;13959:205::o;14169:380::-;14248:1;14244:12;;;;14291;;;14312:2;;14366:4;14358:6;14354:17;14344:27;;14312:2;14419;14411:6;14408:14;14388:18;14385:38;14382:2;;;14465:10;14460:3;14456:20;14453:1;14446:31;14500:4;14497:1;14490:15;14528:4;14525:1;14518:15;14382:2;;14224:325;;;:::o;14554:135::-;14593:3;-1:-1:-1;;14614:17:1;;14611:2;;;14634:18;;:::i;:::-;-1:-1:-1;14681:1:1;14670:13;;14601:88::o;14694:112::-;14726:1;14752;14742:2;;14757:18;;:::i;:::-;-1:-1:-1;14791:9:1;;14732:74::o;14811:127::-;14872:10;14867:3;14863:20;14860:1;14853:31;14903:4;14900:1;14893:15;14927:4;14924:1;14917:15;14943:127;15004:10;14999:3;14995:20;14992:1;14985:31;15035:4;15032:1;15025:15;15059:4;15056:1;15049:15;15075:127;15136:10;15131:3;15127:20;15124:1;15117:31;15167:4;15164:1;15157:15;15191:4;15188:1;15181:15;15207:131;-1:-1:-1;;;;;15282:31:1;;15272:42;;15262:2;;15328:1;15325;15318:12;15343:118;15429:5;15422:13;15415:21;15408:5;15405:32;15395:2;;15451:1;15448;15441:12;15466:131;-1:-1:-1;;;;;;15540:32:1;;15530:43;;15520:2;;15587:1;15584;15577:12

Swarm Source

ipfs://4c6e1fd9835f175d6482491f22d55f8ebe0566d8f0634d984e92adca1212dbdf
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.