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