ETH Price: $3,411.48 (-2.54%)
Gas: 8 Gwei

Token

TODEM Pixels (TPX)
 

Overview

Max Total Supply

17,319,472.495 TPX

Holders

21

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
talibanned.eth
Balance
53,452.942659553997092558 TPX

Value
$0.00
0x84eb5c6a9bfe8b0ef8e4b6491c7d88cf929f070a
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:
TPX

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 25 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 10 of 10: TPX.sol
pragma solidity ^0.8.0;

import "./ERC20.sol";
import "./Ownable.sol";
import "./IERC721.sol";
import "./SafeMath.sol";

// TPX.sol created by Latent Culture, February 2024
// An artwork extending TODEM by Jason Salavon
// https://latentculture.com/todem/info.TPX

// a glorious future awaits

contract TPX is ERC20, Ownable {
    IERC721 public nftContract;
    mapping(uint256 => bool) public usedTokenIds;
    uint256 public constant MAX_SUPPLY = 17319472495 * 10**15;

    event TokensClaimed(address claimant, uint256 totalValue);

    constructor(address _nftContract) ERC20("TODEM Pixels", "TPX") {
        _mint(address(this), MAX_SUPPLY);
        nftContract = IERC721(_nftContract);
    }

    function claimedSupply() public view returns (uint256) {
        uint256 tokensHeldInContract = balanceOf(address(this));
        return MAX_SUPPLY - tokensHeldInContract;
    }

    function tokenClaimed(uint256 tokenId) public view returns (bool) {
        return usedTokenIds[tokenId];
    }

    function claimTokens(uint256[] memory tokenIds) public {
        uint256 totalValue = 0;

        for (uint i = 0; i < tokenIds.length; i++) {
            if (!usedTokenIds[tokenIds[i]] && nftContract.ownerOf(tokenIds[i]) == msg.sender) {
                usedTokenIds[tokenIds[i]] = true;
                uint256 value = calculateValue(tokenIds[i]);
                totalValue += value;
            } 
        }

        if (totalValue > 0) {
            require(balanceOf(address(this)) >= totalValue, "Insufficient balance in contract");
            _transfer(address(this), msg.sender, totalValue);
            emit TokensClaimed(msg.sender, totalValue);
        }
    }

    function calculateValue(uint256 tokenId) internal pure returns (uint256) {
        uint256 baseValue = (tokenId / 10) * 10 * 10**15;
        if (tokenId >= 73359200) {
            return baseValue * 4;
        } else if (tokenId >= 8954400) {
            return baseValue * 3;
        } else if (tokenId >= 1496400) {
            return baseValue * 2;
        }
        return baseValue;
    }
}

File 1 of 10: Context.sol
// SPDX-License-Identifier: MIT
// 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 2 of 10: draft-IERC6093.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC-20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC-721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC-1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

File 3 of 10: ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;

