@artblocks/contracts 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/.env.example +10 -0
  2. package/LICENSE +165 -0
  3. package/README.md +286 -0
  4. package/artifacts/contracts/AdminACLV0.sol/AdminACLV0.json +164 -0
  5. package/artifacts/contracts/AdminACLV1.sol/AdminACLV1.json +248 -0
  6. package/artifacts/contracts/BasicRandomizer.sol/BasicRandomizer.json +24 -0
  7. package/artifacts/contracts/BasicRandomizerV2.sol/BasicRandomizerV2.json +102 -0
  8. package/artifacts/contracts/DependencyRegistryV0.sol/DependencyRegistryV0.json +1020 -0
  9. package/artifacts/contracts/GenArt721CoreV3.sol/GenArt721CoreV3.json +1928 -0
  10. package/artifacts/contracts/GenArt721CoreV3_Engine.sol/GenArt721CoreV3_Engine.json +1942 -0
  11. package/artifacts/contracts/engine/GenArt721CoreV2_ENGINE_FLEX.sol/GenArt721CoreV2_ENGINE_FLEX.json +1708 -0
  12. package/artifacts/contracts/engine/GenArt721CoreV2_PBAB.sol/GenArt721CoreV2_PBAB.json +1410 -0
  13. package/artifacts/contracts/engine/GenArt721CoreV2_PRTNR.sol/GenArt721CoreV2_PRTNR.json +1436 -0
  14. package/artifacts/contracts/engine/GenArt721MinterBurner_PBAB.sol/GenArt721MinterBurner_PBAB.json +437 -0
  15. package/artifacts/contracts/engine/GenArt721MinterDAExp_PBAB.sol/GenArt721MinterDAExp_PBAB.json +508 -0
  16. package/artifacts/contracts/engine/GenArt721Minter_PBAB.sol/GenArt721Minter_PBAB.json +381 -0
  17. package/artifacts/contracts/engine-registry/EngineRegistryV0.sol/EngineRegistryV0.json +109 -0
  18. package/artifacts/contracts/engine-registry/future/EngineRegistryV1.sol/EngineRegistryV1.json +109 -0
  19. package/artifacts/contracts/explorations/GenArt721CoreV3_Explorations.sol/GenArt721CoreV3_Explorations.json +1902 -0
  20. package/artifacts/contracts/interfaces/0.5.x/IBonusContract.sol/IBonusContract.json +47 -0
  21. package/artifacts/contracts/interfaces/0.5.x/IGenArt721CoreContractV1.sol/IGenArt721CoreContractV1.json +413 -0
  22. package/artifacts/contracts/interfaces/0.5.x/IGenArt721CoreV2_PBAB.sol/IGenArt721CoreV2_PBAB.json +392 -0
  23. package/artifacts/contracts/interfaces/0.5.x/IRandomizer.sol/IRandomizer.json +26 -0
  24. package/artifacts/contracts/interfaces/0.8.x/IAdminACLV0.sol/IAdminACLV0.json +122 -0
  25. package/artifacts/contracts/interfaces/0.8.x/IArtblocksRoyaltyOverride.sol/IArtblocksRoyaltyOverride.json +59 -0
  26. package/artifacts/contracts/interfaces/0.8.x/IBonusContract.sol/IBonusContract.json +43 -0
  27. package/artifacts/contracts/interfaces/0.8.x/IDelegationRegistry.sol/IDelegationRegistry.json +510 -0
  28. package/artifacts/contracts/interfaces/0.8.x/IDependencyRegistryCompatibleV0.sol/IDependencyRegistryCompatibleV0.json +53 -0
  29. package/artifacts/contracts/interfaces/0.8.x/IDependencyRegistryV0.sol/IDependencyRegistryV0.json +350 -0
  30. package/artifacts/contracts/interfaces/0.8.x/IEngineRegistryV0.sol/IEngineRegistryV0.json +85 -0
  31. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlementV0.sol/IFilteredMinterDAExpSettlementV0.json +730 -0
  32. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDAExpV0.sol/IFilteredMinterDAExpV0.json +311 -0
  33. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDAExpV1.sol/IFilteredMinterDAExpV1.json +617 -0
  34. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDALinV0.sol/IFilteredMinterDALinV0.json +292 -0
  35. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDALinV1.sol/IFilteredMinterDALinV1.json +598 -0
  36. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterHolderV0.sol/IFilteredMinterHolderV0.json +355 -0
  37. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterHolderV1.sol/IFilteredMinterHolderV1.json +368 -0
  38. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterHolderV2.sol/IFilteredMinterHolderV2.json +674 -0
  39. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterMerkleV0.sol/IFilteredMinterMerkleV0.json +551 -0
  40. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterMerkleV1.sol/IFilteredMinterMerkleV1.json +564 -0
  41. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterMerkleV2.sol/IFilteredMinterMerkleV2.json +601 -0
  42. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterV0.sol/IFilteredMinterV0.json +216 -0
  43. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterV1.sol/IFilteredMinterV1.json +485 -0
  44. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterV2.sol/IFilteredMinterV2.json +522 -0
  45. package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV1.sol/IGenArt721CoreContractV1.json +299 -0
  46. package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3.sol/IGenArt721CoreContractV3.json +609 -0
  47. package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Base.sol/IGenArt721CoreContractV3_Base.json +448 -0
  48. package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Engine.sol/IGenArt721CoreContractV3_Engine.json +649 -0
  49. package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreV2_PBAB.sol/IGenArt721CoreV2_PBAB.json +362 -0
  50. package/artifacts/contracts/interfaces/0.8.x/IManifold.sol/IManifold.json +35 -0
  51. package/artifacts/contracts/interfaces/0.8.x/IMinterFilterV0.sol/IMinterFilterV0.json +192 -0
  52. package/artifacts/contracts/interfaces/0.8.x/IRandomizer.sol/IRandomizer.json +24 -0
  53. package/artifacts/contracts/interfaces/0.8.x/IRandomizerV2.sol/IRandomizerV2.json +37 -0
  54. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/Address.json +10 -0
  55. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/Counters.json +10 -0
  56. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/CustomERC721Metadata.json +425 -0
  57. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/ERC165.json +38 -0
  58. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/ERC721.json +322 -0
  59. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/ERC721Enumerable.json +384 -0
  60. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/GenArt721CoreV1.json +1773 -0
  61. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/IERC165.json +32 -0
  62. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/IERC721.json +316 -0
  63. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/IERC721Enumerable.json +378 -0
  64. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/IERC721Receiver.json +47 -0
  65. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/SafeMath.json +10 -0
  66. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/Strings.json +10 -0
  67. package/artifacts/contracts/legacy/GenArt721LegacyMinter.sol/GenArt721LegacyMinter.json +338 -0
  68. package/artifacts/contracts/libs/0.5.x/CustomERC721Metadata.sol/CustomERC721Metadata.json +425 -0
  69. package/artifacts/contracts/libs/0.5.x/IERC20.sol/IERC20.json +206 -0
  70. package/artifacts/contracts/libs/0.5.x/SafeMath.sol/SafeMath.json +10 -0
  71. package/artifacts/contracts/libs/0.5.x/Strings.sol/Strings.json +10 -0
  72. package/artifacts/contracts/libs/0.8.x/BytecodeStorage.sol/BytecodeStorage.json +10 -0
  73. package/artifacts/contracts/libs/0.8.x/Bytes32Strings.sol/Bytes32Strings.json +10 -0
  74. package/artifacts/contracts/libs/0.8.x/ERC721_PackedHashSeed.sol/ERC721_PackedHashSeed.json +357 -0
  75. package/artifacts/contracts/libs/integration-refs/delegation-registry/DelegationRegistry.sol/DelegationRegistry.json +529 -0
  76. package/artifacts/contracts/libs/integration-refs/gnosis-safe/GnosisSafeMock.sol/GnosisSafeMock.json +1037 -0
  77. package/artifacts/contracts/libs/integration-refs/gnosis-safe/GnosisSafeProxyFactoryMock.sol/GnosisSafeProxyFactoryMock.json +172 -0
  78. package/artifacts/contracts/libs/integration-refs/gnosis-safe/MultiSendMock.sol/MultiSendMock.json +24 -0
  79. package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV0.sol/MinterFilterV0.json +342 -0
  80. package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV1.sol/MinterFilterV1.json +322 -0
  81. package/artifacts/contracts/minter-suite/Minters/MinterDAExp/MinterDAExpV2.sol/MinterDAExpV2.json +550 -0
  82. package/artifacts/contracts/minter-suite/Minters/MinterDAExp/MinterDAExpV3.sol/MinterDAExpV3.json +856 -0
  83. package/artifacts/contracts/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol/MinterDAExpSettlementV0.json +1053 -0
  84. package/artifacts/contracts/minter-suite/Minters/MinterDALin/MinterDALinV2.sol/MinterDALinV2.json +526 -0
  85. package/artifacts/contracts/minter-suite/Minters/MinterDALin/MinterDALinV3.sol/MinterDALinV3.json +832 -0
  86. package/artifacts/contracts/minter-suite/Minters/MinterHolder/MinterHolderV2.sol/MinterHolderV2.json +794 -0
  87. package/artifacts/contracts/minter-suite/Minters/MinterHolder/MinterHolderV3.sol/MinterHolderV3.json +1100 -0
  88. package/artifacts/contracts/minter-suite/Minters/MinterMerkle/MinterMerkleV3.sol/MinterMerkleV3.json +1002 -0
  89. package/artifacts/contracts/minter-suite/Minters/MinterMerkle/MinterMerkleV4.sol/MinterMerkleV4.json +1039 -0
  90. package/artifacts/contracts/minter-suite/Minters/MinterSetPrice/MinterSetPriceV2.sol/MinterSetPriceV2.json +365 -0
  91. package/artifacts/contracts/minter-suite/Minters/MinterSetPrice/MinterSetPriceV3.sol/MinterSetPriceV3.json +671 -0
  92. package/artifacts/contracts/minter-suite/Minters/MinterSetPrice/deprecated/MinterSetPriceV1.sol/MinterSetPriceV1.json +288 -0
  93. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V2.sol/MinterSetPriceERC20V2.json +436 -0
  94. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V3.sol/MinterSetPriceERC20V3.json +742 -0
  95. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20/deprecated/MinterSetPriceERC20V0.sol/MinterSetPriceERC20V0.json +461 -0
  96. package/artifacts/contracts/mock/BytecodeTextCR_DMock.sol/BytecodeTextCR_DMock.json +194 -0
  97. package/artifacts/contracts/mock/DeadReceiverMock.sol/DeadReceiverMock.json +15 -0
  98. package/artifacts/contracts/mock/ERC20Mock.sol/ERC20Mock.json +292 -0
  99. package/artifacts/contracts/mock/MockAdminACLV0.sol/MockAdminACLV0Events.json +165 -0
  100. package/artifacts/contracts/mock/RandomizerV2_NoAssignMock.sol/RandomizerV2_NoAssignMock.json +128 -0
  101. package/artifacts/contracts/mock/ReentrancyHolderMock.sol/ReentrancyHolderMock.json +118 -0
  102. package/artifacts/contracts/mock/ReentrancyMerkleMock.sol/ReentrancyMerkleMock.json +87 -0
  103. package/artifacts/contracts/mock/ReentrancyMock.sol/ReentrancyMock.json +82 -0
  104. package/artifacts/contracts/royalty-registry/GenArt721RoyaltyOverride.sol/GenArt721RoyaltyOverride.json +208 -0
  105. package/artifacts/contracts/royalty-registry/GenArt721RoyaltyOverride_PBAB.sol/GenArt721RoyaltyOverride_PBAB.json +301 -0
  106. package/contracts/AdminACLV0.sol +103 -0
  107. package/contracts/AdminACLV1.sol +193 -0
  108. package/contracts/BasicRandomizer.sol +23 -0
  109. package/contracts/BasicRandomizerV2.sol +36 -0
  110. package/contracts/DependencyRegistryV0.sol +893 -0
  111. package/contracts/GenArt721CoreV3.sol +2001 -0
  112. package/contracts/GenArt721CoreV3_Engine.sol +2061 -0
  113. package/contracts/engine/GenArt721CoreV2_ENGINE_FLEX.sol +887 -0
  114. package/contracts/engine/GenArt721CoreV2_PBAB.sol +695 -0
  115. package/contracts/engine/GenArt721CoreV2_PRTNR.sol +749 -0
  116. package/contracts/engine/GenArt721MinterBurner_PBAB.sol +467 -0
  117. package/contracts/engine/GenArt721MinterDAExp_PBAB.sol +614 -0
  118. package/contracts/engine/GenArt721Minter_PBAB.sol +420 -0
  119. package/contracts/engine-registry/EngineRegistryV0.sol +72 -0
  120. package/contracts/engine-registry/future/EngineRegistryV1.sol +86 -0
  121. package/contracts/explorations/GenArt721CoreV3_Explorations.sol +1989 -0
  122. package/contracts/interfaces/0.5.x/IBonusContract.sol +10 -0
  123. package/contracts/interfaces/0.5.x/IGenArt721CoreContractV1.sol +91 -0
  124. package/contracts/interfaces/0.5.x/IGenArt721CoreV2_PBAB.sol +92 -0
  125. package/contracts/interfaces/0.5.x/IRandomizer.sol +8 -0
  126. package/contracts/interfaces/0.8.x/IAdminACLV0.sol +51 -0
  127. package/contracts/interfaces/0.8.x/IArtblocksRoyaltyOverride.sol +34 -0
  128. package/contracts/interfaces/0.8.x/IBonusContract.sol +10 -0
  129. package/contracts/interfaces/0.8.x/IDelegationRegistry.sol +221 -0
  130. package/contracts/interfaces/0.8.x/IDependencyRegistryCompatibleV0.sol +31 -0
  131. package/contracts/interfaces/0.8.x/IDependencyRegistryV0.sol +95 -0
  132. package/contracts/interfaces/0.8.x/IEngineRegistryV0.sol +38 -0
  133. package/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlementV0.sol +70 -0
  134. package/contracts/interfaces/0.8.x/IFilteredMinterDAExpV0.sol +35 -0
  135. package/contracts/interfaces/0.8.x/IFilteredMinterDAExpV1.sol +16 -0
  136. package/contracts/interfaces/0.8.x/IFilteredMinterDALinV0.sol +32 -0
  137. package/contracts/interfaces/0.8.x/IFilteredMinterDALinV1.sol +16 -0
  138. package/contracts/interfaces/0.8.x/IFilteredMinterHolderV0.sol +68 -0
  139. package/contracts/interfaces/0.8.x/IFilteredMinterHolderV1.sol +19 -0
  140. package/contracts/interfaces/0.8.x/IFilteredMinterHolderV2.sol +19 -0
  141. package/contracts/interfaces/0.8.x/IFilteredMinterMerkleV0.sol +37 -0
  142. package/contracts/interfaces/0.8.x/IFilteredMinterMerkleV1.sol +19 -0
  143. package/contracts/interfaces/0.8.x/IFilteredMinterMerkleV2.sol +19 -0
  144. package/contracts/interfaces/0.8.x/IFilteredMinterV0.sol +74 -0
  145. package/contracts/interfaces/0.8.x/IFilteredMinterV1.sol +127 -0
  146. package/contracts/interfaces/0.8.x/IFilteredMinterV2.sol +30 -0
  147. package/contracts/interfaces/0.8.x/IGenArt721CoreContractV1.sol +73 -0
  148. package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3.sol +79 -0
  149. package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Base.sol +127 -0
  150. package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Engine.sol +80 -0
  151. package/contracts/interfaces/0.8.x/IGenArt721CoreV2_PBAB.sol +91 -0
  152. package/contracts/interfaces/0.8.x/IManifold.sol +24 -0
  153. package/contracts/interfaces/0.8.x/IMinterFilterV0.sol +47 -0
  154. package/contracts/interfaces/0.8.x/IRandomizer.sol +8 -0
  155. package/contracts/interfaces/0.8.x/IRandomizerV2.sol +15 -0
  156. package/contracts/legacy/GenArt721CoreV1.sol +1593 -0
  157. package/contracts/legacy/GenArt721LegacyMinter.sol +275 -0
  158. package/contracts/libs/0.5.x/CustomERC721Metadata.sol +52 -0
  159. package/contracts/libs/0.5.x/IERC20.sol +96 -0
  160. package/contracts/libs/0.5.x/SafeMath.sol +98 -0
  161. package/contracts/libs/0.5.x/Strings.sol +92 -0
  162. package/contracts/libs/0.8.x/BytecodeStorage.sol +314 -0
  163. package/contracts/libs/0.8.x/Bytes32Strings.sol +66 -0
  164. package/contracts/libs/0.8.x/ERC721_PackedHashSeed.sol +514 -0
  165. package/contracts/libs/integration-refs/delegation-registry/DelegationRegistry.sol +663 -0
  166. package/contracts/libs/integration-refs/gnosis-safe/GnosisSafeMock.sol +6 -0
  167. package/contracts/libs/integration-refs/gnosis-safe/GnosisSafeProxyFactoryMock.sol +6 -0
  168. package/contracts/libs/integration-refs/gnosis-safe/MultiSendMock.sol +6 -0
  169. package/contracts/minter-suite/MinterFilter/MinterFilterV0.sol +291 -0
  170. package/contracts/minter-suite/MinterFilter/MinterFilterV1.sol +320 -0
  171. package/contracts/minter-suite/Minters/MinterDAExp/MinterDAExpV2.sol +571 -0
  172. package/contracts/minter-suite/Minters/MinterDAExp/MinterDAExpV3.sol +622 -0
  173. package/contracts/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol +1066 -0
  174. package/contracts/minter-suite/Minters/MinterDALin/MinterDALinV2.sol +527 -0
  175. package/contracts/minter-suite/Minters/MinterDALin/MinterDALinV3.sol +576 -0
  176. package/contracts/minter-suite/Minters/MinterHolder/MinterHolderV2.sol +749 -0
  177. package/contracts/minter-suite/Minters/MinterHolder/MinterHolderV3.sol +798 -0
  178. package/contracts/minter-suite/Minters/MinterMerkle/MinterMerkleV3.sol +682 -0
  179. package/contracts/minter-suite/Minters/MinterMerkle/MinterMerkleV4.sol +733 -0
  180. package/contracts/minter-suite/Minters/MinterSetPrice/MinterSetPriceV2.sol +350 -0
  181. package/contracts/minter-suite/Minters/MinterSetPrice/MinterSetPriceV3.sol +401 -0
  182. package/contracts/minter-suite/Minters/MinterSetPrice/deprecated/MinterSetPriceV1.sol +274 -0
  183. package/contracts/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V2.sol +491 -0
  184. package/contracts/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V3.sol +542 -0
  185. package/contracts/minter-suite/Minters/MinterSetPriceERC20/deprecated/MinterSetPriceERC20V0.sol +470 -0
  186. package/contracts/mock/BytecodeTextCR_DMock.sol +184 -0
  187. package/contracts/mock/DeadReceiverMock.sol +13 -0
  188. package/contracts/mock/ERC20Mock.sol +11 -0
  189. package/contracts/mock/MockAdminACLV0.sol +65 -0
  190. package/contracts/mock/RandomizerV2_NoAssignMock.sol +43 -0
  191. package/contracts/mock/ReentrancyHolderMock.sol +50 -0
  192. package/contracts/mock/ReentrancyMerkleMock.sol +64 -0
  193. package/contracts/mock/ReentrancyMock.sol +44 -0
  194. package/contracts/royalty-registry/GenArt721RoyaltyOverride.sol +168 -0
  195. package/contracts/royalty-registry/GenArt721RoyaltyOverride_PBAB.sol +221 -0
  196. package/package.json +83 -0
