@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,770 @@
1
+ // SPDX-License-Identifier: LGPL-3.0-only
2
+ // Created By: Art Blocks Inc.
3
+
4
+ pragma solidity ^0.8.0;
5
+
6
+ import {MaxInvocationsLib} from "./MaxInvocationsLib.sol";
7
+ import {DAExpLib} from "./DAExpLib.sol";
8
+ import {SplitFundsLib} from "./SplitFundsLib.sol";
9
+ import {AuthLib} from "../AuthLib.sol";
10
+ import {GenericMinterEventsLib} from "./GenericMinterEventsLib.sol";
11
+
12
+ import {SafeCast} from "@openzeppelin-4.7/contracts/utils/math/SafeCast.sol";
13
+
14
+ /**
15
+ * @title Art Blocks Settlement Library for Exponential Auctions
16
+ * @notice This library manages the settlement logic for Art Blocks settlement
17
+ * minters. It provides functionality for managing a project's settlement state
18
+ * via the SettlementAuctionProjectConfig struct, and managing an individual's
19
+ * settlement state on a given project via the Receipt struct.
20
+ * @author Art Blocks Inc.
21
+ */
22
+
23
+ library SettlementExpLib {
24
+ using SafeCast for uint256;
25
+ /**
26
+ * @notice Receipt updated event. Emitted when a receipt is updated.
27
+ * @param purchaser purchaser address of updated receipt
28
+ * @param projectId project ID of updated receipt
29
+ * @param coreContract core contract address of updated receipt
30
+ * @param numPurchased new number of tokens purchased on project
31
+ * @param netPosted new net funds posted on project
32
+ */
33
+ event ReceiptUpdated(
34
+ address indexed purchaser,
35
+ uint256 indexed projectId,
36
+ address indexed coreContract,
37
+ uint24 numPurchased,
38
+ uint256 netPosted
39
+ );
40
+
41
+ // position of Settlement Exp Lib storage, using a diamond storage pattern
42
+ // for this library
43
+ bytes32 constant SETTLEMENT_EXP_LIB_STORAGE_POSITION =
44
+ keccak256("settlementExpLib.storage");
45
+
46
+ bytes32 internal constant CONFIG_CURRENT_SETTLED_PRICE =
47
+ "currentSettledPrice";
48
+ bytes32 internal constant CONFIG_AUCTION_REVENUES_COLLECTED =
49
+ "auctionRevenuesCollected";
50
+
51
+ // The SettlementAuctionProjectConfig struct tracks the state of a project's
52
+ // settlement auction. It tracks the number of tokens minted that have
53
+ // potential of future settlement, the latest purchase price of a token on
54
+ // the project, and whether or not the auction's revenues have been
55
+ // collected.
56
+ struct SettlementAuctionProjectConfig {
57
+ // set to true only after artist + admin revenues have been collected
58
+ bool auctionRevenuesCollected;
59
+ // number of tokens minted that have potential of future settlement.
60
+ // @dev max uint24 > 16.7 million tokens > 1 million tokens/project max
61
+ uint24 numSettleableInvocations;
62
+ // When non-zero, this value is used as a reference when an auction is
63
+ // reset by admin, and then a new auction is configured by an artist.
64
+ // In that case, the new auction will be required to have a starting
65
+ // price less than or equal to this value, if one or more purchases
66
+ // have been made on this minter.
67
+ // @dev max uint88 ~= 3e26 Wei = ~300 million ETH, which is well above
68
+ // the expected prices of any NFT mint in the foreseeable future.
69
+ // This enables struct packing.
70
+ uint88 latestPurchasePrice;
71
+ // Track per-project fund balance, in wei. This is used as a redundant
72
+ // backstop to prevent one project from draining the minter's balance
73
+ // of ETH from other projects, which is a worthwhile failsafe on this
74
+ // shared minter.
75
+ // @dev max uint88 ~= 3e26 Wei = ~300 million ETH, which is well above
76
+ // the expected revenues for a single auction.
77
+ // This enables struct packing.
78
+ uint88 projectBalance;
79
+ // field to store the number of purchases that have been made on the
80
+ // project, on this minter. This is used to track if unexpected mints
81
+ // from sources other than this minter occur during an auction.
82
+ // @dev max uint24 allows for > max project supply of 1 million tokens
83
+ // @dev important to pack this field with other fields updated during a
84
+ // purchase, for gas efficiency
85
+ uint24 numPurchasesOnMinter;
86
+ // The number of tokens to be auctioned for the project on this minter.
87
+ // This is defined as the number of invocations remaining at the time
88
+ // of a project's first mint.
89
+ uint24 numTokensToBeAuctioned;
90
+ // --- @dev end of storage slot ---
91
+ }
92
+
93
+ // The Receipt struct tracks the state of a user's settlement on a given
94
+ // project. It tracks the total funds posted by the user on the project
95
+ // and the number of tokens purchased by the user on the project.
96
+ struct Receipt {
97
+ // max uint232 allows for > 1e51 ETH (much more than max supply)
98
+ uint232 netPosted;
99
+ // max uint24 still allows for > max project supply of 1 million tokens
100
+ uint24 numPurchased;
101
+ }
102
+
103
+ // Diamond storage pattern is used in this library
104
+ struct SettlementExpLibStorage {
105
+ mapping(address coreContract => mapping(uint256 projectId => SettlementAuctionProjectConfig)) settlementAuctionProjectConfigs;
106
+ mapping(address walletAddress => mapping(address coreContract => mapping(uint256 projectId => Receipt))) receipts;
107
+ }
108
+
109
+ /**
110
+ * @notice This function updates the _receipt to include `msg.value` and increments
111
+ * the number of tokens purchased by 1. It then checks that the updated
112
+ * receipt is valid (i.e. sufficient funds have been posted for the
113
+ * number of tokens purchased on the updated receipt), and reverts if not.
114
+ * The new receipt net posted and num purchased are then returned to make
115
+ * the values available in a gas-efficient manner to the caller of this
116
+ * function.
117
+ * @param walletAddress Address of user to update receipt for
118
+ * @param projectId Project ID to update receipt for
119
+ * @param coreContract Core contract address
120
+ * @param currentPriceInWei current price of token in Wei
121
+ * @return netPosted total funds posted by user on project (that have not
122
+ * been yet settled), including the current transaction
123
+ * @return numPurchased total number of tokens purchased by user on
124
+ * project, including the current transaction
125
+ */
126
+ function _validateReceiptEffects(
127
+ address walletAddress,
128
+ uint256 projectId,
129
+ address coreContract,
130
+ uint256 currentPriceInWei
131
+ ) private returns (uint232 netPosted, uint24 numPurchased) {
132
+ Receipt storage receipt = getReceipt({
133
+ walletAddress: walletAddress,
134
+ projectId: projectId,
135
+ coreContract: coreContract
136
+ });
137
+ // in memory copy + update
138
+ netPosted = (receipt.netPosted + msg.value).toUint232();
139
+ numPurchased = receipt.numPurchased + 1;
140
+
141
+ // require sufficient payment on project
142
+ require(
143
+ netPosted >= numPurchased * currentPriceInWei,
144
+ "Min value to mint req."
145
+ );
146
+
147
+ // update Receipt in storage
148
+ receipt.netPosted = netPosted;
149
+ receipt.numPurchased = numPurchased;
150
+
151
+ // emit event indicating new receipt state
152
+ emit ReceiptUpdated({
153
+ purchaser: msg.sender,
154
+ projectId: projectId,
155
+ coreContract: coreContract,
156
+ numPurchased: numPurchased,
157
+ netPosted: netPosted
158
+ });
159
+ }
160
+
161
+ /**
162
+ * @notice Distributes the net revenues from the project's auction, and
163
+ * marks the auction as having had its revenues collected.
164
+ * IMPORTANT - this affects state and distributes revenue funds, so it
165
+ * performs all three of CHECKS, EFFECTS and INTERACTIONS.
166
+ * This function updates a project's balance to reflect the amount of
167
+ * revenues distributed, and will revert if underflow occurs.
168
+ * @param projectId Project ID to get revenues for
169
+ * @param coreContract Core contract address
170
+ */
171
+ function distributeArtistAndAdminRevenues(
172
+ uint256 projectId,
173
+ address coreContract
174
+ ) internal {
175
+ // load the project's settlement auction config
176
+ SettlementAuctionProjectConfig
177
+ storage settlementAuctionProjectConfig = getSettlementAuctionProjectConfig({
178
+ projectId: projectId,
179
+ coreContract: coreContract
180
+ });
181
+ // require revenues to not have already been collected
182
+ require(
183
+ !settlementAuctionProjectConfig.auctionRevenuesCollected,
184
+ "Revenues already collected"
185
+ );
186
+ // refresh max invocations, updating any local values that are
187
+ // illogical with respect to the current core contract state, and
188
+ // ensuring that local maxHasBeenInvoked is accurate.
189
+ MaxInvocationsLib.refreshMaxInvocations({
190
+ projectId: projectId,
191
+ coreContract: coreContract
192
+ });
193
+
194
+ // get the current net price of the auction - reverts if no auction
195
+ // is configured.
196
+ // @dev we use _getPriceUnsafe here, since we just safely synced the
197
+ // project's max invocations and maxHasBeenInvoked, which guarantees
198
+ // an accurate price calculation from _getPriceUnsafe, while being
199
+ // more gas efficient than getPriceSafe.
200
+ // @dev price is guaranteed <= _projectConfig.latestPurchasePrice,
201
+ // since this minter enforces monotonically decreasing purchase prices.
202
+ // @dev we can trust maxHasBeenInvoked, since we just
203
+ // refreshed it above with refreshMaxInvocations, preventing any
204
+ // false negatives
205
+ bool maxHasBeenInvoked = MaxInvocationsLib.getMaxHasBeenInvoked({
206
+ projectId: projectId,
207
+ coreContract: coreContract
208
+ });
209
+ uint256 price = getPriceUnsafe({
210
+ projectId: projectId,
211
+ coreContract: coreContract,
212
+ maxHasBeenInvoked: maxHasBeenInvoked
213
+ });
214
+ // if the price is not base price, require that the auction have
215
+ // reached max invocations. This prevents premature withdrawl
216
+ // before final auction price is possible to know.
217
+ uint256 basePrice = DAExpLib.getAuctionBasePrice({
218
+ projectId: projectId,
219
+ coreContract: coreContract
220
+ });
221
+ if (price != basePrice) {
222
+ require(maxHasBeenInvoked, "Active auction not yet sold out");
223
+ // if max has been invoked, but all tokens to be auctioned were not
224
+ // sold, nonstandard activity has been detected (e.g. project max
225
+ // invocations were reduced on core contract after initial
226
+ // purchase, purchases were made on a different minter after
227
+ // initial purchase, etc.), which could artifically inflate
228
+ // sellout price and harm purchasers. In that case, we should
229
+ // not revert (since max invocations have been reached), but we
230
+ // should require admin to be the caller of this function.
231
+ // This provides separation of powers to protect collectors who
232
+ // participated in the auction.
233
+ // Note that if admin determines the artist has been malicious,
234
+ // admin should replace artist address with a wallet controlled by
235
+ // admin on the core contract, update payee address on the core,
236
+ // collect revenues using this function, then distribute any
237
+ // additional settlement funds to purchasers at admin's discretion.
238
+ if (
239
+ !_allTokensToBeAuctionedWereSold(settlementAuctionProjectConfig)
240
+ ) {
241
+ AuthLib.onlyCoreAdminACL({
242
+ coreContract: coreContract,
243
+ sender: msg.sender,
244
+ contract_: address(this),
245
+ selector: bytes4(
246
+ keccak256(
247
+ "distributeArtistAndAdminRevenues(uint256,address)"
248
+ )
249
+ )
250
+ });
251
+ }
252
+ } else {
253
+ // base price of zero indicates that the auction has not been configured,
254
+ // since base price of zero is not allowed when configuring an auction.
255
+ // @dev no coverage else branch of following line because redundant
256
+ require(basePrice > 0, "Only latestPurchasePrice > 0");
257
+ // if the price is base price, the auction is valid and may be claimed
258
+ // update the latest purchase price to the base price, to ensure
259
+ // the base price is used for all future settlement calculations
260
+ // EFFECTS
261
+ // @dev base price value was just loaded from uint88 in storage,
262
+ // so no safe cast required
263
+ settlementAuctionProjectConfig.latestPurchasePrice = uint88(
264
+ basePrice
265
+ );
266
+ // notify indexing service of settled price update
267
+ // @dev acknowledge that this event may be emitted prior to
268
+ // other state updates in this function, but that is okay because
269
+ // the settled price is the only value updated with this event
270
+ emit GenericMinterEventsLib.ConfigValueSet({
271
+ projectId: projectId,
272
+ coreContract: coreContract,
273
+ key: CONFIG_CURRENT_SETTLED_PRICE,
274
+ value: basePrice
275
+ });
276
+ }
277
+ settlementAuctionProjectConfig.auctionRevenuesCollected = true;
278
+ // calculate the artist and admin revenues
279
+ uint256 netRevenues = settlementAuctionProjectConfig
280
+ .numSettleableInvocations * price;
281
+
282
+ // reduce project balance by the amount of ETH being distributed
283
+ // @dev underflow checked automatically in solidity ^0.8
284
+ settlementAuctionProjectConfig.projectBalance -= netRevenues.toUint88();
285
+
286
+ // INTERACTIONS
287
+ SplitFundsLib.splitRevenuesETHNoRefund({
288
+ projectId: projectId,
289
+ valueInWei: netRevenues,
290
+ coreContract: coreContract
291
+ });
292
+
293
+ emit GenericMinterEventsLib.ConfigValueSet({
294
+ projectId: projectId,
295
+ coreContract: coreContract,
296
+ key: CONFIG_AUCTION_REVENUES_COLLECTED,
297
+ value: true
298
+ });
299
+ }
300
+
301
+ /**
302
+ * @notice Reclaims excess settlement funds for purchaser wallet
303
+ * `purchaserAddress` on project `projectId`. Excess settlement funds are
304
+ * the amount of funds posted by the purchaser that are in excess of the
305
+ * amount required to settle the purchaser's tokens on the project.
306
+ * Excess settlement funds are sent to address `to`, and function reverts
307
+ * if send fails.
308
+ * @param projectId Project ID to reclaim excess settlement funds for
309
+ * @param coreContract Core contract address
310
+ * @param purchaserAddress Address to reclaim excess settlement funds for
311
+ * @param to Address to send excess settlement funds to
312
+ */
313
+ function reclaimProjectExcessSettlementFundsTo(
314
+ address payable to,
315
+ uint256 projectId,
316
+ address coreContract,
317
+ address purchaserAddress
318
+ ) internal {
319
+ (
320
+ uint256 excessSettlementFunds,
321
+ uint256 requiredAmountPosted
322
+ ) = getProjectExcessSettlementFunds({
323
+ projectId: projectId,
324
+ coreContract: coreContract,
325
+ walletAddress: purchaserAddress
326
+ });
327
+
328
+ SettlementAuctionProjectConfig
329
+ storage settlementAuctionProjectConfig = getSettlementAuctionProjectConfig({
330
+ projectId: projectId,
331
+ coreContract: coreContract
332
+ });
333
+ Receipt storage receipt = getReceipt({
334
+ walletAddress: purchaserAddress,
335
+ coreContract: coreContract,
336
+ projectId: projectId
337
+ });
338
+
339
+ uint232 newNetPosted = requiredAmountPosted.toUint232();
340
+ receipt.netPosted = newNetPosted;
341
+
342
+ // reduce project balance by the amount of ETH being distributed
343
+ // @dev underflow checked automatically in solidity ^0.8
344
+ settlementAuctionProjectConfig.projectBalance -= excessSettlementFunds
345
+ .toUint88();
346
+
347
+ emit ReceiptUpdated({
348
+ purchaser: purchaserAddress,
349
+ projectId: projectId,
350
+ coreContract: coreContract,
351
+ numPurchased: receipt.numPurchased,
352
+ netPosted: newNetPosted
353
+ });
354
+
355
+ // INTERACTIONS
356
+ bool success_;
357
+ (success_, ) = to.call{value: excessSettlementFunds}("");
358
+ require(success_, "Reclaiming failed");
359
+ }
360
+
361
+ /**
362
+ * @notice Performs updates to project state prior to a mint being
363
+ * initiated, during a purchase transaction. Specifically, this updates the
364
+ * number of purchases on this minter (and populates expected number of
365
+ * tokens to be auctioned if this is first purchase), increases the
366
+ * project's balance by the amount of funds sent with the transaction,
367
+ * updates the purchaser's receipt to reflect the new funds posted, checks
368
+ * that the updated receipt has sufficient funds posted for the number of
369
+ * tokens to be purchased after this transaction, and updates the project's
370
+ * latest purchase price to the current price of the token.
371
+ * Reverts if insuffient funds have been posted for the number of tokens to
372
+ * be purchased after this transaction.
373
+ * @param projectId Project ID to perform the pre-mint effects for
374
+ * @param coreContract Core contract address
375
+ * @param currentPriceInWei current price of token in Wei
376
+ * @param msgValue msg.value sent with mint transaction
377
+ * @param purchaserAddress Wallet address of purchaser
378
+ */
379
+ function preMintEffects(
380
+ uint256 projectId,
381
+ address coreContract,
382
+ uint256 currentPriceInWei,
383
+ uint256 msgValue,
384
+ address purchaserAddress
385
+ ) internal {
386
+ // load the project's settlement auction config and receipt
387
+ SettlementAuctionProjectConfig
388
+ storage settlementAuctionProjectConfig = getSettlementAuctionProjectConfig({
389
+ projectId: projectId,
390
+ coreContract: coreContract
391
+ });
392
+
393
+ // if this is the first purchase on this minter, set the number of
394
+ // of tokens to be auctioned to:
395
+ // (minter max invocations) - (current core contract invocations)
396
+ if (settlementAuctionProjectConfig.numPurchasesOnMinter == 0) {
397
+ // get up-to-data invocation data from core contract
398
+ (
399
+ uint256 coreInvocations,
400
+ uint256 coreMaxInvocations
401
+ ) = MaxInvocationsLib.coreContractInvocationData({
402
+ projectId: projectId,
403
+ coreContract: coreContract
404
+ });
405
+ // snap chalkline on the number of tokens to be auctioned on this
406
+ // minter
407
+ // @dev acknowledge that this value may be stale if the core
408
+ // contract's max invocations were reduced since the last time
409
+ // the minter's max invocations were updated, but that is desired.
410
+ // That case would be classified as "nonstandard activity", so we
411
+ // want to require admin to be the withdrawer of revenues in that
412
+ // case.
413
+ uint256 minterMaxInvocations = MaxInvocationsLib.getMaxInvocations({
414
+ projectId: projectId,
415
+ coreContract: coreContract
416
+ });
417
+ // @dev prefer to use stale value minterMaxInvocations here, since
418
+ // if it is stale, the artist could have decreased max invocations
419
+ // on core contract at last moment unexpectedly, and we want to
420
+ // equire admin to be the withdrawer of revenues in that case.
421
+ settlementAuctionProjectConfig.numTokensToBeAuctioned = uint24(
422
+ minterMaxInvocations - coreInvocations
423
+ );
424
+ // edge case: minter max invocations > core contract max invocations.
425
+ // could be caused by either:
426
+ // - core contract max invocations reduced after configuring
427
+ // auction (this is generally accidental by artist), and did not
428
+ // subsequently update minter's max invocations
429
+ // - artist decreased max invocations on core contract at last
430
+ // moment prior to this initial mint (this is suspicious)
431
+ // either way, we want to update minter's local max invocations, so
432
+ // that the minter returns the most up-to-date value from function
433
+ // `projectMaxHasBeenInvoked` in the future.
434
+ // @dev note that this edge case will end up being classified as
435
+ // "nonstandard activity" in case of sellout above base price, and
436
+ // will require admin concurrence in those cases.
437
+ if (minterMaxInvocations > coreMaxInvocations) {
438
+ // update minter's max invocations to match core contract
439
+ MaxInvocationsLib.syncProjectMaxInvocationsToCore({
440
+ projectId: projectId,
441
+ coreContract: coreContract
442
+ });
443
+ }
444
+ }
445
+
446
+ // increment the number of purchases on this minter during every purchase
447
+ settlementAuctionProjectConfig.numPurchasesOnMinter++;
448
+
449
+ // update project balance
450
+ settlementAuctionProjectConfig.projectBalance += msgValue.toUint88();
451
+
452
+ _validateReceiptEffects({
453
+ walletAddress: purchaserAddress,
454
+ projectId: projectId,
455
+ coreContract: coreContract,
456
+ currentPriceInWei: currentPriceInWei
457
+ });
458
+
459
+ // update latest purchase price (on this minter) in storage
460
+ // @dev this is used to enforce monotonically decreasing purchase price
461
+ // across multiple auctions
462
+ settlementAuctionProjectConfig.latestPurchasePrice = currentPriceInWei
463
+ .toUint88();
464
+ }
465
+
466
+ /**
467
+ * @notice Performs updates to project state after a mint has been
468
+ * successfully completed.
469
+ * Specifically, this function distributes revenues if the auction revenues
470
+ * have been collected, or increments the number of settleable invocations
471
+ * if the auction revenues have not been collected.
472
+ * @param projectId Project ID to perform post-mint updates for
473
+ * @param coreContract Core contract address
474
+ * @param currentPriceInWei current price of token in Wei (the value to be
475
+ * distributed if revenues have been collected)
476
+ */
477
+ function postMintInteractions(
478
+ uint256 projectId,
479
+ address coreContract,
480
+ uint256 currentPriceInWei
481
+ ) internal {
482
+ // load the project's settlement auction config
483
+ SettlementAuctionProjectConfig
484
+ storage settlementAuctionProjectConfig = getSettlementAuctionProjectConfig({
485
+ projectId: projectId,
486
+ coreContract: coreContract
487
+ });
488
+ if (settlementAuctionProjectConfig.auctionRevenuesCollected) {
489
+ // if revenues have been collected, split revenues immediately.
490
+ // @dev note that we are guaranteed to be at auction base price,
491
+ // since we know we didn't sellout prior to this tx.
492
+ // note that we don't refund msg.sender here, since a separate
493
+ // settlement mechanism is provided on this minter, unrelated to
494
+ // msg.value
495
+
496
+ // reduce project balance by the amount of ETH being distributed
497
+ // @dev specifically, this is not decremented by msg.value, as
498
+ // msg.sender is not refunded here
499
+ // @dev underflow checked automatically in solidity ^0.8
500
+ settlementAuctionProjectConfig.projectBalance -= currentPriceInWei
501
+ .toUint88();
502
+
503
+ // INTERACTIONS
504
+ SplitFundsLib.splitRevenuesETHNoRefund({
505
+ projectId: projectId,
506
+ valueInWei: currentPriceInWei,
507
+ coreContract: coreContract
508
+ });
509
+ } else {
510
+ // increment the number of settleable invocations that will be
511
+ // claimable by the artist and admin once auction is validated.
512
+ // do not split revenue here since will be claimed at a later time.
513
+ settlementAuctionProjectConfig.numSettleableInvocations++;
514
+ // @dev project balance is unaffected because no funds are distributed
515
+ }
516
+ }
517
+
518
+ /**
519
+ * Returns number of purchases that have been made on the minter, for a
520
+ * given project.
521
+ * @param projectId The id of the project.
522
+ * @param coreContract The address of the core contract.
523
+ */
524
+ function getNumPurchasesOnMinter(
525
+ uint256 projectId,
526
+ address coreContract
527
+ ) internal view returns (uint256) {
528
+ SettlementAuctionProjectConfig
529
+ storage settlementAuctionProjectConfig = getSettlementAuctionProjectConfig({
530
+ projectId: projectId,
531
+ coreContract: coreContract
532
+ });
533
+ return settlementAuctionProjectConfig.numPurchasesOnMinter;
534
+ }
535
+
536
+ /**
537
+ * @notice Returns the excess settlement funds for purchaser wallet
538
+ * `walletAddress` on project `projectId`. Excess settlement funds are
539
+ * the amount of funds posted by the purchaser that are in excess of the
540
+ * amount required to settle the purchaser's tokens on the project.
541
+ * @param projectId Project ID to get revenues for
542
+ * @param coreContract Core contract address
543
+ * @param walletAddress Address to get excess settlement funds for
544
+ * @return excessSettlementFunds excess settlement funds, in wei
545
+ * @return requiredAmountPosted required amount to be posted by user, in wei
546
+ */
547
+ function getProjectExcessSettlementFunds(
548
+ uint256 projectId,
549
+ address coreContract,
550
+ address walletAddress
551
+ )
552
+ internal
553
+ view
554
+ returns (uint256 excessSettlementFunds, uint256 requiredAmountPosted)
555
+ {
556
+ // load the project's settlement auction config
557
+ SettlementAuctionProjectConfig
558
+ storage _settlementAuctionProjectConfig = getSettlementAuctionProjectConfig({
559
+ projectId: projectId,
560
+ coreContract: coreContract
561
+ });
562
+ // load the user's receipt
563
+ Receipt storage receipt = getReceipt({
564
+ walletAddress: walletAddress,
565
+ projectId: projectId,
566
+ coreContract: coreContract
567
+ });
568
+ // require that a user has purchased at least one token on this project
569
+ uint256 numPurchased = receipt.numPurchased;
570
+ require(numPurchased > 0, "No purchases made by this address");
571
+
572
+ uint256 currentSettledTokenPrice = _settlementAuctionProjectConfig
573
+ .latestPurchasePrice;
574
+
575
+ // calculate the excess settlement funds amount
576
+ // implicit overflow/underflow checks in solidity ^0.8
577
+ requiredAmountPosted = numPurchased * currentSettledTokenPrice;
578
+ excessSettlementFunds = receipt.netPosted - requiredAmountPosted;
579
+ }
580
+
581
+ /**
582
+ * @notice Gets price of minting a token on project `projectId` given
583
+ * the project's AuctionParameters and current block timestamp.
584
+ * Reverts if auction has not yet started or auction is unconfigured, and
585
+ * local hasMaxBeenInvoked is false and revenues have not been withdrawn.
586
+ * Price is guaranteed to be accurate unless the minter's local
587
+ * hasMaxBeenInvoked is stale and returning a false negative.
588
+ * @dev when an accurate price is required regardless of the current state
589
+ * state of the locally cached minter max invocations, use the less gas
590
+ * efficient function `getPriceSafe`.
591
+ * @param projectId Project ID to get price of token for.
592
+ * @param coreContract Core contract address to get price for.
593
+ * @param maxHasBeenInvoked Bool representing if maxHasBeenInvoked for the
594
+ * project.
595
+ * @return uint256 current price of token in Wei, accurate if minter max
596
+ * invocations are up to date
597
+ * @dev This method calculates price decay using a linear interpolation
598
+ * of exponential decay based on the artist-provided half-life for price
599
+ * decay, `priceDecayHalfLifeSeconds`.
600
+ */
601
+ function getPriceUnsafe(
602
+ uint256 projectId,
603
+ address coreContract,
604
+ bool maxHasBeenInvoked
605
+ ) internal view returns (uint256) {
606
+ // load the project's settlement auction config
607
+ SettlementAuctionProjectConfig
608
+ storage settlementAuctionProjectConfig = getSettlementAuctionProjectConfig({
609
+ projectId: projectId,
610
+ coreContract: coreContract
611
+ });
612
+ // return latest purchase price if:
613
+ // - minter is aware of a sold-out auction (without updating max
614
+ // invocation value)
615
+ // - auction revenues have been collected, at which point the latest
616
+ // purchase price will never change again
617
+ if (
618
+ maxHasBeenInvoked ||
619
+ settlementAuctionProjectConfig.auctionRevenuesCollected
620
+ ) {
621
+ return settlementAuctionProjectConfig.latestPurchasePrice;
622
+ }
623
+ // otherwise calculate price based on current block timestamp and
624
+ // auction configuration
625
+ // @dev this will revert if auction has not yet started or auction is
626
+ // unconfigured, which is relied upon for security.
627
+ return
628
+ DAExpLib.getPriceExp({
629
+ projectId: projectId,
630
+ coreContract: coreContract
631
+ });
632
+ }
633
+
634
+ /**
635
+ * @notice Gets price of minting a token on project `projectId` given
636
+ * the project's AuctionParameters and current block timestamp.
637
+ * This is labeled as "safe", because price is guaranteed to be accurate
638
+ * even in the case of a stale locally cached minter max invocations.
639
+ * Reverts if auction has not yet started or auction is unconfigured, and
640
+ * auction has not sold out or revenues have not been withdrawn.
641
+ * @dev This method is less gas efficient than `getPriceUnsafe`, but is
642
+ * guaranteed to be accurate.
643
+ * @param projectId Project ID to get price of token for.
644
+ * @param coreContract Core contract address to get price for.
645
+ * @return tokenPriceInWei current price of token in Wei
646
+ * @dev This method calculates price decay using a linear interpolation
647
+ * of exponential decay based on the artist-provided half-life for price
648
+ * decay, `priceDecayHalfLifeSeconds`.
649
+ */
650
+ function getPriceSafe(
651
+ uint256 projectId,
652
+ address coreContract
653
+ ) internal view returns (uint256 tokenPriceInWei) {
654
+ // load the project's settlement auction config
655
+ SettlementAuctionProjectConfig
656
+ storage settlementAuctionProjectConfig = getSettlementAuctionProjectConfig({
657
+ projectId: projectId,
658
+ coreContract: coreContract
659
+ });
660
+ // accurately check if project has sold out
661
+ if (
662
+ MaxInvocationsLib.projectMaxHasBeenInvokedSafe({
663
+ projectId: projectId,
664
+ coreContract: coreContract
665
+ })
666
+ ) {
667
+ // max invocations have been reached, return the latest purchased
668
+ // price
669
+ tokenPriceInWei = settlementAuctionProjectConfig
670
+ .latestPurchasePrice;
671
+ } else {
672
+ // if not sold out, return the current price via getPriceUnsafe
673
+ tokenPriceInWei = getPriceUnsafe({
674
+ projectId: projectId,
675
+ coreContract: coreContract,
676
+ maxHasBeenInvoked: false // this branch is only reached if max invocations have not been reached
677
+ });
678
+ }
679
+ return tokenPriceInWei;
680
+ }
681
+
682
+ /**
683
+ * @notice Returns if a new auction's start price is valid, given the current
684
+ * state of the project's settlement auction configuration.
685
+ * @param projectId Project ID to check start price for
686
+ * @param coreContract Core contract address to check start price for
687
+ * @param startPrice starting price of new auction, in wei
688
+ */
689
+ function isValidStartPrice(
690
+ uint256 projectId,
691
+ address coreContract,
692
+ uint256 startPrice
693
+ ) internal view returns (bool) {
694
+ // load the project's settlement auction config
695
+ SettlementAuctionProjectConfig
696
+ storage settlementAuctionProjectConfig = getSettlementAuctionProjectConfig({
697
+ projectId: projectId,
698
+ coreContract: coreContract
699
+ });
700
+ // If previous purchases have been made, require monotonically
701
+ // decreasing purchase prices to preserve settlement and revenue
702
+ // claiming logic. Since base price is always non-zero, if
703
+ // latestPurchasePrice is zero, then no previous purchases have been
704
+ // made, and startPrice may be set to any value.
705
+ return (settlementAuctionProjectConfig.latestPurchasePrice == 0 || // never purchased
706
+ startPrice <= settlementAuctionProjectConfig.latestPurchasePrice);
707
+ }
708
+
709
+ /**
710
+ * Loads the SettlementAuctionProjectConfig for a given project and core
711
+ * contract.
712
+ * @param projectId Project Id to get config for
713
+ * @param coreContract Core contract address to get config for
714
+ */
715
+ function getSettlementAuctionProjectConfig(
716
+ uint256 projectId,
717
+ address coreContract
718
+ ) internal view returns (SettlementAuctionProjectConfig storage) {
719
+ return s().settlementAuctionProjectConfigs[coreContract][projectId];
720
+ }
721
+
722
+ /**
723
+ * Loads the Receipt for a given user, project and core contract.
724
+ * @param walletAddress User address to get receipt for
725
+ * @param projectId Project Id to get config for
726
+ * @param coreContract Core contract address to get config for
727
+ */
728
+ function getReceipt(
729
+ address walletAddress,
730
+ uint256 projectId,
731
+ address coreContract
732
+ ) internal view returns (Receipt storage) {
733
+ return s().receipts[walletAddress][coreContract][projectId];
734
+ }
735
+
736
+ /**
737
+ * @notice Return the storage struct for reading and writing. This library
738
+ * uses a diamond storage pattern when managing storage.
739
+ * @return storageStruct The SettlementExpLibStorage struct.
740
+ */
741
+ function s()
742
+ internal
743
+ pure
744
+ returns (SettlementExpLibStorage storage storageStruct)
745
+ {
746
+ bytes32 position = SETTLEMENT_EXP_LIB_STORAGE_POSITION;
747
+ assembly ("memory-safe") {
748
+ storageStruct.slot := position
749
+ }
750
+ }
751
+
752
+ /**
753
+ * Returns if all tokens to be auctioned were sold, for a given project.
754
+ * Returns false if the number of tokens to be auctioned is zero, since
755
+ * that is the default value for unconfigured values.
756
+ * @param settlementAuctionProjectConfig The SettlementAuctionProjectConfig
757
+ * struct of the project to check.
758
+ */
759
+ function _allTokensToBeAuctionedWereSold(
760
+ SettlementAuctionProjectConfig storage settlementAuctionProjectConfig
761
+ ) private view returns (bool) {
762
+ // @dev load numAllocations into memory for gas efficiency
763
+ uint256 numTokensToBeAuctioned = settlementAuctionProjectConfig
764
+ .numTokensToBeAuctioned;
765
+ return
766
+ numTokensToBeAuctioned > 0 &&
767
+ settlementAuctionProjectConfig.numPurchasesOnMinter ==
768
+ numTokensToBeAuctioned;
769
+ }
770
+ }