@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,695 @@
1
+ // SPDX-License-Identifier: LGPL-3.0-only
2
+ // Created By: Art Blocks Inc.
3
+
4
+ import "../interfaces/0.8.x/IRandomizer.sol";
5
+ import "../interfaces/0.8.x/IGenArt721CoreV2_PBAB.sol";
6
+
7
+ import "@openzeppelin-4.5/contracts/utils/Strings.sol";
8
+
9
+ import "@openzeppelin-4.5/contracts/token/ERC721/ERC721.sol";
10
+
11
+ pragma solidity 0.8.9;
12
+
13
+ /**
14
+ * @title Powered by Art Blocks ERC-721 core contract.
15
+ * @author Art Blocks Inc.
16
+ */
17
+ contract GenArt721CoreV2_PBAB is ERC721, IGenArt721CoreV2_PBAB {
18
+ /// randomizer contract
19
+ IRandomizer public randomizerContract;
20
+
21
+ struct Project {
22
+ string name;
23
+ string artist;
24
+ string description;
25
+ string website;
26
+ string license;
27
+ string projectBaseURI;
28
+ uint256 invocations;
29
+ uint256 maxInvocations;
30
+ string scriptJSON;
31
+ mapping(uint256 => string) scripts;
32
+ uint256 scriptCount;
33
+ string ipfsHash;
34
+ bool active;
35
+ bool locked;
36
+ bool paused;
37
+ }
38
+
39
+ uint256 constant ONE_MILLION = 1_000_000;
40
+ mapping(uint256 => Project) projects;
41
+
42
+ //All financial functions are stripped from struct for visibility
43
+ mapping(uint256 => address payable) public projectIdToArtistAddress;
44
+ mapping(uint256 => string) public projectIdToCurrencySymbol;
45
+ mapping(uint256 => address) public projectIdToCurrencyAddress;
46
+ mapping(uint256 => uint256) public projectIdToPricePerTokenInWei;
47
+ mapping(uint256 => address payable) public projectIdToAdditionalPayee;
48
+ mapping(uint256 => uint256) public projectIdToAdditionalPayeePercentage;
49
+ mapping(uint256 => uint256)
50
+ public projectIdToSecondaryMarketRoyaltyPercentage;
51
+
52
+ address payable public renderProviderAddress;
53
+ /// Percentage of mint revenue allocated to render provider
54
+ uint256 public renderProviderPercentage = 10;
55
+
56
+ mapping(uint256 => uint256) public tokenIdToProjectId;
57
+ mapping(uint256 => bytes32) public tokenIdToHash;
58
+ mapping(bytes32 => uint256) public hashToTokenId;
59
+
60
+ /// admin for contract
61
+ address public admin;
62
+ /// true if address is whitelisted
63
+ mapping(address => bool) public isWhitelisted;
64
+ /// true if minter is whitelisted
65
+ mapping(address => bool) public isMintWhitelisted;
66
+
67
+ /// next project ID to be created
68
+ uint256 public nextProjectId;
69
+
70
+ modifier onlyValidTokenId(uint256 _tokenId) {
71
+ require(_exists(_tokenId), "Token ID does not exist");
72
+ _;
73
+ }
74
+
75
+ modifier onlyUnlocked(uint256 _projectId) {
76
+ require(!projects[_projectId].locked, "Only if unlocked");
77
+ _;
78
+ }
79
+
80
+ modifier onlyArtist(uint256 _projectId) {
81
+ require(
82
+ msg.sender == projectIdToArtistAddress[_projectId],
83
+ "Only artist"
84
+ );
85
+ _;
86
+ }
87
+
88
+ modifier onlyAdmin() {
89
+ require(msg.sender == admin, "Only admin");
90
+ _;
91
+ }
92
+
93
+ modifier onlyWhitelisted() {
94
+ require(isWhitelisted[msg.sender], "Only whitelisted");
95
+ _;
96
+ }
97
+
98
+ modifier onlyArtistOrWhitelisted(uint256 _projectId) {
99
+ require(
100
+ isWhitelisted[msg.sender] ||
101
+ msg.sender == projectIdToArtistAddress[_projectId],
102
+ "Only artist or whitelisted"
103
+ );
104
+ _;
105
+ }
106
+
107
+ /**
108
+ * @notice Initializes contract.
109
+ * @param _tokenName Name of token.
110
+ * @param _tokenSymbol Token symbol.
111
+ * @param _randomizerContract Randomizer contract.
112
+ * @param _startingProjectId The initial next project ID.
113
+ * @dev _startingProjectId should be set to a value much, much less than
114
+ * max(uint256) to avoid overflow when adding to it.
115
+ */
116
+ constructor(
117
+ string memory _tokenName,
118
+ string memory _tokenSymbol,
119
+ address _randomizerContract,
120
+ uint256 _startingProjectId
121
+ ) ERC721(_tokenName, _tokenSymbol) {
122
+ admin = msg.sender;
123
+ isWhitelisted[msg.sender] = true;
124
+ renderProviderAddress = payable(msg.sender);
125
+ randomizerContract = IRandomizer(_randomizerContract);
126
+ // initialize next project ID
127
+ nextProjectId = _startingProjectId;
128
+ }
129
+
130
+ /**
131
+ * @notice Mints a token from project `_projectId` and sets the
132
+ * token's owner to `_to`.
133
+ * @param _to Address to be the minted token's owner.
134
+ * @param _projectId Project ID to mint a token on.
135
+ * @param _by Purchaser of minted token.
136
+ * @dev sender must be a whitelisted minter
137
+ */
138
+ function mint(
139
+ address _to,
140
+ uint256 _projectId,
141
+ address _by
142
+ ) external returns (uint256 _tokenId) {
143
+ require(
144
+ isMintWhitelisted[msg.sender],
145
+ "Must mint from whitelisted minter contract."
146
+ );
147
+ require(
148
+ projects[_projectId].invocations + 1 <=
149
+ projects[_projectId].maxInvocations,
150
+ "Must not exceed max invocations"
151
+ );
152
+ require(
153
+ projects[_projectId].active ||
154
+ _by == projectIdToArtistAddress[_projectId],
155
+ "Project must exist and be active"
156
+ );
157
+ require(
158
+ !projects[_projectId].paused ||
159
+ _by == projectIdToArtistAddress[_projectId],
160
+ "Purchases are paused."
161
+ );
162
+
163
+ uint256 tokenId = _mintToken(_to, _projectId);
164
+
165
+ return tokenId;
166
+ }
167
+
168
+ function _mintToken(
169
+ address _to,
170
+ uint256 _projectId
171
+ ) internal returns (uint256 _tokenId) {
172
+ uint256 tokenIdToBe = (_projectId * ONE_MILLION) +
173
+ projects[_projectId].invocations;
174
+
175
+ projects[_projectId].invocations = projects[_projectId].invocations + 1;
176
+
177
+ bytes32 hash = keccak256(
178
+ abi.encodePacked(
179
+ projects[_projectId].invocations,
180
+ block.number,
181
+ blockhash(block.number - 1),
182
+ randomizerContract.returnValue()
183
+ )
184
+ );
185
+ tokenIdToHash[tokenIdToBe] = hash;
186
+ hashToTokenId[hash] = tokenIdToBe;
187
+
188
+ _mint(_to, tokenIdToBe);
189
+
190
+ tokenIdToProjectId[tokenIdToBe] = _projectId;
191
+
192
+ emit Mint(_to, tokenIdToBe, _projectId);
193
+
194
+ return tokenIdToBe;
195
+ }
196
+
197
+ /**
198
+ * @notice Updates contract admin to `_adminAddress`.
199
+ */
200
+ function updateAdmin(address _adminAddress) public onlyAdmin {
201
+ admin = _adminAddress;
202
+ }
203
+
204
+ /**
205
+ * @notice Updates render provider address to `_renderProviderAddress`.
206
+ */
207
+ function updateRenderProviderAddress(
208
+ address payable _renderProviderAddress
209
+ ) public onlyAdmin {
210
+ renderProviderAddress = _renderProviderAddress;
211
+ }
212
+
213
+ /**
214
+ * @notice Updates render provider mint revenue percentage to
215
+ * `_renderProviderPercentage`.
216
+ */
217
+ function updateRenderProviderPercentage(
218
+ uint256 _renderProviderPercentage
219
+ ) public onlyAdmin {
220
+ require(_renderProviderPercentage <= 25, "Max of 25%");
221
+ renderProviderPercentage = _renderProviderPercentage;
222
+ }
223
+
224
+ /**
225
+ * @notice Whitelists `_address`.
226
+ */
227
+ function addWhitelisted(address _address) public onlyAdmin {
228
+ isWhitelisted[_address] = true;
229
+ }
230
+
231
+ /**
232
+ * @notice Revokes whitelisting of `_address`.
233
+ */
234
+ function removeWhitelisted(address _address) public onlyAdmin {
235
+ isWhitelisted[_address] = false;
236
+ }
237
+
238
+ /**
239
+ * @notice Whitelists minter `_address`.
240
+ */
241
+ function addMintWhitelisted(address _address) public onlyAdmin {
242
+ isMintWhitelisted[_address] = true;
243
+ }
244
+
245
+ /**
246
+ * @notice Revokes whitelisting of minter `_address`.
247
+ */
248
+ function removeMintWhitelisted(address _address) public onlyAdmin {
249
+ isMintWhitelisted[_address] = false;
250
+ }
251
+
252
+ /**
253
+ * @notice Updates randomizer to `_randomizerAddress`.
254
+ */
255
+ function updateRandomizerAddress(
256
+ address _randomizerAddress
257
+ ) public onlyWhitelisted {
258
+ randomizerContract = IRandomizer(_randomizerAddress);
259
+ }
260
+
261
+ /**
262
+ * @notice Locks project `_projectId`.
263
+ */
264
+ function toggleProjectIsLocked(
265
+ uint256 _projectId
266
+ ) public onlyWhitelisted onlyUnlocked(_projectId) {
267
+ projects[_projectId].locked = true;
268
+ }
269
+
270
+ /**
271
+ * @notice Toggles project `_projectId` as active/inactive.
272
+ */
273
+ function toggleProjectIsActive(uint256 _projectId) public onlyWhitelisted {
274
+ projects[_projectId].active = !projects[_projectId].active;
275
+ }
276
+
277
+ /**
278
+ * @notice Updates artist of project `_projectId` to `_artistAddress`.
279
+ */
280
+ function updateProjectArtistAddress(
281
+ uint256 _projectId,
282
+ address payable _artistAddress
283
+ ) public onlyArtistOrWhitelisted(_projectId) {
284
+ projectIdToArtistAddress[_projectId] = _artistAddress;
285
+ }
286
+
287
+ /**
288
+ * @notice Toggles paused state of project `_projectId`.
289
+ */
290
+ function toggleProjectIsPaused(
291
+ uint256 _projectId
292
+ ) public onlyArtist(_projectId) {
293
+ projects[_projectId].paused = !projects[_projectId].paused;
294
+ }
295
+
296
+ /**
297
+ * @notice Adds new project `_projectName` by `_artistAddress`.
298
+ * @param _projectName Project name.
299
+ * @param _artistAddress Artist's address.
300
+ * @param _pricePerTokenInWei Price to mint a token, in Wei.
301
+ */
302
+ function addProject(
303
+ string memory _projectName,
304
+ address payable _artistAddress,
305
+ uint256 _pricePerTokenInWei
306
+ ) public onlyWhitelisted {
307
+ uint256 projectId = nextProjectId;
308
+ projectIdToArtistAddress[projectId] = _artistAddress;
309
+ projects[projectId].name = _projectName;
310
+ projectIdToCurrencySymbol[projectId] = "ETH";
311
+ projectIdToPricePerTokenInWei[projectId] = _pricePerTokenInWei;
312
+ projects[projectId].paused = true;
313
+ projects[projectId].maxInvocations = ONE_MILLION;
314
+ nextProjectId = nextProjectId + 1;
315
+ }
316
+
317
+ /**
318
+ * @notice Updates payment currency of project `_projectId` to be
319
+ * `_currencySymbol`.
320
+ * @param _projectId Project ID to update.
321
+ * @param _currencySymbol Currency symbol.
322
+ * @param _currencyAddress Currency address.
323
+ */
324
+ function updateProjectCurrencyInfo(
325
+ uint256 _projectId,
326
+ string memory _currencySymbol,
327
+ address _currencyAddress
328
+ ) public onlyArtist(_projectId) {
329
+ projectIdToCurrencySymbol[_projectId] = _currencySymbol;
330
+ projectIdToCurrencyAddress[_projectId] = _currencyAddress;
331
+ }
332
+
333
+ /**
334
+ * @notice Updates price per token of project `_projectId` to be
335
+ * '_pricePerTokenInWei`, in Wei.
336
+ */
337
+ function updateProjectPricePerTokenInWei(
338
+ uint256 _projectId,
339
+ uint256 _pricePerTokenInWei
340
+ ) public onlyArtist(_projectId) {
341
+ projectIdToPricePerTokenInWei[_projectId] = _pricePerTokenInWei;
342
+ }
343
+
344
+ /**
345
+ * @notice Updates name of project `_projectId` to be `_projectName`.
346
+ */
347
+ function updateProjectName(
348
+ uint256 _projectId,
349
+ string memory _projectName
350
+ ) public onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) {
351
+ projects[_projectId].name = _projectName;
352
+ }
353
+
354
+ /**
355
+ * @notice Updates artist name for project `_projectId` to be
356
+ * `_projectArtistName`.
357
+ */
358
+ function updateProjectArtistName(
359
+ uint256 _projectId,
360
+ string memory _projectArtistName
361
+ ) public onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) {
362
+ projects[_projectId].artist = _projectArtistName;
363
+ }
364
+
365
+ /**
366
+ * @notice Updates additional payee for project `_projectId` to be
367
+ * `_additionalPayee`, receiving `_additionalPayeePercentage` percent
368
+ * of artist mint and royalty revenues.
369
+ */
370
+ function updateProjectAdditionalPayeeInfo(
371
+ uint256 _projectId,
372
+ address payable _additionalPayee,
373
+ uint256 _additionalPayeePercentage
374
+ ) public onlyArtist(_projectId) {
375
+ require(_additionalPayeePercentage <= 100, "Max of 100%");
376
+ projectIdToAdditionalPayee[_projectId] = _additionalPayee;
377
+ projectIdToAdditionalPayeePercentage[
378
+ _projectId
379
+ ] = _additionalPayeePercentage;
380
+ }
381
+
382
+ /**
383
+ * @notice Updates artist secondary market royalties for project
384
+ * `_projectId` to be `_secondMarketRoyalty` percent.
385
+ */
386
+ function updateProjectSecondaryMarketRoyaltyPercentage(
387
+ uint256 _projectId,
388
+ uint256 _secondMarketRoyalty
389
+ ) public onlyArtist(_projectId) {
390
+ require(_secondMarketRoyalty <= 100, "Max of 100%");
391
+ projectIdToSecondaryMarketRoyaltyPercentage[
392
+ _projectId
393
+ ] = _secondMarketRoyalty;
394
+ }
395
+
396
+ /**
397
+ * @notice Updates description of project `_projectId`.
398
+ */
399
+ function updateProjectDescription(
400
+ uint256 _projectId,
401
+ string memory _projectDescription
402
+ ) public onlyArtist(_projectId) {
403
+ projects[_projectId].description = _projectDescription;
404
+ }
405
+
406
+ /**
407
+ * @notice Updates website of project `_projectId` to be `_projectWebsite`.
408
+ */
409
+ function updateProjectWebsite(
410
+ uint256 _projectId,
411
+ string memory _projectWebsite
412
+ ) public onlyArtist(_projectId) {
413
+ projects[_projectId].website = _projectWebsite;
414
+ }
415
+
416
+ /**
417
+ * @notice Updates license for project `_projectId`.
418
+ */
419
+ function updateProjectLicense(
420
+ uint256 _projectId,
421
+ string memory _projectLicense
422
+ ) public onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) {
423
+ projects[_projectId].license = _projectLicense;
424
+ }
425
+
426
+ /**
427
+ * @notice Updates maximum invocations for project `_projectId` to
428
+ * `_maxInvocations`.
429
+ */
430
+ function updateProjectMaxInvocations(
431
+ uint256 _projectId,
432
+ uint256 _maxInvocations
433
+ ) public onlyArtist(_projectId) {
434
+ require(
435
+ (!projects[_projectId].locked ||
436
+ _maxInvocations < projects[_projectId].maxInvocations),
437
+ "Only if unlocked"
438
+ );
439
+ require(
440
+ _maxInvocations > projects[_projectId].invocations,
441
+ "You must set max invocations greater than current invocations"
442
+ );
443
+ require(_maxInvocations <= ONE_MILLION, "Cannot exceed 1000000");
444
+ projects[_projectId].maxInvocations = _maxInvocations;
445
+ }
446
+
447
+ /**
448
+ * @notice Adds a script to project `_projectId`.
449
+ * @param _projectId Project to be updated.
450
+ * @param _script Script to be added.
451
+ */
452
+ function addProjectScript(
453
+ uint256 _projectId,
454
+ string memory _script
455
+ ) public onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) {
456
+ projects[_projectId].scripts[
457
+ projects[_projectId].scriptCount
458
+ ] = _script;
459
+ projects[_projectId].scriptCount = projects[_projectId].scriptCount + 1;
460
+ }
461
+
462
+ /**
463
+ * @notice Updates script for project `_projectId` at script ID `_scriptId`.
464
+ * @param _projectId Project to be updated.
465
+ * @param _scriptId Script ID to be updated.
466
+ * @param _script Script to be added.
467
+ */
468
+ function updateProjectScript(
469
+ uint256 _projectId,
470
+ uint256 _scriptId,
471
+ string memory _script
472
+ ) public onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) {
473
+ require(
474
+ _scriptId < projects[_projectId].scriptCount,
475
+ "scriptId out of range"
476
+ );
477
+ projects[_projectId].scripts[_scriptId] = _script;
478
+ }
479
+
480
+ /**
481
+ * @notice Removes last script from project `_projectId`.
482
+ */
483
+ function removeProjectLastScript(
484
+ uint256 _projectId
485
+ ) public onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) {
486
+ require(
487
+ projects[_projectId].scriptCount > 0,
488
+ "there are no scripts to remove"
489
+ );
490
+ delete projects[_projectId].scripts[
491
+ projects[_projectId].scriptCount - 1
492
+ ];
493
+ projects[_projectId].scriptCount = projects[_projectId].scriptCount - 1;
494
+ }
495
+
496
+ /**
497
+ * @notice Updates script json for project `_projectId`.
498
+ */
499
+ function updateProjectScriptJSON(
500
+ uint256 _projectId,
501
+ string memory _projectScriptJSON
502
+ ) public onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) {
503
+ projects[_projectId].scriptJSON = _projectScriptJSON;
504
+ }
505
+
506
+ /**
507
+ * @notice Updates ipfs hash for project `_projectId`.
508
+ */
509
+ function updateProjectIpfsHash(
510
+ uint256 _projectId,
511
+ string memory _ipfsHash
512
+ ) public onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) {
513
+ projects[_projectId].ipfsHash = _ipfsHash;
514
+ }
515
+
516
+ /**
517
+ * @notice Updates base URI for project `_projectId` to `_newBaseURI`.
518
+ */
519
+ function updateProjectBaseURI(
520
+ uint256 _projectId,
521
+ string memory _newBaseURI
522
+ ) public onlyArtist(_projectId) {
523
+ projects[_projectId].projectBaseURI = _newBaseURI;
524
+ }
525
+
526
+ /**
527
+ * @notice Returns project details for project `_projectId`.
528
+ * @param _projectId Project to be queried.
529
+ * @return projectName Name of project
530
+ * @return artist Artist of project
531
+ * @return description Project description
532
+ * @return website Project website
533
+ * @return license Project license
534
+ */
535
+ function projectDetails(
536
+ uint256 _projectId
537
+ )
538
+ public
539
+ view
540
+ returns (
541
+ string memory projectName,
542
+ string memory artist,
543
+ string memory description,
544
+ string memory website,
545
+ string memory license
546
+ )
547
+ {
548
+ projectName = projects[_projectId].name;
549
+ artist = projects[_projectId].artist;
550
+ description = projects[_projectId].description;
551
+ website = projects[_projectId].website;
552
+ license = projects[_projectId].license;
553
+ }
554
+
555
+ /**
556
+ * @notice Returns project token information for project `_projectId`.
557
+ * @param _projectId Project to be queried.
558
+ * @return artistAddress Project Artist's address
559
+ * @return pricePerTokenInWei Price to mint a token, in Wei
560
+ * @return invocations Current number of invocations
561
+ * @return maxInvocations Maximum allowed invocations
562
+ * @return active Boolean representing if project is currently active
563
+ * @return additionalPayee Additional payee address
564
+ * @return additionalPayeePercentage Percentage of artist revenue
565
+ * to be sent to the additional payee's address
566
+ * @return currency Symbol of project's currency
567
+ * @return currencyAddress Address of project's currency
568
+ */
569
+ function projectTokenInfo(
570
+ uint256 _projectId
571
+ )
572
+ public
573
+ view
574
+ returns (
575
+ address artistAddress,
576
+ uint256 pricePerTokenInWei,
577
+ uint256 invocations,
578
+ uint256 maxInvocations,
579
+ bool active,
580
+ address additionalPayee,
581
+ uint256 additionalPayeePercentage,
582
+ string memory currency,
583
+ address currencyAddress
584
+ )
585
+ {
586
+ artistAddress = projectIdToArtistAddress[_projectId];
587
+ pricePerTokenInWei = projectIdToPricePerTokenInWei[_projectId];
588
+ invocations = projects[_projectId].invocations;
589
+ maxInvocations = projects[_projectId].maxInvocations;
590
+ active = projects[_projectId].active;
591
+ additionalPayee = projectIdToAdditionalPayee[_projectId];
592
+ additionalPayeePercentage = projectIdToAdditionalPayeePercentage[
593
+ _projectId
594
+ ];
595
+ currency = projectIdToCurrencySymbol[_projectId];
596
+ currencyAddress = projectIdToCurrencyAddress[_projectId];
597
+ }
598
+
599
+ /**
600
+ * @notice Returns script information for project `_projectId`.
601
+ * @param _projectId Project to be queried.
602
+ * @return scriptJSON Project's script json
603
+ * @return scriptCount Count of scripts for project
604
+ * @return ipfsHash IPFS hash for project
605
+ * @return locked Boolean representing if project is locked
606
+ * @return paused Boolean representing if project is paused
607
+ */
608
+ function projectScriptInfo(
609
+ uint256 _projectId
610
+ )
611
+ public
612
+ view
613
+ returns (
614
+ string memory scriptJSON,
615
+ uint256 scriptCount,
616
+ string memory ipfsHash,
617
+ bool locked,
618
+ bool paused
619
+ )
620
+ {
621
+ scriptJSON = projects[_projectId].scriptJSON;
622
+ scriptCount = projects[_projectId].scriptCount;
623
+ ipfsHash = projects[_projectId].ipfsHash;
624
+ locked = projects[_projectId].locked;
625
+ paused = projects[_projectId].paused;
626
+ }
627
+
628
+ /**
629
+ * @notice Returns script for project `_projectId` at script index `_index`.
630
+ */
631
+ function projectScriptByIndex(
632
+ uint256 _projectId,
633
+ uint256 _index
634
+ ) public view returns (string memory) {
635
+ return projects[_projectId].scripts[_index];
636
+ }
637
+
638
+ /**
639
+ * @notice Returns base URI for project `_projectId`.
640
+ */
641
+ function projectURIInfo(
642
+ uint256 _projectId
643
+ ) public view returns (string memory projectBaseURI) {
644
+ projectBaseURI = projects[_projectId].projectBaseURI;
645
+ }
646
+
647
+ /**
648
+ * @notice Gets royalty data for token ID `_tokenId`.
649
+ * @param _tokenId Token ID to be queried.
650
+ * @return artistAddress Artist's payment address
651
+ * @return additionalPayee Additional payee's payment address
652
+ * @return additionalPayeePercentage Percentage of artist revenue
653
+ * to be sent to the additional payee's address
654
+ * @return royaltyFeeByID Total royalty percentage to be sent to
655
+ * combination of artist and additional payee
656
+ */
657
+ function getRoyaltyData(
658
+ uint256 _tokenId
659
+ )
660
+ public
661
+ view
662
+ returns (
663
+ address artistAddress,
664
+ address additionalPayee,
665
+ uint256 additionalPayeePercentage,
666
+ uint256 royaltyFeeByID
667
+ )
668
+ {
669
+ artistAddress = projectIdToArtistAddress[tokenIdToProjectId[_tokenId]];
670
+ additionalPayee = projectIdToAdditionalPayee[
671
+ tokenIdToProjectId[_tokenId]
672
+ ];
673
+ additionalPayeePercentage = projectIdToAdditionalPayeePercentage[
674
+ tokenIdToProjectId[_tokenId]
675
+ ];
676
+ royaltyFeeByID = projectIdToSecondaryMarketRoyaltyPercentage[
677
+ tokenIdToProjectId[_tokenId]
678
+ ];
679
+ }
680
+
681
+ /**
682
+ * @notice Gets token URI for token ID `_tokenId`.
683
+ */
684
+ function tokenURI(
685
+ uint256 _tokenId
686
+ ) public view override onlyValidTokenId(_tokenId) returns (string memory) {
687
+ return
688
+ string(
689
+ abi.encodePacked(
690
+ projects[tokenIdToProjectId[_tokenId]].projectBaseURI,
691
+ Strings.toString(_tokenId)
692
+ )
693
+ );
694
+ }
695
+ }