Transaction Hash:
Block:
20605915 at Aug-25-2024 01:30:23 PM +UTC
Transaction Fee:
0.000061703082745423 ETH
$0.16
Gas Used:
46,067 Gas / 1.339420469 Gwei
Emitted Events:
262 |
Tatols.ApprovalForAll( owner=[Sender] 0x86647b7cea9d4728a12d14a5f02443a5c2548da6, operator=0x1E004978...d54003c71, approved=True )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x4838B106...B0BAD5f97
Miner
| (Titan Builder) | 7.231068613567340476 Eth | 7.231077857494513299 Eth | 0.000009243927172823 | |
0x86647B7C...5c2548Da6 |
0.102612908025175 Eth
Nonce: 243
|
0.102551204942429577 Eth
Nonce: 244
| 0.000061703082745423 | ||
0xf92e69AF...72F1191eD |
Execution Trace
Tatols.setApprovalForAll( operator=0x1E0049783F008A0085193E00003D00cd54003c71, approved=True )
{"Address.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length \u003e 0;\n }\n\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance \u003e= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance \u003e= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length \u003e 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}"},"Context.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}"},"ERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}"},"ERC721A.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./IERC721.sol\";\nimport \"./IERC721Receiver.sol\";\nimport \"./IERC721Metadata.sol\";\nimport \"./IERC721Enumerable.sol\";\nimport \"./Address.sol\";\nimport \"./Context.sol\";\nimport \"./Strings.sol\";\nimport \"./ERC165.sol\";\n\n\ncontract ERC721A is\n Context,\n ERC165,\n IERC721,\n IERC721Metadata,\n IERC721Enumerable\n{\n using Address for address;\n using Strings for uint256;\n\n struct TokenOwnership {\n address addr;\n uint64 startTimestamp;\n }\n\n struct AddressData {\n uint128 balance;\n uint128 numberMinted;\n }\n\n uint256 private currentIndex = 0;\n\n uint256 internal immutable collectionSize;\n uint256 internal immutable maxBatchSize;\n\n // Token name\n string private _name;\n\n // Token symbol\n string private _symbol;\n\n // Mapping from token ID to ownership details\n // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.\n // mapping(uint256 =\u003e TokenOwnership) private _ownerships;\n mapping(uint256 =\u003e TokenOwnership) internal _ownerships;\n\n\n // Mapping owner address to address data\n // mapping(address =\u003e AddressData) private _addressData;\n mapping(address =\u003e AddressData) internal _addressData;\n\n // Mapping from token ID to approved address\n mapping(uint256 =\u003e address) private _tokenApprovals;\n\n // Mapping from owner to operator approvals\n mapping(address =\u003e mapping(address =\u003e bool)) private _operatorApprovals;\n\n /**\n * @dev\n * `maxBatchSize` refers to how much a minter can mint at a time.\n * `collectionSize_` refers to how many tokens are in the collection.\n */\n constructor(\n string memory name_,\n string memory symbol_,\n uint256 maxBatchSize_,\n uint256 collectionSize_\n ) {\n require(\n collectionSize_ \u003e 0,\n \"ERC721A: collection must have a nonzero supply\"\n );\n require(maxBatchSize_ \u003e 0, \"ERC721A: max batch size must be nonzero\");\n _name = name_;\n _symbol = symbol_;\n maxBatchSize = maxBatchSize_;\n collectionSize = collectionSize_;\n }\n\n /**\n * @dev See {IERC721Enumerable-totalSupply}.\n */\n // function totalSupply() public view override returns (uint256) {\n function totalSupply() public view virtual override returns (uint256) {\n return currentIndex;\n }\n\n /**\n * @dev See {IERC721Enumerable-tokenByIndex}.\n */\n function tokenByIndex(uint256 index) public view override returns (uint256) {\n require(index \u003c totalSupply(), \"ERC721A: global index out of bounds\");\n return index;\n }\n\n /**\n * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.\n * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.\n * It may also degrade with extremely large collection sizes (e.g \u003e\u003e 10000), test for your use case.\n */\n function tokenOfOwnerByIndex(address owner, uint256 index)\n public\n view\n override\n returns (uint256)\n {\n require(index \u003c balanceOf(owner), \"ERC721A: owner index out of bounds\");\n uint256 numMintedSoFar = totalSupply();\n uint256 tokenIdsIdx = 0;\n address currOwnershipAddr = address(0);\n for (uint256 i = 0; i \u003c numMintedSoFar; i++) {\n TokenOwnership memory ownership = _ownerships[i];\n if (ownership.addr != address(0)) {\n currOwnershipAddr = ownership.addr;\n }\n if (currOwnershipAddr == owner) {\n if (tokenIdsIdx == index) {\n return i;\n }\n tokenIdsIdx++;\n }\n }\n revert(\"ERC721A: unable to get token of owner by index\");\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId)\n public\n view\n virtual\n override(ERC165, IERC165)\n returns (bool)\n {\n return\n interfaceId == type(IERC721).interfaceId ||\n interfaceId == type(IERC721Metadata).interfaceId ||\n interfaceId == type(IERC721Enumerable).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC721-balanceOf}.\n */\n function balanceOf(address owner) public view override returns (uint256) {\n require(owner != address(0), \"ERC721A: balance query for the zero address\");\n return uint256(_addressData[owner].balance);\n }\n\n function _numberMinted(address owner) internal view returns (uint256) {\n require(\n owner != address(0),\n \"ERC721A: number minted query for the zero address\"\n );\n return uint256(_addressData[owner].numberMinted);\n }\n\n function ownershipOf(uint256 tokenId)\n internal\n view\n returns (TokenOwnership memory)\n {\n require(_exists(tokenId), \"ERC721A: owner query for nonexistent token\");\n\n uint256 lowestTokenToCheck;\n if (tokenId \u003e= maxBatchSize) {\n lowestTokenToCheck = tokenId - maxBatchSize + 1;\n }\n\n for (uint256 curr = tokenId; curr \u003e= lowestTokenToCheck; curr--) {\n TokenOwnership memory ownership = _ownerships[curr];\n if (ownership.addr != address(0)) {\n return ownership;\n }\n }\n\n revert(\"ERC721A: unable to determine the owner of token\");\n }\n\n /**\n * @dev See {IERC721-ownerOf}.\n */\n function ownerOf(uint256 tokenId) public view override returns (address) {\n return ownershipOf(tokenId).addr;\n }\n\n /**\n * @dev See {IERC721Metadata-name}.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IERC721Metadata-symbol}.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev See {IERC721Metadata-tokenURI}.\n */\n function tokenURI(uint256 tokenId)\n public\n view\n virtual\n override\n returns (string memory)\n {\n require(\n _exists(tokenId),\n \"ERC721Metadata: URI query for nonexistent token\"\n );\n\n string memory baseURI = _baseURI();\n return\n bytes(baseURI).length \u003e 0\n ? string(abi.encodePacked(baseURI, tokenId.toString()))\n : \"\";\n }\n\n /**\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\n * by default, can be overriden in child contracts.\n */\n function _baseURI() internal view virtual returns (string memory) {\n return \"\";\n }\n\n /**\n * @dev See {IERC721-approve}.\n */\n function approve(address to, uint256 tokenId) public override {\n address owner = ERC721A.ownerOf(tokenId);\n require(to != owner, \"ERC721A: approval to current owner\");\n\n require(\n _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\n \"ERC721A: approve caller is not owner nor approved for all\"\n );\n\n _approve(to, tokenId, owner);\n }\n\n /**\n * @dev See {IERC721-getApproved}.\n */\n function getApproved(uint256 tokenId) public view override returns (address) {\n require(_exists(tokenId), \"ERC721A: approved query for nonexistent token\");\n\n return _tokenApprovals[tokenId];\n }\n\n /**\n * @dev See {IERC721-setApprovalForAll}.\n */\n function setApprovalForAll(address operator, bool approved) public override {\n require(operator != _msgSender(), \"ERC721A: approve to caller\");\n\n _operatorApprovals[_msgSender()][operator] = approved;\n emit ApprovalForAll(_msgSender(), operator, approved);\n }\n\n /**\n * @dev See {IERC721-isApprovedForAll}.\n */\n function isApprovedForAll(address owner, address operator)\n public\n view\n virtual\n override\n returns (bool)\n {\n return _operatorApprovals[owner][operator];\n }\n\n /**\n * @dev See {IERC721-transferFrom}.\n */\n function transferFrom(\n address from,\n address to,\n uint256 tokenId\n ) public override {\n _transfer(from, to, tokenId);\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId\n ) public override {\n safeTransferFrom(from, to, tokenId, \"\");\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId,\n bytes memory _data\n ) public override {\n _transfer(from, to, tokenId);\n require(\n _checkOnERC721Received(from, to, tokenId, _data),\n \"ERC721A: transfer to non ERC721Receiver implementer\"\n );\n }\n\n /**\n * @dev Returns whether `tokenId` exists.\n *\n * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\n *\n * Tokens start existing when they are minted (`_mint`),\n */\n // function _exists(uint256 tokenId) internal view returns (bool) {\n function _exists(uint256 tokenId) internal view virtual returns (bool) {\n return tokenId \u003c currentIndex;\n }\n\n function _safeMint(address to, uint256 quantity) internal {\n _safeMint(to, quantity, \"\");\n }\n\n /**\n * @dev Mints `quantity` tokens and transfers them to `to`.\n *\n * Requirements:\n *\n * - there must be `quantity` tokens remaining unminted in the total collection.\n * - `to` cannot be the zero address.\n * - `quantity` cannot be larger than the max batch size.\n *\n * Emits a {Transfer} event.\n */\n function _safeMint(\n address to,\n uint256 quantity,\n bytes memory _data\n ) internal {\n uint256 startTokenId = currentIndex;\n require(to != address(0), \"ERC721A: mint to the zero address\");\n // We know if the first token in the batch doesn\u0027t exist, the other ones don\u0027t as well, because of serial ordering.\n require(!_exists(startTokenId), \"ERC721A: token already minted\");\n require(quantity \u003c= maxBatchSize, \"ERC721A: quantity to mint too high\");\n\n _beforeTokenTransfers(address(0), to, startTokenId, quantity);\n\n AddressData memory addressData = _addressData[to];\n _addressData[to] = AddressData(\n addressData.balance + uint128(quantity),\n addressData.numberMinted + uint128(quantity)\n );\n _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));\n\n uint256 updatedIndex = startTokenId;\n\n for (uint256 i = 0; i \u003c quantity; i++) {\n emit Transfer(address(0), to, updatedIndex);\n require(\n _checkOnERC721Received(address(0), to, updatedIndex, _data),\n \"ERC721A: transfer to non ERC721Receiver implementer\"\n );\n updatedIndex++;\n }\n\n currentIndex = updatedIndex;\n _afterTokenTransfers(address(0), to, startTokenId, quantity);\n }\n\n /**\n * @dev Transfers `tokenId` from `from` to `to`.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n *\n * Emits a {Transfer} event.\n */\n function _transfer(\n address from,\n address to,\n uint256 tokenId\n ) private {\n TokenOwnership memory prevOwnership = ownershipOf(tokenId);\n\n bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||\n getApproved(tokenId) == _msgSender() ||\n isApprovedForAll(prevOwnership.addr, _msgSender()));\n\n require(\n isApprovedOrOwner,\n \"ERC721A: transfer caller is not owner nor approved\"\n );\n\n require(\n prevOwnership.addr == from,\n \"ERC721A: transfer from incorrect owner\"\n );\n require(to != address(0), \"ERC721A: transfer to the zero address\");\n\n _beforeTokenTransfers(from, to, tokenId, 1);\n\n // Clear approvals from the previous owner\n _approve(address(0), tokenId, prevOwnership.addr);\n\n _addressData[from].balance -= 1;\n _addressData[to].balance += 1;\n _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));\n\n // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.\n // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.\n uint256 nextTokenId = tokenId + 1;\n if (_ownerships[nextTokenId].addr == address(0)) {\n if (_exists(nextTokenId)) {\n _ownerships[nextTokenId] = TokenOwnership(\n prevOwnership.addr,\n prevOwnership.startTimestamp\n );\n }\n }\n\n emit Transfer(from, to, tokenId);\n _afterTokenTransfers(from, to, tokenId, 1);\n }\n\n /**\n * @dev Approve `to` to operate on `tokenId`\n *\n * Emits a {Approval} event.\n */\n function _approve(\n address to,\n uint256 tokenId,\n address owner\n ) private {\n _tokenApprovals[tokenId] = to;\n emit Approval(owner, to, tokenId);\n }\n\n uint256 public nextOwnerToExplicitlySet = 0;\n\n /**\n * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().\n */\n function _setOwnersExplicit(uint256 quantity) internal {\n uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;\n require(quantity \u003e 0, \"quantity must be nonzero\");\n uint256 endIndex = oldNextOwnerToSet + quantity - 1;\n if (endIndex \u003e collectionSize - 1) {\n endIndex = collectionSize - 1;\n }\n // We know if the last one in the group exists, all in the group exist, due to serial ordering.\n require(_exists(endIndex), \"not enough minted yet for this cleanup\");\n for (uint256 i = oldNextOwnerToSet; i \u003c= endIndex; i++) {\n if (_ownerships[i].addr == address(0)) {\n TokenOwnership memory ownership = ownershipOf(i);\n _ownerships[i] = TokenOwnership(\n ownership.addr,\n ownership.startTimestamp\n );\n }\n }\n nextOwnerToExplicitlySet = endIndex + 1;\n }\n\n /**\n * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\n * The call is not executed if the target address is not a contract.\n *\n * @param from address representing the previous owner of the given token ID\n * @param to target address that will receive the tokens\n * @param tokenId uint256 ID of the token to be transferred\n * @param _data bytes optional data to send along with the call\n * @return bool whether the call correctly returned the expected magic value\n */\n function _checkOnERC721Received(\n address from,\n address to,\n uint256 tokenId,\n bytes memory _data\n ) internal returns (bool) {\n if (to.isContract()) {\n try\n IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data)\n returns (bytes4 retval) {\n return retval == IERC721Receiver(to).onERC721Received.selector;\n } catch (bytes memory reason) {\n if (reason.length == 0) {\n revert(\"ERC721A: transfer to non ERC721Receiver implementer\");\n } else {\n assembly {\n revert(add(32, reason), mload(reason))\n }\n }\n }\n } else {\n return true;\n }\n }\n\n /**\n * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.\n *\n * startTokenId - the first token id to be transferred\n * quantity - the amount to be transferred\n *\n * Calling conditions:\n *\n * - When `from` and `to` are both non-zero, ``from``\u0027s `tokenId` will be\n * transferred to `to`.\n * - When `from` is zero, `tokenId` will be minted for `to`.\n */\n function _beforeTokenTransfers(\n address from,\n address to,\n uint256 startTokenId,\n uint256 quantity\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes\n * minting.\n *\n * startTokenId - the first token id to be transferred\n * quantity - the amount to be transferred\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero.\n * - `from` and `to` are never both zero.\n */\n function _afterTokenTransfers(\n address from,\n address to,\n uint256 startTokenId,\n uint256 quantity\n ) internal virtual {}\n}"},"IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}"},"IERC721.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n\ninterface IERC721 is IERC165 {\n \n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n\n function balanceOf(address owner) external view returns (uint256 balance);\n\n \n function ownerOf(uint256 tokenId) external view returns (address owner);\n\n \n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId,\n bytes calldata data\n ) external;\n\n\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId\n ) external;\n\n \n function transferFrom(\n address from,\n address to,\n uint256 tokenId\n ) external;\n\n \n function approve(address to, uint256 tokenId) external;\n\n \n function setApprovalForAll(address operator, bool _approved) external;\n\n\n function getApproved(uint256 tokenId) external view returns (address operator);\n\n function isApprovedForAll(address owner, address operator) external view returns (bool);\n}"},"IERC721Enumerable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC721.sol\";\n\ninterface IERC721Enumerable is IERC721 {\n\n function totalSupply() external view returns (uint256);\n\n function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);\n\n function tokenByIndex(uint256 index) external view returns (uint256);\n}"},"IERC721Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC721.sol\";\n\ninterface IERC721Metadata is IERC721 {\n\n function name() external view returns (string memory);\n\n function symbol() external view returns (string memory);\n\n function tokenURI(uint256 tokenId) external view returns (string memory);\n}"},"IERC721Receiver.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\ninterface IERC721Receiver {\n\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}"},"Ownable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./Context.sol\";\n\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n constructor() {\n _transferOwnership(_msgSender());\n }\n\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}"},"ReentrancyGuard.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\n\nabstract contract ReentrancyGuard {\n\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor() {\n _status = _NOT_ENTERED;\n }\n\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n}"},"Strings.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _HEX_SYMBOLS = \"0123456789abcdef\";\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n // Inspired by OraclizeAPI\u0027s implementation - MIT licence\n // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol\n\n if (value == 0) {\n return \"0\";\n }\n uint256 temp = value;\n uint256 digits;\n while (temp != 0) {\n digits++;\n temp /= 10;\n }\n bytes memory buffer = new bytes(digits);\n while (value != 0) {\n digits -= 1;\n buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));\n value /= 10;\n }\n return string(buffer);\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n if (value == 0) {\n return \"0x00\";\n }\n uint256 temp = value;\n uint256 length = 0;\n while (temp != 0) {\n length++;\n temp \u003e\u003e= 8;\n }\n return toHexString(value, length);\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i \u003e 1; --i) {\n buffer[i] = _HEX_SYMBOLS[value \u0026 0xf];\n value \u003e\u003e= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n}"},"Tatols.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"./ERC721A.sol\";\nimport \"./Ownable.sol\";\nimport \"./ReentrancyGuard.sol\";\nimport \"./Address.sol\";\n\ncontract Tatols is Ownable, ERC721A, ReentrancyGuard {\n\n using Address for address;\n\n uint256 constant private _allowlistSize = 1000;\n uint256 constant private _auctionSize = 9000;\n\n uint256 constant private _collectionSize = _allowlistSize + _auctionSize;\n uint256 constant private _maxBatchSize = 20;\n\n uint256 public allowlistCurrentIndex = 1;\n uint256 public auctionCurrentIndex = _allowlistSize + 1;\n\n address public immutable recipient;\n\n struct SaleConfig {\n uint32 startTime;\n uint32 endTime;\n uint256 mintPrice;\n }\n SaleConfig public saleConfig;\n\n mapping(address =\u003e uint256) public allowlist;\n\n string private _baseTokenURI;\n\n constructor() ERC721A(\"Tatols\",\"TATOLS\",_maxBatchSize,_collectionSize) {\n saleConfig = SaleConfig(1650456000, 1650715200, 0.025 * 10 ** 18);\n recipient = 0x6fD4409Bdefb6FF9ce3c7f34F5EBC2Be5Ca4349c;\n //Need explicit id starting with \u0027auctionCurrentIndex\u0027\n nextOwnerToExplicitlySet = auctionCurrentIndex;\n }\n\n modifier callerIsUser() {\n require(tx.origin == msg.sender, \"Tatols: The caller is another contract\");\n _;\n }\n\n modifier checkTime() {\n require(\n block.timestamp \u003e= uint256(saleConfig.startTime) \u0026\u0026\n block.timestamp \u003c= uint256(saleConfig.endTime), \n \"Tatols: Out of sale time\");\n _;\n }\n\n function totalSupply() public view override returns (uint256) {\n return totalSupplyOfAuction() + totalSupplyOfAllowlist();\n }\n\n function allTotalSupply() public view returns (uint256, uint256) {\n return (totalSupplyOfAuction(),totalSupplyOfAllowlist());\n }\n\n function totalSupplyOfAuction() internal view returns(uint256) {\n return auctionCurrentIndex - _allowlistSize - 1;\n }\n\n function totalSupplyOfAllowlist() internal view returns(uint256) {\n return allowlistCurrentIndex - 1;\n }\n\n function _exists(uint256 tokenId) internal view override returns (bool) {\n return \n (tokenId \u003e 0 \u0026\u0026 tokenId \u003c= _allowlistSize \u0026\u0026 tokenId \u003c allowlistCurrentIndex) ||\n (tokenId \u003e _allowlistSize \u0026\u0026 tokenId \u003c auctionCurrentIndex);\n }\n\n function _safeMint(address to, uint256 quantity, uint256 startTokenId) internal {\n _safeMint(to, quantity, startTokenId, \"\");\n }\n\n function _safeMint(address to, uint256 quantity, uint256 startTokenId, bytes memory _data) internal {\n require(to != address(0), \"ERC721A: mint to the zero address\");\n // We know if the first token in the batch doesn\u0027t exist, the other ones don\u0027t as well, because of serial ordering.\n require(!_exists(startTokenId), \"ERC721A: token already minted\");\n require(quantity \u003c= maxBatchSize, \"ERC721A: quantity to mint too high\");\n\n _beforeTokenTransfers(address(0), to, startTokenId, quantity);\n\n AddressData memory addressData = _addressData[to];\n _addressData[to] = AddressData(\n addressData.balance + uint128(quantity),\n addressData.numberMinted + uint128(quantity)\n );\n\n _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));\n\n uint256 updatedIndex = startTokenId;\n for (uint256 i = 0; i \u003c quantity; i++) {\n emit Transfer(address(0), to, updatedIndex);\n require(\n _checkOnERC721Received(address(0), to, updatedIndex, _data),\n \"ERC721A: transfer to non ERC721Receiver implementer\"\n );\n updatedIndex++;\n }\n\n _afterTokenTransfers(address(0), to, startTokenId, quantity);\n }\n\n function auctionMint(uint256 quantity) external payable callerIsUser checkTime {\n require(\n totalSupplyOfAuction() + quantity \u003c= _auctionSize,\n \"Tatols: not enough remaining reserved for auction to support desired mint amount\");\n \n uint256 totalCost = uint256(saleConfig.mintPrice) * quantity;\n _safeMint(msg.sender, quantity, auctionCurrentIndex);\n auctionCurrentIndex += quantity;\n refundIfOver(totalCost);\n \n payable(recipient).transfer(totalCost);\n }\n\n function allowlistMint() external payable callerIsUser checkTime {\n require(allowlist[msg.sender] \u003e 0, \"Tatols: not eligible for allowlist mint\");\n require(totalSupplyOfAllowlist() + 1 \u003c= _allowlistSize, \"Tatols: reached max supply\");\n allowlist[msg.sender]--;\n _safeMint(msg.sender, 1, allowlistCurrentIndex);\n allowlistCurrentIndex ++;\n }\n\n function refundIfOver(uint256 price) private {\n require(msg.value \u003e= price, \"Tatols: Need to send more ETH.\");\n if (msg.value \u003e price) {\n payable(msg.sender).transfer(msg.value - price);\n }\n }\n\n function setBaseURI(string calldata baseURI) external onlyOwner {\n _baseTokenURI = baseURI;\n }\n\n function _baseURI() internal view override returns (string memory) {\n return _baseTokenURI;\n }\n\n function seedAllowlist(address[] memory addresses, uint256[] memory numSlots) external onlyOwner {\n require(addresses.length == numSlots.length,\"Tatols: addresses does not match numSlots length\");\n for (uint256 i = 0; i \u003c addresses.length; i++) {\n allowlist[addresses[i]] = numSlots[i];\n }\n }\n\n function setSaleInfo(uint32 startTime, uint32 endTime, uint256 mintPrice) external onlyOwner {\n saleConfig = SaleConfig(startTime, endTime, mintPrice);\n }\n\n function setSaleTime(uint32 startTime, uint32 endTime) external onlyOwner {\n saleConfig.startTime = startTime;\n saleConfig.endTime = endTime;\n }\n\n function getSaleTime() external view returns(uint256,uint256) {\n return (saleConfig.startTime, saleConfig.endTime);\n }\n\n function setSaleMintPrice(uint256 mintPrice) external onlyOwner {\n saleConfig.mintPrice = mintPrice;\n }\n\n function withdrawMoney() external onlyOwner nonReentrant {\n Address.sendValue(payable(recipient), address(this).balance);\n }\n\n function numberMinted(address owner) public view returns (uint256) {\n return _numberMinted(owner);\n }\n\n function setOwnersExplicit(uint256 quantity) external onlyOwner nonReentrant {\n _setOwnersExplicit(quantity);\n }\n\n function devAllowlistMint(uint256 quantity) external onlyOwner {\n require(\n totalSupplyOfAllowlist() + quantity \u003c= _allowlistSize, \n \"Tatols: not enough remaining reserved for auction to support desired mint amount\");\n \n require(\n quantity % maxBatchSize == 0,\n \"Tatols: can only mint a multiple of the maxBatchSize\");\n\n uint256 numChunks = quantity / maxBatchSize;\n for (uint256 i = 0; i \u003c numChunks; i++) {\n _safeMint(msg.sender, maxBatchSize, allowlistCurrentIndex);\n allowlistCurrentIndex += maxBatchSize;\n }\n }\n\n function devAuctionMint(uint256 quantity) external onlyOwner {\n require(\n totalSupplyOfAuction() + quantity \u003c= _auctionSize, \n \"Tatols: not enough remaining reserved for auction to support desired mint amount\");\n \n require(\n quantity % maxBatchSize == 0,\n \"Tatols: can only mint a multiple of the maxBatchSize\");\n \n uint256 numChunks = quantity / maxBatchSize;\n for (uint256 i = 0; i \u003c numChunks; i++) {\n _safeMint(msg.sender, maxBatchSize, auctionCurrentIndex);\n auctionCurrentIndex += maxBatchSize;\n }\n }\n\n function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) {\n return ownershipOf(tokenId);\n }\n \n function exists(uint256 tokenId) external view returns (bool) {\n return _exists(tokenId);\n }\n \n function getAllowlistQuantity(address account) external view returns(uint256) {\n return allowlist[account];\n }\n}"}}