Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 235 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Mint | 15912898 | 27 days ago | IN | 199 S | 0.01287589 | ||||
Mint | 15274080 | 30 days ago | IN | 199 S | 0.00622811 | ||||
Mint | 15201646 | 30 days ago | IN | 398 S | 0.00929251 | ||||
Mint | 15063844 | 31 days ago | IN | 199 S | 0.00694311 | ||||
Mint | 15063348 | 31 days ago | IN | 199 S | 0.00694311 | ||||
Mint | 14960812 | 31 days ago | IN | 796 S | 0.01399132 | ||||
Mint | 14950125 | 31 days ago | IN | 796 S | 0.01327632 | ||||
Mint | 14874718 | 32 days ago | IN | 199 S | 0.00803382 | ||||
Mint | 14848677 | 32 days ago | IN | 199 S | 0.00694311 | ||||
Mint | 14831813 | 32 days ago | IN | 398 S | 0.00929251 | ||||
Mint | 14831763 | 32 days ago | IN | 199 S | 0.00694311 | ||||
Mint | 14826570 | 32 days ago | IN | 597 S | 0.01164192 | ||||
Mint | 14826485 | 32 days ago | IN | 199 S | 0.00694311 | ||||
Mint | 14818356 | 32 days ago | IN | 199 S | 0.00694311 | ||||
Mint | 14818198 | 32 days ago | IN | 398 S | 0.00929251 | ||||
Mint | 14807337 | 32 days ago | IN | 398 S | 0.00929251 | ||||
Mint | 14807216 | 32 days ago | IN | 199 S | 0.00694311 | ||||
Mint | 14800620 | 32 days ago | IN | 597 S | 0.01164192 | ||||
Mint | 14796835 | 32 days ago | IN | 398 S | 0.00929251 | ||||
Mint | 14792904 | 32 days ago | IN | 199 S | 0.00694311 | ||||
Mint | 14789800 | 32 days ago | IN | 597 S | 0.01164192 | ||||
Mint | 14788049 | 32 days ago | IN | 398 S | 0.00929251 | ||||
Mint | 14783125 | 32 days ago | IN | 199 S | 0.00694311 | ||||
Mint | 14780431 | 32 days ago | IN | 199 S | 0.00694311 | ||||
Mint | 14776314 | 32 days ago | IN | 398 S | 0.00929251 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
15912898 | 27 days ago | 199 S | ||||
15274080 | 30 days ago | 199 S | ||||
15201646 | 30 days ago | 398 S | ||||
15063844 | 31 days ago | 199 S | ||||
15063348 | 31 days ago | 199 S | ||||
14960812 | 31 days ago | 796 S | ||||
14950125 | 31 days ago | 796 S | ||||
14874718 | 32 days ago | 199 S | ||||
14848677 | 32 days ago | 199 S | ||||
14831813 | 32 days ago | 398 S | ||||
14831763 | 32 days ago | 199 S | ||||
14826570 | 32 days ago | 597 S | ||||
14826485 | 32 days ago | 199 S | ||||
14818356 | 32 days ago | 199 S | ||||
14818198 | 32 days ago | 398 S | ||||
14807337 | 32 days ago | 398 S | ||||
14807216 | 32 days ago | 199 S | ||||
14800620 | 32 days ago | 597 S | ||||
14796835 | 32 days ago | 398 S | ||||
14792904 | 32 days ago | 199 S | ||||
14789800 | 32 days ago | 597 S | ||||
14788049 | 32 days ago | 398 S | ||||
14783125 | 32 days ago | 199 S | ||||
14780431 | 32 days ago | 199 S | ||||
14776314 | 32 days ago | 398 S |
Loading...
Loading
Contract Name:
DinoByteContract
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-03-14 */ // File: libs/ERC721A/contracts/IERC721A.sol // ERC721A Contracts v4.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); /** * `_sequentialUpTo()` must be greater than `_startTokenId()`. */ error SequentialUpToTooSmall(); /** * The `tokenId` of a sequential mint exceeds `_sequentialUpTo()`. */ error SequentialMintExceedsLimit(); /** * Spot minting requires a `tokenId` greater than `_sequentialUpTo()`. */ error SpotMintTokenIdTooSmall(); /** * Cannot mint over a token that already exists. */ error TokenAlreadyExists(); /** * The feature is not compatible with spot mints. */ error NotCompatibleWithSpotMints(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @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, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` 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 payable; /** * @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 payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @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); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: libs/ERC721A/contracts/ERC721A.sol // ERC721A Contracts v4.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * The `_sequentialUpTo()` function can be overriden to enable spot mints * (i.e. non-consecutive mints) for `tokenId`s greater than `_sequentialUpTo()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // The amount of tokens minted above `_sequentialUpTo()`. // We call these spot mints (i.e. non-sequential mints). uint256 private _spotMinted; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); if (_sequentialUpTo() < _startTokenId()) _revert(SequentialUpToTooSmall.selector); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID for sequential mints. * * Override this function to change the starting token ID for sequential mints. * * Note: The value returned must never change after any tokens have been minted. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the maximum token ID (inclusive) for sequential mints. * * Override this function to return a value less than 2**256 - 1, * but greater than `_startTokenId()`, to enable spot (non-sequential) mints. * * Note: The value returned must never change after any tokens have been minted. */ function _sequentialUpTo() internal view virtual returns (uint256) { return type(uint256).max; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256 result) { // Counter underflow is impossible as `_burnCounter` cannot be incremented // more than `_currentIndex + _spotMinted - _startTokenId()` times. unchecked { // With spot minting, the intermediate `result` can be temporarily negative, // and the computation must be unchecked. result = _currentIndex - _burnCounter - _startTokenId(); if (_sequentialUpTo() != type(uint256).max) result += _spotMinted; } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256 result) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { result = _currentIndex - _startTokenId(); if (_sequentialUpTo() != type(uint256).max) result += _spotMinted; } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } /** * @dev Returns the total number of tokens that are spot-minted. */ function _totalSpotMinted() internal view virtual returns (uint256) { return _spotMinted; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) _revert(BalanceQueryForZeroAddress.selector); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) _revert(URIQueryForNonexistentToken.selector); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Returns whether the ownership slot at `index` is initialized. * An uninitialized slot does not necessarily mean that the slot has no owner. */ function _ownershipIsInitialized(uint256 index) internal view virtual returns (bool) { return _packedOwnerships[index] != 0; } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * @dev Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256 packed) { if (_startTokenId() <= tokenId) { packed = _packedOwnerships[tokenId]; if (tokenId > _sequentialUpTo()) { if (_packedOwnershipExists(packed)) return packed; _revert(OwnerQueryForNonexistentToken.selector); } // If the data at the starting slot does not exist, start the scan. if (packed == 0) { if (tokenId >= _currentIndex) _revert(OwnerQueryForNonexistentToken.selector); // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `tokenId` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. for (;;) { unchecked { packed = _packedOwnerships[--tokenId]; } if (packed == 0) continue; if (packed & _BITMASK_BURNED == 0) return packed; // Otherwise, the token is burned, and we must revert. // This handles the case of batch burned tokens, where only the burned bit // of the starting slot is set, and remaining slots are left uninitialized. _revert(OwnerQueryForNonexistentToken.selector); } } // Otherwise, the data exists and we can skip the scan. // This is possible because we have already achieved the target condition. // This saves 2143 gas on transfers of initialized tokens. // If the token is not burned, return `packed`. Otherwise, revert. if (packed & _BITMASK_BURNED == 0) return packed; } _revert(OwnerQueryForNonexistentToken.selector); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. * * Requirements: * * - The caller must own the token or be an approved operator. */ function approve(address to, uint256 tokenId) public payable virtual override { _approve(to, tokenId, true); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) _revert(ApprovalQueryForNonexistentToken.selector); return _tokenApprovals[tokenId].value; } /** * @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) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @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. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool result) { if (_startTokenId() <= tokenId) { if (tokenId > _sequentialUpTo()) return _packedOwnershipExists(_packedOwnerships[tokenId]); if (tokenId < _currentIndex) { uint256 packed; while ((packed = _packedOwnerships[tokenId]) == 0) --tokenId; result = packed & _BITMASK_BURNED == 0; } } } /** * @dev Returns whether `packed` represents a token that exists. */ function _packedOwnershipExists(uint256 packed) private pure returns (bool result) { assembly { // The following is equivalent to `owner != address(0) && burned == false`. // Symbolically tested. result := gt(and(packed, _BITMASK_ADDRESS), and(packed, _BITMASK_BURNED)) } } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from = address(uint160(uint256(uint160(from)) & _BITMASK_ADDRESS)); if (address(uint160(prevOwnershipPacked)) != from) _revert(TransferFromIncorrectOwner.selector); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) _revert(TransferCallerNotOwnerNorApproved.selector); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS; assembly { // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. from, // `from`. toMasked, // `to`. tokenId // `tokenId`. ) } if (toMasked == 0) _revert(TransferToZeroAddress.selector); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @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 memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { _revert(TransferToNonERC721ReceiverImplementer.selector); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { _revert(TransferToNonERC721ReceiverImplementer.selector); } assembly { revert(add(32, reason), mload(reason)) } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @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 for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) _revert(MintZeroQuantity.selector); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS; if (toMasked == 0) _revert(MintToZeroAddress.selector); uint256 end = startTokenId + quantity; uint256 tokenId = startTokenId; if (end - 1 > _sequentialUpTo()) _revert(SequentialMintExceedsLimit.selector); do { assembly { // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. tokenId // `tokenId`. ) } // The `!=` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. } while (++tokenId != end); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) _revert(MintToZeroAddress.selector); if (quantity == 0) _revert(MintZeroQuantity.selector); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) _revert(MintERC2309QuantityExceedsLimit.selector); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); if (startTokenId + quantity - 1 > _sequentialUpTo()) _revert(SequentialMintExceedsLimit.selector); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, 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. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { _revert(TransferToNonERC721ReceiverImplementer.selector); } } while (index < end); // This prevents reentrancy to `_safeMint`. // It does not prevent reentrancy to `_safeMintSpot`. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } /** * @dev Mints a single token at `tokenId`. * * Note: A spot-minted `tokenId` that has been burned can be re-minted again. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` must be greater than `_sequentialUpTo()`. * - `tokenId` must not exist. * * Emits a {Transfer} event for each mint. */ function _mintSpot(address to, uint256 tokenId) internal virtual { if (tokenId <= _sequentialUpTo()) _revert(SpotMintTokenIdTooSmall.selector); uint256 prevOwnershipPacked = _packedOwnerships[tokenId]; if (_packedOwnershipExists(prevOwnershipPacked)) _revert(TokenAlreadyExists.selector); _beforeTokenTransfers(address(0), to, tokenId, 1); // Overflows are incredibly unrealistic. // The `numberMinted` for `to` is incremented by 1, and has a max limit of 2**64 - 1. // `_spotMinted` is incremented by 1, and has a max limit of 2**256 - 1. unchecked { // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `true` (as `quantity == 1`). _packedOwnerships[tokenId] = _packOwnershipData( to, _nextInitializedFlag(1) | _nextExtraData(address(0), to, prevOwnershipPacked) ); // Updates: // - `balance += 1`. // - `numberMinted += 1`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += (1 << _BITPOS_NUMBER_MINTED) | 1; // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS; if (toMasked == 0) _revert(MintToZeroAddress.selector); assembly { // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. tokenId // `tokenId`. ) } ++_spotMinted; } _afterTokenTransfers(address(0), to, tokenId, 1); } /** * @dev Safely mints a single token at `tokenId`. * * Note: A spot-minted `tokenId` that has been burned can be re-minted again. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}. * - `tokenId` must be greater than `_sequentialUpTo()`. * - `tokenId` must not exist. * * See {_mintSpot}. * * Emits a {Transfer} event. */ function _safeMintSpot( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mintSpot(to, tokenId); unchecked { if (to.code.length != 0) { uint256 currentSpotMinted = _spotMinted; if (!_checkContractOnERC721Received(address(0), to, tokenId, _data)) { _revert(TransferToNonERC721ReceiverImplementer.selector); } // This prevents reentrancy to `_safeMintSpot`. // It does not prevent reentrancy to `_safeMint`. if (_spotMinted != currentSpotMinted) revert(); } } } /** * @dev Equivalent to `_safeMintSpot(to, tokenId, '')`. */ function _safeMintSpot(address to, uint256 tokenId) internal virtual { _safeMintSpot(to, tokenId, ''); } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Equivalent to `_approve(to, tokenId, false)`. */ function _approve(address to, uint256 tokenId) internal virtual { _approve(to, tokenId, false); } /** * @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: * * - `tokenId` must exist. * * Emits an {Approval} event. */ function _approve( address to, uint256 tokenId, bool approvalCheck ) internal virtual { address owner = ownerOf(tokenId); if (approvalCheck && _msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { _revert(ApprovalCallerNotOwnerNorApproved.selector); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) _revert(TransferCallerNotOwnerNorApproved.selector); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as `_burnCounter` cannot be exceed `_currentIndex + _spotMinted` times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) _revert(OwnershipNotInitializedForExtraData.selector); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } /** * @dev For more efficient reverts. */ function _revert(bytes4 errorSelector) internal pure { assembly { mstore(0x00, errorSelector) revert(0x00, 0x04) } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @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. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _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/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol) pragma solidity ^0.8.20; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant NOT_ENTERED = 1; uint256 private constant ENTERED = 2; uint256 private _status; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); constructor() { _status = NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be NOT_ENTERED if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail _status = ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == ENTERED; } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @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/IERC721.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.20; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon * a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or * {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon * a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the address zero. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: contracts/DinoByteContract.sol pragma solidity ^0.8.20; /** * @title DinoByteContract * @dev NFT contract using the ERC721A standard, supporting batch minting with fees set by admin */ // Interface for EarlyBirds checker interface IEarlyBirdsChecker { function isEarlyBirds(address user) external view returns (bool); } contract DinoByteContract is ERC721A, Ownable, ReentrancyGuard { // Base URI for NFT string private _baseTokenURI; // Mint price uint256 public mintPrice; // Foundation address address public immutable foundationAddress; // Maximum supply uint256 public immutable maxSupply; // EarlyBirds checker contract IEarlyBirdsChecker public earlyBirdsChecker; // Record of addresses that have used earlyBirdsMint mapping(address => bool) public usedEarlyBirdsMint; // Mapping to track frozen tokens mapping(uint256 => bool) public frozenTokens; // Flag to control if regular minting is enabled bool public isMintingEnabled = false; // Flag to control if early birds minting is enabled bool public isEarlyBirdsMintingEnabled = false; // Mapping from owner address to list of owned token IDs mapping(address => uint256[]) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Events for anti-theft functionality event TokenFrozen(uint256 indexed tokenId); event TokenUnfrozen(uint256 indexed tokenId); event MintingStatusChanged(bool status); event EarlyBirdsMintingStatusChanged(bool status); // Constructor constructor( string memory name, string memory symbol, string memory baseURI, uint256 _mintPrice, address _foundationAddress, uint256 _maxSupply, address _earlyBirdsChecker ) ERC721A(name, symbol) Ownable(msg.sender) { _baseTokenURI = baseURI; mintPrice = _mintPrice; foundationAddress = _foundationAddress; maxSupply = _maxSupply; earlyBirdsChecker = IEarlyBirdsChecker(_earlyBirdsChecker); } /** * @dev Returns the base URI */ function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } /** * @dev Sets the base URI, only callable by owner */ function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } /** * @dev Sets the mint price, only callable by owner */ function setMintPrice(uint256 _mintPrice) external onlyOwner { mintPrice = _mintPrice; } /** * @dev Sets the EarlyBirds checker contract address */ function setEarlyBirdsChecker(address _earlyBirdsChecker) external onlyOwner { earlyBirdsChecker = IEarlyBirdsChecker(_earlyBirdsChecker); } /** * @dev Sets the status of regular minting (enabled/disabled) */ function setMintingStatus(bool status) external onlyOwner { isMintingEnabled = status; emit MintingStatusChanged(status); } /** * @dev Sets the status of early birds minting (enabled/disabled) */ function setEarlyBirdsMintingStatus(bool status) external onlyOwner { isEarlyBirdsMintingEnabled = status; emit EarlyBirdsMintingStatusChanged(status); } /** * @dev Returns an array of token IDs owned by `owner`. * @param owner Address to query * @return Array of token IDs owned by the given address */ function tokensOfOwner(address owner) external view returns (uint256[] memory) { return _ownedTokens[owner]; } /** * @dev Mint function, users can mint NFTs after paying the fee * @param quantity Number of NFTs to mint */ function mint(uint256 quantity) external payable nonReentrant { // Check if minting is enabled require(isMintingEnabled, "Minting is not enabled"); // Check that quantity is not zero require(quantity > 0, "Quantity must be greater than 0"); // Check that total supply will not exceed max supply require(totalSupply() + quantity <= maxSupply, "Exceeds max supply"); // Check that sufficient ETH is paid require(msg.value >= mintPrice * quantity, "Insufficient payment"); // Transfer fees to foundation address FIRST (external interaction) (bool success, ) = foundationAddress.call{value: msg.value}(""); require(success, "Transfer to foundation failed"); // THEN mint NFTs (state change) _mint(msg.sender, quantity); } function earlyBirdsCanMint() external { // Check if early birds minting is enabled require(isEarlyBirdsMintingEnabled, "Early birds minting is not enabled"); address user = tx.origin; // Check if caller is an EarlyBird require(earlyBirdsChecker.isEarlyBirds(user), "Not an early bird"); require(!usedEarlyBirdsMint[user], "user already used early birds mint"); // Check that total supply will not exceed max supply require(totalSupply() + 1 <= maxSupply, "Exceeds max supply"); // Free mint of 1 NFT _mint(msg.sender, 1); usedEarlyBirdsMint[user] = true; } /** * @dev Freeze a token to prevent transfers (anti-theft protection) * @param tokenId The ID of the token to freeze */ function freezeToken(uint256 tokenId) external onlyOwner { require(_exists(tokenId), "Token does not exist"); require(!frozenTokens[tokenId], "Token is already frozen"); frozenTokens[tokenId] = true; emit TokenFrozen(tokenId); } /** * @dev Unfreeze a previously frozen token * @param tokenId The ID of the token to unfreeze */ function unfreezeToken(uint256 tokenId) external onlyOwner { require(_exists(tokenId), "Token does not exist"); require(frozenTokens[tokenId], "Token is not frozen"); frozenTokens[tokenId] = false; emit TokenUnfrozen(tokenId); } /** * @dev Hook that is called before any token transfers */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal override { super._beforeTokenTransfers(from, to, startTokenId, quantity); // Skip checks for minting operations if (from == address(0)) { // This is a mint operation // Add tokens to the recipient's list for (uint256 i = 0; i < quantity; i++) { uint256 tokenId = startTokenId + i; _addTokenToOwnerEnumeration(to, tokenId); } return; } // Skip checks for burning operations if (to == address(0)) { // This is a burn operation // Remove tokens from the sender's list for (uint256 i = 0; i < quantity; i++) { uint256 tokenId = startTokenId + i; _removeTokenFromOwnerEnumeration(from, tokenId); } return; } // This is a transfer operation // Check for frozen tokens for (uint256 i = 0; i < quantity; i++) { uint256 tokenId = startTokenId + i; require(!frozenTokens[tokenId], "Token is frozen and cannot be transferred"); // Update owner enumeration _removeTokenFromOwnerEnumeration(from, tokenId); _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to an owner's token list * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { // Add token to owner's token list _ownedTokens[to].push(tokenId); // Store the index of the token in the owner's token list _ownedTokensIndex[tokenId] = _ownedTokens[to].length - 1; } /** * @dev Private function to remove a token from an owner's token list * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // Get the index of the token in the owner's token list uint256 lastTokenIndex = _ownedTokens[from].length - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // If the token is not the last one, move the last token to the slot of the token to delete if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; // Move the last token to the slot of the token to delete _ownedTokens[from][tokenIndex] = lastTokenId; // Update the index for the moved token _ownedTokensIndex[lastTokenId] = tokenIndex; } // Remove the last element (now a duplicate or the token to delete) _ownedTokens[from].pop(); } /** * @dev Withdrawal function, only callable by owner */ function withdraw(address _to, address _token, uint256 _value) external onlyOwner { if (_token == address(0)) { (bool success, ) = _to.call{value: _value}(new bytes(0)); require(success, "Withdrawal failed"); } else { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = _token.call( abi.encodeWithSelector(0xa9059cbb, _to, _value) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "Withdrawal failed" ); } } /** * @dev Admin function to rescue ERC721 tokens accidentally sent to the contract * @param _nftContract ERC721 contract address * @param _to Recipient address for the NFT * @param _tokenId Token ID to rescue */ function rescueERC721(address _nftContract, address _to, uint256 _tokenId) external onlyOwner { // Check if this contract owns the token IERC721 nft = IERC721(_nftContract); require(nft.ownerOf(_tokenId) == address(this), "Contract does not own this token"); // Transfer NFT to specified address nft.safeTransferFrom(address(this), _to, _tokenId); } receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"uint256","name":"_mintPrice","type":"uint256"},{"internalType":"address","name":"_foundationAddress","type":"address"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"address","name":"_earlyBirdsChecker","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"NotCompatibleWithSpotMints","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"SequentialMintExceedsLimit","type":"error"},{"inputs":[],"name":"SequentialUpToTooSmall","type":"error"},{"inputs":[],"name":"SpotMintTokenIdTooSmall","type":"error"},{"inputs":[],"name":"TokenAlreadyExists","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"EarlyBirdsMintingStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"MintingStatusChanged","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":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenFrozen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenUnfrozen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyBirdsCanMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"earlyBirdsChecker","outputs":[{"internalType":"contract IEarlyBirdsChecker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"foundationAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"freezeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"frozenTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isEarlyBirdsMintingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nftContract","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"rescueERC721","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":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_earlyBirdsChecker","type":"address"}],"name":"setEarlyBirdsChecker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setEarlyBirdsMintingStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setMintingStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"result","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unfreezeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"usedEarlyBirdsMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c06040526010805461ffff191690553480156200001b575f80fd5b5060405162002759380380620027598339810160408190526200003e9162000213565b33878760026200004f838262000361565b5060036200005e828262000361565b50505f8055506001600160a01b0381166200009257604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6200009d81620000e8565b506001600a55600b620000b1868262000361565b50600c939093556001600160a01b0391821660805260a052600d80546001600160a01b031916919092161790555062000429915050565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126200015d575f80fd5b81516001600160401b03808211156200017a576200017a62000139565b604051601f8301601f19908116603f01168101908282118183101715620001a557620001a562000139565b81604052838152602092508683858801011115620001c1575f80fd5b5f91505b83821015620001e45785820183015181830184015290820190620001c5565b5f93810190920192909252949350505050565b80516001600160a01b03811681146200020e575f80fd5b919050565b5f805f805f805f60e0888a0312156200022a575f80fd5b87516001600160401b038082111562000241575f80fd5b6200024f8b838c016200014d565b985060208a015191508082111562000265575f80fd5b620002738b838c016200014d565b975060408a015191508082111562000289575f80fd5b50620002988a828b016200014d565b95505060608801519350620002b060808901620001f7565b925060a08801519150620002c760c08901620001f7565b905092959891949750929550565b600181811c90821680620002ea57607f821691505b6020821081036200030957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200035c575f81815260208120601f850160051c81016020861015620003375750805b601f850160051c820191505b81811015620003585782815560010162000343565b5050505b505050565b81516001600160401b038111156200037d576200037d62000139565b62000395816200038e8454620002d5565b846200030f565b602080601f831160018114620003cb575f8415620003b35750858301515b5f19600386901b1c1916600185901b17855562000358565b5f85815260208120601f198616915b82811015620003fb57888601518255948401946001909101908401620003da565b50858210156200041957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a0516122f9620004605f395f818161055601528181610ae80152610f8901525f818161068f015261105901526122f95ff3fe608060405260043610610215575f3560e01c80638462151c1161011e578063d5abeb01116100a8578063e985e9c51161006d578063e985e9c5146105f3578063f2fde38b14610612578063f401f8a014610631578063f4a0a5281461065f578063fcf07c6b1461067e575f80fd5b8063d5abeb0114610545578063d7fe157e14610578578063d8259bd614610597578063d9caed12146105b6578063dc90e2a6146105d5575f80fd5b8063a22cb465116100ee578063a22cb465146104b6578063b6854f96146104d5578063b88d4fde146104f4578063c87b56dd14610507578063cb46f88514610526575f80fd5b80638462151c146104465780638da5cb5b1461047257806395d89b411461048f578063a0712d68146104a3575f80fd5b80634d787ea91161019f5780636817c76c1161016f5780636817c76c146103c057806370a08231146103d5578063715018a6146103f45780637420aa36146104085780637df325e114610427575f80fd5b80634d787ea91461034a57806355c7ba141461036957806355f804b3146103825780636352211e146103a1575f80fd5b806318160ddd116101e557806318160ddd146102c1578063190eb047146102e257806323b872dd1461031057806342842e0e14610323578063473488ff14610336575f80fd5b806301ffc9a71461022057806306fdde0314610254578063081812fc14610275578063095ea7b3146102ac575f80fd5b3661021c57005b5f80fd5b34801561022b575f80fd5b5061023f61023a366004611cb8565b6106b1565b60405190151581526020015b60405180910390f35b34801561025f575f80fd5b50610268610702565b60405161024b9190611d20565b348015610280575f80fd5b5061029461028f366004611d32565b610792565b6040516001600160a01b03909116815260200161024b565b6102bf6102ba366004611d5d565b6107cb565b005b3480156102cc575f80fd5b506001545f54035b60405190815260200161024b565b3480156102ed575f80fd5b5061023f6102fc366004611d87565b600e6020525f908152604090205460ff1681565b6102bf61031e366004611da2565b6107db565b6102bf610331366004611da2565b610942565b348015610341575f80fd5b506102bf610961565b348015610355575f80fd5b506102bf610364366004611d32565b610b8f565b348015610374575f80fd5b5060105461023f9060ff1681565b34801561038d575f80fd5b506102bf61039c366004611de0565b610c75565b3480156103ac575f80fd5b506102946103bb366004611d32565b610c8a565b3480156103cb575f80fd5b506102d4600c5481565b3480156103e0575f80fd5b506102d46103ef366004611d87565b610c94565b3480156103ff575f80fd5b506102bf610cd8565b348015610413575f80fd5b506102bf610422366004611e59565b610ceb565b348015610432575f80fd5b506102bf610441366004611da2565b610d3b565b348015610451575f80fd5b50610465610460366004611d87565b610e6d565b60405161024b9190611e74565b34801561047d575f80fd5b506009546001600160a01b0316610294565b34801561049a575f80fd5b50610268610ed6565b6102bf6104b1366004611d32565b610ee5565b3480156104c1575f80fd5b506102bf6104d0366004611eb7565b61112d565b3480156104e0575f80fd5b506102bf6104ef366004611d32565b611198565b6102bf610502366004611f02565b61128c565b348015610512575f80fd5b50610268610521366004611d32565b6112cd565b348015610531575f80fd5b50600d54610294906001600160a01b031681565b348015610550575f80fd5b506102d47f000000000000000000000000000000000000000000000000000000000000000081565b348015610583575f80fd5b506102bf610592366004611e59565b611345565b3480156105a2575f80fd5b506102bf6105b1366004611d87565b611396565b3480156105c1575f80fd5b506102bf6105d0366004611da2565b6113c0565b3480156105e0575f80fd5b5060105461023f90610100900460ff1681565b3480156105fe575f80fd5b5061023f61060d366004611fdb565b61158d565b34801561061d575f80fd5b506102bf61062c366004611d87565b6115ba565b34801561063c575f80fd5b5061023f61064b366004611d32565b600f6020525f908152604090205460ff1681565b34801561066a575f80fd5b506102bf610679366004611d32565b6115f4565b348015610689575f80fd5b506102947f000000000000000000000000000000000000000000000000000000000000000081565b5f6301ffc9a760e01b6001600160e01b0319831614806106e157506380ac58cd60e01b6001600160e01b03198316145b806106fc5750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461071190612007565b80601f016020809104026020016040519081016040528092919081815260200182805461073d90612007565b80156107885780601f1061075f57610100808354040283529160200191610788565b820191905f5260205f20905b81548152906001019060200180831161076b57829003601f168201915b5050505050905090565b5f61079c82611601565b6107b0576107b06333d1c03960e21b611643565b505f908152600660205260409020546001600160a01b031690565b6107d78282600161164b565b5050565b5f6107e5826116ec565b6001600160a01b03948516949091508116841461080b5761080b62a1148160e81b611643565b5f8281526006602052604090208054338082146001600160a01b0388169091141761084e5761083a863361158d565b61084e5761084e632ce44b5f60e11b611643565b61085b868686600161177b565b8015610865575f82555b6001600160a01b038681165f9081526005602052604080822080545f19019055918716808252919020805460010190554260a01b17600160e11b175f85815260046020526040812091909155600160e11b841690036108f157600184015f8181526004602052604081205490036108ef575f5481146108ef575f8181526004602052604090208490555b505b6001600160a01b0385168481887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4805f0361093957610939633a954ecd60e21b611643565b50505050505050565b61095c83838360405180602001604052805f81525061128c565b505050565b601054610100900460ff166109c85760405162461bcd60e51b815260206004820152602260248201527f4561726c79206269726473206d696e74696e67206973206e6f7420656e61626c604482015261195960f21b60648201526084015b60405180910390fd5b600d54604051632e3162cb60e11b81523260048201819052916001600160a01b031690635c62c59690602401602060405180830381865afa158015610a0f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a33919061203f565b610a735760405162461bcd60e51b8152602060048201526011602482015270139bdd08185b8819585c9b1e48189a5c99607a1b60448201526064016109bf565b6001600160a01b0381165f908152600e602052604090205460ff1615610ae65760405162461bcd60e51b815260206004820152602260248201527f7573657220616c72656164792075736564206561726c79206269726473206d696044820152611b9d60f21b60648201526084016109bf565b7f0000000000000000000000000000000000000000000000000000000000000000610b136001545f540390565b610b1e90600161206e565b1115610b615760405162461bcd60e51b815260206004820152601260248201527145786365656473206d617820737570706c7960701b60448201526064016109bf565b610b6c3360016118b4565b6001600160a01b03165f908152600e60205260409020805460ff19166001179055565b610b9761197a565b610ba081611601565b610be35760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b60448201526064016109bf565b5f818152600f602052604090205460ff16610c365760405162461bcd60e51b81526020600482015260136024820152722a37b5b2b71034b9903737ba10333937bd32b760691b60448201526064016109bf565b5f818152600f6020526040808220805460ff191690555182917fdad54db74d8c1152c7cb496a900d181b8e9b69b70e55db2362bd100897a4f7a191a250565b610c7d61197a565b600b61095c8284836120ce565b5f6106fc826116ec565b5f6001600160a01b038216610cb357610cb36323d3ad8160e21b611643565b506001600160a01b03165f9081526005602052604090205467ffffffffffffffff1690565b610ce061197a565b610ce95f6119a7565b565b610cf361197a565b6010805460ff19168215159081179091556040519081527f41f386d449eec03c1c3b75bbba9c18df70aa19779ff47f68eab4b6a66fb399d4906020015b60405180910390a150565b610d4361197a565b6040516331a9108f60e11b815260048101829052839030906001600160a01b03831690636352211e90602401602060405180830381865afa158015610d8a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dae9190612189565b6001600160a01b031614610e045760405162461bcd60e51b815260206004820181905260248201527f436f6e747261637420646f6573206e6f74206f776e207468697320746f6b656e60448201526064016109bf565b604051632142170760e11b81523060048201526001600160a01b038481166024830152604482018490528216906342842e0e906064015f604051808303815f87803b158015610e51575f80fd5b505af1158015610e63573d5f803e3d5ffd5b5050505050505050565b6001600160a01b0381165f90815260116020908152604091829020805483518184028101840190945280845260609392830182828015610eca57602002820191905f5260205f20905b815481526020019060010190808311610eb6575b50505050509050919050565b60606003805461071190612007565b610eed6119f8565b60105460ff16610f385760405162461bcd60e51b8152602060048201526016602482015275135a5b9d1a5b99c81a5cc81b9bdd08195b98589b195960521b60448201526064016109bf565b5f8111610f875760405162461bcd60e51b815260206004820152601f60248201527f5175616e74697479206d7573742062652067726561746572207468616e20300060448201526064016109bf565b7f000000000000000000000000000000000000000000000000000000000000000081610fb56001545f540390565b610fbf919061206e565b11156110025760405162461bcd60e51b815260206004820152601260248201527145786365656473206d617820737570706c7960701b60448201526064016109bf565b80600c5461101091906121a4565b3410156110565760405162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b60448201526064016109bf565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316346040515f6040518083038185875af1925050503d805f81146110bf576040519150601f19603f3d011682016040523d82523d5f602084013e6110c4565b606091505b50509050806111155760405162461bcd60e51b815260206004820152601d60248201527f5472616e7366657220746f20666f756e646174696f6e206661696c656400000060448201526064016109bf565b61111f33836118b4565b5061112a6001600a55565b50565b335f8181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6111a061197a565b6111a981611601565b6111ec5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b60448201526064016109bf565b5f818152600f602052604090205460ff161561124a5760405162461bcd60e51b815260206004820152601760248201527f546f6b656e20697320616c72656164792066726f7a656e00000000000000000060448201526064016109bf565b5f818152600f6020526040808220805460ff191660011790555182917f74308730007d8ee5b3c18fad784efa3555f62695e36960f803f475eeb663d10e91a250565b6112978484846107db565b6001600160a01b0383163b156112c7576112b384848484611a22565b6112c7576112c76368d2bf6b60e11b611643565b50505050565b60606112d882611601565b6112ec576112ec630a14c4b560e41b611643565b5f6112f5611b00565b905080515f036113135760405180602001604052805f81525061133e565b8061131d84611b0f565b60405160200161132e9291906121bb565b6040516020818303038152906040525b9392505050565b61134d61197a565b601080548215156101000261ff00199091161790556040517f521195d1eba502bdf05813543ca2977f55c792fc7e722a66cc501e68b5d9f09390610d3090831515815260200190565b61139e61197a565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6113c861197a565b6001600160a01b03821661148357604080515f808252602082019092526001600160a01b0385169083906040516113ff91906121e9565b5f6040518083038185875af1925050503d805f8114611439576040519150601f19603f3d011682016040523d82523d5f602084013e61143e565b606091505b50509050806112c75760405162461bcd60e51b815260206004820152601160248201527015da5d1a191c985dd85b0819985a5b1959607a1b60448201526064016109bf565b604080516001600160a01b038581166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f928392908616916114de91906121e9565b5f604051808303815f865af19150503d805f8114611517576040519150601f19603f3d011682016040523d82523d5f602084013e61151c565b606091505b5091509150818015611546575080511580611546575080806020019051810190611546919061203f565b6115865760405162461bcd60e51b815260206004820152601160248201527015da5d1a191c985dd85b0819985a5b1959607a1b60448201526064016109bf565b5050505050565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205460ff1690565b6115c261197a565b6001600160a01b0381166115eb57604051631e4fbdf760e01b81525f60048201526024016109bf565b61112a816119a7565b6115fc61197a565b600c55565b5f805482101561163e575f5b505f82815260046020526040812054908190036116345761162d83612204565b925061160d565b600160e01b161590505b919050565b805f5260045ffd5b5f61165583610c8a565b905081801561166d5750336001600160a01b03821614155b156116905761167c813361158d565b611690576116906367d9dca160e11b611643565b5f8381526006602052604080822080546001600160a01b0319166001600160a01b0388811691821790925591518693918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050565b5f81815260046020526040902054805f03611759575f54821061171957611719636f96cda160e11b611643565b5b505f19015f81815260046020526040902054801561171a57600160e01b81165f0361174457919050565b611754636f96cda160e11b611643565b61171a565b600160e01b81165f0361176b57919050565b61163e636f96cda160e11b611643565b6001600160a01b0384166117c3575f5b818110156117bd575f61179e828561206e565b90506117aa8582611b52565b50806117b581612219565b91505061178b565b506112c7565b6001600160a01b038316611805575f5b818110156117bd575f6117e6828561206e565b90506117f28682611ba0565b50806117fd81612219565b9150506117d3565b5f5b81811015611586575f61181a828561206e565b5f818152600f602052604090205490915060ff161561188d5760405162461bcd60e51b815260206004820152602960248201527f546f6b656e2069732066726f7a656e20616e642063616e6e6f74206265207472604482015268185b9cd9995c9c995960ba1b60648201526084016109bf565b6118978682611ba0565b6118a18582611b52565b50806118ac81612219565b915050611807565b5f8054908290036118cf576118cf63b562e8dd60e01b611643565b6118db5f84838561177b565b5f8181526004602090815260408083206001600160a01b0387164260a01b6001881460e11b1781179091558084526005909252822080546801000000000000000186020190559081900361193857611938622e076360e81b611643565b818301825b80835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a481816001019150810361193d57505f5550505050565b6009546001600160a01b03163314610ce95760405163118cdaa760e01b81523360048201526024016109bf565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6002600a5403611a1b57604051633ee5aeb560e01b815260040160405180910390fd5b6002600a55565b604051630a85bd0160e11b81525f906001600160a01b0385169063150b7a0290611a56903390899088908890600401612231565b6020604051808303815f875af1925050508015611a90575060408051601f3d908101601f19168201909252611a8d9181019061226d565b60015b611ae3573d808015611abd576040519150601f19603f3d011682016040523d82523d5f602084013e611ac2565b606091505b5080515f03611adb57611adb6368d2bf6b60e11b611643565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6060600b805461071190612007565b606060a06040510180604052602081039150505f815280825b600183039250600a81066030018353600a900480611b285750819003601f19909101908152919050565b6001600160a01b0382165f818152601160209081526040822080546001818101835582855292842001859055929091529054611b8e9190612288565b5f918252601260205260409091205550565b6001600160a01b0382165f90815260116020526040812054611bc490600190612288565b5f83815260126020526040902054909150808214611c64576001600160a01b0384165f908152601160205260408120805484908110611c0557611c0561229b565b905f5260205f20015490508060115f876001600160a01b03166001600160a01b031681526020019081526020015f208381548110611c4557611c4561229b565b5f91825260208083209091019290925591825260129052604090208190555b6001600160a01b0384165f908152601160205260409020805480611c8a57611c8a6122af565b600190038181905f5260205f20015f9055905550505050565b6001600160e01b03198116811461112a575f80fd5b5f60208284031215611cc8575f80fd5b813561133e81611ca3565b5f5b83811015611ced578181015183820152602001611cd5565b50505f910152565b5f8151808452611d0c816020860160208601611cd3565b601f01601f19169290920160200192915050565b602081525f61133e6020830184611cf5565b5f60208284031215611d42575f80fd5b5035919050565b6001600160a01b038116811461112a575f80fd5b5f8060408385031215611d6e575f80fd5b8235611d7981611d49565b946020939093013593505050565b5f60208284031215611d97575f80fd5b813561133e81611d49565b5f805f60608486031215611db4575f80fd5b8335611dbf81611d49565b92506020840135611dcf81611d49565b929592945050506040919091013590565b5f8060208385031215611df1575f80fd5b823567ffffffffffffffff80821115611e08575f80fd5b818501915085601f830112611e1b575f80fd5b813581811115611e29575f80fd5b866020828501011115611e3a575f80fd5b60209290920196919550909350505050565b801515811461112a575f80fd5b5f60208284031215611e69575f80fd5b813561133e81611e4c565b602080825282518282018190525f9190848201906040850190845b81811015611eab57835183529284019291840191600101611e8f565b50909695505050505050565b5f8060408385031215611ec8575f80fd5b8235611ed381611d49565b91506020830135611ee381611e4c565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f805f8060808587031215611f15575f80fd5b8435611f2081611d49565b93506020850135611f3081611d49565b925060408501359150606085013567ffffffffffffffff80821115611f53575f80fd5b818701915087601f830112611f66575f80fd5b813581811115611f7857611f78611eee565b604051601f8201601f19908116603f01168101908382118183101715611fa057611fa0611eee565b816040528281528a6020848701011115611fb8575f80fd5b826020860160208301375f60208483010152809550505050505092959194509250565b5f8060408385031215611fec575f80fd5b8235611ff781611d49565b91506020830135611ee381611d49565b600181811c9082168061201b57607f821691505b60208210810361203957634e487b7160e01b5f52602260045260245ffd5b50919050565b5f6020828403121561204f575f80fd5b815161133e81611e4c565b634e487b7160e01b5f52601160045260245ffd5b808201808211156106fc576106fc61205a565b601f82111561095c575f81815260208120601f850160051c810160208610156120a75750805b601f850160051c820191505b818110156120c6578281556001016120b3565b505050505050565b67ffffffffffffffff8311156120e6576120e6611eee565b6120fa836120f48354612007565b83612081565b5f601f84116001811461212b575f85156121145750838201355b5f19600387901b1c1916600186901b178355611586565b5f83815260209020601f19861690835b8281101561215b578685013582556020948501946001909201910161213b565b5086821015612177575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f60208284031215612199575f80fd5b815161133e81611d49565b80820281158282048414176106fc576106fc61205a565b5f83516121cc818460208801611cd3565b8351908301906121e0818360208801611cd3565b01949350505050565b5f82516121fa818460208701611cd3565b9190910192915050565b5f816122125761221261205a565b505f190190565b5f6001820161222a5761222a61205a565b5060010190565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061226390830184611cf5565b9695505050505050565b5f6020828403121561227d575f80fd5b815161133e81611ca3565b818103818111156106fc576106fc61205a565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea264697066735822122055929c3e11daf45ebd8fc76d11823fb9db5581f0a078f250e3be5c62ce00e39064736f6c6343000814003300000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000ac9ae05a71ebc0000000000000000000000000000000000bd56b452187c49911392832fdd9061fb9a00000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000acb5b62f983e7e6850a9b21f3d947bd0c53523ea000000000000000000000000000000000000000000000000000000000000000844696e6f42797465000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000844696e6f42797465000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002168747470733a2f2f64696e6f627974652e78797a2f6e66742f6d6574616461746100000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405260043610610215575f3560e01c80638462151c1161011e578063d5abeb01116100a8578063e985e9c51161006d578063e985e9c5146105f3578063f2fde38b14610612578063f401f8a014610631578063f4a0a5281461065f578063fcf07c6b1461067e575f80fd5b8063d5abeb0114610545578063d7fe157e14610578578063d8259bd614610597578063d9caed12146105b6578063dc90e2a6146105d5575f80fd5b8063a22cb465116100ee578063a22cb465146104b6578063b6854f96146104d5578063b88d4fde146104f4578063c87b56dd14610507578063cb46f88514610526575f80fd5b80638462151c146104465780638da5cb5b1461047257806395d89b411461048f578063a0712d68146104a3575f80fd5b80634d787ea91161019f5780636817c76c1161016f5780636817c76c146103c057806370a08231146103d5578063715018a6146103f45780637420aa36146104085780637df325e114610427575f80fd5b80634d787ea91461034a57806355c7ba141461036957806355f804b3146103825780636352211e146103a1575f80fd5b806318160ddd116101e557806318160ddd146102c1578063190eb047146102e257806323b872dd1461031057806342842e0e14610323578063473488ff14610336575f80fd5b806301ffc9a71461022057806306fdde0314610254578063081812fc14610275578063095ea7b3146102ac575f80fd5b3661021c57005b5f80fd5b34801561022b575f80fd5b5061023f61023a366004611cb8565b6106b1565b60405190151581526020015b60405180910390f35b34801561025f575f80fd5b50610268610702565b60405161024b9190611d20565b348015610280575f80fd5b5061029461028f366004611d32565b610792565b6040516001600160a01b03909116815260200161024b565b6102bf6102ba366004611d5d565b6107cb565b005b3480156102cc575f80fd5b506001545f54035b60405190815260200161024b565b3480156102ed575f80fd5b5061023f6102fc366004611d87565b600e6020525f908152604090205460ff1681565b6102bf61031e366004611da2565b6107db565b6102bf610331366004611da2565b610942565b348015610341575f80fd5b506102bf610961565b348015610355575f80fd5b506102bf610364366004611d32565b610b8f565b348015610374575f80fd5b5060105461023f9060ff1681565b34801561038d575f80fd5b506102bf61039c366004611de0565b610c75565b3480156103ac575f80fd5b506102946103bb366004611d32565b610c8a565b3480156103cb575f80fd5b506102d4600c5481565b3480156103e0575f80fd5b506102d46103ef366004611d87565b610c94565b3480156103ff575f80fd5b506102bf610cd8565b348015610413575f80fd5b506102bf610422366004611e59565b610ceb565b348015610432575f80fd5b506102bf610441366004611da2565b610d3b565b348015610451575f80fd5b50610465610460366004611d87565b610e6d565b60405161024b9190611e74565b34801561047d575f80fd5b506009546001600160a01b0316610294565b34801561049a575f80fd5b50610268610ed6565b6102bf6104b1366004611d32565b610ee5565b3480156104c1575f80fd5b506102bf6104d0366004611eb7565b61112d565b3480156104e0575f80fd5b506102bf6104ef366004611d32565b611198565b6102bf610502366004611f02565b61128c565b348015610512575f80fd5b50610268610521366004611d32565b6112cd565b348015610531575f80fd5b50600d54610294906001600160a01b031681565b348015610550575f80fd5b506102d47f00000000000000000000000000000000000000000000000000000000000007d081565b348015610583575f80fd5b506102bf610592366004611e59565b611345565b3480156105a2575f80fd5b506102bf6105b1366004611d87565b611396565b3480156105c1575f80fd5b506102bf6105d0366004611da2565b6113c0565b3480156105e0575f80fd5b5060105461023f90610100900460ff1681565b3480156105fe575f80fd5b5061023f61060d366004611fdb565b61158d565b34801561061d575f80fd5b506102bf61062c366004611d87565b6115ba565b34801561063c575f80fd5b5061023f61064b366004611d32565b600f6020525f908152604090205460ff1681565b34801561066a575f80fd5b506102bf610679366004611d32565b6115f4565b348015610689575f80fd5b506102947f000000000000000000000000000000bd56b452187c49911392832fdd9061fb9a81565b5f6301ffc9a760e01b6001600160e01b0319831614806106e157506380ac58cd60e01b6001600160e01b03198316145b806106fc5750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461071190612007565b80601f016020809104026020016040519081016040528092919081815260200182805461073d90612007565b80156107885780601f1061075f57610100808354040283529160200191610788565b820191905f5260205f20905b81548152906001019060200180831161076b57829003601f168201915b5050505050905090565b5f61079c82611601565b6107b0576107b06333d1c03960e21b611643565b505f908152600660205260409020546001600160a01b031690565b6107d78282600161164b565b5050565b5f6107e5826116ec565b6001600160a01b03948516949091508116841461080b5761080b62a1148160e81b611643565b5f8281526006602052604090208054338082146001600160a01b0388169091141761084e5761083a863361158d565b61084e5761084e632ce44b5f60e11b611643565b61085b868686600161177b565b8015610865575f82555b6001600160a01b038681165f9081526005602052604080822080545f19019055918716808252919020805460010190554260a01b17600160e11b175f85815260046020526040812091909155600160e11b841690036108f157600184015f8181526004602052604081205490036108ef575f5481146108ef575f8181526004602052604090208490555b505b6001600160a01b0385168481887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4805f0361093957610939633a954ecd60e21b611643565b50505050505050565b61095c83838360405180602001604052805f81525061128c565b505050565b601054610100900460ff166109c85760405162461bcd60e51b815260206004820152602260248201527f4561726c79206269726473206d696e74696e67206973206e6f7420656e61626c604482015261195960f21b60648201526084015b60405180910390fd5b600d54604051632e3162cb60e11b81523260048201819052916001600160a01b031690635c62c59690602401602060405180830381865afa158015610a0f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a33919061203f565b610a735760405162461bcd60e51b8152602060048201526011602482015270139bdd08185b8819585c9b1e48189a5c99607a1b60448201526064016109bf565b6001600160a01b0381165f908152600e602052604090205460ff1615610ae65760405162461bcd60e51b815260206004820152602260248201527f7573657220616c72656164792075736564206561726c79206269726473206d696044820152611b9d60f21b60648201526084016109bf565b7f00000000000000000000000000000000000000000000000000000000000007d0610b136001545f540390565b610b1e90600161206e565b1115610b615760405162461bcd60e51b815260206004820152601260248201527145786365656473206d617820737570706c7960701b60448201526064016109bf565b610b6c3360016118b4565b6001600160a01b03165f908152600e60205260409020805460ff19166001179055565b610b9761197a565b610ba081611601565b610be35760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b60448201526064016109bf565b5f818152600f602052604090205460ff16610c365760405162461bcd60e51b81526020600482015260136024820152722a37b5b2b71034b9903737ba10333937bd32b760691b60448201526064016109bf565b5f818152600f6020526040808220805460ff191690555182917fdad54db74d8c1152c7cb496a900d181b8e9b69b70e55db2362bd100897a4f7a191a250565b610c7d61197a565b600b61095c8284836120ce565b5f6106fc826116ec565b5f6001600160a01b038216610cb357610cb36323d3ad8160e21b611643565b506001600160a01b03165f9081526005602052604090205467ffffffffffffffff1690565b610ce061197a565b610ce95f6119a7565b565b610cf361197a565b6010805460ff19168215159081179091556040519081527f41f386d449eec03c1c3b75bbba9c18df70aa19779ff47f68eab4b6a66fb399d4906020015b60405180910390a150565b610d4361197a565b6040516331a9108f60e11b815260048101829052839030906001600160a01b03831690636352211e90602401602060405180830381865afa158015610d8a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dae9190612189565b6001600160a01b031614610e045760405162461bcd60e51b815260206004820181905260248201527f436f6e747261637420646f6573206e6f74206f776e207468697320746f6b656e60448201526064016109bf565b604051632142170760e11b81523060048201526001600160a01b038481166024830152604482018490528216906342842e0e906064015f604051808303815f87803b158015610e51575f80fd5b505af1158015610e63573d5f803e3d5ffd5b5050505050505050565b6001600160a01b0381165f90815260116020908152604091829020805483518184028101840190945280845260609392830182828015610eca57602002820191905f5260205f20905b815481526020019060010190808311610eb6575b50505050509050919050565b60606003805461071190612007565b610eed6119f8565b60105460ff16610f385760405162461bcd60e51b8152602060048201526016602482015275135a5b9d1a5b99c81a5cc81b9bdd08195b98589b195960521b60448201526064016109bf565b5f8111610f875760405162461bcd60e51b815260206004820152601f60248201527f5175616e74697479206d7573742062652067726561746572207468616e20300060448201526064016109bf565b7f00000000000000000000000000000000000000000000000000000000000007d081610fb56001545f540390565b610fbf919061206e565b11156110025760405162461bcd60e51b815260206004820152601260248201527145786365656473206d617820737570706c7960701b60448201526064016109bf565b80600c5461101091906121a4565b3410156110565760405162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b60448201526064016109bf565b5f7f000000000000000000000000000000bd56b452187c49911392832fdd9061fb9a6001600160a01b0316346040515f6040518083038185875af1925050503d805f81146110bf576040519150601f19603f3d011682016040523d82523d5f602084013e6110c4565b606091505b50509050806111155760405162461bcd60e51b815260206004820152601d60248201527f5472616e7366657220746f20666f756e646174696f6e206661696c656400000060448201526064016109bf565b61111f33836118b4565b5061112a6001600a55565b50565b335f8181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6111a061197a565b6111a981611601565b6111ec5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b60448201526064016109bf565b5f818152600f602052604090205460ff161561124a5760405162461bcd60e51b815260206004820152601760248201527f546f6b656e20697320616c72656164792066726f7a656e00000000000000000060448201526064016109bf565b5f818152600f6020526040808220805460ff191660011790555182917f74308730007d8ee5b3c18fad784efa3555f62695e36960f803f475eeb663d10e91a250565b6112978484846107db565b6001600160a01b0383163b156112c7576112b384848484611a22565b6112c7576112c76368d2bf6b60e11b611643565b50505050565b60606112d882611601565b6112ec576112ec630a14c4b560e41b611643565b5f6112f5611b00565b905080515f036113135760405180602001604052805f81525061133e565b8061131d84611b0f565b60405160200161132e9291906121bb565b6040516020818303038152906040525b9392505050565b61134d61197a565b601080548215156101000261ff00199091161790556040517f521195d1eba502bdf05813543ca2977f55c792fc7e722a66cc501e68b5d9f09390610d3090831515815260200190565b61139e61197a565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6113c861197a565b6001600160a01b03821661148357604080515f808252602082019092526001600160a01b0385169083906040516113ff91906121e9565b5f6040518083038185875af1925050503d805f8114611439576040519150601f19603f3d011682016040523d82523d5f602084013e61143e565b606091505b50509050806112c75760405162461bcd60e51b815260206004820152601160248201527015da5d1a191c985dd85b0819985a5b1959607a1b60448201526064016109bf565b604080516001600160a01b038581166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291515f928392908616916114de91906121e9565b5f604051808303815f865af19150503d805f8114611517576040519150601f19603f3d011682016040523d82523d5f602084013e61151c565b606091505b5091509150818015611546575080511580611546575080806020019051810190611546919061203f565b6115865760405162461bcd60e51b815260206004820152601160248201527015da5d1a191c985dd85b0819985a5b1959607a1b60448201526064016109bf565b5050505050565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205460ff1690565b6115c261197a565b6001600160a01b0381166115eb57604051631e4fbdf760e01b81525f60048201526024016109bf565b61112a816119a7565b6115fc61197a565b600c55565b5f805482101561163e575f5b505f82815260046020526040812054908190036116345761162d83612204565b925061160d565b600160e01b161590505b919050565b805f5260045ffd5b5f61165583610c8a565b905081801561166d5750336001600160a01b03821614155b156116905761167c813361158d565b611690576116906367d9dca160e11b611643565b5f8381526006602052604080822080546001600160a01b0319166001600160a01b0388811691821790925591518693918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050565b5f81815260046020526040902054805f03611759575f54821061171957611719636f96cda160e11b611643565b5b505f19015f81815260046020526040902054801561171a57600160e01b81165f0361174457919050565b611754636f96cda160e11b611643565b61171a565b600160e01b81165f0361176b57919050565b61163e636f96cda160e11b611643565b6001600160a01b0384166117c3575f5b818110156117bd575f61179e828561206e565b90506117aa8582611b52565b50806117b581612219565b91505061178b565b506112c7565b6001600160a01b038316611805575f5b818110156117bd575f6117e6828561206e565b90506117f28682611ba0565b50806117fd81612219565b9150506117d3565b5f5b81811015611586575f61181a828561206e565b5f818152600f602052604090205490915060ff161561188d5760405162461bcd60e51b815260206004820152602960248201527f546f6b656e2069732066726f7a656e20616e642063616e6e6f74206265207472604482015268185b9cd9995c9c995960ba1b60648201526084016109bf565b6118978682611ba0565b6118a18582611b52565b50806118ac81612219565b915050611807565b5f8054908290036118cf576118cf63b562e8dd60e01b611643565b6118db5f84838561177b565b5f8181526004602090815260408083206001600160a01b0387164260a01b6001881460e11b1781179091558084526005909252822080546801000000000000000186020190559081900361193857611938622e076360e81b611643565b818301825b80835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a481816001019150810361193d57505f5550505050565b6009546001600160a01b03163314610ce95760405163118cdaa760e01b81523360048201526024016109bf565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6002600a5403611a1b57604051633ee5aeb560e01b815260040160405180910390fd5b6002600a55565b604051630a85bd0160e11b81525f906001600160a01b0385169063150b7a0290611a56903390899088908890600401612231565b6020604051808303815f875af1925050508015611a90575060408051601f3d908101601f19168201909252611a8d9181019061226d565b60015b611ae3573d808015611abd576040519150601f19603f3d011682016040523d82523d5f602084013e611ac2565b606091505b5080515f03611adb57611adb6368d2bf6b60e11b611643565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6060600b805461071190612007565b606060a06040510180604052602081039150505f815280825b600183039250600a81066030018353600a900480611b285750819003601f19909101908152919050565b6001600160a01b0382165f818152601160209081526040822080546001818101835582855292842001859055929091529054611b8e9190612288565b5f918252601260205260409091205550565b6001600160a01b0382165f90815260116020526040812054611bc490600190612288565b5f83815260126020526040902054909150808214611c64576001600160a01b0384165f908152601160205260408120805484908110611c0557611c0561229b565b905f5260205f20015490508060115f876001600160a01b03166001600160a01b031681526020019081526020015f208381548110611c4557611c4561229b565b5f91825260208083209091019290925591825260129052604090208190555b6001600160a01b0384165f908152601160205260409020805480611c8a57611c8a6122af565b600190038181905f5260205f20015f9055905550505050565b6001600160e01b03198116811461112a575f80fd5b5f60208284031215611cc8575f80fd5b813561133e81611ca3565b5f5b83811015611ced578181015183820152602001611cd5565b50505f910152565b5f8151808452611d0c816020860160208601611cd3565b601f01601f19169290920160200192915050565b602081525f61133e6020830184611cf5565b5f60208284031215611d42575f80fd5b5035919050565b6001600160a01b038116811461112a575f80fd5b5f8060408385031215611d6e575f80fd5b8235611d7981611d49565b946020939093013593505050565b5f60208284031215611d97575f80fd5b813561133e81611d49565b5f805f60608486031215611db4575f80fd5b8335611dbf81611d49565b92506020840135611dcf81611d49565b929592945050506040919091013590565b5f8060208385031215611df1575f80fd5b823567ffffffffffffffff80821115611e08575f80fd5b818501915085601f830112611e1b575f80fd5b813581811115611e29575f80fd5b866020828501011115611e3a575f80fd5b60209290920196919550909350505050565b801515811461112a575f80fd5b5f60208284031215611e69575f80fd5b813561133e81611e4c565b602080825282518282018190525f9190848201906040850190845b81811015611eab57835183529284019291840191600101611e8f565b50909695505050505050565b5f8060408385031215611ec8575f80fd5b8235611ed381611d49565b91506020830135611ee381611e4c565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f805f8060808587031215611f15575f80fd5b8435611f2081611d49565b93506020850135611f3081611d49565b925060408501359150606085013567ffffffffffffffff80821115611f53575f80fd5b818701915087601f830112611f66575f80fd5b813581811115611f7857611f78611eee565b604051601f8201601f19908116603f01168101908382118183101715611fa057611fa0611eee565b816040528281528a6020848701011115611fb8575f80fd5b826020860160208301375f60208483010152809550505050505092959194509250565b5f8060408385031215611fec575f80fd5b8235611ff781611d49565b91506020830135611ee381611d49565b600181811c9082168061201b57607f821691505b60208210810361203957634e487b7160e01b5f52602260045260245ffd5b50919050565b5f6020828403121561204f575f80fd5b815161133e81611e4c565b634e487b7160e01b5f52601160045260245ffd5b808201808211156106fc576106fc61205a565b601f82111561095c575f81815260208120601f850160051c810160208610156120a75750805b601f850160051c820191505b818110156120c6578281556001016120b3565b505050505050565b67ffffffffffffffff8311156120e6576120e6611eee565b6120fa836120f48354612007565b83612081565b5f601f84116001811461212b575f85156121145750838201355b5f19600387901b1c1916600186901b178355611586565b5f83815260209020601f19861690835b8281101561215b578685013582556020948501946001909201910161213b565b5086821015612177575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f60208284031215612199575f80fd5b815161133e81611d49565b80820281158282048414176106fc576106fc61205a565b5f83516121cc818460208801611cd3565b8351908301906121e0818360208801611cd3565b01949350505050565b5f82516121fa818460208701611cd3565b9190910192915050565b5f816122125761221261205a565b505f190190565b5f6001820161222a5761222a61205a565b5060010190565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061226390830184611cf5565b9695505050505050565b5f6020828403121561227d575f80fd5b815161133e81611ca3565b818103818111156106fc576106fc61205a565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea264697066735822122055929c3e11daf45ebd8fc76d11823fb9db5581f0a078f250e3be5c62ce00e39064736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000ac9ae05a71ebc0000000000000000000000000000000000bd56b452187c49911392832fdd9061fb9a00000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000acb5b62f983e7e6850a9b21f3d947bd0c53523ea000000000000000000000000000000000000000000000000000000000000000844696e6f42797465000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000844696e6f42797465000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002168747470733a2f2f64696e6f627974652e78797a2f6e66742f6d6574616461746100000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): DinoByte
Arg [1] : symbol (string): DinoByte
Arg [2] : baseURI (string): https://dinobyte.xyz/nft/metadata
Arg [3] : _mintPrice (uint256): 199000000000000000000
Arg [4] : _foundationAddress (address): 0x000000bd56B452187C49911392832fDD9061fB9A
Arg [5] : _maxSupply (uint256): 2000
Arg [6] : _earlyBirdsChecker (address): 0xacb5b62F983E7e6850A9B21F3d947Bd0c53523ea
-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [3] : 00000000000000000000000000000000000000000000000ac9ae05a71ebc0000
Arg [4] : 000000000000000000000000000000bd56b452187c49911392832fdd9061fb9a
Arg [5] : 00000000000000000000000000000000000000000000000000000000000007d0
Arg [6] : 000000000000000000000000acb5b62f983e7e6850a9b21f3d947bd0c53523ea
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [8] : 44696e6f42797465000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [10] : 44696e6f42797465000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000021
Arg [12] : 68747470733a2f2f64696e6f627974652e78797a2f6e66742f6d657461646174
Arg [13] : 6100000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
74681:10921:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20598:639;;;;;;;;;;-1:-1:-1;20598:639:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;20598:639:0;;;;;;;;21500:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;28740:227::-;;;;;;;;;;-1:-1:-1;28740:227:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;28740:227:0;1533:203:1;28457:124:0;;;;;;:::i;:::-;;:::i;:::-;;16702:573;;;;;;;;;;-1:-1:-1;17146:12:0;;16763:14;17130:13;:28;16702:573;;;2343:25:1;;;2331:2;2316:18;16702:573:0;2197:177:1;75175:50:0;;;;;;;;;;-1:-1:-1;75175:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;33012:3523;;;;;;:::i;:::-;;:::i;36631:193::-;;;;;;:::i;:::-;;:::i;79280:705::-;;;;;;;;;;;;;:::i;80543:269::-;;;;;;;;;;-1:-1:-1;80543:269:0;;;;;:::i;:::-;;:::i;75388:36::-;;;;;;;;;;-1:-1:-1;75388:36:0;;;;;;;;76855:106;;;;;;;;;;-1:-1:-1;76855:106:0;;;;;:::i;:::-;;:::i;22902:152::-;;;;;;;;;;-1:-1:-1;22902:152:0;;;;;:::i;:::-;;:::i;74836:24::-;;;;;;;;;;;;;;;;18426:242;;;;;;;;;;-1:-1:-1;18426:242:0;;;;;:::i;:::-;;:::i;64162:103::-;;;;;;;;;;;;;:::i;77489:146::-;;;;;;;;;;-1:-1:-1;77489:146:0;;;;;:::i;:::-;;:::i;85149:409::-;;;;;;;;;;-1:-1:-1;85149:409:0;;;;;:::i;:::-;;:::i;78103:124::-;;;;;;;;;;-1:-1:-1;78103:124:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;63487:87::-;;;;;;;;;;-1:-1:-1;63560:6:0;;-1:-1:-1;;;;;63560:6:0;63487:87;;21676:104;;;;;;;;;;;;;:::i;78379:889::-;;;;;;:::i;:::-;;:::i;29307:234::-;;;;;;;;;;-1:-1:-1;29307:234:0;;;;;:::i;:::-;;:::i;80141:269::-;;;;;;;;;;-1:-1:-1;80141:269:0;;;;;:::i;:::-;;:::i;37422:416::-;;;;;;:::i;:::-;;:::i;21886:327::-;;;;;;;;;;-1:-1:-1;21886:327:0;;;;;:::i;:::-;;:::i;75061:43::-;;;;;;;;;;-1:-1:-1;75061:43:0;;;;-1:-1:-1;;;;;75061:43:0;;;74978:34;;;;;;;;;;;;;;;77736:176;;;;;;;;;;-1:-1:-1;77736:176:0;;;;;:::i;:::-;;:::i;77238:154::-;;;;;;;;;;-1:-1:-1;77238:154:0;;;;;:::i;:::-;;:::i;84245:644::-;;;;;;;;;;-1:-1:-1;84245:644:0;;;;;:::i;:::-;;:::i;75495:46::-;;;;;;;;;;-1:-1:-1;75495:46:0;;;;;;;;;;;29698:164;;;;;;;;;;-1:-1:-1;29698:164:0;;;;;:::i;:::-;;:::i;64420:220::-;;;;;;;;;;-1:-1:-1;64420:220:0;;;;;:::i;:::-;;:::i;75277:44::-;;;;;;;;;;-1:-1:-1;75277:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;77048:102;;;;;;;;;;-1:-1:-1;77048:102:0;;;;;:::i;:::-;;:::i;74900:42::-;;;;;;;;;;;;;;;20598:639;20683:4;-1:-1:-1;;;;;;;;;21007:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;21084:25:0;;;21007:102;:179;;;-1:-1:-1;;;;;;;;;;21161:25:0;;;21007:179;20987:199;20598:639;-1:-1:-1;;20598:639:0:o;21500:100::-;21554:13;21587:5;21580:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21500:100;:::o;28740:227::-;28816:7;28841:16;28849:7;28841;:16::i;:::-;28836:73;;28859:50;-1:-1:-1;;;28859:7:0;:50::i;:::-;-1:-1:-1;28929:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;28929:30:0;;28740:227::o;28457:124::-;28546:27;28555:2;28559:7;28568:4;28546:8;:27::i;:::-;28457:124;;:::o;33012:3523::-;33154:27;33184;33203:7;33184:18;:27::i;:::-;-1:-1:-1;;;;;33339:22:0;;;;33154:57;;-1:-1:-1;33399:45:0;;;;33395:95;;33446:44;-1:-1:-1;;;33446:7:0;:44::i;:::-;33504:27;32120:24;;;:15;:24;;;;;32348:26;;58697:10;31745:30;;;-1:-1:-1;;;;;31438:28:0;;31723:20;;;31720:56;33690:189;;33783:43;33800:4;58697:10;29698:164;:::i;33783:43::-;33778:101;;33828:51;-1:-1:-1;;;33828:7:0;:51::i;:::-;33892:43;33914:4;33920:2;33924:7;33933:1;33892:21;:43::i;:::-;34028:15;34025:160;;;34168:1;34147:19;34140:30;34025:160;-1:-1:-1;;;;;34565:24:0;;;;;;;:18;:24;;;;;;34563:26;;-1:-1:-1;;34563:26:0;;;34634:22;;;;;;;;;34632:24;;-1:-1:-1;34632:24:0;;;27559:11;27534:23;27530:41;27517:63;-1:-1:-1;;;27517:63:0;34927:26;;;;:17;:26;;;;;:175;;;;-1:-1:-1;;;35222:47:0;;:52;;35218:627;;35327:1;35317:11;;35295:19;35450:30;;;:17;:30;;;;;;:35;;35446:384;;35588:13;;35573:11;:28;35569:242;;35735:30;;;;:17;:30;;;;;:52;;;35569:242;35276:569;35218:627;-1:-1:-1;;;;;35977:20:0;;36357:7;35977:20;36287:4;36229:25;35958:16;;36094:299;36418:8;36430:1;36418:13;36414:58;;36433:39;-1:-1:-1;;;36433:7:0;:39::i;:::-;33143:3392;;;;33012:3523;;;:::o;36631:193::-;36777:39;36794:4;36800:2;36804:7;36777:39;;;;;;;;;;;;:16;:39::i;:::-;36631:193;;;:::o;79280:705::-;79390:26;;;;;;;79382:73;;;;-1:-1:-1;;;79382:73:0;;7700:2:1;79382:73:0;;;7682:21:1;7739:2;7719:18;;;7712:30;7778:34;7758:18;;;7751:62;-1:-1:-1;;;7829:18:1;;;7822:32;7871:19;;79382:73:0;;;;;;;;;79573:17;;:36;;-1:-1:-1;;;79573:36:0;;79491:9;79573:36;;;1679:51:1;;;79491:9:0;-1:-1:-1;;;;;79573:17:0;;:30;;1652:18:1;;79573:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;79565:66;;;;-1:-1:-1;;;79565:66:0;;8353:2:1;79565:66:0;;;8335:21:1;8392:2;8372:18;;;8365:30;-1:-1:-1;;;8411:18:1;;;8404:47;8468:18;;79565:66:0;8151:341:1;79565:66:0;-1:-1:-1;;;;;79661:24:0;;;;;;:18;:24;;;;;;;;79660:25;79652:72;;;;-1:-1:-1;;;79652:72:0;;8699:2:1;79652:72:0;;;8681:21:1;8738:2;8718:18;;;8711:30;8777:34;8757:18;;;8750:62;-1:-1:-1;;;8828:18:1;;;8821:32;8870:19;;79652:72:0;8497:398:1;79652:72:0;79829:9;79808:13;17146:12;;16763:14;17130:13;:28;16702:573;;79808:13;:17;;79824:1;79808:17;:::i;:::-;:30;;79800:61;;;;-1:-1:-1;;;79800:61:0;;9364:2:1;79800:61:0;;;9346:21:1;9403:2;9383:18;;;9376:30;-1:-1:-1;;;9422:18:1;;;9415:48;9480:18;;79800:61:0;9162:342:1;79800:61:0;79913:20;79919:10;79931:1;79913:5;:20::i;:::-;-1:-1:-1;;;;;79946:24:0;;;;;:18;:24;;;;;:31;;-1:-1:-1;;79946:31:0;79973:4;79946:31;;;79280:705::o;80543:269::-;63373:13;:11;:13::i;:::-;80621:16:::1;80629:7;80621;:16::i;:::-;80613:49;;;::::0;-1:-1:-1;;;80613:49:0;;9711:2:1;80613:49:0::1;::::0;::::1;9693:21:1::0;9750:2;9730:18;;;9723:30;-1:-1:-1;;;9769:18:1;;;9762:50;9829:18;;80613:49:0::1;9509:344:1::0;80613:49:0::1;80681:21;::::0;;;:12:::1;:21;::::0;;;;;::::1;;80673:53;;;::::0;-1:-1:-1;;;80673:53:0;;10060:2:1;80673:53:0::1;::::0;::::1;10042:21:1::0;10099:2;10079:18;;;10072:30;-1:-1:-1;;;10118:18:1;;;10111:49;10177:18;;80673:53:0::1;9858:343:1::0;80673:53:0::1;80761:5;80737:21:::0;;;:12:::1;:21;::::0;;;;;:29;;-1:-1:-1;;80737:29:0::1;::::0;;80782:22;80750:7;;80782:22:::1;::::0;::::1;80543:269:::0;:::o;76855:106::-;63373:13;:11;:13::i;:::-;76930::::1;:23;76946:7:::0;;76930:13;:23:::1;:::i;22902:152::-:0;22974:7;23017:27;23036:7;23017:18;:27::i;18426:242::-;18498:7;-1:-1:-1;;;;;18522:19:0;;18518:69;;18543:44;-1:-1:-1;;;18543:7:0;:44::i;:::-;-1:-1:-1;;;;;;18605:25:0;;;;;:18;:25;;;;;;11186:13;18605:55;;18426:242::o;64162:103::-;63373:13;:11;:13::i;:::-;64227:30:::1;64254:1;64227:18;:30::i;:::-;64162:103::o:0;77489:146::-;63373:13;:11;:13::i;:::-;77558:16:::1;:25:::0;;-1:-1:-1;;77558:25:0::1;::::0;::::1;;::::0;;::::1;::::0;;;77599:28:::1;::::0;540:41:1;;;77599:28:0::1;::::0;528:2:1;513:18;77599:28:0::1;;;;;;;;77489:146:::0;:::o;85149:409::-;63373:13;:11;:13::i;:::-;85358:21:::1;::::0;-1:-1:-1;;;85358:21:0;;::::1;::::0;::::1;2343:25:1::0;;;85326:12:0;;85391:4:::1;::::0;-1:-1:-1;;;;;85358:11:0;::::1;::::0;::::1;::::0;2316:18:1;;85358:21:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;85358:38:0::1;;85350:83;;;::::0;-1:-1:-1;;;85350:83:0;;12722:2:1;85350:83:0::1;::::0;::::1;12704:21:1::0;;;12741:18;;;12734:30;12800:34;12780:18;;;12773:62;12852:18;;85350:83:0::1;12520:356:1::0;85350:83:0::1;85500:50;::::0;-1:-1:-1;;;85500:50:0;;85529:4:::1;85500:50;::::0;::::1;13121:34:1::0;-1:-1:-1;;;;;13191:15:1;;;13171:18;;;13164:43;13223:18;;;13216:34;;;85500:20:0;::::1;::::0;::::1;::::0;13056:18:1;;85500:50:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;85243:315;85149:409:::0;;;:::o;78103:124::-;-1:-1:-1;;;;;78200:19:0;;;;;;:12;:19;;;;;;;;;78193:26;;;;;;;;;;;;;;;;;78164:16;;78193:26;;;78200:19;78193:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78103:124;;;:::o;21676:104::-;21732:13;21765:7;21758:14;;;;;:::i;78379:889::-;67440:21;:19;:21::i;:::-;78500:16:::1;::::0;::::1;;78492:51;;;::::0;-1:-1:-1;;;78492:51:0;;13463:2:1;78492:51:0::1;::::0;::::1;13445:21:1::0;13502:2;13482:18;;;13475:30;-1:-1:-1;;;13521:18:1;;;13514:52;13583:18;;78492:51:0::1;13261:346:1::0;78492:51:0::1;78627:1;78616:8;:12;78608:56;;;::::0;-1:-1:-1;;;78608:56:0;;13814:2:1;78608:56:0::1;::::0;::::1;13796:21:1::0;13853:2;13833:18;;;13826:30;13892:33;13872:18;;;13865:61;13943:18;;78608:56:0::1;13612:355:1::0;78608:56:0::1;78784:9;78772:8;78756:13;17146:12:::0;;16763:14;17130:13;:28;16702:573;;78756:13:::1;:24;;;;:::i;:::-;:37;;78748:68;;;::::0;-1:-1:-1;;;78748:68:0;;9364:2:1;78748:68:0::1;::::0;::::1;9346:21:1::0;9403:2;9383:18;;;9376:30;-1:-1:-1;;;9422:18:1;;;9415:48;9480:18;;78748:68:0::1;9162:342:1::0;78748:68:0::1;78916:8;78904:9;;:20;;;;:::i;:::-;78891:9;:33;;78883:66;;;::::0;-1:-1:-1;;;78883:66:0;;14347:2:1;78883:66:0::1;::::0;::::1;14329:21:1::0;14386:2;14366:18;;;14359:30;-1:-1:-1;;;14405:18:1;;;14398:50;14465:18;;78883:66:0::1;14145:344:1::0;78883:66:0::1;79048:12;79066:17;-1:-1:-1::0;;;;;79066:22:0::1;79096:9;79066:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79047:63;;;79129:7;79121:49;;;::::0;-1:-1:-1;;;79121:49:0;;14906:2:1;79121:49:0::1;::::0;::::1;14888:21:1::0;14945:2;14925:18;;;14918:30;14984:31;14964:18;;;14957:59;15033:18;;79121:49:0::1;14704:353:1::0;79121:49:0::1;79233:27;79239:10;79251:8;79233:5;:27::i;:::-;78441:827;67484:20:::0;66775:1;68026:7;:21;67843:212;67484:20;78379:889;:::o;29307:234::-;58697:10;29402:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;29402:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;29402:60:0;;;;;;;;;;29478:55;;540:41:1;;;29402:49:0;;58697:10;29478:55;;513:18:1;29478:55:0;;;;;;;29307:234;;:::o;80141:269::-;63373:13;:11;:13::i;:::-;80217:16:::1;80225:7;80217;:16::i;:::-;80209:49;;;::::0;-1:-1:-1;;;80209:49:0;;9711:2:1;80209:49:0::1;::::0;::::1;9693:21:1::0;9750:2;9730:18;;;9723:30;-1:-1:-1;;;9769:18:1;;;9762:50;9829:18;;80209:49:0::1;9509:344:1::0;80209:49:0::1;80278:21;::::0;;;:12:::1;:21;::::0;;;;;::::1;;80277:22;80269:58;;;::::0;-1:-1:-1;;;80269:58:0;;15264:2:1;80269:58:0::1;::::0;::::1;15246:21:1::0;15303:2;15283:18;;;15276:30;15342:25;15322:18;;;15315:53;15385:18;;80269:58:0::1;15062:347:1::0;80269:58:0::1;80338:21;::::0;;;:12:::1;:21;::::0;;;;;:28;;-1:-1:-1;;80338:28:0::1;80362:4;80338:28;::::0;;80382:20;80351:7;;80382:20:::1;::::0;::::1;80141:269:::0;:::o;37422:416::-;37597:31;37610:4;37616:2;37620:7;37597:12;:31::i;:::-;-1:-1:-1;;;;;37643:14:0;;;:19;37639:192;;37682:56;37713:4;37719:2;37723:7;37732:5;37682:30;:56::i;:::-;37677:154;;37759:56;-1:-1:-1;;;37759:7:0;:56::i;:::-;37422:416;;;;:::o;21886:327::-;21959:13;21990:16;21998:7;21990;:16::i;:::-;21985:68;;22008:45;-1:-1:-1;;;22008:7:0;:45::i;:::-;22066:21;22090:10;:8;:10::i;:::-;22066:34;;22124:7;22118:21;22143:1;22118:26;:87;;;;;;;;;;;;;;;;;22171:7;22180:18;22190:7;22180:9;:18::i;:::-;22154:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22118:87;22111:94;21886:327;-1:-1:-1;;;21886:327:0:o;77736:176::-;63373:13;:11;:13::i;:::-;77815:26:::1;:35:::0;;;::::1;;;;-1:-1:-1::0;;77815:35:0;;::::1;;::::0;;77866:38:::1;::::0;::::1;::::0;::::1;::::0;77844:6;565:14:1;558:22;540:41;;528:2;513:18;;400:187;77238:154:0;63373:13;:11;:13::i;:::-;77326:17:::1;:58:::0;;-1:-1:-1;;;;;;77326:58:0::1;-1:-1:-1::0;;;;;77326:58:0;;;::::1;::::0;;;::::1;::::0;;77238:154::o;84245:644::-;63373:13;:11;:13::i;:::-;-1:-1:-1;;;;;84342:20:0;::::1;84338:544;;84422:12;::::0;;84380::::1;84422::::0;;;::::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;84398:8:0;::::1;::::0;84414:6;;84398:37:::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84379:56;;;84458:7;84450:37;;;::::0;-1:-1:-1;;;84450:37:0;;16409:2:1;84450:37:0::1;::::0;::::1;16391:21:1::0;16448:2;16428:18;;;16421:30;-1:-1:-1;;;16467:18:1;;;16460:47;16524:18;;84450:37:0::1;16207:341:1::0;84338:544:0::1;84657:47;::::0;;-1:-1:-1;;;;;16745:32:1;;;84657:47:0::1;::::0;::::1;16727:51:1::0;16794:18;;;;16787:34;;;84657:47:0;;;;;;;;;;16700:18:1;;;;84657:47:0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;84657:47:0::1;-1:-1:-1::0;;;84657:47:0::1;::::0;;84627:92;;-1:-1:-1;;;;84627:11:0;;::::1;::::0;:92:::1;::::0;84657:47;84627:92:::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84591:128;;;;84760:7;:57;;;;-1:-1:-1::0;84772:11:0;;:16;;:44:::1;;;84803:4;84792:24;;;;;;;;;;;;:::i;:::-;84734:136;;;::::0;-1:-1:-1;;;84734:136:0;;16409:2:1;84734:136:0::1;::::0;::::1;16391:21:1::0;16448:2;16428:18;;;16421:30;-1:-1:-1;;;16467:18:1;;;16460:47;16524:18;;84734:136:0::1;16207:341:1::0;84734:136:0::1;84505:377;;84245:644:::0;;;:::o;29698:164::-;-1:-1:-1;;;;;29819:25:0;;;29795:4;29819:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29698:164::o;64420:220::-;63373:13;:11;:13::i;:::-;-1:-1:-1;;;;;64505:22:0;::::1;64501:93;;64551:31;::::0;-1:-1:-1;;;64551:31:0;;64579:1:::1;64551:31;::::0;::::1;1679:51:1::0;1652:18;;64551:31:0::1;1533:203:1::0;64501:93:0::1;64604:28;64623:8;64604:18;:28::i;77048:102::-:0;63373:13;:11;:13::i;:::-;77120:9:::1;:22:::0;77048:102::o;30120:475::-;30185:11;30377:13;;30367:7;:23;30363:214;;;30411:14;30444:60;-1:-1:-1;30461:26:0;;;;:17;:26;;;;;;;30451:42;;;30444:60;;30495:9;;;:::i;:::-;;;30444:60;;;-1:-1:-1;;;30532:24:0;:29;;-1:-1:-1;30363:214:0;30120:475;;;:::o;60629:165::-;60730:13;60724:4;60717:27;60771:4;60765;60758:18;52044:474;52173:13;52189:16;52197:7;52189;:16::i;:::-;52173:32;;52222:13;:45;;;;-1:-1:-1;58697:10:0;-1:-1:-1;;;;;52239:28:0;;;;52222:45;52218:201;;;52287:44;52304:5;58697:10;29698:164;:::i;52287:44::-;52282:137;;52352:51;-1:-1:-1;;;52352:7:0;:51::i;:::-;52431:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;52431:35:0;-1:-1:-1;;;;;52431:35:0;;;;;;;;;52482:28;;52431:24;;52482:28;;;;;;;52162:356;52044:474;;;:::o;24387:2213::-;24537:26;;;;:17;:26;;;;;;24864:6;24874:1;24864:11;24860:1292;;24911:13;;24900:7;:24;24896:77;;24926:47;-1:-1:-1;;;24926:7:0;:47::i;:::-;25530:607;-1:-1:-1;;;25626:9:0;25608:28;;;;:17;:28;;;;;;25682:25;;25530:607;25682:25;-1:-1:-1;;;25734:6:0;:24;25762:1;25734:29;25730:48;;24387:2213;;;:::o;25730:48::-;26070:47;-1:-1:-1;;;26070:7:0;:47::i;:::-;25530:607;;24860:1292;-1:-1:-1;;;26479:6:0;:24;26507:1;26479:29;26475:48;;24387:2213;;;:::o;26475:48::-;26545:47;-1:-1:-1;;;26545:7:0;:47::i;80902:1499::-;-1:-1:-1;;;;;81204:18:0;;81200:330;;81336:9;81331:167;81355:8;81351:1;:12;81331:167;;;81389:15;81407:16;81422:1;81407:12;:16;:::i;:::-;81389:34;;81442:40;81470:2;81474:7;81442:27;:40::i;:::-;-1:-1:-1;81365:3:0;;;;:::i;:::-;;;;81331:167;;;;81512:7;;81200:330;-1:-1:-1;;;;;81601:16:0;;81597:337;;81733:9;81728:174;81752:8;81748:1;:12;81728:174;;;81786:15;81804:16;81819:1;81804:12;:16;:::i;:::-;81786:34;;81839:47;81872:4;81878:7;81839:32;:47::i;:::-;-1:-1:-1;81762:3:0;;;;:::i;:::-;;;;81728:174;;81597:337;82036:9;82031:363;82055:8;82051:1;:12;82031:363;;;82085:15;82103:16;82118:1;82103:12;:16;:::i;:::-;82143:21;;;;:12;:21;;;;;;82085:34;;-1:-1:-1;82143:21:0;;82142:22;82134:76;;;;-1:-1:-1;;;82134:76:0;;17315:2:1;82134:76:0;;;17297:21:1;17354:2;17334:18;;;17327:30;17393:34;17373:18;;;17366:62;-1:-1:-1;;;17444:18:1;;;17437:39;17493:19;;82134:76:0;17113:405:1;82134:76:0;82280:47;82313:4;82319:7;82280:32;:47::i;:::-;82342:40;82370:2;82374:7;82342:27;:40::i;:::-;-1:-1:-1;82065:3:0;;;;:::i;:::-;;;;82031:363;;41075:2399;41148:20;41171:13;;;41199;;;41195:53;;41214:34;-1:-1:-1;;;41214:7:0;:34::i;:::-;41261:61;41291:1;41295:2;41299:12;41313:8;41261:21;:61::i;:::-;41761:31;;;;:17;:31;;;;;;;;-1:-1:-1;;;;;27385:28:0;;27559:11;27534:23;27530:41;28003:1;27990:15;;27964:24;27960:46;27527:52;27517:63;;41761:173;;;42152:22;;;:18;:22;;;;;:71;;42190:32;42178:45;;42152:71;;;27385:28;42413:13;;;42409:54;;42428:35;-1:-1:-1;;;42428:7:0;:35::i;:::-;42494:23;;;;42673:676;43092:7;43048:8;43003:1;42937:25;42874:1;42809;42778:358;43344:3;43331:9;;;;;;:16;42673:676;;-1:-1:-1;43365:13:0;:19;-1:-1:-1;36631:193:0;;;:::o;63652:166::-;63560:6;;-1:-1:-1;;;;;63560:6:0;58697:10;63712:23;63708:103;;63759:40;;-1:-1:-1;;;63759:40:0;;58697:10;63759:40;;;1679:51:1;1652:18;;63759:40:0;1533:203:1;64800:191:0;64893:6;;;-1:-1:-1;;;;;64910:17:0;;;-1:-1:-1;;;;;;64910:17:0;;;;;;;64943:40;;64893:6;;;64910:17;64893:6;;64943:40;;64874:16;;64943:40;64863:128;64800:191;:::o;67520:315::-;66818:1;67649:7;;:18;67645:88;;67691:30;;-1:-1:-1;;;67691:30:0;;;;;;;;;;;67645:88;66818:1;67810:7;:17;67520:315::o;39922:691::-;40106:88;;-1:-1:-1;;;40106:88:0;;40085:4;;-1:-1:-1;;;;;40106:45:0;;;;;:88;;58697:10;;40173:4;;40179:7;;40188:5;;40106:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40106:88:0;;;;;;;;-1:-1:-1;;40106:88:0;;;;;;;;;;;;:::i;:::-;;;40102:504;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40389:6;:13;40406:1;40389:18;40385:115;;40428:56;-1:-1:-1;;;40428:7:0;:56::i;:::-;40572:6;40566:13;40557:6;40553:2;40549:15;40542:38;40102:504;-1:-1:-1;;;;;;40265:64:0;-1:-1:-1;;;40265:64:0;;-1:-1:-1;39922:691:0;;;;;;:::o;76656:114::-;76716:13;76749;76742:20;;;;;:::i;58817:1745::-;58882:17;59316:4;59309;59303:11;59299:22;59408:1;59402:4;59395:15;59483:4;59480:1;59476:12;59469:19;;;59565:1;59560:3;59553:14;59669:3;59908:5;59890:428;59956:1;59951:3;59947:11;59940:18;;60127:2;60121:4;60117:13;60113:2;60109:22;60104:3;60096:36;60221:2;60211:13;;60278:25;59890:428;60278:25;-1:-1:-1;60348:13:0;;;-1:-1:-1;;60463:14:0;;;60525:19;;;60463:14;58817:1745;-1:-1:-1;58817:1745:0:o;82675:301::-;-1:-1:-1;;;;;82804:16:0;;;;;;:12;:16;;;;;;;:30;;;;;;;;;;;;;;;;;;82941:16;;;;:23;;:27;;82804:30;82941:27;:::i;:::-;82912:26;;;;:17;:26;;;;;;:56;-1:-1:-1;82675:301:0:o;83266:892::-;-1:-1:-1;;;;;83448:18:0;;83423:22;83448:18;;;:12;:18;;;;;:25;:29;;83476:1;;83448:29;:::i;:::-;83488:18;83509:26;;;:17;:26;;;;;;83423:54;;-1:-1:-1;83661:28:0;;;83657:372;;-1:-1:-1;;;;;83728:18:0;;83706:19;83728:18;;;:12;:18;;;;;:34;;83747:14;;83728:34;;;;;;:::i;:::-;;;;;;;;;83706:56;;83895:11;83862:12;:18;83875:4;-1:-1:-1;;;;;83862:18:0;-1:-1:-1;;;;;83862:18:0;;;;;;;;;;;;83881:10;83862:30;;;;;;;;:::i;:::-;;;;;;;;;;;;:44;;;;83974:30;;;:17;:30;;;;;:43;;;83657:372;-1:-1:-1;;;;;84126:18:0;;;;;;:12;:18;;;;;:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;83347:811;;83266:892;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:131::-;-1:-1:-1;;;;;1816:31:1;;1806:42;;1796:70;;1862:1;1859;1852:12;1877:315;1945:6;1953;2006:2;1994:9;1985:7;1981:23;1977:32;1974:52;;;2022:1;2019;2012:12;1974:52;2061:9;2048:23;2080:31;2105:5;2080:31;:::i;:::-;2130:5;2182:2;2167:18;;;;2154:32;;-1:-1:-1;;;1877:315:1:o;2379:247::-;2438:6;2491:2;2479:9;2470:7;2466:23;2462:32;2459:52;;;2507:1;2504;2497:12;2459:52;2546:9;2533:23;2565:31;2590:5;2565:31;:::i;2631:456::-;2708:6;2716;2724;2777:2;2765:9;2756:7;2752:23;2748:32;2745:52;;;2793:1;2790;2783:12;2745:52;2832:9;2819:23;2851:31;2876:5;2851:31;:::i;:::-;2901:5;-1:-1:-1;2958:2:1;2943:18;;2930:32;2971:33;2930:32;2971:33;:::i;:::-;2631:456;;3023:7;;-1:-1:-1;;;3077:2:1;3062:18;;;;3049:32;;2631:456::o;3092:592::-;3163:6;3171;3224:2;3212:9;3203:7;3199:23;3195:32;3192:52;;;3240:1;3237;3230:12;3192:52;3280:9;3267:23;3309:18;3350:2;3342:6;3339:14;3336:34;;;3366:1;3363;3356:12;3336:34;3404:6;3393:9;3389:22;3379:32;;3449:7;3442:4;3438:2;3434:13;3430:27;3420:55;;3471:1;3468;3461:12;3420:55;3511:2;3498:16;3537:2;3529:6;3526:14;3523:34;;;3553:1;3550;3543:12;3523:34;3598:7;3593:2;3584:6;3580:2;3576:15;3572:24;3569:37;3566:57;;;3619:1;3616;3609:12;3566:57;3650:2;3642:11;;;;;3672:6;;-1:-1:-1;3092:592:1;;-1:-1:-1;;;;3092:592:1:o;3689:118::-;3775:5;3768:13;3761:21;3754:5;3751:32;3741:60;;3797:1;3794;3787:12;3812:241;3868:6;3921:2;3909:9;3900:7;3896:23;3892:32;3889:52;;;3937:1;3934;3927:12;3889:52;3976:9;3963:23;3995:28;4017:5;3995:28;:::i;4058:632::-;4229:2;4281:21;;;4351:13;;4254:18;;;4373:22;;;4200:4;;4229:2;4452:15;;;;4426:2;4411:18;;;4200:4;4495:169;4509:6;4506:1;4503:13;4495:169;;;4570:13;;4558:26;;4639:15;;;;4604:12;;;;4531:1;4524:9;4495:169;;;-1:-1:-1;4681:3:1;;4058:632;-1:-1:-1;;;;;;4058:632:1:o;4695:382::-;4760:6;4768;4821:2;4809:9;4800:7;4796:23;4792:32;4789:52;;;4837:1;4834;4827:12;4789:52;4876:9;4863:23;4895:31;4920:5;4895:31;:::i;:::-;4945:5;-1:-1:-1;5002:2:1;4987:18;;4974:32;5015:30;4974:32;5015:30;:::i;:::-;5064:7;5054:17;;;4695:382;;;;;:::o;5082:127::-;5143:10;5138:3;5134:20;5131:1;5124:31;5174:4;5171:1;5164:15;5198:4;5195:1;5188:15;5214:1266;5309:6;5317;5325;5333;5386:3;5374:9;5365:7;5361:23;5357:33;5354:53;;;5403:1;5400;5393:12;5354:53;5442:9;5429:23;5461:31;5486:5;5461:31;:::i;:::-;5511:5;-1:-1:-1;5568:2:1;5553:18;;5540:32;5581:33;5540:32;5581:33;:::i;:::-;5633:7;-1:-1:-1;5687:2:1;5672:18;;5659:32;;-1:-1:-1;5742:2:1;5727:18;;5714:32;5765:18;5795:14;;;5792:34;;;5822:1;5819;5812:12;5792:34;5860:6;5849:9;5845:22;5835:32;;5905:7;5898:4;5894:2;5890:13;5886:27;5876:55;;5927:1;5924;5917:12;5876:55;5963:2;5950:16;5985:2;5981;5978:10;5975:36;;;5991:18;;:::i;:::-;6066:2;6060:9;6034:2;6120:13;;-1:-1:-1;;6116:22:1;;;6140:2;6112:31;6108:40;6096:53;;;6164:18;;;6184:22;;;6161:46;6158:72;;;6210:18;;:::i;:::-;6250:10;6246:2;6239:22;6285:2;6277:6;6270:18;6325:7;6320:2;6315;6311;6307:11;6303:20;6300:33;6297:53;;;6346:1;6343;6336:12;6297:53;6402:2;6397;6393;6389:11;6384:2;6376:6;6372:15;6359:46;6447:1;6442:2;6437;6429:6;6425:15;6421:24;6414:35;6468:6;6458:16;;;;;;;5214:1266;;;;;;;:::o;6720:388::-;6788:6;6796;6849:2;6837:9;6828:7;6824:23;6820:32;6817:52;;;6865:1;6862;6855:12;6817:52;6904:9;6891:23;6923:31;6948:5;6923:31;:::i;:::-;6973:5;-1:-1:-1;7030:2:1;7015:18;;7002:32;7043:33;7002:32;7043:33;:::i;7113:380::-;7192:1;7188:12;;;;7235;;;7256:61;;7310:4;7302:6;7298:17;7288:27;;7256:61;7363:2;7355:6;7352:14;7332:18;7329:38;7326:161;;7409:10;7404:3;7400:20;7397:1;7390:31;7444:4;7441:1;7434:15;7472:4;7469:1;7462:15;7326:161;;7113:380;;;:::o;7901:245::-;7968:6;8021:2;8009:9;8000:7;7996:23;7992:32;7989:52;;;8037:1;8034;8027:12;7989:52;8069:9;8063:16;8088:28;8110:5;8088:28;:::i;8900:127::-;8961:10;8956:3;8952:20;8949:1;8942:31;8992:4;8989:1;8982:15;9016:4;9013:1;9006:15;9032:125;9097:9;;;9118:10;;;9115:36;;;9131:18;;:::i;10332:545::-;10434:2;10429:3;10426:11;10423:448;;;10470:1;10495:5;10491:2;10484:17;10540:4;10536:2;10526:19;10610:2;10598:10;10594:19;10591:1;10587:27;10581:4;10577:38;10646:4;10634:10;10631:20;10628:47;;;-1:-1:-1;10669:4:1;10628:47;10724:2;10719:3;10715:12;10712:1;10708:20;10702:4;10698:31;10688:41;;10779:82;10797:2;10790:5;10787:13;10779:82;;;10842:17;;;10823:1;10812:13;10779:82;;;10783:3;;;10332:545;;;:::o;11053:1206::-;11177:18;11172:3;11169:27;11166:53;;;11199:18;;:::i;:::-;11228:94;11318:3;11278:38;11310:4;11304:11;11278:38;:::i;:::-;11272:4;11228:94;:::i;:::-;11348:1;11373:2;11368:3;11365:11;11390:1;11385:616;;;;12045:1;12062:3;12059:93;;;-1:-1:-1;12118:19:1;;;12105:33;12059:93;-1:-1:-1;;11010:1:1;11006:11;;;11002:24;10998:29;10988:40;11034:1;11030:11;;;10985:57;12165:78;;11358:895;;11385:616;10279:1;10272:14;;;10316:4;10303:18;;-1:-1:-1;;11421:17:1;;;11522:9;11544:229;11558:7;11555:1;11552:14;11544:229;;;11647:19;;;11634:33;11619:49;;11754:4;11739:20;;;;11707:1;11695:14;;;;11574:12;11544:229;;;11548:3;11801;11792:7;11789:16;11786:159;;;11925:1;11921:6;11915:3;11909;11906:1;11902:11;11898:21;11894:34;11890:39;11877:9;11872:3;11868:19;11855:33;11851:79;11843:6;11836:95;11786:159;;;11988:1;11982:3;11979:1;11975:11;11971:19;11965:4;11958:33;11358:895;;11053:1206;;;:::o;12264:251::-;12334:6;12387:2;12375:9;12366:7;12362:23;12358:32;12355:52;;;12403:1;12400;12393:12;12355:52;12435:9;12429:16;12454:31;12479:5;12454:31;:::i;13972:168::-;14045:9;;;14076;;14093:15;;;14087:22;;14073:37;14063:71;;14114:18;;:::i;15414:496::-;15593:3;15631:6;15625:13;15647:66;15706:6;15701:3;15694:4;15686:6;15682:17;15647:66;:::i;:::-;15776:13;;15735:16;;;;15798:70;15776:13;15735:16;15845:4;15833:17;;15798:70;:::i;:::-;15884:20;;15414:496;-1:-1:-1;;;;15414:496:1:o;15915:287::-;16044:3;16082:6;16076:13;16098:66;16157:6;16152:3;16145:4;16137:6;16133:17;16098:66;:::i;:::-;16180:16;;;;;15915:287;-1:-1:-1;;15915:287:1:o;16832:136::-;16871:3;16899:5;16889:39;;16908:18;;:::i;:::-;-1:-1:-1;;;16944:18:1;;16832:136::o;16973:135::-;17012:3;17033:17;;;17030:43;;17053:18;;:::i;:::-;-1:-1:-1;17100:1:1;17089:13;;16973:135::o;17523:489::-;-1:-1:-1;;;;;17792:15:1;;;17774:34;;17844:15;;17839:2;17824:18;;17817:43;17891:2;17876:18;;17869:34;;;17939:3;17934:2;17919:18;;17912:31;;;17717:4;;17960:46;;17986:19;;17978:6;17960:46;:::i;:::-;17952:54;17523:489;-1:-1:-1;;;;;;17523:489:1:o;18017:249::-;18086:6;18139:2;18127:9;18118:7;18114:23;18110:32;18107:52;;;18155:1;18152;18145:12;18107:52;18187:9;18181:16;18206:30;18230:5;18206:30;:::i;18271:128::-;18338:9;;;18359:11;;;18356:37;;;18373:18;;:::i;18404:127::-;18465:10;18460:3;18456:20;18453:1;18446:31;18496:4;18493:1;18486:15;18520:4;18517:1;18510:15;18536:127;18597:10;18592:3;18588:20;18585:1;18578:31;18628:4;18625:1;18618:15;18652:4;18649:1;18642:15
Swarm Source
ipfs://55929c3e11daf45ebd8fc76d11823fb9db5581f0a078f250e3be5c62ce00e390
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.