@artblocks/contracts 1.0.4 → 1.2.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 (289) hide show
  1. package/README.md +75 -7
  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 +336 -131
  5. package/artifacts/contracts/archive/GenArt721CoreV3.sol/GenArt721CoreV3.json +2047 -0
  6. package/artifacts/contracts/archive/GenArt721CoreV3_Explorations.sol/GenArt721CoreV3_Explorations.json +2021 -0
  7. package/artifacts/contracts/{minter-suite → archive/minter-suite}/Minters/MinterBase_v0_1_1.sol/MinterBase.json +1 -1
  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/{minter-suite/Minters → archive/minter-suite/Minters/MinterDAExp}/MinterDAExpV4.sol/MinterDAExpV4.json +3 -3
  11. package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol/MinterDAExpSettlementV0.json +2 -2
  12. package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV1.sol/MinterDAExpSettlementV1.json +2 -2
  13. package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV2.sol/MinterDAExpSettlementV2.json +1109 -0
  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/{minter-suite/Minters → archive/minter-suite/Minters/MinterDALin}/MinterDALinV4.sol/MinterDALinV4.json +3 -3
  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/{minter-suite/Minters → archive/minter-suite/Minters/MinterHolder}/MinterHolderV4.sol/MinterHolderV4.json +3 -3
  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/{minter-suite/Minters → archive/minter-suite/Minters/MinterMerkle}/MinterMerkleV5.sol/MinterMerkleV5.json +3 -3
  26. package/artifacts/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterPolyptych}/MinterPolyptychV0.sol/IGenArt721CoreContractV3WithRandomizer.json +31 -63
  27. package/artifacts/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterPolyptych}/MinterPolyptychV0.sol/MinterPolyptychV0.json +3 -3
  28. package/artifacts/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterSEA}/MinterSEAV0.sol/MinterSEAV0.json +3 -3
  29. package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV2.sol/MinterSetPriceV2.json +2 -2
  30. package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV3.sol/MinterSetPriceV3.json +2 -2
  31. package/artifacts/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterSetPrice}/MinterSetPriceV4.sol/MinterSetPriceV4.json +3 -3
  32. package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V0.sol/MinterSetPriceERC20V0.json +65 -2
  33. package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V1.sol/MinterSetPriceERC20V1.json +65 -2
  34. package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V2.sol/MinterSetPriceERC20V2.json +2 -2
  35. package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V3.sol/MinterSetPriceERC20V3.json +2 -2
  36. package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V4.sol/MinterSetPriceERC20V4.json +807 -0
  37. package/artifacts/contracts/engine/V2/GenArt721MinterBurner_PBAB.sol/GenArt721MinterBurner_PBAB.json +65 -2
  38. package/artifacts/contracts/engine/V2/GenArt721Minter_PBAB.sol/GenArt721Minter_PBAB.json +65 -2
  39. package/artifacts/contracts/engine/V3/EngineFactoryV0.sol/EngineFactoryV0.json +606 -0
  40. package/artifacts/contracts/engine/V3/GenArt721CoreV3_Engine.sol/GenArt721CoreV3_Engine.json +565 -209
  41. package/artifacts/contracts/engine/V3/GenArt721CoreV3_Engine_Flex.sol/GenArt721CoreV3_Engine_Flex.json +785 -227
  42. package/artifacts/contracts/engine/V3/forks/GenArt721CoreV3_Engine_Flex_PROOF.sol/GenArt721CoreV3_Engine_Flex_PROOF.json +40 -15
  43. package/artifacts/contracts/engine/V3/forks/PROHIBITION/AdminACLV0_PROHIBITION.sol/AdminACLV0_PROHIBITION.json +2 -2
  44. package/artifacts/contracts/engine/V3/forks/PROHIBITION/GenArt721CoreV3_Engine_Flex_PROHIBITION.sol/GenArt721CoreV3_Engine_Flex_PROHIBITION.json +40 -15
  45. package/artifacts/contracts/engine/V3/forks/PROHIBITION/interfaces/IGenArt721CoreContractV3_Engine_Flex_PROHIBITION.sol/IGenArt721CoreContractV3_Engine_Flex_PROHIBITION.json +36 -68
  46. package/artifacts/contracts/engine-registry/CoreRegistryV1.sol/CoreRegistryV1.json +12 -12
  47. package/artifacts/contracts/interfaces/v0.8.x/IAdminACLV0_Extended.sol/IAdminACLV0_Extended.json +140 -0
  48. package/artifacts/contracts/interfaces/v0.8.x/IBytecodeStorageReaderV2.sol/IBytecodeStorageReaderV2.json +130 -0
  49. package/artifacts/contracts/interfaces/v0.8.x/ICoreRegistryV1.sol/ICoreRegistryV1.json +6 -6
  50. package/artifacts/contracts/interfaces/v0.8.x/IDependencyRegistryV0.sol/IDependencyRegistryV0.json +71 -39
  51. package/artifacts/contracts/interfaces/v0.8.x/IEngineFactoryV0.sol/IEngineFactoryV0.json +283 -0
  52. package/artifacts/contracts/interfaces/v0.8.x/IFilteredMinterDAExpSettlementV0.sol/IFilteredMinterDAExpSettlementV0.json +12 -12
  53. package/artifacts/contracts/interfaces/v0.8.x/IFilteredMinterDAExpSettlementV1.sol/IFilteredMinterDAExpSettlementV1.json +12 -12
  54. package/artifacts/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3.sol/IGenArt721CoreContractV3.json +30 -62
  55. package/artifacts/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Base.sol/IGenArt721CoreContractV3_Base.json +30 -62
  56. package/artifacts/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Engine.sol/IGenArt721CoreContractV3_Engine.json +170 -104
  57. package/artifacts/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Engine_Flex.sol/IGenArt721CoreContractV3_Engine_Flex.json +170 -104
  58. package/artifacts/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Engine_Flex_PreV3p2.sol/IGenArt721CoreContractV3_Engine_Flex_PreV3p2.json +1028 -0
  59. package/artifacts/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Engine_PreV3p2.sol/IGenArt721CoreContractV3_Engine_PreV3p2.json +741 -0
  60. package/artifacts/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_ProjectFinance.sol/IGenArt721CoreContractV3_ProjectFinance.json +87 -0
  61. package/artifacts/contracts/interfaces/v0.8.x/IGenArt721Minter_PBAB.sol/IGenArt721Minter_PBAB.json +279 -0
  62. package/artifacts/contracts/interfaces/v0.8.x/IMinterFilterV1.sol/IMinterFilterV1.json +22 -22
  63. package/artifacts/contracts/interfaces/v0.8.x/IPseudorandomAtomic.sol/IPseudorandomAtomic.json +1 -1
  64. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterDAExpSettlementV0.sol/ISharedMinterDAExpSettlementV0.json +26 -101
  65. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterDAExpV0.sol/ISharedMinterDAExpV0.json +1 -57
  66. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterDALinV0.sol/ISharedMinterDALinV0.json +1 -57
  67. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterDAV0.sol/ISharedMinterDAV0.json +2 -21
  68. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterHolderERC20V0.sol/ISharedMinterHolderERC20V0.json +158 -0
  69. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterHolderV0.sol/ISharedMinterHolderV0.json +15 -90
  70. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterMerkleV0.sol/ISharedMinterMerkleV0.json +10 -36
  71. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterRAMV0.sol/ISharedMinterRAMV0.json +62 -0
  72. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterRequired.sol/ISharedMinterRequired.json +37 -0
  73. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterSEAV0.sol/ISharedMinterSEAV0.json +4 -236
  74. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterSimplePurchaseV0.sol/ISharedMinterSimplePurchaseV0.json +5 -5
  75. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterV0.sol/ISharedMinterV0.json +7 -423
  76. package/artifacts/contracts/interfaces/v0.8.x/ISharedRandomizerV0.sol/ISharedRandomizerV0.json +17 -17
  77. package/artifacts/contracts/interfaces/v0.8.x/ISplitAtomicFactoryV0.sol/ISplitAtomicFactoryV0.json +170 -0
  78. package/artifacts/contracts/interfaces/v0.8.x/ISplitAtomicV0.sol/ISplitAtomicV0.json +126 -0
  79. package/artifacts/contracts/interfaces/v0.8.x/ISplitProviderV0.sol/ISplitProviderV0.json +98 -0
  80. package/artifacts/contracts/interfaces/v0.8.x/integration-refs/splits-0x-v2/ISplitFactoryV2.sol/ISplitFactoryV2.json +123 -0
  81. package/artifacts/contracts/libs/integration-refs/delegation-registry/DelegationRegistry.sol/DelegationRegistry.json +2 -2
  82. package/artifacts/contracts/libs/integration-refs/gnosis-safe/GnosisSafeMock.sol/GnosisSafeMock.json +2 -2
  83. package/artifacts/contracts/libs/integration-refs/gnosis-safe/GnosisSafeProxyFactoryMock.sol/GnosisSafeProxyFactoryMock.json +2 -2
  84. package/artifacts/contracts/libs/integration-refs/gnosis-safe/MultiSendMock.sol/MultiSendMock.json +2 -2
  85. package/artifacts/contracts/libs/integration-refs/weth9/weth9.sol/WETH9_.json +2 -2
  86. package/artifacts/contracts/libs/v0.8.x/ABHelpers.sol/ABHelpers.json +2 -2
  87. package/artifacts/contracts/libs/v0.8.x/AuthLib.sol/AuthLib.json +2 -2
  88. package/artifacts/contracts/libs/v0.8.x/BitMap.sol/BitMaps256.json +10 -0
  89. package/artifacts/contracts/libs/v0.8.x/BytecodeStorageV0.sol/BytecodeStorage.json +2 -2
  90. package/artifacts/contracts/libs/v0.8.x/BytecodeStorageV1.sol/BytecodeStorageReader.json +2 -2
  91. package/artifacts/contracts/libs/v0.8.x/BytecodeStorageV1.sol/BytecodeStorageWriter.json +2 -2
  92. package/artifacts/contracts/libs/v0.8.x/BytecodeStorageV2.sol/BytecodeStorageReader.json +214 -0
  93. package/artifacts/contracts/libs/v0.8.x/BytecodeStorageV2.sol/BytecodeStorageWriter.json +10 -0
  94. package/artifacts/contracts/libs/v0.8.x/Bytes32Strings.sol/Bytes32Strings.json +2 -2
  95. package/artifacts/contracts/libs/v0.8.x/DependencyRegistryStorageLib.sol/DependencyRegistryStorageLib.json +10 -0
  96. package/artifacts/contracts/libs/v0.8.x/ERC721_PackedHashSeed.sol/ERC721_PackedHashSeed.json +2 -2
  97. package/artifacts/contracts/libs/v0.8.x/ERC721_PackedHashSeedV1.sol/ERC721_PackedHashSeedV1.json +444 -0
  98. package/artifacts/contracts/libs/v0.8.x/PackedBools.sol/PackedBools.json +10 -0
  99. package/artifacts/contracts/libs/v0.8.x/SSTORE2.sol/SSTORE2.json +2 -2
  100. package/artifacts/contracts/libs/v0.8.x/V3FlexLib.sol/V3FlexLib.json +208 -0
  101. package/artifacts/contracts/libs/v0.8.x/minter-libs/DAExpLib.sol/DAExpLib.json +60 -3
  102. package/artifacts/contracts/libs/v0.8.x/minter-libs/DALib.sol/DALib.json +30 -0
  103. package/artifacts/contracts/libs/v0.8.x/minter-libs/DALinLib.sol/DALinLib.json +60 -3
  104. package/artifacts/contracts/libs/v0.8.x/minter-libs/GenericMinterEventsLib.sol/GenericMinterEventsLib.json +346 -0
  105. package/artifacts/contracts/libs/v0.8.x/minter-libs/MaxInvocationsLib.sol/MaxInvocationsLib.json +29 -3
  106. package/artifacts/contracts/libs/v0.8.x/minter-libs/MerkleLib.sol/MerkleLib.json +30 -3
  107. package/artifacts/contracts/libs/v0.8.x/minter-libs/PolyptychLib.sol/PolyptychLib.json +2 -2
  108. package/artifacts/contracts/libs/v0.8.x/minter-libs/RAMLib.sol/RAMLib.json +398 -0
  109. package/artifacts/contracts/libs/v0.8.x/minter-libs/SEALib.sol/SEALib.json +254 -3
  110. package/artifacts/contracts/libs/v0.8.x/minter-libs/SetPriceLib.sol/SetPriceLib.json +48 -3
  111. package/artifacts/contracts/libs/v0.8.x/minter-libs/SettlementExpLib.sol/SettlementExpLib.json +41 -3
  112. package/artifacts/contracts/libs/v0.8.x/minter-libs/SplitFundsLib.sol/SplitFundsLib.json +35 -3
  113. package/artifacts/contracts/libs/v0.8.x/minter-libs/TokenHolderLib.sol/TokenHolderLib.json +79 -3
  114. package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV1.sol/MinterFilterV1.json +2 -2
  115. package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV2.sol/MinterFilterV2.json +41 -41
  116. package/artifacts/contracts/minter-suite/Minters/MinterDAExpHolderV5.sol/MinterDAExpHolderV5.json +66 -632
  117. package/artifacts/contracts/minter-suite/Minters/MinterDAExpSettlementV3.sol/MinterDAExpSettlementV3.json +67 -594
  118. package/artifacts/contracts/minter-suite/Minters/MinterDAExpV5.sol/MinterDAExpV5.json +33 -524
  119. package/artifacts/contracts/minter-suite/Minters/MinterDALinHolderV5.sol/MinterDALinHolderV5.json +66 -632
  120. package/artifacts/contracts/minter-suite/Minters/MinterDALinV5.sol/MinterDALinV5.json +33 -524
  121. package/artifacts/contracts/minter-suite/Minters/MinterRAMV0.sol/MinterRAMV0.json +1374 -0
  122. package/artifacts/contracts/minter-suite/Minters/MinterSEAV1.sol/MinterSEAV1.json +56 -722
  123. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20V5.sol/MinterSetPriceERC20V5.json +58 -454
  124. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceHolderV5.sol/MinterSetPriceHolderV5.json +61 -552
  125. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceMerkleV5.sol/MinterSetPriceMerkleV5.json +55 -497
  126. package/artifacts/contracts/minter-suite/Minters/MinterSetPricePolyptychERC20V5.sol/MinterSetPricePolyptychERC20V5.json +110 -571
  127. package/artifacts/contracts/minter-suite/Minters/MinterSetPricePolyptychV5.sol/MinterSetPricePolyptychV5.json +69 -560
  128. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceV5.sol/MinterSetPriceV5.json +28 -444
  129. package/artifacts/contracts/minter-suite/Minters/one-off/MinterSetPriceV5_SingleCore.sol/MinterSetPriceV5_SingleCore.json +417 -0
  130. package/artifacts/contracts/mock/BytecodeV2LibCallsMock.sol/BytecodeV2LibCallsMock.json +154 -0
  131. package/artifacts/contracts/mock/BytecodeV2TextCR_DMock.sol/BytecodeV2TextCR_DMock.json +428 -0
  132. package/artifacts/contracts/mock/DummySharedMinter.sol/DummySharedMinter.json +2 -2
  133. package/artifacts/contracts/mock/ERC20Mock.sol/ERC20Mock.json +2 -2
  134. package/artifacts/contracts/mock/ForceSendMock.sol/ForceSendMock.json +24 -0
  135. package/artifacts/contracts/mock/GenArt721CoreV3_Engine_IncorrectCoreType.sol/GenArt721CoreV3_Engine_IncorrectCoreType.json +4 -9
  136. package/artifacts/contracts/mock/Mock0xSplitsV2PullFactory.sol/Mock0xSplitsV2PullFactory.json +149 -0
  137. package/artifacts/contracts/mock/Mock0xSplitsV2Splitter.sol/Mock0xSplitsV2Splitter.json +99 -0
  138. package/artifacts/contracts/mock/MockAdminACLV0.sol/MockAdminACLV0Events.json +20 -2
  139. package/artifacts/contracts/mock/MockAdminACLV0_PROHIBITION.sol/MockAdminACLV0Events_PROHIBITION.json +20 -2
  140. package/artifacts/contracts/mock/OriginRegisterMock.sol/OriginRegisterMock.json +2 -2
  141. package/artifacts/contracts/mock/RandomizerV2_NoAssignMock.sol/RandomizerV2_NoAssignMock.json +2 -2
  142. package/artifacts/contracts/mock/ReentrancyGenArt721MinterMock.sol/ReentrancyGenArt721MinterMock.json +100 -0
  143. package/artifacts/contracts/mock/ReentrancyHolderMock.sol/ReentrancyHolderMock.json +2 -2
  144. package/artifacts/contracts/mock/ReentrancyHolderMockShared.sol/ReentrancyHolderMockShared.json +136 -0
  145. package/artifacts/contracts/mock/ReentrancyMerkleMock.sol/ReentrancyMerkleMock.json +2 -2
  146. package/artifacts/contracts/mock/ReentrancyMerkleMockShared.sol/ReentrancyMerkleMockShared.json +105 -0
  147. package/artifacts/contracts/mock/ReentrancyMock.sol/ReentrancyMock.json +2 -2
  148. package/artifacts/contracts/mock/ReentrancyMockShared.sol/ReentrancyMockShared.json +100 -0
  149. package/artifacts/contracts/mock/ReentrancySEAMock.sol/ReentrancySEAAutoBidderMock.json +2 -2
  150. package/artifacts/contracts/mock/ReentrancySEAMockShared.sol/ReentrancySEAAutoBidderMockShared.json +69 -0
  151. package/artifacts/contracts/mock/ReentrancySplitterMocks.sol/ReentrancySplitterDrainETHMock.json +54 -0
  152. package/artifacts/contracts/mock/ReentrancySplitterMocks.sol/ReentrancySplitterSendETHMock.json +54 -0
  153. package/artifacts/contracts/randomizer/deprecated/PolyptychRandomizerV0.sol/BasicPolyptychRandomizerV0.json +2 -2
  154. package/artifacts/contracts/randomizer/deprecated/RandomizerV2.sol/BasicRandomizerV2.json +2 -2
  155. package/artifacts/contracts/randomizer/primitive/PseudorandomAtomicBasic.sol/PseudorandomAtomic.json +2 -2
  156. package/artifacts/contracts/randomizer/shared/SharedRandomizerV0.sol/SharedRandomizerV0.json +19 -19
  157. package/artifacts/contracts/split/SplitAtomicFactoryV0.sol/SplitAtomicFactoryV0.json +203 -0
  158. package/artifacts/contracts/split/SplitAtomicV0.sol/SplitAtomicV0.json +168 -0
  159. package/artifacts/contracts/split/split-provider/SplitProviderV0.sol/SplitProviderV0.json +141 -0
  160. package/contracts/AdminACLV0.sol +6 -2
  161. package/contracts/AdminACLV1.sol +2 -2
  162. package/contracts/DependencyRegistryV0.sol +737 -390
  163. package/contracts/{GenArt721CoreV3.sol → archive/GenArt721CoreV3.sol} +56 -20
  164. package/contracts/{explorations → archive}/GenArt721CoreV3_Explorations.sol +49 -13
  165. package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterBase_v0_1_1.sol +4 -4
  166. package/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterDAExp}/MinterDAExpV4.sol +4 -4
  167. package/contracts/archive/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol +4 -4
  168. package/contracts/archive/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV1.sol +5 -5
  169. package/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterDAExpSettlement}/MinterDAExpSettlementV2.sol +9 -62
  170. package/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterDALin}/MinterDALinV4.sol +4 -4
  171. package/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterHolder}/MinterHolderV4.sol +5 -5
  172. package/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterMerkle}/MinterMerkleV5.sol +5 -5
  173. package/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterPolyptych}/MinterPolyptychV0.sol +7 -7
  174. package/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterSEA}/MinterSEAV0.sol +13 -13
  175. package/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterSetPrice}/MinterSetPriceV4.sol +4 -4
  176. package/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V0.sol +82 -10
  177. package/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V1.sol +82 -10
  178. package/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterSetPriceERC20}/MinterSetPriceERC20V4.sol +88 -21
  179. package/contracts/engine/V2/GenArt721MinterBurner_PBAB.sol +81 -22
  180. package/contracts/engine/V2/GenArt721Minter_PBAB.sol +80 -22
  181. package/contracts/engine/V3/EngineFactoryV0.sol +419 -0
  182. package/contracts/engine/V3/GenArt721CoreV3_Engine.sol +893 -493
  183. package/contracts/engine/V3/GenArt721CoreV3_Engine_Flex.sol +1053 -655
  184. package/contracts/engine/V3/forks/GenArt721CoreV3_Engine_Flex_PROOF.sol +7 -13
  185. package/contracts/engine/V3/forks/PROHIBITION/GenArt721CoreV3_Engine_Flex_PROHIBITION.sol +5 -11
  186. package/contracts/engine/V3/forks/PROHIBITION/interfaces/IGenArt721CoreContractV3_Engine_Flex_PROHIBITION.sol +2 -2
  187. package/contracts/engine-registry/CoreRegistryV1.sol +58 -65
  188. package/contracts/interfaces/v0.8.x/IAdminACLV0_Extended.sol +20 -0
  189. package/contracts/interfaces/v0.8.x/IBytecodeStorageReaderV2.sol +23 -0
  190. package/contracts/interfaces/v0.8.x/ICoreRegistryV1.sol +6 -8
  191. package/contracts/interfaces/v0.8.x/IDependencyRegistryV0.sol +48 -43
  192. package/contracts/interfaces/v0.8.x/IEngineFactoryV0.sol +124 -0
  193. package/contracts/interfaces/v0.8.x/IFilteredMinterDAExpSettlementV0.sol +1 -3
  194. package/contracts/interfaces/v0.8.x/IFilteredMinterDAExpSettlementV1.sol +1 -3
  195. package/contracts/interfaces/v0.8.x/IFilteredMinterDAExpV1.sol +1 -3
  196. package/contracts/interfaces/v0.8.x/IFilteredMinterDALinV1.sol +1 -3
  197. package/contracts/interfaces/v0.8.x/IFilteredMinterHolderV2.sol +1 -3
  198. package/contracts/interfaces/v0.8.x/IFilteredMinterMerkleV2.sol +1 -3
  199. package/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Base.sol +115 -11
  200. package/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Engine.sol +84 -8
  201. package/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Engine_Flex.sol +26 -8
  202. package/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Engine_Flex_PreV3p2.sol +141 -0
  203. package/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Engine_PreV3p2.sol +78 -0
  204. package/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_ProjectFinance.sol +47 -0
  205. package/contracts/interfaces/v0.8.x/IGenArt721Minter_PBAB.sol +91 -0
  206. package/contracts/interfaces/v0.8.x/IMinterFilterV1.sol +25 -25
  207. package/contracts/interfaces/v0.8.x/IPseudorandomAtomic.sol +1 -3
  208. package/contracts/interfaces/v0.8.x/ISharedMinterDAExpSettlementV0.sol +30 -20
  209. package/contracts/interfaces/v0.8.x/ISharedMinterDAExpV0.sol +1 -14
  210. package/contracts/interfaces/v0.8.x/ISharedMinterDALinV0.sol +1 -15
  211. package/contracts/interfaces/v0.8.x/ISharedMinterDAV0.sol +2 -8
  212. package/contracts/interfaces/v0.8.x/ISharedMinterHolderERC20V0.sol +47 -0
  213. package/contracts/interfaces/v0.8.x/ISharedMinterHolderV0.sol +15 -43
  214. package/contracts/interfaces/v0.8.x/ISharedMinterMerkleV0.sol +10 -20
  215. package/contracts/interfaces/v0.8.x/ISharedMinterRAMV0.sol +23 -0
  216. package/contracts/interfaces/v0.8.x/ISharedMinterRequired.sol +20 -0
  217. package/contracts/interfaces/v0.8.x/ISharedMinterSEAV0.sol +1 -67
  218. package/contracts/interfaces/v0.8.x/ISharedMinterSimplePurchaseV0.sol +5 -5
  219. package/contracts/interfaces/v0.8.x/ISharedMinterV0.sol +18 -160
  220. package/contracts/interfaces/v0.8.x/ISharedRandomizerV0.sol +37 -37
  221. package/contracts/interfaces/v0.8.x/ISplitAtomicFactoryV0.sol +81 -0
  222. package/contracts/interfaces/v0.8.x/ISplitAtomicV0.sol +72 -0
  223. package/contracts/interfaces/v0.8.x/ISplitProviderV0.sol +49 -0
  224. package/contracts/interfaces/v0.8.x/integration-refs/splits-0x-v2/ISplitFactoryV2.sol +62 -0
  225. package/contracts/libs/v0.8.x/ABHelpers.sol +31 -17
  226. package/contracts/libs/v0.8.x/AuthLib.sol +101 -102
  227. package/contracts/libs/v0.8.x/BitMap.sol +112 -0
  228. package/contracts/libs/v0.8.x/BytecodeStorageV2.sol +593 -0
  229. package/contracts/libs/v0.8.x/Bytes32Strings.sol +5 -5
  230. package/contracts/libs/v0.8.x/DependencyRegistryStorageLib.sol +90 -0
  231. package/contracts/libs/v0.8.x/ERC721_PackedHashSeedV1.sol +591 -0
  232. package/contracts/libs/v0.8.x/PackedBools.sol +42 -0
  233. package/contracts/libs/v0.8.x/V3FlexLib.sol +591 -0
  234. package/contracts/libs/v0.8.x/minter-libs/DAExpLib.sol +162 -39
  235. package/contracts/libs/v0.8.x/minter-libs/DALib.sol +26 -0
  236. package/contracts/libs/v0.8.x/minter-libs/DALinLib.sol +139 -37
  237. package/contracts/libs/v0.8.x/minter-libs/GenericMinterEventsLib.sol +171 -0
  238. package/contracts/libs/v0.8.x/minter-libs/MaxInvocationsLib.sol +299 -158
  239. package/contracts/libs/v0.8.x/minter-libs/MerkleLib.sol +268 -55
  240. package/contracts/libs/v0.8.x/minter-libs/PolyptychLib.sol +138 -58
  241. package/contracts/libs/v0.8.x/minter-libs/RAMLib.sol +2927 -0
  242. package/contracts/libs/v0.8.x/minter-libs/SEALib.sol +796 -123
  243. package/contracts/libs/v0.8.x/minter-libs/SetPriceLib.sol +131 -13
  244. package/contracts/libs/v0.8.x/minter-libs/SettlementExpLib.sol +607 -224
  245. package/contracts/libs/v0.8.x/minter-libs/SplitFundsLib.sol +494 -330
  246. package/contracts/libs/v0.8.x/minter-libs/TokenHolderLib.sol +217 -78
  247. package/contracts/minter-suite/MinterFilter/MinterFilterV2.sol +358 -309
  248. package/contracts/minter-suite/Minters/MinterDAExpHolderV5.sol +391 -491
  249. package/contracts/minter-suite/Minters/MinterDAExpSettlementV3.sol +396 -632
  250. package/contracts/minter-suite/Minters/MinterDAExpV5.sol +212 -273
  251. package/contracts/minter-suite/Minters/MinterDALinHolderV5.sol +393 -488
  252. package/contracts/minter-suite/Minters/MinterDALinV5.sol +220 -277
  253. package/contracts/minter-suite/Minters/MinterRAMV0.sol +1205 -0
  254. package/contracts/minter-suite/Minters/MinterSEAV1.sol +329 -677
  255. package/contracts/minter-suite/Minters/MinterSetPriceERC20V5.sol +287 -303
  256. package/contracts/minter-suite/Minters/MinterSetPriceHolderV5.sol +355 -446
  257. package/contracts/minter-suite/Minters/MinterSetPriceMerkleV5.sol +328 -416
  258. package/contracts/minter-suite/Minters/MinterSetPricePolyptychERC20V5.sol +552 -622
  259. package/contracts/minter-suite/Minters/MinterSetPricePolyptychV5.sol +429 -553
  260. package/contracts/minter-suite/Minters/MinterSetPriceV5.sol +180 -227
  261. package/contracts/minter-suite/Minters/one-off/MinterSetPriceV5_SingleCore.sol +446 -0
  262. package/contracts/mock/BytecodeV2LibCallsMock.sol +128 -0
  263. package/contracts/mock/BytecodeV2TextCR_DMock.sol +316 -0
  264. package/contracts/mock/ForceSendMock.sol +22 -0
  265. package/contracts/mock/GenArt721CoreV3_Engine_IncorrectCoreType.sol +3 -10
  266. package/contracts/mock/Mock0xSplitsV2PullFactory.sol +75 -0
  267. package/contracts/mock/Mock0xSplitsV2Splitter.sol +47 -0
  268. package/contracts/mock/MockAdminACLV0.sol +21 -0
  269. package/contracts/mock/MockAdminACLV0_PROHIBITION.sol +21 -0
  270. package/contracts/mock/ReentrancyGenArt721MinterMock.sol +47 -0
  271. package/contracts/mock/ReentrancyHolderMockShared.sol +59 -0
  272. package/contracts/mock/ReentrancyMerkleMockShared.sol +58 -0
  273. package/contracts/mock/ReentrancyMockShared.sol +48 -0
  274. package/contracts/mock/ReentrancySEAMockShared.sol +40 -0
  275. package/contracts/mock/ReentrancySplitterMocks.sol +67 -0
  276. package/contracts/randomizer/primitive/PseudorandomAtomicBasic.sol +1 -1
  277. package/contracts/randomizer/shared/SharedRandomizerV0.sol +79 -71
  278. package/contracts/split/SplitAtomicFactoryV0.sol +121 -0
  279. package/contracts/split/SplitAtomicV0.sol +265 -0
  280. package/contracts/split/split-provider/SplitProviderV0.sol +201 -0
  281. package/package.json +79 -45
  282. package/artifacts/contracts/GenArt721CoreV3.sol/GenArt721CoreV3.json +0 -1965
  283. package/artifacts/contracts/explorations/GenArt721CoreV3_Explorations.sol/GenArt721CoreV3_Explorations.json +0 -1939
  284. package/artifacts/contracts/minter-suite/Minters/MinterDAExpSettlementV2.sol/MinterDAExpSettlementV2.json +0 -1127
  285. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20V4.sol/MinterSetPriceERC20V4.json +0 -768
  286. package/artifacts/contracts/royalty-registry/GenArt721RoyaltyOverride.sol/GenArt721RoyaltyOverride.json +0 -208
  287. package/artifacts/contracts/royalty-registry/GenArt721RoyaltyOverride_PBAB.sol/GenArt721RoyaltyOverride_PBAB.json +0 -301
  288. package/contracts/royalty-registry/GenArt721RoyaltyOverride.sol +0 -168
  289. package/contracts/royalty-registry/GenArt721RoyaltyOverride_PBAB.sol +0 -221
