ETH Price: $3,472.74 (+0.26%)

Token

POTION (POT)
 

Overview

Max Total Supply

1,660 POT

Holders

752

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 POT
0x3CC1a91c220c8207aF099e8547FC14224B7A3dC3
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:
FatApePotion

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-01
*/

// SPDX-License-Identifier: MIT
// 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/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 v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _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.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: ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.0;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex = 1;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;
    
    // Type of potions
    enum PotionType { NONE, RED, BLUE, GREEN, PURPLE }

    // Keep track of what type the potion was assigned
    mapping(uint256 => PotionType) public potionStorage;
    
    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // 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;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    function getPotionType(uint256 index) internal view returns (string memory) {
        if(potionStorage[index] == PotionType.BLUE)
            return "BLUE";
        if(potionStorage[index] == PotionType.RED)
            return "RED";
        if(potionStorage[index] == PotionType.GREEN)
            return "GREEN";
        if(potionStorage[index] == PotionType.PURPLE)
            return "PURPLE";
        
        return "";
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, getPotionType(tokenId))) : '';
    }

    /**
     * @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 overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint8[] calldata _potionTypes, uint256 quantity) internal {
        _safeMint(to, _potionTypes, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement 
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint8[] calldata _potionTypes,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;
            uint256 arrayIndex = 0;

            if (to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    potionStorage[updatedIndex] = PotionType(_potionTypes[arrayIndex++]);
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    function _setPotionType(uint256 index, uint256 potionType) internal {
        potionStorage[index] = PotionType(potionType);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex != end);

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), 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))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}
// File: Potion.sol


pragma solidity ^0.8.0;



contract FatApePotion is ERC721A, Ownable {
    using Strings for uint256;

    address public signer;
    address private villanContract;

    uint256 public maxSupply;
    bool public paused;
    string public uriPrefix = '';
    mapping(address => bool) public potionsClaimed;

    constructor(
        string memory _tokenName,
        string memory _tokenSymbol,
        string memory _uriPrefix,
        uint256 _maxSupply,
        address _signer
    ) ERC721A(_tokenName, _tokenSymbol) {
        maxSupply = _maxSupply;
        signer = _signer;
        paused = false;
        uriPrefix = _uriPrefix;
    }

  modifier mintCompliance(uint256 _mintAmount) {
    require(_mintAmount > 0, 'Invalid mint amount!');
    require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!');
    _;
  }

  function mint(uint256 _amount, uint8[] calldata _potionTypes, bytes memory _sig) public mintCompliance(_amount) {
    require(!paused, 'The mint is currently not active!');
    require(verifyClaim(signer, _msgSender(), _amount, _potionTypes, _sig), 'Invalid proof!');
    require(!potionsClaimed[_msgSender()], 'Address already claimed!');

    potionsClaimed[_msgSender()] = true;
    _safeMint(_msgSender(), _potionTypes, _amount);
  }

  function burnPotion(uint256 potionId) external
    {
        require(msg.sender == villanContract, "Invalid burner address");
        _burn(potionId);
    }

  function getTotalSupply() public view returns (string memory) {
    return totalSupply().toString();
  }

  function getPotion(uint256 index) public view returns (string memory) {
    return getPotionType(index);
  }

  function setVillanContractAddress(address _contract) external onlyOwner
  {
    villanContract = _contract;
  }

  function setSigner(address _address) public onlyOwner {
      signer = _address;
  }

  function setMaxSupply(uint _supply) public onlyOwner {    
      maxSupply = _supply;
  }

  function setPauseState(bool _state) public onlyOwner {    
      paused = _state;
  }

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }
  
  function _baseURI() internal view virtual override returns (string memory) {
    return uriPrefix;
  }

  function verifyClaim(address _signer, address reciver, uint256 _amount, uint8[] calldata _potionTypes, bytes memory _sig) internal pure returns (bool) {
      bytes32 messageHash = getMessageHash(reciver, _amount, _potionTypes);
      bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash);

      return recover(ethSignedMessageHash, _sig) == _signer;
  }

  function getMessageHash(address reciver, uint256 _amount, uint8[] calldata _potionTypes) internal pure returns (bytes32){    
    return keccak256(abi.encodePacked(reciver, _amount, _potionTypes));
  }

  function getEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32){
    return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", messageHash));
  }

  function recover(bytes32 _ethSignedMessageHash, bytes memory _sig) internal pure returns (address){
      (bytes32 r, bytes32 s, uint8 v) = _split(_sig);
      return ecrecover(_ethSignedMessageHash, v, r, s);
  }

  function _split(bytes memory _sig) internal pure returns (bytes32 r, bytes32 s, uint8 v){
    require(_sig.length == 65, "Invalid signature length");

    assembly {
      r := mload(add(_sig, 32))
      s := mload(add(_sig, 64))
      v := byte(0, mload(add(_sig, 96)))
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"string","name":"_uriPrefix","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"address","name":"_signer","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","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":"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":"potionId","type":"uint256"}],"name":"burnPotion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getPotion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalSupply","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint8[]","name":"_potionTypes","type":"uint8[]"},{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"potionStorage","outputs":[{"internalType":"enum ERC721A.PotionType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"potionsClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint256","name":"_supply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPauseState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setVillanContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

6001600090815560a0604081905260808290526200002191600e919062000131565b503480156200002f57600080fd5b5060405162002526380380620025268339810160408190526200005291620002a4565b8451859085906200006b90600290602085019062000131565b5080516200008190600390602084019062000131565b50506001600055506200009433620000df565b600c829055600a80546001600160a01b0319166001600160a01b038316179055600d805460ff191690558251620000d390600e90602086019062000131565b5050505050506200039f565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200013f9062000363565b90600052602060002090601f016020900481019282620001635760008555620001ae565b82601f106200017e57805160ff1916838001178555620001ae565b82800160010185558215620001ae579182015b82811115620001ae57825182559160200191906001019062000191565b50620001bc929150620001c0565b5090565b5b80821115620001bc5760008155600101620001c1565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001ff57600080fd5b81516001600160401b03808211156200021c576200021c620001d7565b604051601f8301601f19908116603f01168101908282118183101715620002475762000247620001d7565b816040528381526020925086838588010111156200026457600080fd5b600091505b8382101562000288578582018301518183018401529082019062000269565b838211156200029a5760008385830101525b9695505050505050565b600080600080600060a08688031215620002bd57600080fd5b85516001600160401b0380821115620002d557600080fd5b620002e389838a01620001ed565b96506020880151915080821115620002fa57600080fd5b6200030889838a01620001ed565b955060408801519150808211156200031f57600080fd5b506200032e88828901620001ed565b60608801516080890151919550935090506001600160a01b03811681146200035557600080fd5b809150509295509295909350565b600181811c908216806200037857607f821691505b6020821081036200039957634e487b7160e01b600052602260045260246000fd5b50919050565b61217780620003af6000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c8063715018a61161010f578063c4e41b22116100a2578063d5abeb0111610071578063d5abeb011461043a578063e985e9c514610443578063f2fde38b1461047f578063f3cba9801461049257600080fd5b8063c4e41b22146103f9578063c87b56dd14610401578063cdb88ad114610414578063d0efc0b71461042757600080fd5b80639d7c2770116100de5780639d7c2770146103ad5780639fe6990e146103c0578063a22cb465146103d3578063b88d4fde146103e657600080fd5b8063715018a6146103795780637ec4a659146103815780638da5cb5b1461039457806395d89b41146103a557600080fd5b806342842e0e116101875780636352211e116101565780636352211e1461032d5780636c19e783146103405780636f8b44b01461035357806370a082311461036657600080fd5b806342842e0e146102e25780634e85b407146102f55780635c975abb1461031857806362b99ad41461032557600080fd5b806318160ddd116101c357806318160ddd14610272578063232b09871461028c578063238ac933146102bc57806323b872dd146102cf57600080fd5b806301ffc9a7146101f557806306fdde031461021d578063081812fc14610232578063095ea7b31461025d575b600080fd5b610208610203366004611afb565b6104a5565b60405190151581526020015b60405180910390f35b6102256104f7565b6040516102149190611b70565b610245610240366004611b83565b610589565b6040516001600160a01b039091168152602001610214565b61027061026b366004611bb8565b6105cd565b005b60015460005403600019015b604051908152602001610214565b6102af61029a366004611b83565b60046020526000908152604090205460ff1681565b6040516102149190611bf8565b600a54610245906001600160a01b031681565b6102706102dd366004611c20565b61065a565b6102706102f0366004611c20565b610665565b610208610303366004611c5c565b600f6020526000908152604090205460ff1681565b600d546102089060ff1681565b610225610680565b61024561033b366004611b83565b61070e565b61027061034e366004611c5c565b610720565b610270610361366004611b83565b610775565b61027e610374366004611c5c565b6107a4565b6102706107f2565b61027061038f366004611d02565b610828565b6009546001600160a01b0316610245565b610225610869565b6102256103bb366004611b83565b610878565b6102706103ce366004611c5c565b610883565b6102706103e1366004611d5a565b6108cf565b6102706103f4366004611dad565b610964565b6102256109b5565b61022561040f366004611b83565b6109d1565b610270610422366004611e14565b610a55565b610270610435366004611e2f565b610a92565b61027e600c5481565b610208610451366004611ec6565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b61027061048d366004611c5c565b610c7b565b6102706104a0366004611b83565b610d16565b60006001600160e01b031982166380ac58cd60e01b14806104d657506001600160e01b03198216635b5e139f60e01b145b806104f157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461050690611ef0565b80601f016020809104026020016040519081016040528092919081815260200182805461053290611ef0565b801561057f5780601f106105545761010080835404028352916020019161057f565b820191906000526020600020905b81548152906001019060200180831161056257829003601f168201915b5050505050905090565b600061059482610d72565b6105b1576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b60006105d88261070e565b9050806001600160a01b0316836001600160a01b03160361060c5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061062c575061062a8133610451565b155b1561064a576040516367d9dca160e11b815260040160405180910390fd5b610655838383610dab565b505050565b610655838383610e07565b61065583838360405180602001604052806000815250610964565b600e805461068d90611ef0565b80601f01602080910402602001604051908101604052809291908181526020018280546106b990611ef0565b80156107065780601f106106db57610100808354040283529160200191610706565b820191906000526020600020905b8154815290600101906020018083116106e957829003601f168201915b505050505081565b600061071982610fe0565b5192915050565b6009546001600160a01b031633146107535760405162461bcd60e51b815260040161074a90611f2a565b60405180910390fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b0316331461079f5760405162461bcd60e51b815260040161074a90611f2a565b600c55565b60006001600160a01b0382166107cd576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b6009546001600160a01b0316331461081c5760405162461bcd60e51b815260040161074a90611f2a565b6108266000611107565b565b6009546001600160a01b031633146108525760405162461bcd60e51b815260040161074a90611f2a565b805161086590600e906020840190611a4c565b5050565b60606003805461050690611ef0565b60606104f182611159565b6009546001600160a01b031633146108ad5760405162461bcd60e51b815260040161074a90611f2a565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b336001600160a01b038316036108f85760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61096f848484610e07565b6001600160a01b0383163b15158015610991575061098f8484848461129f565b155b156109af576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6001546000546060916109cc91036000190161138b565b905090565b60606109dc82610d72565b6109f957604051630a14c4b560e41b815260040160405180910390fd5b6000610a0361148b565b90508051600003610a235760405180602001604052806000815250610a4e565b80610a2d84611159565b604051602001610a3e929190611f5f565b6040516020818303038152906040525b9392505050565b6009546001600160a01b03163314610a7f5760405162461bcd60e51b815260040161074a90611f2a565b600d805460ff1916911515919091179055565b8360008111610ada5760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b604482015260640161074a565b600c546001546000548391900360001901610af59190611fa4565b1115610b3a5760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b604482015260640161074a565b600d5460ff1615610b975760405162461bcd60e51b815260206004820152602160248201527f546865206d696e742069732063757272656e746c79206e6f74206163746976656044820152602160f81b606482015260840161074a565b600a54610bb1906001600160a01b0316338787878761149a565b610bee5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b604482015260640161074a565b336000908152600f602052604090205460ff1615610c4e5760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920636c61696d6564210000000000000000604482015260640161074a565b336000818152600f60205260409020805460ff19166001179055610c7490858588611531565b5050505050565b6009546001600160a01b03163314610ca55760405162461bcd60e51b815260040161074a90611f2a565b6001600160a01b038116610d0a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161074a565b610d1381611107565b50565b600b546001600160a01b03163314610d695760405162461bcd60e51b8152602060048201526016602482015275496e76616c6964206275726e6572206164647265737360501b604482015260640161074a565b610d138161154d565b600081600111158015610d86575060005482105b80156104f1575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000610e1282610fe0565b9050836001600160a01b031681600001516001600160a01b031614610e495760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480610e675750610e678533610451565b80610e82575033610e7784610589565b6001600160a01b0316145b905080610ea257604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416610ec957604051633a954ecd60e21b815260040160405180910390fd5b610ed560008487610dab565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116610fa9576000548214610fa957805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b031660008051602061212283398151915260405160405180910390a4610c74565b60408051606081018252600080825260208201819052918101919091528180600111158015611010575060005481105b156110ee57600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906110ec5780516001600160a01b031615611083579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156110e7579392505050565b611083565b505b604051636f96cda160e11b815260040160405180910390fd5b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600260008381526004602081905260409091205460ff169081111561118257611182611be2565b036111a7575050604080518082019091526004815263424c554560e01b602082015290565b600160008381526004602081905260409091205460ff16908111156111ce576111ce611be2565b036111f257505060408051808201909152600381526214915160ea1b602082015290565b600360008381526004602081905260409091205460ff169081111561121957611219611be2565b0361123f57505060408051808201909152600581526423a922a2a760d91b602082015290565b60008281526004602081905260409091205460ff168181111561126457611264611be2565b0361128b575050604080518082019091526006815265505552504c4560d01b602082015290565b505060408051602081019091526000815290565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906112d4903390899088908890600401611fbc565b6020604051808303816000875af192505050801561130f575060408051601f3d908101601f1916820190925261130c91810190611ff9565b60015b61136d573d80801561133d576040519150601f19603f3d011682016040523d82523d6000602084013e611342565b606091505b508051600003611365576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816000036113b25750506040805180820190915260018152600360fc1b602082015290565b8160005b81156113dc57806113c681612016565b91506113d59050600a83612045565b91506113b6565b6000816001600160401b038111156113f6576113f6611c77565b6040519080825280601f01601f191660200182016040528015611420576020820181803683370190505b5090505b841561138357611435600183612059565b9150611442600a86612070565b61144d906030611fa4565b60f81b81838151811061146257611462612084565b60200101906001600160f81b031916908160001a905350611484600a86612045565b9450611424565b6060600e805461050690611ef0565b6000806114a987878787611558565b90506000611504826040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050886001600160a01b031661151a8286611591565b6001600160a01b0316149998505050505050505050565b6109af8484848460405180602001604052806000815250611610565b610d13816000611825565b60008484848460405160200161157194939291906120ab565b604051602081830303815290604052805190602001209050949350505050565b6000806000806115a0856119d8565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa1580156115fb573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b6000546001600160a01b03861661163957604051622e076360e81b815260040160405180910390fd5b8260000361165a5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038616600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b018116909202179091558584526005909252822080546001600160e01b0319168417600160a01b4290931692909202919091179055829182860191903b15611770575b60405183906001600160a01b038b1690600090600080516020612122833981519152908290a461173960008a858060010196508861129f565b611756576040516368d2bf6b60e11b815260040160405180910390fd5b81830361170057836000541461176b57600080fd5b611818565b87878280600101935081811061178857611788612084565b905060200201602081019061179d9190612106565b60ff1660048111156117b1576117b1611be2565b60008481526004602081905260409091208054909160ff199091169060019084908111156117e1576117e1611be2565b02179055506040516001840193906001600160a01b038b1690600090600080516020612122833981519152908290a4818303611770575b5050600055505050505050565b600061183083610fe0565b80519091508215611896576000336001600160a01b038316148061185957506118598233610451565b8061187457503361186986610589565b6001600160a01b0316145b90508061189457604051632ce44b5f60e11b815260040160405180910390fd5b505b6118a260008583610dab565b6001600160a01b0380821660008181526006602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526005909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b1785559189018084529220805491949091166119a05760005482146119a057805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b03841690600080516020612122833981519152908390a4505060018054810190555050565b60008060008351604114611a2e5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207369676e6174757265206c656e6774680000000000000000604482015260640161074a565b50505060208101516040820151606090920151909260009190911a90565b828054611a5890611ef0565b90600052602060002090601f016020900481019282611a7a5760008555611ac0565b82601f10611a9357805160ff1916838001178555611ac0565b82800160010185558215611ac0579182015b82811115611ac0578251825591602001919060010190611aa5565b50611acc929150611ad0565b5090565b5b80821115611acc5760008155600101611ad1565b6001600160e01b031981168114610d1357600080fd5b600060208284031215611b0d57600080fd5b8135610a4e81611ae5565b60005b83811015611b33578181015183820152602001611b1b565b838111156109af5750506000910152565b60008151808452611b5c816020860160208601611b18565b601f01601f19169290920160200192915050565b602081526000610a4e6020830184611b44565b600060208284031215611b9557600080fd5b5035919050565b80356001600160a01b0381168114611bb357600080fd5b919050565b60008060408385031215611bcb57600080fd5b611bd483611b9c565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b6020810160058310611c1a57634e487b7160e01b600052602160045260246000fd5b91905290565b600080600060608486031215611c3557600080fd5b611c3e84611b9c565b9250611c4c60208501611b9c565b9150604084013590509250925092565b600060208284031215611c6e57600080fd5b610a4e82611b9c565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115611ca757611ca7611c77565b604051601f8501601f19908116603f01168101908282118183101715611ccf57611ccf611c77565b81604052809350858152868686011115611ce857600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611d1457600080fd5b81356001600160401b03811115611d2a57600080fd5b8201601f81018413611d3b57600080fd5b61138384823560208401611c8d565b80358015158114611bb357600080fd5b60008060408385031215611d6d57600080fd5b611d7683611b9c565b9150611d8460208401611d4a565b90509250929050565b600082601f830112611d9e57600080fd5b610a4e83833560208501611c8d565b60008060008060808587031215611dc357600080fd5b611dcc85611b9c565b9350611dda60208601611b9c565b92506040850135915060608501356001600160401b03811115611dfc57600080fd5b611e0887828801611d8d565b91505092959194509250565b600060208284031215611e2657600080fd5b610a4e82611d4a565b60008060008060608587031215611e4557600080fd5b8435935060208501356001600160401b0380821115611e6357600080fd5b818701915087601f830112611e7757600080fd5b813581811115611e8657600080fd5b8860208260051b8501011115611e9b57600080fd5b602083019550809450506040870135915080821115611eb957600080fd5b50611e0887828801611d8d565b60008060408385031215611ed957600080fd5b611ee283611b9c565b9150611d8460208401611b9c565b600181811c90821680611f0457607f821691505b602082108103611f2457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008351611f71818460208801611b18565b835190830190611f85818360208801611b18565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b60008219821115611fb757611fb7611f8e565b500190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611fef90830184611b44565b9695505050505050565b60006020828403121561200b57600080fd5b8151610a4e81611ae5565b60006001820161202857612028611f8e565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826120545761205461202f565b500490565b60008282101561206b5761206b611f8e565b500390565b60008261207f5761207f61202f565b500690565b634e487b7160e01b600052603260045260246000fd5b803560ff81168114611bb357600080fd5b6bffffffffffffffffffffffff198560601b1681528360148201526000603482018460005b858110156120f95760ff6120e38361209a565b16835260209283019291909101906001016120d0565b5090979650505050505050565b60006020828403121561211857600080fd5b610a4e8261209a56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220284b743efa3275cbccfab6444965ae3bbb57d25b78710fc7167c0b336fededc564736f6c634300080d003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000a8c000000000000000000000000ef23dc701b911c0f353091232a0d0389c90e7c400000000000000000000000000000000000000000000000000000000000000006504f54494f4e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003504f5400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5075576f634a31673657384e61434261626747623278396e516f3331777245644c754569564570594e7a44692f00000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101f05760003560e01c8063715018a61161010f578063c4e41b22116100a2578063d5abeb0111610071578063d5abeb011461043a578063e985e9c514610443578063f2fde38b1461047f578063f3cba9801461049257600080fd5b8063c4e41b22146103f9578063c87b56dd14610401578063cdb88ad114610414578063d0efc0b71461042757600080fd5b80639d7c2770116100de5780639d7c2770146103ad5780639fe6990e146103c0578063a22cb465146103d3578063b88d4fde146103e657600080fd5b8063715018a6146103795780637ec4a659146103815780638da5cb5b1461039457806395d89b41146103a557600080fd5b806342842e0e116101875780636352211e116101565780636352211e1461032d5780636c19e783146103405780636f8b44b01461035357806370a082311461036657600080fd5b806342842e0e146102e25780634e85b407146102f55780635c975abb1461031857806362b99ad41461032557600080fd5b806318160ddd116101c357806318160ddd14610272578063232b09871461028c578063238ac933146102bc57806323b872dd146102cf57600080fd5b806301ffc9a7146101f557806306fdde031461021d578063081812fc14610232578063095ea7b31461025d575b600080fd5b610208610203366004611afb565b6104a5565b60405190151581526020015b60405180910390f35b6102256104f7565b6040516102149190611b70565b610245610240366004611b83565b610589565b6040516001600160a01b039091168152602001610214565b61027061026b366004611bb8565b6105cd565b005b60015460005403600019015b604051908152602001610214565b6102af61029a366004611b83565b60046020526000908152604090205460ff1681565b6040516102149190611bf8565b600a54610245906001600160a01b031681565b6102706102dd366004611c20565b61065a565b6102706102f0366004611c20565b610665565b610208610303366004611c5c565b600f6020526000908152604090205460ff1681565b600d546102089060ff1681565b610225610680565b61024561033b366004611b83565b61070e565b61027061034e366004611c5c565b610720565b610270610361366004611b83565b610775565b61027e610374366004611c5c565b6107a4565b6102706107f2565b61027061038f366004611d02565b610828565b6009546001600160a01b0316610245565b610225610869565b6102256103bb366004611b83565b610878565b6102706103ce366004611c5c565b610883565b6102706103e1366004611d5a565b6108cf565b6102706103f4366004611dad565b610964565b6102256109b5565b61022561040f366004611b83565b6109d1565b610270610422366004611e14565b610a55565b610270610435366004611e2f565b610a92565b61027e600c5481565b610208610451366004611ec6565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b61027061048d366004611c5c565b610c7b565b6102706104a0366004611b83565b610d16565b60006001600160e01b031982166380ac58cd60e01b14806104d657506001600160e01b03198216635b5e139f60e01b145b806104f157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461050690611ef0565b80601f016020809104026020016040519081016040528092919081815260200182805461053290611ef0565b801561057f5780601f106105545761010080835404028352916020019161057f565b820191906000526020600020905b81548152906001019060200180831161056257829003601f168201915b5050505050905090565b600061059482610d72565b6105b1576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b60006105d88261070e565b9050806001600160a01b0316836001600160a01b03160361060c5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061062c575061062a8133610451565b155b1561064a576040516367d9dca160e11b815260040160405180910390fd5b610655838383610dab565b505050565b610655838383610e07565b61065583838360405180602001604052806000815250610964565b600e805461068d90611ef0565b80601f01602080910402602001604051908101604052809291908181526020018280546106b990611ef0565b80156107065780601f106106db57610100808354040283529160200191610706565b820191906000526020600020905b8154815290600101906020018083116106e957829003601f168201915b505050505081565b600061071982610fe0565b5192915050565b6009546001600160a01b031633146107535760405162461bcd60e51b815260040161074a90611f2a565b60405180910390fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b0316331461079f5760405162461bcd60e51b815260040161074a90611f2a565b600c55565b60006001600160a01b0382166107cd576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b6009546001600160a01b0316331461081c5760405162461bcd60e51b815260040161074a90611f2a565b6108266000611107565b565b6009546001600160a01b031633146108525760405162461bcd60e51b815260040161074a90611f2a565b805161086590600e906020840190611a4c565b5050565b60606003805461050690611ef0565b60606104f182611159565b6009546001600160a01b031633146108ad5760405162461bcd60e51b815260040161074a90611f2a565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b336001600160a01b038316036108f85760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61096f848484610e07565b6001600160a01b0383163b15158015610991575061098f8484848461129f565b155b156109af576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6001546000546060916109cc91036000190161138b565b905090565b60606109dc82610d72565b6109f957604051630a14c4b560e41b815260040160405180910390fd5b6000610a0361148b565b90508051600003610a235760405180602001604052806000815250610a4e565b80610a2d84611159565b604051602001610a3e929190611f5f565b6040516020818303038152906040525b9392505050565b6009546001600160a01b03163314610a7f5760405162461bcd60e51b815260040161074a90611f2a565b600d805460ff1916911515919091179055565b8360008111610ada5760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b604482015260640161074a565b600c546001546000548391900360001901610af59190611fa4565b1115610b3a5760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b604482015260640161074a565b600d5460ff1615610b975760405162461bcd60e51b815260206004820152602160248201527f546865206d696e742069732063757272656e746c79206e6f74206163746976656044820152602160f81b606482015260840161074a565b600a54610bb1906001600160a01b0316338787878761149a565b610bee5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b604482015260640161074a565b336000908152600f602052604090205460ff1615610c4e5760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920636c61696d6564210000000000000000604482015260640161074a565b336000818152600f60205260409020805460ff19166001179055610c7490858588611531565b5050505050565b6009546001600160a01b03163314610ca55760405162461bcd60e51b815260040161074a90611f2a565b6001600160a01b038116610d0a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161074a565b610d1381611107565b50565b600b546001600160a01b03163314610d695760405162461bcd60e51b8152602060048201526016602482015275496e76616c6964206275726e6572206164647265737360501b604482015260640161074a565b610d138161154d565b600081600111158015610d86575060005482105b80156104f1575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000610e1282610fe0565b9050836001600160a01b031681600001516001600160a01b031614610e495760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480610e675750610e678533610451565b80610e82575033610e7784610589565b6001600160a01b0316145b905080610ea257604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416610ec957604051633a954ecd60e21b815260040160405180910390fd5b610ed560008487610dab565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116610fa9576000548214610fa957805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b031660008051602061212283398151915260405160405180910390a4610c74565b60408051606081018252600080825260208201819052918101919091528180600111158015611010575060005481105b156110ee57600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906110ec5780516001600160a01b031615611083579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156110e7579392505050565b611083565b505b604051636f96cda160e11b815260040160405180910390fd5b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600260008381526004602081905260409091205460ff169081111561118257611182611be2565b036111a7575050604080518082019091526004815263424c554560e01b602082015290565b600160008381526004602081905260409091205460ff16908111156111ce576111ce611be2565b036111f257505060408051808201909152600381526214915160ea1b602082015290565b600360008381526004602081905260409091205460ff169081111561121957611219611be2565b0361123f57505060408051808201909152600581526423a922a2a760d91b602082015290565b60008281526004602081905260409091205460ff168181111561126457611264611be2565b0361128b575050604080518082019091526006815265505552504c4560d01b602082015290565b505060408051602081019091526000815290565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906112d4903390899088908890600401611fbc565b6020604051808303816000875af192505050801561130f575060408051601f3d908101601f1916820190925261130c91810190611ff9565b60015b61136d573d80801561133d576040519150601f19603f3d011682016040523d82523d6000602084013e611342565b606091505b508051600003611365576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816000036113b25750506040805180820190915260018152600360fc1b602082015290565b8160005b81156113dc57806113c681612016565b91506113d59050600a83612045565b91506113b6565b6000816001600160401b038111156113f6576113f6611c77565b6040519080825280601f01601f191660200182016040528015611420576020820181803683370190505b5090505b841561138357611435600183612059565b9150611442600a86612070565b61144d906030611fa4565b60f81b81838151811061146257611462612084565b60200101906001600160f81b031916908160001a905350611484600a86612045565b9450611424565b6060600e805461050690611ef0565b6000806114a987878787611558565b90506000611504826040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050886001600160a01b031661151a8286611591565b6001600160a01b0316149998505050505050505050565b6109af8484848460405180602001604052806000815250611610565b610d13816000611825565b60008484848460405160200161157194939291906120ab565b604051602081830303815290604052805190602001209050949350505050565b6000806000806115a0856119d8565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa1580156115fb573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b6000546001600160a01b03861661163957604051622e076360e81b815260040160405180910390fd5b8260000361165a5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038616600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b018116909202179091558584526005909252822080546001600160e01b0319168417600160a01b4290931692909202919091179055829182860191903b15611770575b60405183906001600160a01b038b1690600090600080516020612122833981519152908290a461173960008a858060010196508861129f565b611756576040516368d2bf6b60e11b815260040160405180910390fd5b81830361170057836000541461176b57600080fd5b611818565b87878280600101935081811061178857611788612084565b905060200201602081019061179d9190612106565b60ff1660048111156117b1576117b1611be2565b60008481526004602081905260409091208054909160ff199091169060019084908111156117e1576117e1611be2565b02179055506040516001840193906001600160a01b038b1690600090600080516020612122833981519152908290a4818303611770575b5050600055505050505050565b600061183083610fe0565b80519091508215611896576000336001600160a01b038316148061185957506118598233610451565b8061187457503361186986610589565b6001600160a01b0316145b90508061189457604051632ce44b5f60e11b815260040160405180910390fd5b505b6118a260008583610dab565b6001600160a01b0380821660008181526006602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526005909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b1785559189018084529220805491949091166119a05760005482146119a057805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b03841690600080516020612122833981519152908390a4505060018054810190555050565b60008060008351604114611a2e5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207369676e6174757265206c656e6774680000000000000000604482015260640161074a565b50505060208101516040820151606090920151909260009190911a90565b828054611a5890611ef0565b90600052602060002090601f016020900481019282611a7a5760008555611ac0565b82601f10611a9357805160ff1916838001178555611ac0565b82800160010185558215611ac0579182015b82811115611ac0578251825591602001919060010190611aa5565b50611acc929150611ad0565b5090565b5b80821115611acc5760008155600101611ad1565b6001600160e01b031981168114610d1357600080fd5b600060208284031215611b0d57600080fd5b8135610a4e81611ae5565b60005b83811015611b33578181015183820152602001611b1b565b838111156109af5750506000910152565b60008151808452611b5c816020860160208601611b18565b601f01601f19169290920160200192915050565b602081526000610a4e6020830184611b44565b600060208284031215611b9557600080fd5b5035919050565b80356001600160a01b0381168114611bb357600080fd5b919050565b60008060408385031215611bcb57600080fd5b611bd483611b9c565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b6020810160058310611c1a57634e487b7160e01b600052602160045260246000fd5b91905290565b600080600060608486031215611c3557600080fd5b611c3e84611b9c565b9250611c4c60208501611b9c565b9150604084013590509250925092565b600060208284031215611c6e57600080fd5b610a4e82611b9c565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115611ca757611ca7611c77565b604051601f8501601f19908116603f01168101908282118183101715611ccf57611ccf611c77565b81604052809350858152868686011115611ce857600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611d1457600080fd5b81356001600160401b03811115611d2a57600080fd5b8201601f81018413611d3b57600080fd5b61138384823560208401611c8d565b80358015158114611bb357600080fd5b60008060408385031215611d6d57600080fd5b611d7683611b9c565b9150611d8460208401611d4a565b90509250929050565b600082601f830112611d9e57600080fd5b610a4e83833560208501611c8d565b60008060008060808587031215611dc357600080fd5b611dcc85611b9c565b9350611dda60208601611b9c565b92506040850135915060608501356001600160401b03811115611dfc57600080fd5b611e0887828801611d8d565b91505092959194509250565b600060208284031215611e2657600080fd5b610a4e82611d4a565b60008060008060608587031215611e4557600080fd5b8435935060208501356001600160401b0380821115611e6357600080fd5b818701915087601f830112611e7757600080fd5b813581811115611e8657600080fd5b8860208260051b8501011115611e9b57600080fd5b602083019550809450506040870135915080821115611eb957600080fd5b50611e0887828801611d8d565b60008060408385031215611ed957600080fd5b611ee283611b9c565b9150611d8460208401611b9c565b600181811c90821680611f0457607f821691505b602082108103611f2457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008351611f71818460208801611b18565b835190830190611f85818360208801611b18565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b60008219821115611fb757611fb7611f8e565b500190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611fef90830184611b44565b9695505050505050565b60006020828403121561200b57600080fd5b8151610a4e81611ae5565b60006001820161202857612028611f8e565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826120545761205461202f565b500490565b60008282101561206b5761206b611f8e565b500390565b60008261207f5761207f61202f565b500690565b634e487b7160e01b600052603260045260246000fd5b803560ff81168114611bb357600080fd5b6bffffffffffffffffffffffff198560601b1681528360148201526000603482018460005b858110156120f95760ff6120e38361209a565b16835260209283019291909101906001016120d0565b5090979650505050505050565b60006020828403121561211857600080fd5b610a4e8261209a56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220284b743efa3275cbccfab6444965ae3bbb57d25b78710fc7167c0b336fededc564736f6c634300080d0033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000a8c000000000000000000000000ef23dc701b911c0f353091232a0d0389c90e7c400000000000000000000000000000000000000000000000000000000000000006504f54494f4e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003504f5400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5075576f634a31673657384e61434261626747623278396e516f3331777245644c754569564570594e7a44692f00000000000000000000

-----Decoded View---------------
Arg [0] : _tokenName (string): POTION
Arg [1] : _tokenSymbol (string): POT
Arg [2] : _uriPrefix (string): ipfs://QmPuWocJ1g6W8NaCBabgGb2x9nQo31wrEdLuEiVEpYNzDi/
Arg [3] : _maxSupply (uint256): 2700
Arg [4] : _signer (address): 0xef23DC701b911C0f353091232A0D0389c90e7c40

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000a8c
Arg [4] : 000000000000000000000000ef23dc701b911c0f353091232a0d0389c90e7c40
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [6] : 504f54494f4e0000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [8] : 504f540000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [10] : 697066733a2f2f516d5075576f634a31673657384e6143426162674762327839
Arg [11] : 6e516f3331777245644c754569564570594e7a44692f00000000000000000000


Deployed Bytecode Sourcemap

46872:3596:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27197:305;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;27197:305:0;;;;;;;;30760:100;;;:::i;:::-;;;;;;;:::i;32267:204::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;32267:204:0;1528:203:1;31830:371:0;;;;;;:::i;:::-;;:::i;:::-;;26446:303;26303:1;26700:12;26490:7;26684:13;:28;-1:-1:-1;;26684:46:0;26446:303;;;2319:25:1;;;2307:2;2292:18;26446:303:0;2173:177:1;25317:51:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;46955:21::-;;;;;-1:-1:-1;;;;;46955:21:0;;;33132:170;;;;;;:::i;:::-;;:::i;33373:185::-;;;;;;:::i;:::-;;:::i;47113:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;47053:18;;;;;;;;;47078:28;;;:::i;30568:125::-;;;;;;:::i;:::-;;:::i;48679:86::-;;;;;;:::i;:::-;;:::i;48771:91::-;;;;;;:::i;:::-;;:::i;27566:206::-;;;;;;:::i;:::-;;:::i;4763:103::-;;;:::i;48961:100::-;;;;;;:::i;:::-;;:::i;4112:87::-;4185:6;;-1:-1:-1;;;;;4185:6:0;4112:87;;30929:104;;;:::i;48443:110::-;;;;;;:::i;:::-;;:::i;48559:114::-;;;;;;:::i;:::-;;:::i;32543:287::-;;;;;;:::i;:::-;;:::i;33629:369::-;;;;;;:::i;:::-;;:::i;48331:106::-;;;:::i;31104:322::-;;;;;;:::i;:::-;;:::i;48868:87::-;;;;;;:::i;:::-;;:::i;47715:444::-;;;;;;:::i;:::-;;:::i;47022:24::-;;;;;;32901:164;;;;;;:::i;:::-;-1:-1:-1;;;;;33022:25:0;;;32998:4;33022:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;32901:164;5021:201;;;;;;:::i;:::-;;:::i;48165:160::-;;;;;;:::i;:::-;;:::i;27197:305::-;27299:4;-1:-1:-1;;;;;;27336:40:0;;-1:-1:-1;;;27336:40:0;;:105;;-1:-1:-1;;;;;;;27393:48:0;;-1:-1:-1;;;27393:48:0;27336:105;:158;;;-1:-1:-1;;;;;;;;;;17005:40:0;;;27458:36;27316:178;27197:305;-1:-1:-1;;27197:305:0:o;30760:100::-;30814:13;30847:5;30840:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30760:100;:::o;32267:204::-;32335:7;32360:16;32368:7;32360;:16::i;:::-;32355:64;;32385:34;;-1:-1:-1;;;32385:34:0;;;;;;;;;;;32355:64;-1:-1:-1;32439:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;32439:24:0;;32267:204::o;31830:371::-;31903:13;31919:24;31935:7;31919:15;:24::i;:::-;31903:40;;31964:5;-1:-1:-1;;;;;31958:11:0;:2;-1:-1:-1;;;;;31958:11:0;;31954:48;;31978:24;;-1:-1:-1;;;31978:24:0;;;;;;;;;;;31954:48;2916:10;-1:-1:-1;;;;;32019:21:0;;;;;;:63;;-1:-1:-1;32045:37:0;32062:5;2916:10;32901:164;:::i;32045:37::-;32044:38;32019:63;32015:138;;;32106:35;;-1:-1:-1;;;32106:35:0;;;;;;;;;;;32015:138;32165:28;32174:2;32178:7;32187:5;32165:8;:28::i;:::-;31892:309;31830:371;;:::o;33132:170::-;33266:28;33276:4;33282:2;33286:7;33266:9;:28::i;33373:185::-;33511:39;33528:4;33534:2;33538:7;33511:39;;;;;;;;;;;;:16;:39::i;47078:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30568:125::-;30632:7;30659:21;30672:7;30659:12;:21::i;:::-;:26;;30568:125;-1:-1:-1;;30568:125:0:o;48679:86::-;4185:6;;-1:-1:-1;;;;;4185:6:0;2916:10;4332:23;4324:68;;;;-1:-1:-1;;;4324:68:0;;;;;;;:::i;:::-;;;;;;;;;48742:6:::1;:17:::0;;-1:-1:-1;;;;;;48742:17:0::1;-1:-1:-1::0;;;;;48742:17:0;;;::::1;::::0;;;::::1;::::0;;48679:86::o;48771:91::-;4185:6;;-1:-1:-1;;;;;4185:6:0;2916:10;4332:23;4324:68;;;;-1:-1:-1;;;4324:68:0;;;;;;;:::i;:::-;48837:9:::1;:19:::0;48771:91::o;27566:206::-;27630:7;-1:-1:-1;;;;;27654:19:0;;27650:60;;27682:28;;-1:-1:-1;;;27682:28:0;;;;;;;;;;;27650:60;-1:-1:-1;;;;;;27736:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;27736:27:0;;27566:206::o;4763:103::-;4185:6;;-1:-1:-1;;;;;4185:6:0;2916:10;4332:23;4324:68;;;;-1:-1:-1;;;4324:68:0;;;;;;;:::i;:::-;4828:30:::1;4855:1;4828:18;:30::i;:::-;4763:103::o:0;48961:100::-;4185:6;;-1:-1:-1;;;;;4185:6:0;2916:10;4332:23;4324:68;;;;-1:-1:-1;;;4324:68:0;;;;;;;:::i;:::-;49033:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;48961:100:::0;:::o;30929:104::-;30985:13;31018:7;31011:14;;;;;:::i;48443:110::-;48498:13;48527:20;48541:5;48527:13;:20::i;48559:114::-;4185:6;;-1:-1:-1;;;;;4185:6:0;2916:10;4332:23;4324:68;;;;-1:-1:-1;;;4324:68:0;;;;;;;:::i;:::-;48641:14:::1;:26:::0;;-1:-1:-1;;;;;;48641:26:0::1;-1:-1:-1::0;;;;;48641:26:0;;;::::1;::::0;;;::::1;::::0;;48559:114::o;32543:287::-;2916:10;-1:-1:-1;;;;;32642:24:0;;;32638:54;;32675:17;;-1:-1:-1;;;32675:17:0;;;;;;;;;;;32638:54;2916:10;32705:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;32705:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;32705:53:0;;;;;;;;;;32774:48;;540:41:1;;;32705:42:0;;2916:10;32774:48;;513:18:1;32774:48:0;;;;;;;32543:287;;:::o;33629:369::-;33796:28;33806:4;33812:2;33816:7;33796:9;:28::i;:::-;-1:-1:-1;;;;;33839:13:0;;7108:19;:23;;33839:76;;;;;33859:56;33890:4;33896:2;33900:7;33909:5;33859:30;:56::i;:::-;33858:57;33839:76;33835:156;;;33939:40;;-1:-1:-1;;;33939:40:0;;;;;;;;;;;33835:156;33629:369;;;;:::o;48331:106::-;26303:1;26700:12;26490:7;26684:13;48378;;48407:24;;26684:28;-1:-1:-1;;26684:46:0;48407:22;:24::i;:::-;48400:31;;48331:106;:::o;31104:322::-;31177:13;31208:16;31216:7;31208;:16::i;:::-;31203:59;;31233:29;;-1:-1:-1;;;31233:29:0;;;;;;;;;;;31203:59;31275:21;31299:10;:8;:10::i;:::-;31275:34;;31333:7;31327:21;31352:1;31327:26;:91;;;;;;;;;;;;;;;;;31380:7;31389:22;31403:7;31389:13;:22::i;:::-;31363:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31327:91;31320:98;31104:322;-1:-1:-1;;;31104:322:0:o;48868:87::-;4185:6;;-1:-1:-1;;;;;4185:6:0;2916:10;4332:23;4324:68;;;;-1:-1:-1;;;4324:68:0;;;;;;;:::i;:::-;48934:6:::1;:15:::0;;-1:-1:-1;;48934:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48868:87::o;47715:444::-;47818:7;47589:1;47575:11;:15;47567:48;;;;-1:-1:-1;;;47567:48:0;;8532:2:1;47567:48:0;;;8514:21:1;8571:2;8551:18;;;8544:30;-1:-1:-1;;;8590:18:1;;;8583:50;8650:18;;47567:48:0;8330:344:1;47567:48:0;47661:9;;26303:1;26700:12;26490:7;26684:13;47646:11;;26684:28;;-1:-1:-1;;26684:46:0;47630:27;;;;:::i;:::-;:40;;47622:73;;;;-1:-1:-1;;;47622:73:0;;9146:2:1;47622:73:0;;;9128:21:1;9185:2;9165:18;;;9158:30;-1:-1:-1;;;9204:18:1;;;9197:50;9264:18;;47622:73:0;8944:344:1;47622:73:0;47843:6:::1;::::0;::::1;;47842:7;47834:53;;;::::0;-1:-1:-1;;;47834:53:0;;9495:2:1;47834:53:0::1;::::0;::::1;9477:21:1::0;9534:2;9514:18;;;9507:30;9573:34;9553:18;;;9546:62;-1:-1:-1;;;9624:18:1;;;9617:31;9665:19;;47834:53:0::1;9293:397:1::0;47834:53:0::1;47914:6;::::0;47902:62:::1;::::0;-1:-1:-1;;;;;47914:6:0::1;2916:10:::0;47936:7:::1;47945:12;;47959:4;47902:11;:62::i;:::-;47894:89;;;::::0;-1:-1:-1;;;47894:89:0;;9897:2:1;47894:89:0::1;::::0;::::1;9879:21:1::0;9936:2;9916:18;;;9909:30;-1:-1:-1;;;9955:18:1;;;9948:44;10009:18;;47894:89:0::1;9695:338:1::0;47894:89:0::1;2916:10:::0;47999:28:::1;::::0;;;:14:::1;:28;::::0;;;;;::::1;;47998:29;47990:66;;;::::0;-1:-1:-1;;;47990:66:0;;10240:2:1;47990:66:0::1;::::0;::::1;10222:21:1::0;10279:2;10259:18;;;10252:30;10318:26;10298:18;;;10291:54;10362:18;;47990:66:0::1;10038:348:1::0;47990:66:0::1;2916:10:::0;48065:28:::1;::::0;;;:14:::1;:28;::::0;;;;:35;;-1:-1:-1;;48065:35:0::1;48096:4;48065:35;::::0;;48107:46:::1;::::0;48131:12;;48145:7;48107:9:::1;:46::i;:::-;47715:444:::0;;;;;:::o;5021:201::-;4185:6;;-1:-1:-1;;;;;4185:6:0;2916:10;4332:23;4324:68;;;;-1:-1:-1;;;4324:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5110:22:0;::::1;5102:73;;;::::0;-1:-1:-1;;;5102:73:0;;10593:2:1;5102:73:0::1;::::0;::::1;10575:21:1::0;10632:2;10612:18;;;10605:30;10671:34;10651:18;;;10644:62;-1:-1:-1;;;10722:18:1;;;10715:36;10768:19;;5102:73:0::1;10391:402:1::0;5102:73:0::1;5186:28;5205:8;5186:18;:28::i;:::-;5021:201:::0;:::o;48165:160::-;48250:14;;-1:-1:-1;;;;;48250:14:0;48236:10;:28;48228:63;;;;-1:-1:-1;;;48228:63:0;;11000:2:1;48228:63:0;;;10982:21:1;11039:2;11019:18;;;11012:30;-1:-1:-1;;;11058:18:1;;;11051:52;11120:18;;48228:63:0;10798:346:1;48228:63:0;48302:15;48308:8;48302:5;:15::i;34253:174::-;34310:4;34353:7;26303:1;34334:26;;:53;;;;;34374:13;;34364:7;:23;34334:53;:85;;;;-1:-1:-1;;34392:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;34392:27:0;;;;34391:28;;34253:174::o;43832:196::-;43947:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;43947:29:0;-1:-1:-1;;;;;43947:29:0;;;;;;;;;43992:28;;43947:24;;43992:28;;;;;;;43832:196;;;:::o;38780:2130::-;38895:35;38933:21;38946:7;38933:12;:21::i;:::-;38895:59;;38993:4;-1:-1:-1;;;;;38971:26:0;:13;:18;;;-1:-1:-1;;;;;38971:26:0;;38967:67;;39006:28;;-1:-1:-1;;;39006:28:0;;;;;;;;;;;38967:67;39047:22;2916:10;-1:-1:-1;;;;;39073:20:0;;;;:73;;-1:-1:-1;39110:36:0;39127:4;2916:10;32901:164;:::i;39110:36::-;39073:126;;;-1:-1:-1;2916:10:0;39163:20;39175:7;39163:11;:20::i;:::-;-1:-1:-1;;;;;39163:36:0;;39073:126;39047:153;;39218:17;39213:66;;39244:35;;-1:-1:-1;;;39244:35:0;;;;;;;;;;;39213:66;-1:-1:-1;;;;;39294:16:0;;39290:52;;39319:23;;-1:-1:-1;;;39319:23:0;;;;;;;;;;;39290:52;39463:35;39480:1;39484:7;39493:4;39463:8;:35::i;:::-;-1:-1:-1;;;;;39794:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;39794:31:0;;;-1:-1:-1;;;;;39794:31:0;;;-1:-1:-1;;39794:31:0;;;;;;;39840:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;39840:29:0;;;;;;;;;;;39920:20;;;:11;:20;;;;;;39955:18;;-1:-1:-1;;;;;;39988:49:0;;;;-1:-1:-1;;;40021:15:0;39988:49;;;;;;;;;;40311:11;;40371:24;;;;;40414:13;;39920:20;;40371:24;;40414:13;40410:384;;40624:13;;40609:11;:28;40605:174;;40662:20;;40731:28;;;;-1:-1:-1;;;;;40705:54:0;-1:-1:-1;;;40705:54:0;-1:-1:-1;;;;;;40705:54:0;;;-1:-1:-1;;;;;40662:20:0;;40705:54;;;;40605:174;39769:1036;;;40841:7;40837:2;-1:-1:-1;;;;;40822:27:0;40831:4;-1:-1:-1;;;;;40822:27:0;-1:-1:-1;;;;;;;;;;;40822:27:0;;;;;;;;;40860:42;33629:369;29397:1109;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;29508:7:0;;26303:1;29557:23;;:47;;;;;29591:13;;29584:4;:20;29557:47;29553:886;;;29625:31;29659:17;;;:11;:17;;;;;;;;;29625:51;;;;;;;;;-1:-1:-1;;;;;29625:51:0;;;;-1:-1:-1;;;29625:51:0;;-1:-1:-1;;;;;29625:51:0;;;;;;;;-1:-1:-1;;;29625:51:0;;;;;;;;;;;;;;29695:729;;29745:14;;-1:-1:-1;;;;;29745:28:0;;29741:101;;29809:9;29397:1109;-1:-1:-1;;;29397:1109:0:o;29741:101::-;-1:-1:-1;;;30184:6:0;30229:17;;;;:11;:17;;;;;;;;;30217:29;;;;;;;;;-1:-1:-1;;;;;30217:29:0;;;;;-1:-1:-1;;;30217:29:0;;-1:-1:-1;;;;;30217:29:0;;;;;;;;-1:-1:-1;;;30217:29:0;;;;;;;;;;;;;30277:28;30273:109;;30345:9;29397:1109;-1:-1:-1;;;29397:1109:0:o;30273:109::-;30144:261;;;29606:833;29553:886;30467:31;;-1:-1:-1;;;30467:31:0;;;;;;;;;;;5382:191;5475:6;;;-1:-1:-1;;;;;5492:17:0;;;-1:-1:-1;;;;;;5492:17:0;;;;;;;5525:40;;5475:6;;;5492:17;5475:6;;5525:40;;5456:16;;5525:40;5445:128;5382:191;:::o;27999:442::-;28060:13;28113:15;28089:20;;;;:13;:20;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;28086:70;;-1:-1:-1;;28143:13:0;;;;;;;;;;;;-1:-1:-1;;;28143:13:0;;;;;27999:442::o;28086:70::-;28194:14;28170:20;;;;:13;:20;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;28167:68;;-1:-1:-1;;28223:12:0;;;;;;;;;;;;-1:-1:-1;;;28223:12:0;;;;;27999:442::o;28167:68::-;28273:16;28249:20;;;;:13;:20;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;28246:72;;-1:-1:-1;;28304:14:0;;;;;;;;;;;;-1:-1:-1;;;28304:14:0;;;;;27999:442::o;28246:72::-;28332:20;;;;28356:17;28332:20;;;;;;;;;;;:41;;;;;;;;:::i;:::-;;28329:74;;-1:-1:-1;;28388:15:0;;;;;;;;;;;;-1:-1:-1;;;28388:15:0;;;;;27999:442::o;28329:74::-;-1:-1:-1;;28424:9:0;;;;;;;;;-1:-1:-1;28424:9:0;;;27999:442::o;44520:667::-;44704:72;;-1:-1:-1;;;44704:72:0;;44683:4;;-1:-1:-1;;;;;44704:36:0;;;;;:72;;2916:10;;44755:4;;44761:7;;44770:5;;44704:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44704:72:0;;;;;;;;-1:-1:-1;;44704:72:0;;;;;;;;;;;;:::i;:::-;;;44700:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44938:6;:13;44955:1;44938:18;44934:235;;44984:40;;-1:-1:-1;;;44984:40:0;;;;;;;;;;;44934:235;45127:6;45121:13;45112:6;45108:2;45104:15;45097:38;44700:480;-1:-1:-1;;;;;;44823:55:0;-1:-1:-1;;;44823:55:0;;-1:-1:-1;44700:480:0;44520:667;;;;;;:::o;398:723::-;454:13;675:5;684:1;675:10;671:53;;-1:-1:-1;;702:10:0;;;;;;;;;;;;-1:-1:-1;;;702:10:0;;;;;398:723::o;671:53::-;749:5;734:12;790:78;797:9;;790:78;;823:8;;;;:::i;:::-;;-1:-1:-1;846:10:0;;-1:-1:-1;854:2:0;846:10;;:::i;:::-;;;790:78;;;878:19;910:6;-1:-1:-1;;;;;900:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;900:17:0;;878:39;;928:154;935:10;;928:154;;962:11;972:1;962:11;;:::i;:::-;;-1:-1:-1;1031:10:0;1039:2;1031:5;:10;:::i;:::-;1018:24;;:2;:24;:::i;:::-;1005:39;;988:6;995;988:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;988:56:0;;;;;;;;-1:-1:-1;1059:11:0;1068:2;1059:11;;:::i;:::-;;;928:154;;49069:104;49129:13;49158:9;49151:16;;;;;:::i;49179:374::-;49324:4;49339:19;49361:46;49376:7;49385;49394:12;;49361:14;:46::i;:::-;49339:68;;49416:28;49447:36;49471:11;49877:65;;13790:66:1;49877:65:0;;;13778:79:1;13873:12;;;13866:28;;;49845:7:0;;13910:12:1;;49877:65:0;;;;;;;;;;;;49867:76;;;;;;49860:83;;49768:181;;;;49447:36;49416:67;;49540:7;-1:-1:-1;;;;;49501:46:0;:35;49509:20;49531:4;49501:7;:35::i;:::-;-1:-1:-1;;;;;49501:46:0;;;49179:374;-1:-1:-1;;;;;;;;;49179:374:0:o;34511:149::-;34611:41;34621:2;34625:12;;34639:8;34611:41;;;;;;;;;;;;:9;:41::i;40988:89::-;41048:21;41054:7;41063:5;41048;:21::i;49559:203::-;49671:7;49724;49733;49742:12;;49707:48;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49697:59;;;;;;49690:66;;49559:203;;;;;;:::o;49955:216::-;50045:7;50063:9;50074;50085:7;50096:12;50103:4;50096:6;:12::i;:::-;50124:41;;;;;;;;;;;;14160:25:1;;;14233:4;14221:17;;14201:18;;;14194:45;;;;14255:18;;;14248:34;;;14298:18;;;14291:34;;;50062:46:0;;-1:-1:-1;50062:46:0;;-1:-1:-1;50062:46:0;-1:-1:-1;50124:41:0;;14132:19:1;;50124:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50124:41:0;;-1:-1:-1;;50124:41:0;;;49955:216;-1:-1:-1;;;;;;;49955:216:0:o;35034:1919::-;35197:20;35220:13;-1:-1:-1;;;;;35248:16:0;;35244:48;;35273:19;;-1:-1:-1;;;35273:19:0;;;;;;;;;;;35244:48;35307:8;35319:1;35307:13;35303:44;;35329:18;;-1:-1:-1;;;35329:18:0;;;;;;;;;;;35303:44;-1:-1:-1;;;;;35698:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;35757:49:0;;-1:-1:-1;;;;;35698:44:0;;;;;;;35757:49;;;;-1:-1:-1;;35698:44:0;;;;;;35757:49;;;;;;;;;;;;;;;;35823:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;35873:66:0;;;-1:-1:-1;;;35923:15:0;35873:66;;;;;;;;;;;;;35823:25;;36020:23;;;;35698:16;7108:19;:23;36097:724;;36137:314;36168:38;;36193:12;;-1:-1:-1;;;;;36168:38:0;;;36185:1;;-1:-1:-1;;;;;;;;;;;36168:38:0;36185:1;;36168:38;36234:69;36273:1;36277:2;36281:14;;;;;;36297:5;36234:30;:69::i;:::-;36229:174;;36339:40;;-1:-1:-1;;;36339:40:0;;;;;;;;;;;36229:174;36446:3;36430:12;:19;36137:314;;36532:12;36515:13;;:29;36511:43;;36546:8;;;36511:43;36097:724;;;36662:12;;36675;;;;;;36662:26;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;36651:38;;;;;;;;;;:::i;:::-;36621:27;;;;:13;:27;;;;;;;;:68;;:27;;-1:-1:-1;;36621:68:0;;;;;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;36717:40:0;;36742:14;;;;;-1:-1:-1;;;;;36717:40:0;;;36734:1;;-1:-1:-1;;;;;;;;;;;36717:40:0;36734:1;;36717:40;36801:3;36785:12;:19;36595:211;;36097:724;-1:-1:-1;;36835:13:0;:28;35186:1767;35034:1919;;;;;:::o;41306:2408::-;41386:35;41424:21;41437:7;41424:12;:21::i;:::-;41473:18;;41386:59;;-1:-1:-1;41504:290:0;;;;41538:22;2916:10;-1:-1:-1;;;;;41564:20:0;;;;:77;;-1:-1:-1;41605:36:0;41622:4;2916:10;32901:164;:::i;41605:36::-;41564:134;;;-1:-1:-1;2916:10:0;41662:20;41674:7;41662:11;:20::i;:::-;-1:-1:-1;;;;;41662:36:0;;41564:134;41538:161;;41721:17;41716:66;;41747:35;;-1:-1:-1;;;41747:35:0;;;;;;;;;;;41716:66;41523:271;41504:290;41922:35;41939:1;41943:7;41952:4;41922:8;:35::i;:::-;-1:-1:-1;;;;;42287:18:0;;;42253:31;42287:18;;;:12;:18;;;;;;;;42320:24;;-1:-1:-1;;;;;;;;;;42320:24:0;;;;;;;;;-1:-1:-1;;42320:24:0;;;;42359:29;;;;;42343:1;42359:29;;;;;;;;-1:-1:-1;;42359:29:0;;;;;;;;;;42521:20;;;:11;:20;;;;;;42556;;-1:-1:-1;;;;42624:15:0;42591:49;;;-1:-1:-1;;;42591:49:0;-1:-1:-1;;;;;;42591:49:0;;;;;;;;;;42655:22;-1:-1:-1;;;42655:22:0;;;42947:11;;;43007:24;;;;;43050:13;;42287:18;;43007:24;;43050:13;43046:384;;43260:13;;43245:11;:28;43241:174;;43298:20;;43367:28;;;;-1:-1:-1;;;;;43341:54:0;-1:-1:-1;;;43341:54:0;-1:-1:-1;;;;;;43341:54:0;;;-1:-1:-1;;;;;43298:20:0;;43341:54;;;;43241:174;-1:-1:-1;;43458:35:0;;43485:7;;-1:-1:-1;43481:1:0;;-1:-1:-1;;;;;;43458:35:0;;;-1:-1:-1;;;;;;;;;;;43458:35:0;43481:1;;43458:35;-1:-1:-1;;43681:12:0;:14;;;;;;-1:-1:-1;;41306:2408:0:o;50177:288::-;50235:9;50246;50257:7;50280:4;:11;50295:2;50280:17;50272:54;;;;-1:-1:-1;;;50272:54:0;;14725:2:1;50272:54:0;;;14707:21:1;14764:2;14744:18;;;14737:30;14803:26;14783:18;;;14776:54;14847:18;;50272:54:0;14523:348:1;50272:54:0;-1:-1:-1;;;50374:2:0;50364:13;;50358:20;50407:2;50397:13;;50391:20;50448:2;50438:13;;;50432:20;50358;;50429:1;50424:29;;;;;50177:288::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::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:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2355:127::-;2416:10;2411:3;2407:20;2404:1;2397:31;2447:4;2444:1;2437:15;2471:4;2468:1;2461:15;2487:342;2633:2;2618:18;;2666:1;2655:13;;2645:144;;2711:10;2706:3;2702:20;2699:1;2692:31;2746:4;2743:1;2736:15;2774:4;2771:1;2764:15;2645:144;2798:25;;;2487:342;:::o;2834:328::-;2911:6;2919;2927;2980:2;2968:9;2959:7;2955:23;2951:32;2948:52;;;2996:1;2993;2986:12;2948:52;3019:29;3038:9;3019:29;:::i;:::-;3009:39;;3067:38;3101:2;3090:9;3086:18;3067:38;:::i;:::-;3057:48;;3152:2;3141:9;3137:18;3124:32;3114:42;;2834:328;;;;;:::o;3167:186::-;3226:6;3279:2;3267:9;3258:7;3254:23;3250:32;3247:52;;;3295:1;3292;3285:12;3247:52;3318:29;3337:9;3318:29;:::i;3358:127::-;3419:10;3414:3;3410:20;3407:1;3400:31;3450:4;3447:1;3440:15;3474:4;3471:1;3464:15;3490:632;3555:5;-1:-1:-1;;;;;3626:2:1;3618:6;3615:14;3612:40;;;3632:18;;:::i;:::-;3707:2;3701:9;3675:2;3761:15;;-1:-1:-1;;3757:24:1;;;3783:2;3753:33;3749:42;3737:55;;;3807:18;;;3827:22;;;3804:46;3801:72;;;3853:18;;:::i;:::-;3893:10;3889:2;3882:22;3922:6;3913:15;;3952:6;3944;3937:22;3992:3;3983:6;3978:3;3974:16;3971:25;3968:45;;;4009:1;4006;3999:12;3968:45;4059:6;4054:3;4047:4;4039:6;4035:17;4022:44;4114:1;4107:4;4098:6;4090;4086:19;4082:30;4075:41;;;;3490:632;;;;;:::o;4127:451::-;4196:6;4249:2;4237:9;4228:7;4224:23;4220:32;4217:52;;;4265:1;4262;4255:12;4217:52;4305:9;4292:23;-1:-1:-1;;;;;4330:6:1;4327:30;4324:50;;;4370:1;4367;4360:12;4324:50;4393:22;;4446:4;4438:13;;4434:27;-1:-1:-1;4424:55:1;;4475:1;4472;4465:12;4424:55;4498:74;4564:7;4559:2;4546:16;4541:2;4537;4533:11;4498:74;:::i;4583:160::-;4648:20;;4704:13;;4697:21;4687:32;;4677:60;;4733:1;4730;4723:12;4748:254;4813:6;4821;4874:2;4862:9;4853:7;4849:23;4845:32;4842:52;;;4890:1;4887;4880:12;4842:52;4913:29;4932:9;4913:29;:::i;:::-;4903:39;;4961:35;4992:2;4981:9;4977:18;4961:35;:::i;:::-;4951:45;;4748:254;;;;;:::o;5007:221::-;5049:5;5102:3;5095:4;5087:6;5083:17;5079:27;5069:55;;5120:1;5117;5110:12;5069:55;5142:80;5218:3;5209:6;5196:20;5189:4;5181:6;5177:17;5142:80;:::i;5233:537::-;5328:6;5336;5344;5352;5405:3;5393:9;5384:7;5380:23;5376:33;5373:53;;;5422:1;5419;5412:12;5373:53;5445:29;5464:9;5445:29;:::i;:::-;5435:39;;5493:38;5527:2;5516:9;5512:18;5493:38;:::i;:::-;5483:48;;5578:2;5567:9;5563:18;5550:32;5540:42;;5633:2;5622:9;5618:18;5605:32;-1:-1:-1;;;;;5652:6:1;5649:30;5646:50;;;5692:1;5689;5682:12;5646:50;5715:49;5756:7;5747:6;5736:9;5732:22;5715:49;:::i;:::-;5705:59;;;5233:537;;;;;;;:::o;5775:180::-;5831:6;5884:2;5872:9;5863:7;5859:23;5855:32;5852:52;;;5900:1;5897;5890:12;5852:52;5923:26;5939:9;5923:26;:::i;5960:879::-;6071:6;6079;6087;6095;6148:2;6136:9;6127:7;6123:23;6119:32;6116:52;;;6164:1;6161;6154:12;6116:52;6200:9;6187:23;6177:33;;6261:2;6250:9;6246:18;6233:32;-1:-1:-1;;;;;6325:2:1;6317:6;6314:14;6311:34;;;6341:1;6338;6331:12;6311:34;6379:6;6368:9;6364:22;6354:32;;6424:7;6417:4;6413:2;6409:13;6405:27;6395:55;;6446:1;6443;6436:12;6395:55;6486:2;6473:16;6512:2;6504:6;6501:14;6498:34;;;6528:1;6525;6518:12;6498:34;6581:7;6576:2;6566:6;6563:1;6559:14;6555:2;6551:23;6547:32;6544:45;6541:65;;;6602:1;6599;6592:12;6541:65;6633:2;6629;6625:11;6615:21;;6655:6;6645:16;;;6714:2;6703:9;6699:18;6686:32;6670:48;;6743:2;6733:8;6730:16;6727:36;;;6759:1;6756;6749:12;6727:36;;6782:51;6825:7;6814:8;6803:9;6799:24;6782:51;:::i;6844:260::-;6912:6;6920;6973:2;6961:9;6952:7;6948:23;6944:32;6941:52;;;6989:1;6986;6979:12;6941:52;7012:29;7031:9;7012:29;:::i;:::-;7002:39;;7060:38;7094:2;7083:9;7079:18;7060:38;:::i;7109:380::-;7188:1;7184:12;;;;7231;;;7252:61;;7306:4;7298:6;7294:17;7284:27;;7252:61;7359:2;7351:6;7348:14;7328:18;7325:38;7322:161;;7405:10;7400:3;7396:20;7393:1;7386:31;7440:4;7437:1;7430:15;7468:4;7465:1;7458:15;7322:161;;7109:380;;;:::o;7494:356::-;7696:2;7678:21;;;7715:18;;;7708:30;7774:34;7769:2;7754:18;;7747:62;7841:2;7826:18;;7494:356::o;7855:470::-;8034:3;8072:6;8066:13;8088:53;8134:6;8129:3;8122:4;8114:6;8110:17;8088:53;:::i;:::-;8204:13;;8163:16;;;;8226:57;8204:13;8163:16;8260:4;8248:17;;8226:57;:::i;:::-;8299:20;;7855:470;-1:-1:-1;;;;7855:470:1:o;8679:127::-;8740:10;8735:3;8731:20;8728:1;8721:31;8771:4;8768:1;8761:15;8795:4;8792:1;8785:15;8811:128;8851:3;8882:1;8878:6;8875:1;8872:13;8869:39;;;8888:18;;:::i;:::-;-1:-1:-1;8924:9:1;;8811:128::o;11149:489::-;-1:-1:-1;;;;;11418:15:1;;;11400:34;;11470:15;;11465:2;11450:18;;11443:43;11517:2;11502:18;;11495:34;;;11565:3;11560:2;11545:18;;11538:31;;;11343:4;;11586:46;;11612:19;;11604:6;11586:46;:::i;:::-;11578:54;11149:489;-1:-1:-1;;;;;;11149:489:1:o;11643:249::-;11712:6;11765:2;11753:9;11744:7;11740:23;11736:32;11733:52;;;11781:1;11778;11771:12;11733:52;11813:9;11807:16;11832:30;11856:5;11832:30;:::i;11897:135::-;11936:3;11957:17;;;11954:43;;11977:18;;:::i;:::-;-1:-1:-1;12024:1:1;12013:13;;11897:135::o;12037:127::-;12098:10;12093:3;12089:20;12086:1;12079:31;12129:4;12126:1;12119:15;12153:4;12150:1;12143:15;12169:120;12209:1;12235;12225:35;;12240:18;;:::i;:::-;-1:-1:-1;12274:9:1;;12169:120::o;12294:125::-;12334:4;12362:1;12359;12356:8;12353:34;;;12367:18;;:::i;:::-;-1:-1:-1;12404:9:1;;12294:125::o;12424:112::-;12456:1;12482;12472:35;;12487:18;;:::i;:::-;-1:-1:-1;12521:9:1;;12424:112::o;12541:127::-;12602:10;12597:3;12593:20;12590:1;12583:31;12633:4;12630:1;12623:15;12657:4;12654:1;12647:15;12673:156;12739:20;;12799:4;12788:16;;12778:27;;12768:55;;12819:1;12816;12809:12;12834:709;13112:26;13108:31;13099:6;13095:2;13091:15;13087:53;13082:3;13075:66;13171:6;13166:2;13161:3;13157:12;13150:28;13057:3;13209:2;13204:3;13200:12;13258:6;13282:1;13292:224;13306:6;13303:1;13300:13;13292:224;;;13399:4;13373:24;13390:6;13373:24;:::i;:::-;13369:35;13355:50;;13428:4;13454:14;;;;13491:15;;;;;13328:1;13321:9;13292:224;;;-1:-1:-1;13532:5:1;;12834:709;-1:-1:-1;;;;;;;12834:709:1:o;14336:182::-;14393:6;14446:2;14434:9;14425:7;14421:23;14417:32;14414:52;;;14462:1;14459;14452:12;14414:52;14485:27;14502:9;14485:27;:::i

Swarm Source

ipfs://284b743efa3275cbccfab6444965ae3bbb57d25b78710fc7167c0b336fededc5
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.