@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,887 @@
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
+ import "@openzeppelin-4.5/contracts/utils/Strings.sol";
7
+ import "@openzeppelin-4.5/contracts/token/ERC721/ERC721.sol";
8
+
9
+ pragma solidity 0.8.9;
10
+
11
+ /**
12
+ * @title Art Blocks Engine ERC-721 core contract with FLEX integration.
13
+ * Allows for projects to specify external asset dependencies from either IPFS or ARWEAVE.
14
+ * @author Art Blocks Inc.
15
+ */
16
+ contract GenArt721CoreV2_ENGINE_FLEX is ERC721, IGenArt721CoreV2_PBAB {
17
+ /// randomizer contract
18
+ IRandomizer public randomizerContract;
19
+
20
+ /// version & type of this core contract
21
+ string public constant coreVersion = "v2.0.0";
22
+ string public constant coreType = "GenArt721CoreV2_ENGINE_FLEX";
23
+
24
+ struct Project {
25
+ string name;
26
+ string artist;
27
+ string description;
28
+ string website;
29
+ string license;
30
+ string projectBaseURI;
31
+ uint256 invocations;
32
+ uint256 maxInvocations;
33
+ string scriptJSON;
34
+ mapping(uint256 => string) scripts;
35
+ uint256 scriptCount;
36
+ string ipfsHash;
37
+ bool active;
38
+ bool locked;
39
+ bool paused;
40
+ bool externalAssetDependenciesLocked;
41
+ uint24 externalAssetDependencyCount;
42
+ mapping(uint256 => ExternalAssetDependency) externalAssetDependencies;
43
+ }
44
+
45
+ event ExternalAssetDependencyUpdated(
46
+ uint256 indexed _projectId,
47
+ uint256 indexed _index,
48
+ string _cid,
49
+ ExternalAssetDependencyType _dependencyType,
50
+ uint24 _externalAssetDependencyCount
51
+ );
52
+
53
+ event ExternalAssetDependencyRemoved(
54
+ uint256 indexed _projectId,
55
+ uint256 indexed _index
56
+ );
57
+
58
+ event GatewayUpdated(
59
+ ExternalAssetDependencyType indexed _dependencyType,
60
+ string _gatewayAddress
61
+ );
62
+
63
+ event ProjectExternalAssetDependenciesLocked(uint256 indexed _projectId);
64
+
65
+ enum ExternalAssetDependencyType {
66
+ IPFS,
67
+ ARWEAVE
68
+ }
69
+ struct ExternalAssetDependency {
70
+ string cid;
71
+ ExternalAssetDependencyType dependencyType;
72
+ }
73
+
74
+ string public preferredIPFSGateway;
75
+ string public preferredArweaveGateway;
76
+
77
+ uint256 constant ONE_MILLION = 1_000_000;
78
+ mapping(uint256 => Project) projects;
79
+
80
+ //All financial functions are stripped from struct for visibility
81
+ mapping(uint256 => address payable) public projectIdToArtistAddress;
82
+ mapping(uint256 => string) public projectIdToCurrencySymbol;
83
+ mapping(uint256 => address) public projectIdToCurrencyAddress;
84
+ mapping(uint256 => uint256) public projectIdToPricePerTokenInWei;
85
+ mapping(uint256 => address payable) public projectIdToAdditionalPayee;
86
+ mapping(uint256 => uint256) public projectIdToAdditionalPayeePercentage;
87
+ mapping(uint256 => uint256)
88
+ public projectIdToSecondaryMarketRoyaltyPercentage;
89
+
90
+ address payable public renderProviderAddress;
91
+ /// Percentage of mint revenue allocated to render provider
92
+ uint256 public renderProviderPercentage = 10;
93
+
94
+ mapping(uint256 => uint256) public tokenIdToProjectId;
95
+ mapping(uint256 => bytes32) public tokenIdToHash;
96
+ mapping(bytes32 => uint256) public hashToTokenId;
97
+
98
+ /// admin for contract
99
+ address public admin;
100
+ /// true if address is whitelisted
101
+ mapping(address => bool) public isWhitelisted;
102
+ /// true if minter is whitelisted
103
+ mapping(address => bool) public isMintWhitelisted;
104
+
105
+ /// next project ID to be created
106
+ uint256 public nextProjectId = 0;
107
+
108
+ modifier onlyValidTokenId(uint256 _tokenId) {
109
+ require(_exists(_tokenId), "Token ID does not exist");
110
+ _;
111
+ }
112
+
113
+ modifier onlyUnlockedProjectExternalAssetDependencies(uint256 _projectId) {
114
+ require(
115
+ !projects[_projectId].externalAssetDependenciesLocked,
116
+ "Project external asset dependencies are locked"
117
+ );
118
+ _;
119
+ }
120
+
121
+ modifier onlyUnlocked(uint256 _projectId) {
122
+ require(!projects[_projectId].locked, "Only if unlocked");
123
+ _;
124
+ }
125
+
126
+ modifier onlyArtist(uint256 _projectId) {
127
+ require(
128
+ msg.sender == projectIdToArtistAddress[_projectId],
129
+ "Only artist"
130
+ );
131
+ _;
132
+ }
133
+
134
+ modifier onlyAdmin() {
135
+ require(msg.sender == admin, "Only admin");
136
+ _;
137
+ }
138
+
139
+ modifier onlyWhitelisted() {
140
+ require(isWhitelisted[msg.sender], "Only whitelisted");
141
+ _;
142
+ }
143
+
144
+ modifier onlyArtistOrWhitelisted(uint256 _projectId) {
145
+ require(
146
+ isWhitelisted[msg.sender] ||
147
+ msg.sender == projectIdToArtistAddress[_projectId],
148
+ "Only artist or whitelisted"
149
+ );
150
+ _;
151
+ }
152
+
153
+ /**
154
+ * @notice Initializes contract.
155
+ * @param _tokenName Name of token.
156
+ * @param _tokenSymbol Token symbol.
157
+ * @param _randomizerContract Randomizer contract.
158
+ */
159
+ constructor(
160
+ string memory _tokenName,
161
+ string memory _tokenSymbol,
162
+ address _randomizerContract
163
+ ) ERC721(_tokenName, _tokenSymbol) {
164
+ admin = msg.sender;
165
+ isWhitelisted[msg.sender] = true;
166
+ renderProviderAddress = payable(msg.sender);
167
+ randomizerContract = IRandomizer(_randomizerContract);
168
+ }
169
+
170
+ /**
171
+ * @notice Mints a token from project `_projectId` and sets the
172
+ * token's owner to `_to`.
173
+ * @param _to Address to be the minted token's owner.
174
+ * @param _projectId Project ID to mint a token on.
175
+ * @param _by Purchaser of minted token.
176
+ * @dev sender must be a whitelisted minter
177
+ */
178
+ function mint(
179
+ address _to,
180
+ uint256 _projectId,
181
+ address _by
182
+ ) external returns (uint256 _tokenId) {
183
+ require(
184
+ isMintWhitelisted[msg.sender],
185
+ "Must mint from whitelisted minter contract."
186
+ );
187
+ require(
188
+ projects[_projectId].invocations + 1 <=
189
+ projects[_projectId].maxInvocations,
190
+ "Must not exceed max invocations"
191
+ );
192
+ require(
193
+ projects[_projectId].active ||
194
+ _by == projectIdToArtistAddress[_projectId],
195
+ "Project must exist and be active"
196
+ );
197
+ require(
198
+ !projects[_projectId].paused ||
199
+ _by == projectIdToArtistAddress[_projectId],
200
+ "Purchases are paused."
201
+ );
202
+
203
+ uint256 tokenId = _mintToken(_to, _projectId);
204
+
205
+ return tokenId;
206
+ }
207
+
208
+ function _mintToken(
209
+ address _to,
210
+ uint256 _projectId
211
+ ) internal returns (uint256 _tokenId) {
212
+ uint256 tokenIdToBe = (_projectId * ONE_MILLION) +
213
+ projects[_projectId].invocations;
214
+
215
+ projects[_projectId].invocations = projects[_projectId].invocations + 1;
216
+
217
+ bytes32 hash = keccak256(
218
+ abi.encodePacked(
219
+ projects[_projectId].invocations,
220
+ block.number,
221
+ blockhash(block.number - 1),
222
+ randomizerContract.returnValue()
223
+ )
224
+ );
225
+ tokenIdToHash[tokenIdToBe] = hash;
226
+ hashToTokenId[hash] = tokenIdToBe;
227
+
228
+ _mint(_to, tokenIdToBe);
229
+
230
+ tokenIdToProjectId[tokenIdToBe] = _projectId;
231
+
232
+ emit Mint(_to, tokenIdToBe, _projectId);
233
+
234
+ return tokenIdToBe;
235
+ }
236
+
237
+ /**
238
+ * @notice Updates preferredIPFSGateway to `_gateway`.
239
+ */
240
+ function updateIPFSGateway(
241
+ string calldata _gateway
242
+ ) public onlyWhitelisted {
243
+ preferredIPFSGateway = _gateway;
244
+ emit GatewayUpdated(ExternalAssetDependencyType.IPFS, _gateway);
245
+ }
246
+
247
+ /**
248
+ * @notice Updates preferredArweaveGateway to `_gateway`.
249
+ */
250
+ function updateArweaveGateway(
251
+ string calldata _gateway
252
+ ) public onlyWhitelisted {
253
+ preferredArweaveGateway = _gateway;
254
+ emit GatewayUpdated(ExternalAssetDependencyType.ARWEAVE, _gateway);
255
+ }
256
+
257
+ /**
258
+ * @notice Updates contract admin to `_adminAddress`.
259
+ */
260
+ function updateAdmin(address _adminAddress) public onlyAdmin {
261
+ admin = _adminAddress;
262
+ }
263
+
264
+ /**
265
+ * @notice Updates render provider address to `_renderProviderAddress`.
266
+ */
267
+ function updateRenderProviderAddress(
268
+ address payable _renderProviderAddress
269
+ ) public onlyAdmin {
270
+ renderProviderAddress = _renderProviderAddress;
271
+ }
272
+
273
+ /**
274
+ * @notice Updates render provider mint revenue percentage to
275
+ * `_renderProviderPercentage`.
276
+ */
277
+ function updateRenderProviderPercentage(
278
+ uint256 _renderProviderPercentage
279
+ ) public onlyAdmin {
280
+ require(_renderProviderPercentage <= 25, "Max of 25%");
281
+ renderProviderPercentage = _renderProviderPercentage;
282
+ }
283
+
284
+ /**
285
+ * @notice Whitelists `_address`.
286
+ */
287
+ function addWhitelisted(address _address) public onlyAdmin {
288
+ isWhitelisted[_address] = true;
289
+ }
290
+
291
+ /**
292
+ * @notice Revokes whitelisting of `_address`.
293
+ */
294
+ function removeWhitelisted(address _address) public onlyAdmin {
295
+ isWhitelisted[_address] = false;
296
+ }
297
+
298
+ /**
299
+ * @notice Whitelists minter `_address`.
300
+ */
301
+ function addMintWhitelisted(address _address) public onlyAdmin {
302
+ isMintWhitelisted[_address] = true;
303
+ }
304
+
305
+ /**
306
+ * @notice Revokes whitelisting of minter `_address`.
307
+ */
308
+ function removeMintWhitelisted(address _address) public onlyAdmin {
309
+ isMintWhitelisted[_address] = false;
310
+ }
311
+
312
+ /**
313
+ * @notice Updates randomizer to `_randomizerAddress`.
314
+ */
315
+ function updateRandomizerAddress(
316
+ address _randomizerAddress
317
+ ) public onlyWhitelisted {
318
+ randomizerContract = IRandomizer(_randomizerAddress);
319
+ }
320
+
321
+ /**
322
+ * @notice Locks project `_projectId`.
323
+ */
324
+ function toggleProjectIsLocked(
325
+ uint256 _projectId
326
+ ) public onlyWhitelisted onlyUnlocked(_projectId) {
327
+ projects[_projectId].locked = true;
328
+ }
329
+
330
+ /**
331
+ * @notice Locks external asset dependencies for project `_projectId`.
332
+ */
333
+ function lockProjectExternalAssetDependencies(
334
+ uint256 _projectId
335
+ )
336
+ external
337
+ onlyArtistOrWhitelisted(_projectId)
338
+ onlyUnlockedProjectExternalAssetDependencies(_projectId)
339
+ {
340
+ projects[_projectId].externalAssetDependenciesLocked = true;
341
+ emit ProjectExternalAssetDependenciesLocked(_projectId);
342
+ }
343
+
344
+ /**
345
+ * @notice Toggles project `_projectId` as active/inactive.
346
+ */
347
+ function toggleProjectIsActive(uint256 _projectId) public onlyWhitelisted {
348
+ projects[_projectId].active = !projects[_projectId].active;
349
+ }
350
+
351
+ /**
352
+ * @notice Updates artist of project `_projectId` to `_artistAddress`.
353
+ */
354
+ function updateProjectArtistAddress(
355
+ uint256 _projectId,
356
+ address payable _artistAddress
357
+ ) public onlyArtistOrWhitelisted(_projectId) {
358
+ projectIdToArtistAddress[_projectId] = _artistAddress;
359
+ }
360
+
361
+ /**
362
+ * @notice Toggles paused state of project `_projectId`.
363
+ */
364
+ function toggleProjectIsPaused(
365
+ uint256 _projectId
366
+ ) public onlyArtist(_projectId) {
367
+ projects[_projectId].paused = !projects[_projectId].paused;
368
+ }
369
+
370
+ /**
371
+ * @notice Adds new project `_projectName` by `_artistAddress`.
372
+ * @param _projectName Project name.
373
+ * @param _artistAddress Artist's address.
374
+ * @param _pricePerTokenInWei Price to mint a token, in Wei.
375
+ */
376
+ function addProject(
377
+ string memory _projectName,
378
+ address payable _artistAddress,
379
+ uint256 _pricePerTokenInWei
380
+ ) public onlyWhitelisted {
381
+ uint256 projectId = nextProjectId;
382
+ projectIdToArtistAddress[projectId] = _artistAddress;
383
+ projects[projectId].name = _projectName;
384
+ projectIdToCurrencySymbol[projectId] = "ETH";
385
+ projectIdToPricePerTokenInWei[projectId] = _pricePerTokenInWei;
386
+ projects[projectId].paused = true;
387
+ projects[projectId].maxInvocations = ONE_MILLION;
388
+ nextProjectId = nextProjectId + 1;
389
+ }
390
+
391
+ /**
392
+ * @notice Updates payment currency of project `_projectId` to be
393
+ * `_currencySymbol`.
394
+ * @param _projectId Project ID to update.
395
+ * @param _currencySymbol Currency symbol.
396
+ * @param _currencyAddress Currency address.
397
+ */
398
+ function updateProjectCurrencyInfo(
399
+ uint256 _projectId,
400
+ string memory _currencySymbol,
401
+ address _currencyAddress
402
+ ) public onlyArtist(_projectId) {
403
+ projectIdToCurrencySymbol[_projectId] = _currencySymbol;
404
+ projectIdToCurrencyAddress[_projectId] = _currencyAddress;
405
+ }
406
+
407
+ /**
408
+ * @notice Updates price per token of project `_projectId` to be
409
+ * '_pricePerTokenInWei`, in Wei.
410
+ */
411
+ function updateProjectPricePerTokenInWei(
412
+ uint256 _projectId,
413
+ uint256 _pricePerTokenInWei
414
+ ) public onlyArtist(_projectId) {
415
+ projectIdToPricePerTokenInWei[_projectId] = _pricePerTokenInWei;
416
+ }
417
+
418
+ /**
419
+ * @notice Updates name of project `_projectId` to be `_projectName`.
420
+ */
421
+ function updateProjectName(
422
+ uint256 _projectId,
423
+ string memory _projectName
424
+ ) public onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) {
425
+ projects[_projectId].name = _projectName;
426
+ }
427
+
428
+ /**
429
+ * @notice Updates artist name for project `_projectId` to be
430
+ * `_projectArtistName`.
431
+ */
432
+ function updateProjectArtistName(
433
+ uint256 _projectId,
434
+ string memory _projectArtistName
435
+ ) public onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) {
436
+ projects[_projectId].artist = _projectArtistName;
437
+ }
438
+
439
+ /**
440
+ * @notice Updates additional payee for project `_projectId` to be
441
+ * `_additionalPayee`, receiving `_additionalPayeePercentage` percent
442
+ * of artist mint and royalty revenues.
443
+ */
444
+ function updateProjectAdditionalPayeeInfo(
445
+ uint256 _projectId,
446
+ address payable _additionalPayee,
447
+ uint256 _additionalPayeePercentage
448
+ ) public onlyArtist(_projectId) {
449
+ require(_additionalPayeePercentage <= 100, "Max of 100%");
450
+ projectIdToAdditionalPayee[_projectId] = _additionalPayee;
451
+ projectIdToAdditionalPayeePercentage[
452
+ _projectId
453
+ ] = _additionalPayeePercentage;
454
+ }
455
+
456
+ /**
457
+ * @notice Updates artist secondary market royalties for project
458
+ * `_projectId` to be `_secondMarketRoyalty` percent.
459
+ */
460
+ function updateProjectSecondaryMarketRoyaltyPercentage(
461
+ uint256 _projectId,
462
+ uint256 _secondMarketRoyalty
463
+ ) public onlyArtist(_projectId) {
464
+ require(_secondMarketRoyalty <= 100, "Max of 100%");
465
+ projectIdToSecondaryMarketRoyaltyPercentage[
466
+ _projectId
467
+ ] = _secondMarketRoyalty;
468
+ }
469
+
470
+ /**
471
+ * @notice Updates description of project `_projectId`.
472
+ */
473
+ function updateProjectDescription(
474
+ uint256 _projectId,
475
+ string memory _projectDescription
476
+ ) public onlyArtist(_projectId) {
477
+ projects[_projectId].description = _projectDescription;
478
+ }
479
+
480
+ /**
481
+ * @notice Updates website of project `_projectId` to be `_projectWebsite`.
482
+ */
483
+ function updateProjectWebsite(
484
+ uint256 _projectId,
485
+ string memory _projectWebsite
486
+ ) public onlyArtist(_projectId) {
487
+ projects[_projectId].website = _projectWebsite;
488
+ }
489
+
490
+ /**
491
+ * @notice Updates license for project `_projectId`.
492
+ */
493
+ function updateProjectLicense(
494
+ uint256 _projectId,
495
+ string memory _projectLicense
496
+ ) public onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) {
497
+ projects[_projectId].license = _projectLicense;
498
+ }
499
+
500
+ /**
501
+ * @notice Updates maximum invocations for project `_projectId` to
502
+ * `_maxInvocations`.
503
+ */
504
+ function updateProjectMaxInvocations(
505
+ uint256 _projectId,
506
+ uint256 _maxInvocations
507
+ ) public onlyArtist(_projectId) {
508
+ require(
509
+ (!projects[_projectId].locked ||
510
+ _maxInvocations < projects[_projectId].maxInvocations),
511
+ "Only if unlocked"
512
+ );
513
+ require(
514
+ _maxInvocations > projects[_projectId].invocations,
515
+ "You must set max invocations greater than current invocations"
516
+ );
517
+ require(_maxInvocations <= ONE_MILLION, "Cannot exceed 1000000");
518
+ projects[_projectId].maxInvocations = _maxInvocations;
519
+ }
520
+
521
+ /**
522
+ * @notice Adds a script to project `_projectId`.
523
+ * @param _projectId Project to be updated.
524
+ * @param _script Script to be added.
525
+ */
526
+ function addProjectScript(
527
+ uint256 _projectId,
528
+ string memory _script
529
+ ) public onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) {
530
+ projects[_projectId].scripts[
531
+ projects[_projectId].scriptCount
532
+ ] = _script;
533
+ projects[_projectId].scriptCount = projects[_projectId].scriptCount + 1;
534
+ }
535
+
536
+ /**
537
+ * @notice Updates script for project `_projectId` at script ID `_scriptId`.
538
+ * @param _projectId Project to be updated.
539
+ * @param _scriptId Script ID to be updated.
540
+ * @param _script Script to be added.
541
+ */
542
+ function updateProjectScript(
543
+ uint256 _projectId,
544
+ uint256 _scriptId,
545
+ string memory _script
546
+ ) public onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) {
547
+ require(
548
+ _scriptId < projects[_projectId].scriptCount,
549
+ "scriptId out of range"
550
+ );
551
+ projects[_projectId].scripts[_scriptId] = _script;
552
+ }
553
+
554
+ /**
555
+ * @notice Updates external asset dependency for project `_projectId`.
556
+ * @param _projectId Project to be updated.
557
+ * @param _index Asset index.
558
+ * @param _cid Asset cid (Content identifier).
559
+ * @param _dependencyType Asset dependency type.
560
+ * 0 - IPFS
561
+ * 1 - ARWEAVE
562
+ */
563
+ function updateProjectExternalAssetDependency(
564
+ uint256 _projectId,
565
+ uint256 _index,
566
+ string calldata _cid,
567
+ ExternalAssetDependencyType _dependencyType
568
+ )
569
+ external
570
+ onlyUnlockedProjectExternalAssetDependencies(_projectId)
571
+ onlyArtistOrWhitelisted(_projectId)
572
+ {
573
+ uint24 assetCount = projects[_projectId].externalAssetDependencyCount;
574
+ require(_index < assetCount, "Asset index out of range");
575
+ projects[_projectId].externalAssetDependencies[_index].cid = _cid;
576
+ projects[_projectId]
577
+ .externalAssetDependencies[_index]
578
+ .dependencyType = _dependencyType;
579
+ emit ExternalAssetDependencyUpdated(
580
+ _projectId,
581
+ _index,
582
+ _cid,
583
+ _dependencyType,
584
+ assetCount
585
+ );
586
+ }
587
+
588
+ /**
589
+ * @notice Removes external asset dependency for project `_projectId` at index `_index`.
590
+ * Removal is done by swapping the element to be removed with the last element in the array, then deleting this last element.
591
+ * Assets with indices higher than `_index` can have their indices adjusted as a result of this operation.
592
+ * @param _projectId Project to be updated.
593
+ * @param _index Asset index
594
+ */
595
+ function removeProjectExternalAssetDependency(
596
+ uint256 _projectId,
597
+ uint256 _index
598
+ )
599
+ external
600
+ onlyUnlockedProjectExternalAssetDependencies(_projectId)
601
+ onlyArtistOrWhitelisted(_projectId)
602
+ {
603
+ uint24 assetCount = projects[_projectId].externalAssetDependencyCount;
604
+ require(_index < assetCount, "Asset index out of range");
605
+
606
+ uint24 lastElementIndex = assetCount - 1;
607
+
608
+ projects[_projectId].externalAssetDependencies[_index] = projects[
609
+ _projectId
610
+ ].externalAssetDependencies[lastElementIndex];
611
+ delete projects[_projectId].externalAssetDependencies[lastElementIndex];
612
+
613
+ projects[_projectId].externalAssetDependencyCount = lastElementIndex;
614
+
615
+ emit ExternalAssetDependencyRemoved(_projectId, _index);
616
+ }
617
+
618
+ /**
619
+ * @notice Adds external asset dependency for project `_projectId`.
620
+ * @param _projectId Project to be updated.
621
+ * @param _cid Asset cid (Content identifier).
622
+ * @param _dependencyType Asset dependency type.
623
+ * 0 - IPFS
624
+ * 1 - ARWEAVE
625
+ */
626
+ function addProjectExternalAssetDependency(
627
+ uint256 _projectId,
628
+ string calldata _cid,
629
+ ExternalAssetDependencyType _dependencyType
630
+ )
631
+ external
632
+ onlyUnlockedProjectExternalAssetDependencies(_projectId)
633
+ onlyArtistOrWhitelisted(_projectId)
634
+ {
635
+ uint24 assetCount = projects[_projectId].externalAssetDependencyCount;
636
+ ExternalAssetDependency memory asset = ExternalAssetDependency({
637
+ cid: _cid,
638
+ dependencyType: _dependencyType
639
+ });
640
+ projects[_projectId].externalAssetDependencies[assetCount] = asset;
641
+ projects[_projectId].externalAssetDependencyCount = assetCount + 1;
642
+
643
+ emit ExternalAssetDependencyUpdated(
644
+ _projectId,
645
+ assetCount,
646
+ _cid,
647
+ _dependencyType,
648
+ assetCount + 1
649
+ );
650
+ }
651
+
652
+ /**
653
+ * @notice Removes last script from project `_projectId`.
654
+ */
655
+ function removeProjectLastScript(
656
+ uint256 _projectId
657
+ ) public onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) {
658
+ require(
659
+ projects[_projectId].scriptCount > 0,
660
+ "there are no scripts to remove"
661
+ );
662
+ delete projects[_projectId].scripts[
663
+ projects[_projectId].scriptCount - 1
664
+ ];
665
+ projects[_projectId].scriptCount = projects[_projectId].scriptCount - 1;
666
+ }
667
+
668
+ /**
669
+ * @notice Updates script json for project `_projectId`.
670
+ */
671
+ function updateProjectScriptJSON(
672
+ uint256 _projectId,
673
+ string memory _projectScriptJSON
674
+ ) public onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) {
675
+ projects[_projectId].scriptJSON = _projectScriptJSON;
676
+ }
677
+
678
+ /**
679
+ * @notice Updates ipfs hash for project `_projectId`.
680
+ */
681
+ function updateProjectIpfsHash(
682
+ uint256 _projectId,
683
+ string memory _ipfsHash
684
+ ) public onlyUnlocked(_projectId) onlyArtistOrWhitelisted(_projectId) {
685
+ projects[_projectId].ipfsHash = _ipfsHash;
686
+ }
687
+
688
+ /**
689
+ * @notice Updates base URI for project `_projectId` to `_newBaseURI`.
690
+ */
691
+ function updateProjectBaseURI(
692
+ uint256 _projectId,
693
+ string memory _newBaseURI
694
+ ) public onlyArtist(_projectId) {
695
+ projects[_projectId].projectBaseURI = _newBaseURI;
696
+ }
697
+
698
+ /**
699
+ * @notice Returns project details for project `_projectId`.
700
+ * @param _projectId Project to be queried.
701
+ * @return projectName Name of project
702
+ * @return artist Artist of project
703
+ * @return description Project description
704
+ * @return website Project website
705
+ * @return license Project license
706
+ */
707
+ function projectDetails(
708
+ uint256 _projectId
709
+ )
710
+ public
711
+ view
712
+ returns (
713
+ string memory projectName,
714
+ string memory artist,
715
+ string memory description,
716
+ string memory website,
717
+ string memory license
718
+ )
719
+ {
720
+ projectName = projects[_projectId].name;
721
+ artist = projects[_projectId].artist;
722
+ description = projects[_projectId].description;
723
+ website = projects[_projectId].website;
724
+ license = projects[_projectId].license;
725
+ }
726
+
727
+ /**
728
+ * @notice Returns project token information for project `_projectId`.
729
+ * @param _projectId Project to be queried.
730
+ * @return artistAddress Project Artist's address
731
+ * @return pricePerTokenInWei Price to mint a token, in Wei
732
+ * @return invocations Current number of invocations
733
+ * @return maxInvocations Maximum allowed invocations
734
+ * @return active Boolean representing if project is currently active
735
+ * @return additionalPayee Additional payee address
736
+ * @return additionalPayeePercentage Percentage of artist revenue
737
+ * to be sent to the additional payee's address
738
+ * @return currency Symbol of project's currency
739
+ * @return currencyAddress Address of project's currency
740
+ */
741
+ function projectTokenInfo(
742
+ uint256 _projectId
743
+ )
744
+ public
745
+ view
746
+ returns (
747
+ address artistAddress,
748
+ uint256 pricePerTokenInWei,
749
+ uint256 invocations,
750
+ uint256 maxInvocations,
751
+ bool active,
752
+ address additionalPayee,
753
+ uint256 additionalPayeePercentage,
754
+ string memory currency,
755
+ address currencyAddress
756
+ )
757
+ {
758
+ artistAddress = projectIdToArtistAddress[_projectId];
759
+ pricePerTokenInWei = projectIdToPricePerTokenInWei[_projectId];
760
+ invocations = projects[_projectId].invocations;
761
+ maxInvocations = projects[_projectId].maxInvocations;
762
+ active = projects[_projectId].active;
763
+ additionalPayee = projectIdToAdditionalPayee[_projectId];
764
+ additionalPayeePercentage = projectIdToAdditionalPayeePercentage[
765
+ _projectId
766
+ ];
767
+ currency = projectIdToCurrencySymbol[_projectId];
768
+ currencyAddress = projectIdToCurrencyAddress[_projectId];
769
+ }
770
+
771
+ /**
772
+ * @notice Returns script information for project `_projectId`.
773
+ * @param _projectId Project to be queried.
774
+ * @return scriptJSON Project's script json
775
+ * @return scriptCount Count of scripts for project
776
+ * @return ipfsHash IPFS hash for project
777
+ * @return locked Boolean representing if project is locked
778
+ * @return paused Boolean representing if project is paused
779
+ */
780
+ function projectScriptInfo(
781
+ uint256 _projectId
782
+ )
783
+ public
784
+ view
785
+ returns (
786
+ string memory scriptJSON,
787
+ uint256 scriptCount,
788
+ string memory ipfsHash,
789
+ bool locked,
790
+ bool paused
791
+ )
792
+ {
793
+ scriptJSON = projects[_projectId].scriptJSON;
794
+ scriptCount = projects[_projectId].scriptCount;
795
+ ipfsHash = projects[_projectId].ipfsHash;
796
+ locked = projects[_projectId].locked;
797
+ paused = projects[_projectId].paused;
798
+ }
799
+
800
+ /**
801
+ * @notice Returns script for project `_projectId` at script index `_index`
802
+
803
+ */
804
+ function projectScriptByIndex(
805
+ uint256 _projectId,
806
+ uint256 _index
807
+ ) public view returns (string memory) {
808
+ return projects[_projectId].scripts[_index];
809
+ }
810
+
811
+ /**
812
+ * @notice Returns external asset dependency for project `_projectId` at index `_index`.
813
+ */
814
+ function projectExternalAssetDependencyByIndex(
815
+ uint256 _projectId,
816
+ uint256 _index
817
+ ) public view returns (ExternalAssetDependency memory) {
818
+ return projects[_projectId].externalAssetDependencies[_index];
819
+ }
820
+
821
+ /**
822
+ * @notice Returns external asset dependency count for project `_projectId` at index `_index`.
823
+ */
824
+ function projectExternalAssetDependencyCount(
825
+ uint256 _projectId
826
+ ) public view returns (uint256) {
827
+ return uint256(projects[_projectId].externalAssetDependencyCount);
828
+ }
829
+
830
+ /**
831
+ * @notice Returns base URI for project `_projectId`.
832
+ */
833
+ function projectURIInfo(
834
+ uint256 _projectId
835
+ ) public view returns (string memory projectBaseURI) {
836
+ projectBaseURI = projects[_projectId].projectBaseURI;
837
+ }
838
+
839
+ /**
840
+ * @notice Gets royalty data for token ID `_tokenId`.
841
+ * @param _tokenId Token ID to be queried.
842
+ * @return artistAddress Artist's payment address
843
+ * @return additionalPayee Additional payee's payment address
844
+ * @return additionalPayeePercentage Percentage of artist revenue
845
+ * to be sent to the additional payee's address
846
+ * @return royaltyFeeByID Total royalty percentage to be sent to
847
+ * combination of artist and additional payee
848
+ */
849
+ function getRoyaltyData(
850
+ uint256 _tokenId
851
+ )
852
+ public
853
+ view
854
+ returns (
855
+ address artistAddress,
856
+ address additionalPayee,
857
+ uint256 additionalPayeePercentage,
858
+ uint256 royaltyFeeByID
859
+ )
860
+ {
861
+ artistAddress = projectIdToArtistAddress[tokenIdToProjectId[_tokenId]];
862
+ additionalPayee = projectIdToAdditionalPayee[
863
+ tokenIdToProjectId[_tokenId]
864
+ ];
865
+ additionalPayeePercentage = projectIdToAdditionalPayeePercentage[
866
+ tokenIdToProjectId[_tokenId]
867
+ ];
868
+ royaltyFeeByID = projectIdToSecondaryMarketRoyaltyPercentage[
869
+ tokenIdToProjectId[_tokenId]
870
+ ];
871
+ }
872
+
873
+ /**
874
+ * @notice Gets token URI for token ID `_tokenId`.
875
+ */
876
+ function tokenURI(
877
+ uint256 _tokenId
878
+ ) public view override onlyValidTokenId(_tokenId) returns (string memory) {
879
+ return
880
+ string(
881
+ abi.encodePacked(
882
+ projects[tokenIdToProjectId[_tokenId]].projectBaseURI,
883
+ Strings.toString(_tokenId)
884
+ )
885
+ );
886
+ }
887
+ }