@@ -3,10 +3,10 @@
3
3
 
4
4
  pragma solidity 0.8.19;
5
5
 
6
- import "../../interfaces/v0.8.x/IGenArt721CoreContractV3_Base.sol";
7
- import "../../interfaces/v0.8.x/IMinterFilterV0.sol";
8
- import "../../interfaces/v0.8.x/IFilteredMinterSEAV0.sol";
9
- import "./MinterBase_v0_1_1.sol";
6
+ import "../../../../interfaces/v0.8.x/IGenArt721CoreContractV3_Base.sol";
7
+ import "../../../../interfaces/v0.8.x/IMinterFilterV0.sol";
8
+ import "../../../../interfaces/v0.8.x/IFilteredMinterSEAV0.sol";
9
+ import "../MinterBase_v0_1_1.sol";
10
10
 
11
11
  import "@openzeppelin-4.7/contracts/token/ERC721/IERC721.sol";
12
12
  import "@openzeppelin-4.7/contracts/security/ReentrancyGuard.sol";
@@ -119,23 +119,23 @@ contract MinterSEAV0 is ReentrancyGuard, MinterBase, IFilteredMinterSEAV0 {
119
119
 
120
120
  // minter-wide, admin-configurable parameters
121
121
  // ----------------------------------------
122
- // minimum inital auction length, in seconds; configurable by admin
122
+ // minimum initial auction length, in seconds; configurable by admin
123
123
  // max uint32 ~= 4.3e9 sec ~= 136 years
124
124
  // @dev enforced only when artist configures a project
125
125
  // @dev default to 10 minutes
126
126
  uint32 minAuctionDurationSeconds = 600;
127
- // maximum inital auction length, in seconds; configurable by admin
127
+ // maximum initial auction length, in seconds; configurable by admin
128
128
  // @dev enforced only when artist configures a project
129
129
  // @dev default to 1 month (1/12 of a year)
130
130
  uint32 maxAuctionDurationSeconds = 2_629_746;
131
131
  // the minimum percent increase for new bids above the current bid
132
- // configureable by admin
132
+ // configurable by admin
133
133
  // max uint8 ~= 255, > 100 percent
134
134
  // @dev used when determining the increment percentage for any new bid on
135
135
  // the minter, across all projects
136
136
  uint8 minterMinBidIncrementPercentage = 5;
137
137
  // minimum time remaining in auction after a new bid is placed
138
- // configureable by admin
138
+ // configurable by admin
139
139
  // max uint32 ~= 4.3e9 sec ~= 136 years
140
140
  // @dev used when determining the buffer time for any new bid on the
141
141
  // minter, across all projects
@@ -406,7 +406,7 @@ contract MinterSEAV0 is ReentrancyGuard, MinterBase, IFilteredMinterSEAV0 {
406
406
  * @param _projectId Project ID to set future auction details for.
407
407
  * @param _timestampStart Timestamp after which new auctions may be
408
408
  * started. Note that this is not the timestamp of the auction start, but
409
- * rather the timestamp after which a auction may be started. Also note
409
+ * rather the timestamp after which an auction may be started. Also note
410
410
  * that the passed value here must either be in the future, or `0` (which
411
411
  * indicates that auctions are immediately startable).
412
412
  * @param _auctionDurationSeconds Duration of new auctions, in seconds,
@@ -499,7 +499,7 @@ contract MinterSEAV0 is ReentrancyGuard, MinterBase, IFilteredMinterSEAV0 {
499
499
  * has a "next token" assigned to a project, but the project has been reset
500
500
  * via `resetAuctionDetails`, and the artist does not want an auction to be
501
501
  * started for the "next token". This function also protects against the
502
- * unforseen case where the minter is in an unexpected state where it has a
502
+ * unforeseen case where the minter is in an unexpected state where it has a
503
503
  * "next token" assigned to a project, but for some reason the project is
504
504
  * unable to begin a new auction due to a bug.
505
505
  * @dev only a single token may be actively assigned to a project's "next
@@ -541,11 +541,11 @@ contract MinterSEAV0 is ReentrancyGuard, MinterBase, IFilteredMinterSEAV0 {
541
541
 
542
542
  /**
543
543
  * @notice Emergency, Artist-only function that attempts to mint a new
544
- * token and set it as the the next token to be auctioned for project
544
+ * token and set it as the next token to be auctioned for project
545
545
  * `_projectId`.
546
- * Note: This function is only included for emergency, unforseen use cases,
546
+ * Note: This function is only included for emergency, unforeseen use cases,
547
547
  * and should not be used in normal operation. It is here only for
548
- * redundant protection against an unforseen edge case where the minter
548
+ * redundant protection against an unforeseen edge case where the minter
549
549
  * does not have a populated "next token", but there are still invocations
550
550
  * remaining on the project.
551
551
  * This function reverts if the project is not configured on this minter.
@@ -1,10 +1,10 @@
1
1
  // SPDX-License-Identifier: LGPL-3.0-only
2
2
  // Created By: Art Blocks Inc.
3
3
 
4
- import "../../interfaces/v0.8.x/IGenArt721CoreContractV3_Base.sol";
5
- import "../../interfaces/v0.8.x/IMinterFilterV0.sol";
6
- import "../../interfaces/v0.8.x/IFilteredMinterV2.sol";
7
- import "./MinterBase_v0_1_1.sol";
4
+ import "../../../../interfaces/v0.8.x/IGenArt721CoreContractV3_Base.sol";
5
+ import "../../../../interfaces/v0.8.x/IMinterFilterV0.sol";
6
+ import "../../../../interfaces/v0.8.x/IFilteredMinterV2.sol";
7
+ import "../MinterBase_v0_1_1.sol";
8
8
 
9
9
  import "@openzeppelin-4.5/contracts/security/ReentrancyGuard.sol";
10
10
 
@@ -231,19 +231,46 @@ contract MinterSetPriceERC20V0 is ReentrancyGuard, IFilteredMinterV0 {
231
231
  }
232
232
 
233
233
  /**
234
- * @notice Purchases a token from project `_projectId`.
234
+ * @notice Purchases a token from project `_projectId` with ETH.
235
235
  * @param _projectId Project ID to mint a token on.
236
236
  * @return tokenId Token ID of minted token
237
237
  */
238
238
  function purchase(
239
239
  uint256 _projectId
240
240
  ) external payable returns (uint256 tokenId) {
241
- tokenId = purchaseTo(msg.sender, _projectId);
241
+ // pass max price as msg.value, currency address as ETH
242
+ tokenId = purchaseTo({
243
+ _to: msg.sender,
244
+ _projectId: _projectId,
245
+ _maxPricePerToken: msg.value,
246
+ _currencyAddress: address(0)
247
+ });
242
248
  return tokenId;
243
249
  }
244
250
 
245
251
  /**
246
- * @notice Purchases a token from project `_projectId` and sets
252
+ * @notice Purchases a token from project `_projectId` with ETH or any ERC-20 token.
253
+ * @param _projectId Project ID to mint a token on.
254
+ * @param _maxPricePerToken Maximum price of token being allowed by the purchaser, no decimal places.
255
+ * @param _currencyAddress Currency address of token. `address(0)` if minting with ETH.
256
+ * @return tokenId Token ID of minted token
257
+ */
258
+ function purchase(
259
+ uint256 _projectId,
260
+ uint256 _maxPricePerToken,
261
+ address _currencyAddress
262
+ ) external payable returns (uint256 tokenId) {
263
+ tokenId = purchaseTo({
264
+ _to: msg.sender,
265
+ _projectId: _projectId,
266
+ _maxPricePerToken: _maxPricePerToken,
267
+ _currencyAddress: _currencyAddress
268
+ });
269
+ return tokenId;
270
+ }
271
+
272
+ /**
273
+ * @notice Purchases a token from project `_projectId` with ETH and sets
247
274
  * the token's owner to `_to`.
248
275
  * @param _to Address to be the new token's owner.
249
276
  * @param _projectId Project ID to mint a token on.
@@ -252,6 +279,31 @@ contract MinterSetPriceERC20V0 is ReentrancyGuard, IFilteredMinterV0 {
252
279
  function purchaseTo(
253
280
  address _to,
254
281
  uint256 _projectId
282
+ ) public payable returns (uint256 tokenId) {
283
+ // pass max price as msg.value, currency address as ETH
284
+ return
285
+ purchaseTo({
286
+ _to: _to,
287
+ _projectId: _projectId,
288
+ _maxPricePerToken: msg.value,
289
+ _currencyAddress: address(0)
290
+ });
291
+ }
292
+
293
+ /**
294
+ * @notice Purchases a token from project `_projectId` with ETH or any ERC-20 token and sets
295
+ * the token's owner to `_to`.
296
+ * @param _to Address to be the new token's owner.
297
+ * @param _projectId Project ID to mint a token on.
298
+ * @param _maxPricePerToken Maximum price of token being allowed by the purchaser, no decimal places. Required if currency is ERC20.
299
+ * @param _currencyAddress Currency address of token. `address(0)` if minting with ETH.
300
+ * @return tokenId Token ID of minted token
301
+ */
302
+ function purchaseTo(
303
+ address _to,
304
+ uint256 _projectId,
305
+ uint256 _maxPricePerToken,
306
+ address _currencyAddress
255
307
  ) public payable nonReentrant returns (uint256 tokenId) {
256
308
  // CHECKS
257
309
  require(
@@ -265,6 +317,22 @@ contract MinterSetPriceERC20V0 is ReentrancyGuard, IFilteredMinterV0 {
265
317
  "Price not configured"
266
318
  );
267
319
 
320
+ uint256 pricePerTokenInWei = projectIdToPricePerTokenInWei[_projectId];
321
+ address configuredCurrencyAddress = projectIdToCurrencyAddress[
322
+ _projectId
323
+ ];
324
+
325
+ // validate that the currency address matches the project configured currency
326
+ require(
327
+ _currencyAddress == configuredCurrencyAddress,
328
+ "Currency addresses must match"
329
+ );
330
+
331
+ // if configured currency is ETH validate that msg.value is the same as max price per token
332
+ if (configuredCurrencyAddress == address(0)) {
333
+ require(msg.value == _maxPricePerToken, "inconsistent msg.value");
334
+ }
335
+
268
336
  // if contract filter is off, allow calls from another contract
269
337
  if (!contractMintable[_projectId]) {
270
338
  require(msg.sender == tx.origin, "No Contract Buys");
@@ -300,28 +368,32 @@ contract MinterSetPriceERC20V0 is ReentrancyGuard, IFilteredMinterV0 {
300
368
  }
301
369
 
302
370
  // INTERACTIONS
303
- if (projectIdToCurrencyAddress[_projectId] != address(0)) {
371
+ if (configuredCurrencyAddress != address(0)) {
372
+ // validate that the specified maximum price is greater than or equal to the price per token
373
+ require(
374
+ _maxPricePerToken >= pricePerTokenInWei,
375
+ "Only max price gte token price"
376
+ );
304
377
  require(
305
378
  msg.value == 0,
306
379
  "this project accepts a different currency and cannot accept ETH"
307
380
  );
308
381
  require(
309
- IERC20(projectIdToCurrencyAddress[_projectId]).allowance(
382
+ IERC20(configuredCurrencyAddress).allowance(
310
383
  msg.sender,
311
384
  address(this)
312
- ) >= projectIdToPricePerTokenInWei[_projectId],
385
+ ) >= pricePerTokenInWei,
313
386
  "Insufficient Funds Approved for TX"
314
387
  );
315
388
  require(
316
- IERC20(projectIdToCurrencyAddress[_projectId]).balanceOf(
317
- msg.sender
318
- ) >= projectIdToPricePerTokenInWei[_projectId],
389
+ IERC20(configuredCurrencyAddress).balanceOf(msg.sender) >=
390
+ pricePerTokenInWei,
319
391
  "Insufficient balance."
320
392
  );
321
393
  _splitFundsERC20(_projectId);
322
394
  } else {
323
395
  require(
324
- msg.value >= projectIdToPricePerTokenInWei[_projectId],
396
+ msg.value >= pricePerTokenInWei,
325
397
  "Must send minimum value to mint!"
326
398
  );
327
399
  _splitFundsETH(_projectId);
@@ -193,19 +193,46 @@ contract MinterSetPriceERC20V1 is ReentrancyGuard, IFilteredMinterV0 {
193
193
  }
194
194
 
195
195
  /**
196
- * @notice Purchases a token from project `_projectId`.
196
+ * @notice Purchases a token from project `_projectId` with ETH.
197
197
  * @param _projectId Project ID to mint a token on.
198
198
  * @return tokenId Token ID of minted token
199
199
  */
200
200
  function purchase(
201
201
  uint256 _projectId
202
202
  ) external payable returns (uint256 tokenId) {
203
- tokenId = purchaseTo(msg.sender, _projectId);
203
+ // pass max price as msg.value, currency address as ETH
204
+ tokenId = purchaseTo({
205
+ _to: msg.sender,
206
+ _projectId: _projectId,
207
+ _maxPricePerToken: msg.value,
208
+ _currencyAddress: address(0)
209
+ });
204
210
  return tokenId;
205
211
  }
206
212
 
207
213
  /**
208
- * @notice Purchases a token from project `_projectId` and sets
214
+ * @notice Purchases a token from project `_projectId` with ETH or any ERC-20 token.
215
+ * @param _projectId Project ID to mint a token on.
216
+ * @param _maxPricePerToken Maximum price of token being allowed by the purchaser, no decimal places.
217
+ * @param _currencyAddress Currency address of token. `address(0)` if minting with ETH.
218
+ * @return tokenId Token ID of minted token
219
+ */
220
+ function purchase(
221
+ uint256 _projectId,
222
+ uint256 _maxPricePerToken,
223
+ address _currencyAddress
224
+ ) external payable returns (uint256 tokenId) {
225
+ tokenId = purchaseTo({
226
+ _to: msg.sender,
227
+ _projectId: _projectId,
228
+ _maxPricePerToken: _maxPricePerToken,
229
+ _currencyAddress: _currencyAddress
230
+ });
231
+ return tokenId;
232
+ }
233
+
234
+ /**
235
+ * @notice Purchases a token from project `_projectId` with ETH and sets
209
236
  * the token's owner to `_to`.
210
237
  * @param _to Address to be the new token's owner.
211
238
  * @param _projectId Project ID to mint a token on.
@@ -214,6 +241,31 @@ contract MinterSetPriceERC20V1 is ReentrancyGuard, IFilteredMinterV0 {
214
241
  function purchaseTo(
215
242
  address _to,
216
243
  uint256 _projectId
244
+ ) public payable returns (uint256 tokenId) {
245
+ // pass max price as msg.value, currency address as ETH
246
+ return
247
+ purchaseTo({
248
+ _to: _to,
249
+ _projectId: _projectId,
250
+ _maxPricePerToken: msg.value,
251
+ _currencyAddress: address(0)
252
+ });
253
+ }
254
+
255
+ /**
256
+ * @notice Purchases a token from project `_projectId` with ETH or any ERC-20 token and sets
257
+ * the token's owner to `_to`.
258
+ * @param _to Address to be the new token's owner.
259
+ * @param _projectId Project ID to mint a token on.
260
+ * @param _maxPricePerToken Maximum price of token being allowed by the purchaser, no decimal places. Required if currency is ERC20.
261
+ * @param _currencyAddress Currency address of token. `address(0)` if minting with ETH.
262
+ * @return tokenId Token ID of minted token
263
+ */
264
+ function purchaseTo(
265
+ address _to,
266
+ uint256 _projectId,
267
+ uint256 _maxPricePerToken,
268
+ address _currencyAddress
217
269
  ) public payable nonReentrant returns (uint256 tokenId) {
218
270
  // CHECKS
219
271
  require(
@@ -227,6 +279,22 @@ contract MinterSetPriceERC20V1 is ReentrancyGuard, IFilteredMinterV0 {
227
279
  "Price not configured"
228
280
  );
229
281
 
282
+ uint256 pricePerTokenInWei = projectIdToPricePerTokenInWei[_projectId];
283
+ address configuredCurrencyAddress = projectIdToCurrencyAddress[
284
+ _projectId
285
+ ];
286
+
287
+ // validate that the currency address matches the project configured currency
288
+ require(
289
+ _currencyAddress == configuredCurrencyAddress,
290
+ "Currency addresses must match"
291
+ );
292
+
293
+ // if configured currency is ETH validate that msg.value is the same as max price per token
294
+ if (configuredCurrencyAddress == address(0)) {
295
+ require(msg.value == _maxPricePerToken, "inconsistent msg.value");
296
+ }
297
+
230
298
  // EFFECTS
231
299
  tokenId = minterFilter.mint(_to, _projectId, msg.sender);
232
300
  // what if projectMaxInvocations[_projectId] is 0 (default value)?
@@ -241,28 +309,32 @@ contract MinterSetPriceERC20V1 is ReentrancyGuard, IFilteredMinterV0 {
241
309
  }
242
310
 
243
311
  // INTERACTIONS
244
- if (projectIdToCurrencyAddress[_projectId] != address(0)) {
312
+ if (configuredCurrencyAddress != address(0)) {
313
+ // validate that the specified maximum price is greater than or equal to the price per token
314
+ require(
315
+ _maxPricePerToken >= pricePerTokenInWei,
316
+ "Only max price gte token price"
317
+ );
245
318
  require(
246
319
  msg.value == 0,
247
320
  "this project accepts a different currency and cannot accept ETH"
248
321
  );
249
322
  require(
250
- IERC20(projectIdToCurrencyAddress[_projectId]).allowance(
323
+ IERC20(configuredCurrencyAddress).allowance(
251
324
  msg.sender,
252
325
  address(this)
253
- ) >= projectIdToPricePerTokenInWei[_projectId],
326
+ ) >= pricePerTokenInWei,
254
327
  "Insufficient Funds Approved for TX"
255
328
  );
256
329
  require(
257
- IERC20(projectIdToCurrencyAddress[_projectId]).balanceOf(
258
- msg.sender
259
- ) >= projectIdToPricePerTokenInWei[_projectId],
330
+ IERC20(configuredCurrencyAddress).balanceOf(msg.sender) >=
331
+ pricePerTokenInWei,
260
332
  "Insufficient balance."
261
333
  );
262
334
  _splitFundsERC20(_projectId);
263
335
  } else {
264
336
  require(
265
- msg.value >= projectIdToPricePerTokenInWei[_projectId],
337
+ msg.value >= pricePerTokenInWei,
266
338
  "Must send minimum value to mint!"
267
339
  );
268
340
  _splitFundsETH(_projectId);
@@ -1,12 +1,12 @@
1
1
  // SPDX-License-Identifier: LGPL-3.0-only
2
2
  // Created By: Art Blocks Inc.
3
3
 
4
- import "../../interfaces/v0.8.x/IGenArt721CoreContractV3_Base.sol";
5
- import "../../interfaces/v0.8.x/IGenArt721CoreContractV3.sol";
6
- import "../../interfaces/v0.8.x/IGenArt721CoreContractV3_Engine.sol";
7
- import "../../interfaces/v0.8.x/IMinterFilterV0.sol";
8
- import "../../interfaces/v0.8.x/IFilteredMinterV2.sol";
9
- import "./MinterBase_v0_1_1.sol";
4
+ import "../../../../interfaces/v0.8.x/IGenArt721CoreContractV3_Base.sol";
5
+ import "../../../../interfaces/v0.8.x/IGenArt721CoreContractV3.sol";
6
+ import "../../../../interfaces/v0.8.x/IGenArt721CoreContractV3_Engine.sol";
7
+ import "../../../../interfaces/v0.8.x/IMinterFilterV0.sol";
8
+ import "../../../../interfaces/v0.8.x/IFilteredMinterV2.sol";
9
+ import "../MinterBase_v0_1_1.sol";
10
10
 
11
11
  import "@openzeppelin-4.5/contracts/security/ReentrancyGuard.sol";
12
12
 
@@ -320,14 +320,41 @@ contract MinterSetPriceERC20V4 is
320
320
  }
321
321
 
322
322
  /**
323
- * @notice Purchases a token from project `_projectId`.
323
+ * @notice Purchases a token from project `_projectId` with ETH.
324
324
  * @param _projectId Project ID to mint a token on.
325
325
  * @return tokenId Token ID of minted token
326
326
  */
327
327
  function purchase(
328
328
  uint256 _projectId
329
329
  ) external payable returns (uint256 tokenId) {
330
- tokenId = purchaseTo_do6(msg.sender, _projectId);
330
+ // pass max price as msg.value, currency address as ETH
331
+ tokenId = purchaseTo({
332
+ _to: msg.sender,
333
+ _projectId: _projectId,
334
+ _maxPricePerToken: msg.value,
335
+ _currencyAddress: address(0)
336
+ });
337
+ return tokenId;
338
+ }
339
+
340
+ /**
341
+ * @notice Purchases a token from project `_projectId` with ETH or any ERC-20 token.
342
+ * @param _projectId Project ID to mint a token on.
343
+ * @param _maxPricePerToken Maximum price of token being allowed by the purchaser, no decimal places.
344
+ * @param _currencyAddress Currency address of token. `address(0)` if minting with ETH.
345
+ * @return tokenId Token ID of minted token
346
+ */
347
+ function purchase(
348
+ uint256 _projectId,
349
+ uint256 _maxPricePerToken,
350
+ address _currencyAddress
351
+ ) external payable returns (uint256 tokenId) {
352
+ tokenId = purchaseTo({
353
+ _to: msg.sender,
354
+ _projectId: _projectId,
355
+ _maxPricePerToken: _maxPricePerToken,
356
+ _currencyAddress: _currencyAddress
357
+ });
331
358
  return tokenId;
332
359
  }
333
360
 
@@ -337,12 +364,18 @@ contract MinterSetPriceERC20V4 is
337
364
  function purchase_H4M(
338
365
  uint256 _projectId
339
366
  ) external payable returns (uint256 tokenId) {
340
- tokenId = purchaseTo_do6(msg.sender, _projectId);
367
+ // pass max price as msg.value, currency address as ETH
368
+ tokenId = purchaseTo({
369
+ _to: msg.sender,
370
+ _projectId: _projectId,
371
+ _maxPricePerToken: msg.value,
372
+ _currencyAddress: address(0)
373
+ });
341
374
  return tokenId;
342
375
  }
343
376
 
344
377
  /**
345
- * @notice Purchases a token from project `_projectId` and sets
378
+ * @notice Purchases a token from project `_projectId` with ETH and sets
346
379
  * the token's owner to `_to`.
347
380
  * @param _to Address to be the new token's owner.
348
381
  * @param _projectId Project ID to mint a token on.
@@ -352,15 +385,30 @@ contract MinterSetPriceERC20V4 is
352
385
  address _to,
353
386
  uint256 _projectId
354
387
  ) external payable returns (uint256 tokenId) {
355
- return purchaseTo_do6(_to, _projectId);
388
+ // pass max price as msg.value, currency address as ETH
389
+ return
390
+ purchaseTo({
391
+ _to: _to,
392
+ _projectId: _projectId,
393
+ _maxPricePerToken: msg.value,
394
+ _currencyAddress: address(0)
395
+ });
356
396
  }
357
397
 
358
398
  /**
359
- * @notice gas-optimized version of purchaseTo(address, uint256).
399
+ * @notice Purchases a token from project `_projectId` with ETH or any ERC-20 token and sets
400
+ * the token's owner to `_to`.
401
+ * @param _to Address to be the new token's owner.
402
+ * @param _projectId Project ID to mint a token on.
403
+ * @param _maxPricePerToken Maximum price of token being allowed by the purchaser, no decimal places. Required if currency is ERC20.
404
+ * @param _currencyAddress Currency address of token. `address(0)` if minting with ETH.
405
+ * @return tokenId Token ID of minted token
360
406
  */
361
- function purchaseTo_do6(
407
+ function purchaseTo(
362
408
  address _to,
363
- uint256 _projectId
409
+ uint256 _projectId,
410
+ uint256 _maxPricePerToken,
411
+ address _currencyAddress
364
412
  ) public payable nonReentrant returns (uint256 tokenId) {
365
413
  // CHECKS
366
414
  ProjectConfig storage _projectConfig = projectConfig[_projectId];
@@ -379,6 +427,20 @@ contract MinterSetPriceERC20V4 is
379
427
  // require artist to have configured price of token on this minter
380
428
  require(_projectConfig.priceIsConfigured, "Price not configured");
381
429
 
430
+ uint256 pricePerTokenInWei = _projectConfig.pricePerTokenInWei;
431
+ address configuredCurrencyAddress = _projectConfig.currencyAddress;
432
+
433
+ // validate that the currency address matches the project configured currency
434
+ require(
435
+ _currencyAddress == configuredCurrencyAddress,
436
+ "Currency addresses must match"
437
+ );
438
+
439
+ // if configured currency is ETH validate that msg.value is the same as max price per token
440
+ if (configuredCurrencyAddress == address(0)) {
441
+ require(msg.value == _maxPricePerToken, "inconsistent msg.value");
442
+ }
443
+
382
444
  // EFFECTS
383
445
  tokenId = minterFilter.mint(_to, _projectId, msg.sender);
384
446
 
@@ -406,27 +468,32 @@ contract MinterSetPriceERC20V4 is
406
468
  }
407
469
 
408
470
  // INTERACTIONS
409
- uint256 pricePerTokenInWei = _projectConfig.pricePerTokenInWei;
410
- address _currencyAddress = _projectConfig.currencyAddress;
411
- if (_currencyAddress != address(0)) {
471
+ if (configuredCurrencyAddress != address(0)) {
472
+ // validate that the specified maximum price is greater than or equal to the price per token
473
+ require(
474
+ _maxPricePerToken >= pricePerTokenInWei,
475
+ "Only max price gte token price"
476
+ );
412
477
  require(
413
478
  msg.value == 0,
414
479
  "this project accepts a different currency and cannot accept ETH"
415
480
  );
416
481
  require(
417
- IERC20(_currencyAddress).allowance(msg.sender, address(this)) >=
418
- pricePerTokenInWei,
482
+ IERC20(configuredCurrencyAddress).allowance(
483
+ msg.sender,
484
+ address(this)
485
+ ) >= pricePerTokenInWei,
419
486
  "Insufficient Funds Approved for TX"
420
487
  );
421
488
  require(
422
- IERC20(_currencyAddress).balanceOf(msg.sender) >=
489
+ IERC20(configuredCurrencyAddress).balanceOf(msg.sender) >=
423
490
  pricePerTokenInWei,
424
491
  "Insufficient balance."
425
492
  );
426
493
  splitFundsERC20(
427
494
  _projectId,
428
495
  pricePerTokenInWei,
429
- _currencyAddress,
496
+ configuredCurrencyAddress,
430
497
  genArt721CoreAddress
431
498
  );
432
499
  } else {