import  "./IERC20.sol";
import  "./IERC20Metadata.sol";
import "./Context.sol";
import  "./draft-IERC6093.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC-20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the ERC may not emit
 * these events, as it isn't required by the specification.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

    mapping(address account => mapping(address spender => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the ERC. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     * ```
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `value`.
     *
     * Does not update the allowance value in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Does not emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}

File 4 of 10: IERC165.sol
// SPDX-License-Identifier: MIT
// 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 5 of 10: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

File 6 of 10: IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;

import {IERC20} from "./IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC-20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

File 7 of 10: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

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

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

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

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

File 8 of 10: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 9 of 10: SafeMath.sol
pragma solidity ^0.8.0;


/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
    if (a == 0) {
      return 0;
    }
    c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    // uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return a / b;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
    c = a + b;
    assert(c >= a);
    return c;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_nftContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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":false,"internalType":"address","name":"claimant","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalValue","type":"uint256"}],"name":"TokensClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftContract","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedTokenIds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

608060405234801562000010575f80fd5b50604051620011d6380380620011d68339810160408190526200003391620002b2565b6040518060400160405280600c81526020016b544f44454d20506978656c7360a01b815250604051806040016040528060038152602001620a8a0b60eb1b81525081600390816200008591906200037f565b5060046200009482826200037f565b505050620000b1620000ab620000ee60201b60201c565b620000f2565b620000c8306a0e538a7c3a98755691800062000143565b600680546001600160a01b0319166001600160a01b039290921691909117905562000471565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b038216620001725760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b6200017f5f838362000183565b5050565b6001600160a01b038316620001b1578060025f828254620001a591906200044b565b90915550620002239050565b6001600160a01b0383165f9081526020819052604090205481811015620002055760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640162000169565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821662000241576002805482900390556200025f565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620002a591815260200190565b60405180910390a3505050565b5f60208284031215620002c3575f80fd5b81516001600160a01b0381168114620002da575f80fd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200030a57607f821691505b6020821081036200032957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200037a57805f5260205f20601f840160051c81016020851015620003565750805b601f840160051c820191505b8181101562000377575f815560010162000362565b50505b505050565b81516001600160401b038111156200039b576200039b620002e1565b620003b381620003ac8454620002f5565b846200032f565b602080601f831160018114620003e9575f8415620003d15750858301515b5f19600386901b1c1916600185901b17855562000443565b5f85815260208120601f198616915b828110156200041957888601518255948401946001909101908401620003f8565b50858210156200043757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b808201808211156200046b57634e487b7160e01b5f52601160045260245ffd5b92915050565b610d57806200047f5f395ff3fe608060405234801561000f575f80fd5b50600436106100e4575f3560e01c806306fdde03146100e8578063095ea7b31461010657806318160ddd1461012957806323b872dd1461013b5780632d08265a1461014e578063313ce5671461016357806332cb6b0c1461017257806336ee1d8d1461018457806357cb93d9146101a657806370a08231146101c8578063715018a6146101db5780638da5cb5b146101e357806395d89b41146101f8578063a9059cbb14610200578063bfc2aa2a14610213578063d56d229d1461021b578063dd62ed3e1461022e578063f2fde38b14610241575b5f80fd5b6100f0610254565b6040516100fd9190610a17565b60405180910390f35b610119610114366004610a77565b6102e4565b60405190151581526020016100fd565b6002545b6040519081526020016100fd565b610119610149366004610aa1565b6102fd565b61016161015c366004610af3565b610320565b005b604051601281526020016100fd565b61012d6a0e538a7c3a98755691800081565b610119610192366004610bac565b5f9081526007602052604090205460ff1690565b6101196101b4366004610bac565b60076020525f908152604090205460ff1681565b61012d6101d6366004610bc3565b61052e565b610161610548565b6101eb61055b565b6040516100fd9190610bde565b6100f061056a565b61011961020e366004610a77565b610579565b61012d610586565b6006546101eb906001600160a01b031681565b61012d61023c366004610bf2565b6105ae565b61016161024f366004610bc3565b6105d8565b60606003805461026390610c29565b80601f016020809104026020016040519081016040528092919081815260200182805461028f90610c29565b80156102da5780601f106102b1576101008083540402835291602001916102da565b820191905f5260205f20905b8154815290600101906020018083116102bd57829003601f168201915b5050505050905090565b5f336102f1818585610651565b60019150505b92915050565b5f3361030a858285610663565b6103158585856106b3565b506001949350505050565b5f805b82518110156104815760075f84838151811061034157610341610c61565b60209081029190910181015182528101919091526040015f205460ff161580156103ff5750600654835133916001600160a01b031690636352211e9086908590811061038f5761038f610c61565b60200260200101516040518263ffffffff1660e01b81526004016103b591815260200190565b602060405180830381865afa1580156103d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103f49190610c75565b6001600160a01b0316145b1561047957600160075f85848151811061041b5761041b610c61565b602002602001015181526020019081526020015f205f6101000a81548160ff0219169083151502179055505f61046984838151811061045c5761045c610c61565b6020026020010151610710565b90506104758184610ca4565b9250505b600101610323565b50801561052a57806104923061052e565b10156104e55760405162461bcd60e51b815260206004820181905260248201527f496e73756666696369656e742062616c616e636520696e20636f6e747261637460448201526064015b60405180910390fd5b6104f03033836106b3565b60408051338152602081018390527f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e430910160405180910390a15b5050565b6001600160a01b03165f9081526020819052604090205490565b610550610782565b6105595f6107e1565b565b6005546001600160a01b031690565b60606004805461026390610c29565b5f336102f18185856106b3565b5f806105913061052e565b90506105a8816a0e538a7c3a987556918000610cb7565b91505090565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6105e0610782565b6001600160a01b0381166106455760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104dc565b61064e816107e1565b50565b61065e8383836001610832565b505050565b5f61066e84846105ae565b90505f1981146106ad578181101561069f57828183604051637dc7a0d960e11b81526004016104dc93929190610cca565b6106ad84848484035f610832565b50505050565b6001600160a01b0383166106dc575f604051634b637e8f60e11b81526004016104dc9190610bde565b6001600160a01b038216610705575f60405163ec442f0560e01b81526004016104dc9190610bde565b61065e838383610904565b5f8061071d600a84610ceb565b61072890600a610d0a565b6107399066038d7ea4c68000610d0a565b905063045f5f60831061075857610751816004610d0a565b9392505050565b6288a220831061076d57610751816003610d0a565b6216d55083106102f757610751816002610d0a565b3361078b61055b565b6001600160a01b0316146105595760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104dc565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b03841661085b575f60405163e602df0560e01b81526004016104dc9190610bde565b6001600160a01b038316610884575f604051634a1406b160e11b81526004016104dc9190610bde565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156106ad57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516108f691815260200190565b60405180910390a350505050565b6001600160a01b03831661092e578060025f8282546109239190610ca4565b9091555061098b9050565b6001600160a01b0383165f908152602081905260409020548181101561096d5783818360405163391434e360e21b81526004016104dc93929190610cca565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166109a7576002805482900390556109c5565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610a0a91815260200190565b60405180910390a3505050565b5f602080835283518060208501525f5b81811015610a4357858101830151858201604001528201610a27565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461064e575f80fd5b5f8060408385031215610a88575f80fd5b8235610a9381610a63565b946020939093013593505050565b5f805f60608486031215610ab3575f80fd5b8335610abe81610a63565b92506020840135610ace81610a63565b929592945050506040919091013590565b634e487b7160e01b5f52604160045260245ffd5b5f6020808385031215610b04575f80fd5b823567ffffffffffffffff80821115610b1b575f80fd5b818501915085601f830112610b2e575f80fd5b813581811115610b4057610b40610adf565b8060051b604051601f19603f83011681018181108582111715610b6557610b65610adf565b604052918252848201925083810185019188831115610b82575f80fd5b938501935b82851015610ba057843584529385019392850192610b87565b98975050505050505050565b5f60208284031215610bbc575f80fd5b5035919050565b5f60208284031215610bd3575f80fd5b813561075181610a63565b6001600160a01b0391909116815260200190565b5f8060408385031215610c03575f80fd5b8235610c0e81610a63565b91506020830135610c1e81610a63565b809150509250929050565b600181811c90821680610c3d57607f821691505b602082108103610c5b57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610c85575f80fd5b815161075181610a63565b634e487b7160e01b5f52601160045260245ffd5b808201808211156102f7576102f7610c90565b818103818111156102f7576102f7610c90565b6001600160a01b039390931683526020830191909152604082015260600190565b5f82610d0557634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176102f7576102f7610c9056fea2646970667358221220e1665a23becb8d3237cefbcccac6fe15a39f56e40a9d9d2b8c70bbe2fc30f17864736f6c63430008170033000000000000000000000000e4ebab52aad527c5ee51f218bf10109f4145524c

Deployed Bytecode

0x608060405234801561000f575f80fd5b50600436106100e4575f3560e01c806306fdde03146100e8578063095ea7b31461010657806318160ddd1461012957806323b872dd1461013b5780632d08265a1461014e578063313ce5671461016357806332cb6b0c1461017257806336ee1d8d1461018457806357cb93d9146101a657806370a08231146101c8578063715018a6146101db5780638da5cb5b146101e357806395d89b41146101f8578063a9059cbb14610200578063bfc2aa2a14610213578063d56d229d1461021b578063dd62ed3e1461022e578063f2fde38b14610241575b5f80fd5b6100f0610254565b6040516100fd9190610a17565b60405180910390f35b610119610114366004610a77565b6102e4565b60405190151581526020016100fd565b6002545b6040519081526020016100fd565b610119610149366004610aa1565b6102fd565b61016161015c366004610af3565b610320565b005b604051601281526020016100fd565b61012d6a0e538a7c3a98755691800081565b610119610192366004610bac565b5f9081526007602052604090205460ff1690565b6101196101b4366004610bac565b60076020525f908152604090205460ff1681565b61012d6101d6366004610bc3565b61052e565b610161610548565b6101eb61055b565b6040516100fd9190610bde565b6100f061056a565b61011961020e366004610a77565b610579565b61012d610586565b6006546101eb906001600160a01b031681565b61012d61023c366004610bf2565b6105ae565b61016161024f366004610bc3565b6105d8565b60606003805461026390610c29565b80601f016020809104026020016040519081016040528092919081815260200182805461028f90610c29565b80156102da5780601f106102b1576101008083540402835291602001916102da565b820191905f5260205f20905b8154815290600101906020018083116102bd57829003601f168201915b5050505050905090565b5f336102f1818585610651565b60019150505b92915050565b5f3361030a858285610663565b6103158585856106b3565b506001949350505050565b5f805b82518110156104815760075f84838151811061034157610341610c61565b60209081029190910181015182528101919091526040015f205460ff161580156103ff5750600654835133916001600160a01b031690636352211e9086908590811061038f5761038f610c61565b60200260200101516040518263ffffffff1660e01b81526004016103b591815260200190565b602060405180830381865afa1580156103d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103f49190610c75565b6001600160a01b0316145b1561047957600160075f85848151811061041b5761041b610c61565b602002602001015181526020019081526020015f205f6101000a81548160ff0219169083151502179055505f61046984838151811061045c5761045c610c61565b6020026020010151610710565b90506104758184610ca4565b9250505b600101610323565b50801561052a57806104923061052e565b10156104e55760405162461bcd60e51b815260206004820181905260248201527f496e73756666696369656e742062616c616e636520696e20636f6e747261637460448201526064015b60405180910390fd5b6104f03033836106b3565b60408051338152602081018390527f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e430910160405180910390a15b5050565b6001600160a01b03165f9081526020819052604090205490565b610550610782565b6105595f6107e1565b565b6005546001600160a01b031690565b60606004805461026390610c29565b5f336102f18185856106b3565b5f806105913061052e565b90506105a8816a0e538a7c3a987556918000610cb7565b91505090565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6105e0610782565b6001600160a01b0381166106455760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104dc565b61064e816107e1565b50565b61065e8383836001610832565b505050565b5f61066e84846105ae565b90505f1981146106ad578181101561069f57828183604051637dc7a0d960e11b81526004016104dc93929190610cca565b6106ad84848484035f610832565b50505050565b6001600160a01b0383166106dc575f604051634b637e8f60e11b81526004016104dc9190610bde565b6001600160a01b038216610705575f60405163ec442f0560e01b81526004016104dc9190610bde565b61065e838383610904565b5f8061071d600a84610ceb565b61072890600a610d0a565b6107399066038d7ea4c68000610d0a565b905063045f5f60831061075857610751816004610d0a565b9392505050565b6288a220831061076d57610751816003610d0a565b6216d55083106102f757610751816002610d0a565b3361078b61055b565b6001600160a01b0316146105595760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104dc565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b03841661085b575f60405163e602df0560e01b81526004016104dc9190610bde565b6001600160a01b038316610884575f604051634a1406b160e11b81526004016104dc9190610bde565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156106ad57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516108f691815260200190565b60405180910390a350505050565b6001600160a01b03831661092e578060025f8282546109239190610ca4565b9091555061098b9050565b6001600160a01b0383165f908152602081905260409020548181101561096d5783818360405163391434e360e21b81526004016104dc93929190610cca565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166109a7576002805482900390556109c5565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610a0a91815260200190565b60405180910390a3505050565b5f602080835283518060208501525f5b81811015610a4357858101830151858201604001528201610a27565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461064e575f80fd5b5f8060408385031215610a88575f80fd5b8235610a9381610a63565b946020939093013593505050565b5f805f60608486031215610ab3575f80fd5b8335610abe81610a63565b92506020840135610ace81610a63565b929592945050506040919091013590565b634e487b7160e01b5f52604160045260245ffd5b5f6020808385031215610b04575f80fd5b823567ffffffffffffffff80821115610b1b575f80fd5b818501915085601f830112610b2e575f80fd5b813581811115610b4057610b40610adf565b8060051b604051601f19603f83011681018181108582111715610b6557610b65610adf565b604052918252848201925083810185019188831115610b82575f80fd5b938501935b82851015610ba057843584529385019392850192610b87565b98975050505050505050565b5f60208284031215610bbc575f80fd5b5035919050565b5f60208284031215610bd3575f80fd5b813561075181610a63565b6001600160a01b0391909116815260200190565b5f8060408385031215610c03575f80fd5b8235610c0e81610a63565b91506020830135610c1e81610a63565b809150509250929050565b600181811c90821680610c3d57607f821691505b602082108103610c5b57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610c85575f80fd5b815161075181610a63565b634e487b7160e01b5f52601160045260245ffd5b808201808211156102f7576102f7610c90565b818103818111156102f7576102f7610c90565b6001600160a01b039390931683526020830191909152604082015260600190565b5f82610d0557634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176102f7576102f7610c9056fea2646970667358221220e1665a23becb8d3237cefbcccac6fe15a39f56e40a9d9d2b8c70bbe2fc30f17864736f6c63430008170033

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

000000000000000000000000e4ebab52aad527c5ee51f218bf10109f4145524c

-----Decoded View---------------
Arg [0] : _nftContract (address): 0xE4EbAb52AaD527C5EE51F218Bf10109F4145524c

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000e4ebab52aad527c5ee51f218bf10109f4145524c


Deployed Bytecode Sourcemap

294:1784:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1971:89:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4190:186;;;;;;:::i;:::-;;:::i;:::-;;;1188:14:10;;1181:22;1163:41;;1151:2;1136:18;4190:186:1;1023:187:10;3041:97:1;3119:12;;3041:97;;;1361:25:10;;;1349:2;1334:18;3041:97:1;1215:177:10;4936:244:1;;;;;;:::i;:::-;;:::i;1004:673:8:-;;;;;;:::i;:::-;;:::i;:::-;;2899:82:1;;;2972:2;3252:36:10;;3240:2;3225:18;2899:82:1;3110:184:10;413:57:8;;450:20;413:57;;887:111;;;;;;:::i;:::-;947:4;970:21;;;:12;:21;;;;;;;;;887:111;363:44;;;;;;:::i;:::-;;;;;;;;;;;;;;;;3196:116:1;;;;;;:::i;:::-;;:::i;1817:101:6:-;;;:::i;1194:85::-;;;:::i;:::-;;;;;;;:::i;2173:93:1:-;;;:::i;3507:178::-;;;;;;:::i;:::-;;:::i;704:177:8:-;;;:::i;331:26::-;;;;;-1:-1:-1;;;;;331:26:8;;;3743:140:1;;;;;;:::i;:::-;;:::i;2067:198:6:-;;;;;;:::i;:::-;;:::i;1971:89:1:-;2016:13;2048:5;2041:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1971:89;:::o;4190:186::-;4263:4;719:10:0;4317:31:1;719:10:0;4333:7:1;4342:5;4317:8;:31::i;:::-;4365:4;4358:11;;;4190:186;;;;;:::o;4936:244::-;5023:4;719:10:0;5079:37:1;5095:4;719:10:0;5110:5:1;5079:15;:37::i;:::-;5126:26;5136:4;5142:2;5146:5;5126:9;:26::i;:::-;-1:-1:-1;5169:4:1;;4936:244;-1:-1:-1;;;;4936:244:1:o;1004:673:8:-;1069:18;1107:6;1102:313;1123:8;:15;1119:1;:19;1102:313;;;1164:12;:25;1177:8;1186:1;1177:11;;;;;;;;:::i;:::-;;;;;;;;;;;;1164:25;;;;;;;;;;-1:-1:-1;1164:25:8;;;;1163:26;:76;;;;-1:-1:-1;1193:11:8;;1213;;1229:10;;-1:-1:-1;;;;;1193:11:8;;:19;;1213:8;;1222:1;;1213:11;;;;;;:::i;:::-;;;;;;;1193:32;;;;;;;;;;;;;1361:25:10;;1349:2;1334:18;;1215:177;1193:32:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1193:46:8;;1163:76;1159:245;;;1287:4;1259:12;:25;1272:8;1281:1;1272:11;;;;;;;;:::i;:::-;;;;;;;1259:25;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;1309:13;1325:27;1340:8;1349:1;1340:11;;;;;;;;:::i;:::-;;;;;;;1325:14;:27::i;:::-;1309:43;-1:-1:-1;1370:19:8;1309:43;1370:19;;:::i;:::-;;;1241:163;1159:245;1140:3;;1102:313;;;-1:-1:-1;1429:14:8;;1425:246;;1495:10;1467:24;1485:4;1467:9;:24::i;:::-;:38;;1459:83;;;;-1:-1:-1;;;1459:83:8;;5797:2:10;1459:83:8;;;5779:21:10;;;5816:18;;;5809:30;5875:34;5855:18;;;5848:62;5927:18;;1459:83:8;;;;;;;;;1556:48;1574:4;1581:10;1593;1556:9;:48::i;:::-;1623:37;;;1637:10;6130:51:10;;6212:2;6197:18;;6190:34;;;1623:37:8;;6103:18:10;1623:37:8;;;;;;;1425:246;1059:618;1004:673;:::o;3196:116:1:-;-1:-1:-1;;;;;3287:18:1;3261:7;3287:18;;;;;;;;;;;;3196:116::o;1817:101:6:-;1087:13;:11;:13::i;:::-;1881:30:::1;1908:1;1881:18;:30::i;:::-;1817:101::o:0;1194:85::-;1266:6;;-1:-1:-1;;;;;1266:6:6;;1194:85::o;2173:93:1:-;2220:13;2252:7;2245:14;;;;;:::i;3507:178::-;3576:4;719:10:0;3630:27:1;719:10:0;3647:2:1;3651:5;3630:9;:27::i;704:177:8:-;750:7;769:28;800:24;818:4;800:9;:24::i;:::-;769:55;-1:-1:-1;841:33:8;769:55;450:20;841:33;:::i;:::-;834:40;;;704:177;:::o;3743:140:1:-;-1:-1:-1;;;;;3849:18:1;;;3823:7;3849:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3743:140::o;2067:198:6:-;1087:13;:11;:13::i;:::-;-1:-1:-1;;;;;2155:22:6;::::1;2147:73;;;::::0;-1:-1:-1;;;2147:73:6;;6570:2:10;2147:73:6::1;::::0;::::1;6552:21:10::0;6609:2;6589:18;;;6582:30;6648:34;6628:18;;;6621:62;-1:-1:-1;;;6699:18:10;;;6692:36;6745:19;;2147:73:6::1;6368:402:10::0;2147:73:6::1;2230:28;2249:8;2230:18;:28::i;:::-;2067:198:::0;:::o;8886:128:1:-;8970:37;8979:5;8986:7;8995:5;9002:4;8970:8;:37::i;:::-;8886:128;;;:::o;10560:477::-;10659:24;10686:25;10696:5;10703:7;10686:9;:25::i;:::-;10659:52;;-1:-1:-1;;10725:16:1;:37;10721:310;;10801:5;10782:16;:24;10778:130;;;10860:7;10869:16;10887:5;10833:60;;-1:-1:-1;;;10833:60:1;;;;;;;;;;:::i;10778:130::-;10949:57;10958:5;10965:7;10993:5;10974:16;:24;11000:5;10949:8;:57::i;:::-;10649:388;10560:477;;;:::o;5553:300::-;-1:-1:-1;;;;;5636:18:1;;5632:86;;5704:1;5677:30;;-1:-1:-1;;;5677:30:1;;;;;;;;:::i;5632:86::-;-1:-1:-1;;;;;5731:16:1;;5727:86;;5799:1;5770:32;;-1:-1:-1;;;5770:32:1;;;;;;;;:::i;5727:86::-;5822:24;5830:4;5836:2;5840:5;5822:7;:24::i;1683:393:8:-;1747:7;;1787:12;1797:2;1787:7;:12;:::i;:::-;1786:19;;1803:2;1786:19;:::i;:::-;:28;;1808:6;1786:28;:::i;:::-;1766:48;;1839:8;1828:7;:19;1824:220;;1870:13;:9;1882:1;1870:13;:::i;:::-;1863:20;1683:393;-1:-1:-1;;;1683:393:8:o;1824:220::-;1915:7;1904;:18;1900:144;;1945:13;:9;1957:1;1945:13;:::i;1900:144::-;1990:7;1979;:18;1975:69;;2020:13;:9;2032:1;2020:13;:::i;1352:130:6:-;719:10:0;1415:7:6;:5;:7::i;:::-;-1:-1:-1;;;;;1415:23:6;;1407:68;;;;-1:-1:-1;;;1407:68:6;;7722:2:10;1407:68:6;;;7704:21:10;;;7741:18;;;7734:30;7800:34;7780:18;;;7773:62;7852:18;;1407:68:6;7520:356:10;2419:187:6;2511:6;;;-1:-1:-1;;;;;2527:17:6;;;-1:-1:-1;;;;;;2527:17:6;;;;;;;2559:40;;2511:6;;;2527:17;2511:6;;2559:40;;2492:16;;2559:40;2482:124;2419:187;:::o;9846:432:1:-;-1:-1:-1;;;;;9958:19:1;;9954:89;;10029:1;10000:32;;-1:-1:-1;;;10000:32:1;;;;;;;;:::i;9954:89::-;-1:-1:-1;;;;;10056:21:1;;10052:90;;10128:1;10100:31;;-1:-1:-1;;;10100:31:1;;;;;;;;:::i;10052:90::-;-1:-1:-1;;;;;10151:18:1;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;:35;;;10196:76;;;;10246:7;-1:-1:-1;;;;;10230:31:1;10239:5;-1:-1:-1;;;;;10230:31:1;;10255:5;10230:31;;;;1361:25:10;;1349:2;1334:18;;1215:177;10230:31:1;;;;;;;;9846:432;;;;:::o;6168:1107::-;-1:-1:-1;;;;;6257:18:1;;6253:540;;6409:5;6393:12;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;6253:540:1;;-1:-1:-1;6253:540:1;;-1:-1:-1;;;;;6467:15:1;;6445:19;6467:15;;;;;;;;;;;6500:19;;;6496:115;;;6571:4;6577:11;6590:5;6546:50;;-1:-1:-1;;;6546:50:1;;;;;;;;;;:::i;6496:115::-;-1:-1:-1;;;;;6731:15:1;;:9;:15;;;;;;;;;;6749:19;;;;6731:37;;6253:540;-1:-1:-1;;;;;6807:16:1;;6803:425;;6970:12;:21;;;;;;;6803:425;;;-1:-1:-1;;;;;7181:13:1;;:9;:13;;;;;;;;;;:22;;;;;;6803:425;7258:2;-1:-1:-1;;;;;7243:25:1;7252:4;-1:-1:-1;;;;;7243:25:1;;7262:5;7243:25;;;;1361::10;;1349:2;1334:18;;1215:177;7243:25:1;;;;;;;;6168:1107;;;:::o;14:548:10:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:10;;632:42;;622:70;;688:1;685;678:12;703:315;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:10:o;1397:456::-;1474:6;1482;1490;1543:2;1531:9;1522:7;1518:23;1514:32;1511:52;;;1559:1;1556;1549:12;1511:52;1598:9;1585:23;1617:31;1642:5;1617:31;:::i;:::-;1667:5;-1:-1:-1;1724:2:10;1709:18;;1696:32;1737:33;1696:32;1737:33;:::i;:::-;1397:456;;1789:7;;-1:-1:-1;;;1843:2:10;1828:18;;;;1815:32;;1397:456::o;1858:127::-;1919:10;1914:3;1910:20;1907:1;1900:31;1950:4;1947:1;1940:15;1974:4;1971:1;1964:15;1990:1115;2074:6;2105:2;2148;2136:9;2127:7;2123:23;2119:32;2116:52;;;2164:1;2161;2154:12;2116:52;2204:9;2191:23;2233:18;2274:2;2266:6;2263:14;2260:34;;;2290:1;2287;2280:12;2260:34;2328:6;2317:9;2313:22;2303:32;;2373:7;2366:4;2362:2;2358:13;2354:27;2344:55;;2395:1;2392;2385:12;2344:55;2431:2;2418:16;2453:2;2449;2446:10;2443:36;;;2459:18;;:::i;:::-;2505:2;2502:1;2498:10;2537:2;2531:9;2600:2;2596:7;2591:2;2587;2583:11;2579:25;2571:6;2567:38;2655:6;2643:10;2640:22;2635:2;2623:10;2620:18;2617:46;2614:72;;;2666:18;;:::i;:::-;2702:2;2695:22;2752:18;;;2786:15;;;;-1:-1:-1;2828:11:10;;;2824:20;;;2856:19;;;2853:39;;;2888:1;2885;2878:12;2853:39;2912:11;;;;2932:142;2948:6;2943:3;2940:15;2932:142;;;3014:17;;3002:30;;2965:12;;;;3052;;;;2932:142;;;3093:6;1990:1115;-1:-1:-1;;;;;;;;1990:1115:10:o;3299:180::-;3358:6;3411:2;3399:9;3390:7;3386:23;3382:32;3379:52;;;3427:1;3424;3417:12;3379:52;-1:-1:-1;3450:23:10;;3299:180;-1:-1:-1;3299:180:10:o;3484:247::-;3543:6;3596:2;3584:9;3575:7;3571:23;3567:32;3564:52;;;3612:1;3609;3602:12;3564:52;3651:9;3638:23;3670:31;3695:5;3670:31;:::i;3736:203::-;-1:-1:-1;;;;;3900:32:10;;;;3882:51;;3870:2;3855:18;;3736:203::o;4167:388::-;4235:6;4243;4296:2;4284:9;4275:7;4271:23;4267:32;4264:52;;;4312:1;4309;4302:12;4264:52;4351:9;4338:23;4370:31;4395:5;4370:31;:::i;:::-;4420:5;-1:-1:-1;4477:2:10;4462:18;;4449:32;4490:33;4449:32;4490:33;:::i;:::-;4542:7;4532:17;;;4167:388;;;;;:::o;4560:380::-;4639:1;4635:12;;;;4682;;;4703:61;;4757:4;4749:6;4745:17;4735:27;;4703:61;4810:2;4802:6;4799:14;4779:18;4776:38;4773:161;;4856:10;4851:3;4847:20;4844:1;4837:31;4891:4;4888:1;4881:15;4919:4;4916:1;4909:15;4773:161;;4560:380;;;:::o;4945:127::-;5006:10;5001:3;4997:20;4994:1;4987:31;5037:4;5034:1;5027:15;5061:4;5058:1;5051:15;5077:251;5147:6;5200:2;5188:9;5179:7;5175:23;5171:32;5168:52;;;5216:1;5213;5206:12;5168:52;5248:9;5242:16;5267:31;5292:5;5267:31;:::i;5333:127::-;5394:10;5389:3;5385:20;5382:1;5375:31;5425:4;5422:1;5415:15;5449:4;5446:1;5439:15;5465:125;5530:9;;;5551:10;;;5548:36;;;5564:18;;:::i;6235:128::-;6302:9;;;6323:11;;;6320:37;;;6337:18;;:::i;6775:345::-;-1:-1:-1;;;;;6995:32:10;;;;6977:51;;7059:2;7044:18;;7037:34;;;;7102:2;7087:18;;7080:34;6965:2;6950:18;;6775:345::o;7125:217::-;7165:1;7191;7181:132;;7235:10;7230:3;7226:20;7223:1;7216:31;7270:4;7267:1;7260:15;7298:4;7295:1;7288:15;7181:132;-1:-1:-1;7327:9:10;;7125:217::o;7347:168::-;7420:9;;;7451;;7468:15;;;7462:22;;7448:37;7438:71;;7489:18;;:::i

Swarm Source

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