ETH Price: $2,452.28 (+1.61%)
 

Overview

Max Total Supply

555 DG

Holders

145

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
geoorge.eth
Balance
1 DG
0x5f31df82d68bc9705eeb0febf3fe3b6359ba586d
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:
DisgustingGentleman

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: @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: erc721a/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;








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;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

    /**
     * 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, tokenId.toString())) : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be 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;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, 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,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @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,
        bytes memory _data,
        bool safe
    ) 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;

            if (safe && 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 {
                    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 This is 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: @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: contracts/DisgustingGentleman.sol


/*
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB######BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB###BBGGGPPPP5PPPGGBBB####BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB#BBPYJ7!~~~^^^^^^^~~~~!!7?J5PGB##BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB#BPY7~~~~~~~~~~!!!!!!!!!!!!!~~~~!?YPB#BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBGY7~~~~!!?JJJJJJJ??!!!!!!!!!7???????77YGBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB#BGBBY7!~!!!!!?BBBBBBBBBBJ!!!!!!7YBBBBBBBBG7!7JG#BBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBB#BBB#G7::??!!!!!!!777Y555YYYJJ?7!!!!!!7?JJYY55PPY7777?P#BBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBB#5~^7J^.^!???777777!!~~~~~~~~~~~!!!!!!!!~~~~~~!!!!!777775BBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBG~:^!!~7?7~^~!!777!!~~^^^^^^^^~~~!77!!7!~~~~~~~~~~~!!7777YBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBB#J^~!7~^7~::^:.:!777777?JY5PPPP5YJ???77777!7?J5PGGGPP5YJ?77P#BBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBJ~~~!~~77PGGPJ?PGGBB#&@@@@&&&&&@@&&#G55PGB#&@&&&&&&@@@&&#B#&#BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBB#Y~~~~~~?5555JYG&@@@@@@&##BBBBBBB##&@@@@@@@&#BBBBBBBB#&@@@@&B#BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBB#P~:::^!77??!^::~JY#@@@#BBBBBBBBBBBB#&@@&@@&BBBBBBBBBBBB&@@@5JBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBB#P^::::^~7!::^:^~??7Y@@@#BBBBBBBBBBBBB&@#P@@#BBBBBBBBBBB#&@@P7?GBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBB!::::^^~77~^^^7J?7775@@&#BBBBBBBBBB#&@&Y7G@&#BBBBBBBBB#&@&57??P#BBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBB#5~^^^^^~!?7777??777777YB@@&##BBBB##&@@BJ77?P&@&&#####&@@&GJ7???P#BBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBG?^^^^^~~7YYYJ?77777777777YG#@@@@@@@&#GJ777777?5B#&&&&&#B5J7?????P#BBBB###BBBBBBBBBBBBBBB
BBBBBBBBBBBB57~^::^~JB5Y?777777777777777?YY55YJ?7!!7777777777????77!77???77?GBBBBBPJJPBBBBBBBBBBBBBB
BBBBBBBBBBBB##BGP5JJYB5Y?77777????77!!!!!!!!!!!!!!!!!!!!!!!!!!!!!777???7777JBBBBBG!:.!BBBBBBBBBBBBBB
BBBBBBBBBBBBBBBB#####BPJJ?7777777777!!!!~~!!!!!7!7777!7777!77777777777!!!7?PBBBB#P!^:~GBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBYJJ?777!!!777777!!~77777?7777?7?YPGPY?7!7777?77777?YBBBBB#5!~^:?B####BBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBGYJJ?7777777??77!!~!~!!!7!!!!7!!!7JPB#PJ!7??77777?YBBBB##B?~~^:.^!?YPGBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBGYJJ?777777?????77!!!!!7!!!77!!!!!!7P&&GY?77777?YBBBBBPJJ!!~7~^:.  .:!PBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBG5JJ??7777777??J???777!!!!!!!!!77???5#&#P?77?JPBBBB#J.^!!!!77~^^:::::7BBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBPYJJ??77777777??JJJJJJJ????JJJJJJ?7Y##G5JJPBGPPPGG?~!~~!!77~^::^^^:~BBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBPYJJ???777777777?????????????????7JP55Y5PGPP5555P?~!~~~77~^^:^^^^7BBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBGPYJJ???????????????????????????J5GP555PGPPP55PP5YY??7^~~~~~~^^Y#BBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBGP5YJJ????????????????JJJYY5GBBBBGPPGGPPPPPPG###BG?^^:::::^?BBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBGGPP555555PPPPPGGGBBBB#BBBBBBGGGGPPPPPPBBBBBBGY?7!7?JPBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB##BBBBB#####BBBBBBBBBBBBBBBBBBBGGGPGBBBBBBBB##BBB###BBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
*/
pragma solidity ^0.8.4;




interface IFractionalGentleman {
    function mint(address to) external;
}

