ETH Price: $3,690.62 (+2.76%)

Token

ERC-20: Pin Planets (PINPLAN)
 

Overview

Max Total Supply

250 PINPLAN

Holders

130

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
cryptomouse333.eth
Balance
1 PINPLAN
0x6a75774982e73a4444d1364ed894ac58412b8c56
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:
PinPlanets

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 1 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with 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;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.7.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
                /// @solidity memory-safe-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 (last updated v4.6.0) (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 `IERC721Receiver.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 (last updated v4.7.0) (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`.
     *
     * 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);
}

// 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: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

// File: contracts/pin-planets.sol



pragma solidity ^0.8.0;



contract PinPlanets is ERC721, Ownable {
    using Strings for uint256;

    uint256 private constant _maxSupply = 250;
    uint256 private _totalSupply = 0;
    string private _baseTokenURI;

    constructor() ERC721("Pin Planets", "PINPLAN") {}

    function mint() public payable {
        require(_totalSupply < _maxSupply, "Max supply reached!");

        _safeMint(msg.sender, ++_totalSupply);
    }

    function maxSupply() public pure returns (uint256) {
        return _maxSupply;
    }

    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        string memory currentBaseURI = _baseURI();

        return
            bytes(currentBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        currentBaseURI,
                        tokenId.toString(),
                        ".json"
                    )
                )
                : "https://pin-planets.netlify.app/undiscovered.json";
    }

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

    function setBaseURI(string calldata baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":[{"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":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"baseURI","type":"string"}],"name":"setBaseURI","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"}]

608060405260006007553480156200001657600080fd5b506040518060400160405280600b81526020016a50696e20506c616e65747360a81b815250604051806040016040528060078152602001662824a7282620a760c91b81525081600090816200006c919062000199565b5060016200007b828262000199565b50505062000098620000926200009e60201b60201c565b620000a2565b62000265565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200011f57607f821691505b6020821081036200014057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200019457600081815260208120601f850160051c810160208610156200016f5750805b601f850160051c820191505b8181101562000190578281556001016200017b565b5050505b505050565b81516001600160401b03811115620001b557620001b5620000f4565b620001cd81620001c684546200010a565b8462000146565b602080601f831160018114620002055760008415620001ec5750858301515b600019600386901b1c1916600185901b17855562000190565b600085815260208120601f198616915b82811015620002365788860151825594840194600190910190840162000215565b5085821015620002555787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6117bd80620002756000396000f3fe6080604052600436106100ef5760003560e01c806301ffc9a7146100f457806306fdde0314610129578063081812fc1461014b578063095ea7b3146101835780631249c58b146101a557806318160ddd146101ad57806323b872dd146101cc57806342842e0e146101ec57806355f804b31461020c5780636352211e1461022c57806370a082311461024c578063715018a61461026c5780638da5cb5b1461028157806395d89b4114610296578063a22cb465146102ab578063b88d4fde146102cb578063c87b56dd146102eb578063d5abeb011461030b578063e985e9c51461031f578063f2fde38b1461033f575b600080fd5b34801561010057600080fd5b5061011461010f3660046110d3565b61035f565b60405190151581526020015b60405180910390f35b34801561013557600080fd5b5061013e6103b1565b6040516101209190611140565b34801561015757600080fd5b5061016b610166366004611153565b610443565b6040516001600160a01b039091168152602001610120565b34801561018f57600080fd5b506101a361019e366004611188565b61046a565b005b6101a3610584565b3480156101b957600080fd5b506007545b604051908152602001610120565b3480156101d857600080fd5b506101a36101e73660046111b2565b6105eb565b3480156101f857600080fd5b506101a36102073660046111b2565b61061c565b34801561021857600080fd5b506101a36102273660046111ee565b610637565b34801561023857600080fd5b5061016b610247366004611153565b61064c565b34801561025857600080fd5b506101be61026736600461125f565b610681565b34801561027857600080fd5b506101a3610707565b34801561028d57600080fd5b5061016b610719565b3480156102a257600080fd5b5061013e610728565b3480156102b757600080fd5b506101a36102c636600461127a565b610737565b3480156102d757600080fd5b506101a36102e63660046112cc565b610746565b3480156102f757600080fd5b5061013e610306366004611153565b61077e565b34801561031757600080fd5b5060fa6101be565b34801561032b57600080fd5b5061011461033a3660046113a7565b610852565b34801561034b57600080fd5b506101a361035a36600461125f565b610880565b60006001600160e01b031982166380ac58cd60e01b148061039057506001600160e01b03198216635b5e139f60e01b145b806103ab57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546103c0906113da565b80601f01602080910402602001604051908101604052809291908181526020018280546103ec906113da565b80156104395780601f1061040e57610100808354040283529160200191610439565b820191906000526020600020905b81548152906001019060200180831161041c57829003601f168201915b5050505050905090565b600061044e826108f9565b506000908152600460205260409020546001600160a01b031690565b60006104758261064c565b9050806001600160a01b0316836001600160a01b0316036104e75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061050357506105038133610852565b6105755760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016104de565b61057f838361091e565b505050565b60fa600754106105cc5760405162461bcd60e51b81526020600482015260136024820152724d617820737570706c7920726561636865642160681b60448201526064016104de565b6105e9336007600081546105df9061142a565b918290555061098c565b565b6105f533826109a6565b6106115760405162461bcd60e51b81526004016104de90611443565b61057f838383610a05565b61057f83838360405180602001604052806000815250610746565b61063f610b8f565b600861057f8284836114df565b6000818152600260205260408120546001600160a01b0316806103ab5760405162461bcd60e51b81526004016104de9061159f565b60006001600160a01b0382166106eb5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016104de565b506001600160a01b031660009081526003602052604090205490565b61070f610b8f565b6105e96000610bee565b6006546001600160a01b031690565b6060600180546103c0906113da565b610742338383610c40565b5050565b61075033836109a6565b61076c5760405162461bcd60e51b81526004016104de90611443565b61077884848484610d0a565b50505050565b606061078982610d3d565b6107ed5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016104de565b60006107f7610d5a565b90506000815111610820576040518060600160405280603181526020016117376031913961084b565b8061082a84610d69565b60405160200161083b9291906115d1565b6040516020818303038152906040525b9392505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610888610b8f565b6001600160a01b0381166108ed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104de565b6108f681610bee565b50565b61090281610d3d565b6108f65760405162461bcd60e51b81526004016104de9061159f565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906109538261064c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610742828260405180602001604052806000815250610e69565b6000806109b28361064c565b9050806001600160a01b0316846001600160a01b031614806109d957506109d98185610852565b806109fd5750836001600160a01b03166109f284610443565b6001600160a01b0316145b949350505050565b826001600160a01b0316610a188261064c565b6001600160a01b031614610a7c5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016104de565b6001600160a01b038216610ade5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016104de565b610ae960008261091e565b6001600160a01b0383166000908152600360205260408120805460019290610b12908490611610565b90915550506001600160a01b0382166000908152600360205260408120805460019290610b40908490611623565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03868116918217909255915184939187169160008051602061176883398151915291a4505050565b33610b98610719565b6001600160a01b0316146105e95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104de565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603610c9d5760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016104de565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b610d15848484610a05565b610d2184848484610e9c565b6107785760405162461bcd60e51b81526004016104de90611636565b6000908152600260205260409020546001600160a01b0316151590565b6060600880546103c0906113da565b606081600003610d905750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610dba5780610da48161142a565b9150610db39050600a8361169e565b9150610d94565b6000816001600160401b03811115610dd457610dd46112b6565b6040519080825280601f01601f191660200182016040528015610dfe576020820181803683370190505b5090505b84156109fd57610e13600183611610565b9150610e20600a866116b2565b610e2b906030611623565b60f81b818381518110610e4057610e406116c6565b60200101906001600160f81b031916908160001a905350610e62600a8661169e565b9450610e02565b610e738383610f9d565b610e806000848484610e9c565b61057f5760405162461bcd60e51b81526004016104de90611636565b60006001600160a01b0384163b15610f9257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290610ee09033908990889088906004016116dc565b6020604051808303816000875af1925050508015610f1b575060408051601f3d908101601f19168201909252610f1891810190611719565b60015b610f78573d808015610f49576040519150601f19603f3d011682016040523d82523d6000602084013e610f4e565b606091505b508051600003610f705760405162461bcd60e51b81526004016104de90611636565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506109fd565b506001949350505050565b6001600160a01b038216610ff35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104de565b610ffc81610d3d565b156110485760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b60448201526064016104de565b6001600160a01b0382166000908152600360205260408120805460019290611071908490611623565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020611768833981519152908290a45050565b6001600160e01b0319811681146108f657600080fd5b6000602082840312156110e557600080fd5b813561084b816110bd565b60005b8381101561110b5781810151838201526020016110f3565b50506000910152565b6000815180845261112c8160208601602086016110f0565b601f01601f19169290920160200192915050565b60208152600061084b6020830184611114565b60006020828403121561116557600080fd5b5035919050565b80356001600160a01b038116811461118357600080fd5b919050565b6000806040838503121561119b57600080fd5b6111a48361116c565b946020939093013593505050565b6000806000606084860312156111c757600080fd5b6111d08461116c565b92506111de6020850161116c565b9150604084013590509250925092565b6000806020838503121561120157600080fd5b82356001600160401b038082111561121857600080fd5b818501915085601f83011261122c57600080fd5b81358181111561123b57600080fd5b86602082850101111561124d57600080fd5b60209290920196919550909350505050565b60006020828403121561127157600080fd5b61084b8261116c565b6000806040838503121561128d57600080fd5b6112968361116c565b9150602083013580151581146112ab57600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156112e257600080fd5b6112eb8561116c565b93506112f96020860161116c565b92506040850135915060608501356001600160401b038082111561131c57600080fd5b818701915087601f83011261133057600080fd5b813581811115611342576113426112b6565b604051601f8201601f19908116603f0116810190838211818310171561136a5761136a6112b6565b816040528281528a602084870101111561138357600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156113ba57600080fd5b6113c38361116c565b91506113d16020840161116c565b90509250929050565b600181811c908216806113ee57607f821691505b60208210810361140e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60006001820161143c5761143c611414565b5060010190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b601f82111561057f57600081815260208120601f850160051c810160208610156114b85750805b601f850160051c820191505b818110156114d7578281556001016114c4565b505050505050565b6001600160401b038311156114f6576114f66112b6565b61150a8361150483546113da565b83611491565b6000601f84116001811461153e57600085156115265750838201355b600019600387901b1c1916600186901b178355611598565b600083815260209020601f19861690835b8281101561156f578685013582556020948501946001909201910161154f565b508682101561158c5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b602080825260189082015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604082015260600190565b600083516115e38184602088016110f0565b8351908301906115f78183602088016110f0565b64173539b7b760d91b9101908152600501949350505050565b818103818111156103ab576103ab611414565b808201808211156103ab576103ab611414565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b6000826116ad576116ad611688565b500490565b6000826116c1576116c1611688565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061170f90830184611114565b9695505050505050565b60006020828403121561172b57600080fd5b815161084b816110bd56fe68747470733a2f2f70696e2d706c616e6574732e6e65746c6966792e6170702f756e646973636f76657265642e6a736f6eddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122038270baf4f58629f8acf42562c4586c5c6822477ba19c62e24070622c704a84c64736f6c63430008100033

Deployed Bytecode

0x6080604052600436106100ef5760003560e01c806301ffc9a7146100f457806306fdde0314610129578063081812fc1461014b578063095ea7b3146101835780631249c58b146101a557806318160ddd146101ad57806323b872dd146101cc57806342842e0e146101ec57806355f804b31461020c5780636352211e1461022c57806370a082311461024c578063715018a61461026c5780638da5cb5b1461028157806395d89b4114610296578063a22cb465146102ab578063b88d4fde146102cb578063c87b56dd146102eb578063d5abeb011461030b578063e985e9c51461031f578063f2fde38b1461033f575b600080fd5b34801561010057600080fd5b5061011461010f3660046110d3565b61035f565b60405190151581526020015b60405180910390f35b34801561013557600080fd5b5061013e6103b1565b6040516101209190611140565b34801561015757600080fd5b5061016b610166366004611153565b610443565b6040516001600160a01b039091168152602001610120565b34801561018f57600080fd5b506101a361019e366004611188565b61046a565b005b6101a3610584565b3480156101b957600080fd5b506007545b604051908152602001610120565b3480156101d857600080fd5b506101a36101e73660046111b2565b6105eb565b3480156101f857600080fd5b506101a36102073660046111b2565b61061c565b34801561021857600080fd5b506101a36102273660046111ee565b610637565b34801561023857600080fd5b5061016b610247366004611153565b61064c565b34801561025857600080fd5b506101be61026736600461125f565b610681565b34801561027857600080fd5b506101a3610707565b34801561028d57600080fd5b5061016b610719565b3480156102a257600080fd5b5061013e610728565b3480156102b757600080fd5b506101a36102c636600461127a565b610737565b3480156102d757600080fd5b506101a36102e63660046112cc565b610746565b3480156102f757600080fd5b5061013e610306366004611153565b61077e565b34801561031757600080fd5b5060fa6101be565b34801561032b57600080fd5b5061011461033a3660046113a7565b610852565b34801561034b57600080fd5b506101a361035a36600461125f565b610880565b60006001600160e01b031982166380ac58cd60e01b148061039057506001600160e01b03198216635b5e139f60e01b145b806103ab57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546103c0906113da565b80601f01602080910402602001604051908101604052809291908181526020018280546103ec906113da565b80156104395780601f1061040e57610100808354040283529160200191610439565b820191906000526020600020905b81548152906001019060200180831161041c57829003601f168201915b5050505050905090565b600061044e826108f9565b506000908152600460205260409020546001600160a01b031690565b60006104758261064c565b9050806001600160a01b0316836001600160a01b0316036104e75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061050357506105038133610852565b6105755760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016104de565b61057f838361091e565b505050565b60fa600754106105cc5760405162461bcd60e51b81526020600482015260136024820152724d617820737570706c7920726561636865642160681b60448201526064016104de565b6105e9336007600081546105df9061142a565b918290555061098c565b565b6105f533826109a6565b6106115760405162461bcd60e51b81526004016104de90611443565b61057f838383610a05565b61057f83838360405180602001604052806000815250610746565b61063f610b8f565b600861057f8284836114df565b6000818152600260205260408120546001600160a01b0316806103ab5760405162461bcd60e51b81526004016104de9061159f565b60006001600160a01b0382166106eb5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016104de565b506001600160a01b031660009081526003602052604090205490565b61070f610b8f565b6105e96000610bee565b6006546001600160a01b031690565b6060600180546103c0906113da565b610742338383610c40565b5050565b61075033836109a6565b61076c5760405162461bcd60e51b81526004016104de90611443565b61077884848484610d0a565b50505050565b606061078982610d3d565b6107ed5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016104de565b60006107f7610d5a565b90506000815111610820576040518060600160405280603181526020016117376031913961084b565b8061082a84610d69565b60405160200161083b9291906115d1565b6040516020818303038152906040525b9392505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610888610b8f565b6001600160a01b0381166108ed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104de565b6108f681610bee565b50565b61090281610d3d565b6108f65760405162461bcd60e51b81526004016104de9061159f565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906109538261064c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610742828260405180602001604052806000815250610e69565b6000806109b28361064c565b9050806001600160a01b0316846001600160a01b031614806109d957506109d98185610852565b806109fd5750836001600160a01b03166109f284610443565b6001600160a01b0316145b949350505050565b826001600160a01b0316610a188261064c565b6001600160a01b031614610a7c5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016104de565b6001600160a01b038216610ade5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016104de565b610ae960008261091e565b6001600160a01b0383166000908152600360205260408120805460019290610b12908490611610565b90915550506001600160a01b0382166000908152600360205260408120805460019290610b40908490611623565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03868116918217909255915184939187169160008051602061176883398151915291a4505050565b33610b98610719565b6001600160a01b0316146105e95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104de565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603610c9d5760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016104de565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b610d15848484610a05565b610d2184848484610e9c565b6107785760405162461bcd60e51b81526004016104de90611636565b6000908152600260205260409020546001600160a01b0316151590565b6060600880546103c0906113da565b606081600003610d905750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610dba5780610da48161142a565b9150610db39050600a8361169e565b9150610d94565b6000816001600160401b03811115610dd457610dd46112b6565b6040519080825280601f01601f191660200182016040528015610dfe576020820181803683370190505b5090505b84156109fd57610e13600183611610565b9150610e20600a866116b2565b610e2b906030611623565b60f81b818381518110610e4057610e406116c6565b60200101906001600160f81b031916908160001a905350610e62600a8661169e565b9450610e02565b610e738383610f9d565b610e806000848484610e9c565b61057f5760405162461bcd60e51b81526004016104de90611636565b60006001600160a01b0384163b15610f9257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290610ee09033908990889088906004016116dc565b6020604051808303816000875af1925050508015610f1b575060408051601f3d908101601f19168201909252610f1891810190611719565b60015b610f78573d808015610f49576040519150601f19603f3d011682016040523d82523d6000602084013e610f4e565b606091505b508051600003610f705760405162461bcd60e51b81526004016104de90611636565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506109fd565b506001949350505050565b6001600160a01b038216610ff35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104de565b610ffc81610d3d565b156110485760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b60448201526064016104de565b6001600160a01b0382166000908152600360205260408120805460019290611071908490611623565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020611768833981519152908290a45050565b6001600160e01b0319811681146108f657600080fd5b6000602082840312156110e557600080fd5b813561084b816110bd565b60005b8381101561110b5781810151838201526020016110f3565b50506000910152565b6000815180845261112c8160208601602086016110f0565b601f01601f19169290920160200192915050565b60208152600061084b6020830184611114565b60006020828403121561116557600080fd5b5035919050565b80356001600160a01b038116811461118357600080fd5b919050565b6000806040838503121561119b57600080fd5b6111a48361116c565b946020939093013593505050565b6000806000606084860312156111c757600080fd5b6111d08461116c565b92506111de6020850161116c565b9150604084013590509250925092565b6000806020838503121561120157600080fd5b82356001600160401b038082111561121857600080fd5b818501915085601f83011261122c57600080fd5b81358181111561123b57600080fd5b86602082850101111561124d57600080fd5b60209290920196919550909350505050565b60006020828403121561127157600080fd5b61084b8261116c565b6000806040838503121561128d57600080fd5b6112968361116c565b9150602083013580151581146112ab57600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156112e257600080fd5b6112eb8561116c565b93506112f96020860161116c565b92506040850135915060608501356001600160401b038082111561131c57600080fd5b818701915087601f83011261133057600080fd5b813581811115611342576113426112b6565b604051601f8201601f19908116603f0116810190838211818310171561136a5761136a6112b6565b816040528281528a602084870101111561138357600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156113ba57600080fd5b6113c38361116c565b91506113d16020840161116c565b90509250929050565b600181811c908216806113ee57607f821691505b60208210810361140e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60006001820161143c5761143c611414565b5060010190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b601f82111561057f57600081815260208120601f850160051c810160208610156114b85750805b601f850160051c820191505b818110156114d7578281556001016114c4565b505050505050565b6001600160401b038311156114f6576114f66112b6565b61150a8361150483546113da565b83611491565b6000601f84116001811461153e57600085156115265750838201355b600019600387901b1c1916600186901b178355611598565b600083815260209020601f19861690835b8281101561156f578685013582556020948501946001909201910161154f565b508682101561158c5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b602080825260189082015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604082015260600190565b600083516115e38184602088016110f0565b8351908301906115f78183602088016110f0565b64173539b7b760d91b9101908152600501949350505050565b818103818111156103ab576103ab611414565b808201808211156103ab576103ab611414565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b6000826116ad576116ad611688565b500490565b6000826116c1576116c1611688565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061170f90830184611114565b9695505050505050565b60006020828403121561172b57600080fd5b815161084b816110bd56fe68747470733a2f2f70696e2d706c616e6574732e6e65746c6966792e6170702f756e646973636f76657265642e6a736f6eddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122038270baf4f58629f8acf42562c4586c5c6822477ba19c62e24070622c704a84c64736f6c63430008100033

Deployed Bytecode Sourcemap

38027:1546:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24772:305;;;;;;;;;;-1:-1:-1;24772:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;24772:305:0;;;;;;;;25699:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27212:171::-;;;;;;;;;;-1:-1:-1;27212:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;27212:171:0;1533:203:1;26729:417:0;;;;;;;;;;-1:-1:-1;26729:417:0;;;;;:::i;:::-;;:::i;:::-;;38288:157;;;:::i;38548:91::-;;;;;;;;;;-1:-1:-1;38619:12:0;;38548:91;;;2324:25:1;;;2312:2;2297:18;38548:91:0;2178:177:1;27912:336:0;;;;;;;;;;-1:-1:-1;27912:336:0;;;;;:::i;:::-;;:::i;28319:185::-;;;;;;;;;;-1:-1:-1;28319:185:0;;;;;:::i;:::-;;:::i;39464:106::-;;;;;;;;;;-1:-1:-1;39464:106:0;;;;;:::i;:::-;;:::i;25410:222::-;;;;;;;;;;-1:-1:-1;25410:222:0;;;;;:::i;:::-;;:::i;25141:207::-;;;;;;;;;;-1:-1:-1;25141:207:0;;;;;:::i;:::-;;:::i;5308:103::-;;;;;;;;;;;;;:::i;4660:87::-;;;;;;;;;;;;;:::i;25868:104::-;;;;;;;;;;;;;:::i;27455:155::-;;;;;;;;;;-1:-1:-1;27455:155:0;;;;;:::i;:::-;;:::i;28575:323::-;;;;;;;;;;-1:-1:-1;28575:323:0;;;;;:::i;:::-;;:::i;38647:687::-;;;;;;;;;;-1:-1:-1;38647:687:0;;;;;:::i;:::-;;:::i;38453:87::-;;;;;;;;;;-1:-1:-1;38145:3:0;38453:87;;27681:164;;;;;;;;;;-1:-1:-1;27681:164:0;;;;;:::i;:::-;;:::i;5566:201::-;;;;;;;;;;-1:-1:-1;5566:201:0;;;;;:::i;:::-;;:::i;24772:305::-;24874:4;-1:-1:-1;;;;;;24911:40:0;;-1:-1:-1;;;24911:40:0;;:105;;-1:-1:-1;;;;;;;24968:48:0;;-1:-1:-1;;;24968:48:0;24911:105;:158;;;-1:-1:-1;;;;;;;;;;17623:40:0;;;25033:36;24891:178;24772:305;-1:-1:-1;;24772:305:0:o;25699:100::-;25753:13;25786:5;25779:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25699:100;:::o;27212:171::-;27288:7;27308:23;27323:7;27308:14;:23::i;:::-;-1:-1:-1;27351:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27351:24:0;;27212:171::o;26729:417::-;26810:13;26826:23;26841:7;26826:14;:23::i;:::-;26810:39;;26874:5;-1:-1:-1;;;;;26868:11:0;:2;-1:-1:-1;;;;;26868:11:0;;26860:57;;;;-1:-1:-1;;;26860:57:0;;5960:2:1;26860:57:0;;;5942:21:1;5999:2;5979:18;;;5972:30;6038:34;6018:18;;;6011:62;-1:-1:-1;;;6089:18:1;;;6082:31;6130:19;;26860:57:0;;;;;;;;;3291:10;-1:-1:-1;;;;;26952:21:0;;;;:62;;-1:-1:-1;26977:37:0;26994:5;3291:10;27681:164;:::i;26977:37::-;26930:174;;;;-1:-1:-1;;;26930:174:0;;6362:2:1;26930:174:0;;;6344:21:1;6401:2;6381:18;;;6374:30;6440:34;6420:18;;;6413:62;6511:32;6491:18;;;6484:60;6561:19;;26930:174:0;6160:426:1;26930:174:0;27117:21;27126:2;27130:7;27117:8;:21::i;:::-;26799:347;26729:417;;:::o;38288:157::-;38145:3;38338:12;;:25;38330:57;;;;-1:-1:-1;;;38330:57:0;;6793:2:1;38330:57:0;;;6775:21:1;6832:2;6812:18;;;6805:30;-1:-1:-1;;;6851:18:1;;;6844:49;6910:18;;38330:57:0;6591:343:1;38330:57:0;38400:37;38410:10;38424:12;;38422:14;;;;;:::i;:::-;;;;;-1:-1:-1;38400:9:0;:37::i;:::-;38288:157::o;27912:336::-;28107:41;3291:10;28140:7;28107:18;:41::i;:::-;28099:100;;;;-1:-1:-1;;;28099:100:0;;;;;;;:::i;:::-;28212:28;28222:4;28228:2;28232:7;28212:9;:28::i;28319:185::-;28457:39;28474:4;28480:2;28484:7;28457:39;;;;;;;;;;;;:16;:39::i;39464:106::-;4546:13;:11;:13::i;:::-;39539::::1;:23;39555:7:::0;;39539:13;:23:::1;:::i;25410:222::-:0;25482:7;25518:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25518:16:0;;25545:56;;;;-1:-1:-1;;;25545:56:0;;;;;;;:::i;25141:207::-;25213:7;-1:-1:-1;;;;;25241:19:0;;25233:73;;;;-1:-1:-1;;;25233:73:0;;10239:2:1;25233:73:0;;;10221:21:1;10278:2;10258:18;;;10251:30;10317:34;10297:18;;;10290:62;-1:-1:-1;;;10368:18:1;;;10361:39;10417:19;;25233:73:0;10037:405:1;25233:73:0;-1:-1:-1;;;;;;25324:16:0;;;;;:9;:16;;;;;;;25141:207::o;5308:103::-;4546:13;:11;:13::i;:::-;5373:30:::1;5400:1;5373:18;:30::i;4660:87::-:0;4733:6;;-1:-1:-1;;;;;4733:6:0;;4660:87::o;25868:104::-;25924:13;25957:7;25950:14;;;;;:::i;27455:155::-;27550:52;3291:10;27583:8;27593;27550:18;:52::i;:::-;27455:155;;:::o;28575:323::-;28749:41;3291:10;28782:7;28749:18;:41::i;:::-;28741:100;;;;-1:-1:-1;;;28741:100:0;;;;;;;:::i;:::-;28852:38;28866:4;28872:2;28876:7;28885:4;28852:13;:38::i;:::-;28575:323;;;;:::o;38647:687::-;38765:13;38818:16;38826:7;38818;:16::i;:::-;38796:113;;;;-1:-1:-1;;;38796:113:0;;10649:2:1;38796:113:0;;;10631:21:1;10688:2;10668:18;;;10661:30;10727:34;10707:18;;;10700:62;-1:-1:-1;;;10778:18:1;;;10771:45;10833:19;;38796:113:0;10447:411:1;38796:113:0;38922:28;38953:10;:8;:10::i;:::-;38922:41;;39027:1;39002:14;38996:28;:32;:330;;;;;;;;;;;;;;;;;;;;;;39120:14;39161:18;:7;:16;:18::i;:::-;39077:159;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38996:330;38976:350;38647:687;-1:-1:-1;;;38647:687:0:o;27681:164::-;-1:-1:-1;;;;;27802:25:0;;;27778:4;27802:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;27681:164::o;5566:201::-;4546:13;:11;:13::i;:::-;-1:-1:-1;;;;;5655:22:0;::::1;5647:73;;;::::0;-1:-1:-1;;;5647:73:0;;11733:2:1;5647:73:0::1;::::0;::::1;11715:21:1::0;11772:2;11752:18;;;11745:30;11811:34;11791:18;;;11784:62;-1:-1:-1;;;11862:18:1;;;11855:36;11908:19;;5647:73:0::1;11531:402:1::0;5647:73:0::1;5731:28;5750:8;5731:18;:28::i;:::-;5566:201:::0;:::o;35187:135::-;35269:16;35277:7;35269;:16::i;:::-;35261:53;;;;-1:-1:-1;;;35261:53:0;;;;;;;:::i;34466:174::-;34541:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;34541:29:0;-1:-1:-1;;;;;34541:29:0;;;;;;;;:24;;34595:23;34541:24;34595:14;:23::i;:::-;-1:-1:-1;;;;;34586:46:0;;;;;;;;;;;34466:174;;:::o;31305:110::-;31381:26;31391:2;31395:7;31381:26;;;;;;;;;;;;:9;:26::i;30699:264::-;30792:4;30809:13;30825:23;30840:7;30825:14;:23::i;:::-;30809:39;;30878:5;-1:-1:-1;;;;;30867:16:0;:7;-1:-1:-1;;;;;30867:16:0;;:52;;;;30887:32;30904:5;30911:7;30887:16;:32::i;:::-;30867:87;;;;30947:7;-1:-1:-1;;;;;30923:31:0;:20;30935:7;30923:11;:20::i;:::-;-1:-1:-1;;;;;30923:31:0;;30867:87;30859:96;30699:264;-1:-1:-1;;;;30699:264:0:o;33722:625::-;33881:4;-1:-1:-1;;;;;33854:31:0;:23;33869:7;33854:14;:23::i;:::-;-1:-1:-1;;;;;33854:31:0;;33846:81;;;;-1:-1:-1;;;33846:81:0;;12140:2:1;33846:81:0;;;12122:21:1;12179:2;12159:18;;;12152:30;12218:34;12198:18;;;12191:62;-1:-1:-1;;;12269:18:1;;;12262:35;12314:19;;33846:81:0;11938:401:1;33846:81:0;-1:-1:-1;;;;;33946:16:0;;33938:65;;;;-1:-1:-1;;;33938:65:0;;12546:2:1;33938:65:0;;;12528:21:1;12585:2;12565:18;;;12558:30;12624:34;12604:18;;;12597:62;-1:-1:-1;;;12675:18:1;;;12668:34;12719:19;;33938:65:0;12344:400:1;33938:65:0;34120:29;34137:1;34141:7;34120:8;:29::i;:::-;-1:-1:-1;;;;;34162:15:0;;;;;;:9;:15;;;;;:20;;34181:1;;34162:15;:20;;34181:1;;34162:20;:::i;:::-;;;;-1:-1:-1;;;;;;;34193:13:0;;;;;;:9;:13;;;;;:18;;34210:1;;34193:13;:18;;34210:1;;34193:18;:::i;:::-;;;;-1:-1:-1;;34222:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34222:21:0;-1:-1:-1;;;;;34222:21:0;;;;;;;;;34261:27;;34222:16;;34261:27;;;;-1:-1:-1;;;;;;;;;;;34261:27:0;;26799:347;26729:417;;:::o;4825:132::-;3291:10;4889:7;:5;:7::i;:::-;-1:-1:-1;;;;;4889:23:0;;4881:68;;;;-1:-1:-1;;;4881:68:0;;13214:2:1;4881:68:0;;;13196:21:1;;;13233:18;;;13226:30;13292:34;13272:18;;;13265:62;13344:18;;4881:68:0;13012:356:1;5927:191:0;6020:6;;;-1:-1:-1;;;;;6037:17:0;;;-1:-1:-1;;;;;;6037:17:0;;;;;;;6070:40;;6020:6;;;6037:17;6020:6;;6070:40;;6001:16;;6070:40;5990:128;5927:191;:::o;34783:315::-;34938:8;-1:-1:-1;;;;;34929:17:0;:5;-1:-1:-1;;;;;34929:17:0;;34921:55;;;;-1:-1:-1;;;34921:55:0;;13575:2:1;34921:55:0;;;13557:21:1;13614:2;13594:18;;;13587:30;-1:-1:-1;;;13633:18:1;;;13626:55;13698:18;;34921:55:0;13373:349:1;34921:55:0;-1:-1:-1;;;;;34987:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;34987:46:0;;;;;;;;;;35049:41;;540::1;;;35049::0;;513:18:1;35049:41:0;;;;;;;34783:315;;;:::o;29779:313::-;29935:28;29945:4;29951:2;29955:7;29935:9;:28::i;:::-;29982:47;30005:4;30011:2;30015:7;30024:4;29982:22;:47::i;:::-;29974:110;;;;-1:-1:-1;;;29974:110:0;;;;;;;:::i;30405:127::-;30470:4;30494:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30494:16:0;:30;;;30405:127::o;39342:114::-;39402:13;39435;39428:20;;;;;:::i;465:723::-;521:13;742:5;751:1;742:10;738:53;;-1:-1:-1;;769:10:0;;;;;;;;;;;;-1:-1:-1;;;769:10:0;;;;;465:723::o;738:53::-;816:5;801:12;857:78;864:9;;857:78;;890:8;;;;:::i;:::-;;-1:-1:-1;913:10:0;;-1:-1:-1;921:2:0;913:10;;:::i;:::-;;;857:78;;;945:19;977:6;-1:-1:-1;;;;;967:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;967:17:0;;945:39;;995:154;1002:10;;995:154;;1029:11;1039:1;1029:11;;:::i;:::-;;-1:-1:-1;1098:10:0;1106:2;1098:5;:10;:::i;:::-;1085:24;;:2;:24;:::i;:::-;1072:39;;1055:6;1062;1055:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1055:56:0;;;;;;;;-1:-1:-1;1126:11:0;1135:2;1126:11;;:::i;:::-;;;995:154;;31642:319;31771:18;31777:2;31781:7;31771:5;:18::i;:::-;31822:53;31853:1;31857:2;31861:7;31870:4;31822:22;:53::i;:::-;31800:153;;;;-1:-1:-1;;;31800:153:0;;;;;;;:::i;35886:853::-;36040:4;-1:-1:-1;;;;;36061:13:0;;7653:19;:23;36057:675;;36097:71;;-1:-1:-1;;;36097:71:0;;-1:-1:-1;;;;;36097:36:0;;;;;:71;;3291:10;;36148:4;;36154:7;;36163:4;;36097:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36097:71:0;;;;;;;;-1:-1:-1;;36097:71:0;;;;;;;;;;;;:::i;:::-;;;36093:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36338:6;:13;36355:1;36338:18;36334:328;;36381:60;;-1:-1:-1;;;36381:60:0;;;;;;;:::i;36334:328::-;36612:6;36606:13;36597:6;36593:2;36589:15;36582:38;36093:584;-1:-1:-1;;;;;;36219:51:0;-1:-1:-1;;;36219:51:0;;-1:-1:-1;36212:58:0;;36057:675;-1:-1:-1;36716:4:0;35886:853;;;;;;:::o;32297:439::-;-1:-1:-1;;;;;32377:16:0;;32369:61;;;;-1:-1:-1;;;32369:61:0;;15602:2:1;32369:61:0;;;15584:21:1;;;15621:18;;;15614:30;15680:34;15660:18;;;15653:62;15732:18;;32369:61:0;15400:356:1;32369:61:0;32450:16;32458:7;32450;:16::i;:::-;32449:17;32441:58;;;;-1:-1:-1;;;32441:58:0;;15963:2:1;32441:58:0;;;15945:21:1;16002:2;15982:18;;;15975:30;-1:-1:-1;;;16021:18:1;;;16014:58;16089:18;;32441:58:0;15761:352:1;32441:58:0;-1:-1:-1;;;;;32570:13:0;;;;;;:9;:13;;;;;:18;;32587:1;;32570:13;:18;;32587:1;;32570:18;:::i;:::-;;;;-1:-1:-1;;32599:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32599:21:0;-1:-1:-1;;;;;32599:21:0;;;;;;;;32638:33;;32599:16;;;-1:-1:-1;;;;;;;;;;;32638:33:0;32599:16;;32638:33;27455:155;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2360:328::-;2437:6;2445;2453;2506:2;2494:9;2485:7;2481:23;2477:32;2474:52;;;2522:1;2519;2512:12;2474:52;2545:29;2564:9;2545:29;:::i;:::-;2535:39;;2593:38;2627:2;2616:9;2612:18;2593:38;:::i;:::-;2583:48;;2678:2;2667:9;2663:18;2650:32;2640:42;;2360:328;;;;;:::o;2693:592::-;2764:6;2772;2825:2;2813:9;2804:7;2800:23;2796:32;2793:52;;;2841:1;2838;2831:12;2793:52;2868:23;;-1:-1:-1;;;;;2940:14:1;;;2937:34;;;2967:1;2964;2957:12;2937:34;3005:6;2994:9;2990:22;2980:32;;3050:7;3043:4;3039:2;3035:13;3031:27;3021:55;;3072:1;3069;3062:12;3021:55;3112:2;3099:16;3138:2;3130:6;3127:14;3124:34;;;3154:1;3151;3144:12;3124:34;3199:7;3194:2;3185:6;3181:2;3177:15;3173:24;3170:37;3167:57;;;3220:1;3217;3210:12;3167:57;3251:2;3243:11;;;;;3273:6;;-1:-1:-1;2693:592:1;;-1:-1:-1;;;;2693:592:1:o;3290:186::-;3349:6;3402:2;3390:9;3381:7;3377:23;3373:32;3370:52;;;3418:1;3415;3408:12;3370:52;3441:29;3460:9;3441:29;:::i;3481:347::-;3546:6;3554;3607:2;3595:9;3586:7;3582:23;3578:32;3575:52;;;3623:1;3620;3613:12;3575:52;3646:29;3665:9;3646:29;:::i;:::-;3636:39;;3725:2;3714:9;3710:18;3697:32;3772:5;3765:13;3758:21;3751:5;3748:32;3738:60;;3794:1;3791;3784:12;3738:60;3817:5;3807:15;;;3481:347;;;;;:::o;3833:127::-;3894:10;3889:3;3885:20;3882:1;3875:31;3925:4;3922:1;3915:15;3949:4;3946:1;3939:15;3965:1138;4060:6;4068;4076;4084;4137:3;4125:9;4116:7;4112:23;4108:33;4105:53;;;4154:1;4151;4144:12;4105:53;4177:29;4196:9;4177:29;:::i;:::-;4167:39;;4225:38;4259:2;4248:9;4244:18;4225:38;:::i;:::-;4215:48;-1:-1:-1;4310:2:1;4295:18;;4282:32;;-1:-1:-1;4365:2:1;4350:18;;4337:32;-1:-1:-1;;;;;4418:14:1;;;4415:34;;;4445:1;4442;4435:12;4415:34;4483:6;4472:9;4468:22;4458:32;;4528:7;4521:4;4517:2;4513:13;4509:27;4499:55;;4550:1;4547;4540:12;4499:55;4586:2;4573:16;4608:2;4604;4601:10;4598:36;;;4614:18;;:::i;:::-;4689:2;4683:9;4657:2;4743:13;;-1:-1:-1;;4739:22:1;;;4763:2;4735:31;4731:40;4719:53;;;4787:18;;;4807:22;;;4784:46;4781:72;;;4833:18;;:::i;:::-;4873:10;4869:2;4862:22;4908:2;4900:6;4893:18;4948:7;4943:2;4938;4934;4930:11;4926:20;4923:33;4920:53;;;4969:1;4966;4959:12;4920:53;5025:2;5020;5016;5012:11;5007:2;4999:6;4995:15;4982:46;5070:1;5065:2;5060;5052:6;5048:15;5044:24;5037:35;5091:6;5081:16;;;;;;;3965:1138;;;;;;;:::o;5108:260::-;5176:6;5184;5237:2;5225:9;5216:7;5212:23;5208:32;5205:52;;;5253:1;5250;5243:12;5205:52;5276:29;5295:9;5276:29;:::i;:::-;5266:39;;5324:38;5358:2;5347:9;5343:18;5324:38;:::i;:::-;5314:48;;5108:260;;;;;:::o;5373:380::-;5452:1;5448:12;;;;5495;;;5516:61;;5570:4;5562:6;5558:17;5548:27;;5516:61;5623:2;5615:6;5612:14;5592:18;5589:38;5586:161;;5669:10;5664:3;5660:20;5657:1;5650:31;5704:4;5701:1;5694:15;5732:4;5729:1;5722:15;5586:161;;5373:380;;;:::o;6939:127::-;7000:10;6995:3;6991:20;6988:1;6981:31;7031:4;7028:1;7021:15;7055:4;7052:1;7045:15;7071:135;7110:3;7131:17;;;7128:43;;7151:18;;:::i;:::-;-1:-1:-1;7198:1:1;7187:13;;7071:135::o;7211:410::-;7413:2;7395:21;;;7452:2;7432:18;;;7425:30;7491:34;7486:2;7471:18;;7464:62;-1:-1:-1;;;7557:2:1;7542:18;;7535:44;7611:3;7596:19;;7211:410::o;7752:545::-;7854:2;7849:3;7846:11;7843:448;;;7890:1;7915:5;7911:2;7904:17;7960:4;7956:2;7946:19;8030:2;8018:10;8014:19;8011:1;8007:27;8001:4;7997:38;8066:4;8054:10;8051:20;8048:47;;;-1:-1:-1;8089:4:1;8048:47;8144:2;8139:3;8135:12;8132:1;8128:20;8122:4;8118:31;8108:41;;8199:82;8217:2;8210:5;8207:13;8199:82;;;8262:17;;;8243:1;8232:13;8199:82;;;8203:3;;;7752:545;;;:::o;8473:1206::-;-1:-1:-1;;;;;8589:27:1;;8586:53;;;8619:18;;:::i;:::-;8648:94;8738:3;8698:38;8730:4;8724:11;8698:38;:::i;:::-;8692:4;8648:94;:::i;:::-;8768:1;8793:2;8788:3;8785:11;8810:1;8805:616;;;;9465:1;9482:3;9479:93;;;-1:-1:-1;9538:19:1;;;9525:33;9479:93;-1:-1:-1;;8430:1:1;8426:11;;;8422:24;8418:29;8408:40;8454:1;8450:11;;;8405:57;9585:78;;8778:895;;8805:616;7699:1;7692:14;;;7736:4;7723:18;;-1:-1:-1;;8841:17:1;;;8942:9;8964:229;8978:7;8975:1;8972:14;8964:229;;;9067:19;;;9054:33;9039:49;;9174:4;9159:20;;;;9127:1;9115:14;;;;8994:12;8964:229;;;8968:3;9221;9212:7;9209:16;9206:159;;;9345:1;9341:6;9335:3;9329;9326:1;9322:11;9318:21;9314:34;9310:39;9297:9;9292:3;9288:19;9275:33;9271:79;9263:6;9256:95;9206:159;;;9408:1;9402:3;9399:1;9395:11;9391:19;9385:4;9378:33;8778:895;;;8473:1206;;;:::o;9684:348::-;9886:2;9868:21;;;9925:2;9905:18;;;9898:30;-1:-1:-1;;;9959:2:1;9944:18;;9937:54;10023:2;10008:18;;9684:348::o;10863:663::-;11143:3;11181:6;11175:13;11197:66;11256:6;11251:3;11244:4;11236:6;11232:17;11197:66;:::i;:::-;11326:13;;11285:16;;;;11348:70;11326:13;11285:16;11395:4;11383:17;;11348:70;:::i;:::-;-1:-1:-1;;;11440:20:1;;11469:22;;;11518:1;11507:13;;10863:663;-1:-1:-1;;;;10863:663:1:o;12749:128::-;12816:9;;;12837:11;;;12834:37;;;12851:18;;:::i;12882:125::-;12947:9;;;12968:10;;;12965:36;;;12981:18;;:::i;13727:414::-;13929:2;13911:21;;;13968:2;13948:18;;;13941:30;14007:34;14002:2;13987:18;;13980:62;-1:-1:-1;;;14073:2:1;14058:18;;14051:48;14131:3;14116:19;;13727:414::o;14146:127::-;14207:10;14202:3;14198:20;14195:1;14188:31;14238:4;14235:1;14228:15;14262:4;14259:1;14252:15;14278:120;14318:1;14344;14334:35;;14349:18;;:::i;:::-;-1:-1:-1;14383:9:1;;14278:120::o;14403:112::-;14435:1;14461;14451:35;;14466:18;;:::i;:::-;-1:-1:-1;14500:9:1;;14403:112::o;14520:127::-;14581:10;14576:3;14572:20;14569:1;14562:31;14612:4;14609:1;14602:15;14636:4;14633:1;14626:15;14652:489;-1:-1:-1;;;;;14921:15:1;;;14903:34;;14973:15;;14968:2;14953:18;;14946:43;15020:2;15005:18;;14998:34;;;15068:3;15063:2;15048:18;;15041:31;;;14846:4;;15089:46;;15115:19;;15107:6;15089:46;:::i;:::-;15081:54;14652:489;-1:-1:-1;;;;;;14652:489:1:o;15146:249::-;15215:6;15268:2;15256:9;15247:7;15243:23;15239:32;15236:52;;;15284:1;15281;15274:12;15236:52;15316:9;15310:16;15335:30;15359:5;15335:30;:::i

Swarm Source

ipfs://38270baf4f58629f8acf42562c4586c5c6822477ba19c62e24070622c704a84c
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.