@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,467 @@
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. Has ability to burn configured ERC-20
16
+ * tokens during purchase events to avoid re-use of tokens.
17
+ * @author Art Blocks Inc.
18
+ */
19
+ contract GenArt721MinterBurner_PBAB is ReentrancyGuard {
20
+ /**
21
+ * @notice ERC-20 tokens at address `_ERC20Address` will be burned during
22
+ * purchases if `_doBurnDuringPurchase` is true, otherwise they will be
23
+ * distributed to the artist, additional payee, platform, and render
24
+ * provider.
25
+ */
26
+ event BurnERC20DuringPurchaseSet(
27
+ address indexed _ERC20Address,
28
+ bool _doBurnDuringPurchase
29
+ );
30
+
31
+ /// PBAB core contract this minter may interact with.
32
+ IGenArt721CoreV2_PBAB public genArtCoreContract;
33
+
34
+ uint256 constant ONE_MILLION = 1_000_000;
35
+
36
+ address payable public ownerAddress;
37
+ uint256 public ownerPercentage;
38
+
39
+ mapping(uint256 => bool) public projectIdToBonus;
40
+ mapping(uint256 => address) public projectIdToBonusContractAddress;
41
+ mapping(uint256 => bool) public contractFilterProject;
42
+ mapping(address => mapping(uint256 => uint256)) public projectMintCounter;
43
+ mapping(uint256 => uint256) public projectMintLimit;
44
+ mapping(uint256 => bool) public projectMaxHasBeenInvoked;
45
+ mapping(uint256 => uint256) public projectMaxInvocations;
46
+
47
+ /// ERC20 address => burn during purchase
48
+ mapping(address => bool) public burnERC20DuringPurchase;
49
+ // don't rely on optional ERC20 burn() to burn tokens, send here instead
50
+ address internal constant ERC20_BURN_ADDRESS =
51
+ 0x000000000000000000000000000000000000dEaD;
52
+
53
+ /**
54
+ * @notice Initializes contract to be a Minter for PBAB core contract at
55
+ * address `_genArt721Address`.
56
+ */
57
+ constructor(address _genArt721Address) ReentrancyGuard() {
58
+ genArtCoreContract = IGenArt721CoreV2_PBAB(_genArt721Address);
59
+ }
60
+
61
+ /**
62
+ * @notice Gets your balance of the ERC-20 token currently set
63
+ * as the payment currency for project `_projectId`.
64
+ * @param _projectId Project ID to be queried.
65
+ * @return balance Balance of ERC-20
66
+ */
67
+ function getYourBalanceOfProjectERC20(
68
+ uint256 _projectId
69
+ ) public view returns (uint256) {
70
+ uint256 balance = IERC20(
71
+ genArtCoreContract.projectIdToCurrencyAddress(_projectId)
72
+ ).balanceOf(msg.sender);
73
+ return balance;
74
+ }
75
+
76
+ /**
77
+ * @notice Gets your allowance for this minter of the ERC-20
78
+ * token currently set as the payment currency for project
79
+ * `_projectId`.
80
+ * @param _projectId Project ID to be queried.
81
+ * @return remaining Remaining allowance of ERC-20
82
+ */
83
+ function checkYourAllowanceOfProjectERC20(
84
+ uint256 _projectId
85
+ ) public view returns (uint256) {
86
+ uint256 remaining = IERC20(
87
+ genArtCoreContract.projectIdToCurrencyAddress(_projectId)
88
+ ).allowance(msg.sender, address(this));
89
+ return remaining;
90
+ }
91
+
92
+ /**
93
+ * @notice Sets the mint limit of a single purchaser for project
94
+ * `_projectId` to `_limit`.
95
+ * @param _projectId Project ID to set the mint limit for.
96
+ * @param _limit Number of times a given address may mint the project's
97
+ * tokens.
98
+ */
99
+ function setProjectMintLimit(uint256 _projectId, uint8 _limit) public {
100
+ require(
101
+ genArtCoreContract.isWhitelisted(msg.sender),
102
+ "can only be set by admin"
103
+ );
104
+ projectMintLimit[_projectId] = _limit;
105
+ }
106
+
107
+ /**
108
+ * @notice Configures the minter to either burn or distribute ERC-20 tokens
109
+ * during purchases. Default behavior is to not burn tokens.
110
+ * @param _ERC20Address Contract address of the ERC-20 token used to
111
+ * purchase.
112
+ * @param _doBurnDuringPurchase Burn the tokens during purchase if true,
113
+ * distribute to artist, additional payee, platform, and render provider
114
+ * if false.
115
+ */
116
+ function setBurnERC20DuringPurchase(
117
+ address _ERC20Address,
118
+ bool _doBurnDuringPurchase
119
+ ) public {
120
+ require(
121
+ genArtCoreContract.isWhitelisted(msg.sender),
122
+ "can only be set by admin"
123
+ );
124
+ burnERC20DuringPurchase[_ERC20Address] = _doBurnDuringPurchase;
125
+ emit BurnERC20DuringPurchaseSet(_ERC20Address, _doBurnDuringPurchase);
126
+ }
127
+
128
+ /**
129
+ * @notice Sets the maximum invocations of project `_projectId` based
130
+ * on the value currently defined in the core contract.
131
+ * @param _projectId Project ID to set the maximum invocations for.
132
+ * @dev also checks and may refresh projectMaxHasBeenInvoked for project
133
+ */
134
+ function setProjectMaxInvocations(uint256 _projectId) public {
135
+ require(
136
+ genArtCoreContract.isWhitelisted(msg.sender),
137
+ "can only be set by admin"
138
+ );
139
+ uint256 maxInvocations;
140
+ uint256 invocations;
141
+ (, , invocations, maxInvocations, , , , , ) = genArtCoreContract
142
+ .projectTokenInfo(_projectId);
143
+ projectMaxInvocations[_projectId] = maxInvocations;
144
+ if (invocations < maxInvocations) {
145
+ projectMaxHasBeenInvoked[_projectId] = false;
146
+ }
147
+ }
148
+
149
+ /**
150
+ * @notice Sets the owner address to `_ownerAddress`.
151
+ * @param _ownerAddress New owner address.
152
+ */
153
+ function setOwnerAddress(address payable _ownerAddress) public {
154
+ require(
155
+ genArtCoreContract.isWhitelisted(msg.sender),
156
+ "can only be set by admin"
157
+ );
158
+ ownerAddress = _ownerAddress;
159
+ }
160
+
161
+ /**
162
+ * @notice Sets the owner mint revenue to `_ownerPercentage` percent.
163
+ * @param _ownerPercentage New owner percentage.
164
+ */
165
+ function setOwnerPercentage(uint256 _ownerPercentage) public {
166
+ require(
167
+ genArtCoreContract.isWhitelisted(msg.sender),
168
+ "can only be set by admin"
169
+ );
170
+ ownerPercentage = _ownerPercentage;
171
+ }
172
+
173
+ /**
174
+ * @notice Toggles if contracts are allowed to mint tokens for
175
+ * project `_projectId`.
176
+ * @param _projectId Project ID to be toggled.
177
+ */
178
+ function toggleContractFilter(uint256 _projectId) public {
179
+ require(
180
+ genArtCoreContract.isWhitelisted(msg.sender),
181
+ "can only be set by admin"
182
+ );
183
+ contractFilterProject[_projectId] = !contractFilterProject[_projectId];
184
+ }
185
+
186
+ /**
187
+ * @notice Toggles if bonus contract for project `_projectId`.
188
+ * @param _projectId Project ID to be toggled.
189
+ */
190
+ function artistToggleBonus(uint256 _projectId) public {
191
+ require(
192
+ msg.sender ==
193
+ genArtCoreContract.projectIdToArtistAddress(_projectId),
194
+ "can only be set by artist"
195
+ );
196
+ projectIdToBonus[_projectId] = !projectIdToBonus[_projectId];
197
+ }
198
+
199
+ /**
200
+ * @notice Sets bonus contract for project `_projectId` to
201
+ * `_bonusContractAddress`.
202
+ * @param _projectId Project ID to be toggled.
203
+ * @param _bonusContractAddress Bonus contract.
204
+ */
205
+ function artistSetBonusContractAddress(
206
+ uint256 _projectId,
207
+ address _bonusContractAddress
208
+ ) public {
209
+ require(
210
+ msg.sender ==
211
+ genArtCoreContract.projectIdToArtistAddress(_projectId),
212
+ "can only be set by artist"
213
+ );
214
+ projectIdToBonusContractAddress[_projectId] = _bonusContractAddress;
215
+ }
216
+
217
+ /**
218
+ * @notice Purchases a token from project `_projectId`.
219
+ * @param _projectId Project ID to mint a token on.
220
+ * @return _tokenId Token ID of minted token
221
+ */
222
+ function purchase(
223
+ uint256 _projectId
224
+ ) public payable returns (uint256 _tokenId) {
225
+ return purchaseTo(msg.sender, _projectId);
226
+ }
227
+
228
+ /**
229
+ * @notice Purchases a token from project `_projectId` and sets
230
+ * the token's owner to `_to`.
231
+ * @param _to Address to be the new token's owner.
232
+ * @param _projectId Project ID to mint a token on.
233
+ * @return _tokenId Token ID of minted token
234
+ */
235
+ function purchaseTo(
236
+ address _to,
237
+ uint256 _projectId
238
+ ) public payable nonReentrant returns (uint256 _tokenId) {
239
+ // CHECKS
240
+ require(
241
+ !projectMaxHasBeenInvoked[_projectId],
242
+ "Maximum number of invocations reached"
243
+ );
244
+ // if contract filter is active prevent calls from another contract
245
+ if (contractFilterProject[_projectId]) {
246
+ require(msg.sender == tx.origin, "No Contract Buys");
247
+ }
248
+
249
+ // limit mints per address by project
250
+ if (projectMintLimit[_projectId] > 0) {
251
+ require(
252
+ projectMintCounter[msg.sender][_projectId] <
253
+ projectMintLimit[_projectId],
254
+ "Reached minting limit"
255
+ );
256
+ // EFFECTS
257
+ projectMintCounter[msg.sender][_projectId]++;
258
+ }
259
+
260
+ uint256 tokenId = genArtCoreContract.mint(_to, _projectId, msg.sender);
261
+
262
+ // What if this overflows, since default value of uint256 is 0?
263
+ // That is intended, so that by default the minter allows infinite
264
+ // transactions, allowing the `genArtCoreContract` to stop minting
265
+ // `uint256 tokenInvocation = tokenId % ONE_MILLION;`
266
+ if (
267
+ projectMaxInvocations[_projectId] > 0 &&
268
+ tokenId % ONE_MILLION == projectMaxInvocations[_projectId] - 1
269
+ ) {
270
+ projectMaxHasBeenInvoked[_projectId] = true;
271
+ }
272
+
273
+ // INTERACTIONS
274
+ // bonus contract
275
+ if (projectIdToBonus[_projectId]) {
276
+ require(
277
+ IBonusContract(projectIdToBonusContractAddress[_projectId])
278
+ .bonusIsActive(),
279
+ "bonus must be active"
280
+ );
281
+ IBonusContract(projectIdToBonusContractAddress[_projectId])
282
+ .triggerBonus(msg.sender);
283
+ }
284
+
285
+ // validate and split funds
286
+ if (
287
+ keccak256(
288
+ abi.encodePacked(
289
+ genArtCoreContract.projectIdToCurrencySymbol(_projectId)
290
+ )
291
+ ) != keccak256(abi.encodePacked("ETH"))
292
+ ) {
293
+ require(
294
+ msg.value == 0,
295
+ "this project accepts a different currency and cannot accept ETH"
296
+ );
297
+ require(
298
+ IERC20(
299
+ genArtCoreContract.projectIdToCurrencyAddress(_projectId)
300
+ ).allowance(msg.sender, address(this)) >=
301
+ genArtCoreContract.projectIdToPricePerTokenInWei(
302
+ _projectId
303
+ ),
304
+ "Insufficient Funds Approved for TX"
305
+ );
306
+ require(
307
+ IERC20(
308
+ genArtCoreContract.projectIdToCurrencyAddress(_projectId)
309
+ ).balanceOf(msg.sender) >=
310
+ genArtCoreContract.projectIdToPricePerTokenInWei(
311
+ _projectId
312
+ ),
313
+ "Insufficient balance."
314
+ );
315
+ _splitFundsERC20(_projectId);
316
+ } else {
317
+ require(
318
+ msg.value >=
319
+ genArtCoreContract.projectIdToPricePerTokenInWei(
320
+ _projectId
321
+ ),
322
+ "Must send minimum value to mint!"
323
+ );
324
+ _splitFundsETH(_projectId);
325
+ }
326
+
327
+ return tokenId;
328
+ }
329
+
330
+ /**
331
+ * @dev splits ETH funds between sender (if refund), foundation,
332
+ * artist, and artist's additional payee for a token purchased on
333
+ * project `_projectId`.
334
+ * @dev utilizes transfer() to send ETH, so access lists may need to be
335
+ * populated when purchasing tokens.
336
+ */
337
+ function _splitFundsETH(uint256 _projectId) internal {
338
+ if (msg.value > 0) {
339
+ uint256 pricePerTokenInWei = genArtCoreContract
340
+ .projectIdToPricePerTokenInWei(_projectId);
341
+ uint256 refund = msg.value -
342
+ genArtCoreContract.projectIdToPricePerTokenInWei(_projectId);
343
+ if (refund > 0) {
344
+ (bool success_, ) = msg.sender.call{value: refund}("");
345
+ require(success_, "Refund failed");
346
+ }
347
+ uint256 renderProviderAmount = (pricePerTokenInWei *
348
+ genArtCoreContract.renderProviderPercentage()) / 100;
349
+ if (renderProviderAmount > 0) {
350
+ (bool success_, ) = genArtCoreContract
351
+ .renderProviderAddress()
352
+ .call{value: renderProviderAmount}("");
353
+ require(success_, "Renderer payment failed");
354
+ }
355
+
356
+ uint256 remainingFunds = pricePerTokenInWei - renderProviderAmount;
357
+
358
+ uint256 ownerFunds = (remainingFunds * ownerPercentage) / 100;
359
+ if (ownerFunds > 0) {
360
+ (bool success_, ) = ownerAddress.call{value: ownerFunds}("");
361
+ require(success_, "Owner payment failed");
362
+ }
363
+
364
+ uint256 projectFunds = pricePerTokenInWei -
365
+ renderProviderAmount -
366
+ ownerFunds;
367
+ uint256 additionalPayeeAmount;
368
+ if (
369
+ genArtCoreContract.projectIdToAdditionalPayeePercentage(
370
+ _projectId
371
+ ) > 0
372
+ ) {
373
+ additionalPayeeAmount =
374
+ (projectFunds *
375
+ genArtCoreContract.projectIdToAdditionalPayeePercentage(
376
+ _projectId
377
+ )) /
378
+ 100;
379
+ if (additionalPayeeAmount > 0) {
380
+ (bool success_, ) = genArtCoreContract
381
+ .projectIdToAdditionalPayee(_projectId)
382
+ .call{value: additionalPayeeAmount}("");
383
+ require(success_, "Additional payment failed");
384
+ }
385
+ }
386
+ uint256 creatorFunds = projectFunds - additionalPayeeAmount;
387
+ if (creatorFunds > 0) {
388
+ (bool success_, ) = genArtCoreContract
389
+ .projectIdToArtistAddress(_projectId)
390
+ .call{value: creatorFunds}("");
391
+ require(success_, "Artist payment failed");
392
+ }
393
+ }
394
+ }
395
+
396
+ /**
397
+ * @dev splits ERC-20 funds between render provider, owner, artist, and
398
+ * artist's additional payee, for a token purchased on project
399
+ `_projectId`.
400
+ */
401
+ function _splitFundsERC20(uint256 _projectId) internal {
402
+ uint256 pricePerTokenInWei = genArtCoreContract
403
+ .projectIdToPricePerTokenInWei(_projectId);
404
+ address _tokenAddress = genArtCoreContract.projectIdToCurrencyAddress(
405
+ _projectId
406
+ );
407
+ if (burnERC20DuringPurchase[_tokenAddress]) {
408
+ IERC20(_tokenAddress).transferFrom(
409
+ msg.sender,
410
+ ERC20_BURN_ADDRESS,
411
+ pricePerTokenInWei
412
+ );
413
+ return;
414
+ }
415
+ uint256 renderProviderAmount = (pricePerTokenInWei *
416
+ genArtCoreContract.renderProviderPercentage()) / 100;
417
+ if (renderProviderAmount > 0) {
418
+ IERC20(_tokenAddress).transferFrom(
419
+ msg.sender,
420
+ genArtCoreContract.renderProviderAddress(),
421
+ renderProviderAmount
422
+ );
423
+ }
424
+ uint256 remainingFunds = pricePerTokenInWei - renderProviderAmount;
425
+
426
+ uint256 ownerFunds = (remainingFunds * ownerPercentage) / 100;
427
+ if (ownerFunds > 0) {
428
+ IERC20(_tokenAddress).transferFrom(
429
+ msg.sender,
430
+ ownerAddress,
431
+ ownerFunds
432
+ );
433
+ }
434
+
435
+ uint256 projectFunds = pricePerTokenInWei -
436
+ renderProviderAmount -
437
+ ownerFunds;
438
+ uint256 additionalPayeeAmount;
439
+ if (
440
+ genArtCoreContract.projectIdToAdditionalPayeePercentage(
441
+ _projectId
442
+ ) > 0
443
+ ) {
444
+ additionalPayeeAmount =
445
+ (projectFunds *
446
+ genArtCoreContract.projectIdToAdditionalPayeePercentage(
447
+ _projectId
448
+ )) /
449
+ 100;
450
+ if (additionalPayeeAmount > 0) {
451
+ IERC20(_tokenAddress).transferFrom(
452
+ msg.sender,
453
+ genArtCoreContract.projectIdToAdditionalPayee(_projectId),
454
+ additionalPayeeAmount
455
+ );
456
+ }
457
+ }
458
+ uint256 creatorFunds = projectFunds - additionalPayeeAmount;
459
+ if (creatorFunds > 0) {
460
+ IERC20(_tokenAddress).transferFrom(
461
+ msg.sender,
462
+ genArtCoreContract.projectIdToArtistAddress(_projectId),
463
+ creatorFunds
464
+ );
465
+ }
466
+ }
467
+ }