/// @title Disgusting Gentleman
/// @notice Controls minting of the Disgusting Gentleman NFT's
/// @dev Utilizes Azuki ERC721A standard to reduce gas for minting multiple tokens.
contract DisgustingGentleman is Ownable, ERC721A {
    using Strings for uint256;

    uint8 public constant MAX_CLUB_CARD_MINTS = 3;
    uint8 public constant MAX_MINTS_PER_REQUEST = 7;
    uint256 public constant TOTAL_SUPPLY = 7777;
    uint256 public constant MINT_FEE = 0.069 ether;

    uint256 public immutable devMintAmount;

    IERC721 public DGCC;
    IFractionalGentleman public FG;

    string public baseUri;
    string public PROVENANCE;

    bool public publicMintStarted;
    bool public whitelistMintStarted;

    /// @notice Tracks the number of uses a DGCC NFT has for DGCC whitelist minting.
    mapping(uint256 => uint8) DGCCRegister;

    constructor(
        address _DGCCAddress,
        address _FGAddress,
        uint256 _devMintAmount
    ) ERC721A("DisgustingGentleman", "DG") {
        devMintAmount = _devMintAmount;

        DGCC = IERC721(_DGCCAddress);
        FG = IFractionalGentleman(_FGAddress);
    }

    /// @notice Ensures that enough ether was paid for a mint to occur and that minting does not exceed the total supply
    modifier canMint(uint256 _quantity) {
        uint256 totalFee = MINT_FEE * _quantity;
        require(
            totalSupply() + _quantity <= TOTAL_SUPPLY,
            "You cannot mint more than the total supply!"
        );
        require(tx.origin == msg.sender, "The caller is another contract");
        require(msg.value >= totalFee, "not enough ether was given");

        _;
    }

    /// @notice Minting of the DG NFT for those wanting to be disgusting.
    /// @dev restricts the number of mints that can be made per transaction.
    /// @param _quantity the amount of DG's to bulk mint.
    function publicMint(uint256 _quantity) external payable canMint(_quantity) {
        require(publicMintStarted, "public mint has not started");
        require(
            _quantity <= MAX_MINTS_PER_REQUEST,
            "You cannot mint this many DG's in one request!"
        );

        _mint(msg.sender, _quantity, "", false);

        if (_quantity == MAX_MINTS_PER_REQUEST) {
            FG.mint(msg.sender);
        }
    }

    /// @notice Mints DG NFT using the DGCC NFT as a whitelist. (you're real disgusting if you can mint from here)
    /// @param _DGCCId the DGCC NFT id that is being used to whitelist mint.
    /// @param _quantity the number of DG's to mint.
    function whitelistMint(uint256 _DGCCId, uint8 _quantity)
        external
        payable
        canMint(_quantity)
    {
        require(whitelistMintStarted, "whitelist mint has not started");
        require(
            DGCC.ownerOf(_DGCCId) == msg.sender,
            "You do not own this DGCC"
        );

        uint8 _registered = DGCCRegister[_DGCCId];

        require(
            _registered + _quantity <= MAX_CLUB_CARD_MINTS,
            "You do not have enough mints left on this DGCC"
        );

        DGCCRegister[_DGCCId] = _registered + _quantity;
        _mint(msg.sender, _quantity, "", false);

        if (_quantity == MAX_CLUB_CARD_MINTS) {
            FG.mint(msg.sender);
        }
    }

    function numOfMintsLeftOnDGCC(uint256 _dgccId)
        external
        view
        returns (uint8)
    {
        return MAX_CLUB_CARD_MINTS - DGCCRegister[_dgccId];
    }

    function devMint() external onlyOwner {
        require(
            totalSupply() + devMintAmount <= TOTAL_SUPPLY,
            "You cannot mint more than the total supply!"
        );

        _mint(msg.sender, devMintAmount, "", false);
    }

    function withdraw() external onlyOwner {
        (bool os, ) = payable(owner()).call{value: address(this).balance}("");
        require(os);
    }

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

    function setBaseURI(string memory _baseUri) external onlyOwner {
        baseUri = _baseUri;
    }

    function setProvenance(string memory _provenance) public onlyOwner {
        PROVENANCE = _provenance;
    }

    function setPublicMintStarted(bool _publicMintStarted) external onlyOwner {
        publicMintStarted = _publicMintStarted;
    }

    function setWhitelistMintStarted(bool _whitelistMintStarted)
        external
        onlyOwner
    {
        whitelistMintStarted = _whitelistMintStarted;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_DGCCAddress","type":"address"},{"internalType":"address","name":"_FGAddress","type":"address"},{"internalType":"uint256","name":"_devMintAmount","type":"uint256"}],"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":[],"name":"DGCC","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FG","outputs":[{"internalType":"contract IFractionalGentleman","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_CLUB_CARD_MINTS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINTS_PER_REQUEST","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dgccId","type":"uint256"}],"name":"numOfMintsLeftOnDGCC","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMintStarted","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":"string","name":"_baseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenance","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_publicMintStarted","type":"bool"}],"name":"setPublicMintStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_whitelistMintStarted","type":"bool"}],"name":"setWhitelistMintStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_DGCCId","type":"uint256"},{"internalType":"uint8","name":"_quantity","type":"uint8"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040523480156200001157600080fd5b50604051620024fb380380620024fb83398101604081905262000034916200021e565b6040518060400160405280601381526020017f44697367757374696e6747656e746c656d616e0000000000000000000000000081525060405180604001604052806002815260200161444760f01b8152506200009f620000996200010760201b60201c565b6200010b565b8151620000b49060039060208501906200015b565b508051620000ca9060049060208401906200015b565b5060006001555050608052600980546001600160a01b039384166001600160a01b031991821617909155600a80549290931691161790556200029b565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805462000169906200025e565b90600052602060002090601f0160209004810192826200018d5760008555620001d8565b82601f10620001a857805160ff1916838001178555620001d8565b82800160010185558215620001d8579182015b82811115620001d8578251825591602001919060010190620001bb565b50620001e6929150620001ea565b5090565b5b80821115620001e65760008155600101620001eb565b80516001600160a01b03811681146200021957600080fd5b919050565b60008060006060848603121562000233578283fd5b6200023e8462000201565b92506200024e6020850162000201565b9150604084015190509250925092565b600181811c908216806200027357607f821691505b602082108114156200029557634e487b7160e01b600052602260045260246000fd5b50919050565b608051612236620002c5600039600081816105f70152818161108501526110df01526122366000f3fe6080604052600436106102195760003560e01c806370a0823111610123578063b88d4fde116100ab578063e07dcd141161006f578063e07dcd14146105e5578063e985e9c514610619578063ec68844c14610662578063f2fde38b14610677578063ffe630b51461069757600080fd5b8063b88d4fde1461054a578063bb866a591461056a578063c0e37e061461058a578063c87b56dd146105aa578063d7bf81a3146105ca57600080fd5b80638da5cb5b116100f25780638da5cb5b146104cc578063902d55a5146104ea57806395d89b41146105005780639abc832014610515578063a22cb4651461052a57600080fd5b806370a0823114610462578063715018a614610482578063759a6c27146104975780637c69e207146104b757600080fd5b806321494de3116101a657806342842e0e1161017557806342842e0e146103cd57806355f804b3146103ed5780635f771eee1461040d5780636352211e1461042d5780636373a6b11461044d57600080fd5b806321494de31461037257806323b872dd146103855780632db11544146103a55780633ccfd60b146103b857600080fd5b8063081812fc116101ed578063081812fc146102b6578063095ea7b3146102ee5780631266375f1461031057806318160ddd146103305780631cfddb1f1461035357600080fd5b806217cf2e1461021e57806301ffc9a71461024a578063035240051461027a57806306fdde0314610294575b600080fd5b34801561022a57600080fd5b50610233600381565b60405160ff90911681526020015b60405180910390f35b34801561025657600080fd5b5061026a610265366004611e69565b6106b7565b6040519015158152602001610241565b34801561028657600080fd5b50600d5461026a9060ff1681565b3480156102a057600080fd5b506102a9610709565b6040516102419190611fc0565b3480156102c257600080fd5b506102d66102d1366004611ee7565b61079b565b6040516001600160a01b039091168152602001610241565b3480156102fa57600080fd5b5061030e610309366004611e24565b6107df565b005b34801561031c57600080fd5b5061030e61032b366004611e4f565b61086d565b34801561033c57600080fd5b50600254600154035b604051908152602001610241565b34801561035f57600080fd5b50600d5461026a90610100900460ff1681565b61030e610380366004611eff565b6108ba565b34801561039157600080fd5b5061030e6103a0366004611d33565b610c0e565b61030e6103b3366004611ee7565b610c19565b3480156103c457600080fd5b5061030e610e48565b3480156103d957600080fd5b5061030e6103e8366004611d33565b610ed5565b3480156103f957600080fd5b5061030e610408366004611ea1565b610ef0565b34801561041957600080fd5b506009546102d6906001600160a01b031681565b34801561043957600080fd5b506102d6610448366004611ee7565b610f31565b34801561045957600080fd5b506102a9610f43565b34801561046e57600080fd5b5061034561047d366004611cc3565b610fd1565b34801561048e57600080fd5b5061030e611020565b3480156104a357600080fd5b50600a546102d6906001600160a01b031681565b3480156104c357600080fd5b5061030e611056565b3480156104d857600080fd5b506000546001600160a01b03166102d6565b3480156104f657600080fd5b50610345611e6181565b34801561050c57600080fd5b506102a9611115565b34801561052157600080fd5b506102a9611124565b34801561053657600080fd5b5061030e610545366004611df0565b611131565b34801561055657600080fd5b5061030e610565366004611d73565b6111c7565b34801561057657600080fd5b5061030e610585366004611e4f565b611218565b34801561059657600080fd5b506102336105a5366004611ee7565b611255565b3480156105b657600080fd5b506102a96105c5366004611ee7565b611272565b3480156105d657600080fd5b5061034566f523226980800081565b3480156105f157600080fd5b506103457f000000000000000000000000000000000000000000000000000000000000000081565b34801561062557600080fd5b5061026a610634366004611cfb565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561066e57600080fd5b50610233600781565b34801561068357600080fd5b5061030e610692366004611cc3565b6112f7565b3480156106a357600080fd5b5061030e6106b2366004611ea1565b61138f565b60006001600160e01b031982166380ac58cd60e01b14806106e857506001600160e01b03198216635b5e139f60e01b145b8061070357506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461071890612129565b80601f016020809104026020016040519081016040528092919081815260200182805461074490612129565b80156107915780601f1061076657610100808354040283529160200191610791565b820191906000526020600020905b81548152906001019060200180831161077457829003601f168201915b5050505050905090565b60006107a6826113cc565b6107c3576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b60006107ea82610f31565b9050806001600160a01b0316836001600160a01b0316141561081f5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061083f575061083d8133610634565b155b1561085d576040516367d9dca160e11b815260040160405180910390fd5b6108688383836113f8565b505050565b6000546001600160a01b031633146108a05760405162461bcd60e51b81526004016108979061201e565b60405180910390fd5b600d80549115156101000261ff0019909216919091179055565b60ff811660006108d18266f52322698080006120a4565b9050611e61826108e46002546001540390565b6108ee9190612053565b111561090c5760405162461bcd60e51b815260040161089790611fd3565b32331461095b5760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610897565b803410156109ab5760405162461bcd60e51b815260206004820152601a60248201527f6e6f7420656e6f7567682065746865722077617320676976656e0000000000006044820152606401610897565b600d54610100900460ff16610a025760405162461bcd60e51b815260206004820152601e60248201527f77686974656c697374206d696e7420686173206e6f74207374617274656400006044820152606401610897565b6009546040516331a9108f60e11b81526004810186905233916001600160a01b031690636352211e9060240160206040518083038186803b158015610a4657600080fd5b505afa158015610a5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7e9190611cdf565b6001600160a01b031614610ad45760405162461bcd60e51b815260206004820152601860248201527f596f7520646f206e6f74206f776e2074686973204447434300000000000000006044820152606401610897565b6000848152600e602052604090205460ff166003610af2858361206b565b60ff161115610b5a5760405162461bcd60e51b815260206004820152602e60248201527f596f7520646f206e6f74206861766520656e6f756768206d696e7473206c656660448201526d74206f6e2074686973204447434360901b6064820152608401610897565b610b64848261206b565b6000868152600e60209081526040808320805460ff191660ff95861617905580519182019052818152610b9d9233929088169190611454565b60ff841660031415610c0757600a546040516335313c2160e11b81523360048201526001600160a01b0390911690636a62784290602401600060405180830381600087803b158015610bee57600080fd5b505af1158015610c02573d6000803e3d6000fd5b505050505b5050505050565b610868838383611625565b806000610c2d8266f52322698080006120a4565b9050611e6182610c406002546001540390565b610c4a9190612053565b1115610c685760405162461bcd60e51b815260040161089790611fd3565b323314610cb75760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610897565b80341015610d075760405162461bcd60e51b815260206004820152601a60248201527f6e6f7420656e6f7567682065746865722077617320676976656e0000000000006044820152606401610897565b600d5460ff16610d595760405162461bcd60e51b815260206004820152601b60248201527f7075626c6963206d696e7420686173206e6f74207374617274656400000000006044820152606401610897565b6007831115610dc15760405162461bcd60e51b815260206004820152602e60248201527f596f752063616e6e6f74206d696e742074686973206d616e792044472773206960448201526d6e206f6e6520726571756573742160901b6064820152608401610897565b610ddd3384604051806020016040528060008152506000611454565b600783141561086857600a546040516335313c2160e11b81523360048201526001600160a01b0390911690636a62784290602401600060405180830381600087803b158015610e2b57600080fd5b505af1158015610e3f573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b03163314610e725760405162461bcd60e51b81526004016108979061201e565b600080546040516001600160a01b039091169047908381818185875af1925050503d8060008114610ebf576040519150601f19603f3d011682016040523d82523d6000602084013e610ec4565b606091505b5050905080610ed257600080fd5b50565b610868838383604051806020016040528060008152506111c7565b6000546001600160a01b03163314610f1a5760405162461bcd60e51b81526004016108979061201e565b8051610f2d90600b906020840190611b9f565b5050565b6000610f3c82611812565b5192915050565b600c8054610f5090612129565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7c90612129565b8015610fc95780601f10610f9e57610100808354040283529160200191610fc9565b820191906000526020600020905b815481529060010190602001808311610fac57829003601f168201915b505050505081565b60006001600160a01b038216610ffa576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b6000546001600160a01b0316331461104a5760405162461bcd60e51b81526004016108979061201e565b611054600061192e565b565b6000546001600160a01b031633146110805760405162461bcd60e51b81526004016108979061201e565b611e617f00000000000000000000000000000000000000000000000000000000000000006110b16002546001540390565b6110bb9190612053565b11156110d95760405162461bcd60e51b815260040161089790611fd3565b611054337f0000000000000000000000000000000000000000000000000000000000000000604051806020016040528060008152506000611454565b60606004805461071890612129565b600b8054610f5090612129565b6001600160a01b03821633141561115b5760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6111d2848484611625565b6001600160a01b0383163b151580156111f457506111f28484848461197e565b155b15611212576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6000546001600160a01b031633146112425760405162461bcd60e51b81526004016108979061201e565b600d805460ff1916911515919091179055565b6000818152600e60205260408120546107039060ff1660036120da565b606061127d826113cc565b61129a57604051630a14c4b560e41b815260040160405180910390fd5b60006112a4611a76565b90508051600014156112c557604051806020016040528060008152506112f0565b806112cf84611a85565b6040516020016112e0929190611f54565b6040516020818303038152906040525b9392505050565b6000546001600160a01b031633146113215760405162461bcd60e51b81526004016108979061201e565b6001600160a01b0381166113865760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610897565b610ed28161192e565b6000546001600160a01b031633146113b95760405162461bcd60e51b81526004016108979061201e565b8051610f2d90600c906020840190611b9f565b600060015482108015610703575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6001546001600160a01b03851661147d57604051622e076360e81b815260040160405180910390fd5b8361149b5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600590925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561154d57506001600160a01b0387163b15155b156115d6575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461159e600088848060010195508861197e565b6115bb576040516368d2bf6b60e11b815260040160405180910390fd5b808214156115535782600154146115d157600080fd5b61161c565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808214156115d7575b50600155610c07565b600061163082611812565b9050836001600160a01b031681600001516001600160a01b0316146116675760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061168557506116858533610634565b806116a05750336116958461079b565b6001600160a01b0316145b9050806116c057604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0384166116e757604051633a954ecd60e21b815260040160405180910390fd5b6116f3600084876113f8565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166117c95760015482146117c9578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610c07565b60408051606081018252600080825260208201819052918101919091528160015481101561191557600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161515918101829052906119135780516001600160a01b0316156118a9579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff161515928101929092521561190e579392505050565b6118a9565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906119b3903390899088908890600401611f83565b602060405180830381600087803b1580156119cd57600080fd5b505af19250505080156119fd575060408051601f3d908101601f191682019092526119fa91810190611e85565b60015b611a58573d808015611a2b576040519150601f19603f3d011682016040523d82523d6000602084013e611a30565b606091505b508051611a50576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600b805461071890612129565b606081611aa95750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ad35780611abd81612164565b9150611acc9050600a83612090565b9150611aad565b60008167ffffffffffffffff811115611afc57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611b26576020820181803683370190505b5090505b8415611a6e57611b3b6001836120c3565b9150611b48600a8661217f565b611b53906030612053565b60f81b818381518110611b7657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611b98600a86612090565b9450611b2a565b828054611bab90612129565b90600052602060002090601f016020900481019282611bcd5760008555611c13565b82601f10611be657805160ff1916838001178555611c13565b82800160010185558215611c13579182015b82811115611c13578251825591602001919060010190611bf8565b50611c1f929150611c23565b5090565b5b80821115611c1f5760008155600101611c24565b600067ffffffffffffffff80841115611c5357611c536121bf565b604051601f8501601f19908116603f01168101908282118183101715611c7b57611c7b6121bf565b81604052809350858152868686011115611c9457600080fd5b858560208301376000602087830101525050509392505050565b80358015158114611cbe57600080fd5b919050565b600060208284031215611cd4578081fd5b81356112f0816121d5565b600060208284031215611cf0578081fd5b81516112f0816121d5565b60008060408385031215611d0d578081fd5b8235611d18816121d5565b91506020830135611d28816121d5565b809150509250929050565b600080600060608486031215611d47578081fd5b8335611d52816121d5565b92506020840135611d62816121d5565b929592945050506040919091013590565b60008060008060808587031215611d88578081fd5b8435611d93816121d5565b93506020850135611da3816121d5565b925060408501359150606085013567ffffffffffffffff811115611dc5578182fd5b8501601f81018713611dd5578182fd5b611de487823560208401611c38565b91505092959194509250565b60008060408385031215611e02578182fd5b8235611e0d816121d5565b9150611e1b60208401611cae565b90509250929050565b60008060408385031215611e36578182fd5b8235611e41816121d5565b946020939093013593505050565b600060208284031215611e60578081fd5b6112f082611cae565b600060208284031215611e7a578081fd5b81356112f0816121ea565b600060208284031215611e96578081fd5b81516112f0816121ea565b600060208284031215611eb2578081fd5b813567ffffffffffffffff811115611ec8578182fd5b8201601f81018413611ed8578182fd5b611a6e84823560208401611c38565b600060208284031215611ef8578081fd5b5035919050565b60008060408385031215611f11578182fd5b82359150602083013560ff81168114611d28578182fd5b60008151808452611f408160208601602086016120fd565b601f01601f19169290920160200192915050565b60008351611f668184602088016120fd565b835190830190611f7a8183602088016120fd565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611fb690830184611f28565b9695505050505050565b6020815260006112f06020830184611f28565b6020808252602b908201527f596f752063616e6e6f74206d696e74206d6f7265207468616e2074686520746f60408201526a74616c20737570706c792160a81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000821982111561206657612066612193565b500190565b600060ff821660ff84168060ff0382111561208857612088612193565b019392505050565b60008261209f5761209f6121a9565b500490565b60008160001904831182151516156120be576120be612193565b500290565b6000828210156120d5576120d5612193565b500390565b600060ff821660ff8416808210156120f4576120f4612193565b90039392505050565b60005b83811015612118578181015183820152602001612100565b838111156112125750506000910152565b600181811c9082168061213d57607f821691505b6020821081141561215e57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561217857612178612193565b5060010190565b60008261218e5761218e6121a9565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610ed257600080fd5b6001600160e01b031981168114610ed257600080fdfea26469706673582212206eba2c8f7ff5c15aa5ce923dc54a93f6d05268f414b0d749b3e9396e9fc4931664736f6c634300080400330000000000000000000000007efa8b4c1d67c00bf570fb9c06a8a47f85d1a321000000000000000000000000e6a95f68ac155270922354474b3eded6bb3030310000000000000000000000000000000000000000000000000000000000000064

Deployed Bytecode

0x6080604052600436106102195760003560e01c806370a0823111610123578063b88d4fde116100ab578063e07dcd141161006f578063e07dcd14146105e5578063e985e9c514610619578063ec68844c14610662578063f2fde38b14610677578063ffe630b51461069757600080fd5b8063b88d4fde1461054a578063bb866a591461056a578063c0e37e061461058a578063c87b56dd146105aa578063d7bf81a3146105ca57600080fd5b80638da5cb5b116100f25780638da5cb5b146104cc578063902d55a5146104ea57806395d89b41146105005780639abc832014610515578063a22cb4651461052a57600080fd5b806370a0823114610462578063715018a614610482578063759a6c27146104975780637c69e207146104b757600080fd5b806321494de3116101a657806342842e0e1161017557806342842e0e146103cd57806355f804b3146103ed5780635f771eee1461040d5780636352211e1461042d5780636373a6b11461044d57600080fd5b806321494de31461037257806323b872dd146103855780632db11544146103a55780633ccfd60b146103b857600080fd5b8063081812fc116101ed578063081812fc146102b6578063095ea7b3146102ee5780631266375f1461031057806318160ddd146103305780631cfddb1f1461035357600080fd5b806217cf2e1461021e57806301ffc9a71461024a578063035240051461027a57806306fdde0314610294575b600080fd5b34801561022a57600080fd5b50610233600381565b60405160ff90911681526020015b60405180910390f35b34801561025657600080fd5b5061026a610265366004611e69565b6106b7565b6040519015158152602001610241565b34801561028657600080fd5b50600d5461026a9060ff1681565b3480156102a057600080fd5b506102a9610709565b6040516102419190611fc0565b3480156102c257600080fd5b506102d66102d1366004611ee7565b61079b565b6040516001600160a01b039091168152602001610241565b3480156102fa57600080fd5b5061030e610309366004611e24565b6107df565b005b34801561031c57600080fd5b5061030e61032b366004611e4f565b61086d565b34801561033c57600080fd5b50600254600154035b604051908152602001610241565b34801561035f57600080fd5b50600d5461026a90610100900460ff1681565b61030e610380366004611eff565b6108ba565b34801561039157600080fd5b5061030e6103a0366004611d33565b610c0e565b61030e6103b3366004611ee7565b610c19565b3480156103c457600080fd5b5061030e610e48565b3480156103d957600080fd5b5061030e6103e8366004611d33565b610ed5565b3480156103f957600080fd5b5061030e610408366004611ea1565b610ef0565b34801561041957600080fd5b506009546102d6906001600160a01b031681565b34801561043957600080fd5b506102d6610448366004611ee7565b610f31565b34801561045957600080fd5b506102a9610f43565b34801561046e57600080fd5b5061034561047d366004611cc3565b610fd1565b34801561048e57600080fd5b5061030e611020565b3480156104a357600080fd5b50600a546102d6906001600160a01b031681565b3480156104c357600080fd5b5061030e611056565b3480156104d857600080fd5b506000546001600160a01b03166102d6565b3480156104f657600080fd5b50610345611e6181565b34801561050c57600080fd5b506102a9611115565b34801561052157600080fd5b506102a9611124565b34801561053657600080fd5b5061030e610545366004611df0565b611131565b34801561055657600080fd5b5061030e610565366004611d73565b6111c7565b34801561057657600080fd5b5061030e610585366004611e4f565b611218565b34801561059657600080fd5b506102336105a5366004611ee7565b611255565b3480156105b657600080fd5b506102a96105c5366004611ee7565b611272565b3480156105d657600080fd5b5061034566f523226980800081565b3480156105f157600080fd5b506103457f000000000000000000000000000000000000000000000000000000000000006481565b34801561062557600080fd5b5061026a610634366004611cfb565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561066e57600080fd5b50610233600781565b34801561068357600080fd5b5061030e610692366004611cc3565b6112f7565b3480156106a357600080fd5b5061030e6106b2366004611ea1565b61138f565b60006001600160e01b031982166380ac58cd60e01b14806106e857506001600160e01b03198216635b5e139f60e01b145b8061070357506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461071890612129565b80601f016020809104026020016040519081016040528092919081815260200182805461074490612129565b80156107915780601f1061076657610100808354040283529160200191610791565b820191906000526020600020905b81548152906001019060200180831161077457829003601f168201915b5050505050905090565b60006107a6826113cc565b6107c3576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b60006107ea82610f31565b9050806001600160a01b0316836001600160a01b0316141561081f5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061083f575061083d8133610634565b155b1561085d576040516367d9dca160e11b815260040160405180910390fd5b6108688383836113f8565b505050565b6000546001600160a01b031633146108a05760405162461bcd60e51b81526004016108979061201e565b60405180910390fd5b600d80549115156101000261ff0019909216919091179055565b60ff811660006108d18266f52322698080006120a4565b9050611e61826108e46002546001540390565b6108ee9190612053565b111561090c5760405162461bcd60e51b815260040161089790611fd3565b32331461095b5760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610897565b803410156109ab5760405162461bcd60e51b815260206004820152601a60248201527f6e6f7420656e6f7567682065746865722077617320676976656e0000000000006044820152606401610897565b600d54610100900460ff16610a025760405162461bcd60e51b815260206004820152601e60248201527f77686974656c697374206d696e7420686173206e6f74207374617274656400006044820152606401610897565b6009546040516331a9108f60e11b81526004810186905233916001600160a01b031690636352211e9060240160206040518083038186803b158015610a4657600080fd5b505afa158015610a5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7e9190611cdf565b6001600160a01b031614610ad45760405162461bcd60e51b815260206004820152601860248201527f596f7520646f206e6f74206f776e2074686973204447434300000000000000006044820152606401610897565b6000848152600e602052604090205460ff166003610af2858361206b565b60ff161115610b5a5760405162461bcd60e51b815260206004820152602e60248201527f596f7520646f206e6f74206861766520656e6f756768206d696e7473206c656660448201526d74206f6e2074686973204447434360901b6064820152608401610897565b610b64848261206b565b6000868152600e60209081526040808320805460ff191660ff95861617905580519182019052818152610b9d9233929088169190611454565b60ff841660031415610c0757600a546040516335313c2160e11b81523360048201526001600160a01b0390911690636a62784290602401600060405180830381600087803b158015610bee57600080fd5b505af1158015610c02573d6000803e3d6000fd5b505050505b5050505050565b610868838383611625565b806000610c2d8266f52322698080006120a4565b9050611e6182610c406002546001540390565b610c4a9190612053565b1115610c685760405162461bcd60e51b815260040161089790611fd3565b323314610cb75760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610897565b80341015610d075760405162461bcd60e51b815260206004820152601a60248201527f6e6f7420656e6f7567682065746865722077617320676976656e0000000000006044820152606401610897565b600d5460ff16610d595760405162461bcd60e51b815260206004820152601b60248201527f7075626c6963206d696e7420686173206e6f74207374617274656400000000006044820152606401610897565b6007831115610dc15760405162461bcd60e51b815260206004820152602e60248201527f596f752063616e6e6f74206d696e742074686973206d616e792044472773206960448201526d6e206f6e6520726571756573742160901b6064820152608401610897565b610ddd3384604051806020016040528060008152506000611454565b600783141561086857600a546040516335313c2160e11b81523360048201526001600160a01b0390911690636a62784290602401600060405180830381600087803b158015610e2b57600080fd5b505af1158015610e3f573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b03163314610e725760405162461bcd60e51b81526004016108979061201e565b600080546040516001600160a01b039091169047908381818185875af1925050503d8060008114610ebf576040519150601f19603f3d011682016040523d82523d6000602084013e610ec4565b606091505b5050905080610ed257600080fd5b50565b610868838383604051806020016040528060008152506111c7565b6000546001600160a01b03163314610f1a5760405162461bcd60e51b81526004016108979061201e565b8051610f2d90600b906020840190611b9f565b5050565b6000610f3c82611812565b5192915050565b600c8054610f5090612129565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7c90612129565b8015610fc95780601f10610f9e57610100808354040283529160200191610fc9565b820191906000526020600020905b815481529060010190602001808311610fac57829003601f168201915b505050505081565b60006001600160a01b038216610ffa576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b6000546001600160a01b0316331461104a5760405162461bcd60e51b81526004016108979061201e565b611054600061192e565b565b6000546001600160a01b031633146110805760405162461bcd60e51b81526004016108979061201e565b611e617f00000000000000000000000000000000000000000000000000000000000000646110b16002546001540390565b6110bb9190612053565b11156110d95760405162461bcd60e51b815260040161089790611fd3565b611054337f0000000000000000000000000000000000000000000000000000000000000064604051806020016040528060008152506000611454565b60606004805461071890612129565b600b8054610f5090612129565b6001600160a01b03821633141561115b5760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6111d2848484611625565b6001600160a01b0383163b151580156111f457506111f28484848461197e565b155b15611212576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6000546001600160a01b031633146112425760405162461bcd60e51b81526004016108979061201e565b600d805460ff1916911515919091179055565b6000818152600e60205260408120546107039060ff1660036120da565b606061127d826113cc565b61129a57604051630a14c4b560e41b815260040160405180910390fd5b60006112a4611a76565b90508051600014156112c557604051806020016040528060008152506112f0565b806112cf84611a85565b6040516020016112e0929190611f54565b6040516020818303038152906040525b9392505050565b6000546001600160a01b031633146113215760405162461bcd60e51b81526004016108979061201e565b6001600160a01b0381166113865760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610897565b610ed28161192e565b6000546001600160a01b031633146113b95760405162461bcd60e51b81526004016108979061201e565b8051610f2d90600c906020840190611b9f565b600060015482108015610703575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6001546001600160a01b03851661147d57604051622e076360e81b815260040160405180910390fd5b8361149b5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600590925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561154d57506001600160a01b0387163b15155b156115d6575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461159e600088848060010195508861197e565b6115bb576040516368d2bf6b60e11b815260040160405180910390fd5b808214156115535782600154146115d157600080fd5b61161c565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808214156115d7575b50600155610c07565b600061163082611812565b9050836001600160a01b031681600001516001600160a01b0316146116675760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061168557506116858533610634565b806116a05750336116958461079b565b6001600160a01b0316145b9050806116c057604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0384166116e757604051633a954ecd60e21b815260040160405180910390fd5b6116f3600084876113f8565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166117c95760015482146117c9578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610c07565b60408051606081018252600080825260208201819052918101919091528160015481101561191557600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161515918101829052906119135780516001600160a01b0316156118a9579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff161515928101929092521561190e579392505050565b6118a9565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906119b3903390899088908890600401611f83565b602060405180830381600087803b1580156119cd57600080fd5b505af19250505080156119fd575060408051601f3d908101601f191682019092526119fa91810190611e85565b60015b611a58573d808015611a2b576040519150601f19603f3d011682016040523d82523d6000602084013e611a30565b606091505b508051611a50576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600b805461071890612129565b606081611aa95750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ad35780611abd81612164565b9150611acc9050600a83612090565b9150611aad565b60008167ffffffffffffffff811115611afc57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611b26576020820181803683370190505b5090505b8415611a6e57611b3b6001836120c3565b9150611b48600a8661217f565b611b53906030612053565b60f81b818381518110611b7657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611b98600a86612090565b9450611b2a565b828054611bab90612129565b90600052602060002090601f016020900481019282611bcd5760008555611c13565b82601f10611be657805160ff1916838001178555611c13565b82800160010185558215611c13579182015b82811115611c13578251825591602001919060010190611bf8565b50611c1f929150611c23565b5090565b5b80821115611c1f5760008155600101611c24565b600067ffffffffffffffff80841115611c5357611c536121bf565b604051601f8501601f19908116603f01168101908282118183101715611c7b57611c7b6121bf565b81604052809350858152868686011115611c9457600080fd5b858560208301376000602087830101525050509392505050565b80358015158114611cbe57600080fd5b919050565b600060208284031215611cd4578081fd5b81356112f0816121d5565b600060208284031215611cf0578081fd5b81516112f0816121d5565b60008060408385031215611d0d578081fd5b8235611d18816121d5565b91506020830135611d28816121d5565b809150509250929050565b600080600060608486031215611d47578081fd5b8335611d52816121d5565b92506020840135611d62816121d5565b929592945050506040919091013590565b60008060008060808587031215611d88578081fd5b8435611d93816121d5565b93506020850135611da3816121d5565b925060408501359150606085013567ffffffffffffffff811115611dc5578182fd5b8501601f81018713611dd5578182fd5b611de487823560208401611c38565b91505092959194509250565b60008060408385031215611e02578182fd5b8235611e0d816121d5565b9150611e1b60208401611cae565b90509250929050565b60008060408385031215611e36578182fd5b8235611e41816121d5565b946020939093013593505050565b600060208284031215611e60578081fd5b6112f082611cae565b600060208284031215611e7a578081fd5b81356112f0816121ea565b600060208284031215611e96578081fd5b81516112f0816121ea565b600060208284031215611eb2578081fd5b813567ffffffffffffffff811115611ec8578182fd5b8201601f81018413611ed8578182fd5b611a6e84823560208401611c38565b600060208284031215611ef8578081fd5b5035919050565b60008060408385031215611f11578182fd5b82359150602083013560ff81168114611d28578182fd5b60008151808452611f408160208601602086016120fd565b601f01601f19169290920160200192915050565b60008351611f668184602088016120fd565b835190830190611f7a8183602088016120fd565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611fb690830184611f28565b9695505050505050565b6020815260006112f06020830184611f28565b6020808252602b908201527f596f752063616e6e6f74206d696e74206d6f7265207468616e2074686520746f60408201526a74616c20737570706c792160a81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000821982111561206657612066612193565b500190565b600060ff821660ff84168060ff0382111561208857612088612193565b019392505050565b60008261209f5761209f6121a9565b500490565b60008160001904831182151516156120be576120be612193565b500290565b6000828210156120d5576120d5612193565b500390565b600060ff821660ff8416808210156120f4576120f4612193565b90039392505050565b60005b83811015612118578181015183820152602001612100565b838111156112125750506000910152565b600181811c9082168061213d57607f821691505b6020821081141561215e57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561217857612178612193565b5060010190565b60008261218e5761218e6121a9565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610ed257600080fd5b6001600160e01b031981168114610ed257600080fdfea26469706673582212206eba2c8f7ff5c15aa5ce923dc54a93f6d05268f414b0d749b3e9396e9fc4931664736f6c63430008040033

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

0000000000000000000000007efa8b4c1d67c00bf570fb9c06a8a47f85d1a321000000000000000000000000e6a95f68ac155270922354474b3eded6bb3030310000000000000000000000000000000000000000000000000000000000000064

-----Decoded View---------------
Arg [0] : _DGCCAddress (address): 0x7efA8b4c1D67C00bf570fB9C06a8a47F85d1A321
Arg [1] : _FGAddress (address): 0xE6A95F68AC155270922354474b3edeD6BB303031
Arg [2] : _devMintAmount (uint256): 100

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000007efa8b4c1d67c00bf570fb9c06a8a47f85d1a321
Arg [1] : 000000000000000000000000e6a95f68ac155270922354474b3eded6bb303031
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000064


Deployed Bytecode Sourcemap

48855:4414:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48945:45;;;;;;;;;;;;48989:1;48945:45;;;;;12137:4:1;12125:17;;;12107:36;;12095:2;12080:18;48945:45:0;;;;;;;;24442:305;;;;;;;;;;-1:-1:-1;24442:305:0;;;;;:::i;:::-;;:::i;:::-;;;7280:14:1;;7273:22;7255:41;;7243:2;7228:18;24442:305:0;7210:92:1;49329:29:0;;;;;;;;;;-1:-1:-1;49329:29:0;;;;;;;;27555:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29058:204::-;;;;;;;;;;-1:-1:-1;29058:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6578:32:1;;;6560:51;;6548:2;6533:18;29058:204:0;6515:102:1;28621:371:0;;;;;;;;;;-1:-1:-1;28621:371:0;;;;;:::i;:::-;;:::i;:::-;;53100:166;;;;;;;;;;-1:-1:-1;53100:166:0;;;;;:::i;:::-;;:::i;23691:303::-;;;;;;;;;;-1:-1:-1;23945:12:0;;23929:13;;:28;23691:303;;;11929:25:1;;;11917:2;11902:18;23691:303:0;11884:76:1;49365:32:0;;;;;;;;;;-1:-1:-1;49365:32:0;;;;;;;;;;;51275:742;;;;;;:::i;:::-;;:::i;29923:170::-;;;;;;;;;;-1:-1:-1;29923:170:0;;;;;:::i;:::-;;:::i;50577:442::-;;;;;;:::i;:::-;;:::i;52470:149::-;;;;;;;;;;;;;:::i;30164:185::-;;;;;;;;;;-1:-1:-1;30164:185:0;;;;;:::i;:::-;;:::i;52735:100::-;;;;;;;;;;-1:-1:-1;52735:100:0;;;;;:::i;:::-;;:::i;49203:19::-;;;;;;;;;;-1:-1:-1;49203:19:0;;;;-1:-1:-1;;;;;49203:19:0;;;27363:125;;;;;;;;;;-1:-1:-1;27363:125:0;;;;;:::i;:::-;;:::i;49296:24::-;;;;;;;;;;;;;:::i;24811:206::-;;;;;;;;;;-1:-1:-1;24811:206:0;;;;;:::i;:::-;;:::i;43913:103::-;;;;;;;;;;;;;:::i;49229:30::-;;;;;;;;;;-1:-1:-1;49229:30:0;;;;-1:-1:-1;;;;;49229:30:0;;;52211:251;;;;;;;;;;;;;:::i;43262:87::-;;;;;;;;;;-1:-1:-1;43308:7:0;43335:6;-1:-1:-1;;;;;43335:6:0;43262:87;;49051:43;;;;;;;;;;;;49090:4;49051:43;;27724:104;;;;;;;;;;;;;:::i;49268:21::-;;;;;;;;;;;;;:::i;29334:287::-;;;;;;;;;;-1:-1:-1;29334:287:0;;;;;:::i;:::-;;:::i;30420:369::-;;;;;;;;;;-1:-1:-1;30420:369:0;;;;;:::i;:::-;;:::i;52961:131::-;;;;;;;;;;-1:-1:-1;52961:131:0;;;;;:::i;:::-;;:::i;52025:178::-;;;;;;;;;;-1:-1:-1;52025:178:0;;;;;:::i;:::-;;:::i;27899:318::-;;;;;;;;;;-1:-1:-1;27899:318:0;;;;;:::i;:::-;;:::i;49101:46::-;;;;;;;;;;;;49136:11;49101:46;;49156:38;;;;;;;;;;;;;;;29692:164;;;;;;;;;;-1:-1:-1;29692:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;29813:25:0;;;29789:4;29813:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29692:164;48997:47;;;;;;;;;;;;49043:1;48997:47;;44171:201;;;;;;;;;;-1:-1:-1;44171:201:0;;;;;:::i;:::-;;:::i;52843:110::-;;;;;;;;;;-1:-1:-1;52843:110:0;;;;;:::i;:::-;;:::i;24442:305::-;24544:4;-1:-1:-1;;;;;;24581:40:0;;-1:-1:-1;;;24581:40:0;;:105;;-1:-1:-1;;;;;;;24638:48:0;;-1:-1:-1;;;24638:48:0;24581:105;:158;;;-1:-1:-1;;;;;;;;;;13549:40:0;;;24703:36;24561:178;24442:305;-1:-1:-1;;24442:305:0:o;27555:100::-;27609:13;27642:5;27635:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27555:100;:::o;29058:204::-;29126:7;29151:16;29159:7;29151;:16::i;:::-;29146:64;;29176:34;;-1:-1:-1;;;29176:34:0;;;;;;;;;;;29146:64;-1:-1:-1;29230:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29230:24:0;;29058:204::o;28621:371::-;28694:13;28710:24;28726:7;28710:15;:24::i;:::-;28694:40;;28755:5;-1:-1:-1;;;;;28749:11:0;:2;-1:-1:-1;;;;;28749:11:0;;28745:48;;;28769:24;;-1:-1:-1;;;28769:24:0;;;;;;;;;;;28745:48;20038:10;-1:-1:-1;;;;;28810:21:0;;;;;;:63;;-1:-1:-1;28836:37:0;28853:5;20038:10;29692:164;:::i;28836:37::-;28835:38;28810:63;28806:138;;;28897:35;;-1:-1:-1;;;28897:35:0;;;;;;;;;;;28806:138;28956:28;28965:2;28969:7;28978:5;28956:8;:28::i;:::-;28621:371;;;:::o;53100:166::-;43308:7;43335:6;-1:-1:-1;;;;;43335:6:0;20038:10;43482:23;43474:68;;;;-1:-1:-1;;;43474:68:0;;;;;;;:::i;:::-;;;;;;;;;53214:20:::1;:44:::0;;;::::1;;;;-1:-1:-1::0;;53214:44:0;;::::1;::::0;;;::::1;::::0;;53100:166::o;51275:742::-;49956:401;;;50003:16;50022:20;49956:401;49136:11;50022:20;:::i;:::-;50003:39;;49090:4;50091:9;50075:13;23945:12;;23929:13;;:28;;23691:303;50075:13;:25;;;;:::i;:::-;:41;;50053:134;;;;-1:-1:-1;;;50053:134:0;;;;;;;:::i;:::-;50206:9;50219:10;50206:23;50198:66;;;;-1:-1:-1;;;50198:66:0;;9367:2:1;50198:66:0;;;9349:21:1;9406:2;9386:18;;;9379:30;9445:32;9425:18;;;9418:60;9495:18;;50198:66:0;9339:180:1;50198:66:0;50296:8;50283:9;:21;;50275:60;;;;-1:-1:-1;;;50275:60:0;;9012:2:1;50275:60:0;;;8994:21:1;9051:2;9031:18;;;9024:30;9090:28;9070:18;;;9063:56;9136:18;;50275:60:0;8984:176:1;50275:60:0;51419:20:::1;::::0;::::1;::::0;::::1;;;51411:63;;;::::0;-1:-1:-1;;;51411:63:0;;11273:2:1;51411:63:0::1;::::0;::::1;11255:21:1::0;11312:2;11292:18;;;11285:30;11351:32;11331:18;;;11324:60;11401:18;;51411:63:0::1;11245:180:1::0;51411:63:0::1;51507:4;::::0;:21:::1;::::0;-1:-1:-1;;;51507:21:0;;::::1;::::0;::::1;11929:25:1::0;;;51532:10:0::1;::::0;-1:-1:-1;;;;;51507:4:0::1;::::0;:12:::1;::::0;11902:18:1;;51507:21:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51507:35:0::1;;51485:109;;;::::0;-1:-1:-1;;;51485:109:0;;11632:2:1;51485:109:0::1;::::0;::::1;11614:21:1::0;11671:2;11651:18;;;11644:30;11710:26;11690:18;;;11683:54;11754:18;;51485:109:0::1;11604:174:1::0;51485:109:0::1;51607:17;51627:21:::0;;;:12:::1;:21;::::0;;;;;::::1;;48989:1;51683:23;51697:9:::0;51627:21;51683:23:::1;:::i;:::-;:46;;;;51661:142;;;::::0;-1:-1:-1;;;51661:142:0;;10087:2:1;51661:142:0::1;::::0;::::1;10069:21:1::0;10126:2;10106:18;;;10099:30;10165:34;10145:18;;;10138:62;-1:-1:-1;;;10216:18:1;;;10209:44;10270:19;;51661:142:0::1;10059:236:1::0;51661:142:0::1;51840:23;51854:9:::0;51840:11;:23:::1;:::i;:::-;51816:21;::::0;;;:12:::1;:21;::::0;;;;;;;:47;;-1:-1:-1;;51816:47:0::1;;::::0;;::::1;;::::0;;51874:39;;;;::::1;::::0;;;;;::::1;::::0;51880:10:::1;::::0;51874:39;;::::1;::::0;;:5:::1;:39::i;:::-;51930:32;::::0;::::1;48989:1;51930:32;51926:84;;;51979:2;::::0;:19:::1;::::0;-1:-1:-1;;;51979:19:0;;51987:10:::1;51979:19;::::0;::::1;6560:51:1::0;-1:-1:-1;;;;;51979:2:0;;::::1;::::0;:7:::1;::::0;6533:18:1;;51979:19:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51926:84;50348:1;51275:742:::0;;;;:::o;29923:170::-;30057:28;30067:4;30073:2;30077:7;30057:9;:28::i;50577:442::-;50641:9;50003:16;50022:20;50641:9;49136:11;50022:20;:::i;:::-;50003:39;;49090:4;50091:9;50075:13;23945:12;;23929:13;;:28;;23691:303;50075:13;:25;;;;:::i;:::-;:41;;50053:134;;;;-1:-1:-1;;;50053:134:0;;;;;;;:::i;:::-;50206:9;50219:10;50206:23;50198:66;;;;-1:-1:-1;;;50198:66:0;;9367:2:1;50198:66:0;;;9349:21:1;9406:2;9386:18;;;9379:30;9445:32;9425:18;;;9418:60;9495:18;;50198:66:0;9339:180:1;50198:66:0;50296:8;50283:9;:21;;50275:60;;;;-1:-1:-1;;;50275:60:0;;9012:2:1;50275:60:0;;;8994:21:1;9051:2;9031:18;;;9024:30;9090:28;9070:18;;;9063:56;9136:18;;50275:60:0;8984:176:1;50275:60:0;50671:17:::1;::::0;::::1;;50663:57;;;::::0;-1:-1:-1;;;50663:57:0;;10502:2:1;50663:57:0::1;::::0;::::1;10484:21:1::0;10541:2;10521:18;;;10514:30;10580:29;10560:18;;;10553:57;10627:18;;50663:57:0::1;10474:177:1::0;50663:57:0::1;49043:1;50753:34:::0;::::1;;50731:130;;;::::0;-1:-1:-1;;;50731:130:0;;10858:2:1;50731:130:0::1;::::0;::::1;10840:21:1::0;10897:2;10877:18;;;10870:30;10936:34;10916:18;;;10909:62;-1:-1:-1;;;10987:18:1;;;10980:44;11041:19;;50731:130:0::1;10830:236:1::0;50731:130:0::1;50874:39;50880:10;50892:9;50874:39;;;;;;;;;;;::::0;50907:5:::1;50874;:39::i;:::-;49043:1;50930:34:::0;::::1;50926:86;;;50981:2;::::0;:19:::1;::::0;-1:-1:-1;;;50981:19:0;;50989:10:::1;50981:19;::::0;::::1;6560:51:1::0;-1:-1:-1;;;;;50981:2:0;;::::1;::::0;:7:::1;::::0;6533:18:1;;50981:19:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;50577:442:::0;;;:::o;52470:149::-;43308:7;43335:6;-1:-1:-1;;;;;43335:6:0;20038:10;43482:23;43474:68;;;;-1:-1:-1;;;43474:68:0;;;;;;;:::i;:::-;52521:7:::1;43335:6:::0;;52534:55:::1;::::0;-1:-1:-1;;;;;43335:6:0;;;;52563:21:::1;::::0;52521:7;52534:55;52521:7;52534:55;52563:21;43335:6;52534:55:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52520:69;;;52608:2;52600:11;;;::::0;::::1;;43553:1;52470:149::o:0;30164:185::-;30302:39;30319:4;30325:2;30329:7;30302:39;;;;;;;;;;;;:16;:39::i;52735:100::-;43308:7;43335:6;-1:-1:-1;;;;;43335:6:0;20038:10;43482:23;43474:68;;;;-1:-1:-1;;;43474:68:0;;;;;;;:::i;:::-;52809:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;52735:100:::0;:::o;27363:125::-;27427:7;27454:21;27467:7;27454:12;:21::i;:::-;:26;;27363:125;-1:-1:-1;;27363:125:0:o;49296:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24811:206::-;24875:7;-1:-1:-1;;;;;24899:19:0;;24895:60;;24927:28;;-1:-1:-1;;;24927:28:0;;;;;;;;;;;24895:60;-1:-1:-1;;;;;;24981:19:0;;;;;:12;:19;;;;;:27;;;;24811:206::o;43913:103::-;43308:7;43335:6;-1:-1:-1;;;;;43335:6:0;20038:10;43482:23;43474:68;;;;-1:-1:-1;;;43474:68:0;;;;;;;:::i;:::-;43978:30:::1;44005:1;43978:18;:30::i;:::-;43913:103::o:0;52211:251::-;43308:7;43335:6;-1:-1:-1;;;;;43335:6:0;20038:10;43482:23;43474:68;;;;-1:-1:-1;;;43474:68:0;;;;;;;:::i;:::-;49090:4:::1;52298:13;52282;23945:12:::0;;23929:13;;:28;;23691:303;52282:13:::1;:29;;;;:::i;:::-;:45;;52260:138;;;;-1:-1:-1::0;;;52260:138:0::1;;;;;;;:::i;:::-;52411:43;52417:10;52429:13;52411:43;;;;;;;;;;;::::0;52448:5:::1;52411;:43::i;27724:104::-:0;27780:13;27813:7;27806:14;;;;;:::i;49268:21::-;;;;;;;:::i;29334:287::-;-1:-1:-1;;;;;29433:24:0;;20038:10;29433:24;29429:54;;;29466:17;;-1:-1:-1;;;29466:17:0;;;;;;;;;;;29429:54;20038:10;29496:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;29496:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;29496:53:0;;;;;;;;;;29565:48;;7255:41:1;;;29496:42:0;;20038:10;29565:48;;7228:18:1;29565:48:0;;;;;;;29334:287;;:::o;30420:369::-;30587:28;30597:4;30603:2;30607:7;30587:9;:28::i;:::-;-1:-1:-1;;;;;30630:13:0;;3652:19;:23;;30630:76;;;;;30650:56;30681:4;30687:2;30691:7;30700:5;30650:30;:56::i;:::-;30649:57;30630:76;30626:156;;;30730:40;;-1:-1:-1;;;30730:40:0;;;;;;;;;;;30626:156;30420:369;;;;:::o;52961:131::-;43308:7;43335:6;-1:-1:-1;;;;;43335:6:0;20038:10;43482:23;43474:68;;;;-1:-1:-1;;;43474:68:0;;;;;;;:::i;:::-;53046:17:::1;:38:::0;;-1:-1:-1;;53046:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;52961:131::o;52025:178::-;52122:5;52174:21;;;:12;:21;;;;;;52152:43;;52174:21;;48989:1;52152:43;:::i;27899:318::-;27972:13;28003:16;28011:7;28003;:16::i;:::-;27998:59;;28028:29;;-1:-1:-1;;;28028:29:0;;;;;;;;;;;27998:59;28070:21;28094:10;:8;:10::i;:::-;28070:34;;28128:7;28122:21;28147:1;28122:26;;:87;;;;;;;;;;;;;;;;;28175:7;28184:18;:7;:16;:18::i;:::-;28158:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28122:87;28115:94;27899:318;-1:-1:-1;;;27899:318:0:o;44171:201::-;43308:7;43335:6;-1:-1:-1;;;;;43335:6:0;20038:10;43482:23;43474:68;;;;-1:-1:-1;;;43474:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44260:22:0;::::1;44252:73;;;::::0;-1:-1:-1;;;44252:73:0;;8193:2:1;44252:73:0::1;::::0;::::1;8175:21:1::0;8232:2;8212:18;;;8205:30;8271:34;8251:18;;;8244:62;-1:-1:-1;;;8322:18:1;;;8315:36;8368:19;;44252:73:0::1;8165:228:1::0;44252:73:0::1;44336:28;44355:8;44336:18;:28::i;52843:110::-:0;43308:7;43335:6;-1:-1:-1;;;;;43335:6:0;20038:10;43482:23;43474:68;;;;-1:-1:-1;;;43474:68:0;;;;;;;:::i;:::-;52921:24;;::::1;::::0;:10:::1;::::0;:24:::1;::::0;::::1;::::0;::::1;:::i;31044:187::-:0;31101:4;31165:13;;31155:7;:23;31125:98;;;;-1:-1:-1;;31196:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;31196:27:0;;;;31195:28;;31044:187::o;39214:196::-;39329:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;39329:29:0;-1:-1:-1;;;;;39329:29:0;;;;;;;;;39374:28;;39329:24;;39374:28;;;;;;;39214:196;;;:::o;32128:1775::-;32290:13;;-1:-1:-1;;;;;32318:16:0;;32314:48;;32343:19;;-1:-1:-1;;;32343:19:0;;;;;;;;;;;32314:48;32377:13;32373:44;;32399:18;;-1:-1:-1;;;32399:18:0;;;;;;;;;;;32373:44;-1:-1:-1;;;;;32768:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;32827:49:0;;32768:44;;;;;;;;32827:49;;;;-1:-1:-1;;32768:44:0;;;;;;32827:49;;;;;;;;;;;;;;;;32893:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;32943:66:0;;;;-1:-1:-1;;;32993:15:0;32943:66;;;;;;;;;;32893:25;33090:23;;;33134:4;:23;;;;-1:-1:-1;;;;;;33142:13:0;;3652:19;:23;;33142:15;33130:641;;;33178:314;33209:38;;33234:12;;-1:-1:-1;;;;;33209:38:0;;;33226:1;;33209:38;;33226:1;;33209:38;33275:69;33314:1;33318:2;33322:14;;;;;;33338:5;33275:30;:69::i;:::-;33270:174;;33380:40;;-1:-1:-1;;;33380:40:0;;;;;;;;;;;33270:174;33487:3;33471:12;:19;;33178:314;;33573:12;33556:13;;:29;33552:43;;33587:8;;;33552:43;33130:641;;;33636:120;33667:40;;33692:14;;;;;-1:-1:-1;;;;;33667:40:0;;;33684:1;;33667:40;;33684:1;;33667:40;33751:3;33735:12;:19;;33636:120;;33130:641;-1:-1:-1;33785:13:0;:28;33835:60;30420:369;34157:2130;34272:35;34310:21;34323:7;34310:12;:21::i;:::-;34272:59;;34370:4;-1:-1:-1;;;;;34348:26:0;:13;:18;;;-1:-1:-1;;;;;34348:26:0;;34344:67;;34383:28;;-1:-1:-1;;;34383:28:0;;;;;;;;;;;34344:67;34424:22;20038:10;-1:-1:-1;;;;;34450:20:0;;;;:73;;-1:-1:-1;34487:36:0;34504:4;20038:10;29692:164;:::i;34487:36::-;34450:126;;;-1:-1:-1;20038:10:0;34540:20;34552:7;34540:11;:20::i;:::-;-1:-1:-1;;;;;34540:36:0;;34450:126;34424:153;;34595:17;34590:66;;34621:35;;-1:-1:-1;;;34621:35:0;;;;;;;;;;;34590:66;-1:-1:-1;;;;;34671:16:0;;34667:52;;34696:23;;-1:-1:-1;;;34696:23:0;;;;;;;;;;;34667:52;34840:35;34857:1;34861:7;34870:4;34840:8;:35::i;:::-;-1:-1:-1;;;;;35171:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;35171:31:0;;;;;;;-1:-1:-1;;35171:31:0;;;;;;;35217:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;35217:29:0;;;;;;;;;;;35297:20;;;:11;:20;;;;;;35332:18;;-1:-1:-1;;;;;;35365:49:0;;;;-1:-1:-1;;;35398:15:0;35365:49;;;;;;;;;;35688:11;;35748:24;;;;;35791:13;;35297:20;;35748:24;;35791:13;35787:384;;36001:13;;35986:11;:28;35982:174;;36039:20;;36108:28;;;;36082:54;;-1:-1:-1;;;36082:54:0;-1:-1:-1;;;;;;36082:54:0;;;-1:-1:-1;;;;;36039:20:0;;36082:54;;;;35982:174;34157:2130;;;36218:7;36214:2;-1:-1:-1;;;;;36199:27:0;36208:4;-1:-1:-1;;;;;36199:27:0;;;;;;;;;;;36237:42;30420:369;26192:1109;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;26303:7:0;26386:13;;26379:4;:20;26348:886;;;26420:31;26454:17;;;:11;:17;;;;;;;;;26420:51;;;;;;;;;-1:-1:-1;;;;;26420:51:0;;;;-1:-1:-1;;;26420:51:0;;;;;;;;;;;-1:-1:-1;;;26420:51:0;;;;;;;;;;;;;;26490:729;;26540:14;;-1:-1:-1;;;;;26540:28:0;;26536:101;;26604:9;26192:1109;-1:-1:-1;;;26192:1109:0:o;26536:101::-;-1:-1:-1;;;26979:6:0;27024:17;;;;:11;:17;;;;;;;;;27012:29;;;;;;;;;-1:-1:-1;;;;;27012:29:0;;;;;-1:-1:-1;;;27012:29:0;;;;;;;;;;;-1:-1:-1;;;27012:29:0;;;;;;;;;;;;;27072:28;27068:109;;27140:9;26192:1109;-1:-1:-1;;;26192:1109:0:o;27068:109::-;26939:261;;;26348:886;;27262:31;;-1:-1:-1;;;27262:31:0;;;;;;;;;;;44532:191;44606:16;44625:6;;-1:-1:-1;;;;;44642:17:0;;;-1:-1:-1;;;;;;44642:17:0;;;;;;44675:40;;44625:6;;;;;;;44675:40;;44606:16;44675:40;44532:191;;:::o;39902:667::-;40086:72;;-1:-1:-1;;;40086:72:0;;40065:4;;-1:-1:-1;;;;;40086:36:0;;;;;:72;;20038:10;;40137:4;;40143:7;;40152:5;;40086:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40086:72:0;;;;;;;;-1:-1:-1;;40086:72:0;;;;;;;;;;;;:::i;:::-;;;40082:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40320:13:0;;40316:235;;40366:40;;-1:-1:-1;;;40366:40:0;;;;;;;;;;;40316:235;40509:6;40503:13;40494:6;40490:2;40486:15;40479:38;40082:480;-1:-1:-1;;;;;;40205:55:0;-1:-1:-1;;;40205:55:0;;-1:-1:-1;40082:480:0;39902:667;;;;;;:::o;52627:100::-;52679:13;52712:7;52705:14;;;;;:::i;365:723::-;421:13;642:10;638:53;;-1:-1:-1;;669:10:0;;;;;;;;;;;;-1:-1:-1;;;669:10:0;;;;;365:723::o;638:53::-;716:5;701:12;757:78;764:9;;757:78;;790:8;;;;:::i;:::-;;-1:-1:-1;813:10:0;;-1:-1:-1;821:2:0;813:10;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;-1:-1:-1;;;867:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;867:17:0;;845:39;;895:154;902:10;;895:154;;929:11;939:1;929:11;;:::i;:::-;;-1:-1:-1;998:10:0;1006:2;998:5;:10;:::i;:::-;985:24;;:2;:24;:::i;:::-;972:39;;955:6;962;955:14;;;;;;-1:-1:-1;;;955:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;955:56:0;;;;;;;;-1:-1:-1;1026:11:0;1035:2;1026:11;;:::i;:::-;;;895:154;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:160::-;715:20;;771:13;;764:21;754:32;;744:2;;800:1;797;790:12;744:2;696:114;;;:::o;815:257::-;874:6;927:2;915:9;906:7;902:23;898:32;895:2;;;948:6;940;933:22;895:2;992:9;979:23;1011:31;1036:5;1011:31;:::i;1077:261::-;1147:6;1200:2;1188:9;1179:7;1175:23;1171:32;1168:2;;;1221:6;1213;1206:22;1168:2;1258:9;1252:16;1277:31;1302:5;1277:31;:::i;1343:398::-;1411:6;1419;1472:2;1460:9;1451:7;1447:23;1443:32;1440:2;;;1493:6;1485;1478:22;1440:2;1537:9;1524:23;1556:31;1581:5;1556:31;:::i;:::-;1606:5;-1:-1:-1;1663:2:1;1648:18;;1635:32;1676:33;1635:32;1676:33;:::i;:::-;1728:7;1718:17;;;1430:311;;;;;:::o;1746:466::-;1823:6;1831;1839;1892:2;1880:9;1871:7;1867:23;1863:32;1860:2;;;1913:6;1905;1898:22;1860:2;1957:9;1944:23;1976:31;2001:5;1976:31;:::i;:::-;2026:5;-1:-1:-1;2083:2:1;2068:18;;2055:32;2096:33;2055:32;2096:33;:::i;:::-;1850:362;;2148:7;;-1:-1:-1;;;2202:2:1;2187:18;;;;2174:32;;1850:362::o;2217:824::-;2312:6;2320;2328;2336;2389:3;2377:9;2368:7;2364:23;2360:33;2357:2;;;2411:6;2403;2396:22;2357:2;2455:9;2442:23;2474:31;2499:5;2474:31;:::i;:::-;2524:5;-1:-1:-1;2581:2:1;2566:18;;2553:32;2594:33;2553:32;2594:33;:::i;:::-;2646:7;-1:-1:-1;2700:2:1;2685:18;;2672:32;;-1:-1:-1;2755:2:1;2740:18;;2727:32;2782:18;2771:30;;2768:2;;;2819:6;2811;2804:22;2768:2;2847:22;;2900:4;2892:13;;2888:27;-1:-1:-1;2878:2:1;;2934:6;2926;2919:22;2878:2;2962:73;3027:7;3022:2;3009:16;3004:2;3000;2996:11;2962:73;:::i;:::-;2952:83;;;2347:694;;;;;;;:::o;3046:325::-;3111:6;3119;3172:2;3160:9;3151:7;3147:23;3143:32;3140:2;;;3193:6;3185;3178:22;3140:2;3237:9;3224:23;3256:31;3281:5;3256:31;:::i;:::-;3306:5;-1:-1:-1;3330:35:1;3361:2;3346:18;;3330:35;:::i;:::-;3320:45;;3130:241;;;;;:::o;3376:325::-;3444:6;3452;3505:2;3493:9;3484:7;3480:23;3476:32;3473:2;;;3526:6;3518;3511:22;3473:2;3570:9;3557:23;3589:31;3614:5;3589:31;:::i;:::-;3639:5;3691:2;3676:18;;;;3663:32;;-1:-1:-1;;;3463:238:1:o;3706:190::-;3762:6;3815:2;3803:9;3794:7;3790:23;3786:32;3783:2;;;3836:6;3828;3821:22;3783:2;3864:26;3880:9;3864:26;:::i;3901:255::-;3959:6;4012:2;4000:9;3991:7;3987:23;3983:32;3980:2;;;4033:6;4025;4018:22;3980:2;4077:9;4064:23;4096:30;4120:5;4096:30;:::i;4161:259::-;4230:6;4283:2;4271:9;4262:7;4258:23;4254:32;4251:2;;;4304:6;4296;4289:22;4251:2;4341:9;4335:16;4360:30;4384:5;4360:30;:::i;4425:480::-;4494:6;4547:2;4535:9;4526:7;4522:23;4518:32;4515:2;;;4568:6;4560;4553:22;4515:2;4613:9;4600:23;4646:18;4638:6;4635:30;4632:2;;;4683:6;4675;4668:22;4632:2;4711:22;;4764:4;4756:13;;4752:27;-1:-1:-1;4742:2:1;;4798:6;4790;4783:22;4742:2;4826:73;4891:7;4886:2;4873:16;4868:2;4864;4860:11;4826:73;:::i;4910:190::-;4969:6;5022:2;5010:9;5001:7;4997:23;4993:32;4990:2;;;5043:6;5035;5028:22;4990:2;-1:-1:-1;5071:23:1;;4980:120;-1:-1:-1;4980:120:1:o;5105:357::-;5171:6;5179;5232:2;5220:9;5211:7;5207:23;5203:32;5200:2;;;5253:6;5245;5238:22;5200:2;5294:9;5281:23;5271:33;;5354:2;5343:9;5339:18;5326:32;5398:4;5391:5;5387:16;5380:5;5377:27;5367:2;;5423:6;5415;5408:22;5467:257;5508:3;5546:5;5540:12;5573:6;5568:3;5561:19;5589:63;5645:6;5638:4;5633:3;5629:14;5622:4;5615:5;5611:16;5589:63;:::i;:::-;5706:2;5685:15;-1:-1:-1;;5681:29:1;5672:39;;;;5713:4;5668:50;;5516:208;-1:-1:-1;;5516:208:1:o;5729:470::-;5908:3;5946:6;5940:13;5962:53;6008:6;6003:3;5996:4;5988:6;5984:17;5962:53;:::i;:::-;6078:13;;6037:16;;;;6100:57;6078:13;6037:16;6134:4;6122:17;;6100:57;:::i;:::-;6173:20;;5916:283;-1:-1:-1;;;;5916:283:1:o;6622:488::-;-1:-1:-1;;;;;6891:15:1;;;6873:34;;6943:15;;6938:2;6923:18;;6916:43;6990:2;6975:18;;6968:34;;;7038:3;7033:2;7018:18;;7011:31;;;6816:4;;7059:45;;7084:19;;7076:6;7059:45;:::i;:::-;7051:53;6825:285;-1:-1:-1;;;;;;6825:285:1:o;7767:219::-;7916:2;7905:9;7898:21;7879:4;7936:44;7976:2;7965:9;7961:18;7953:6;7936:44;:::i;8398:407::-;8600:2;8582:21;;;8639:2;8619:18;;;8612:30;8678:34;8673:2;8658:18;;8651:62;-1:-1:-1;;;8744:2:1;8729:18;;8722:41;8795:3;8780:19;;8572:233::o;9524:356::-;9726:2;9708:21;;;9745:18;;;9738:30;9804:34;9799:2;9784:18;;9777:62;9871:2;9856:18;;9698:182::o;12154:128::-;12194:3;12225:1;12221:6;12218:1;12215:13;12212:2;;;12231:18;;:::i;:::-;-1:-1:-1;12267:9:1;;12202:80::o;12287:204::-;12325:3;12361:4;12358:1;12354:12;12393:4;12390:1;12386:12;12428:3;12422:4;12418:14;12413:3;12410:23;12407:2;;;12436:18;;:::i;:::-;12472:13;;12333:158;-1:-1:-1;;;12333:158:1:o;12496:120::-;12536:1;12562;12552:2;;12567:18;;:::i;:::-;-1:-1:-1;12601:9:1;;12542:74::o;12621:168::-;12661:7;12727:1;12723;12719:6;12715:14;12712:1;12709:21;12704:1;12697:9;12690:17;12686:45;12683:2;;;12734:18;;:::i;:::-;-1:-1:-1;12774:9:1;;12673:116::o;12794:125::-;12834:4;12862:1;12859;12856:8;12853:2;;;12867:18;;:::i;:::-;-1:-1:-1;12904:9:1;;12843:76::o;12924:195::-;12962:4;12999;12996:1;12992:12;13031:4;13028:1;13024:12;13056:3;13051;13048:12;13045:2;;;13063:18;;:::i;:::-;13100:13;;;12971:148;-1:-1:-1;;;12971:148:1:o;13124:258::-;13196:1;13206:113;13220:6;13217:1;13214:13;13206:113;;;13296:11;;;13290:18;13277:11;;;13270:39;13242:2;13235:10;13206:113;;;13337:6;13334:1;13331:13;13328:2;;;-1:-1:-1;;13372:1:1;13354:16;;13347:27;13177:205::o;13387:380::-;13466:1;13462:12;;;;13509;;;13530:2;;13584:4;13576:6;13572:17;13562:27;;13530:2;13637;13629:6;13626:14;13606:18;13603:38;13600:2;;;13683:10;13678:3;13674:20;13671:1;13664:31;13718:4;13715:1;13708:15;13746:4;13743:1;13736:15;13600:2;;13442:325;;;:::o;13772:135::-;13811:3;-1:-1:-1;;13832:17:1;;13829:2;;;13852:18;;:::i;:::-;-1:-1:-1;13899:1:1;13888:13;;13819:88::o;13912:112::-;13944:1;13970;13960:2;;13975:18;;:::i;:::-;-1:-1:-1;14009:9:1;;13950:74::o;14029:127::-;14090:10;14085:3;14081:20;14078:1;14071:31;14121:4;14118:1;14111:15;14145:4;14142:1;14135:15;14161:127;14222:10;14217:3;14213:20;14210:1;14203:31;14253:4;14250:1;14243:15;14277:4;14274:1;14267:15;14293:127;14354:10;14349:3;14345:20;14342:1;14335:31;14385:4;14382:1;14375:15;14409:4;14406:1;14399:15;14425:131;-1:-1:-1;;;;;14500:31:1;;14490:42;;14480:2;;14546:1;14543;14536:12;14561:131;-1:-1:-1;;;;;;14635:32:1;;14625:43;;14615:2;;14682:1;14679;14672:12

Swarm Source

ipfs://6eba2c8f7ff5c15aa5ce923dc54a93f6d05268f414b0d749b3e9396e9fc49316
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.