ETH Price: $3,360.18 (-0.21%)

Token

DAOBnB (DAOBNB)
 

Overview

Max Total Supply

435 DAOBNB

Holders

263

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
politechsguy.eth
Balance
1 DAOBNB
0x0aaf37c3eaaa42d417434fd2cec555846d46415c
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:
DAOBnBNFT

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 800 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-22
*/

// Sources flattened with hardhat v2.8.4 https://hardhat.org

// File @openzeppelin/contracts/utils/[email protected]

// 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 @openzeppelin/contracts/access/[email protected]


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File @openzeppelin/contracts/utils/introspection/[email protected]


// 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/token/ERC721/[email protected]


// 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/[email protected]


// 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/token/ERC721/extensions/[email protected]


// 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/[email protected]


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

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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/utils/[email protected]


// 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/introspection/[email protected]


// 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 contracts/ERC721Opt.sol



pragma solidity ^0.8.4;







error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintToDeadAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error TransferToDeadAddress();
error UnableGetTokenOwnerByIndex();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 1 (e.g. 1, 2, 3..).
 */
contract ERC721Opt is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    uint256 internal _nextTokenId = 1;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owners details
    // An empty struct value does not necessarily mean the token is unowned. See ownerOf implementation for details.
    mapping(uint256 => address) internal _owners;

    // Mapping owner address to balances
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    // Address to use for burned accounting
    address constant DEAD_ADDR = 0x000000000000000000000000000000000000dEaD;

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

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual returns (uint256) {
        // Counter underflow is impossible as burned cannot be incremented
        // more than _nextTokenId - 1 times
        unchecked {
            return (_nextTokenId - 1) - balanceOf(DEAD_ADDR);    
        }
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _balances[owner];
    }

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

        unchecked {
            for (uint256 curr = tokenId;; curr--) {
                owner = _owners[curr];
                if (owner != address(0)) {
                    return owner;
                }
            }
        }
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        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 virtual override {
        address owner = 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 virtual 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 (!_checkOnERC721Received(from, to, tokenId, _data)) revert TransferToNonERC721ReceiverImplementer();
    }

    function _isApprovedOrOwner(address sender, uint256 tokenId) internal view virtual returns (bool) {
        address owner = ownerOf(tokenId);

        return (sender == owner ||
            getApproved(tokenId) == sender ||
            isApprovedForAll(owner, sender));
    }

    /**
     * @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 virtual returns (bool) {
        return tokenId > 0 && tokenId < _nextTokenId && _owners[tokenId] != DEAD_ADDR;
    }
    
    function _mint(address to, uint256 quantity) internal virtual {
        _mint(to, quantity, '', false);
    }

    function _safeMint(address to, uint256 quantity) internal virtual {
        _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 virtual {
        _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 virtual {
        uint256 startTokenId = _nextTokenId;
        if (to == address(0)) revert MintToZeroAddress();
        if (to == DEAD_ADDR) revert MintToDeadAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance overflow if current value + quantity > 1.56e77 (2**256) - 1
        // updatedIndex overflows if _nextTokenId + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _balances[to] += quantity;

            _owners[startTokenId] = to;

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    if (!_checkOnERC721Received(address(0), to, updatedIndex, _data)) revert TransferToNonERC721ReceiverImplementer();
                }

                updatedIndex++;
            }

            _nextTokenId = 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 {
        address owner = ownerOf(tokenId);

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

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (owner != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();
        if (to == DEAD_ADDR) revert TransferToDeadAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

            _owners[tokenId] = to;

            // If the owner 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;
            if (_owners[nextTokenId] == address(0)) {
                // This will suffice for checking _exists(nextTokenId), 
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _nextTokenId) {
                    _owners[nextTokenId] = owner;
                }
            }
        }

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

    /**
     * @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 Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ownerOf(tokenId);

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

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

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

            _owners[tokenId] = DEAD_ADDR;

            // If the owner 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;
            if (_owners[nextTokenId] == address(0)) {
                // This will suffice for checking _exists(nextTokenId), 
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _nextTokenId) { 
                    _owners[nextTokenId] = owner;
                }
            }
        }

        emit Transfer(owner, address(0), tokenId);
        _afterTokenTransfers(owner, address(0), tokenId, 1);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) revert TransferToNonERC721ReceiverImplementer();
                else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * 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`.
     */
    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.
     *
     * 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` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}


// File contracts/extensions/ERC721OptOwnersExplicit.sol



pragma solidity ^0.8.4;

error AllOwnersHaveBeenSet();
error QuantityMustBeNonZero();
error NoTokensMintedYet();

abstract contract ERC721OptOwnersExplicit is ERC721Opt {
    uint256 public nextOwnerToExplicitlySet = 1;

    /**
     * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
     */
    function _setOwnersExplicit(uint256 quantity) internal {
        if (quantity == 0) revert QuantityMustBeNonZero();
        if (_nextTokenId == 1) revert NoTokensMintedYet();
        uint256 _nextOwnerToExplicitlySet = nextOwnerToExplicitlySet;
        if (_nextOwnerToExplicitlySet >= _nextTokenId) revert AllOwnersHaveBeenSet();

        // Index underflow is impossible.
        // Counter or index overflow is incredibly unrealistic.
        unchecked {
            uint256 endIndex = _nextOwnerToExplicitlySet + quantity - 1;

            // Set the end index to be the last token index
            if (endIndex + 1 > _nextTokenId) {
                endIndex = _nextTokenId - 1;
            }

            for (uint256 i = _nextOwnerToExplicitlySet; i <= endIndex; i++) {
                if (_owners[i] == address(0) && _owners[i] != DEAD_ADDR) {
                    address ownership = ownerOf(i);
                    _owners[i] = ownership;
                }
            }

            nextOwnerToExplicitlySet = endIndex + 1;
        }
    }
}


// File contracts/extensions/ERC721OptBurnable.sol



pragma solidity ^0.8.4;

error BurnCallerNotOwnerNorApproved();

/**
 * @title ERC721Opt Burnable Token
 * @dev ERC721Opt Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721OptBurnable is ERC721Opt {

    /**
     * @dev Burns `tokenId`. See {ERC721Opt-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        if (!_isApprovedOrOwner(_msgSender(), tokenId)) revert BurnCallerNotOwnerNorApproved();
        _burn(tokenId);
    }
}


// File contracts/extensions/ERC721OptBatchBurnable.sol



pragma solidity ^0.8.4;

/**
 * @title ERC721Opt Batch Burnable Token
 * @dev ERC721Opt Token that can be irreversibly batch burned (destroyed).
 */
abstract contract ERC721OptBatchBurnable is ERC721OptBurnable {
    /**
     * @dev Perform burn on a batch of tokens
     */
    function batchBurn(uint16[] memory tokenIds) public virtual {
        for (uint16 i = 0; i < tokenIds.length; ++i) {
            if (!_isApprovedOrOwner(_msgSender(), tokenIds[i])) revert BurnCallerNotOwnerNorApproved();
            _burn(tokenIds[i]);
        }
    }
}


// File contracts/extensions/ERC721OptBatchTransferable.sol



pragma solidity ^0.8.4;

/**
 * @title ERC721Opt Batch Transferable Token
 * @dev ERC721Opt Token that can be batch transfered
*/
abstract contract ERC721OptBatchTransferable is ERC721Opt {
    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
    */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint16[] tokenIds
    );

    /**
     * @dev Perform transferFrom on a batch of tokens
     */
    function batchTransferFrom(
        address from,
        address to,
        uint16[] memory tokenIds
    ) public virtual {
        for (uint16 i = 0; i < tokenIds.length; ++i) {
            if (!_isApprovedOrOwner(_msgSender(), tokenIds[i])) revert TransferCallerNotOwnerNorApproved();
            transferFrom(from, to, tokenIds[i]);
        }

        emit TransferBatch(_msgSender(), from, to, tokenIds);
    }

    /**
     * @dev Perform safeTransferFrom on a batch of tokens
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint16[] memory tokenIds
    ) public virtual {
        safeBatchTransferFrom(from, to, tokenIds, '');
    }

    /**
     * @dev Perform safeTransferFrom on a batch of tokens
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint16[] memory tokenIds,
        bytes memory _data
    ) public virtual {
        for (uint256 i = 0; i < tokenIds.length; ++i) {
            if (!_isApprovedOrOwner(_msgSender(), tokenIds[i])) revert TransferCallerNotOwnerNorApproved();
            safeTransferFrom(from, to, tokenIds[i], _data);
        }

        emit TransferBatch(_msgSender(), from, to, tokenIds);
    }
}


// File contracts/DAOBnBNFT.sol



pragma solidity ^0.8.4;




contract OpenSeaOwnableDelegateProxy {}

contract OpenSeaProxyRegistry {
    mapping(address => OpenSeaOwnableDelegateProxy) public proxies;
}

interface IToken {
    /**
     * @dev Called from DAOBnBNFT when one is transfered/minted/burned
     */
    function updateRewards(address _user) external;
}

error CardTypeQueryForNonexistentToken();
error OnlyMintersCanMint();
error NoMintAmountProvided();
error AllSilverCardsMinted();
error AllBlackCardsMinted();

contract DAOBnBNFT is Ownable, ERC721Opt, ERC721OptOwnersExplicit, ERC721OptBatchBurnable, ERC721OptBatchTransferable {
     using Strings for uint16;

    /* Base URI for token URIs */
    string public baseURI;

    /* OpenSea user account proxy */
    address public openSeaProxyRegistryAddress;

    /* Token contract */
    IToken public token;

    uint16 silverCardsMax = 6400;
    uint16 blackCardsMax = 2700;

    uint16 blackCardsMinted;

    /* mapping of each wallets black cards */
    mapping(address => uint16) public walletBlackCards;
    
    /* Minter addressess */
    mapping(address => bool) public minters;

    /* mapping of each token id to card type 0 = silver, 1 = black */
    mapping(uint16 => bool) _blackCardTokenIds;
    
    constructor(string memory name_, string memory symbol_, string memory _initialBaseURI, address _openSeaProxyRegistryAddress, address[] memory _minters) ERC721Opt(name_, symbol_) {
        baseURI = _initialBaseURI;
        openSeaProxyRegistryAddress = _openSeaProxyRegistryAddress;
        
        for (uint256 i = 0; i < _minters.length; i++) {
            minters[_minters[i]] = true;
        }
    }

    /**
     * @dev Get silver cards left for sale
     */
    function silverCardsLeft() public view returns (uint256) {
        return silverCardsMax - (_nextTokenId - 1 - blackCardsMinted);
    }

    /**
     * @dev Get black cards left for sale
     */
    function blackCardsLeft() public view returns (uint256) {
        return blackCardsMax - blackCardsMinted;
    }

    /**
     * @dev Get the card type for a specific tokenId
     */
    function tokenCardType(uint16 tokenId) public view returns (string memory) {
        if (!_exists(tokenId)) revert CardTypeQueryForNonexistentToken();

        if (_blackCardTokenIds[tokenId]) {
            return "black";
        }

        return "silver";
    }

    /**
     * @dev Override to if default approved for OS proxy accounts or normal approval
     */
    function isApprovedForAll(address owner, address operator)
        public
        view
        override
        returns (bool)
    {
        // Whitelist OpenSea proxy contract for easy trading.
        OpenSeaProxyRegistry openSeaProxyRegistry = OpenSeaProxyRegistry(
            openSeaProxyRegistryAddress
        );
        if (address(openSeaProxyRegistry.proxies(owner)) == operator) {
            return true;
        }

        return ERC721Opt.isApprovedForAll(owner, operator);
    }

    /**
     * @dev Override to change the baseURI used in tokenURI
     */
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    /**
     * @dev Override to change tokenURI format
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        return
            bytes(baseURI).length > 0
                ? string(abi.encodePacked(_baseURI(), tokenCardType(uint16(tokenId)), '.json'))
                : '';
    }

    /**
     * @dev Mint of specific card type to address. 
     */
    function mint(uint16 silverCardsAmount, uint16 blackCardsAmount, address to) public {
        if(!minters[msg.sender]) revert OnlyMintersCanMint();
        if(silverCardsAmount + blackCardsAmount == 0) revert NoMintAmountProvided();
        if(_nextTokenId - 1 - blackCardsMinted + silverCardsAmount > silverCardsMax) revert AllSilverCardsMinted();
        if(blackCardsMinted + blackCardsAmount > blackCardsMax) revert AllBlackCardsMinted();

        if (blackCardsAmount > 0) {
            blackCardsMinted += blackCardsAmount;

            uint16 tokenId = uint16(_nextTokenId) + silverCardsAmount;

            for (uint16 i; i < blackCardsAmount; i++) {
                _blackCardTokenIds[tokenId++] = true;
            }
        }
        
        _safeMint(to, silverCardsAmount + blackCardsAmount, '');
    }

    /**
     * @dev Override so we can update token rewards before transfer happens
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual override {
        if (address(token) != address(0)) {
            token.updateRewards(from);
            token.updateRewards(to);
        }

        uint16 blackCards;

        for(uint16 i = uint16(startTokenId); i < startTokenId + quantity; i++) {
            if (_blackCardTokenIds[i]) {
                blackCards += 1;
            }
        }

        if (from != address(0)) {
            walletBlackCards[from] -= blackCards;
        }
        if (to != address(0)) {
            walletBlackCards[to] += blackCards;
        }

        super._beforeTokenTransfers(from, to, startTokenId, quantity);
    }

    /**
     * @dev Set the base uri for token metadata
     */
    function setBaseURI(string memory _newBaseURI) external onlyOwner {
        baseURI = _newBaseURI;
    }

    /**
     * @dev Set minter status for addresses
     */
    function setMinters(address[] calldata addresses, bool allowed) external onlyOwner {
        for(uint256 i = 0; i < addresses.length; i++) {
            minters[addresses[i]] = allowed;
        }
    }

    /**
     * @dev Update available cards
     */
    function updateAvailableCards(uint16 silverCards, uint16 blackCards) external onlyOwner {
        silverCardsMax = silverCards;
        blackCardsMax = blackCards;
    }

    /**
     * @dev Set the token contract
     */
    function setToken(IToken _token) external onlyOwner {
        token = _token;
    }

    /**
     * @dev Force update all owners for better transfers
     */
    function updateOwners(uint256 quantity) external onlyOwner {
        _setOwnersExplicit(quantity);
    }
}


// File @openzeppelin/contracts/utils/cryptography/[email protected]


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}


// File contracts/DAOBnBMinter.sol


pragma solidity ^0.8.0;



contract DAOBnBMinter is Ownable {
    using Strings for uint16;
    using ECDSA for bytes32;

    /* DAObnb NFT contract */
    DAOBnBNFT nftContract;

    /* Is Pre Sale Active */
    bool public preSaleIsActive;
    /* Is Sale Active */
    bool public saleIsActive;
    
    /* If > 0 limit pre sale silver cards purchases per address */
    uint16 public maxPreSaleSilverCardsPerAddress = 2;
    /* If > 0 limit pre sale black cards purchases per address */
    uint16 public maxPreSaleBlackCardsPerAddress = 1;

    /* Limit how many silver cards can be purchased in single transaction for pre sale */
    uint16 public maxPreSaleSilverCardsPerTransaction = 2;
    /* Limit how many black cards can be purchased in single transaction for pre sale */
    uint16 public maxPreSaleBlackCardsPerTransaction = 1;
    
    /* Limit how many silver cards can be purchased in single transaction for public sale */
    uint16 public maxSilverCardsPerTransaction = 16;
    /* Limit how many black cards can be purchased in single transaction for public sale */
    uint16 public maxBlackCardsPerTransaction = 4;

    /* silver cards reserved for marketing */
    uint16 public reservedSilverCards = 640;
    /* black cards reserved for marketing */
    uint16 public reservedBlackCards = 270;

    /* Price for silver card during pre sale */
    uint256 public preSaleSilverCardPrice = 0.175 ether;
    /* Price for black card during pre sale */
    uint256 public preSaleBlackCardPrice = 0.7 ether;

    /* Price for silver card during public sale */
    uint256 public silverCardPrice = 0.175 ether;
    /* Price for black card during public sale */
    uint256 public blackCardPrice = 0.7 ether;
    
    /* PreSaleList Signature Addresses */
    mapping(address => bool) public preSaleListSignatureAddresses;
    /* PreSaleList Signature Nounces used */
    mapping(uint16 => address) public preSaleListSignatureUsedNounces;
    
    /* PreSaleListed addressess */
    mapping(address => bool) public preSaleListedAddresses;

    /* Silver cards minted per address during pre sale */
    mapping(address => uint16) public preSaleSilverCardPurchases;
    /* Black cards minted per address during pre sale */
    mapping(address => uint16) public preSaleBlackCardPurchases;

    constructor(
        DAOBnBNFT _nftContract,
        address[] memory _preSaleListSignatureAddresses
    ) {
        nftContract = _nftContract;

        for (uint256 i = 0; i < _preSaleListSignatureAddresses.length; i++) {
            preSaleListSignatureAddresses[_preSaleListSignatureAddresses[i]] = true;
        }
    }

    function getPreSaleListMessage(uint16 nounce, address sender)
        public
        pure
        returns (bytes32)
    {
        if (nounce > 0) {
            return keccak256(abi.encodePacked('ProjectId: 621285d3e200cdf5b5ef5704, Nounce: ', nounce));
        }
        
        return keccak256(abi.encodePacked('ProjectId: 621285d3e200cdf5b5ef5704, Address: ', sender));
    }
    
    function mintPreSale(uint16 silverCardsAmount, uint16 blackCardsAmount, uint16 nounce, bytes calldata signature) external payable {
        require(preSaleIsActive, 'Pre sale must be active to mint pre sale');
        require(!saleIsActive, 'Regular sale is already active');
        require(
            silverCardsAmount + blackCardsAmount > 0,
            'No amounts provided'
        );
        require(
            silverCardsAmount <= maxPreSaleSilverCardsPerTransaction,
            'Can not mint that many silver tokens in a single transaction during the pre sale'
        );
        require(
            blackCardsAmount <= maxPreSaleBlackCardsPerTransaction,
            'Can not mint that many black tokens in a single transaction during the pre sale'
        );
        require(
            silverCardsAmount <= nftContract.silverCardsLeft() - reservedSilverCards,
            'Sold Out'
        );
        require(
            blackCardsAmount <= nftContract.blackCardsLeft() - reservedBlackCards,
            'Sold Out'
        );
        require(
            preSaleSilverCardPurchases[msg.sender] + silverCardsAmount <= maxPreSaleSilverCardsPerAddress,
            'Can only mint so many silver cards during the presale'
        );
        require(
            preSaleBlackCardPurchases[msg.sender] + blackCardsAmount <= maxPreSaleBlackCardsPerAddress,
            'Can only mint so many black cards during the presale'
        );
        require(
            msg.value >= (preSaleSilverCardPrice * silverCardsAmount) + (preSaleBlackCardPrice * blackCardsAmount),
            'Ether value sent is not correct'
        );
        require(preSaleListedAddresses[_msgSender()] || signature.length > 0, 'Signature required for pre sale');
        require(nounce == 0 || preSaleListSignatureUsedNounces[nounce] == address(0) || preSaleListSignatureUsedNounces[nounce] == _msgSender(), 'Invalid or used nounce');

        if (!preSaleListedAddresses[_msgSender()] && preSaleListSignatureUsedNounces[nounce] != _msgSender()) {
            bytes32 message = getPreSaleListMessage(nounce, _msgSender());
            bytes32 messageHash = message.toEthSignedMessageHash();
            address signer = messageHash.recover(signature);

            require(preSaleListSignatureAddresses[signer], 'Signature invalid');

            if (nounce > 0) {
                preSaleListSignatureUsedNounces[nounce] = _msgSender();
            }
        }

        preSaleSilverCardPurchases[msg.sender] += silverCardsAmount;
        preSaleBlackCardPurchases[msg.sender] += blackCardsAmount;

        nftContract.mint(silverCardsAmount, blackCardsAmount, msg.sender);
    }
    
    function mint(uint16 silverCardsAmount, uint16 blackCardsAmount) external payable {
        require(saleIsActive, 'Regular sale is not active');
        require(
            silverCardsAmount + blackCardsAmount > 0,
            'No amounts provided'
        );
        require(
            silverCardsAmount <= maxSilverCardsPerTransaction,
            'Can not mint that many silver cards in a single transaction during the sale'
        );
        require(
            blackCardsAmount <= maxBlackCardsPerTransaction,
            'Can not mint that many black cards in a single transaction during the sale'
        );
        require(
            silverCardsAmount <= nftContract.silverCardsLeft() - reservedSilverCards,
            'Sold Out'
        );
        require(
            blackCardsAmount <= nftContract.blackCardsLeft() - reservedBlackCards,
            'Sold Out'
        );
        require(
            msg.value >= (silverCardPrice * silverCardsAmount) + (blackCardPrice * blackCardsAmount),
            'Ether value sent is not correct'
        );

        nftContract.mint(silverCardsAmount, blackCardsAmount, _msgSender());
    }
    
    /**
     * @dev Update a list of addresses to be allowed to be used for signature based preSaleList
     */
    function updatePreSaleListSignatureAddresses(address[] memory _preSaleListSignatureAddresses, bool allowed)
        external
        onlyOwner
    {
        for (uint256 i = 0; i < _preSaleListSignatureAddresses.length; i++) {
            preSaleListSignatureAddresses[_preSaleListSignatureAddresses[i]] = allowed;
        }
    }
    
    /**
     * @dev Update a list of addresses to be allowed in preSaleList
     */
    function updatePreSaleListedAddresses(address[] memory _preSaleListedAddresses, bool allowed)
        external
        onlyOwner
    {
        for (uint256 i = 0; i < _preSaleListedAddresses.length; i++) {
            preSaleListedAddresses[_preSaleListedAddresses[i]] = allowed;
        }
    }

    function flipPreSaleState() external onlyOwner {
        preSaleIsActive = !preSaleIsActive;
    }

    function flipSaleState() external onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function setMaxPreSaleCardsPerAddress(uint16 _silverCardsAmount, uint16 _blackCardsAmount) external onlyOwner {
        maxPreSaleSilverCardsPerAddress = _silverCardsAmount;
        maxPreSaleBlackCardsPerAddress = _blackCardsAmount;
    }

    function setMaxPreSaleCardsPerTransaction(uint16 _silverCardsAmount, uint16 _blackCardsAmount) external onlyOwner {
        maxPreSaleSilverCardsPerTransaction = _silverCardsAmount;
        maxPreSaleBlackCardsPerTransaction = _blackCardsAmount;
    }

    function setMaxCardsPerTransaction(uint16 _silverCardsAmount, uint16 _blackCardsAmount, bool updatePreSaleAlso) external onlyOwner {
        maxSilverCardsPerTransaction = _silverCardsAmount;
        maxBlackCardsPerTransaction = _blackCardsAmount;

        if (updatePreSaleAlso) {
            maxPreSaleSilverCardsPerTransaction = _silverCardsAmount;
            maxPreSaleBlackCardsPerTransaction = _blackCardsAmount;
        }
    }

    function setReservedCards(uint16 _silverCardsAmount, uint16 _blackCardsAmount) external onlyOwner {
        reservedSilverCards = _silverCardsAmount;
        reservedBlackCards = _blackCardsAmount;
    }

    function setPreSalePrice(uint256 _silverCardPrice, uint256 _blackCardPrice) external onlyOwner {
        preSaleSilverCardPrice = _silverCardPrice;
        preSaleBlackCardPrice = _blackCardPrice;
    }

    function setPrice(uint256 _silverCardPrice, uint256 _blackCardPrice, bool updatePreSaleAlso) external onlyOwner {
        silverCardPrice = _silverCardPrice;
        blackCardPrice = _blackCardPrice;

        if (updatePreSaleAlso) {
            preSaleSilverCardPrice = _silverCardPrice;
            preSaleBlackCardPrice = _blackCardPrice;
        }
    }

    function reserveMint(uint16 silverCardsAmount, uint16 blackCardsAmount, address[] calldata to) external onlyOwner {
        require(
            (silverCardsAmount * to.length) <= reservedSilverCards,
            'Not enough reserve left for team'
        );
        require(
            (blackCardsAmount * to.length) <= reservedBlackCards,
            'Not enough reserve left for team'
        );
        require(
            silverCardsAmount + blackCardsAmount > 0,
            'No amounts provided'
        );

        for (uint16 i = 0; i < to.length; i++) {
            nftContract.mint(silverCardsAmount, blackCardsAmount, to[i]);
        }

        reservedSilverCards = uint16(reservedSilverCards - (silverCardsAmount * to.length));
        reservedBlackCards = uint16(reservedBlackCards - (blackCardsAmount * to.length));
    }
    
    function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"_initialBaseURI","type":"string"},{"internalType":"address","name":"_openSeaProxyRegistryAddress","type":"address"},{"internalType":"address[]","name":"_minters","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AllBlackCardsMinted","type":"error"},{"inputs":[],"name":"AllOwnersHaveBeenSet","type":"error"},{"inputs":[],"name":"AllSilverCardsMinted","type":"error"},{"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":"BurnCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"CardTypeQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"MintToDeadAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"NoMintAmountProvided","type":"error"},{"inputs":[],"name":"NoTokensMintedYet","type":"error"},{"inputs":[],"name":"OnlyMintersCanMint","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"QuantityMustBeNonZero","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToDeadAddress","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"TransferBatch","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"batchBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"blackCardsLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"silverCardsAmount","type":"uint16"},{"internalType":"uint16","name":"blackCardsAmount","type":"uint16"},{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openSeaProxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeBatchTransferFrom","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":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setMinters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IToken","name":"_token","type":"address"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"silverCardsLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"tokenCardType","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":"uint16","name":"silverCards","type":"uint16"},{"internalType":"uint16","name":"blackCards","type":"uint16"}],"name":"updateAvailableCards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"updateOwners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"walletBlackCards","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"}]

60806040526001808055600855600b805463ffffffff60a01b1916620a8c1960a81b1790553480156200003157600080fd5b5060405162002bfb38038062002bfb83398101604081905262000054916200032c565b848462000061336200013b565b8151620000769060029060208501906200018b565b5080516200008c9060039060208401906200018b565b50508351620000a4915060099060208601906200018b565b50600a80546001600160a01b0319166001600160a01b03841617905560005b81518110156200012f576001600d6000848481518110620000e857620000e86200046c565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580620001268162000482565b915050620000c3565b505050505050620004e9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200019990620004ac565b90600052602060002090601f016020900481019282620001bd576000855562000208565b82601f10620001d857805160ff191683800117855562000208565b8280016001018555821562000208579182015b8281111562000208578251825591602001919060010190620001eb565b50620002169291506200021a565b5090565b5b808211156200021657600081556001016200021b565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562000272576200027262000231565b604052919050565b600082601f8301126200028c57600080fd5b81516001600160401b03811115620002a857620002a862000231565b6020620002be601f8301601f1916820162000247565b8281528582848701011115620002d357600080fd5b60005b83811015620002f3578581018301518282018401528201620002d6565b83811115620003055760008385840101525b5095945050505050565b80516001600160a01b03811681146200032757600080fd5b919050565b600080600080600060a086880312156200034557600080fd5b85516001600160401b03808211156200035d57600080fd5b6200036b89838a016200027a565b96506020915081880151818111156200038357600080fd5b620003918a828b016200027a565b965050604088015181811115620003a757600080fd5b620003b58a828b016200027a565b955050620003c6606089016200030f565b9350608088015181811115620003db57600080fd5b8801601f81018a13620003ed57600080fd5b80518281111562000402576200040262000231565b8060051b92506200041584840162000247565b818152928201840192848101908c8511156200043057600080fd5b928501925b84841015620004595762000449846200030f565b8252928501929085019062000435565b8096505050505050509295509295909350565b634e487b7160e01b600052603260045260246000fd5b6000600019821415620004a557634e487b7160e01b600052601160045260246000fd5b5060010190565b600181811c90821680620004c157607f821691505b60208210811415620004e357634e487b7160e01b600052602260045260246000fd5b50919050565b61270280620004f96000396000f3fe608060405234801561001057600080fd5b50600436106102775760003560e01c80638da5cb5b11610160578063c87b56dd116100d8578063ebb02ab31161008c578063f46eccc411610071578063f46eccc414610517578063f7a885c91461053a578063fc0c546a1461054d57600080fd5b8063ebb02ab3146104fc578063f2fde38b1461050457600080fd5b8063d4cd296c116100bd578063d4cd296c146104cd578063d7224ba0146104e0578063e985e9c5146104e957600080fd5b8063c87b56dd146104b2578063cf956a93146104c557600080fd5b8063a22cb4651161012f578063b88d4fde11610114578063b88d4fde14610479578063c6b2dd9f1461048c578063c83072381461049f57600080fd5b8063a22cb46514610453578063b7f47d321461046657600080fd5b80638da5cb5b146104145780638f5ea8da1461042557806395d89b41146104385780639b9cf33b1461044057600080fd5b806342842e0e116101f357806368030618116101c257806370a08231116101a757806370a08231146103e6578063715018a6146103f95780638754101c1461040157600080fd5b806368030618146103a75780636c0360eb146103de57600080fd5b806342842e0e1461035b57806342966c681461036e57806355f804b3146103815780636352211e1461039457600080fd5b8063095ea7b31161024a57806318160ddd1161022f57806318160ddd1461031f578063225af1061461033557806323b872dd1461034857600080fd5b8063095ea7b3146102f7578063144fa6d71461030c57600080fd5b806301ffc9a71461027c57806302cfce4e146102a457806306fdde03146102c4578063081812fc146102cc575b600080fd5b61028f61028a366004611ea0565b610560565b60405190151581526020015b60405180910390f35b6102b76102b2366004611edb565b6105b2565b60405161029b9190611f4e565b6102b761066c565b6102df6102da366004611f61565b6106fe565b6040516001600160a01b03909116815260200161029b565b61030a610305366004611f8f565b610742565b005b61030a61031a366004611fbb565b6107d0565b610327610851565b60405190815260200161029b565b61030a610343366004611fd8565b610869565b61030a61035636600461201f565b610a48565b61030a61036936600461201f565b610a53565b61030a61037c366004611f61565b610a6e565b61030a61038f3660046120ff565b610aa1565b6102df6103a2366004611f61565b610b12565b6103cb6103b5366004611fbb565b600c6020526000908152604090205461ffff1681565b60405161ffff909116815260200161029b565b6102b7610b6b565b6103276103f4366004611fbb565b610bf9565b61030a610c3e565b61030a61040f3660046121cf565b610ca4565b6000546001600160a01b03166102df565b61030a6104333660046121cf565b610d9a565b6102b7610db5565b61030a61044e366004612231565b610dc4565b61030a610461366004612276565b610e34565b600a546102df906001600160a01b031681565b61030a6104873660046122cb565b610eca565b61030a61049a366004611f61565b610f04565b61030a6104ad366004612337565b610f67565b6102b76104c0366004611f61565b611032565b6103276110bc565b61030a6104db3660046123bb565b6110e9565b61032760085481565b61028f6104f73660046123e5565b6111ad565b61032761126e565b61030a610512366004611fbb565b6112b4565b61028f610525366004611fbb565b600d6020526000908152604090205460ff1681565b61030a61054836600461241e565b611393565b600b546102df906001600160a01b031681565b60006001600160e01b031982166380ac58cd60e01b148061059157506001600160e01b03198216635b5e139f60e01b145b806105ac57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606105c18261ffff1661146d565b6105de57604051631bcabe3360e01b815260040160405180910390fd5b61ffff82166000908152600e602052604090205460ff161561063357505060408051808201909152600581527f626c61636b000000000000000000000000000000000000000000000000000000602082015290565b505060408051808201909152600681527f73696c7665720000000000000000000000000000000000000000000000000000602082015290565b60606002805461067b9061249b565b80601f01602080910402602001604051908101604052809291908181526020018280546106a79061249b565b80156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b5050505050905090565b60006107098261146d565b610726576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061074d82610b12565b9050806001600160a01b0316836001600160a01b031614156107825760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906107a257506107a081336111ad565b155b156107c0576040516367d9dca160e11b815260040160405180910390fd5b6107cb8383836114a9565b505050565b6000546001600160a01b0316331461082f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600061085e61dead610bf9565b600180540303905090565b336000908152600d602052604090205460ff16610899576040516308db091b60e31b815260040160405180910390fd5b6108a382846124ec565b61ffff166108c457604051632d04645160e21b815260040160405180910390fd5b600b546001805461ffff600160a01b840481169387821693600160c01b909104909116916108f29190612512565b6108fc9190612512565b6109069190612529565b11156109255760405163dd0c7bc960e01b815260040160405180910390fd5b600b5461ffff600160b01b8204811691610948918591600160c01b9004166124ec565b61ffff16111561096b5760405163dc46a6a760e01b815260040160405180910390fd5b61ffff821615610a215781600b60188282829054906101000a900461ffff1661099491906124ec565b92506101000a81548161ffff021916908361ffff1602179055506000836001546109be91906124ec565b905060005b8361ffff168161ffff161015610a1e576001600e6000846109e381612541565b61ffff9190911682526020820192909252604001600020805460ff191692151592909217909155915080610a1681612541565b9150506109c3565b50505b6107cb81610a2f84866124ec565b61ffff1660405180602001604052806000815250611505565b6107cb838383611512565b6107cb83838360405180602001604052806000815250610eca565b610a7833826116f4565b610a955760405163871b97e160e01b815260040160405180910390fd5b610a9e8161174b565b50565b6000546001600160a01b03163314610afb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610826565b8051610b0e906009906020840190611df1565b5050565b6000610b1d8261146d565b610b3a57604051636f96cda160e11b815260040160405180910390fd5b815b6000818152600460205260409020546001600160a01b031691508115610b625750919050565b60001901610b3c565b60098054610b789061249b565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba49061249b565b8015610bf15780601f10610bc657610100808354040283529160200191610bf1565b820191906000526020600020905b815481529060010190602001808311610bd457829003601f168201915b505050505081565b60006001600160a01b038216610c22576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205490565b6000546001600160a01b03163314610c985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610826565b610ca2600061185d565b565b60005b81518161ffff161015610d3957610ce0335b838361ffff1681518110610ccf57610ccf612563565b602002602001015161ffff166116f4565b610cfd57604051632ce44b5f60e11b815260040160405180910390fd5b610d298484848461ffff1681518110610d1857610d18612563565b602002602001015161ffff16610a48565b610d3281612541565b9050610ca7565b50816001600160a01b0316836001600160a01b0316610d553390565b6001600160a01b03167f8c571b83e5c53de5e3553e1dfe0b14cdb8493ff2ee56ab3371b3d6614321d20484604051610d8d9190612579565b60405180910390a4505050565b6107cb83838360405180602001604052806000815250611393565b60606003805461067b9061249b565b60005b81518161ffff161015610b0e57610ddd33610cb9565b610dfa5760405163871b97e160e01b815260040160405180910390fd5b610e24828261ffff1681518110610e1357610e13612563565b602002602001015161ffff1661174b565b610e2d81612541565b9050610dc7565b6001600160a01b038216331415610e5e5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610ed5848484611512565b610ee1848484846118ad565b610efe576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6000546001600160a01b03163314610f5e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610826565b610a9e816119ac565b6000546001600160a01b03163314610fc15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610826565b60005b82811015610efe5781600d6000868685818110610fe357610fe3612563565b9050602002016020810190610ff89190611fbb565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061102a816125c1565b915050610fc4565b606061103d8261146d565b61105a57604051630a14c4b560e41b815260040160405180910390fd5b6000600980546110699061249b565b90501161108557604051806020016040528060008152506105ac565b61108d611ac6565b611096836105b2565b6040516020016110a79291906125dc565b60405160208183030381529060405292915050565b600b546000906110e09061ffff600160c01b8204811691600160b01b900416612633565b61ffff16905090565b6000546001600160a01b031633146111435760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610826565b600b80547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff16600160a01b61ffff948516027fffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff1617600160b01b9290931691909102919091179055565b600a5460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa1580156111ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112239190612656565b6001600160a01b0316141561123c5760019150506105ac565b6001600160a01b0380851660009081526007602090815260408083209387168352929052205460ff165b949350505050565b600b5460018054600092600160c01b900461ffff169161128d91612512565b6112979190612512565b600b546112af9190600160a01b900461ffff16612512565b905090565b6000546001600160a01b0316331461130e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610826565b6001600160a01b03811661138a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610826565b610a9e8161185d565b60005b825181101561140b576113b533848381518110610ccf57610ccf612563565b6113d257604051632ce44b5f60e11b815260040160405180910390fd5b6113fb85858584815181106113e9576113e9612563565b602002602001015161ffff1685610eca565b611404816125c1565b9050611396565b50826001600160a01b0316846001600160a01b03166114273390565b6001600160a01b03167f8c571b83e5c53de5e3553e1dfe0b14cdb8493ff2ee56ab3371b3d6614321d2048560405161145f9190612579565b60405180910390a450505050565b6000808211801561147f575060015482105b80156105ac57506000828152600460205260409020546001600160a01b031661dead141592915050565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6107cb8383836001611ad5565b600061151d82610b12565b90506000336001600160a01b038316148061153d575061153d82336111ad565b8061155857503361154d846106fe565b6001600160a01b0316145b90508061157857604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b0316826001600160a01b0316146115a95760405162a1148160e81b815260040160405180910390fd5b6001600160a01b0384166115d057604051633a954ecd60e21b815260040160405180910390fd5b6001600160a01b03841661dead14156115fc57604051630278d60f60e11b815260040160405180910390fd5b6116098585856001611c1a565b611615600084846114a9565b6001600160a01b038086166000908152600560209081526040808320805460001901905587841680845281842080546001908101909155888552600490935281842080546001600160a01b03191690911790559086018083529120549091166116aa576001548110156116aa57600081815260046020526040902080546001600160a01b0319166001600160a01b0385161790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60008061170083610b12565b9050806001600160a01b0316846001600160a01b0316148061173b5750836001600160a01b0316611730846106fe565b6001600160a01b0316145b80611266575061126681856111ad565b600061175682610b12565b9050611766816000846001611c1a565b611772600083836114a9565b6001600160a01b03808216600090815260056020908152604080832080546000190190557f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba80546001908101909155868452600490925280832080546001600160a01b03191661dead1790559085018083529120549091166118205760015481101561182057600081815260046020526040902080546001600160a01b0319166001600160a01b0384161790555b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b156119a157604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906118f1903390899088908890600401612673565b6020604051808303816000875af192505050801561192c575060408051601f3d908101601f19168201909252611929918101906126af565b60015b611987573d80801561195a576040519150601f19603f3d011682016040523d82523d6000602084013e61195f565b606091505b50805161197f576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611266565b506001949350505050565b806119ca576040516356be441560e01b815260040160405180910390fd5b600154600114156119ee5760405163c0367cab60e01b815260040160405180910390fd5b6008546001548110611a1357604051630a596e2160e21b815260040160405180910390fd5b6001548282016000198101911015611a2e5750600154600019015b815b818111611abb576000818152600460205260409020546001600160a01b0316158015611a7557506000818152600460205260409020546001600160a01b031661dead14155b15611ab3576000611a8582610b12565b600083815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055505b600101611a30565b506001016008555050565b60606009805461067b9061249b565b6001546001600160a01b038516611afe57604051622e076360e81b815260040160405180910390fd5b6001600160a01b03851661dead1415611b2a57604051631617320f60e01b815260040160405180910390fd5b83611b485760405163b562e8dd60e01b815260040160405180910390fd5b611b556000868387611c1a565b6001600160a01b03851660008181526005602090815260408083208054890190558483526004909152812080546001600160a01b03191690921790915581905b85811015611c115760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315611c0557611be860008884886118ad565b611c05576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101611b95565b506001556116ed565b600b546001600160a01b031615611cea57600b54604051635fd6196560e01b81526001600160a01b03868116600483015290911690635fd6196590602401600060405180830381600087803b158015611c7257600080fd5b505af1158015611c86573d6000803e3d6000fd5b5050600b54604051635fd6196560e01b81526001600160a01b0387811660048301529091169250635fd619659150602401600060405180830381600087803b158015611cd157600080fd5b505af1158015611ce5573d6000803e3d6000fd5b505050505b6000825b611cf88385612529565b8161ffff161015611d3f5761ffff81166000908152600e602052604090205460ff1615611d2d57611d2a6001836124ec565b91505b80611d3781612541565b915050611cee565b506001600160a01b03851615611d96576001600160a01b0385166000908152600c602052604081208054839290611d7b90849061ffff16612633565b92506101000a81548161ffff021916908361ffff1602179055505b6001600160a01b03841615611dec576001600160a01b0384166000908152600c602052604081208054839290611dd190849061ffff166124ec565b92506101000a81548161ffff021916908361ffff1602179055505b6116ed565b828054611dfd9061249b565b90600052602060002090601f016020900481019282611e1f5760008555611e65565b82601f10611e3857805160ff1916838001178555611e65565b82800160010185558215611e65579182015b82811115611e65578251825591602001919060010190611e4a565b50611e71929150611e75565b5090565b5b80821115611e715760008155600101611e76565b6001600160e01b031981168114610a9e57600080fd5b600060208284031215611eb257600080fd5b8135611ebd81611e8a565b9392505050565b803561ffff81168114611ed657600080fd5b919050565b600060208284031215611eed57600080fd5b611ebd82611ec4565b60005b83811015611f11578181015183820152602001611ef9565b83811115610efe5750506000910152565b60008151808452611f3a816020860160208601611ef6565b601f01601f19169290920160200192915050565b602081526000611ebd6020830184611f22565b600060208284031215611f7357600080fd5b5035919050565b6001600160a01b0381168114610a9e57600080fd5b60008060408385031215611fa257600080fd5b8235611fad81611f7a565b946020939093013593505050565b600060208284031215611fcd57600080fd5b8135611ebd81611f7a565b600080600060608486031215611fed57600080fd5b611ff684611ec4565b925061200460208501611ec4565b9150604084013561201481611f7a565b809150509250925092565b60008060006060848603121561203457600080fd5b833561203f81611f7a565b9250602084013561204f81611f7a565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561209f5761209f612060565b604052919050565b600067ffffffffffffffff8311156120c1576120c1612060565b6120d4601f8401601f1916602001612076565b90508281528383830111156120e857600080fd5b828260208301376000602084830101529392505050565b60006020828403121561211157600080fd5b813567ffffffffffffffff81111561212857600080fd5b8201601f8101841361213957600080fd5b611266848235602084016120a7565b600082601f83011261215957600080fd5b8135602067ffffffffffffffff82111561217557612175612060565b8160051b612184828201612076565b928352848101820192828101908785111561219e57600080fd5b83870192505b848310156121c4576121b583611ec4565b825291830191908301906121a4565b979650505050505050565b6000806000606084860312156121e457600080fd5b83356121ef81611f7a565b925060208401356121ff81611f7a565b9150604084013567ffffffffffffffff81111561221b57600080fd5b61222786828701612148565b9150509250925092565b60006020828403121561224357600080fd5b813567ffffffffffffffff81111561225a57600080fd5b61126684828501612148565b80358015158114611ed657600080fd5b6000806040838503121561228957600080fd5b823561229481611f7a565b91506122a260208401612266565b90509250929050565b600082601f8301126122bc57600080fd5b611ebd838335602085016120a7565b600080600080608085870312156122e157600080fd5b84356122ec81611f7a565b935060208501356122fc81611f7a565b925060408501359150606085013567ffffffffffffffff81111561231f57600080fd5b61232b878288016122ab565b91505092959194509250565b60008060006040848603121561234c57600080fd5b833567ffffffffffffffff8082111561236457600080fd5b818601915086601f83011261237857600080fd5b81358181111561238757600080fd5b8760208260051b850101111561239c57600080fd5b6020928301955093506123b29186019050612266565b90509250925092565b600080604083850312156123ce57600080fd5b6123d783611ec4565b91506122a260208401611ec4565b600080604083850312156123f857600080fd5b823561240381611f7a565b9150602083013561241381611f7a565b809150509250929050565b6000806000806080858703121561243457600080fd5b843561243f81611f7a565b9350602085013561244f81611f7a565b9250604085013567ffffffffffffffff8082111561246c57600080fd5b61247888838901612148565b9350606087013591508082111561248e57600080fd5b5061232b878288016122ab565b600181811c908216806124af57607f821691505b602082108114156124d057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600061ffff808316818516808303821115612509576125096124d6565b01949350505050565b600082821015612524576125246124d6565b500390565b6000821982111561253c5761253c6124d6565b500190565b600061ffff80831681811415612559576125596124d6565b6001019392505050565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b818110156125b557835161ffff1683529284019291840191600101612595565b50909695505050505050565b60006000198214156125d5576125d56124d6565b5060010190565b600083516125ee818460208801611ef6565b835190830190612602818360208801611ef6565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b600061ffff8381169083168181101561264e5761264e6124d6565b039392505050565b60006020828403121561266857600080fd5b8151611ebd81611f7a565b60006001600160a01b038087168352808616602084015250836040830152608060608301526126a56080830184611f22565b9695505050505050565b6000602082840312156126c157600080fd5b8151611ebd81611e8a56fea264697066735822122017ab764a21de809f024ab1775d3eaf75d27f9bb30b70a441cc312633746fa02b64736f6c634300080b003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c10000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000644414f426e420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000644414f424e4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d6354615468397465744c72454636414e6252554e635168357933665a4b437439534e76325a545a3656354d512f000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102775760003560e01c80638da5cb5b11610160578063c87b56dd116100d8578063ebb02ab31161008c578063f46eccc411610071578063f46eccc414610517578063f7a885c91461053a578063fc0c546a1461054d57600080fd5b8063ebb02ab3146104fc578063f2fde38b1461050457600080fd5b8063d4cd296c116100bd578063d4cd296c146104cd578063d7224ba0146104e0578063e985e9c5146104e957600080fd5b8063c87b56dd146104b2578063cf956a93146104c557600080fd5b8063a22cb4651161012f578063b88d4fde11610114578063b88d4fde14610479578063c6b2dd9f1461048c578063c83072381461049f57600080fd5b8063a22cb46514610453578063b7f47d321461046657600080fd5b80638da5cb5b146104145780638f5ea8da1461042557806395d89b41146104385780639b9cf33b1461044057600080fd5b806342842e0e116101f357806368030618116101c257806370a08231116101a757806370a08231146103e6578063715018a6146103f95780638754101c1461040157600080fd5b806368030618146103a75780636c0360eb146103de57600080fd5b806342842e0e1461035b57806342966c681461036e57806355f804b3146103815780636352211e1461039457600080fd5b8063095ea7b31161024a57806318160ddd1161022f57806318160ddd1461031f578063225af1061461033557806323b872dd1461034857600080fd5b8063095ea7b3146102f7578063144fa6d71461030c57600080fd5b806301ffc9a71461027c57806302cfce4e146102a457806306fdde03146102c4578063081812fc146102cc575b600080fd5b61028f61028a366004611ea0565b610560565b60405190151581526020015b60405180910390f35b6102b76102b2366004611edb565b6105b2565b60405161029b9190611f4e565b6102b761066c565b6102df6102da366004611f61565b6106fe565b6040516001600160a01b03909116815260200161029b565b61030a610305366004611f8f565b610742565b005b61030a61031a366004611fbb565b6107d0565b610327610851565b60405190815260200161029b565b61030a610343366004611fd8565b610869565b61030a61035636600461201f565b610a48565b61030a61036936600461201f565b610a53565b61030a61037c366004611f61565b610a6e565b61030a61038f3660046120ff565b610aa1565b6102df6103a2366004611f61565b610b12565b6103cb6103b5366004611fbb565b600c6020526000908152604090205461ffff1681565b60405161ffff909116815260200161029b565b6102b7610b6b565b6103276103f4366004611fbb565b610bf9565b61030a610c3e565b61030a61040f3660046121cf565b610ca4565b6000546001600160a01b03166102df565b61030a6104333660046121cf565b610d9a565b6102b7610db5565b61030a61044e366004612231565b610dc4565b61030a610461366004612276565b610e34565b600a546102df906001600160a01b031681565b61030a6104873660046122cb565b610eca565b61030a61049a366004611f61565b610f04565b61030a6104ad366004612337565b610f67565b6102b76104c0366004611f61565b611032565b6103276110bc565b61030a6104db3660046123bb565b6110e9565b61032760085481565b61028f6104f73660046123e5565b6111ad565b61032761126e565b61030a610512366004611fbb565b6112b4565b61028f610525366004611fbb565b600d6020526000908152604090205460ff1681565b61030a61054836600461241e565b611393565b600b546102df906001600160a01b031681565b60006001600160e01b031982166380ac58cd60e01b148061059157506001600160e01b03198216635b5e139f60e01b145b806105ac57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606105c18261ffff1661146d565b6105de57604051631bcabe3360e01b815260040160405180910390fd5b61ffff82166000908152600e602052604090205460ff161561063357505060408051808201909152600581527f626c61636b000000000000000000000000000000000000000000000000000000602082015290565b505060408051808201909152600681527f73696c7665720000000000000000000000000000000000000000000000000000602082015290565b60606002805461067b9061249b565b80601f01602080910402602001604051908101604052809291908181526020018280546106a79061249b565b80156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b5050505050905090565b60006107098261146d565b610726576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061074d82610b12565b9050806001600160a01b0316836001600160a01b031614156107825760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906107a257506107a081336111ad565b155b156107c0576040516367d9dca160e11b815260040160405180910390fd5b6107cb8383836114a9565b505050565b6000546001600160a01b0316331461082f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600061085e61dead610bf9565b600180540303905090565b336000908152600d602052604090205460ff16610899576040516308db091b60e31b815260040160405180910390fd5b6108a382846124ec565b61ffff166108c457604051632d04645160e21b815260040160405180910390fd5b600b546001805461ffff600160a01b840481169387821693600160c01b909104909116916108f29190612512565b6108fc9190612512565b6109069190612529565b11156109255760405163dd0c7bc960e01b815260040160405180910390fd5b600b5461ffff600160b01b8204811691610948918591600160c01b9004166124ec565b61ffff16111561096b5760405163dc46a6a760e01b815260040160405180910390fd5b61ffff821615610a215781600b60188282829054906101000a900461ffff1661099491906124ec565b92506101000a81548161ffff021916908361ffff1602179055506000836001546109be91906124ec565b905060005b8361ffff168161ffff161015610a1e576001600e6000846109e381612541565b61ffff9190911682526020820192909252604001600020805460ff191692151592909217909155915080610a1681612541565b9150506109c3565b50505b6107cb81610a2f84866124ec565b61ffff1660405180602001604052806000815250611505565b6107cb838383611512565b6107cb83838360405180602001604052806000815250610eca565b610a7833826116f4565b610a955760405163871b97e160e01b815260040160405180910390fd5b610a9e8161174b565b50565b6000546001600160a01b03163314610afb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610826565b8051610b0e906009906020840190611df1565b5050565b6000610b1d8261146d565b610b3a57604051636f96cda160e11b815260040160405180910390fd5b815b6000818152600460205260409020546001600160a01b031691508115610b625750919050565b60001901610b3c565b60098054610b789061249b565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba49061249b565b8015610bf15780601f10610bc657610100808354040283529160200191610bf1565b820191906000526020600020905b815481529060010190602001808311610bd457829003601f168201915b505050505081565b60006001600160a01b038216610c22576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205490565b6000546001600160a01b03163314610c985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610826565b610ca2600061185d565b565b60005b81518161ffff161015610d3957610ce0335b838361ffff1681518110610ccf57610ccf612563565b602002602001015161ffff166116f4565b610cfd57604051632ce44b5f60e11b815260040160405180910390fd5b610d298484848461ffff1681518110610d1857610d18612563565b602002602001015161ffff16610a48565b610d3281612541565b9050610ca7565b50816001600160a01b0316836001600160a01b0316610d553390565b6001600160a01b03167f8c571b83e5c53de5e3553e1dfe0b14cdb8493ff2ee56ab3371b3d6614321d20484604051610d8d9190612579565b60405180910390a4505050565b6107cb83838360405180602001604052806000815250611393565b60606003805461067b9061249b565b60005b81518161ffff161015610b0e57610ddd33610cb9565b610dfa5760405163871b97e160e01b815260040160405180910390fd5b610e24828261ffff1681518110610e1357610e13612563565b602002602001015161ffff1661174b565b610e2d81612541565b9050610dc7565b6001600160a01b038216331415610e5e5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610ed5848484611512565b610ee1848484846118ad565b610efe576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6000546001600160a01b03163314610f5e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610826565b610a9e816119ac565b6000546001600160a01b03163314610fc15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610826565b60005b82811015610efe5781600d6000868685818110610fe357610fe3612563565b9050602002016020810190610ff89190611fbb565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061102a816125c1565b915050610fc4565b606061103d8261146d565b61105a57604051630a14c4b560e41b815260040160405180910390fd5b6000600980546110699061249b565b90501161108557604051806020016040528060008152506105ac565b61108d611ac6565b611096836105b2565b6040516020016110a79291906125dc565b60405160208183030381529060405292915050565b600b546000906110e09061ffff600160c01b8204811691600160b01b900416612633565b61ffff16905090565b6000546001600160a01b031633146111435760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610826565b600b80547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff16600160a01b61ffff948516027fffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff1617600160b01b9290931691909102919091179055565b600a5460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa1580156111ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112239190612656565b6001600160a01b0316141561123c5760019150506105ac565b6001600160a01b0380851660009081526007602090815260408083209387168352929052205460ff165b949350505050565b600b5460018054600092600160c01b900461ffff169161128d91612512565b6112979190612512565b600b546112af9190600160a01b900461ffff16612512565b905090565b6000546001600160a01b0316331461130e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610826565b6001600160a01b03811661138a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610826565b610a9e8161185d565b60005b825181101561140b576113b533848381518110610ccf57610ccf612563565b6113d257604051632ce44b5f60e11b815260040160405180910390fd5b6113fb85858584815181106113e9576113e9612563565b602002602001015161ffff1685610eca565b611404816125c1565b9050611396565b50826001600160a01b0316846001600160a01b03166114273390565b6001600160a01b03167f8c571b83e5c53de5e3553e1dfe0b14cdb8493ff2ee56ab3371b3d6614321d2048560405161145f9190612579565b60405180910390a450505050565b6000808211801561147f575060015482105b80156105ac57506000828152600460205260409020546001600160a01b031661dead141592915050565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6107cb8383836001611ad5565b600061151d82610b12565b90506000336001600160a01b038316148061153d575061153d82336111ad565b8061155857503361154d846106fe565b6001600160a01b0316145b90508061157857604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b0316826001600160a01b0316146115a95760405162a1148160e81b815260040160405180910390fd5b6001600160a01b0384166115d057604051633a954ecd60e21b815260040160405180910390fd5b6001600160a01b03841661dead14156115fc57604051630278d60f60e11b815260040160405180910390fd5b6116098585856001611c1a565b611615600084846114a9565b6001600160a01b038086166000908152600560209081526040808320805460001901905587841680845281842080546001908101909155888552600490935281842080546001600160a01b03191690911790559086018083529120549091166116aa576001548110156116aa57600081815260046020526040902080546001600160a01b0319166001600160a01b0385161790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60008061170083610b12565b9050806001600160a01b0316846001600160a01b0316148061173b5750836001600160a01b0316611730846106fe565b6001600160a01b0316145b80611266575061126681856111ad565b600061175682610b12565b9050611766816000846001611c1a565b611772600083836114a9565b6001600160a01b03808216600090815260056020908152604080832080546000190190557f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba80546001908101909155868452600490925280832080546001600160a01b03191661dead1790559085018083529120549091166118205760015481101561182057600081815260046020526040902080546001600160a01b0319166001600160a01b0384161790555b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b156119a157604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906118f1903390899088908890600401612673565b6020604051808303816000875af192505050801561192c575060408051601f3d908101601f19168201909252611929918101906126af565b60015b611987573d80801561195a576040519150601f19603f3d011682016040523d82523d6000602084013e61195f565b606091505b50805161197f576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611266565b506001949350505050565b806119ca576040516356be441560e01b815260040160405180910390fd5b600154600114156119ee5760405163c0367cab60e01b815260040160405180910390fd5b6008546001548110611a1357604051630a596e2160e21b815260040160405180910390fd5b6001548282016000198101911015611a2e5750600154600019015b815b818111611abb576000818152600460205260409020546001600160a01b0316158015611a7557506000818152600460205260409020546001600160a01b031661dead14155b15611ab3576000611a8582610b12565b600083815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055505b600101611a30565b506001016008555050565b60606009805461067b9061249b565b6001546001600160a01b038516611afe57604051622e076360e81b815260040160405180910390fd5b6001600160a01b03851661dead1415611b2a57604051631617320f60e01b815260040160405180910390fd5b83611b485760405163b562e8dd60e01b815260040160405180910390fd5b611b556000868387611c1a565b6001600160a01b03851660008181526005602090815260408083208054890190558483526004909152812080546001600160a01b03191690921790915581905b85811015611c115760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315611c0557611be860008884886118ad565b611c05576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101611b95565b506001556116ed565b600b546001600160a01b031615611cea57600b54604051635fd6196560e01b81526001600160a01b03868116600483015290911690635fd6196590602401600060405180830381600087803b158015611c7257600080fd5b505af1158015611c86573d6000803e3d6000fd5b5050600b54604051635fd6196560e01b81526001600160a01b0387811660048301529091169250635fd619659150602401600060405180830381600087803b158015611cd157600080fd5b505af1158015611ce5573d6000803e3d6000fd5b505050505b6000825b611cf88385612529565b8161ffff161015611d3f5761ffff81166000908152600e602052604090205460ff1615611d2d57611d2a6001836124ec565b91505b80611d3781612541565b915050611cee565b506001600160a01b03851615611d96576001600160a01b0385166000908152600c602052604081208054839290611d7b90849061ffff16612633565b92506101000a81548161ffff021916908361ffff1602179055505b6001600160a01b03841615611dec576001600160a01b0384166000908152600c602052604081208054839290611dd190849061ffff166124ec565b92506101000a81548161ffff021916908361ffff1602179055505b6116ed565b828054611dfd9061249b565b90600052602060002090601f016020900481019282611e1f5760008555611e65565b82601f10611e3857805160ff1916838001178555611e65565b82800160010185558215611e65579182015b82811115611e65578251825591602001919060010190611e4a565b50611e71929150611e75565b5090565b5b80821115611e715760008155600101611e76565b6001600160e01b031981168114610a9e57600080fd5b600060208284031215611eb257600080fd5b8135611ebd81611e8a565b9392505050565b803561ffff81168114611ed657600080fd5b919050565b600060208284031215611eed57600080fd5b611ebd82611ec4565b60005b83811015611f11578181015183820152602001611ef9565b83811115610efe5750506000910152565b60008151808452611f3a816020860160208601611ef6565b601f01601f19169290920160200192915050565b602081526000611ebd6020830184611f22565b600060208284031215611f7357600080fd5b5035919050565b6001600160a01b0381168114610a9e57600080fd5b60008060408385031215611fa257600080fd5b8235611fad81611f7a565b946020939093013593505050565b600060208284031215611fcd57600080fd5b8135611ebd81611f7a565b600080600060608486031215611fed57600080fd5b611ff684611ec4565b925061200460208501611ec4565b9150604084013561201481611f7a565b809150509250925092565b60008060006060848603121561203457600080fd5b833561203f81611f7a565b9250602084013561204f81611f7a565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561209f5761209f612060565b604052919050565b600067ffffffffffffffff8311156120c1576120c1612060565b6120d4601f8401601f1916602001612076565b90508281528383830111156120e857600080fd5b828260208301376000602084830101529392505050565b60006020828403121561211157600080fd5b813567ffffffffffffffff81111561212857600080fd5b8201601f8101841361213957600080fd5b611266848235602084016120a7565b600082601f83011261215957600080fd5b8135602067ffffffffffffffff82111561217557612175612060565b8160051b612184828201612076565b928352848101820192828101908785111561219e57600080fd5b83870192505b848310156121c4576121b583611ec4565b825291830191908301906121a4565b979650505050505050565b6000806000606084860312156121e457600080fd5b83356121ef81611f7a565b925060208401356121ff81611f7a565b9150604084013567ffffffffffffffff81111561221b57600080fd5b61222786828701612148565b9150509250925092565b60006020828403121561224357600080fd5b813567ffffffffffffffff81111561225a57600080fd5b61126684828501612148565b80358015158114611ed657600080fd5b6000806040838503121561228957600080fd5b823561229481611f7a565b91506122a260208401612266565b90509250929050565b600082601f8301126122bc57600080fd5b611ebd838335602085016120a7565b600080600080608085870312156122e157600080fd5b84356122ec81611f7a565b935060208501356122fc81611f7a565b925060408501359150606085013567ffffffffffffffff81111561231f57600080fd5b61232b878288016122ab565b91505092959194509250565b60008060006040848603121561234c57600080fd5b833567ffffffffffffffff8082111561236457600080fd5b818601915086601f83011261237857600080fd5b81358181111561238757600080fd5b8760208260051b850101111561239c57600080fd5b6020928301955093506123b29186019050612266565b90509250925092565b600080604083850312156123ce57600080fd5b6123d783611ec4565b91506122a260208401611ec4565b600080604083850312156123f857600080fd5b823561240381611f7a565b9150602083013561241381611f7a565b809150509250929050565b6000806000806080858703121561243457600080fd5b843561243f81611f7a565b9350602085013561244f81611f7a565b9250604085013567ffffffffffffffff8082111561246c57600080fd5b61247888838901612148565b9350606087013591508082111561248e57600080fd5b5061232b878288016122ab565b600181811c908216806124af57607f821691505b602082108114156124d057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600061ffff808316818516808303821115612509576125096124d6565b01949350505050565b600082821015612524576125246124d6565b500390565b6000821982111561253c5761253c6124d6565b500190565b600061ffff80831681811415612559576125596124d6565b6001019392505050565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b818110156125b557835161ffff1683529284019291840191600101612595565b50909695505050505050565b60006000198214156125d5576125d56124d6565b5060010190565b600083516125ee818460208801611ef6565b835190830190612602818360208801611ef6565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b600061ffff8381169083168181101561264e5761264e6124d6565b039392505050565b60006020828403121561266857600080fd5b8151611ebd81611f7a565b60006001600160a01b038087168352808616602084015250836040830152608060608301526126a56080830184611f22565b9695505050505050565b6000602082840312156126c157600080fd5b8151611ebd81611e8a56fea264697066735822122017ab764a21de809f024ab1775d3eaf75d27f9bb30b70a441cc312633746fa02b64736f6c634300080b0033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c10000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000644414f426e420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000644414f424e4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d6354615468397465744c72454636414e6252554e635168357933665a4b437439534e76325a545a3656354d512f000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): DAOBnB
Arg [1] : symbol_ (string): DAOBNB
Arg [2] : _initialBaseURI (string): ipfs://QmcTaTh9tetLrEF6ANbRUNcQh5y3fZKCt9SNv2ZTZ6V5MQ/
Arg [3] : _openSeaProxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1

-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [6] : 44414f426e420000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [8] : 44414f424e420000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [10] : 697066733a2f2f516d6354615468397465744c72454636414e6252554e635168
Arg [11] : 357933665a4b437439534e76325a545a3656354d512f00000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

44240:6054:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25037:305;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;25037:305:0;;;;;;;;45904:272;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;26136:100::-;;;:::i;27613:212::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2045:55:1;;;2027:74;;2015:2;2000:18;27613:212:0;1881:226:1;27202:345:0;;;;;;:::i;:::-;;:::i;:::-;;50016:85;;;;;;:::i;:::-;;:::i;24676:289::-;;;:::i;:::-;;;3004:25:1;;;2992:2;2977:18;24676:289:0;2858:177:1;47537:833:0;;;;;;:::i;:::-;;:::i;28486:170::-;;;;;;:::i;:::-;;:::i;28727:185::-;;;;;;:::i;:::-;;:::i;40940:176::-;;;;;;:::i;:::-;;:::i;49338:106::-;;;;;;:::i;:::-;;:::i;25662:407::-;;;;;;:::i;:::-;;:::i;44757:50::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5603:6:1;5591:19;;;5573:38;;5561:2;5546:18;44757:50:0;5429:188:1;44434:21:0;;;:::i;25406:194::-;;;;;;:::i;:::-;;:::i;2713:103::-;;;:::i;42410:427::-;;;;;;:::i;:::-;;:::i;2062:87::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;2062:87;;42922:196;;;;;;:::i;:::-;;:::i;26305:104::-;;;:::i;41477:273::-;;;;;;:::i;:::-;;:::i;27897:287::-;;;;;;:::i;:::-;;:::i;44502:42::-;;;;;-1:-1:-1;;;;;44502:42:0;;;28983:316;;;;;;:::i;:::-;;:::i;50185:106::-;;;;;;:::i;:::-;;:::i;49515:205::-;;;;;;:::i;:::-;;:::i;47065:393::-;;;;;;:::i;:::-;;:::i;45710:114::-;;;:::i;49782:172::-;;;;;;:::i;:::-;;:::i;39223:43::-;;;;;;46288:508;;;;;;:::i;:::-;;:::i;45504:137::-;;;:::i;2971:201::-;;;;;;:::i;:::-;;:::i;44849:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;43203:472;;;;;;:::i;:::-;;:::i;44579:19::-;;;;;-1:-1:-1;;;;;44579:19:0;;;25037:305;25139:4;-1:-1:-1;;;;;;25176:40:0;;-1:-1:-1;;;25176:40:0;;:105;;-1:-1:-1;;;;;;;25233:48:0;;-1:-1:-1;;;25233:48:0;25176:105;:158;;;-1:-1:-1;;;;;;;;;;22452:40:0;;;25298:36;25156:178;25037:305;-1:-1:-1;;25037:305:0:o;45904:272::-;45964:13;45995:16;46003:7;45995:16;;:7;:16::i;:::-;45990:64;;46020:34;;-1:-1:-1;;;46020:34:0;;;;;;;;;;;45990:64;46071:27;;;;;;;:18;:27;;;;;;;;46067:74;;;-1:-1:-1;;46115:14:0;;;;;;;;;;;;;;;;;;45904:272::o;46067:74::-;-1:-1:-1;;46153:15:0;;;;;;;;;;;;;;;;;;45904:272::o;26136:100::-;26190:13;26223:5;26216:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26136:100;:::o;27613:212::-;27689:7;27714:16;27722:7;27714;:16::i;:::-;27709:64;;27739:34;;-1:-1:-1;;;27739:34:0;;;;;;;;;;;27709:64;-1:-1:-1;27793:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27793:24:0;;27613:212::o;27202:345::-;27283:13;27299:16;27307:7;27299;:16::i;:::-;27283:32;;27336:5;-1:-1:-1;;;;;27330:11:0;:2;-1:-1:-1;;;;;27330:11:0;;27326:48;;;27350:24;;-1:-1:-1;;;27350:24:0;;;;;;;;;;;27326:48;860:10;-1:-1:-1;;;;;27391:21:0;;;;;;:63;;-1:-1:-1;27417:37:0;27434:5;860:10;46288:508;:::i;27417:37::-;27416:38;27391:63;27387:111;;;27463:35;;-1:-1:-1;;;27463:35:0;;;;;;;;;;;27387:111;27511:28;27520:2;27524:7;27533:5;27511:8;:28::i;:::-;27272:275;27202:345;;:::o;50016:85::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;11730:2:1;2274:68:0;;;11712:21:1;;;11749:18;;;11742:30;11808:34;11788:18;;;11781:62;11860:18;;2274:68:0;;;;;;;;;50079:5:::1;:14:::0;;-1:-1:-1;;;;;;50079:14:0::1;-1:-1:-1::0;;;;;50079:14:0;;;::::1;::::0;;;::::1;::::0;;50016:85::o;24676:289::-;24728:7;24922:20;24433:42;24922:9;:20::i;:::-;24917:1;24902:12;;:16;24901:41;24894:48;;24676:289;:::o;47537:833::-;47644:10;47636:19;;;;:7;:19;;;;;;;;47632:52;;47664:20;;-1:-1:-1;;;47664:20:0;;;;;;;;;;;47632:52;47698:36;47718:16;47698:17;:36;:::i;:::-;:41;;47695:75;;47748:22;;-1:-1:-1;;;47748:22:0;;;;;;;;;;;47695:75;47842:14;;47799:1;47784:12;;47842:14;-1:-1:-1;;;47842:14:0;;;;;47784:55;;;;-1:-1:-1;;;47803:16:0;;;;;;;47784;;47799:1;47784:16;:::i;:::-;:35;;;;:::i;:::-;:55;;;;:::i;:::-;:72;47781:106;;;47865:22;;-1:-1:-1;;;47865:22:0;;;;;;;;;;;47781:106;47939:13;;;-1:-1:-1;;;47939:13:0;;;;;47901:35;;47920:16;;-1:-1:-1;;;47901:16:0;;;:35;:::i;:::-;:51;;;47898:84;;;47961:21;;-1:-1:-1;;;47961:21:0;;;;;;;;;;;47898:84;47999:20;;;;47995:292;;48056:16;48036;;:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;48089:14;48129:17;48113:12;;48106:40;;;;:::i;:::-;48089:57;;48168:8;48163:113;48182:16;48178:20;;:1;:20;;;48163:113;;;48256:4;48224:18;:29;48243:9;;;;:::i;:::-;48224:29;;;;;;;;;;;;;;;;-1:-1:-1;48224:29:0;:36;;-1:-1:-1;;48224:36:0;;;;;;;;;;;:29;-1:-1:-1;48200:3:0;;;;:::i;:::-;;;;48163:113;;;;48021:266;47995:292;48307:55;48317:2;48321:36;48341:16;48321:17;:36;:::i;:::-;48307:55;;;;;;;;;;;;;;:9;:55::i;28486:170::-;28620:28;28630:4;28636:2;28640:7;28620:9;:28::i;28727:185::-;28865:39;28882:4;28888:2;28892:7;28865:39;;;;;;;;;;;;:16;:39::i;40940:176::-;41002:41;860:10;41035:7;41002:18;:41::i;:::-;40997:86;;41052:31;;-1:-1:-1;;;41052:31:0;;;;;;;;;;;40997:86;41094:14;41100:7;41094:5;:14::i;:::-;40940:176;:::o;49338:106::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;11730:2:1;2274:68:0;;;11712:21:1;;;11749:18;;;11742:30;11808:34;11788:18;;;11781:62;11860:18;;2274:68:0;11528:356:1;2274:68:0;49415:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;49338:106:::0;:::o;25662:407::-;25734:13;25765:16;25773:7;25765;:16::i;:::-;25760:61;;25790:31;;-1:-1:-1;;;25790:31:0;;;;;;;;;;;25760:61;25879:7;25859:192;25924:13;;;;:7;:13;;;;;;-1:-1:-1;;;;;25924:13:0;;-1:-1:-1;25960:19:0;;25956:80;;26004:12;25662:407;;;:::o;25956:80::-;-1:-1:-1;;25889:6:0;25859:192;;44434:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25406:194::-;25478:7;-1:-1:-1;;;;;25502:19:0;;25498:60;;25530:28;;-1:-1:-1;;;25530:28:0;;;;;;;;;;;25498:60;-1:-1:-1;;;;;;25576:16:0;;;;;:9;:16;;;;;;;25406:194::o;2713:103::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;11730:2:1;2274:68:0;;;11712:21:1;;;11749:18;;;11742:30;11808:34;11788:18;;;11781:62;11860:18;;2274:68:0;11528:356:1;2274:68:0;2778:30:::1;2805:1;2778:18;:30::i;:::-;2713:103::o:0;42410:427::-;42554:8;42549:216;42572:8;:15;42568:1;:19;;;42549:216;;;42614:45;860:10;42633:12;42647:8;42656:1;42647:11;;;;;;;;;;:::i;:::-;;;;;;;42614:45;;:18;:45::i;:::-;42609:94;;42668:35;;-1:-1:-1;;;42668:35:0;;;;;;;;;;;42609:94;42718:35;42731:4;42737:2;42741:8;42750:1;42741:11;;;;;;;;;;:::i;:::-;;;;;;;42718:35;;:12;:35::i;:::-;42589:3;;;:::i;:::-;;;42549:216;;;;42816:2;-1:-1:-1;;;;;42782:47:0;42810:4;-1:-1:-1;;;;;42782:47:0;42796:12;860:10;;780:98;42796:12;-1:-1:-1;;;;;42782:47:0;;42820:8;42782:47;;;;;;:::i;:::-;;;;;;;;42410:427;;;:::o;42922:196::-;43065:45;43087:4;43093:2;43097:8;43065:45;;;;;;;;;;;;:21;:45::i;26305:104::-;26361:13;26394:7;26387:14;;;;;:::i;41477:273::-;41553:8;41548:195;41571:8;:15;41567:1;:19;;;41548:195;;;41613:45;860:10;41632:12;780:98;41613:45;41608:90;;41667:31;;-1:-1:-1;;;41667:31:0;;;;;;;;;;;41608:90;41713:18;41719:8;41728:1;41719:11;;;;;;;;;;:::i;:::-;;;;;;;41713:18;;:5;:18::i;:::-;41588:3;;;:::i;:::-;;;41548:195;;27897:287;-1:-1:-1;;;;;27996:24:0;;860:10;27996:24;27992:54;;;28029:17;;-1:-1:-1;;;28029:17:0;;;;;;;;;;;27992:54;860:10;28059:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;28059:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;28059:53:0;;;;;;;;;;28128:48;;540:41:1;;;28059:42:0;;860:10;28128:48;;513:18:1;28128:48:0;;;;;;;27897:287;;:::o;28983:316::-;29150:28;29160:4;29166:2;29170:7;29150:9;:28::i;:::-;29194:48;29217:4;29223:2;29227:7;29236:5;29194:22;:48::i;:::-;29189:102;;29251:40;;-1:-1:-1;;;29251:40:0;;;;;;;;;;;29189:102;28983:316;;;;:::o;50185:106::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;11730:2:1;2274:68:0;;;11712:21:1;;;11749:18;;;11742:30;11808:34;11788:18;;;11781:62;11860:18;;2274:68:0;11528:356:1;2274:68:0;50255:28:::1;50274:8;50255:18;:28::i;49515:205::-:0;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;11730:2:1;2274:68:0;;;11712:21:1;;;11749:18;;;11742:30;11808:34;11788:18;;;11781:62;11860:18;;2274:68:0;11528:356:1;2274:68:0;49613:9:::1;49609:104;49628:20:::0;;::::1;49609:104;;;49694:7;49670;:21;49678:9;;49688:1;49678:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;49670:21:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;49670:21:0;:31;;-1:-1:-1;;49670:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;49650:3;::::1;::::0;::::1;:::i;:::-;;;;49609:104;;47065:393:::0;47183:13;47219:16;47227:7;47219;:16::i;:::-;47214:59;;47244:29;;-1:-1:-1;;;47244:29:0;;;;;;;;;;;47214:59;47330:1;47312:7;47306:21;;;;;:::i;:::-;;;:25;:144;;;;;;;;;;;;;;;;;47375:10;:8;:10::i;:::-;47387:30;47408:7;47387:13;:30::i;:::-;47358:69;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47286:164;47065:393;-1:-1:-1;;47065:393:0:o;45710:114::-;45800:16;;45757:7;;45784:32;;45800:16;-1:-1:-1;;;45800:16:0;;;;;-1:-1:-1;;;45784:13:0;;;:32;:::i;:::-;45777:39;;;;45710:114;:::o;49782:172::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;11730:2:1;2274:68:0;;;11712:21:1;;;11749:18;;;11742:30;11808:34;11788:18;;;11781:62;11860:18;;2274:68:0;11528:356:1;2274:68:0;49881:14:::1;:28:::0;;49920:26;;-1:-1:-1;;;49881:28:0::1;::::0;;::::1;;49920:26:::0;;;-1:-1:-1;;;49920:26:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;49782:172::o;46288:508::-;46577:27;;46638:35;;-1:-1:-1;;;46638:35:0;;-1:-1:-1;;;;;2045:55:1;;;46638:35:0;;;2027:74:1;46413:4:0;;46577:27;;;46630:56;;;;46577:27;;46638:28;;2000:18:1;;46638:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46630:56:0;;46626:100;;;46710:4;46703:11;;;;;46626:100;-1:-1:-1;;;;;28376:25:0;;;28352:4;28376:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;46745:43;46738:50;46288:508;-1:-1:-1;;;;46288:508:0:o;45504:137::-;45616:16;;45612:1;45597:12;;45552:7;;-1:-1:-1;;;45616:16:0;;;;;45597;;;:::i;:::-;:35;;;;:::i;:::-;45579:14;;:54;;;-1:-1:-1;;;45579:14:0;;;;:54;:::i;:::-;45572:61;;45504:137;:::o;2971:201::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;11730:2:1;2274:68:0;;;11712:21:1;;;11749:18;;;11742:30;11808:34;11788:18;;;11781:62;11860:18;;2274:68:0;11528:356:1;2274:68:0;-1:-1:-1;;;;;3060:22:0;::::1;3052:73;;;::::0;-1:-1:-1;;;3052:73:0;;14993:2:1;3052:73:0::1;::::0;::::1;14975:21:1::0;15032:2;15012:18;;;15005:30;15071:34;15051:18;;;15044:62;15142:8;15122:18;;;15115:36;15168:19;;3052:73:0::1;14791:402:1::0;3052:73:0::1;3136:28;3155:8;3136:18;:28::i;43203:472::-:0;43380:9;43375:228;43399:8;:15;43395:1;:19;43375:228;;;43441:45;860:10;43474:8;43483:1;43474:11;;;;;;;;:::i;43441:45::-;43436:94;;43495:35;;-1:-1:-1;;;43495:35:0;;;;;;;;;;;43436:94;43545:46;43562:4;43568:2;43572:8;43581:1;43572:11;;;;;;;;:::i;:::-;;;;;;;43545:46;;43585:5;43545:16;:46::i;:::-;43416:3;;;:::i;:::-;;;43375:228;;;;43654:2;-1:-1:-1;;;;;43620:47:0;43648:4;-1:-1:-1;;;;;43620:47:0;43634:12;860:10;;780:98;43634:12;-1:-1:-1;;;;;43620:47:0;;43658:8;43620:47;;;;;;:::i;:::-;;;;;;;;43203:472;;;;:::o;29843:167::-;29908:4;29942:1;29932:7;:11;:37;;;;;29957:12;;29947:7;:22;29932:37;:70;;;;-1:-1:-1;29973:16:0;;;;:7;:16;;;;;;-1:-1:-1;;;;;29973:16:0;24433:42;29973:29;;29925:77;29843:167;-1:-1:-1;;29843:167:0:o;34574:196::-;34689:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;34689:29:0;-1:-1:-1;;;;;34689:29:0;;;;;;;;;34734:28;;34689:24;;34734:28;;;;;;;34574:196;;;:::o;30616:171::-;30747:32;30753:2;30757:8;30767:5;30774:4;30747:5;:32::i;32585:1871::-;32700:13;32716:16;32724:7;32716;:16::i;:::-;32700:32;-1:-1:-1;32745:22:0;860:10;-1:-1:-1;;;;;32771:21:0;;;;:75;;-1:-1:-1;32809:37:0;32826:5;860:10;46288:508;:::i;32809:37::-;32771:128;;;-1:-1:-1;860:10:0;32863:20;32875:7;32863:11;:20::i;:::-;-1:-1:-1;;;;;32863:36:0;;32771:128;32745:155;;32918:17;32913:66;;32944:35;;-1:-1:-1;;;32944:35:0;;;;;;;;;;;32913:66;33003:4;-1:-1:-1;;;;;32994:13:0;:5;-1:-1:-1;;;;;32994:13:0;;32990:54;;33016:28;;-1:-1:-1;;;33016:28:0;;;;;;;;;;;32990:54;-1:-1:-1;;;;;33059:16:0;;33055:52;;33084:23;;-1:-1:-1;;;33084:23:0;;;;;;;;;;;33055:52;-1:-1:-1;;;;;33122:15:0;;24433:42;33122:15;33118:51;;;33146:23;;-1:-1:-1;;;33146:23:0;;;;;;;;;;;33118:51;33182:43;33204:4;33210:2;33214:7;33223:1;33182:21;:43::i;:::-;33290:36;33307:1;33311:7;33320:5;33290:8;:36::i;:::-;-1:-1:-1;;;;;33618:15:0;;;;;;;:9;:15;;;;;;;;:20;;-1:-1:-1;;33618:20:0;;;33653:13;;;;;;;;;:18;;33637:1;33653:18;;;;;;33688:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;33688:21:0;;;;;;33993:11;;;34023:20;;;;;;33993:11;;34023:20;34019:321;;34240:12;;34226:11;:26;34222:103;;;34277:20;;;;:7;:20;;;;;:28;;-1:-1:-1;;;;;;34277:28:0;-1:-1:-1;;;;;34277:28:0;;;;;34222:103;33593:758;34387:7;34383:2;-1:-1:-1;;;;;34368:27:0;34377:4;-1:-1:-1;;;;;34368:27:0;;;;;;;;;;;34406:42;32689:1767;;32585:1871;;;:::o;29307:281::-;29399:4;29416:13;29432:16;29440:7;29432;:16::i;:::-;29416:32;;29479:5;-1:-1:-1;;;;;29469:15:0;:6;-1:-1:-1;;;;;29469:15:0;;:62;;;;29525:6;-1:-1:-1;;;;;29501:30:0;:20;29513:7;29501:11;:20::i;:::-;-1:-1:-1;;;;;29501:30:0;;29469:62;:110;;;;29548:31;29565:5;29572:6;29548:16;:31::i;34999:1422::-;35059:13;35075:16;35083:7;35075;:16::i;:::-;35059:32;;35104:52;35126:5;35141:1;35145:7;35154:1;35104:21;:52::i;:::-;35221:36;35238:1;35242:7;35251:5;35221:8;:36::i;:::-;-1:-1:-1;;;;;35549:16:0;;;;;;;:9;:16;;;;;;;;:21;;-1:-1:-1;;35549:21:0;;;35585:20;:25;;35569:1;35585:25;;;;;;35627:16;;;:7;:16;;;;;;:28;;-1:-1:-1;;;;;;35627:28:0;24433:42;35627:28;;;35939:11;;;35969:20;;;;;;35939:11;;35969:20;35965:322;;36186:12;;36172:11;:26;36168:104;;;36224:20;;;;:7;:20;;;;;:28;;-1:-1:-1;;;;;;36224:28:0;-1:-1:-1;;;;;36224:28:0;;;;;36168:104;-1:-1:-1;36315:36:0;;36343:7;;36339:1;;-1:-1:-1;;;;;36315:36:0;;;;;36339:1;;36315:36;49415:21:::1;49338:106:::0;:::o;3332:191::-;3406:16;3425:6;;-1:-1:-1;;;;;3442:17:0;;;-1:-1:-1;;;;;;3442:17:0;;;;;;3475:40;;3425:6;;;;;;;3475:40;;3406:16;3475:40;3395:128;3332:191;:::o;36986:765::-;37141:4;-1:-1:-1;;;;;37162:13:0;;12332:20;12380:8;37158:586;;37198:72;;-1:-1:-1;;;37198:72:0;;-1:-1:-1;;;;;37198:36:0;;;;;:72;;860:10;;37249:4;;37255:7;;37264:5;;37198:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37198:72:0;;;;;;;;-1:-1:-1;;37198:72:0;;;;;;;;;;;;:::i;:::-;;;37194:495;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37444:13:0;;37440:234;;37471:40;;-1:-1:-1;;;37471:40:0;;;;;;;;;;;37440:234;37624:6;37618:13;37609:6;37605:2;37601:15;37594:38;37194:495;-1:-1:-1;;;;;;37321:55:0;-1:-1:-1;;;37321:55:0;;-1:-1:-1;37314:62:0;;37158:586;-1:-1:-1;37728:4:0;36986:765;;;;;;:::o;39379:1074::-;39449:13;39445:49;;39471:23;;-1:-1:-1;;;39471:23:0;;;;;;;;;;;39445:49;39509:12;;39525:1;39509:17;39505:49;;;39535:19;;-1:-1:-1;;;39535:19:0;;;;;;;;;;;39505:49;39601:24;;39669:12;;39640:41;;39636:76;;39690:22;;-1:-1:-1;;;39690:22:0;;;;;;;;;;;39636:76;39916:1;40014:12;39877:36;;;-1:-1:-1;;39877:40:0;;;-1:-1:-1;39995:95:0;;;-1:-1:-1;40073:1:0;40058:12;-1:-1:-1;;40058:16:0;39995:95;40123:25;40106:273;40155:8;40150:1;:13;40106:273;;40215:1;40193:10;;;:7;:10;;;;;;-1:-1:-1;;;;;40193:10:0;:24;:51;;;;-1:-1:-1;40221:10:0;;;;:7;:10;;;;;;-1:-1:-1;;;;;40221:10:0;24433:42;40221:23;;40193:51;40189:175;;;40269:17;40289:10;40297:1;40289:7;:10::i;:::-;40322;;;;:7;:10;;;;;:22;;-1:-1:-1;;;;;;40322:22:0;-1:-1:-1;;;;;40322:22:0;;;;;;;;;;-1:-1:-1;40189:175:0;40165:3;;40106:273;;;-1:-1:-1;40433:1:0;40422:12;40395:24;:39;-1:-1:-1;;39379:1074:0:o;46883:108::-;46943:13;46976:7;46969:14;;;;;:::i;31046:1285::-;31216:12;;-1:-1:-1;;;;;31243:16:0;;31239:48;;31268:19;;-1:-1:-1;;;31268:19:0;;;;;;;;;;;31239:48;-1:-1:-1;;;;;31302:15:0;;24433:42;31302:15;31298:47;;;31326:19;;-1:-1:-1;;;31326:19:0;;;;;;;;;;;31298:47;31360:13;31356:44;;31382:18;;-1:-1:-1;;;31382:18:0;;;;;;;;;;;31356:44;31413:61;31443:1;31447:2;31451:12;31465:8;31413:21;:61::i;:::-;-1:-1:-1;;;;;31727:13:0;;;;;;:9;:13;;;;;;;;:25;;;;;;31769:21;;;:7;:21;;;;;:26;;-1:-1:-1;;;;;;31769:26:0;;;;;;;31777:12;;31864:332;31884:8;31880:1;:12;31864:332;;;31923:38;;31948:12;;-1:-1:-1;;;;;31923:38:0;;;31940:1;;31923:38;;31940:1;;31923:38;31984:4;31980:166;;;32018:59;32049:1;32053:2;32057:12;32071:5;32018:22;:59::i;:::-;32013:113;;32086:40;;-1:-1:-1;;;32086:40:0;;;;;;;;;;;32013:113;32166:14;;;;;31894:3;31864:332;;;-1:-1:-1;32212:12:0;:27;32263:60;28983:316;48473:790;48662:5;;-1:-1:-1;;;;;48662:5:0;48654:28;48650:124;;48699:5;;:25;;-1:-1:-1;;;48699:25:0;;-1:-1:-1;;;;;2045:55:1;;;48699:25:0;;;2027:74:1;48699:5:0;;;;:19;;2000:18:1;;48699:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48739:5:0;;:23;;-1:-1:-1;;;48739:23:0;;-1:-1:-1;;;;;2045:55:1;;;48739:23:0;;;2027:74:1;48739:5:0;;;;-1:-1:-1;48739:19:0;;-1:-1:-1;2000:18:1;;48739:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48650:124;48786:17;48838:12;48816:174;48857:23;48872:8;48857:12;:23;:::i;:::-;48853:1;:27;;;48816:174;;;48906:21;;;;;;;:18;:21;;;;;;;;48902:77;;;48948:15;48962:1;48948:15;;:::i;:::-;;;48902:77;48882:3;;;;:::i;:::-;;;;48816:174;;;-1:-1:-1;;;;;;49006:18:0;;;49002:87;;-1:-1:-1;;;;;49041:22:0;;;;;;:16;:22;;;;;:36;;49067:10;;49041:22;:36;;49067:10;;49041:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;49002:87;-1:-1:-1;;;;;49103:16:0;;;49099:83;;-1:-1:-1;;;;;49136:20:0;;;;;;:16;:20;;;;;:34;;49160:10;;49136:20;:34;;49160:10;;49136:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;49099:83;49194:61;28983:316;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:159::-;659:20;;719:6;708:18;;698:29;;688:57;;741:1;738;731:12;688:57;592:159;;;:::o;756:184::-;814:6;867:2;855:9;846:7;842:23;838:32;835:52;;;883:1;880;873:12;835:52;906:28;924:9;906:28;:::i;945:258::-;1017:1;1027:113;1041:6;1038:1;1035:13;1027:113;;;1117:11;;;1111:18;1098:11;;;1091:39;1063:2;1056:10;1027:113;;;1158:6;1155:1;1152:13;1149:48;;;-1:-1:-1;;1193:1:1;1175:16;;1168:27;945:258::o;1208:::-;1250:3;1288:5;1282:12;1315:6;1310:3;1303:19;1331:63;1387:6;1380:4;1375:3;1371:14;1364:4;1357:5;1353:16;1331:63;:::i;:::-;1448:2;1427:15;-1:-1:-1;;1423:29:1;1414:39;;;;1455:4;1410:50;;1208:258;-1:-1:-1;;1208:258:1:o;1471:220::-;1620:2;1609:9;1602:21;1583:4;1640:45;1681:2;1670:9;1666:18;1658:6;1640:45;:::i;1696:180::-;1755:6;1808:2;1796:9;1787:7;1783:23;1779:32;1776:52;;;1824:1;1821;1814:12;1776:52;-1:-1:-1;1847:23:1;;1696:180;-1:-1:-1;1696:180:1:o;2112:154::-;-1:-1:-1;;;;;2191:5:1;2187:54;2180:5;2177:65;2167:93;;2256:1;2253;2246:12;2271:315;2339:6;2347;2400:2;2388:9;2379:7;2375:23;2371:32;2368:52;;;2416:1;2413;2406:12;2368:52;2455:9;2442:23;2474:31;2499:5;2474:31;:::i;:::-;2524:5;2576:2;2561:18;;;;2548:32;;-1:-1:-1;;;2271:315:1:o;2591:262::-;2665:6;2718:2;2706:9;2697:7;2693:23;2689:32;2686:52;;;2734:1;2731;2724:12;2686:52;2773:9;2760:23;2792:31;2817:5;2792:31;:::i;3040:391::-;3115:6;3123;3131;3184:2;3172:9;3163:7;3159:23;3155:32;3152:52;;;3200:1;3197;3190:12;3152:52;3223:28;3241:9;3223:28;:::i;:::-;3213:38;;3270:37;3303:2;3292:9;3288:18;3270:37;:::i;:::-;3260:47;;3357:2;3346:9;3342:18;3329:32;3370:31;3395:5;3370:31;:::i;:::-;3420:5;3410:15;;;3040:391;;;;;:::o;3436:456::-;3513:6;3521;3529;3582:2;3570:9;3561:7;3557:23;3553:32;3550:52;;;3598:1;3595;3588:12;3550:52;3637:9;3624:23;3656:31;3681:5;3656:31;:::i;:::-;3706:5;-1:-1:-1;3763:2:1;3748:18;;3735:32;3776:33;3735:32;3776:33;:::i;:::-;3436:456;;3828:7;;-1:-1:-1;;;3882:2:1;3867:18;;;;3854:32;;3436:456::o;3897:127::-;3958:10;3953:3;3949:20;3946:1;3939:31;3989:4;3986:1;3979:15;4013:4;4010:1;4003:15;4029:275;4100:2;4094:9;4165:2;4146:13;;-1:-1:-1;;4142:27:1;4130:40;;4200:18;4185:34;;4221:22;;;4182:62;4179:88;;;4247:18;;:::i;:::-;4283:2;4276:22;4029:275;;-1:-1:-1;4029:275:1:o;4309:407::-;4374:5;4408:18;4400:6;4397:30;4394:56;;;4430:18;;:::i;:::-;4468:57;4513:2;4492:15;;-1:-1:-1;;4488:29:1;4519:4;4484:40;4468:57;:::i;:::-;4459:66;;4548:6;4541:5;4534:21;4588:3;4579:6;4574:3;4570:16;4567:25;4564:45;;;4605:1;4602;4595:12;4564:45;4654:6;4649:3;4642:4;4635:5;4631:16;4618:43;4708:1;4701:4;4692:6;4685:5;4681:18;4677:29;4670:40;4309:407;;;;;:::o;4721:451::-;4790:6;4843:2;4831:9;4822:7;4818:23;4814:32;4811:52;;;4859:1;4856;4849:12;4811:52;4899:9;4886:23;4932:18;4924:6;4921:30;4918:50;;;4964:1;4961;4954:12;4918:50;4987:22;;5040:4;5032:13;;5028:27;-1:-1:-1;5018:55:1;;5069:1;5066;5059:12;5018:55;5092:74;5158:7;5153:2;5140:16;5135:2;5131;5127:11;5092:74;:::i;5622:716::-;5675:5;5728:3;5721:4;5713:6;5709:17;5705:27;5695:55;;5746:1;5743;5736:12;5695:55;5782:6;5769:20;5808:4;5831:18;5827:2;5824:26;5821:52;;;5853:18;;:::i;:::-;5899:2;5896:1;5892:10;5922:28;5946:2;5942;5938:11;5922:28;:::i;:::-;5984:15;;;6054;;;6050:24;;;6015:12;;;;6086:15;;;6083:35;;;6114:1;6111;6104:12;6083:35;6150:2;6142:6;6138:15;6127:26;;6162:147;6178:6;6173:3;6170:15;6162:147;;;6244:22;6262:3;6244:22;:::i;:::-;6232:35;;6195:12;;;;6287;;;;6162:147;;;6327:5;5622:716;-1:-1:-1;;;;;;;5622:716:1:o;6343:622::-;6444:6;6452;6460;6513:2;6501:9;6492:7;6488:23;6484:32;6481:52;;;6529:1;6526;6519:12;6481:52;6568:9;6555:23;6587:31;6612:5;6587:31;:::i;:::-;6637:5;-1:-1:-1;6694:2:1;6679:18;;6666:32;6707:33;6666:32;6707:33;:::i;:::-;6759:7;-1:-1:-1;6817:2:1;6802:18;;6789:32;6844:18;6833:30;;6830:50;;;6876:1;6873;6866:12;6830:50;6899:60;6951:7;6942:6;6931:9;6927:22;6899:60;:::i;:::-;6889:70;;;6343:622;;;;;:::o;6970:346::-;7053:6;7106:2;7094:9;7085:7;7081:23;7077:32;7074:52;;;7122:1;7119;7112:12;7074:52;7162:9;7149:23;7195:18;7187:6;7184:30;7181:50;;;7227:1;7224;7217:12;7181:50;7250:60;7302:7;7293:6;7282:9;7278:22;7250:60;:::i;7321:160::-;7386:20;;7442:13;;7435:21;7425:32;;7415:60;;7471:1;7468;7461:12;7486:315;7551:6;7559;7612:2;7600:9;7591:7;7587:23;7583:32;7580:52;;;7628:1;7625;7618:12;7580:52;7667:9;7654:23;7686:31;7711:5;7686:31;:::i;:::-;7736:5;-1:-1:-1;7760:35:1;7791:2;7776:18;;7760:35;:::i;:::-;7750:45;;7486:315;;;;;:::o;7806:221::-;7848:5;7901:3;7894:4;7886:6;7882:17;7878:27;7868:55;;7919:1;7916;7909:12;7868:55;7941:80;8017:3;8008:6;7995:20;7988:4;7980:6;7976:17;7941:80;:::i;8032:665::-;8127:6;8135;8143;8151;8204:3;8192:9;8183:7;8179:23;8175:33;8172:53;;;8221:1;8218;8211:12;8172:53;8260:9;8247:23;8279:31;8304:5;8279:31;:::i;:::-;8329:5;-1:-1:-1;8386:2:1;8371:18;;8358:32;8399:33;8358:32;8399:33;:::i;:::-;8451:7;-1:-1:-1;8505:2:1;8490:18;;8477:32;;-1:-1:-1;8560:2:1;8545:18;;8532:32;8587:18;8576:30;;8573:50;;;8619:1;8616;8609:12;8573:50;8642:49;8683:7;8674:6;8663:9;8659:22;8642:49;:::i;:::-;8632:59;;;8032:665;;;;;;;:::o;8702:689::-;8794:6;8802;8810;8863:2;8851:9;8842:7;8838:23;8834:32;8831:52;;;8879:1;8876;8869:12;8831:52;8919:9;8906:23;8948:18;8989:2;8981:6;8978:14;8975:34;;;9005:1;9002;8995:12;8975:34;9043:6;9032:9;9028:22;9018:32;;9088:7;9081:4;9077:2;9073:13;9069:27;9059:55;;9110:1;9107;9100:12;9059:55;9150:2;9137:16;9176:2;9168:6;9165:14;9162:34;;;9192:1;9189;9182:12;9162:34;9247:7;9240:4;9230:6;9227:1;9223:14;9219:2;9215:23;9211:34;9208:47;9205:67;;;9268:1;9265;9258:12;9205:67;9299:4;9291:13;;;;-1:-1:-1;9323:6:1;-1:-1:-1;9348:37:1;;9364:20;;;-1:-1:-1;9348:37:1;:::i;:::-;9338:47;;8702:689;;;;;:::o;9396:256::-;9462:6;9470;9523:2;9511:9;9502:7;9498:23;9494:32;9491:52;;;9539:1;9536;9529:12;9491:52;9562:28;9580:9;9562:28;:::i;:::-;9552:38;;9609:37;9642:2;9631:9;9627:18;9609:37;:::i;9657:388::-;9725:6;9733;9786:2;9774:9;9765:7;9761:23;9757:32;9754:52;;;9802:1;9799;9792:12;9754:52;9841:9;9828:23;9860:31;9885:5;9860:31;:::i;:::-;9910:5;-1:-1:-1;9967:2:1;9952:18;;9939:32;9980:33;9939:32;9980:33;:::i;:::-;10032:7;10022:17;;;9657:388;;;;;:::o;10050:842::-;10169:6;10177;10185;10193;10246:3;10234:9;10225:7;10221:23;10217:33;10214:53;;;10263:1;10260;10253:12;10214:53;10302:9;10289:23;10321:31;10346:5;10321:31;:::i;:::-;10371:5;-1:-1:-1;10428:2:1;10413:18;;10400:32;10441:33;10400:32;10441:33;:::i;:::-;10493:7;-1:-1:-1;10551:2:1;10536:18;;10523:32;10574:18;10604:14;;;10601:34;;;10631:1;10628;10621:12;10601:34;10654:60;10706:7;10697:6;10686:9;10682:22;10654:60;:::i;:::-;10644:70;;10767:2;10756:9;10752:18;10739:32;10723:48;;10796:2;10786:8;10783:16;10780:36;;;10812:1;10809;10802:12;10780:36;;10835:51;10878:7;10867:8;10856:9;10852:24;10835:51;:::i;11143:380::-;11222:1;11218:12;;;;11265;;;11286:61;;11340:4;11332:6;11328:17;11318:27;;11286:61;11393:2;11385:6;11382:14;11362:18;11359:38;11356:161;;;11439:10;11434:3;11430:20;11427:1;11420:31;11474:4;11471:1;11464:15;11502:4;11499:1;11492:15;11356:161;;11143:380;;;:::o;11889:127::-;11950:10;11945:3;11941:20;11938:1;11931:31;11981:4;11978:1;11971:15;12005:4;12002:1;11995:15;12021:224;12060:3;12088:6;12121:2;12118:1;12114:10;12151:2;12148:1;12144:10;12182:3;12178:2;12174:12;12169:3;12166:21;12163:47;;;12190:18;;:::i;:::-;12226:13;;12021:224;-1:-1:-1;;;;12021:224:1:o;12250:125::-;12290:4;12318:1;12315;12312:8;12309:34;;;12323:18;;:::i;:::-;-1:-1:-1;12360:9:1;;12250:125::o;12380:128::-;12420:3;12451:1;12447:6;12444:1;12441:13;12438:39;;;12457:18;;:::i;:::-;-1:-1:-1;12493:9:1;;12380:128::o;12513:197::-;12551:3;12579:6;12620:2;12613:5;12609:14;12647:2;12638:7;12635:15;12632:41;;;12653:18;;:::i;:::-;12702:1;12689:15;;12513:197;-1:-1:-1;;;12513:197:1:o;12715:127::-;12776:10;12771:3;12767:20;12764:1;12757:31;12807:4;12804:1;12797:15;12831:4;12828:1;12821:15;12847:643;13016:2;13068:21;;;13138:13;;13041:18;;;13160:22;;;12987:4;;13016:2;13239:15;;;;13213:2;13198:18;;;12987:4;13282:182;13296:6;13293:1;13290:13;13282:182;;;13361:13;;13376:6;13357:26;13345:39;;13439:15;;;;13404:12;;;;13318:1;13311:9;13282:182;;;-1:-1:-1;13481:3:1;;12847:643;-1:-1:-1;;;;;;12847:643:1:o;13495:135::-;13534:3;-1:-1:-1;;13555:17:1;;13552:43;;;13575:18;;:::i;:::-;-1:-1:-1;13622:1:1;13611:13;;13495:135::o;13635:637::-;13915:3;13953:6;13947:13;13969:53;14015:6;14010:3;14003:4;13995:6;13991:17;13969:53;:::i;:::-;14085:13;;14044:16;;;;14107:57;14085:13;14044:16;14141:4;14129:17;;14107:57;:::i;:::-;14229:7;14186:20;;14215:22;;;14264:1;14253:13;;13635:637;-1:-1:-1;;;;13635:637:1:o;14277:217::-;14316:4;14345:6;14401:10;;;;14371;;14423:12;;;14420:38;;;14438:18;;:::i;:::-;14475:13;;14277:217;-1:-1:-1;;;14277:217:1:o;14499:287::-;14605:6;14658:2;14646:9;14637:7;14633:23;14629:32;14626:52;;;14674:1;14671;14664:12;14626:52;14706:9;14700:16;14725:31;14750:5;14725:31;:::i;15198:512::-;15392:4;-1:-1:-1;;;;;15502:2:1;15494:6;15490:15;15479:9;15472:34;15554:2;15546:6;15542:15;15537:2;15526:9;15522:18;15515:43;;15594:6;15589:2;15578:9;15574:18;15567:34;15637:3;15632:2;15621:9;15617:18;15610:31;15658:46;15699:3;15688:9;15684:19;15676:6;15658:46;:::i;:::-;15650:54;15198:512;-1:-1:-1;;;;;;15198:512:1:o;15715:249::-;15784:6;15837:2;15825:9;15816:7;15812:23;15808:32;15805:52;;;15853:1;15850;15843:12;15805:52;15885:9;15879:16;15904:30;15928:5;15904:30;:::i

Swarm Source

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