@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,420 @@
1
+ // SPDX-License-Identifier: LGPL-3.0-only
2
+ // Created By: Art Blocks Inc.
3
+
4
+ import "../interfaces/0.8.x/IGenArt721CoreV2_PBAB.sol";
5
+ import "../interfaces/0.8.x/IBonusContract.sol";
6
+
7
+ import "@openzeppelin-4.5/contracts/security/ReentrancyGuard.sol";
8
+ import "@openzeppelin-4.5/contracts/utils/Strings.sol";
9
+ import "@openzeppelin-4.5/contracts/interfaces/IERC20.sol";
10
+
11
+ pragma solidity 0.8.9;
12
+
13
+ /**
14
+ * @title Powered by Art Blocks minter contract that allows tokens to be
15
+ * minted with ETH or any ERC-20 token.
16
+ * @author Art Blocks Inc.
17
+ */
18
+ contract GenArt721Minter_PBAB is ReentrancyGuard {
19
+ /// PBAB core contract this minter may interact with.
20
+ IGenArt721CoreV2_PBAB public genArtCoreContract;
21
+
22
+ uint256 constant ONE_MILLION = 1_000_000;
23
+
24
+ address payable public ownerAddress;
25
+ uint256 public ownerPercentage;
26
+
27
+ mapping(uint256 => bool) public projectIdToBonus;
28
+ mapping(uint256 => address) public projectIdToBonusContractAddress;
29
+ mapping(uint256 => bool) public contractFilterProject;
30
+ mapping(address => mapping(uint256 => uint256)) public projectMintCounter;
31
+ mapping(uint256 => uint256) public projectMintLimit;
32
+ mapping(uint256 => bool) public projectMaxHasBeenInvoked;
33
+ mapping(uint256 => uint256) public projectMaxInvocations;
34
+
35
+ /**
36
+ * @notice Initializes contract to be a Minter for PBAB core contract at
37
+ * address `_genArt721Address`.
38
+ */
39
+ constructor(address _genArt721Address) ReentrancyGuard() {
40
+ genArtCoreContract = IGenArt721CoreV2_PBAB(_genArt721Address);
41
+ }
42
+
43
+ /**
44
+ * @notice Gets your balance of the ERC-20 token currently set
45
+ * as the payment currency for project `_projectId`.
46
+ * @param _projectId Project ID to be queried.
47
+ * @return balance Balance of ERC-20
48
+ */
49
+ function getYourBalanceOfProjectERC20(
50
+ uint256 _projectId
51
+ ) public view returns (uint256) {
52
+ uint256 balance = IERC20(
53
+ genArtCoreContract.projectIdToCurrencyAddress(_projectId)
54
+ ).balanceOf(msg.sender);
55
+ return balance;
56
+ }
57
+
58
+ /**
59
+ * @notice Gets your allowance for this minter of the ERC-20
60
+ * token currently set as the payment currency for project
61
+ * `_projectId`.
62
+ * @param _projectId Project ID to be queried.
63
+ * @return remaining Remaining allowance of ERC-20
64
+ */
65
+ function checkYourAllowanceOfProjectERC20(
66
+ uint256 _projectId
67
+ ) public view returns (uint256) {
68
+ uint256 remaining = IERC20(
69
+ genArtCoreContract.projectIdToCurrencyAddress(_projectId)
70
+ ).allowance(msg.sender, address(this));
71
+ return remaining;
72
+ }
73
+
74
+ /**
75
+ * @notice Sets the mint limit of a single purchaser for project
76
+ * `_projectId` to `_limit`.
77
+ * @param _projectId Project ID to set the mint limit for.
78
+ * @param _limit Number of times a given address may mint the project's
79
+ * tokens.
80
+ */
81
+ function setProjectMintLimit(uint256 _projectId, uint8 _limit) public {
82
+ require(
83
+ genArtCoreContract.isWhitelisted(msg.sender),
84
+ "can only be set by admin"
85
+ );
86
+ projectMintLimit[_projectId] = _limit;
87
+ }
88
+
89
+ /**
90
+ * @notice Sets the maximum invocations of project `_projectId` based
91
+ * on the value currently defined in the core contract.
92
+ * @param _projectId Project ID to set the maximum invocations for.
93
+ * @dev also checks and may refresh projectMaxHasBeenInvoked for project
94
+ */
95
+ function setProjectMaxInvocations(uint256 _projectId) public {
96
+ require(
97
+ genArtCoreContract.isWhitelisted(msg.sender),
98
+ "can only be set by admin"
99
+ );
100
+ uint256 maxInvocations;
101
+ uint256 invocations;
102
+ (, , invocations, maxInvocations, , , , , ) = genArtCoreContract
103
+ .projectTokenInfo(_projectId);
104
+ projectMaxInvocations[_projectId] = maxInvocations;
105
+ if (invocations < maxInvocations) {
106
+ projectMaxHasBeenInvoked[_projectId] = false;
107
+ }
108
+ }
109
+
110
+ /**
111
+ * @notice Sets the owner address to `_ownerAddress`.
112
+ * @param _ownerAddress New owner address.
113
+ */
114
+ function setOwnerAddress(address payable _ownerAddress) public {
115
+ require(
116
+ genArtCoreContract.isWhitelisted(msg.sender),
117
+ "can only be set by admin"
118
+ );
119
+ ownerAddress = _ownerAddress;
120
+ }
121
+
122
+ /**
123
+ * @notice Sets the owner mint revenue to `_ownerPercentage` percent.
124
+ * @param _ownerPercentage New owner percentage.
125
+ */
126
+ function setOwnerPercentage(uint256 _ownerPercentage) public {
127
+ require(
128
+ genArtCoreContract.isWhitelisted(msg.sender),
129
+ "can only be set by admin"
130
+ );
131
+ ownerPercentage = _ownerPercentage;
132
+ }
133
+
134
+ /**
135
+ * @notice Toggles if contracts are allowed to mint tokens for
136
+ * project `_projectId`.
137
+ * @param _projectId Project ID to be toggled.
138
+ */
139
+ function toggleContractFilter(uint256 _projectId) public {
140
+ require(
141
+ genArtCoreContract.isWhitelisted(msg.sender),
142
+ "can only be set by admin"
143
+ );
144
+ contractFilterProject[_projectId] = !contractFilterProject[_projectId];
145
+ }
146
+
147
+ /**
148
+ * @notice Toggles if bonus contract for project `_projectId`.
149
+ * @param _projectId Project ID to be toggled.
150
+ */
151
+ function artistToggleBonus(uint256 _projectId) public {
152
+ require(
153
+ msg.sender ==
154
+ genArtCoreContract.projectIdToArtistAddress(_projectId),
155
+ "can only be set by artist"
156
+ );
157
+ projectIdToBonus[_projectId] = !projectIdToBonus[_projectId];
158
+ }
159
+
160
+ /**
161
+ * @notice Sets bonus contract for project `_projectId` to
162
+ * `_bonusContractAddress`.
163
+ * @param _projectId Project ID to be toggled.
164
+ * @param _bonusContractAddress Bonus contract.
165
+ */
166
+ function artistSetBonusContractAddress(
167
+ uint256 _projectId,
168
+ address _bonusContractAddress
169
+ ) public {
170
+ require(
171
+ msg.sender ==
172
+ genArtCoreContract.projectIdToArtistAddress(_projectId),
173
+ "can only be set by artist"
174
+ );
175
+ projectIdToBonusContractAddress[_projectId] = _bonusContractAddress;
176
+ }
177
+
178
+ /**
179
+ * @notice Purchases a token from project `_projectId`.
180
+ * @param _projectId Project ID to mint a token on.
181
+ * @return _tokenId Token ID of minted token
182
+ */
183
+ function purchase(
184
+ uint256 _projectId
185
+ ) public payable returns (uint256 _tokenId) {
186
+ return purchaseTo(msg.sender, _projectId);
187
+ }
188
+
189
+ /**
190
+ * @notice Purchases a token from project `_projectId` and sets
191
+ * the token's owner to `_to`.
192
+ * @param _to Address to be the new token's owner.
193
+ * @param _projectId Project ID to mint a token on.
194
+ * @return _tokenId Token ID of minted token
195
+ */
196
+ function purchaseTo(
197
+ address _to,
198
+ uint256 _projectId
199
+ ) public payable nonReentrant returns (uint256 _tokenId) {
200
+ // CHECKS
201
+ require(
202
+ !projectMaxHasBeenInvoked[_projectId],
203
+ "Maximum number of invocations reached"
204
+ );
205
+ // if contract filter is active prevent calls from another contract
206
+ if (contractFilterProject[_projectId]) {
207
+ require(msg.sender == tx.origin, "No Contract Buys");
208
+ }
209
+
210
+ // limit mints per address by project
211
+ if (projectMintLimit[_projectId] > 0) {
212
+ require(
213
+ projectMintCounter[msg.sender][_projectId] <
214
+ projectMintLimit[_projectId],
215
+ "Reached minting limit"
216
+ );
217
+ // EFFECTS
218
+ projectMintCounter[msg.sender][_projectId]++;
219
+ }
220
+
221
+ uint256 tokenId = genArtCoreContract.mint(_to, _projectId, msg.sender);
222
+
223
+ // What if this overflows, since default value of uint256 is 0?
224
+ // That is intended, so that by default the minter allows infinite
225
+ // transactions, allowing the `genArtCoreContract` to stop minting
226
+ // `uint256 tokenInvocation = tokenId % ONE_MILLION;`
227
+ if (
228
+ projectMaxInvocations[_projectId] > 0 &&
229
+ tokenId % ONE_MILLION == projectMaxInvocations[_projectId] - 1
230
+ ) {
231
+ projectMaxHasBeenInvoked[_projectId] = true;
232
+ }
233
+
234
+ // INTERACTIONS
235
+ // bonus contract
236
+ if (projectIdToBonus[_projectId]) {
237
+ require(
238
+ IBonusContract(projectIdToBonusContractAddress[_projectId])
239
+ .bonusIsActive(),
240
+ "bonus must be active"
241
+ );
242
+ IBonusContract(projectIdToBonusContractAddress[_projectId])
243
+ .triggerBonus(msg.sender);
244
+ }
245
+
246
+ // validate and split funds
247
+ if (
248
+ keccak256(
249
+ abi.encodePacked(
250
+ genArtCoreContract.projectIdToCurrencySymbol(_projectId)
251
+ )
252
+ ) != keccak256(abi.encodePacked("ETH"))
253
+ ) {
254
+ require(
255
+ msg.value == 0,
256
+ "this project accepts a different currency and cannot accept ETH"
257
+ );
258
+ require(
259
+ IERC20(
260
+ genArtCoreContract.projectIdToCurrencyAddress(_projectId)
261
+ ).allowance(msg.sender, address(this)) >=
262
+ genArtCoreContract.projectIdToPricePerTokenInWei(
263
+ _projectId
264
+ ),
265
+ "Insufficient Funds Approved for TX"
266
+ );
267
+ require(
268
+ IERC20(
269
+ genArtCoreContract.projectIdToCurrencyAddress(_projectId)
270
+ ).balanceOf(msg.sender) >=
271
+ genArtCoreContract.projectIdToPricePerTokenInWei(
272
+ _projectId
273
+ ),
274
+ "Insufficient balance."
275
+ );
276
+ _splitFundsERC20(_projectId);
277
+ } else {
278
+ require(
279
+ msg.value >=
280
+ genArtCoreContract.projectIdToPricePerTokenInWei(
281
+ _projectId
282
+ ),
283
+ "Must send minimum value to mint!"
284
+ );
285
+ _splitFundsETH(_projectId);
286
+ }
287
+
288
+ return tokenId;
289
+ }
290
+
291
+ /**
292
+ * @dev splits ETH funds between sender (if refund), foundation,
293
+ * artist, and artist's additional payee for a token purchased on
294
+ * project `_projectId`.
295
+ * @dev utilizes transfer() to send ETH, so access lists may need to be
296
+ * populated when purchasing tokens.
297
+ */
298
+ function _splitFundsETH(uint256 _projectId) internal {
299
+ if (msg.value > 0) {
300
+ uint256 pricePerTokenInWei = genArtCoreContract
301
+ .projectIdToPricePerTokenInWei(_projectId);
302
+ uint256 refund = msg.value -
303
+ genArtCoreContract.projectIdToPricePerTokenInWei(_projectId);
304
+ if (refund > 0) {
305
+ (bool success_, ) = msg.sender.call{value: refund}("");
306
+ require(success_, "Refund failed");
307
+ }
308
+ uint256 renderProviderAmount = (pricePerTokenInWei *
309
+ genArtCoreContract.renderProviderPercentage()) / 100;
310
+ if (renderProviderAmount > 0) {
311
+ (bool success_, ) = genArtCoreContract
312
+ .renderProviderAddress()
313
+ .call{value: renderProviderAmount}("");
314
+ require(success_, "Renderer payment failed");
315
+ }
316
+
317
+ uint256 remainingFunds = pricePerTokenInWei - renderProviderAmount;
318
+
319
+ uint256 ownerFunds = (remainingFunds * ownerPercentage) / 100;
320
+ if (ownerFunds > 0) {
321
+ (bool success_, ) = ownerAddress.call{value: ownerFunds}("");
322
+ require(success_, "Owner payment failed");
323
+ }
324
+
325
+ uint256 projectFunds = pricePerTokenInWei -
326
+ renderProviderAmount -
327
+ ownerFunds;
328
+ uint256 additionalPayeeAmount;
329
+ if (
330
+ genArtCoreContract.projectIdToAdditionalPayeePercentage(
331
+ _projectId
332
+ ) > 0
333
+ ) {
334
+ additionalPayeeAmount =
335
+ (projectFunds *
336
+ genArtCoreContract.projectIdToAdditionalPayeePercentage(
337
+ _projectId
338
+ )) /
339
+ 100;
340
+ if (additionalPayeeAmount > 0) {
341
+ (bool success_, ) = genArtCoreContract
342
+ .projectIdToAdditionalPayee(_projectId)
343
+ .call{value: additionalPayeeAmount}("");
344
+ require(success_, "Additional payment failed");
345
+ }
346
+ }
347
+ uint256 creatorFunds = projectFunds - additionalPayeeAmount;
348
+ if (creatorFunds > 0) {
349
+ (bool success_, ) = genArtCoreContract
350
+ .projectIdToArtistAddress(_projectId)
351
+ .call{value: creatorFunds}("");
352
+ require(success_, "Artist payment failed");
353
+ }
354
+ }
355
+ }
356
+
357
+ /**
358
+ * @dev splits ERC-20 funds between render provider, owner, artist, and
359
+ * artist's additional payee, for a token purchased on project
360
+ `_projectId`.
361
+ */
362
+ function _splitFundsERC20(uint256 _projectId) internal {
363
+ uint256 pricePerTokenInWei = genArtCoreContract
364
+ .projectIdToPricePerTokenInWei(_projectId);
365
+ uint256 renderProviderAmount = (pricePerTokenInWei *
366
+ genArtCoreContract.renderProviderPercentage()) / 100;
367
+ if (renderProviderAmount > 0) {
368
+ IERC20(genArtCoreContract.projectIdToCurrencyAddress(_projectId))
369
+ .transferFrom(
370
+ msg.sender,
371
+ genArtCoreContract.renderProviderAddress(),
372
+ renderProviderAmount
373
+ );
374
+ }
375
+ uint256 remainingFunds = pricePerTokenInWei - renderProviderAmount;
376
+
377
+ uint256 ownerFunds = (remainingFunds * ownerPercentage) / 100;
378
+ if (ownerFunds > 0) {
379
+ IERC20(genArtCoreContract.projectIdToCurrencyAddress(_projectId))
380
+ .transferFrom(msg.sender, ownerAddress, ownerFunds);
381
+ }
382
+
383
+ uint256 projectFunds = pricePerTokenInWei -
384
+ renderProviderAmount -
385
+ ownerFunds;
386
+ uint256 additionalPayeeAmount;
387
+ if (
388
+ genArtCoreContract.projectIdToAdditionalPayeePercentage(
389
+ _projectId
390
+ ) > 0
391
+ ) {
392
+ additionalPayeeAmount =
393
+ (projectFunds *
394
+ genArtCoreContract.projectIdToAdditionalPayeePercentage(
395
+ _projectId
396
+ )) /
397
+ 100;
398
+ if (additionalPayeeAmount > 0) {
399
+ IERC20(
400
+ genArtCoreContract.projectIdToCurrencyAddress(_projectId)
401
+ ).transferFrom(
402
+ msg.sender,
403
+ genArtCoreContract.projectIdToAdditionalPayee(
404
+ _projectId
405
+ ),
406
+ additionalPayeeAmount
407
+ );
408
+ }
409
+ }
410
+ uint256 creatorFunds = projectFunds - additionalPayeeAmount;
411
+ if (creatorFunds > 0) {
412
+ IERC20(genArtCoreContract.projectIdToCurrencyAddress(_projectId))
413
+ .transferFrom(
414
+ msg.sender,
415
+ genArtCoreContract.projectIdToArtistAddress(_projectId),
416
+ creatorFunds
417
+ );
418
+ }
419
+ }
420
+ }
@@ -0,0 +1,72 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ pragma solidity 0.8.17;
4
+
5
+ import "../interfaces/0.8.x/IEngineRegistryV0.sol";
6
+ import "@openzeppelin-4.7/contracts/utils/introspection/ERC165.sol";
7
+
8
+ /**
9
+ * @title Engine Registry contract, V0.
10
+ * @author Art Blocks Inc.
11
+ * @notice Privileged Roles and Ownership:
12
+ * This contract intentionally has no owners or admins, and is intended
13
+ * to be deployed with a permissioned `deployerAddress` that may speak
14
+ * to this registry. If in the future multiple deployer addresses are
15
+ * needed to interact with this registry, a new registry version with
16
+ * more complex logic should be implemented and deployed to replace this.
17
+ */
18
+ contract EngineRegistryV0 is IEngineRegistryV0, ERC165 {
19
+ /// configuration variable (determined at time of deployment)
20
+ /// that determines what address may perform registration actions.
21
+ address internal immutable deployerAddress;
22
+
23
+ /// internal mapping for managing known list of registered contracts.
24
+ mapping(address => bool) internal registeredContractAddresses;
25
+
26
+ constructor() {
27
+ // The deployer of the registry becomes the permissioned deployer for speaking to the registry.
28
+ deployerAddress = tx.origin;
29
+ }
30
+
31
+ /**
32
+ * @inheritdoc IEngineRegistryV0
33
+ */
34
+ function registerContract(
35
+ address _contractAddress,
36
+ bytes32 _coreVersion,
37
+ bytes32 _coreType
38
+ ) external {
39
+ // CHECKS
40
+ // Validate against `tx.origin` rather than `msg.sender` as it is intended that this registration be
41
+ // performed in an automated fashion *at the time* of contract deployment for the `_contractAddress`.
42
+ require(
43
+ tx.origin == deployerAddress,
44
+ "Only allowed deployer-address TX origin"
45
+ );
46
+
47
+ // EFFECTS
48
+ emit ContractRegistered(_contractAddress, _coreVersion, _coreType);
49
+ registeredContractAddresses[_contractAddress] = true;
50
+ }
51
+
52
+ /**
53
+ * @inheritdoc IEngineRegistryV0
54
+ */
55
+ function unregisterContract(address _contractAddress) external {
56
+ // CHECKS
57
+ // Validate against `tx.origin` rather than `msg.sender` for consistency with the above approach,
58
+ // as we expect in usage of this contract `msg.sender == tx.origin` to be a true assessment.
59
+ require(
60
+ tx.origin == deployerAddress,
61
+ "Only allowed deployer-address TX origin"
62
+ );
63
+ require(
64
+ registeredContractAddresses[_contractAddress],
65
+ "Only unregister already registered contracts"
66
+ );
67
+
68
+ // EFFECTS
69
+ emit ContractUnregistered(_contractAddress);
70
+ registeredContractAddresses[_contractAddress] = false;
71
+ }
72
+ }
@@ -0,0 +1,86 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ pragma solidity 0.8.17;
4
+
5
+ import "../../interfaces/0.8.x/IEngineRegistryV0.sol";
6
+ import "@openzeppelin-4.7/contracts/utils/introspection/ERC165.sol";
7
+
8
+ /**
9
+ * @title Engine Registry contract, V1.
10
+ * @author Art Blocks Inc.
11
+ * @notice Privileged Roles and Ownership:
12
+ * This contract intentionally has no owners or admins, and is intended
13
+ * to be deployed with a permissioned `deployerAddress` that may speak
14
+ * to this registry. If in the future multiple deployer addresses are
15
+ * needed to interact with this registry, a new registry version with
16
+ * more complex logic should be implemented and deployed to replace this.
17
+ * @dev TODO This contract contains only minor security improvements relative
18
+ * to the V0 version, and is intended to only be deployed in the future if an
19
+ * upgrade to the registry is needed. The V0 version should be considered the
20
+ * canonical version of the registry while this future version is not yet
21
+ * deployed.
22
+ */
23
+ contract EngineRegistryV1 is IEngineRegistryV0, ERC165 {
24
+ /// configuration variable (determined at time of deployment)
25
+ /// that determines what address may perform registration actions.
26
+ address internal immutable deployerAddress;
27
+
28
+ /// internal mapping for managing known list of registered contracts.
29
+ mapping(address => bool) internal registeredContractAddresses;
30
+
31
+ constructor() {
32
+ // The deployer of the registry becomes the permissioned deployer for speaking to the registry.
33
+ deployerAddress = tx.origin;
34
+ }
35
+
36
+ /**
37
+ * @inheritdoc IEngineRegistryV0
38
+ */
39
+ function registerContract(
40
+ address _contractAddress,
41
+ bytes32 _coreVersion,
42
+ bytes32 _coreType
43
+ ) external {
44
+ // CHECKS
45
+ // Validate against `tx.origin` rather than `msg.sender` as it is intended that this registration be
46
+ // performed in an automated fashion *at the time* of contract deployment for the `_contractAddress`.
47
+ require(
48
+ tx.origin == deployerAddress,
49
+ "Only allowed deployer-address TX origin"
50
+ );
51
+ // Prevent registration of a contract by an unrelated contract
52
+ require(
53
+ msg.sender == _contractAddress || msg.sender == deployerAddress,
54
+ "Only call by deployerAddress or _contractAddress"
55
+ );
56
+ // EFFECTS
57
+ registeredContractAddresses[_contractAddress] = true;
58
+ emit ContractRegistered(_contractAddress, _coreVersion, _coreType);
59
+ }
60
+
61
+ /**
62
+ * @inheritdoc IEngineRegistryV0
63
+ */
64
+ function unregisterContract(address _contractAddress) external {
65
+ // CHECKS
66
+ // Validate against `tx.origin` rather than `msg.sender` for consistency with the above approach,
67
+ // as we expect in usage of this contract `msg.sender == tx.origin` to be a true assessment.
68
+ require(
69
+ tx.origin == deployerAddress,
70
+ "Only allowed deployer-address TX origin"
71
+ );
72
+ // Prevent unregistration of a contract by an unrelated contract
73
+ require(
74
+ msg.sender == _contractAddress || msg.sender == deployerAddress,
75
+ "Only call by deployerAddress or _contractAddress"
76
+ );
77
+ require(
78
+ registeredContractAddresses[_contractAddress],
79
+ "Only unregister already registered contracts"
80
+ );
81
+
82
+ // EFFECTS
83
+ registeredContractAddresses[_contractAddress] = false;
84
+ emit ContractUnregistered(_contractAddress);
85
+ }
86
+ }