@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,291 @@
1
+ // SPDX-License-Identifier: LGPL-3.0-only
2
+ // Created By: Art Blocks Inc.
3
+
4
+ import "../../interfaces/0.8.x/IMinterFilterV0.sol";
5
+ import "../../interfaces/0.8.x/IFilteredMinterV0.sol";
6
+ import "../../interfaces/0.8.x/IGenArt721CoreContractV1.sol";
7
+
8
+ import "@openzeppelin-4.5/contracts/utils/structs/EnumerableMap.sol";
9
+
10
+ pragma solidity 0.8.9;
11
+
12
+ /**
13
+ * @title Minter filter contract that allows filtered minters to be set
14
+ * on a per-project basis.
15
+ * @author Art Blocks Inc.
16
+ */
17
+ contract MinterFilterV0 is IMinterFilterV0 {
18
+ /**
19
+ * @notice This minter is to be considered `_coreContractAddress`'s
20
+ * canonical minter.
21
+ * @dev may be vestigial after migrating to V3 core contracts
22
+ */
23
+ event IsCanonicalMinterFilter(address indexed _coreContractAddress);
24
+
25
+ // add Enumerable Map methods
26
+ using EnumerableMap for EnumerableMap.UintToAddressMap;
27
+
28
+ /// Core contract address this minter interacts with
29
+ address public immutable genArt721CoreAddress;
30
+
31
+ /// This contract only uses the portion of V3 interface also on V1 core
32
+ IGenArt721CoreContractV1 private immutable genArtCoreContract;
33
+
34
+ /// projectId => minter address
35
+ EnumerableMap.UintToAddressMap private minterForProject;
36
+
37
+ /// minter address => qty projects currently using minter
38
+ mapping(address => uint256) public numProjectsUsingMinter;
39
+
40
+ /// minter address => is an approved minter?
41
+ mapping(address => bool) public isApprovedMinter;
42
+
43
+ modifier onlyCoreWhitelisted() {
44
+ require(
45
+ genArtCoreContract.isWhitelisted(msg.sender),
46
+ "Only Core whitelisted"
47
+ );
48
+ _;
49
+ }
50
+
51
+ modifier onlyCoreWhitelistedOrArtist(uint256 _projectId) {
52
+ require(
53
+ (genArtCoreContract.isWhitelisted(msg.sender) ||
54
+ msg.sender ==
55
+ genArtCoreContract.projectIdToArtistAddress(_projectId)),
56
+ "Only Core whitelisted or Artist"
57
+ );
58
+ _;
59
+ }
60
+
61
+ modifier projectExists(uint256 _projectId) {
62
+ require(
63
+ _projectId < genArtCoreContract.nextProjectId(),
64
+ "Only existing projects"
65
+ );
66
+ _;
67
+ }
68
+
69
+ modifier usingApprovedMinter(address _minterAddress) {
70
+ require(
71
+ isApprovedMinter[_minterAddress],
72
+ "Only approved minters are allowed"
73
+ );
74
+ _;
75
+ }
76
+
77
+ modifier onlyMintWhitelisted() {
78
+ require(
79
+ genArtCoreContract.isMintWhitelisted(address(this)),
80
+ "Only mint allowlisted"
81
+ );
82
+ _;
83
+ }
84
+
85
+ /**
86
+ * @notice Initializes contract to be a Minter for `_genArt721Address`.
87
+ * @param _genArt721Address Art Blocks core contract address
88
+ * this contract will be a minter for. Can never be updated.
89
+ */
90
+ constructor(address _genArt721Address) {
91
+ genArt721CoreAddress = _genArt721Address;
92
+ genArtCoreContract = IGenArt721CoreContractV1(_genArt721Address);
93
+ }
94
+
95
+ /**
96
+ * @notice Emits event notifying indexers that this is core contract's
97
+ * canonical minter filter.
98
+ * @dev may be vestigial after migrating to V3 core contracts
99
+ */
100
+ function alertAsCanonicalMinterFilter()
101
+ external
102
+ onlyCoreWhitelisted
103
+ onlyMintWhitelisted
104
+ {
105
+ emit IsCanonicalMinterFilter(genArt721CoreAddress);
106
+ }
107
+
108
+ /**
109
+ * @notice Approves minter `_minterAddress`.
110
+ * @param _minterAddress Minter to be added as an approved minter.
111
+ */
112
+ function addApprovedMinter(
113
+ address _minterAddress
114
+ ) external onlyCoreWhitelisted {
115
+ isApprovedMinter[_minterAddress] = true;
116
+ emit MinterApproved(
117
+ _minterAddress,
118
+ IFilteredMinterV0(_minterAddress).minterType()
119
+ );
120
+ }
121
+
122
+ /**
123
+ * @notice Removes previously approved minter `_minterAddress`.
124
+ * @param _minterAddress Minter to remove.
125
+ */
126
+ function removeApprovedMinter(
127
+ address _minterAddress
128
+ ) external onlyCoreWhitelisted {
129
+ require(
130
+ numProjectsUsingMinter[_minterAddress] == 0,
131
+ "Only unused minters"
132
+ );
133
+ isApprovedMinter[_minterAddress] = false;
134
+ emit MinterRevoked(_minterAddress);
135
+ }
136
+
137
+ /**
138
+ * @notice Sets minter for project `_projectId` to minter
139
+ * `_minterAddress`.
140
+ * @param _projectId Project ID to set minter for.
141
+ * @param _minterAddress Minter to be the project's minter.
142
+ */
143
+ function setMinterForProject(
144
+ uint256 _projectId,
145
+ address _minterAddress
146
+ )
147
+ external
148
+ onlyCoreWhitelistedOrArtist(_projectId)
149
+ usingApprovedMinter(_minterAddress)
150
+ projectExists(_projectId)
151
+ {
152
+ // decrement number of projects using a previous minter
153
+ (bool hasPreviousMinter, address previousMinter) = minterForProject
154
+ .tryGet(_projectId);
155
+ if (hasPreviousMinter) {
156
+ numProjectsUsingMinter[previousMinter]--;
157
+ }
158
+ // add new minter
159
+ numProjectsUsingMinter[_minterAddress]++;
160
+ minterForProject.set(_projectId, _minterAddress);
161
+ emit ProjectMinterRegistered(
162
+ _projectId,
163
+ _minterAddress,
164
+ IFilteredMinterV0(_minterAddress).minterType()
165
+ );
166
+ }
167
+
168
+ /**
169
+ * @notice Updates project `_projectId` to have no configured minter.
170
+ * @param _projectId Project ID to remove minter.
171
+ * @dev requires project to have an assigned minter
172
+ */
173
+ function removeMinterForProject(
174
+ uint256 _projectId
175
+ ) external onlyCoreWhitelistedOrArtist(_projectId) {
176
+ _removeMinterForProject(_projectId);
177
+ }
178
+
179
+ /**
180
+ * @notice Updates an array of project IDs to have no configured minter.
181
+ * @param _projectIds Array of project IDs to remove minters for.
182
+ * @dev requires all project IDs to have an assigned minter
183
+ * @dev caution with respect to single tx gas limits
184
+ */
185
+ function removeMintersForProjects(
186
+ uint256[] calldata _projectIds
187
+ ) external onlyCoreWhitelisted {
188
+ uint256 numProjects = _projectIds.length;
189
+ for (uint256 i; i < numProjects; i++) {
190
+ _removeMinterForProject(_projectIds[i]);
191
+ }
192
+ }
193
+
194
+ /**
195
+ * @notice Updates project `_projectId` to have no configured minter
196
+ * (reverts tx if project does not have an assigned minter).
197
+ * @param _projectId Project ID to remove minter.
198
+ */
199
+ function _removeMinterForProject(uint256 _projectId) private {
200
+ // remove minter for project and emit
201
+ // `minterForProject.get()` reverts tx if no minter set for project
202
+ numProjectsUsingMinter[minterForProject.get(_projectId)]--;
203
+ minterForProject.remove(_projectId);
204
+ emit ProjectMinterRemoved(_projectId);
205
+ }
206
+
207
+ /**
208
+ * @notice Mint a token from project `_projectId` to `_to`, originally
209
+ * purchased by `sender`.
210
+ * @param _to The new token's owner.
211
+ * @param _projectId Project ID to mint a new token on.
212
+ * @param sender Address purchasing a new token.
213
+ * @return _tokenId Token ID of minted token
214
+ * @dev reverts w/nonexistent key error when project has no assigned minter
215
+ */
216
+ function mint(
217
+ address _to,
218
+ uint256 _projectId,
219
+ address sender
220
+ ) external returns (uint256 _tokenId) {
221
+ // CHECKS
222
+ // minter is the project's minter
223
+ require(
224
+ msg.sender == minterForProject.get(_projectId),
225
+ "Only assigned minter"
226
+ );
227
+ // EFFECTS
228
+ uint256 tokenId = genArtCoreContract.mint(_to, _projectId, sender);
229
+ return tokenId;
230
+ }
231
+
232
+ /**
233
+ * @notice Gets the assigned minter for project `_projectId`.
234
+ * @param _projectId Project ID to query.
235
+ * @return address Minter address assigned to project `_projectId`
236
+ * @dev requires project to have an assigned minter
237
+ */
238
+ function getMinterForProject(
239
+ uint256 _projectId
240
+ ) external view returns (address) {
241
+ (bool _hasMinter, address _currentMinter) = minterForProject.tryGet(
242
+ _projectId
243
+ );
244
+ require(_hasMinter, "No minter assigned");
245
+ return _currentMinter;
246
+ }
247
+
248
+ /**
249
+ * @notice Queries if project `_projectId` has an assigned minter.
250
+ * @param _projectId Project ID to query.
251
+ * @return bool true if project has an assigned minter, else false
252
+ * @dev requires project to have an assigned minter
253
+ */
254
+ function projectHasMinter(uint256 _projectId) external view returns (bool) {
255
+ (bool _hasMinter, ) = minterForProject.tryGet(_projectId);
256
+ return _hasMinter;
257
+ }
258
+
259
+ /**
260
+ * @notice Gets quantity of projects that have assigned minters.
261
+ * @return uint256 quantity of projects that have assigned minters
262
+ */
263
+ function getNumProjectsWithMinters() external view returns (uint256) {
264
+ return minterForProject.length();
265
+ }
266
+
267
+ /**
268
+ * @notice Get project ID and minter address at index `_index` of
269
+ * enumerable map.
270
+ * @param _index enumerable map index to query.
271
+ * @return projectId project ID at index `_index`
272
+ * @return minterAddress minter address for project at index `_index`
273
+ * @return minterType minter type of minter at minterAddress
274
+ * @dev index must be < quantity of projects that have assigned minters
275
+ */
276
+ function getProjectAndMinterInfoAt(
277
+ uint256 _index
278
+ )
279
+ external
280
+ view
281
+ returns (
282
+ uint256 projectId,
283
+ address minterAddress,
284
+ string memory minterType
285
+ )
286
+ {
287
+ (projectId, minterAddress) = minterForProject.at(_index);
288
+ minterType = IFilteredMinterV0(minterAddress).minterType();
289
+ return (projectId, minterAddress, minterType);
290
+ }
291
+ }
@@ -0,0 +1,320 @@
1
+ // SPDX-License-Identifier: LGPL-3.0-only
2
+ // Created By: Art Blocks Inc.
3
+
4
+ import "../../interfaces/0.8.x/IMinterFilterV0.sol";
5
+ import "../../interfaces/0.8.x/IFilteredMinterV0.sol";
6
+ import "../../interfaces/0.8.x/IAdminACLV0.sol";
7
+ import "../../interfaces/0.8.x/IGenArt721CoreContractV3.sol";
8
+
9
+ import "@openzeppelin-4.5/contracts/utils/structs/EnumerableMap.sol";
10
+
11
+ pragma solidity 0.8.17;
12
+
13
+ /**
14
+ * @title Minter filter contract that allows filtered minters to be set
15
+ * on a per-project basis.
16
+ * This is designed to be used with IGenArt721CoreContractV3 contracts.
17
+ * @author Art Blocks Inc.
18
+ * @notice Privileged Roles and Ownership:
19
+ * This contract is designed to be managed, with limited powers.
20
+ * Privileged roles and abilities are controlled by the core contract's Admin
21
+ * ACL contract and a project's artist. Both of these roles hold extensive
22
+ * power and can modify a project's current minter.
23
+ * Care must be taken to ensure that the admin ACL contract and artist
24
+ * addresses are secure behind a multi-sig or other access control mechanism.
25
+ * ----------------------------------------------------------------------------
26
+ * The following functions are restricted to the core contract's Admin ACL
27
+ * contract:
28
+ * - addApprovedMinters
29
+ * - removeApprovedMinters
30
+ * - removeMintersForProjects
31
+ * ----------------------------------------------------------------------------
32
+ * The following functions are restricted to the core contract's Admin ACL
33
+ * contract or a project's artist:
34
+ * - setMinterForProject
35
+ * - removeMinterForProject
36
+ * ----------------------------------------------------------------------------
37
+ * Additional admin and artist privileged roles may be described on minters
38
+ */
39
+ contract MinterFilterV1 is IMinterFilterV0 {
40
+ // add Enumerable Map methods
41
+ using EnumerableMap for EnumerableMap.UintToAddressMap;
42
+
43
+ /// Core contract address this minter interacts with
44
+ address public immutable genArt721CoreAddress;
45
+
46
+ /// This contract integrates with the IV3 core contract
47
+ IGenArt721CoreContractV3 private immutable genArtCoreContract;
48
+
49
+ /// projectId => minter address
50
+ EnumerableMap.UintToAddressMap private minterForProject;
51
+
52
+ /// minter address => qty projects currently using minter
53
+ mapping(address => uint256) public numProjectsUsingMinter;
54
+
55
+ /// minter address => is an approved minter?
56
+ mapping(address => bool) public isApprovedMinter;
57
+
58
+ modifier onlyNonZeroAddress(address _address) {
59
+ require(_address != address(0), "Must input non-zero address");
60
+ _;
61
+ }
62
+
63
+ // modifier to restrict access to only AdminACL allowed calls
64
+ // @dev defers which ACL contract is used to the core contract
65
+ modifier onlyCoreAdminACL(bytes4 _selector) {
66
+ require(_coreAdminACLAllowed(_selector), "Only Core AdminACL allowed");
67
+ _;
68
+ }
69
+
70
+ // modifier to restrict access to only the artist of `_projectId`, or
71
+ // AdminACL allowed calls
72
+ // @dev defers which ACL contract is used to the core contract
73
+ modifier onlyCoreAdminACLOrArtist(uint256 _projectId, bytes4 _selector) {
74
+ require(
75
+ msg.sender ==
76
+ genArtCoreContract.projectIdToArtistAddress(_projectId) ||
77
+ _coreAdminACLAllowed(_selector),
78
+ "Only Core AdminACL or Artist"
79
+ );
80
+ _;
81
+ }
82
+
83
+ modifier onlyValidProjectId(uint256 _projectId) {
84
+ require(
85
+ _projectId < genArtCoreContract.nextProjectId(),
86
+ "Only existing projects"
87
+ );
88
+ _;
89
+ }
90
+
91
+ modifier usingApprovedMinter(address _minterAddress) {
92
+ require(
93
+ isApprovedMinter[_minterAddress],
94
+ "Only approved minters are allowed"
95
+ );
96
+ _;
97
+ }
98
+
99
+ /**
100
+ * @notice Initializes contract to be a Minter for `_genArt721Address`.
101
+ * @param _genArt721Address Art Blocks core contract address
102
+ * this contract will be a minter for. Can never be updated.
103
+ */
104
+ constructor(
105
+ address _genArt721Address
106
+ ) onlyNonZeroAddress(_genArt721Address) {
107
+ genArt721CoreAddress = _genArt721Address;
108
+ genArtCoreContract = IGenArt721CoreContractV3(_genArt721Address);
109
+ }
110
+
111
+ /**
112
+ * @notice Internal function that determines if msg.sender is allowed to
113
+ * call a function on this contract. Defers to core contract's
114
+ * adminACLAllowed function.
115
+ */
116
+ function _coreAdminACLAllowed(bytes4 _selector) internal returns (bool) {
117
+ return
118
+ genArtCoreContract.adminACLAllowed(
119
+ msg.sender,
120
+ address(this),
121
+ _selector
122
+ );
123
+ }
124
+
125
+ /**
126
+ * @notice Approves minter `_minterAddress`.
127
+ * @param _minterAddress Minter to be added as an approved minter.
128
+ */
129
+ function addApprovedMinter(
130
+ address _minterAddress
131
+ )
132
+ external
133
+ onlyCoreAdminACL(this.addApprovedMinter.selector)
134
+ onlyNonZeroAddress(_minterAddress)
135
+ {
136
+ isApprovedMinter[_minterAddress] = true;
137
+ emit MinterApproved(
138
+ _minterAddress,
139
+ IFilteredMinterV0(_minterAddress).minterType()
140
+ );
141
+ }
142
+
143
+ /**
144
+ * @notice Removes previously approved minter `_minterAddress`.
145
+ * @param _minterAddress Minter to remove.
146
+ */
147
+ function removeApprovedMinter(
148
+ address _minterAddress
149
+ ) external onlyCoreAdminACL(this.removeApprovedMinter.selector) {
150
+ require(isApprovedMinter[_minterAddress], "Only approved minters");
151
+ require(
152
+ numProjectsUsingMinter[_minterAddress] == 0,
153
+ "Only unused minters"
154
+ );
155
+ isApprovedMinter[_minterAddress] = false;
156
+ emit MinterRevoked(_minterAddress);
157
+ }
158
+
159
+ /**
160
+ * @notice Sets minter for project `_projectId` to minter
161
+ * `_minterAddress`.
162
+ * @param _projectId Project ID to set minter for.
163
+ * @param _minterAddress Minter to be the project's minter.
164
+ */
165
+ function setMinterForProject(
166
+ uint256 _projectId,
167
+ address _minterAddress
168
+ )
169
+ external
170
+ onlyCoreAdminACLOrArtist(_projectId, this.setMinterForProject.selector)
171
+ usingApprovedMinter(_minterAddress)
172
+ onlyValidProjectId(_projectId)
173
+ {
174
+ // decrement number of projects using a previous minter
175
+ (bool hasPreviousMinter, address previousMinter) = minterForProject
176
+ .tryGet(_projectId);
177
+ if (hasPreviousMinter) {
178
+ numProjectsUsingMinter[previousMinter]--;
179
+ }
180
+ // add new minter
181
+ numProjectsUsingMinter[_minterAddress]++;
182
+ minterForProject.set(_projectId, _minterAddress);
183
+ emit ProjectMinterRegistered(
184
+ _projectId,
185
+ _minterAddress,
186
+ IFilteredMinterV0(_minterAddress).minterType()
187
+ );
188
+ }
189
+
190
+ /**
191
+ * @notice Updates project `_projectId` to have no configured minter.
192
+ * @param _projectId Project ID to remove minter.
193
+ * @dev requires project to have an assigned minter
194
+ */
195
+ function removeMinterForProject(
196
+ uint256 _projectId
197
+ )
198
+ external
199
+ onlyCoreAdminACLOrArtist(
200
+ _projectId,
201
+ this.removeMinterForProject.selector
202
+ )
203
+ {
204
+ _removeMinterForProject(_projectId);
205
+ }
206
+
207
+ /**
208
+ * @notice Updates an array of project IDs to have no configured minter.
209
+ * @param _projectIds Array of project IDs to remove minters for.
210
+ * @dev requires all project IDs to have an assigned minter
211
+ * @dev caution with respect to single tx gas limits
212
+ */
213
+ function removeMintersForProjects(
214
+ uint256[] calldata _projectIds
215
+ ) external onlyCoreAdminACL(this.removeMintersForProjects.selector) {
216
+ uint256 numProjects = _projectIds.length;
217
+ for (uint256 i; i < numProjects; i++) {
218
+ _removeMinterForProject(_projectIds[i]);
219
+ }
220
+ }
221
+
222
+ /**
223
+ * @notice Updates project `_projectId` to have no configured minter
224
+ * (reverts tx if project does not have an assigned minter).
225
+ * @param _projectId Project ID to remove minter.
226
+ */
227
+ function _removeMinterForProject(uint256 _projectId) private {
228
+ // remove minter for project and emit
229
+ // `minterForProject.get()` reverts tx if no minter set for project
230
+ numProjectsUsingMinter[minterForProject.get(_projectId)]--;
231
+ minterForProject.remove(_projectId);
232
+ emit ProjectMinterRemoved(_projectId);
233
+ }
234
+
235
+ /**
236
+ * @notice Mint a token from project `_projectId` to `_to`, originally
237
+ * purchased by `sender`.
238
+ * @param _to The new token's owner.
239
+ * @param _projectId Project ID to mint a new token on.
240
+ * @param sender Address purchasing a new token.
241
+ * @return _tokenId Token ID of minted token
242
+ * @dev reverts w/nonexistent key error when project has no assigned minter
243
+ */
244
+ function mint(
245
+ address _to,
246
+ uint256 _projectId,
247
+ address sender
248
+ ) external returns (uint256 _tokenId) {
249
+ // CHECKS
250
+ // minter is the project's minter
251
+ require(
252
+ msg.sender == minterForProject.get(_projectId),
253
+ "Only assigned minter"
254
+ );
255
+ // EFFECTS
256
+ uint256 tokenId = genArtCoreContract.mint_Ecf(_to, _projectId, sender);
257
+ return tokenId;
258
+ }
259
+
260
+ /**
261
+ * @notice Gets the assigned minter for project `_projectId`.
262
+ * @param _projectId Project ID to query.
263
+ * @return address Minter address assigned to project `_projectId`
264
+ * @dev requires project to have an assigned minter
265
+ */
266
+ function getMinterForProject(
267
+ uint256 _projectId
268
+ ) external view onlyValidProjectId(_projectId) returns (address) {
269
+ (bool _hasMinter, address _currentMinter) = minterForProject.tryGet(
270
+ _projectId
271
+ );
272
+ require(_hasMinter, "No minter assigned");
273
+ return _currentMinter;
274
+ }
275
+
276
+ /**
277
+ * @notice Queries if project `_projectId` has an assigned minter.
278
+ * @param _projectId Project ID to query.
279
+ * @return bool true if project has an assigned minter, else false
280
+ */
281
+ function projectHasMinter(
282
+ uint256 _projectId
283
+ ) external view onlyValidProjectId(_projectId) returns (bool) {
284
+ (bool _hasMinter, ) = minterForProject.tryGet(_projectId);
285
+ return _hasMinter;
286
+ }
287
+
288
+ /**
289
+ * @notice Gets quantity of projects that have assigned minters.
290
+ * @return uint256 quantity of projects that have assigned minters
291
+ */
292
+ function getNumProjectsWithMinters() external view returns (uint256) {
293
+ return minterForProject.length();
294
+ }
295
+
296
+ /**
297
+ * @notice Get project ID and minter address at index `_index` of
298
+ * enumerable map.
299
+ * @param _index enumerable map index to query.
300
+ * @return projectId project ID at index `_index`
301
+ * @return minterAddress minter address for project at index `_index`
302
+ * @return minterType minter type of minter at minterAddress
303
+ * @dev index must be < quantity of projects that have assigned minters
304
+ */
305
+ function getProjectAndMinterInfoAt(
306
+ uint256 _index
307
+ )
308
+ external
309
+ view
310
+ returns (
311
+ uint256 projectId,
312
+ address minterAddress,
313
+ string memory minterType
314
+ )
315
+ {
316
+ (projectId, minterAddress) = minterForProject.at(_index);
317
+ minterType = IFilteredMinterV0(minterAddress).minterType();
318
+ return (projectId, minterAddress, minterType);
319
+ }
320
+ }