@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,65 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ pragma solidity 0.8.17;
4
+
5
+ import "../interfaces/0.8.x/IAdminACLV0.sol";
6
+ import "@openzeppelin-4.7/contracts/access/Ownable.sol";
7
+ import "@openzeppelin-4.7/contracts/utils/introspection/ERC165.sol";
8
+
9
+ /**
10
+ * @dev Mock contract for testing purposes.
11
+ * This contract has a single superAdmin that passes all ACL checks. All checks
12
+ * for any other address will return false.
13
+ * It also emits an event for all ACL checks, enabling our test suite to verify
14
+ * that the ACL was checked with the correct parameters.
15
+ * @dev this contract specifically does not broadcast conformance to IAdminACLV0
16
+ * for testing purposes.
17
+ */
18
+ contract MockAdminACLV0Events is IAdminACLV0, ERC165 {
19
+ // event used for testing purposes to diagnose what core contract is asking
20
+ // approval for.
21
+ event ACLCheck(address indexed sender, bytes4 indexed selector);
22
+
23
+ string public AdminACLType = "MockAdminACLV0Events";
24
+
25
+ // superAdmin is the only address that passes any and all ACL checks
26
+ address public superAdmin;
27
+
28
+ constructor() {
29
+ superAdmin = msg.sender;
30
+ }
31
+
32
+ /**
33
+ * @dev Returns true for all ACL checks.
34
+ * Also emits event for testing purposes.
35
+ */
36
+ function allowed(
37
+ address _sender,
38
+ address /*_contract*/,
39
+ bytes4 _selector
40
+ ) external returns (bool) {
41
+ emit ACLCheck(_sender, _selector);
42
+ return superAdmin == _sender;
43
+ }
44
+
45
+ /**
46
+ * @dev Allows superAdmin to call transferOwnership on other contract from
47
+ * this contract.
48
+ */
49
+ function transferOwnershipOn(
50
+ address _contract,
51
+ address _newAdminACL
52
+ ) external {
53
+ require(msg.sender == superAdmin, "Only superAdmin");
54
+ Ownable(_contract).transferOwnership(_newAdminACL);
55
+ }
56
+
57
+ /**
58
+ * @dev Allows superAdmin to call renounceOwnership on other contract from
59
+ * this contract.
60
+ */
61
+ function renounceOwnershipOn(address _contract) external {
62
+ require(msg.sender == superAdmin, "Only superAdmin");
63
+ Ownable(_contract).renounceOwnership();
64
+ }
65
+ }
@@ -0,0 +1,43 @@
1
+ // SPDX-License-Identifier: LGPL-3.0-only
2
+ // Creatd By: Art Blocks Inc.
3
+
4
+ pragma solidity 0.8.17;
5
+
6
+ import "../BasicRandomizerV2.sol";
7
+
8
+ /// @title RandomizerV2_NoAssignMock
9
+ /// @notice WARNING - This is a mock contract. Do not use it in production.
10
+ /// @dev This is a mock of the RandomizerV2 contract that does not assign the
11
+ /// token hash on the core contract at the time of mint.
12
+ /// Instead, anyone may set an existing token's hash via the
13
+ /// `actuallyAssignTokenHash` function.
14
+ contract RandomizerV2_NoAssignMock is BasicRandomizerV2 {
15
+ // When `genArt721Core` calls this, the call is ignored and nothing is set
16
+ // on the core contract. Used for test purposes only.
17
+ function assignTokenHash(uint256 /*_tokenId*/) external pure override {}
18
+
19
+ // When ANYONE calls this, token `_tokenId`'s hash is set
20
+ // on the core contract. Used for test purposes only.
21
+ // @dev WARNING - THIS IS NOT SECURE AND SHOULD NOT BE USED IN PRODUCTION.
22
+ function actuallyAssignTokenHash(uint256 _tokenId) external {
23
+ uint256 time = block.timestamp;
24
+ bytes32 hash = keccak256(
25
+ abi.encodePacked(
26
+ _tokenId,
27
+ block.number,
28
+ blockhash(block.number - 1),
29
+ time,
30
+ (time % 200) + 1
31
+ )
32
+ );
33
+ genArt721Core.setTokenHash_8PT(_tokenId, hash);
34
+ }
35
+
36
+ // When ANYONE calls this, token `_tokenId`'s hash is attempted to be set
37
+ // to zero on the core contract. Used for test purposes only.
38
+ // @dev WARNING - THIS IS NOT SECURE AND SHOULD NOT BE USED IN PRODUCTION.
39
+ function actuallyAssignZeroTokenHash(uint256 _tokenId) external {
40
+ bytes32 hash;
41
+ genArt721Core.setTokenHash_8PT(_tokenId, hash);
42
+ }
43
+ }
@@ -0,0 +1,50 @@
1
+ // SPDX-License-Identifier: LGPL-3.0-only
2
+ // Created By: Art Blocks Inc.
3
+
4
+ import "../interfaces/0.8.x/IFilteredMinterHolderV0.sol";
5
+
6
+ pragma solidity ^0.8.0;
7
+
8
+ contract ReentrancyHolderMock {
9
+ uint256 public currentQtyToPurchase;
10
+ uint256 public currentProjectId;
11
+ uint256 public currentPriceToPay;
12
+ address public currentOwnedNftAddress;
13
+ uint256 public currentOwnedNftTokenId;
14
+
15
+ /**
16
+ @notice This function can be called to induce controlled reentrency attacks
17
+ on AB minter filter suite's Token Holder minter.
18
+ Note that _priceToPay should be > project price per token to induce refund,
19
+ making reentrency possible via fallback function.
20
+ */
21
+ function attack(
22
+ uint256 _qtyToPurchase,
23
+ address _minterContractAddress,
24
+ uint256 _projectId,
25
+ uint256 _priceToPay,
26
+ address _ownedNftAddress,
27
+ uint256 _ownedNftTokenId
28
+ ) external payable {
29
+ currentQtyToPurchase = _qtyToPurchase;
30
+ currentProjectId = _projectId;
31
+ currentPriceToPay = _priceToPay;
32
+ currentOwnedNftAddress = _ownedNftAddress;
33
+ currentOwnedNftTokenId = _ownedNftTokenId;
34
+ IFilteredMinterHolderV0(_minterContractAddress).purchase{
35
+ value: _priceToPay
36
+ }(_projectId, _ownedNftAddress, _ownedNftTokenId);
37
+ }
38
+
39
+ // receiver is called when minter sends refunded Ether to this contract.
40
+ receive() external payable {
41
+ // decrement num to be purchased
42
+ currentQtyToPurchase--;
43
+ if (currentQtyToPurchase > 0) {
44
+ // purchase again!
45
+ IFilteredMinterHolderV0(msg.sender).purchase{
46
+ value: currentPriceToPay
47
+ }(currentProjectId, currentOwnedNftAddress, currentOwnedNftTokenId);
48
+ }
49
+ }
50
+ }
@@ -0,0 +1,64 @@
1
+ // SPDX-License-Identifier: LGPL-3.0-only
2
+ // Created By: Art Blocks Inc.
3
+
4
+ import "../interfaces/0.8.x/IFilteredMinterMerkleV0.sol";
5
+
6
+ pragma solidity ^0.8.0;
7
+
8
+ /**
9
+ * @dev This contract is tailored to attack our Merkle allowlist minter with a
10
+ * reentrency attack. It simulates the case where an artist allowlists a
11
+ * malicious contract.
12
+ * @dev Note that a simple contract like this assumes a specific Merkle proof
13
+ * depth. In this case, a Merkle proof depth of 3 is assumed (since it
14
+ * integrates well with our tests). More complex strategies could be used to
15
+ * write a more flexible reentrency attack contract, but it doesn't add more
16
+ * value to our test suite at this time.
17
+ */
18
+ contract ReentrancyMerkleMock {
19
+ uint256 public currentQtyToPurchase;
20
+ uint256 public currentProjectId;
21
+ uint256 public currentPriceToPay;
22
+ bytes32[3] currentProof;
23
+
24
+ /**
25
+ @notice This function can be called to induce controlled reentrency attacks
26
+ on AB minter filter suite's Merkle minter (originally designed for V0).
27
+ Note that _priceToPay should be > project price per token to induce refund,
28
+ making reentrency possible via fallback function.
29
+ */
30
+ function attack(
31
+ uint256 _qtyToPurchase,
32
+ address _minterContractAddress,
33
+ uint256 _projectId,
34
+ uint256 _priceToPay,
35
+ bytes32[] memory _proof
36
+ ) external payable {
37
+ currentQtyToPurchase = _qtyToPurchase;
38
+ currentProjectId = _projectId;
39
+ currentPriceToPay = _priceToPay;
40
+ currentProof[0] = _proof[0];
41
+ currentProof[1] = _proof[1];
42
+ currentProof[2] = _proof[2];
43
+ IFilteredMinterMerkleV0(_minterContractAddress).purchase{
44
+ value: _priceToPay
45
+ }(_projectId, _proof);
46
+ }
47
+
48
+ // receiver is called when minter sends refunded Ether to this contract.
49
+ receive() external payable {
50
+ // decrement num to be purchased
51
+ currentQtyToPurchase--;
52
+ if (currentQtyToPurchase > 0) {
53
+ // rebuild _proof
54
+ bytes32[] memory _proof = new bytes32[](3);
55
+ _proof[0] = currentProof[0];
56
+ _proof[1] = currentProof[1];
57
+ _proof[2] = currentProof[2];
58
+ // purchase again!
59
+ IFilteredMinterMerkleV0(msg.sender).purchase{
60
+ value: currentPriceToPay
61
+ }(currentProjectId, _proof);
62
+ }
63
+ }
64
+ }
@@ -0,0 +1,44 @@
1
+ // SPDX-License-Identifier: LGPL-3.0-only
2
+ // Created By: Art Blocks Inc.
3
+
4
+ import "../interfaces/0.8.x/IFilteredMinterV0.sol";
5
+
6
+ pragma solidity ^0.8.0;
7
+
8
+ contract ReentrancyMock {
9
+ uint256 public currentQtyToPurchase;
10
+ uint256 public currentProjectId;
11
+ uint256 public currentPriceToPay;
12
+
13
+ /**
14
+ @notice This function can be called to induce controlled reentrency attacks
15
+ on AB minter filter suite.
16
+ Note that _priceToPay should be > project price per token to induce refund,
17
+ making reentrency possible via fallback function.
18
+ */
19
+ function attack(
20
+ uint256 _qtyToPurchase,
21
+ address _minterContractAddress,
22
+ uint256 _projectId,
23
+ uint256 _priceToPay
24
+ ) external payable {
25
+ currentQtyToPurchase = _qtyToPurchase;
26
+ currentProjectId = _projectId;
27
+ currentPriceToPay = _priceToPay;
28
+ IFilteredMinterV0(_minterContractAddress).purchase{value: _priceToPay}(
29
+ _projectId
30
+ );
31
+ }
32
+
33
+ // receiver is called when minter sends refunded Ether to this contract.
34
+ receive() external payable {
35
+ // decrement num to be purchased
36
+ currentQtyToPurchase--;
37
+ if (currentQtyToPurchase > 0) {
38
+ // purchase again!
39
+ IFilteredMinterV0(msg.sender).purchase{value: currentPriceToPay}(
40
+ currentProjectId
41
+ );
42
+ }
43
+ }
44
+ }
@@ -0,0 +1,168 @@
1
+ // SPDX-License-Identifier: LGPL-3.0-only
2
+ // Created By: Art Blocks Inc.
3
+
4
+ import "../interfaces/0.8.x/IArtblocksRoyaltyOverride.sol";
5
+ import "../interfaces/0.8.x/IGenArt721CoreContractV3.sol";
6
+
7
+ import "@openzeppelin-4.5/contracts/utils/introspection/ERC165.sol";
8
+
9
+ pragma solidity 0.8.9;
10
+
11
+ /**
12
+ * @title Royalty Registry override for Art Blocks token contracts.
13
+ * @author Art Blocks Inc.
14
+ */
15
+ contract GenArt721RoyaltyOverride is ERC165, IArtblocksRoyaltyOverride {
16
+ /**
17
+ * @notice Art Blocks royalty payment address for `contractAddress`
18
+ * updated to be `artblocksRoyaltyAddress`.
19
+ */
20
+ event ArtblocksRoyaltyAddressForContractUpdated(
21
+ address indexed contractAddress,
22
+ address payable indexed artblocksRoyaltyAddress
23
+ );
24
+
25
+ /**
26
+ * @notice Art Blocks royalty payment basis points for `tokenAddress`
27
+ * updated to be `bps` if `useOverride`, else updated to use default
28
+ * BPS.
29
+ */
30
+ event ArtblocksBpsForContractUpdated(
31
+ address indexed tokenAddress,
32
+ bool indexed useOverride,
33
+ uint256 bps
34
+ );
35
+
36
+ /// token contract => Art Blocks royalty payment address
37
+ mapping(address => address payable)
38
+ public tokenAddressToArtblocksRoyaltyAddress;
39
+
40
+ struct BpsOverride {
41
+ bool useOverride;
42
+ uint256 bps;
43
+ }
44
+
45
+ /// Default Art Blocks royalty basis points if no BPS override is set.
46
+ uint256 public constant ARTBLOCKS_DEFAULT_BPS = 250; // 2.5 percent
47
+ /// token contract => if bps override is set, and bps value.
48
+ mapping(address => BpsOverride) public tokenAddressToArtblocksBpsOverride;
49
+
50
+ modifier onlyAdminOnContract(address _tokenContract) {
51
+ require(
52
+ IGenArt721CoreContractV3(_tokenContract).admin() == msg.sender,
53
+ "Only core admin for specified token contract"
54
+ );
55
+ _;
56
+ }
57
+
58
+ /**
59
+ * @dev See {IERC165-supportsInterface}.
60
+ */
61
+ function supportsInterface(
62
+ bytes4 interfaceId
63
+ ) public view override(ERC165, IERC165) returns (bool) {
64
+ return
65
+ // register interface 0x9ca7dc7a - getRoyalties(address,uint256)
66
+ interfaceId == type(IArtblocksRoyaltyOverride).interfaceId ||
67
+ super.supportsInterface(interfaceId);
68
+ }
69
+
70
+ /**
71
+ * @notice Updates Art Blocks royalty payment address for `_tokenContract`
72
+ * to be `_artblocksRoyaltyAddress`.
73
+ * @param _tokenContract Token contract to be updated.
74
+ * @param _artblocksRoyaltyAddress Address to receive royalty payments.
75
+ */
76
+ function updateArtblocksRoyaltyAddressForContract(
77
+ address _tokenContract,
78
+ address payable _artblocksRoyaltyAddress
79
+ ) external onlyAdminOnContract(_tokenContract) {
80
+ tokenAddressToArtblocksRoyaltyAddress[
81
+ _tokenContract
82
+ ] = _artblocksRoyaltyAddress;
83
+ emit ArtblocksRoyaltyAddressForContractUpdated(
84
+ _tokenContract,
85
+ _artblocksRoyaltyAddress
86
+ );
87
+ }
88
+
89
+ /**
90
+ * @notice Updates Art Blocks royalty payment BPS for `_tokenContract` to be
91
+ * `_bps`.
92
+ * @param _tokenContract Token contract to be updated.
93
+ * @param _bps Art Blocks royalty basis points.
94
+ * @dev `_bps` must be less than or equal to default bps
95
+ */
96
+ function updateArtblocksBpsForContract(
97
+ address _tokenContract,
98
+ uint256 _bps
99
+ ) external onlyAdminOnContract(_tokenContract) {
100
+ require(
101
+ _bps <= ARTBLOCKS_DEFAULT_BPS,
102
+ "override bps for contract must be less than or equal to default"
103
+ );
104
+ tokenAddressToArtblocksBpsOverride[_tokenContract] = BpsOverride(
105
+ true,
106
+ _bps
107
+ );
108
+ emit ArtblocksBpsForContractUpdated(_tokenContract, true, _bps);
109
+ }
110
+
111
+ /**
112
+ * @notice Clears any overrides of Art Blocks royalty payment BPS for
113
+ * `_tokenContract`.
114
+ * @param _tokenContract Token contract to be cleared.
115
+ * @dev token contracts without overrides use default BPS value.
116
+ */
117
+ function clearArtblocksBpsForContract(
118
+ address _tokenContract
119
+ ) external onlyAdminOnContract(_tokenContract) {
120
+ tokenAddressToArtblocksBpsOverride[_tokenContract] = BpsOverride(
121
+ false,
122
+ 0
123
+ ); // initial values
124
+ emit ArtblocksBpsForContractUpdated(_tokenContract, false, 0);
125
+ }
126
+
127
+ /**
128
+ * @notice Gets royalites of token ID `_tokenId` on token contract
129
+ * `_tokenAddress`.
130
+ * @param _tokenAddress Token contract to be queried.
131
+ * @param _tokenId Token ID to be queried.
132
+ * @return recipients_ array of royalty recipients
133
+ * @return bps array of basis points for each recipient, aligned by index
134
+ */
135
+ function getRoyalties(
136
+ address _tokenAddress,
137
+ uint256 _tokenId
138
+ )
139
+ external
140
+ view
141
+ returns (address payable[] memory recipients_, uint256[] memory bps)
142
+ {
143
+ recipients_ = new address payable[](3);
144
+ bps = new uint256[](3);
145
+ // get standard royalty data for artist and additional payee
146
+ (
147
+ address artistAddress,
148
+ address additionalPayee,
149
+ uint256 additionalPayeePercentage,
150
+ uint256 royaltyFeeByID
151
+ ) = IGenArt721CoreContractV3(_tokenAddress).getRoyaltyData(_tokenId);
152
+ // translate to desired output
153
+ recipients_[0] = payable(artistAddress);
154
+ bps[0] = (uint256(100) - additionalPayeePercentage) * royaltyFeeByID;
155
+ recipients_[1] = payable(additionalPayee);
156
+ bps[1] = additionalPayeePercentage * royaltyFeeByID;
157
+ // append art blocks royalty
158
+ require(
159
+ tokenAddressToArtblocksRoyaltyAddress[_tokenAddress] != address(0),
160
+ "Art Blocks royalty address must be defined for contract"
161
+ );
162
+ recipients_[2] = tokenAddressToArtblocksRoyaltyAddress[_tokenAddress];
163
+ bps[2] = tokenAddressToArtblocksBpsOverride[_tokenAddress].useOverride
164
+ ? tokenAddressToArtblocksBpsOverride[_tokenAddress].bps
165
+ : ARTBLOCKS_DEFAULT_BPS;
166
+ return (recipients_, bps);
167
+ }
168
+ }
@@ -0,0 +1,221 @@
1
+ // SPDX-License-Identifier: LGPL-3.0-only
2
+ // Created By: Art Blocks Inc.
3
+
4
+ import "../interfaces/0.8.x/IArtblocksRoyaltyOverride.sol";
5
+ import "../interfaces/0.8.x/IGenArt721CoreV2_PBAB.sol";
6
+
7
+ import "@openzeppelin-4.5/contracts/utils/introspection/ERC165.sol";
8
+
9
+ pragma solidity 0.8.9;
10
+
11
+ /**
12
+ * @title Royalty Registry override for Art Blocks PBAB token contracts.
13
+ * @author Art Blocks Inc.
14
+ */
15
+ contract GenArt721RoyaltyOverride_PBAB is ERC165, IArtblocksRoyaltyOverride {
16
+ /**
17
+ * @notice Platform royalty payment address for `contractAddress`
18
+ * updated to be `platformRoyaltyAddress`.
19
+ */
20
+ event PlatformRoyaltyAddressForContractUpdated(
21
+ address indexed contractAddress,
22
+ address payable indexed platformRoyaltyAddress
23
+ );
24
+
25
+ /**
26
+ * @notice Render provider royalty payment basis points for `tokenAddress`
27
+ * updated to be `bps` if `useOverride`, else updated to use default BPS.
28
+ */
29
+ event RenderProviderBpsForContractUpdated(
30
+ address indexed tokenAddress,
31
+ bool indexed useOverride,
32
+ uint256 bps
33
+ );
34
+
35
+ /**
36
+ * @notice Platform royalty payment basis points for
37
+ * `tokenAddress` updated to be `bps` if `useOverride`, else
38
+ * updated to use default BPS.
39
+ */
40
+ event PlatformBpsForContractUpdated(
41
+ address indexed tokenAddress,
42
+ bool indexed useOverride,
43
+ uint256 bps
44
+ );
45
+
46
+ /// token contract => Platform royalty payment address
47
+ mapping(address => address payable)
48
+ public tokenAddressToPlatformRoyaltyAddress;
49
+
50
+ struct BpsOverride {
51
+ bool useOverride;
52
+ uint256 bps;
53
+ }
54
+
55
+ /// Default Render Provider royalty basis points if no BPS override is set.
56
+ uint256 public constant RENDER_PROVIDER_DEFAULT_BPS = 250; // 2.5 percent
57
+ /// Default Platform royalty basis points if no BPS override is set.
58
+ uint256 public constant PLATFORM_DEFAULT_BPS = 250; // 2.5 percent
59
+ /// token contract => if render provider bps override is set, and bps value.
60
+ mapping(address => BpsOverride)
61
+ public tokenAddressToRenderProviderBpsOverride;
62
+ /// token contract => if Platform bps override is set, and bps value.
63
+ mapping(address => BpsOverride) public tokenAddressToPlatformBpsOverride;
64
+
65
+ modifier onlyAdminOnContract(address _tokenContract) {
66
+ require(
67
+ IGenArt721CoreV2_PBAB(_tokenContract).admin() == msg.sender,
68
+ "Only core admin for specified token contract"
69
+ );
70
+ _;
71
+ }
72
+
73
+ /**
74
+ * @dev See {IERC165-supportsInterface}.
75
+ */
76
+ function supportsInterface(
77
+ bytes4 interfaceId
78
+ ) public view override(ERC165, IERC165) returns (bool) {
79
+ return
80
+ // register interface 0x9ca7dc7a - getRoyalties(address,uint256)
81
+ interfaceId == type(IArtblocksRoyaltyOverride).interfaceId ||
82
+ super.supportsInterface(interfaceId);
83
+ }
84
+
85
+ /**
86
+ * @notice Updates platform royalty payment address for `_tokenContract`
87
+ * to be `_platformRoyaltyAddress`.
88
+ * @param _tokenContract Token contract to be updated.
89
+ * @param _platformRoyaltyAddress Address to receive royalty payments.
90
+ */
91
+ function updatePlatformRoyaltyAddressForContract(
92
+ address _tokenContract,
93
+ address payable _platformRoyaltyAddress
94
+ ) external onlyAdminOnContract(_tokenContract) {
95
+ tokenAddressToPlatformRoyaltyAddress[
96
+ _tokenContract
97
+ ] = _platformRoyaltyAddress;
98
+ emit PlatformRoyaltyAddressForContractUpdated(
99
+ _tokenContract,
100
+ _platformRoyaltyAddress
101
+ );
102
+ }
103
+
104
+ /**
105
+ * @notice Updates render provider royalty payment BPS for `_tokenContract`
106
+ * to be `_bps`.
107
+ * @param _tokenContract Token contract to be updated.
108
+ * @param _bps Render provider royalty payment basis points.
109
+ */
110
+ function updateRenderProviderBpsForContract(
111
+ address _tokenContract,
112
+ uint256 _bps
113
+ ) external onlyAdminOnContract(_tokenContract) {
114
+ require(_bps <= 10000, "invalid bps");
115
+ tokenAddressToRenderProviderBpsOverride[_tokenContract] = BpsOverride(
116
+ true,
117
+ _bps
118
+ );
119
+ emit RenderProviderBpsForContractUpdated(_tokenContract, true, _bps);
120
+ }
121
+
122
+ /**
123
+ * @notice Updates platform royalty payment BPS for `_tokenContract` to be
124
+ * `_bps`.
125
+ * @param _tokenContract Token contract to be updated.
126
+ * @param _bps Platform royalty payment basis points.
127
+ */
128
+ function updatePlatformBpsForContract(
129
+ address _tokenContract,
130
+ uint256 _bps
131
+ ) external onlyAdminOnContract(_tokenContract) {
132
+ require(_bps <= 10000, "invalid bps");
133
+ tokenAddressToPlatformBpsOverride[_tokenContract] = BpsOverride(
134
+ true,
135
+ _bps
136
+ );
137
+ emit PlatformBpsForContractUpdated(_tokenContract, true, _bps);
138
+ }
139
+
140
+ /**
141
+ * @notice Clears any overrides of render provider royalty payment BPS
142
+ * for `_tokenContract`.
143
+ * @param _tokenContract Token contract to be cleared.
144
+ * @dev token contracts without overrides use default BPS value.
145
+ */
146
+ function clearRenderProviderBpsForContract(
147
+ address _tokenContract
148
+ ) external onlyAdminOnContract(_tokenContract) {
149
+ tokenAddressToRenderProviderBpsOverride[_tokenContract] = BpsOverride(
150
+ false,
151
+ 0
152
+ ); // initial values
153
+ emit RenderProviderBpsForContractUpdated(_tokenContract, false, 0);
154
+ }
155
+
156
+ /**
157
+ * @notice Clears any overrides of platform provider royalty payment BPS
158
+ * for `_tokenContract`.
159
+ * @param _tokenContract Token contract to be cleared.
160
+ * @dev token contracts without overrides use default BPS value.
161
+ */
162
+ function clearPlatformBpsForContract(
163
+ address _tokenContract
164
+ ) external onlyAdminOnContract(_tokenContract) {
165
+ tokenAddressToPlatformBpsOverride[_tokenContract] = BpsOverride(
166
+ false,
167
+ 0
168
+ ); // initial values
169
+ emit PlatformBpsForContractUpdated(_tokenContract, false, 0);
170
+ }
171
+
172
+ /**
173
+ * @notice Gets royalites of token ID `_tokenId` on token contract
174
+ * `_tokenAddress`.
175
+ * @param _tokenAddress Token contract to be queried.
176
+ * @param _tokenId Token ID to be queried.
177
+ * @return recipients_ array of royalty recipients
178
+ * @return bps array of basis points for each recipient, aligned by index
179
+ */
180
+ function getRoyalties(
181
+ address _tokenAddress,
182
+ uint256 _tokenId
183
+ )
184
+ external
185
+ view
186
+ returns (address payable[] memory recipients_, uint256[] memory bps)
187
+ {
188
+ recipients_ = new address payable[](4);
189
+ bps = new uint256[](4);
190
+ // get standard royalty data for artist and additional payee
191
+ (
192
+ address artistAddress,
193
+ address additionalPayee,
194
+ uint256 additionalPayeePercentage,
195
+ uint256 royaltyFeeByID
196
+ ) = IGenArt721CoreV2_PBAB(_tokenAddress).getRoyaltyData(_tokenId);
197
+ // translate to desired output
198
+ recipients_[0] = payable(artistAddress);
199
+ bps[0] = (uint256(100) - additionalPayeePercentage) * royaltyFeeByID;
200
+ recipients_[1] = payable(additionalPayee);
201
+ bps[1] = additionalPayeePercentage * royaltyFeeByID;
202
+ // append platform provider royalty
203
+ require(
204
+ tokenAddressToPlatformRoyaltyAddress[_tokenAddress] != address(0),
205
+ "Platform royalty address must be defined for contract"
206
+ );
207
+ recipients_[2] = tokenAddressToPlatformRoyaltyAddress[_tokenAddress];
208
+ bps[2] = tokenAddressToPlatformBpsOverride[_tokenAddress].useOverride
209
+ ? tokenAddressToPlatformBpsOverride[_tokenAddress].bps
210
+ : PLATFORM_DEFAULT_BPS;
211
+ // append render provider royalty
212
+ recipients_[3] = payable(
213
+ IGenArt721CoreV2_PBAB(_tokenAddress).renderProviderAddress()
214
+ );
215
+ bps[3] = tokenAddressToRenderProviderBpsOverride[_tokenAddress]
216
+ .useOverride
217
+ ? tokenAddressToRenderProviderBpsOverride[_tokenAddress].bps
218
+ : RENDER_PROVIDER_DEFAULT_BPS;
219
+ return (recipients_, bps);
220
+ }
221
+ }