@artblocks/contracts 1.0.3 → 1.1.0

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 (383) hide show
  1. package/README.md +32 -25
  2. package/artifacts/contracts/AdminACLV0.sol/AdminACLV0.json +2 -2
  3. package/artifacts/contracts/AdminACLV1.sol/AdminACLV1.json +2 -2
  4. package/artifacts/contracts/DependencyRegistryV0.sol/DependencyRegistryV0.json +212 -17
  5. package/artifacts/contracts/GenArt721CoreV3.sol/GenArt721CoreV3.json +6 -6
  6. package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV0.sol/MinterDAExpV0.json +2 -2
  7. package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV1.sol/MinterDAExpV1.json +2 -2
  8. package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV2.sol/MinterDAExpV2.json +2 -2
  9. package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV3.sol/MinterDAExpV3.json +2 -2
  10. package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol/MinterDAExpSettlementV0.json +2 -2
  11. package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV1.sol/MinterDAExpSettlementV1.json +2 -2
  12. package/artifacts/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV0.sol/MinterDALinV0.json +2 -2
  13. package/artifacts/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV1.sol/MinterDALinV1.json +2 -2
  14. package/artifacts/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV2.sol/MinterDALinV2.json +2 -2
  15. package/artifacts/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV3.sol/MinterDALinV3.json +2 -2
  16. package/artifacts/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV0.sol/MinterHolderV0.json +2 -2
  17. package/artifacts/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV1.sol/MinterHolderV1.json +2 -2
  18. package/artifacts/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV2.sol/MinterHolderV2.json +2 -2
  19. package/artifacts/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV3.sol/MinterHolderV3.json +2 -2
  20. package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV0.sol/MinterMerkleV0.json +2 -2
  21. package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV1.sol/MinterMerkleV1.json +2 -2
  22. package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV2.sol/MinterMerkleV2.json +2 -2
  23. package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV3.sol/MinterMerkleV3.json +2 -2
  24. package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV4.sol/MinterMerkleV4.json +2 -2
  25. package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV0.sol/MinterSetPriceV0.json +2 -2
  26. package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV1.sol/MinterSetPriceV1.json +2 -2
  27. package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV2.sol/MinterSetPriceV2.json +2 -2
  28. package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV3.sol/MinterSetPriceV3.json +2 -2
  29. package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V0.sol/MinterSetPriceERC20V0.json +2 -2
  30. package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V1.sol/MinterSetPriceERC20V1.json +2 -2
  31. package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V2.sol/MinterSetPriceERC20V2.json +2 -2
  32. package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V3.sol/MinterSetPriceERC20V3.json +2 -2
  33. package/artifacts/contracts/engine/V2/GenArt721CoreV2_ENGINE_FLEX.sol/GenArt721CoreV2_ENGINE_FLEX.json +2 -2
  34. package/artifacts/contracts/engine/V2/GenArt721CoreV2_PBAB.sol/GenArt721CoreV2_PBAB.json +2 -2
  35. package/artifacts/contracts/engine/V2/GenArt721CoreV2_PRTNR.sol/GenArt721CoreV2_PRTNR.json +2 -2
  36. package/artifacts/contracts/engine/V2/GenArt721MinterBurner_PBAB.sol/GenArt721MinterBurner_PBAB.json +2 -2
  37. package/artifacts/contracts/engine/V2/GenArt721MinterDAExp_PBAB.sol/GenArt721MinterDAExp_PBAB.json +2 -2
  38. package/artifacts/contracts/engine/V2/GenArt721Minter_PBAB.sol/GenArt721Minter_PBAB.json +2 -2
  39. package/artifacts/contracts/engine/V3/GenArt721CoreV3_Engine.sol/GenArt721CoreV3_Engine.json +6 -11
  40. package/artifacts/contracts/engine/V3/GenArt721CoreV3_Engine_Flex.sol/GenArt721CoreV3_Engine_Flex.json +6 -11
  41. package/artifacts/contracts/engine/V3/forks/GenArt721CoreV3_Engine_Flex_PROOF.sol/GenArt721CoreV3_Engine_Flex_PROOF.json +6 -11
  42. package/artifacts/contracts/engine/V3/forks/PROHIBITION/AdminACLV0_PROHIBITION.sol/AdminACLV0_PROHIBITION.json +2 -2
  43. package/artifacts/contracts/engine/V3/forks/PROHIBITION/GenArt721CoreV3_Engine_Flex_PROHIBITION.sol/GenArt721CoreV3_Engine_Flex_PROHIBITION.json +6 -11
  44. package/artifacts/contracts/engine-registry/CoreRegistryV1.sol/CoreRegistryV1.json +12 -12
  45. package/artifacts/contracts/engine-registry/EngineRegistryV0.sol/EngineRegistryV0.json +2 -2
  46. package/artifacts/contracts/explorations/GenArt721CoreV3_Explorations.sol/GenArt721CoreV3_Explorations.json +6 -6
  47. package/artifacts/contracts/interfaces/{0.5.x → v0.5.x}/IBonusContract.sol/IBonusContract.json +1 -1
  48. package/artifacts/contracts/interfaces/{0.5.x → v0.5.x}/IGenArt721CoreContractV1.sol/IGenArt721CoreContractV1.json +1 -1
  49. package/artifacts/contracts/interfaces/{0.5.x → v0.5.x}/IGenArt721CoreV2_PBAB.sol/IGenArt721CoreV2_PBAB.json +1 -1
  50. package/artifacts/contracts/interfaces/{0.5.x → v0.5.x}/IRandomizer.sol/IRandomizer.json +1 -1
  51. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IAdminACLV0.sol/IAdminACLV0.json +1 -1
  52. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IArtblocksRoyaltyOverride.sol/IArtblocksRoyaltyOverride.json +1 -1
  53. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IBonusContract.sol/IBonusContract.json +1 -1
  54. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IBytecodeStorageReader.sol/IBytecodeStorageReader.json +1 -1
  55. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/ICoreRegistryV1.sol/ICoreRegistryV1.json +7 -7
  56. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IDelegationRegistry.sol/IDelegationRegistry.json +1 -1
  57. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IDependencyRegistryCompatibleV0.sol/IDependencyRegistryCompatibleV0.json +1 -1
  58. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IDependencyRegistryV0.sol/IDependencyRegistryV0.json +22 -3
  59. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IEngineRegistryV0.sol/IEngineRegistryV0.json +1 -1
  60. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDAExpSettlementV0.sol/IFilteredMinterDAExpSettlementV0.json +1 -1
  61. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDAExpSettlementV1.sol/IFilteredMinterDAExpSettlementV1.json +1 -1
  62. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDAExpSettlement_Mixin.sol/IFilteredMinterDAExpSettlement_Mixin.json +1 -1
  63. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDAExpV0.sol/IFilteredMinterDAExpV0.json +1 -1
  64. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDAExpV1.sol/IFilteredMinterDAExpV1.json +1 -1
  65. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDALinV0.sol/IFilteredMinterDALinV0.json +1 -1
  66. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDALinV1.sol/IFilteredMinterDALinV1.json +1 -1
  67. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterHolderV0.sol/IFilteredMinterHolderV0.json +1 -1
  68. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterHolderV1.sol/IFilteredMinterHolderV1.json +1 -1
  69. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterHolderV2.sol/IFilteredMinterHolderV2.json +1 -1
  70. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterMerkleV0.sol/IFilteredMinterMerkleV0.json +1 -1
  71. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterMerkleV1.sol/IFilteredMinterMerkleV1.json +1 -1
  72. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterMerkleV2.sol/IFilteredMinterMerkleV2.json +1 -1
  73. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterSEAV0.sol/IFilteredMinterSEAV0.json +1 -1
  74. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterV0.sol/IFilteredMinterV0.json +1 -1
  75. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterV1.sol/IFilteredMinterV1.json +1 -1
  76. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterV2.sol/IFilteredMinterV2.json +1 -1
  77. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreContractExposesHashSeed.sol/IGenArt721CoreContractExposesHashSeed.json +1 -1
  78. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreContractV1.sol/IGenArt721CoreContractV1.json +1 -1
  79. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreContractV3.sol/IGenArt721CoreContractV3.json +1 -1
  80. package/artifacts/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3WithSharedRandomizer.sol/IGenArt721CoreContractV3WithSharedRandomizer.json +24 -0
  81. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreContractV3_Base.sol/IGenArt721CoreContractV3_Base.json +1 -1
  82. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreContractV3_Engine.sol/IGenArt721CoreContractV3_Engine.json +1 -1
  83. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreContractV3_Engine_Flex.sol/IGenArt721CoreContractV3_Engine_Flex.json +1 -1
  84. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreV2_PBAB.sol/IGenArt721CoreV2_PBAB.json +1 -1
  85. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IManifold.sol/IManifold.json +1 -1
  86. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IMinterBaseV0.sol/IMinterBaseV0.json +1 -1
  87. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IMinterFilterV0.sol/IMinterFilterV0.json +1 -1
  88. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IMinterFilterV1.sol/IMinterFilterV1.json +104 -19
  89. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IMintingAPICoreV0.sol/IMintingAPICoreV0.json +1 -1
  90. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IMintingAPIMinterV0.sol/IMintingAPIMinterV0.json +1 -1
  91. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IPseudorandomAtomic.sol/IPseudorandomAtomic.json +1 -1
  92. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IRandomizer.sol/IRandomizer.json +1 -1
  93. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IRandomizerPolyptychV0.sol/IRandomizerPolyptychV0.json +1 -1
  94. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IRandomizerV2.sol/IRandomizerV2.json +1 -1
  95. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IRandomizer_V3CoreBase.sol/IRandomizer_V3CoreBase.json +1 -1
  96. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterDAExpSettlementV0.sol/ISharedMinterDAExpSettlementV0.json +114 -0
  97. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterDAExpV0.sol/ISharedMinterDAExpV0.json +37 -0
  98. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterDALinV0.sol/ISharedMinterDALinV0.json +37 -0
  99. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterDAV0.sol/ISharedMinterDAV0.json +50 -0
  100. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterHolderERC20V0.sol/ISharedMinterHolderERC20V0.json +158 -0
  101. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterHolderV0.sol/ISharedMinterHolderV0.json +128 -0
  102. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterMerkleV0.sol/ISharedMinterMerkleV0.json +97 -0
  103. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterSEAV0.sol/ISharedMinterSEAV0.json +29 -0
  104. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterSimplePurchaseV0.sol/ISharedMinterSimplePurchaseV0.json +64 -0
  105. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterV0.sol/ISharedMinterV0.json +117 -0
  106. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/ISharedRandomizerV0.sol/ISharedRandomizerV0.json +52 -36
  107. package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IWETH.sol/IWETH.json +1 -1
  108. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/Address.json +2 -2
  109. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/Counters.json +2 -2
  110. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/CustomERC721Metadata.json +2 -2
  111. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/ERC721.json +2 -2
  112. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/ERC721Enumerable.json +2 -2
  113. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/GenArt721CoreV1.json +2 -2
  114. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/SafeMath.json +2 -2
  115. package/artifacts/contracts/legacy/GenArt721CoreV1.sol/Strings.json +2 -2
  116. package/artifacts/contracts/legacy/GenArt721LegacyMinter.sol/GenArt721LegacyMinter.json +2 -2
  117. package/artifacts/contracts/libs/integration-refs/delegation-registry/DelegationRegistry.sol/DelegationRegistry.json +2 -2
  118. package/artifacts/contracts/libs/{0.5.x → v0.5.x}/CustomERC721Metadata.sol/CustomERC721Metadata.json +3 -3
  119. package/artifacts/contracts/libs/{0.5.x → v0.5.x}/IERC20.sol/IERC20.json +1 -1
  120. package/artifacts/contracts/libs/{0.5.x → v0.5.x}/SafeMath.sol/SafeMath.json +3 -3
  121. package/artifacts/contracts/libs/{0.5.x → v0.5.x}/Strings.sol/Strings.json +3 -3
  122. package/artifacts/contracts/libs/v0.8.x/ABHelpers.sol/ABHelpers.json +10 -0
  123. package/artifacts/contracts/libs/v0.8.x/AuthLib.sol/AuthLib.json +10 -0
  124. package/artifacts/contracts/libs/{0.8.x → v0.8.x}/BytecodeStorageV0.sol/BytecodeStorage.json +3 -3
  125. package/artifacts/contracts/libs/{0.8.x → v0.8.x}/BytecodeStorageV1.sol/BytecodeStorageReader.json +3 -3
  126. package/artifacts/contracts/libs/{0.8.x → v0.8.x}/BytecodeStorageV1.sol/BytecodeStorageWriter.json +3 -3
  127. package/artifacts/contracts/libs/{0.8.x → v0.8.x}/Bytes32Strings.sol/Bytes32Strings.json +3 -3
  128. package/artifacts/contracts/libs/{0.8.x → v0.8.x}/ERC721_PackedHashSeed.sol/ERC721_PackedHashSeed.json +3 -3
  129. package/artifacts/contracts/libs/{0.8.x → v0.8.x}/SSTORE2.sol/SSTORE2.json +3 -3
  130. package/artifacts/contracts/libs/v0.8.x/minter-libs/DAExpLib.sol/DAExpLib.json +67 -0
  131. package/artifacts/contracts/libs/v0.8.x/minter-libs/DALib.sol/DALib.json +30 -0
  132. package/artifacts/contracts/libs/v0.8.x/minter-libs/DALinLib.sol/DALinLib.json +67 -0
  133. package/artifacts/contracts/libs/v0.8.x/minter-libs/GenericMinterEventsLib.sol/GenericMinterEventsLib.json +346 -0
  134. package/artifacts/contracts/libs/v0.8.x/minter-libs/MaxInvocationsLib.sol/MaxInvocationsLib.json +36 -0
  135. package/artifacts/contracts/libs/v0.8.x/minter-libs/MerkleLib.sol/MerkleLib.json +37 -0
  136. package/artifacts/contracts/libs/v0.8.x/minter-libs/PolyptychLib.sol/PolyptychLib.json +10 -0
  137. package/artifacts/contracts/libs/v0.8.x/minter-libs/SEALib.sol/SEALib.json +261 -0
  138. package/artifacts/contracts/libs/v0.8.x/minter-libs/SetPriceLib.sol/SetPriceLib.json +55 -0
  139. package/artifacts/contracts/libs/v0.8.x/minter-libs/SettlementExpLib.sol/SettlementExpLib.json +48 -0
  140. package/artifacts/contracts/libs/v0.8.x/minter-libs/SplitFundsLib.sol/SplitFundsLib.json +42 -0
  141. package/artifacts/contracts/libs/v0.8.x/minter-libs/TokenHolderLib.sol/TokenHolderLib.json +86 -0
  142. package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV0.sol/MinterFilterV0.json +2 -2
  143. package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV1.sol/MinterFilterV1.json +2 -2
  144. package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV2.sol/MinterFilterV2.json +96 -40
  145. package/artifacts/contracts/minter-suite/Minters/MinterDAExpHolderV5.sol/MinterDAExpHolderV5.json +662 -0
  146. package/artifacts/contracts/minter-suite/Minters/MinterDAExpSettlementV2.sol/MinterDAExpSettlementV2.json +2 -20
  147. package/artifacts/contracts/minter-suite/Minters/MinterDAExpSettlementV3.sol/MinterDAExpSettlementV3.json +619 -0
  148. package/artifacts/contracts/minter-suite/Minters/MinterDAExpV4.sol/MinterDAExpV4.json +2 -2
  149. package/artifacts/contracts/minter-suite/Minters/MinterDAExpV5.sol/MinterDAExpV5.json +418 -0
  150. package/artifacts/contracts/minter-suite/Minters/MinterDALinHolderV5.sol/MinterDALinHolderV5.json +662 -0
  151. package/artifacts/contracts/minter-suite/Minters/MinterDALinV4.sol/MinterDALinV4.json +2 -2
  152. package/artifacts/contracts/minter-suite/Minters/MinterDALinV5.sol/MinterDALinV5.json +418 -0
  153. package/artifacts/contracts/minter-suite/Minters/MinterHolderV4.sol/MinterHolderV4.json +2 -2
  154. package/artifacts/contracts/minter-suite/Minters/MinterMerkleV5.sol/MinterMerkleV5.json +2 -2
  155. package/artifacts/contracts/minter-suite/Minters/MinterPolyptychV0.sol/MinterPolyptychV0.json +2 -2
  156. package/artifacts/contracts/minter-suite/Minters/MinterSEAV0.sol/MinterSEAV0.json +2 -2
  157. package/artifacts/contracts/minter-suite/Minters/MinterSEAV1.sol/MinterSEAV1.json +659 -0
  158. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20V4.sol/MinterSetPriceERC20V4.json +2 -2
  159. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20V5.sol/MinterSetPriceERC20V5.json +452 -0
  160. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceHolderV5.sol/MinterSetPriceHolderV5.json +600 -0
  161. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceMerkleV5.sol/MinterSetPriceMerkleV5.json +633 -0
  162. package/artifacts/contracts/minter-suite/Minters/MinterSetPricePolyptychERC20V5.sol/MinterSetPricePolyptychERC20V5.json +782 -0
  163. package/artifacts/contracts/minter-suite/Minters/MinterSetPricePolyptychV5.sol/MinterSetPricePolyptychV5.json +676 -0
  164. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceV4.sol/MinterSetPriceV4.json +2 -2
  165. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceV5.sol/MinterSetPriceV5.json +356 -0
  166. package/artifacts/contracts/mock/BytecodeV0TextCR_DMock.sol/BytecodeV0TextCR_DMock.json +2 -2
  167. package/artifacts/contracts/mock/BytecodeV1LibCallsMock.sol/BytecodeV1LibCallsMock.json +2 -2
  168. package/artifacts/contracts/mock/BytecodeV1TextCR_DMock.sol/BytecodeV1TextCR_DMock.json +4 -4
  169. package/artifacts/contracts/mock/DeadReceiverBidderMock.sol/DeadReceiverBidderMock.json +25 -2
  170. package/artifacts/contracts/mock/DummySharedMinter.sol/DummySharedMinter.json +2 -2
  171. package/artifacts/contracts/mock/ERC20Mock.sol/ERC20Mock.json +28 -2
  172. package/artifacts/contracts/mock/GenArt721CoreV3_Engine_IncorrectCoreType.sol/GenArt721CoreV3_Engine_IncorrectCoreType.json +6 -11
  173. package/artifacts/contracts/mock/MockAdminACLV0.sol/MockAdminACLV0Events.json +2 -2
  174. package/artifacts/contracts/mock/MockAdminACLV0_PROHIBITION.sol/MockAdminACLV0Events_PROHIBITION.json +2 -2
  175. package/artifacts/contracts/mock/OriginRegisterMock.sol/OriginRegisterMock.json +2 -2
  176. package/artifacts/contracts/mock/RandomizerV2_NoAssignMock.sol/RandomizerV2_NoAssignMock.json +2 -2
  177. package/artifacts/contracts/mock/ReentrancyHolderMock.sol/ReentrancyHolderMock.json +2 -2
  178. package/artifacts/contracts/mock/ReentrancyHolderMockShared.sol/ReentrancyHolderMockShared.json +136 -0
  179. package/artifacts/contracts/mock/ReentrancyMerkleMock.sol/ReentrancyMerkleMock.json +2 -2
  180. package/artifacts/contracts/mock/ReentrancyMerkleMockShared.sol/ReentrancyMerkleMockShared.json +105 -0
  181. package/artifacts/contracts/mock/ReentrancyMock.sol/ReentrancyMock.json +2 -2
  182. package/artifacts/contracts/mock/ReentrancyMockShared.sol/ReentrancyMockShared.json +100 -0
  183. package/artifacts/contracts/mock/ReentrancySEAMock.sol/ReentrancySEAAutoBidderMock.json +2 -2
  184. package/artifacts/contracts/mock/ReentrancySEAMockShared.sol/ReentrancySEAAutoBidderMockShared.json +69 -0
  185. package/artifacts/contracts/mock/SSTORE2Mock.sol/SSTORE2Mock.json +2 -2
  186. package/artifacts/contracts/randomizer/deprecated/BasicRandomizer.sol/BasicRandomizer.json +2 -2
  187. package/artifacts/contracts/randomizer/deprecated/PolyptychRandomizerV0.sol/BasicPolyptychRandomizerV0.json +2 -2
  188. package/artifacts/contracts/randomizer/deprecated/RandomizerV2.sol/BasicRandomizerV2.json +2 -2
  189. package/artifacts/contracts/randomizer/primitive/PseudorandomAtomicBasic.sol/PseudorandomAtomic.json +2 -2
  190. package/artifacts/contracts/randomizer/shared/SharedRandomizerV0.sol/SharedRandomizerV0.json +58 -42
  191. package/artifacts/contracts/royalty-registry/GenArt721RoyaltyOverride.sol/GenArt721RoyaltyOverride.json +2 -2
  192. package/artifacts/contracts/royalty-registry/GenArt721RoyaltyOverride_PBAB.sol/GenArt721RoyaltyOverride_PBAB.json +2 -2
  193. package/contracts/AdminACLV0.sol +1 -1
  194. package/contracts/AdminACLV1.sol +1 -1
  195. package/contracts/DependencyRegistryV0.sol +300 -123
  196. package/contracts/GenArt721CoreV3.sol +27 -12
  197. package/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV0.sol +3 -3
  198. package/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV1.sol +3 -3
  199. package/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV2.sol +3 -3
  200. package/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV3.sol +3 -3
  201. package/contracts/archive/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol +3 -3
  202. package/contracts/archive/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV1.sol +3 -3
  203. package/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV0.sol +3 -3
  204. package/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV1.sol +3 -3
  205. package/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV2.sol +3 -3
  206. package/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV3.sol +3 -3
  207. package/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV0.sol +3 -3
  208. package/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV1.sol +3 -3
  209. package/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV2.sol +4 -4
  210. package/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV3.sol +4 -4
  211. package/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV0.sol +3 -3
  212. package/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV1.sol +3 -3
  213. package/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV2.sol +4 -4
  214. package/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV3.sol +4 -4
  215. package/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV4.sol +4 -4
  216. package/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV0.sol +3 -3
  217. package/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV1.sol +3 -3
  218. package/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV2.sol +3 -3
  219. package/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV3.sol +3 -3
  220. package/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V0.sol +3 -3
  221. package/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V1.sol +3 -3
  222. package/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V2.sol +3 -3
  223. package/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V3.sol +3 -3
  224. package/contracts/archive/readme.md +16 -0
  225. package/contracts/engine/README.md +21 -0
  226. package/contracts/engine/V2/GenArt721CoreV2_ENGINE_FLEX.sol +2 -2
  227. package/contracts/engine/V2/GenArt721CoreV2_PBAB.sol +2 -2
  228. package/contracts/engine/V2/GenArt721CoreV2_PRTNR.sol +3 -3
  229. package/contracts/engine/V2/GenArt721MinterBurner_PBAB.sol +2 -2
  230. package/contracts/engine/V2/GenArt721MinterDAExp_PBAB.sol +1 -1
  231. package/contracts/engine/V2/GenArt721Minter_PBAB.sol +2 -2
  232. package/contracts/engine/V3/GenArt721CoreV3_Engine.sol +31 -22
  233. package/contracts/engine/V3/GenArt721CoreV3_Engine_Flex.sol +31 -22
  234. package/contracts/engine/V3/forks/GenArt721CoreV3_Engine_Flex_PROOF.sol +12 -18
  235. package/contracts/engine/V3/forks/PROHIBITION/AdminACLV0_PROHIBITION.sol +1 -1
  236. package/contracts/engine/V3/forks/PROHIBITION/GenArt721CoreV3_Engine_Flex_PROHIBITION.sol +23 -24
  237. package/contracts/engine/V3/forks/PROHIBITION/interfaces/IAdminACLV0_PROHIBITION.sol +1 -1
  238. package/contracts/engine/V3/forks/PROHIBITION/interfaces/IGenArt721CoreContractV3_Engine_Flex_PROHIBITION.sol +1 -1
  239. package/contracts/engine-registry/CoreRegistryV1.sol +58 -65
  240. package/contracts/engine-registry/EngineRegistryV0.sol +1 -1
  241. package/contracts/explorations/GenArt721CoreV3_Explorations.sol +27 -12
  242. package/contracts/interfaces/{0.8.x → v0.8.x}/ICoreRegistryV1.sol +6 -8
  243. package/contracts/interfaces/{0.8.x → v0.8.x}/IDependencyRegistryV0.sol +5 -2
  244. package/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3WithSharedRandomizer.sol +23 -0
  245. package/contracts/interfaces/{0.8.x → v0.8.x}/IMinterFilterV1.sol +45 -19
  246. package/contracts/interfaces/v0.8.x/IRandomizer_V3CoreBase.sol +23 -0
  247. package/contracts/interfaces/v0.8.x/ISharedMinterDAExpSettlementV0.sol +28 -0
  248. package/contracts/interfaces/v0.8.x/ISharedMinterDAExpV0.sol +12 -0
  249. package/contracts/interfaces/v0.8.x/ISharedMinterDALinV0.sol +12 -0
  250. package/contracts/interfaces/v0.8.x/ISharedMinterDAV0.sol +13 -0
  251. package/contracts/interfaces/v0.8.x/ISharedMinterHolderERC20V0.sol +47 -0
  252. package/contracts/interfaces/v0.8.x/ISharedMinterHolderV0.sol +41 -0
  253. package/contracts/interfaces/v0.8.x/ISharedMinterMerkleV0.sol +34 -0
  254. package/contracts/interfaces/v0.8.x/ISharedMinterSEAV0.sol +15 -0
  255. package/contracts/interfaces/v0.8.x/ISharedMinterSimplePurchaseV0.sol +28 -0
  256. package/contracts/interfaces/v0.8.x/ISharedMinterV0.sol +43 -0
  257. package/contracts/interfaces/v0.8.x/ISharedRandomizerV0.sol +123 -0
  258. package/contracts/legacy/GenArt721CoreV1.sol +2 -2
  259. package/contracts/legacy/GenArt721LegacyMinter.sol +5 -5
  260. package/contracts/libs/integration-refs/delegation-registry/DelegationRegistry.sol +1 -1
  261. package/contracts/libs/v0.8.x/ABHelpers.sol +55 -0
  262. package/contracts/libs/v0.8.x/AuthLib.sol +196 -0
  263. package/contracts/libs/{0.8.x → v0.8.x}/Bytes32Strings.sol +5 -5
  264. package/contracts/libs/v0.8.x/minter-libs/DAExpLib.sol +250 -0
  265. package/contracts/libs/v0.8.x/minter-libs/DALib.sol +26 -0
  266. package/contracts/libs/v0.8.x/minter-libs/DALinLib.sol +216 -0
  267. package/contracts/libs/v0.8.x/minter-libs/GenericMinterEventsLib.sol +171 -0
  268. package/contracts/libs/v0.8.x/minter-libs/MaxInvocationsLib.sol +488 -0
  269. package/contracts/libs/v0.8.x/minter-libs/MerkleLib.sol +384 -0
  270. package/contracts/libs/v0.8.x/minter-libs/PolyptychLib.sol +240 -0
  271. package/contracts/libs/v0.8.x/minter-libs/SEALib.sol +995 -0
  272. package/contracts/libs/v0.8.x/minter-libs/SetPriceLib.sol +166 -0
  273. package/contracts/libs/v0.8.x/minter-libs/SettlementExpLib.sol +770 -0
  274. package/contracts/libs/v0.8.x/minter-libs/SplitFundsLib.sol +741 -0
  275. package/contracts/libs/v0.8.x/minter-libs/TokenHolderLib.sol +291 -0
  276. package/contracts/minter-suite/MinterFilter/MinterFilterV0.sol +3 -3
  277. package/contracts/minter-suite/MinterFilter/MinterFilterV1.sol +5 -5
  278. package/contracts/minter-suite/MinterFilter/MinterFilterV2.sol +414 -297
  279. package/contracts/minter-suite/Minters/MinterBase_v0_1_1.sol +4 -4
  280. package/contracts/minter-suite/Minters/MinterDAExpHolderV5.sol +866 -0
  281. package/contracts/minter-suite/Minters/MinterDAExpSettlementV2.sol +4 -57
  282. package/contracts/minter-suite/Minters/MinterDAExpSettlementV3.sol +886 -0
  283. package/contracts/minter-suite/Minters/MinterDAExpV4.sol +3 -3
  284. package/contracts/minter-suite/Minters/MinterDAExpV5.sol +545 -0
  285. package/contracts/minter-suite/Minters/MinterDALinHolderV5.sol +857 -0
  286. package/contracts/minter-suite/Minters/MinterDALinV4.sol +3 -3
  287. package/contracts/minter-suite/Minters/MinterDALinV5.sol +534 -0
  288. package/contracts/minter-suite/Minters/MinterHolderV4.sol +4 -4
  289. package/contracts/minter-suite/Minters/MinterMerkleV5.sol +4 -4
  290. package/contracts/minter-suite/Minters/MinterPolyptychV0.sol +6 -6
  291. package/contracts/minter-suite/Minters/MinterSEAV0.sol +3 -3
  292. package/contracts/minter-suite/Minters/MinterSEAV1.sol +853 -0
  293. package/contracts/minter-suite/Minters/MinterSetPriceERC20V4.sol +5 -5
  294. package/contracts/minter-suite/Minters/MinterSetPriceERC20V5.sol +545 -0
  295. package/contracts/minter-suite/Minters/MinterSetPriceHolderV5.sol +730 -0
  296. package/contracts/minter-suite/Minters/MinterSetPriceMerkleV5.sol +714 -0
  297. package/contracts/minter-suite/Minters/MinterSetPricePolyptychERC20V5.sol +1012 -0
  298. package/contracts/minter-suite/Minters/MinterSetPricePolyptychV5.sol +868 -0
  299. package/contracts/minter-suite/Minters/MinterSetPriceV4.sol +3 -3
  300. package/contracts/minter-suite/Minters/MinterSetPriceV5.sol +414 -0
  301. package/contracts/mock/BytecodeV0TextCR_DMock.sol +1 -1
  302. package/contracts/mock/BytecodeV1LibCallsMock.sol +1 -1
  303. package/contracts/mock/BytecodeV1TextCR_DMock.sol +1 -1
  304. package/contracts/mock/DeadReceiverBidderMock.sol +15 -0
  305. package/contracts/mock/DummySharedMinter.sol +2 -2
  306. package/contracts/mock/ERC20Mock.sol +16 -0
  307. package/contracts/mock/GenArt721CoreV3_Engine_IncorrectCoreType.sol +11 -18
  308. package/contracts/mock/MockAdminACLV0.sol +1 -1
  309. package/contracts/mock/MockAdminACLV0_PROHIBITION.sol +1 -1
  310. package/contracts/mock/OriginRegisterMock.sol +1 -1
  311. package/contracts/mock/ReentrancyHolderMock.sol +1 -1
  312. package/contracts/mock/ReentrancyHolderMockShared.sol +59 -0
  313. package/contracts/mock/ReentrancyMerkleMock.sol +1 -1
  314. package/contracts/mock/ReentrancyMerkleMockShared.sol +58 -0
  315. package/contracts/mock/ReentrancyMock.sol +1 -1
  316. package/contracts/mock/ReentrancyMockShared.sol +48 -0
  317. package/contracts/mock/ReentrancySEAMock.sol +1 -1
  318. package/contracts/mock/ReentrancySEAMockShared.sol +40 -0
  319. package/contracts/mock/SSTORE2Mock.sol +1 -1
  320. package/contracts/randomizer/deprecated/BasicRandomizer.sol +1 -1
  321. package/contracts/randomizer/deprecated/PolyptychRandomizerV0.sol +2 -2
  322. package/contracts/randomizer/deprecated/RandomizerV2.sol +2 -2
  323. package/contracts/randomizer/primitive/PseudorandomAtomicBasic.sol +1 -1
  324. package/contracts/randomizer/shared/SharedRandomizerV0.sol +134 -111
  325. package/contracts/royalty-registry/GenArt721RoyaltyOverride.sol +2 -2
  326. package/contracts/royalty-registry/GenArt721RoyaltyOverride_PBAB.sol +2 -2
  327. package/package.json +57 -36
  328. package/LICENSE +0 -165
  329. package/contracts/interfaces/0.8.x/IRandomizer_V3CoreBase.sol +0 -10
  330. package/contracts/interfaces/0.8.x/ISharedRandomizerV0.sol +0 -105
  331. /package/contracts/interfaces/{0.5.x → v0.5.x}/IBonusContract.sol +0 -0
  332. /package/contracts/interfaces/{0.5.x → v0.5.x}/IGenArt721CoreContractV1.sol +0 -0
  333. /package/contracts/interfaces/{0.5.x → v0.5.x}/IGenArt721CoreV2_PBAB.sol +0 -0
  334. /package/contracts/interfaces/{0.5.x → v0.5.x}/IRandomizer.sol +0 -0
  335. /package/contracts/interfaces/{0.8.x → v0.8.x}/IAdminACLV0.sol +0 -0
  336. /package/contracts/interfaces/{0.8.x → v0.8.x}/IArtblocksRoyaltyOverride.sol +0 -0
  337. /package/contracts/interfaces/{0.8.x → v0.8.x}/IBonusContract.sol +0 -0
  338. /package/contracts/interfaces/{0.8.x → v0.8.x}/IBytecodeStorageReader.sol +0 -0
  339. /package/contracts/interfaces/{0.8.x → v0.8.x}/IDelegationRegistry.sol +0 -0
  340. /package/contracts/interfaces/{0.8.x → v0.8.x}/IDependencyRegistryCompatibleV0.sol +0 -0
  341. /package/contracts/interfaces/{0.8.x → v0.8.x}/IEngineRegistryV0.sol +0 -0
  342. /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDAExpSettlementV0.sol +0 -0
  343. /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDAExpSettlementV1.sol +0 -0
  344. /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDAExpSettlement_Mixin.sol +0 -0
  345. /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDAExpV0.sol +0 -0
  346. /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDAExpV1.sol +0 -0
  347. /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDALinV0.sol +0 -0
  348. /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDALinV1.sol +0 -0
  349. /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterHolderV0.sol +0 -0
  350. /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterHolderV1.sol +0 -0
  351. /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterHolderV2.sol +0 -0
  352. /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterMerkleV0.sol +0 -0
  353. /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterMerkleV1.sol +0 -0
  354. /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterMerkleV2.sol +0 -0
  355. /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterSEAV0.sol +0 -0
  356. /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterV0.sol +0 -0
  357. /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterV1.sol +0 -0
  358. /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterV2.sol +0 -0
  359. /package/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreContractExposesHashSeed.sol +0 -0
  360. /package/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreContractV1.sol +0 -0
  361. /package/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreContractV3.sol +0 -0
  362. /package/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreContractV3_Base.sol +0 -0
  363. /package/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreContractV3_Engine.sol +0 -0
  364. /package/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreContractV3_Engine_Flex.sol +0 -0
  365. /package/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreV2_PBAB.sol +0 -0
  366. /package/contracts/interfaces/{0.8.x → v0.8.x}/IManifold.sol +0 -0
  367. /package/contracts/interfaces/{0.8.x → v0.8.x}/IMinterBaseV0.sol +0 -0
  368. /package/contracts/interfaces/{0.8.x → v0.8.x}/IMinterFilterV0.sol +0 -0
  369. /package/contracts/interfaces/{0.8.x → v0.8.x}/IMintingAPICoreV0.sol +0 -0
  370. /package/contracts/interfaces/{0.8.x → v0.8.x}/IMintingAPIMinterV0.sol +0 -0
  371. /package/contracts/interfaces/{0.8.x → v0.8.x}/IPseudorandomAtomic.sol +0 -0
  372. /package/contracts/interfaces/{0.8.x → v0.8.x}/IRandomizer.sol +0 -0
  373. /package/contracts/interfaces/{0.8.x → v0.8.x}/IRandomizerPolyptychV0.sol +0 -0
  374. /package/contracts/interfaces/{0.8.x → v0.8.x}/IRandomizerV2.sol +0 -0
  375. /package/contracts/interfaces/{0.8.x → v0.8.x}/IWETH.sol +0 -0
  376. /package/contracts/libs/{0.5.x → v0.5.x}/CustomERC721Metadata.sol +0 -0
  377. /package/contracts/libs/{0.5.x → v0.5.x}/IERC20.sol +0 -0
  378. /package/contracts/libs/{0.5.x → v0.5.x}/SafeMath.sol +0 -0
  379. /package/contracts/libs/{0.5.x → v0.5.x}/Strings.sol +0 -0
  380. /package/contracts/libs/{0.8.x → v0.8.x}/BytecodeStorageV0.sol +0 -0
  381. /package/contracts/libs/{0.8.x → v0.8.x}/BytecodeStorageV1.sol +0 -0
  382. /package/contracts/libs/{0.8.x → v0.8.x}/ERC721_PackedHashSeed.sol +0 -0
  383. /package/contracts/libs/{0.8.x → v0.8.x}/SSTORE2.sol +0 -0