@@ -0,0 +1,514 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)
3
+
4
+ pragma solidity ^0.8.0;
5
+
6
+ import "@openzeppelin-4.7/contracts/token/ERC721/IERC721.sol";
7
+ import "@openzeppelin-4.7/contracts/token/ERC721/IERC721Receiver.sol";
8
+ import "@openzeppelin-4.7/contracts/token/ERC721/extensions/IERC721Metadata.sol";
9
+ import "@openzeppelin-4.7/contracts/utils/Address.sol";
10
+ import "@openzeppelin-4.7/contracts/utils/Context.sol";
11
+ import "@openzeppelin-4.7/contracts/utils/Strings.sol";
12
+ import "@openzeppelin-4.7/contracts/utils/introspection/ERC165.sol";
13
+
14
+ /**
15
+ * @dev Forked version of the OpenZeppelin v4.7.1 ERC721 contract. Utilizes a
16
+ * struct to pack owner and hash seed into a single storage slot.
17
+ * ---------------------
18
+ * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
19
+ * the Metadata extension, but not including the Enumerable extension, which is available separately as
20
+ * {ERC721Enumerable}.
21
+ */
22
+ contract ERC721_PackedHashSeed is Context, ERC165, IERC721, IERC721Metadata {
23
+ using Address for address;
24
+ using Strings for uint256;
25
+
26
+ // Token name
27
+ string private _name;
28
+
29
+ // Token symbol
30
+ string private _symbol;
31
+
32
+ /// struct to pack a token owner and hash seed into same storage slot
33
+ struct OwnerAndHashSeed {
34
+ // 20 bytes for address of token's owner
35
+ address owner;
36
+ // remaining 12 bytes allocated to token hash seed
37
+ bytes12 hashSeed;
38
+ }
39
+
40
+ /// mapping of token ID to OwnerAndHashSeed
41
+ /// @dev visibility internal so inheriting contracts can access
42
+ mapping(uint256 => OwnerAndHashSeed) internal _ownersAndHashSeeds;
43
+
44
+ // Mapping owner address to token count
45
+ mapping(address => uint256) private _balances;
46
+
47
+ // Mapping from token ID to approved address
48
+ mapping(uint256 => address) private _tokenApprovals;
49
+
50
+ // Mapping from owner to operator approvals
51
+ mapping(address => mapping(address => bool)) private _operatorApprovals;
52
+
53
+ /**
54
+ * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
55
+ */
56
+ constructor(string memory name_, string memory symbol_) {
57
+ _name = name_;
58
+ _symbol = symbol_;
59
+ }
60
+
61
+ /**
62
+ * @dev See {IERC165-supportsInterface}.
63
+ */
64
+ function supportsInterface(
65
+ bytes4 interfaceId
66
+ ) public view virtual override(ERC165, IERC165) returns (bool) {
67
+ return
68
+ interfaceId == type(IERC721).interfaceId ||
69
+ interfaceId == type(IERC721Metadata).interfaceId ||
70
+ super.supportsInterface(interfaceId);
71
+ }
72
+
73
+ /**
74
+ * @dev See {IERC721-balanceOf}.
75
+ */
76
+ function balanceOf(
77
+ address owner
78
+ ) public view virtual override returns (uint256) {
79
+ require(
80
+ owner != address(0),
81
+ "ERC721: address zero is not a valid owner"
82
+ );
83
+ return _balances[owner];
84
+ }
85
+
86
+ /**
87
+ * @dev See {IERC721-ownerOf}.
88
+ */
89
+ function ownerOf(
90
+ uint256 tokenId
91
+ ) public view virtual override returns (address) {
92
+ address owner = _ownersAndHashSeeds[tokenId].owner;
93
+ require(owner != address(0), "ERC721: invalid token ID");
94
+ return owner;
95
+ }
96
+
97
+ /**
98
+ * @dev See {IERC721Metadata-name}.
99
+ */
100
+ function name() public view virtual override returns (string memory) {
101
+ return _name;
102
+ }
103
+
104
+ /**
105
+ * @dev See {IERC721Metadata-symbol}.
106
+ */
107
+ function symbol() public view virtual override returns (string memory) {
108
+ return _symbol;
109
+ }
110
+
111
+ /**
112
+ * @dev See {IERC721Metadata-tokenURI}.
113
+ */
114
+ function tokenURI(
115
+ uint256 tokenId
116
+ ) public view virtual override returns (string memory) {
117
+ _requireMinted(tokenId);
118
+
119
+ string memory baseURI = _baseURI();
120
+ return
121
+ bytes(baseURI).length > 0
122
+ ? string(abi.encodePacked(baseURI, tokenId.toString()))
123
+ : "";
124
+ }
125
+
126
+ /**
127
+ * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
128
+ * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
129
+ * by default, can be overridden in child contracts.
130
+ */
131
+ function _baseURI() internal view virtual returns (string memory) {
132
+ return "";
133
+ }
134
+
135
+ /**
136
+ * @dev See {IERC721-approve}.
137
+ */
138
+ function approve(address to, uint256 tokenId) public virtual override {
139
+ address owner = ERC721_PackedHashSeed.ownerOf(tokenId);
140
+ require(to != owner, "ERC721: approval to current owner");
141
+
142
+ require(
143
+ _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
144
+ "ERC721: approve caller is not token owner nor approved for all"
145
+ );
146
+
147
+ _approve(to, tokenId);
148
+ }
149
+
150
+ /**
151
+ * @dev See {IERC721-getApproved}.
152
+ */
153
+ function getApproved(
154
+ uint256 tokenId
155
+ ) public view virtual override returns (address) {
156
+ _requireMinted(tokenId);
157
+
158
+ return _tokenApprovals[tokenId];
159
+ }
160
+
161
+ /**
162
+ * @dev See {IERC721-setApprovalForAll}.
163
+ */
164
+ function setApprovalForAll(
165
+ address operator,
166
+ bool approved
167
+ ) public virtual override {
168
+ _setApprovalForAll(_msgSender(), operator, approved);
169
+ }
170
+
171
+ /**
172
+ * @dev See {IERC721-isApprovedForAll}.
173
+ */
174
+ function isApprovedForAll(
175
+ address owner,
176
+ address operator
177
+ ) public view virtual override returns (bool) {
178
+ return _operatorApprovals[owner][operator];
179
+ }
180
+
181
+ /**
182
+ * @dev See {IERC721-transferFrom}.
183
+ */
184
+ function transferFrom(
185
+ address from,
186
+ address to,
187
+ uint256 tokenId
188
+ ) public virtual override {
189
+ //solhint-disable-next-line max-line-length
190
+ require(
191
+ _isApprovedOrOwner(_msgSender(), tokenId),
192
+ "ERC721: caller is not token owner nor approved"
193
+ );
194
+
195
+ _transfer(from, to, tokenId);
196
+ }
197
+
198
+ /**
199
+ * @dev See {IERC721-safeTransferFrom}.
200
+ */
201
+ function safeTransferFrom(
202
+ address from,
203
+ address to,
204
+ uint256 tokenId
205
+ ) public virtual override {
206
+ safeTransferFrom(from, to, tokenId, "");
207
+ }
208
+
209
+ /**
210
+ * @dev See {IERC721-safeTransferFrom}.
211
+ */
212
+ function safeTransferFrom(
213
+ address from,
214
+ address to,
215
+ uint256 tokenId,
216
+ bytes memory data
217
+ ) public virtual override {
218
+ require(
219
+ _isApprovedOrOwner(_msgSender(), tokenId),
220
+ "ERC721: caller is not token owner nor approved"
221
+ );
222
+ _safeTransfer(from, to, tokenId, data);
223
+ }
224
+
225
+ /**
226
+ * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
227
+ * are aware of the ERC721 protocol to prevent tokens from being forever locked.
228
+ *
229
+ * `data` is additional data, it has no specified format and it is sent in call to `to`.
230
+ *
231
+ * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
232
+ * implement alternative mechanisms to perform token transfer, such as signature-based.
233
+ *
234
+ * Requirements:
235
+ *
236
+ * - `from` cannot be the zero address.
237
+ * - `to` cannot be the zero address.
238
+ * - `tokenId` token must exist and be owned by `from`.
239
+ * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
240
+ *
241
+ * Emits a {Transfer} event.
242
+ */
243
+ function _safeTransfer(
244
+ address from,
245
+ address to,
246
+ uint256 tokenId,
247
+ bytes memory data
248
+ ) internal virtual {
249
+ _transfer(from, to, tokenId);
250
+ require(
251
+ _checkOnERC721Received(from, to, tokenId, data),
252
+ "ERC721: transfer to non ERC721Receiver implementer"
253
+ );
254
+ }
255
+
256
+ /**
257
+ * @dev Returns whether `tokenId` exists.
258
+ *
259
+ * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
260
+ *
261
+ * Tokens start existing when they are minted (`_mint`),
262
+ * and stop existing when they are burned (`_burn`).
263
+ */
264
+ function _exists(uint256 tokenId) internal view virtual returns (bool) {
265
+ return _ownersAndHashSeeds[tokenId].owner != address(0);
266
+ }
267
+
268
+ /**
269
+ * @dev Returns whether `spender` is allowed to manage `tokenId`.
270
+ *
271
+ * Requirements:
272
+ *
273
+ * - `tokenId` must exist.
274
+ */
275
+ function _isApprovedOrOwner(
276
+ address spender,
277
+ uint256 tokenId
278
+ ) internal view virtual returns (bool) {
279
+ address owner = ERC721_PackedHashSeed.ownerOf(tokenId);
280
+ return (spender == owner ||
281
+ isApprovedForAll(owner, spender) ||
282
+ getApproved(tokenId) == spender);
283
+ }
284
+
285
+ /**
286
+ * @dev Safely mints `tokenId` and transfers it to `to`.
287
+ *
288
+ * Requirements:
289
+ *
290
+ * - `tokenId` must not exist.
291
+ * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
292
+ *
293
+ * Emits a {Transfer} event.
294
+ */
295
+ function _safeMint(address to, uint256 tokenId) internal virtual {
296
+ _safeMint(to, tokenId, "");
297
+ }
298
+
299
+ /**
300
+ * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
301
+ * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
302
+ */
303
+ function _safeMint(
304
+ address to,
305
+ uint256 tokenId,
306
+ bytes memory data
307
+ ) internal virtual {
308
+ _mint(to, tokenId);
309
+ require(
310
+ _checkOnERC721Received(address(0), to, tokenId, data),
311
+ "ERC721: transfer to non ERC721Receiver implementer"
312
+ );
313
+ }
314
+
315
+ /**
316
+ * @dev Mints `tokenId` and transfers it to `to`.
317
+ *
318
+ * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
319
+ *
320
+ * Requirements:
321
+ *
322
+ * - `tokenId` must not exist.
323
+ * - `to` cannot be the zero address.
324
+ *
325
+ * Emits a {Transfer} event.
326
+ */
327
+ function _mint(address to, uint256 tokenId) internal virtual {
328
+ require(to != address(0), "ERC721: mint to the zero address");
329
+ require(!_exists(tokenId), "ERC721: token already minted");
330
+
331
+ _beforeTokenTransfer(address(0), to, tokenId);
332
+
333
+ _balances[to] += 1;
334
+ _ownersAndHashSeeds[tokenId].owner = to;
335
+
336
+ emit Transfer(address(0), to, tokenId);
337
+
338
+ _afterTokenTransfer(address(0), to, tokenId);
339
+ }
340
+
341
+ /**
342
+ * @dev Destroys `tokenId`.
343
+ * The approval is cleared when the token is burned.
344
+ *
345
+ * Requirements:
346
+ *
347
+ * - `tokenId` must exist.
348
+ *
349
+ * Emits a {Transfer} event.
350
+ */
351
+ function _burn(uint256 tokenId) internal virtual {
352
+ address owner = ERC721_PackedHashSeed.ownerOf(tokenId);
353
+
354
+ _beforeTokenTransfer(owner, address(0), tokenId);
355
+
356
+ // Clear approvals
357
+ _approve(address(0), tokenId);
358
+
359
+ _balances[owner] -= 1;
360
+ delete _ownersAndHashSeeds[tokenId].owner;
361
+
362
+ emit Transfer(owner, address(0), tokenId);
363
+
364
+ _afterTokenTransfer(owner, address(0), tokenId);
365
+ }
366
+
367
+ /**
368
+ * @dev Transfers `tokenId` from `from` to `to`.
369
+ * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
370
+ *
371
+ * Requirements:
372
+ *
373
+ * - `to` cannot be the zero address.
374
+ * - `tokenId` token must be owned by `from`.
375
+ *
376
+ * Emits a {Transfer} event.
377
+ */
378
+ function _transfer(
379
+ address from,
380
+ address to,
381
+ uint256 tokenId
382
+ ) internal virtual {
383
+ require(
384
+ ERC721_PackedHashSeed.ownerOf(tokenId) == from,
385
+ "ERC721: transfer from incorrect owner"
386
+ );
387
+ require(to != address(0), "ERC721: transfer to the zero address");
388
+
389
+ _beforeTokenTransfer(from, to, tokenId);
390
+
391
+ // Clear approvals from the previous owner
392
+ _approve(address(0), tokenId);
393
+
394
+ _balances[from] -= 1;
395
+ _balances[to] += 1;
396
+ _ownersAndHashSeeds[tokenId].owner = to;
397
+
398
+ emit Transfer(from, to, tokenId);
399
+
400
+ _afterTokenTransfer(from, to, tokenId);
401
+ }
402
+
403
+ /**
404
+ * @dev Approve `to` to operate on `tokenId`
405
+ *
406
+ * Emits an {Approval} event.
407
+ */
408
+ function _approve(address to, uint256 tokenId) internal virtual {
409
+ _tokenApprovals[tokenId] = to;
410
+ emit Approval(ERC721_PackedHashSeed.ownerOf(tokenId), to, tokenId);
411
+ }
412
+
413
+ /**
414
+ * @dev Approve `operator` to operate on all of `owner` tokens
415
+ *
416
+ * Emits an {ApprovalForAll} event.
417
+ */
418
+ function _setApprovalForAll(
419
+ address owner,
420
+ address operator,
421
+ bool approved
422
+ ) internal virtual {
423
+ require(owner != operator, "ERC721: approve to caller");
424
+ _operatorApprovals[owner][operator] = approved;
425
+ emit ApprovalForAll(owner, operator, approved);
426
+ }
427
+
428
+ /**
429
+ * @dev Reverts if the `tokenId` has not been minted yet.
430
+ */
431
+ function _requireMinted(uint256 tokenId) internal view virtual {
432
+ require(_exists(tokenId), "ERC721: invalid token ID");
433
+ }
434
+
435
+ /**
436
+ * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
437
+ * The call is not executed if the target address is not a contract.
438
+ *
439
+ * @param from address representing the previous owner of the given token ID
440
+ * @param to target address that will receive the tokens
441
+ * @param tokenId uint256 ID of the token to be transferred
442
+ * @param data bytes optional data to send along with the call
443
+ * @return bool whether the call correctly returned the expected magic value
444
+ */
445
+ function _checkOnERC721Received(
446
+ address from,
447
+ address to,
448
+ uint256 tokenId,
449
+ bytes memory data
450
+ ) private returns (bool) {
451
+ if (to.isContract()) {
452
+ try
453
+ IERC721Receiver(to).onERC721Received(
454
+ _msgSender(),
455
+ from,
456
+ tokenId,
457
+ data
458
+ )
459
+ returns (bytes4 retval) {
460
+ return retval == IERC721Receiver.onERC721Received.selector;
461
+ } catch (bytes memory reason) {
462
+ if (reason.length == 0) {
463
+ revert(
464
+ "ERC721: transfer to non ERC721Receiver implementer"
465
+ );
466
+ } else {
467
+ /// @solidity memory-safe-assembly
468
+ assembly {
469
+ revert(add(32, reason), mload(reason))
470
+ }
471
+ }
472
+ }
473
+ } else {
474
+ return true;
475
+ }
476
+ }
477
+
478
+ /**
479
+ * @dev Hook that is called before any token transfer. This includes minting
480
+ * and burning.
481
+ *
482
+ * Calling conditions:
483
+ *
484
+ * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
485
+ * transferred to `to`.
486
+ * - When `from` is zero, `tokenId` will be minted for `to`.
487
+ * - When `to` is zero, ``from``'s `tokenId` will be burned.
488
+ * - `from` and `to` are never both zero.
489
+ *
490
+ * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
491
+ */
492
+ function _beforeTokenTransfer(
493
+ address from,
494
+ address to,
495
+ uint256 tokenId
496
+ ) internal virtual {}
497
+
498
+ /**
499
+ * @dev Hook that is called after any transfer of tokens. This includes
500
+ * minting and burning.
501
+ *
502
+ * Calling conditions:
503
+ *
504
+ * - when `from` and `to` are both non-zero.
505
+ * - `from` and `to` are never both zero.
506
+ *
507
+ * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
508
+ */
509
+ function _afterTokenTransfer(
510
+ address from,
511
+ address to,
512
+ uint256 tokenId
513
+ ) internal virtual {}
514
+ }