@@ -0,0 +1,741 @@
1
+ // SPDX-License-Identifier: LGPL-3.0-only
2
+ // Created By: Art Blocks Inc.
3
+
4
+ pragma solidity ^0.8.0;
5
+
6
+ import {IMinterBaseV0} from "../../../interfaces/v0.8.x/IMinterBaseV0.sol";
7
+ import {IGenArt721CoreContractV3_Base} from "../../../interfaces/v0.8.x/IGenArt721CoreContractV3_Base.sol";
8
+ import {IGenArt721CoreContractV3} from "../../../interfaces/v0.8.x/IGenArt721CoreContractV3.sol";
9
+ import {IGenArt721CoreContractV3_Engine} from "../../../interfaces/v0.8.x/IGenArt721CoreContractV3_Engine.sol";
10
+
11
+ import {IERC20} from "@openzeppelin-4.7/contracts/token/ERC20/IERC20.sol";
12
+
13
+ /**
14
+ * @title Art Blocks Split Funds Library
15
+ * @notice This library is designed for the Art Blocks platform. It splits
16
+ * Ether (ETH) and ERC20 token funds among stakeholders, such as sender
17
+ * (if refund is applicable), providers, artists, and artists' additional
18
+ * payees.
19
+ * @author Art Blocks Inc.
20
+ */
21
+
22
+ library SplitFundsLib {
23
+ /**
24
+ * @notice Currency updated for project `projectId` to symbol
25
+ * `currencySymbol` and address `currencyAddress`.
26
+ * @param projectId Project ID currency was updated for
27
+ * @param coreContract Core contract address currency was updated for
28
+ * @param currencyAddress Currency address
29
+ * @param currencySymbol Currency symbol
30
+ */
31
+ event ProjectCurrencyInfoUpdated(
32
+ uint256 indexed projectId,
33
+ address indexed coreContract,
34
+ address indexed currencyAddress,
35
+ string currencySymbol
36
+ );
37
+
38
+ // position of Split Funds Lib storage, using a diamond storage pattern
39
+ // for this library
40
+ bytes32 constant SPLIT_FUNDS_LIB_STORAGE_POSITION =
41
+ keccak256("splitfundslib.storage");
42
+
43
+ // contract-level variables
44
+ struct IsEngineCache {
45
+ bool isEngine;
46
+ bool isCached;
47
+ }
48
+
49
+ // project-level variables
50
+ struct SplitFundsProjectConfig {
51
+ address currencyAddress; // address(0) if ETH
52
+ string currencySymbol; // Assumed to be ETH if null
53
+ }
54
+
55
+ // Diamond storage pattern is used in this library
56
+ struct SplitFundsLibStorage {
57
+ mapping(address coreContract => mapping(uint256 projectId => SplitFundsProjectConfig)) splitFundsProjectConfigs;
58
+ mapping(address coreContract => IsEngineCache) isEngineCacheConfigs;
59
+ }
60
+
61
+ /**
62
+ * @notice splits ETH funds between sender (if refund), providers,
63
+ * artist, and artist's additional payee for a token purchased on
64
+ * project `projectId`.
65
+ * WARNING: This function uses msg.value and msg.sender to determine
66
+ * refund amounts, and therefore may not be applicable to all use cases
67
+ * (e.g. do not use with Dutch Auctions with on-chain settlement).
68
+ * @dev This function relies on msg.sender and msg.value, so it must be
69
+ * called directly from the contract that is receiving the payment.
70
+ * @dev possible DoS during splits is acknowledged, and mitigated by
71
+ * business practices, including end-to-end testing on mainnet, and
72
+ * admin-accepted artist payment addresses.
73
+ * @param projectId Project ID for which funds shall be split.
74
+ * @param pricePerTokenInWei Current price of token, in Wei.
75
+ * @param coreContract Address of the GenArt721CoreContract associated
76
+ * with the project.
77
+ */
78
+ function splitFundsETHRefundSender(
79
+ uint256 projectId,
80
+ uint256 pricePerTokenInWei,
81
+ address coreContract
82
+ ) internal {
83
+ if (msg.value > 0) {
84
+ // send refund to sender
85
+ uint256 refund = msg.value - pricePerTokenInWei;
86
+ if (refund > 0) {
87
+ (bool success_, ) = msg.sender.call{value: refund}("");
88
+ require(success_, "Refund failed");
89
+ }
90
+ // split revenues
91
+ splitRevenuesETHNoRefund({
92
+ projectId: projectId,
93
+ valueInWei: pricePerTokenInWei,
94
+ coreContract: coreContract
95
+ });
96
+ }
97
+ }
98
+
99
+ /**
100
+ * @notice Splits ETH revenues between providers, artist, and artist's
101
+ * additional payee for revenue generated by project `projectId`.
102
+ * This function does NOT refund msg.sender, and does NOT use msg.value
103
+ * when determining the value to be split.
104
+ * @dev possible DoS during splits is acknowledged, and mitigated by
105
+ * business practices, including end-to-end testing on mainnet, and
106
+ * admin-accepted artist payment addresses.
107
+ * @param projectId Project ID for which funds shall be split.
108
+ * @param valueInWei Value to be split, in Wei.
109
+ * @param coreContract Address of the GenArt721CoreContract
110
+ * associated with the project.
111
+ */
112
+ function splitRevenuesETHNoRefund(
113
+ uint256 projectId,
114
+ uint256 valueInWei,
115
+ address coreContract
116
+ ) internal {
117
+ if (valueInWei == 0) {
118
+ return; // return early
119
+ }
120
+ // split funds between platforms, artist, and artist's
121
+ // additional payee
122
+ bool isEngine_ = isEngine(coreContract);
123
+ uint256 renderProviderRevenue;
124
+ address payable renderProviderAddress;
125
+ uint256 platformProviderRevenue;
126
+ address payable platformProviderAddress;
127
+ uint256 artistRevenue;
128
+ address payable artistAddress;
129
+ uint256 additionalPayeePrimaryRevenue;
130
+ address payable additionalPayeePrimaryAddress;
131
+ if (isEngine_) {
132
+ // get engine splits
133
+ (
134
+ renderProviderRevenue,
135
+ renderProviderAddress,
136
+ platformProviderRevenue,
137
+ platformProviderAddress,
138
+ artistRevenue,
139
+ artistAddress,
140
+ additionalPayeePrimaryRevenue,
141
+ additionalPayeePrimaryAddress
142
+ ) = IGenArt721CoreContractV3_Engine(coreContract)
143
+ .getPrimaryRevenueSplits({
144
+ _projectId: projectId,
145
+ _price: valueInWei
146
+ });
147
+ } else {
148
+ // get flagship splits
149
+ // @dev note that platformProviderAddress and
150
+ // platformProviderRevenue remain 0 for flagship
151
+ (
152
+ renderProviderRevenue, // artblocks revenue
153
+ renderProviderAddress, // artblocks address
154
+ artistRevenue,
155
+ artistAddress,
156
+ additionalPayeePrimaryRevenue,
157
+ additionalPayeePrimaryAddress
158
+ ) = IGenArt721CoreContractV3(coreContract).getPrimaryRevenueSplits({
159
+ _projectId: projectId,
160
+ _price: valueInWei
161
+ });
162
+ }
163
+ // require total revenue split is 100%
164
+ // @dev note that platformProviderRevenue remains 0 for flagship
165
+ require(
166
+ renderProviderRevenue +
167
+ platformProviderRevenue +
168
+ artistRevenue +
169
+ additionalPayeePrimaryRevenue ==
170
+ valueInWei,
171
+ "Invalid revenue split totals"
172
+ );
173
+ // distribute revenues
174
+ // @dev note that platformProviderAddress and platformProviderRevenue
175
+ // remain 0 for flagship
176
+ _sendPaymentsETH({
177
+ platformProviderRevenue: platformProviderRevenue,
178
+ platformProviderAddress: platformProviderAddress,
179
+ renderProviderRevenue: renderProviderRevenue,
180
+ renderProviderAddress: renderProviderAddress,
181
+ artistRevenue: artistRevenue,
182
+ artistAddress: artistAddress,
183
+ additionalPayeePrimaryRevenue: additionalPayeePrimaryRevenue,
184
+ additionalPayeePrimaryAddress: additionalPayeePrimaryAddress
185
+ });
186
+ }
187
+
188
+ /**
189
+ * @notice Splits ERC20 funds between providers, artist, and artist's
190
+ * additional payee, for a token purchased on project `projectId`.
191
+ * The function performs checks to ensure that the ERC20 token is
192
+ * approved for transfer, and that a non-zero ERC20 token address is
193
+ * configured.
194
+ * @dev This function relies on msg.sender, so it must be
195
+ * called directly from the contract that is receiving the payment.
196
+ * @dev possible DoS during splits is acknowledged, and mitigated by
197
+ * business practices, including end-to-end testing on mainnet, and
198
+ * admin-accepted artist payment addresses.
199
+ * @param projectId Project ID for which funds shall be split.
200
+ * @param pricePerToken Current price of token, no decimals.
201
+ * @param coreContract Core contract address.
202
+ */
203
+ function splitFundsERC20(
204
+ uint256 projectId,
205
+ uint256 pricePerToken,
206
+ address coreContract
207
+ ) internal {
208
+ if (pricePerToken == 0) {
209
+ return; // nothing to split, return early
210
+ }
211
+ IERC20 projectCurrency;
212
+ // block scope to avoid stack too deep error
213
+ {
214
+ SplitFundsProjectConfig
215
+ storage splitFundsProjectConfig = getSplitFundsProjectConfig({
216
+ projectId: projectId,
217
+ coreContract: coreContract
218
+ });
219
+ address currencyAddress = splitFundsProjectConfig.currencyAddress;
220
+ require(
221
+ currencyAddress != address(0),
222
+ "ERC20: payment not configured"
223
+ );
224
+ require(msg.value == 0, "ERC20: No ETH when using ERC20");
225
+ // ERC20 token is used for payment
226
+ validateERC20Approvals({
227
+ msgSender: msg.sender,
228
+ currencyAddress: currencyAddress,
229
+ pricePerToken: pricePerToken
230
+ });
231
+ projectCurrency = IERC20(currencyAddress);
232
+ }
233
+ // split remaining funds between foundation, artist, and artist's
234
+ bool isEngine_ = isEngine(coreContract);
235
+ uint256 renderProviderRevenue;
236
+ address payable renderProviderAddress;
237
+ uint256 platformProviderRevenue;
238
+ address payable platformProviderAddress;
239
+ uint256 artistRevenue;
240
+ address payable artistAddress;
241
+ uint256 additionalPayeePrimaryRevenue;
242
+ address payable additionalPayeePrimaryAddress;
243
+ if (isEngine_) {
244
+ // get engine splits
245
+ (
246
+ renderProviderRevenue,
247
+ renderProviderAddress,
248
+ platformProviderRevenue,
249
+ platformProviderAddress,
250
+ artistRevenue,
251
+ artistAddress,
252
+ additionalPayeePrimaryRevenue,
253
+ additionalPayeePrimaryAddress
254
+ ) = IGenArt721CoreContractV3_Engine(coreContract)
255
+ .getPrimaryRevenueSplits({
256
+ _projectId: projectId,
257
+ _price: pricePerToken
258
+ });
259
+ } else {
260
+ // get flagship splits
261
+ // @dev note that platformProviderAddress and
262
+ // platformProviderRevenue remain 0 for flagship
263
+ (
264
+ renderProviderRevenue, // artblocks revenue
265
+ renderProviderAddress, // artblocks address
266
+ artistRevenue,
267
+ artistAddress,
268
+ additionalPayeePrimaryRevenue,
269
+ additionalPayeePrimaryAddress
270
+ ) = IGenArt721CoreContractV3(coreContract).getPrimaryRevenueSplits({
271
+ _projectId: projectId,
272
+ _price: pricePerToken
273
+ });
274
+ }
275
+ // require total revenue split is 100%
276
+ // @dev note that platformProviderRevenue remains 0 for flagship
277
+ require(
278
+ renderProviderRevenue +
279
+ platformProviderRevenue +
280
+ artistRevenue +
281
+ additionalPayeePrimaryRevenue ==
282
+ pricePerToken,
283
+ "Invalid revenue split totals"
284
+ );
285
+ // distribute revenues
286
+ // @dev note that platformProviderAddress and platformProviderRevenue
287
+ // remain 0 for flagship
288
+ _sendPaymentsERC20({
289
+ projectCurrency: projectCurrency,
290
+ platformProviderRevenue: platformProviderRevenue,
291
+ platformProviderAddress: platformProviderAddress,
292
+ renderProviderRevenue: renderProviderRevenue,
293
+ renderProviderAddress: renderProviderAddress,
294
+ artistRevenue: artistRevenue,
295
+ artistAddress: artistAddress,
296
+ additionalPayeePrimaryRevenue: additionalPayeePrimaryRevenue,
297
+ additionalPayeePrimaryAddress: additionalPayeePrimaryAddress
298
+ });
299
+ }
300
+
301
+ /**
302
+ * @notice Updates payment currency of the referenced
303
+ * SplitFundsProjectConfig to be `currencySymbol` at address
304
+ * `currencyAddress`.
305
+ * Only supports setting currency info of ERC20 tokens.
306
+ * Returns bool that is true if the price should be reset after this
307
+ * update. Price is recommended to be reset if the currency address was
308
+ * previously configured, but is now being updated to a different currency
309
+ * address. This is to protect accidental price reductions when changing
310
+ * currency if an artist is changing currencies in an unpaused state.
311
+ * @dev artist-defined currency symbol is used instead of any on-chain
312
+ * currency symbol.
313
+ * @param projectId Project ID to update.
314
+ * @param coreContract Core contract address.
315
+ * @param currencySymbol Currency symbol.
316
+ * @param currencyAddress Currency address.
317
+ * @return recommendPriceReset True if the price should be reset after this
318
+ * update.
319
+ */
320
+ function updateProjectCurrencyInfoERC20(
321
+ uint256 projectId,
322
+ address coreContract,
323
+ string memory currencySymbol,
324
+ address currencyAddress
325
+ ) internal returns (bool recommendPriceReset) {
326
+ // CHECKS
327
+ require(currencyAddress != address(0), "null address, only ERC20");
328
+ require(bytes(currencySymbol).length > 0, "only non-null symbol");
329
+ // EFFECTS
330
+ SplitFundsProjectConfig
331
+ storage splitFundsProjectConfig = getSplitFundsProjectConfig({
332
+ projectId: projectId,
333
+ coreContract: coreContract
334
+ });
335
+ // recommend price reset if currency address was previously configured
336
+ if (splitFundsProjectConfig.currencyAddress != address(0)) {
337
+ recommendPriceReset = true;
338
+ }
339
+ splitFundsProjectConfig.currencySymbol = currencySymbol;
340
+ splitFundsProjectConfig.currencyAddress = currencyAddress;
341
+
342
+ emit ProjectCurrencyInfoUpdated({
343
+ projectId: projectId,
344
+ coreContract: coreContract,
345
+ currencyAddress: currencyAddress,
346
+ currencySymbol: currencySymbol
347
+ });
348
+ }
349
+
350
+ /**
351
+ * @notice Force sends `amount` (in wei) ETH to `to`, with a gas stipend
352
+ * equal to `minterRefundGasLimit`.
353
+ * If sending via the normal procedure fails, force sends the ETH by
354
+ * creating a temporary contract which uses `SELFDESTRUCT` to force send
355
+ * the ETH.
356
+ * Reverts if the current contract has insufficient balance.
357
+ * @param to The address to send ETH to.
358
+ * @param amount The amount of ETH to send.
359
+ * @param minterRefundGasLimit The gas limit to use when sending ETH, prior
360
+ * to fallback.
361
+ * @dev This function is adapted from the `forceSafeTransferETH` function
362
+ * in the `https://github.com/Vectorized/solady` repository, with
363
+ * modifications to not check if the current contract has sufficient
364
+ * balance. Therefore, the contract should be checked for sufficient
365
+ * balance before calling this function in the minter itself, if
366
+ * applicable.
367
+ */
368
+ function forceSafeTransferETH(
369
+ address to,
370
+ uint256 amount,
371
+ uint256 minterRefundGasLimit
372
+ ) internal {
373
+ // Manually inlined because the compiler doesn't inline functions with
374
+ // branches.
375
+ /// @solidity memory-safe-assembly
376
+ assembly {
377
+ // @dev intentionally do not check if this contract has sufficient
378
+ // balance, because that is not intended to be a valid state.
379
+
380
+ // Transfer the ETH and check if it succeeded or not.
381
+ if iszero(call(minterRefundGasLimit, to, amount, 0, 0, 0, 0)) {
382
+ // if the transfer failed, we create a temporary contract with
383
+ // initialization code that uses `SELFDESTRUCT` to force send
384
+ // the ETH.
385
+ // note: Compatible with `SENDALL`:
386
+ // https://eips.ethereum.org/EIPS/eip-4758
387
+
388
+ //---------------------------------------------------------------------------------------------------------------//
389
+ // Opcode | Opcode + Arguments | Description | Stack View //
390
+ //---------------------------------------------------------------------------------------------------------------//
391
+ // Contract creation code that uses `SELFDESTRUCT` to force send ETH to a specified address. //
392
+ // Creation code summary: 0x73<20-byte toAddress>0xff //
393
+ //---------------------------------------------------------------------------------------------------------------//
394
+ // 0x73 | 0x73_toAddress | PUSH20 toAddress | toAddress //
395
+ // 0xFF | 0xFF | SELFDESTRUCT | //
396
+ //---------------------------------------------------------------------------------------------------------------//
397
+ // Store the address in scratch space, starting at 0x00, which begins the 20-byte address at 32-20=12 in memory
398
+ // @dev use scratch space because we have enough space for simple creation code (less than 0x40 bytes)
399
+ mstore(0x00, to)
400
+ // store opcode PUSH20 immediately before the address, starting at 0x0b (11) in memory
401
+ mstore8(0x0b, 0x73)
402
+ // store opcode SELFDESTRUCT immediately after the address, starting at 0x20 (32) in memory
403
+ mstore8(0x20, 0xff)
404
+ // this will always succeed because the contract creation code is
405
+ // valid, and the address is valid because it is a 20-byte value
406
+ if iszero(create(amount, 0x0b, 0x16)) {
407
+ // @dev For better gas estimation.
408
+ if iszero(gt(gas(), 1000000)) {
409
+ revert(0, 0)
410
+ }
411
+ }
412
+ }
413
+ }
414
+ }
415
+
416
+ /**
417
+ * @notice Returns whether or not the provided address `coreContract`
418
+ * is an Art Blocks Engine core contract. Caches the result for future access.
419
+ * @param coreContract Address of the core contract to check.
420
+ */
421
+ function isEngine(address coreContract) internal returns (bool) {
422
+ IsEngineCache storage isEngineCache = getIsEngineCacheConfig(
423
+ coreContract
424
+ );
425
+ // check cache, return early if cached
426
+ if (isEngineCache.isCached) {
427
+ return isEngineCache.isEngine;
428
+ }
429
+ // populate cache and return result
430
+ bool isEngine_ = getV3CoreIsEngineView(coreContract);
431
+ isEngineCache.isCached = true;
432
+ isEngineCache.isEngine = isEngine_;
433
+ return isEngine_;
434
+ }
435
+
436
+ /**
437
+ * @notice Returns whether a V3 core contract is an Art Blocks Engine
438
+ * contract or not. Return value of false indicates that the core is a
439
+ * flagship contract. This function does not update the cache state for the
440
+ * given V3 core contract.
441
+ * @dev this function reverts if a core contract does not return the
442
+ * expected number of return values from getPrimaryRevenueSplits() for
443
+ * either a flagship or engine core contract.
444
+ * @dev this function uses the length of the return data (in bytes) to
445
+ * determine whether the core is an engine or not.
446
+ * @param coreContract The address of the deployed core contract.
447
+ */
448
+ function getV3CoreIsEngineView(
449
+ address coreContract
450
+ ) internal view returns (bool) {
451
+ // call getPrimaryRevenueSplits() on core contract
452
+ bytes memory payload = abi.encodeWithSignature(
453
+ "getPrimaryRevenueSplits(uint256,uint256)",
454
+ 0,
455
+ 0
456
+ );
457
+ (bool success, bytes memory returnData) = coreContract.staticcall(
458
+ payload
459
+ );
460
+ require(success, "getPrimaryRevenueSplits() call failed");
461
+ // determine whether core is engine or not, based on return data length
462
+ uint256 returnDataLength = returnData.length;
463
+ if (returnDataLength == 6 * 32) {
464
+ // 6 32-byte words returned if flagship (not engine)
465
+ // @dev 6 32-byte words are expected because the non-engine core
466
+ // contracts return a payout address and uint256 payment value for
467
+ // the artist, and artist's additional payee, and Art Blocks.
468
+ // also note that per Solidity ABI encoding, the address return
469
+ // values are padded to 32 bytes.
470
+
471
+ return false;
472
+ } else if (returnDataLength == 8 * 32) {
473
+ // 8 32-byte words returned if engine
474
+ // @dev 8 32-byte words are expected because the engine core
475
+ // contracts return a payout address and uint256 payment value for
476
+ // the artist, artist's additional payee, render provider
477
+ // typically Art Blocks, and platform provider (partner).
478
+ // also note that per Solidity ABI encoding, the address return
479
+ // values are padded to 32 bytes.
480
+ return true;
481
+ } else {
482
+ // unexpected return value length
483
+ revert("Unexpected revenue split bytes");
484
+ }
485
+ }
486
+
487
+ /**
488
+ * @notice Gets the currency address and symbol for the referenced
489
+ * SplitFundsProjectConfig.
490
+ * Only supports ERC20 tokens - returns currencySymbol of `UNCONFIG` if
491
+ * `currencyAddress` is zero.
492
+ * @param projectId Project ID to get config for
493
+ * @param coreContract Core contract address to get config for
494
+ * @return currencyAddress
495
+ * @return currencySymbol
496
+ */
497
+ function getCurrencyInfoERC20(
498
+ uint256 projectId,
499
+ address coreContract
500
+ )
501
+ internal
502
+ view
503
+ returns (address currencyAddress, string memory currencySymbol)
504
+ {
505
+ SplitFundsProjectConfig
506
+ storage splitFundsProjectConfig = getSplitFundsProjectConfig({
507
+ projectId: projectId,
508
+ coreContract: coreContract
509
+ });
510
+ currencyAddress = splitFundsProjectConfig.currencyAddress;
511
+ // default to "UNCONFIG" if project currency address is initial value
512
+ currencySymbol = currencyAddress == address(0)
513
+ ? "UNCONFIG"
514
+ : splitFundsProjectConfig.currencySymbol;
515
+ }
516
+
517
+ /**
518
+ * @notice Gets the balance of `currencyAddress` ERC20 tokens for `walletAddress`.
519
+ * @param currencyAddress ERC20 token address.
520
+ * @param walletAddress wallet address.
521
+ * @return balance
522
+ */
523
+ function getERC20Balance(
524
+ address currencyAddress,
525
+ address walletAddress
526
+ ) internal view returns (uint256) {
527
+ return IERC20(currencyAddress).balanceOf(walletAddress);
528
+ }
529
+
530
+ /**
531
+ * @notice Gets the allowance of `spenderAddress` to spend `walletAddress`'s
532
+ * `currencyAddress` ERC20 tokens.
533
+ * @param currencyAddress ERC20 token address.
534
+ * @param walletAddress wallet address.
535
+ * @param spenderAddress spender address.
536
+ * @return allowance
537
+ */
538
+ function getERC20Allowance(
539
+ address currencyAddress,
540
+ address walletAddress,
541
+ address spenderAddress
542
+ ) internal view returns (uint256 allowance) {
543
+ allowance = IERC20(currencyAddress).allowance({
544
+ owner: walletAddress,
545
+ spender: spenderAddress
546
+ });
547
+ return allowance;
548
+ }
549
+
550
+ /**
551
+ * @notice Function validates that `msgSender` has approved the contract to spend at least
552
+ * `pricePerToken` of `currencyAddress` ERC20 tokens, and that
553
+ * `msgSender` has a balance of at least `pricePerToken` of
554
+ * `currencyAddress` ERC20 tokens.
555
+ * Reverts if insufficient allowance or balance.
556
+ * @param msgSender Address of the message sender to validate.
557
+ * @param currencyAddress Address of the ERC20 token to validate.
558
+ * @param pricePerToken Price per token to validate (no decimals)
559
+ */
560
+ function validateERC20Approvals(
561
+ address msgSender,
562
+ address currencyAddress,
563
+ uint256 pricePerToken
564
+ ) private view {
565
+ require(
566
+ IERC20(currencyAddress).allowance({
567
+ owner: msgSender,
568
+ spender: address(this)
569
+ }) >= pricePerToken,
570
+ "Insufficient ERC20 allowance"
571
+ );
572
+ require(
573
+ IERC20(currencyAddress).balanceOf(msgSender) >= pricePerToken,
574
+ "Insufficient ERC20 balance"
575
+ );
576
+ }
577
+
578
+ /**
579
+ * @notice Sends ETH revenues between providers, artist, and artist's
580
+ * additional payee. Reverts if any payment fails.
581
+ * @param platformProviderRevenue Platform Provider revenue.
582
+ * @param platformProviderAddress Platform Provider address.
583
+ * @param renderProviderRevenue Render Provider revenue.
584
+ * @param renderProviderAddress Render Provider address.
585
+ * @param artistRevenue Artist revenue.
586
+ * @param artistAddress Artist address.
587
+ * @param additionalPayeePrimaryRevenue Additional Payee revenue.
588
+ * @param additionalPayeePrimaryAddress Additional Payee address.
589
+ */
590
+ function _sendPaymentsETH(
591
+ uint256 platformProviderRevenue,
592
+ address payable platformProviderAddress,
593
+ uint256 renderProviderRevenue,
594
+ address payable renderProviderAddress,
595
+ uint256 artistRevenue,
596
+ address payable artistAddress,
597
+ uint256 additionalPayeePrimaryRevenue,
598
+ address payable additionalPayeePrimaryAddress
599
+ ) private {
600
+ // Platform Provider payment (only possible if engine)
601
+ if (platformProviderRevenue > 0) {
602
+ (bool success, ) = platformProviderAddress.call{
603
+ value: platformProviderRevenue
604
+ }("");
605
+ require(success, "Platform Provider payment failed");
606
+ }
607
+ // Render Provider / Art Blocks payment
608
+ if (renderProviderRevenue > 0) {
609
+ (bool success, ) = renderProviderAddress.call{
610
+ value: renderProviderRevenue
611
+ }("");
612
+ require(success, "Render Provider payment failed");
613
+ }
614
+ // artist payment
615
+ if (artistRevenue > 0) {
616
+ (bool success, ) = artistAddress.call{value: artistRevenue}("");
617
+ require(success, "Artist payment failed");
618
+ }
619
+ // additional payee payment
620
+ if (additionalPayeePrimaryRevenue > 0) {
621
+ (bool success, ) = additionalPayeePrimaryAddress.call{
622
+ value: additionalPayeePrimaryRevenue
623
+ }("");
624
+ require(success, "Additional Payee payment failed");
625
+ }
626
+ }
627
+
628
+ /**
629
+ * @notice Sends ERC20 revenues between providers, artist, and artist's
630
+ * additional payee. Reverts if any payment fails. All revenue values
631
+ * should not use decimals.
632
+ * @dev This function relies on msg.sender, so it must be called from
633
+ * the contract that is receiving the payment.
634
+ * @param projectCurrency IERC20 payment token.
635
+ * @param platformProviderRevenue Platform Provider revenue.
636
+ * @param platformProviderAddress Platform Provider address.
637
+ * @param renderProviderRevenue Render Provider revenue.
638
+ * @param renderProviderAddress Render Provider address.
639
+ * @param artistRevenue Artist revenue.
640
+ * @param artistAddress Artist address.
641
+ * @param additionalPayeePrimaryRevenue Additional Payee revenue.
642
+ * @param additionalPayeePrimaryAddress Additional Payee address.
643
+ */
644
+ function _sendPaymentsERC20(
645
+ IERC20 projectCurrency,
646
+ uint256 platformProviderRevenue,
647
+ address payable platformProviderAddress,
648
+ uint256 renderProviderRevenue,
649
+ address payable renderProviderAddress,
650
+ uint256 artistRevenue,
651
+ address payable artistAddress,
652
+ uint256 additionalPayeePrimaryRevenue,
653
+ address payable additionalPayeePrimaryAddress
654
+ ) private {
655
+ // Platform Provider payment (only possible if engine)
656
+ if (platformProviderRevenue > 0) {
657
+ require(
658
+ projectCurrency.transferFrom({
659
+ from: msg.sender,
660
+ to: platformProviderAddress,
661
+ amount: platformProviderRevenue
662
+ }),
663
+ "Platform Provider payment failed"
664
+ );
665
+ }
666
+ // Art Blocks payment
667
+ if (renderProviderRevenue > 0) {
668
+ require(
669
+ projectCurrency.transferFrom({
670
+ from: msg.sender,
671
+ to: renderProviderAddress,
672
+ amount: renderProviderRevenue
673
+ }),
674
+ "Render Provider payment failed"
675
+ );
676
+ }
677
+ // artist payment
678
+ if (artistRevenue > 0) {
679
+ require(
680
+ projectCurrency.transferFrom({
681
+ from: msg.sender,
682
+ to: artistAddress,
683
+ amount: artistRevenue
684
+ }),
685
+ "Artist payment failed"
686
+ );
687
+ }
688
+ // additional payee payment
689
+ if (additionalPayeePrimaryRevenue > 0) {
690
+ // @dev some ERC20 may not revert on transfer failure, so we
691
+ // check the return value
692
+ require(
693
+ projectCurrency.transferFrom({
694
+ from: msg.sender,
695
+ to: additionalPayeePrimaryAddress,
696
+ amount: additionalPayeePrimaryRevenue
697
+ }),
698
+ "Additional Payee payment failed"
699
+ );
700
+ }
701
+ }
702
+
703
+ /**
704
+ * @notice Loads the SplitFundsProjectConfig for a given project and core
705
+ * contract.
706
+ * @param projectId Project Id to get config for
707
+ * @param coreContract Core contract address to get config for
708
+ */
709
+ function getSplitFundsProjectConfig(
710
+ uint256 projectId,
711
+ address coreContract
712
+ ) internal view returns (SplitFundsProjectConfig storage) {
713
+ return s().splitFundsProjectConfigs[coreContract][projectId];
714
+ }
715
+
716
+ /**
717
+ * @notice Loads the IsEngineCache for a given core contract.
718
+ * @param coreContract Core contract address to get config for
719
+ */
720
+ function getIsEngineCacheConfig(
721
+ address coreContract
722
+ ) internal view returns (IsEngineCache storage) {
723
+ return s().isEngineCacheConfigs[coreContract];
724
+ }
725
+
726
+ /**
727
+ * @notice Return the storage struct for reading and writing. This library
728
+ * uses a diamond storage pattern when managing storage.
729
+ * @return storageStruct The SetPriceLibStorage struct.
730
+ */
731
+ function s()
732
+ internal
733
+ pure
734
+ returns (SplitFundsLibStorage storage storageStruct)
735
+ {
736
+ bytes32 position = SPLIT_FUNDS_LIB_STORAGE_POSITION;
737
+ assembly ("memory-safe") {
738
+ storageStruct.slot := position
739
+ }
740
+ }
741
+ }