@artblocks/contracts 1.1.0 → 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 (257) 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 +273 -155
  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/{minter-suite/Minters → archive/minter-suite/Minters/MinterDAExpSettlement}/MinterDAExpSettlementV2.sol/MinterDAExpSettlementV2.json +3 -3
  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 +567 -206
  41. package/artifacts/contracts/engine/V3/GenArt721CoreV3_Engine_Flex.sol/GenArt721CoreV3_Engine_Flex.json +787 -224
  42. package/artifacts/contracts/engine/V3/forks/GenArt721CoreV3_Engine_Flex_PROOF.sol/GenArt721CoreV3_Engine_Flex_PROOF.json +38 -8
  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 +38 -8
  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/interfaces/v0.8.x/IAdminACLV0_Extended.sol/IAdminACLV0_Extended.json +140 -0
  47. package/artifacts/contracts/interfaces/v0.8.x/IBytecodeStorageReaderV2.sol/IBytecodeStorageReaderV2.json +130 -0
  48. package/artifacts/contracts/interfaces/v0.8.x/IDependencyRegistryV0.sol/IDependencyRegistryV0.json +58 -45
  49. package/artifacts/contracts/interfaces/v0.8.x/IEngineFactoryV0.sol/IEngineFactoryV0.json +283 -0
  50. package/artifacts/contracts/interfaces/v0.8.x/IFilteredMinterDAExpSettlementV0.sol/IFilteredMinterDAExpSettlementV0.json +12 -12
  51. package/artifacts/contracts/interfaces/v0.8.x/IFilteredMinterDAExpSettlementV1.sol/IFilteredMinterDAExpSettlementV1.json +12 -12
  52. package/artifacts/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3.sol/IGenArt721CoreContractV3.json +30 -62
  53. package/artifacts/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Base.sol/IGenArt721CoreContractV3_Base.json +30 -62
  54. package/artifacts/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Engine.sol/IGenArt721CoreContractV3_Engine.json +170 -104
  55. package/artifacts/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Engine_Flex.sol/IGenArt721CoreContractV3_Engine_Flex.json +170 -104
  56. package/artifacts/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Engine_Flex_PreV3p2.sol/IGenArt721CoreContractV3_Engine_Flex_PreV3p2.json +1028 -0
  57. package/artifacts/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Engine_PreV3p2.sol/IGenArt721CoreContractV3_Engine_PreV3p2.json +741 -0
  58. package/artifacts/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_ProjectFinance.sol/IGenArt721CoreContractV3_ProjectFinance.json +87 -0
  59. package/artifacts/contracts/interfaces/v0.8.x/IGenArt721Minter_PBAB.sol/IGenArt721Minter_PBAB.json +279 -0
  60. package/artifacts/contracts/interfaces/v0.8.x/IPseudorandomAtomic.sol/IPseudorandomAtomic.json +1 -1
  61. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterDAExpSettlementV0.sol/ISharedMinterDAExpSettlementV0.json +18 -0
  62. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterRAMV0.sol/ISharedMinterRAMV0.json +62 -0
  63. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterRequired.sol/ISharedMinterRequired.json +37 -0
  64. package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterSEAV0.sol/ISharedMinterSEAV0.json +1 -1
  65. package/artifacts/contracts/interfaces/v0.8.x/ISplitAtomicFactoryV0.sol/ISplitAtomicFactoryV0.json +170 -0
  66. package/artifacts/contracts/interfaces/v0.8.x/ISplitAtomicV0.sol/ISplitAtomicV0.json +126 -0
  67. package/artifacts/contracts/interfaces/v0.8.x/ISplitProviderV0.sol/ISplitProviderV0.json +98 -0
  68. package/artifacts/contracts/interfaces/v0.8.x/integration-refs/splits-0x-v2/ISplitFactoryV2.sol/ISplitFactoryV2.json +123 -0
  69. package/artifacts/contracts/libs/integration-refs/delegation-registry/DelegationRegistry.sol/DelegationRegistry.json +2 -2
  70. package/artifacts/contracts/libs/integration-refs/gnosis-safe/GnosisSafeMock.sol/GnosisSafeMock.json +2 -2
  71. package/artifacts/contracts/libs/integration-refs/gnosis-safe/GnosisSafeProxyFactoryMock.sol/GnosisSafeProxyFactoryMock.json +2 -2
  72. package/artifacts/contracts/libs/integration-refs/gnosis-safe/MultiSendMock.sol/MultiSendMock.json +2 -2
  73. package/artifacts/contracts/libs/integration-refs/weth9/weth9.sol/WETH9_.json +2 -2
  74. package/artifacts/contracts/libs/v0.8.x/ABHelpers.sol/ABHelpers.json +2 -2
  75. package/artifacts/contracts/libs/v0.8.x/AuthLib.sol/AuthLib.json +2 -2
  76. package/artifacts/contracts/libs/v0.8.x/BitMap.sol/BitMaps256.json +10 -0
  77. package/artifacts/contracts/libs/v0.8.x/BytecodeStorageV0.sol/BytecodeStorage.json +2 -2
  78. package/artifacts/contracts/libs/v0.8.x/BytecodeStorageV1.sol/BytecodeStorageReader.json +2 -2
  79. package/artifacts/contracts/libs/v0.8.x/BytecodeStorageV1.sol/BytecodeStorageWriter.json +2 -2
  80. package/artifacts/contracts/libs/v0.8.x/BytecodeStorageV2.sol/BytecodeStorageReader.json +214 -0
  81. package/artifacts/contracts/libs/v0.8.x/BytecodeStorageV2.sol/BytecodeStorageWriter.json +10 -0
  82. package/artifacts/contracts/libs/v0.8.x/Bytes32Strings.sol/Bytes32Strings.json +2 -2
  83. package/artifacts/contracts/libs/v0.8.x/DependencyRegistryStorageLib.sol/DependencyRegistryStorageLib.json +10 -0
  84. package/artifacts/contracts/libs/v0.8.x/ERC721_PackedHashSeed.sol/ERC721_PackedHashSeed.json +2 -2
  85. package/artifacts/contracts/libs/v0.8.x/ERC721_PackedHashSeedV1.sol/ERC721_PackedHashSeedV1.json +444 -0
  86. package/artifacts/contracts/libs/v0.8.x/PackedBools.sol/PackedBools.json +10 -0
  87. package/artifacts/contracts/libs/v0.8.x/SSTORE2.sol/SSTORE2.json +2 -2
  88. package/artifacts/contracts/libs/v0.8.x/V3FlexLib.sol/V3FlexLib.json +208 -0
  89. package/artifacts/contracts/libs/v0.8.x/minter-libs/DAExpLib.sol/DAExpLib.json +2 -2
  90. package/artifacts/contracts/libs/v0.8.x/minter-libs/DALib.sol/DALib.json +2 -2
  91. package/artifacts/contracts/libs/v0.8.x/minter-libs/DALinLib.sol/DALinLib.json +2 -2
  92. package/artifacts/contracts/libs/v0.8.x/minter-libs/GenericMinterEventsLib.sol/GenericMinterEventsLib.json +2 -2
  93. package/artifacts/contracts/libs/v0.8.x/minter-libs/MaxInvocationsLib.sol/MaxInvocationsLib.json +2 -2
  94. package/artifacts/contracts/libs/v0.8.x/minter-libs/MerkleLib.sol/MerkleLib.json +2 -2
  95. package/artifacts/contracts/libs/v0.8.x/minter-libs/PolyptychLib.sol/PolyptychLib.json +2 -2
  96. package/artifacts/contracts/libs/v0.8.x/minter-libs/RAMLib.sol/RAMLib.json +398 -0
  97. package/artifacts/contracts/libs/v0.8.x/minter-libs/SEALib.sol/SEALib.json +2 -2
  98. package/artifacts/contracts/libs/v0.8.x/minter-libs/SetPriceLib.sol/SetPriceLib.json +2 -2
  99. package/artifacts/contracts/libs/v0.8.x/minter-libs/SettlementExpLib.sol/SettlementExpLib.json +2 -2
  100. package/artifacts/contracts/libs/v0.8.x/minter-libs/SplitFundsLib.sol/SplitFundsLib.json +2 -2
  101. package/artifacts/contracts/libs/v0.8.x/minter-libs/TokenHolderLib.sol/TokenHolderLib.json +2 -2
  102. package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV1.sol/MinterFilterV1.json +2 -2
  103. package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV2.sol/MinterFilterV2.json +2 -2
  104. package/artifacts/contracts/minter-suite/Minters/MinterDAExpHolderV5.sol/MinterDAExpHolderV5.json +2 -2
  105. package/artifacts/contracts/minter-suite/Minters/MinterDAExpSettlementV3.sol/MinterDAExpSettlementV3.json +2 -2
  106. package/artifacts/contracts/minter-suite/Minters/MinterDAExpV5.sol/MinterDAExpV5.json +2 -2
  107. package/artifacts/contracts/minter-suite/Minters/MinterDALinHolderV5.sol/MinterDALinHolderV5.json +2 -2
  108. package/artifacts/contracts/minter-suite/Minters/MinterDALinV5.sol/MinterDALinV5.json +2 -2
  109. package/artifacts/contracts/minter-suite/Minters/MinterRAMV0.sol/MinterRAMV0.json +1374 -0
  110. package/artifacts/contracts/minter-suite/Minters/MinterSEAV1.sol/MinterSEAV1.json +7 -7
  111. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20V5.sol/MinterSetPriceERC20V5.json +2 -2
  112. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceHolderV5.sol/MinterSetPriceHolderV5.json +2 -2
  113. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceMerkleV5.sol/MinterSetPriceMerkleV5.json +2 -2
  114. package/artifacts/contracts/minter-suite/Minters/MinterSetPricePolyptychERC20V5.sol/MinterSetPricePolyptychERC20V5.json +2 -2
  115. package/artifacts/contracts/minter-suite/Minters/MinterSetPricePolyptychV5.sol/MinterSetPricePolyptychV5.json +2 -2
  116. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceV5.sol/MinterSetPriceV5.json +2 -2
  117. package/artifacts/contracts/minter-suite/Minters/one-off/MinterSetPriceV5_SingleCore.sol/MinterSetPriceV5_SingleCore.json +417 -0
  118. package/artifacts/contracts/mock/BytecodeV2LibCallsMock.sol/BytecodeV2LibCallsMock.json +154 -0
  119. package/artifacts/contracts/mock/BytecodeV2TextCR_DMock.sol/BytecodeV2TextCR_DMock.json +428 -0
  120. package/artifacts/contracts/mock/DummySharedMinter.sol/DummySharedMinter.json +2 -2
  121. package/artifacts/contracts/mock/ERC20Mock.sol/ERC20Mock.json +2 -2
  122. package/artifacts/contracts/mock/ForceSendMock.sol/ForceSendMock.json +24 -0
  123. package/artifacts/contracts/mock/GenArt721CoreV3_Engine_IncorrectCoreType.sol/GenArt721CoreV3_Engine_IncorrectCoreType.json +2 -2
  124. package/artifacts/contracts/mock/Mock0xSplitsV2PullFactory.sol/Mock0xSplitsV2PullFactory.json +149 -0
  125. package/artifacts/contracts/mock/Mock0xSplitsV2Splitter.sol/Mock0xSplitsV2Splitter.json +99 -0
  126. package/artifacts/contracts/mock/MockAdminACLV0.sol/MockAdminACLV0Events.json +20 -2
  127. package/artifacts/contracts/mock/MockAdminACLV0_PROHIBITION.sol/MockAdminACLV0Events_PROHIBITION.json +20 -2
  128. package/artifacts/contracts/mock/RandomizerV2_NoAssignMock.sol/RandomizerV2_NoAssignMock.json +2 -2
  129. package/artifacts/contracts/mock/ReentrancyGenArt721MinterMock.sol/ReentrancyGenArt721MinterMock.json +100 -0
  130. package/artifacts/contracts/mock/ReentrancyHolderMock.sol/ReentrancyHolderMock.json +2 -2
  131. package/artifacts/contracts/mock/ReentrancyHolderMockShared.sol/ReentrancyHolderMockShared.json +2 -2
  132. package/artifacts/contracts/mock/ReentrancyMerkleMock.sol/ReentrancyMerkleMock.json +2 -2
  133. package/artifacts/contracts/mock/ReentrancyMerkleMockShared.sol/ReentrancyMerkleMockShared.json +2 -2
  134. package/artifacts/contracts/mock/ReentrancyMock.sol/ReentrancyMock.json +2 -2
  135. package/artifacts/contracts/mock/ReentrancyMockShared.sol/ReentrancyMockShared.json +2 -2
  136. package/artifacts/contracts/mock/ReentrancySEAMock.sol/ReentrancySEAAutoBidderMock.json +2 -2
  137. package/artifacts/contracts/mock/ReentrancySEAMockShared.sol/ReentrancySEAAutoBidderMockShared.json +2 -2
  138. package/artifacts/contracts/mock/ReentrancySplitterMocks.sol/ReentrancySplitterDrainETHMock.json +54 -0
  139. package/artifacts/contracts/mock/ReentrancySplitterMocks.sol/ReentrancySplitterSendETHMock.json +54 -0
  140. package/artifacts/contracts/randomizer/deprecated/PolyptychRandomizerV0.sol/BasicPolyptychRandomizerV0.json +2 -2
  141. package/artifacts/contracts/randomizer/deprecated/RandomizerV2.sol/BasicRandomizerV2.json +2 -2
  142. package/artifacts/contracts/randomizer/primitive/PseudorandomAtomicBasic.sol/PseudorandomAtomic.json +2 -2
  143. package/artifacts/contracts/randomizer/shared/SharedRandomizerV0.sol/SharedRandomizerV0.json +2 -2
  144. package/artifacts/contracts/split/SplitAtomicFactoryV0.sol/SplitAtomicFactoryV0.json +203 -0
  145. package/artifacts/contracts/split/SplitAtomicV0.sol/SplitAtomicV0.json +168 -0
  146. package/artifacts/contracts/split/split-provider/SplitProviderV0.sol/SplitProviderV0.json +141 -0
  147. package/contracts/AdminACLV0.sol +6 -2
  148. package/contracts/AdminACLV1.sol +2 -2
  149. package/contracts/DependencyRegistryV0.sol +687 -408
  150. package/contracts/{GenArt721CoreV3.sol → archive/GenArt721CoreV3.sol} +56 -20
  151. package/contracts/{explorations → archive}/GenArt721CoreV3_Explorations.sol +49 -13
  152. package/contracts/{minter-suite → archive/minter-suite}/Minters/MinterBase_v0_1_1.sol +4 -4
  153. package/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterDAExp}/MinterDAExpV4.sol +4 -4
  154. package/contracts/archive/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol +4 -4
  155. package/contracts/archive/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV1.sol +5 -5
  156. package/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterDAExpSettlement}/MinterDAExpSettlementV2.sol +8 -8
  157. package/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterDALin}/MinterDALinV4.sol +4 -4
  158. package/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterHolder}/MinterHolderV4.sol +5 -5
  159. package/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterMerkle}/MinterMerkleV5.sol +5 -5
  160. package/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterPolyptych}/MinterPolyptychV0.sol +7 -7
  161. package/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterSEA}/MinterSEAV0.sol +13 -13
  162. package/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterSetPrice}/MinterSetPriceV4.sol +4 -4
  163. package/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V0.sol +82 -10
  164. package/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V1.sol +82 -10
  165. package/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterSetPriceERC20}/MinterSetPriceERC20V4.sol +88 -21
  166. package/contracts/engine/V2/GenArt721MinterBurner_PBAB.sol +81 -22
  167. package/contracts/engine/V2/GenArt721Minter_PBAB.sol +80 -22
  168. package/contracts/engine/V3/EngineFactoryV0.sol +419 -0
  169. package/contracts/engine/V3/GenArt721CoreV3_Engine.sol +894 -488
  170. package/contracts/engine/V3/GenArt721CoreV3_Engine_Flex.sol +1054 -650
  171. package/contracts/engine/V3/forks/GenArt721CoreV3_Engine_Flex_PROOF.sol +3 -3
  172. package/contracts/engine/V3/forks/PROHIBITION/GenArt721CoreV3_Engine_Flex_PROHIBITION.sol +1 -1
  173. package/contracts/engine/V3/forks/PROHIBITION/interfaces/IGenArt721CoreContractV3_Engine_Flex_PROHIBITION.sol +2 -2
  174. package/contracts/interfaces/v0.8.x/IAdminACLV0_Extended.sol +20 -0
  175. package/contracts/interfaces/v0.8.x/IBytecodeStorageReaderV2.sol +23 -0
  176. package/contracts/interfaces/v0.8.x/IDependencyRegistryV0.sol +47 -45
  177. package/contracts/interfaces/v0.8.x/IEngineFactoryV0.sol +124 -0
  178. package/contracts/interfaces/v0.8.x/IFilteredMinterDAExpSettlementV0.sol +1 -3
  179. package/contracts/interfaces/v0.8.x/IFilteredMinterDAExpSettlementV1.sol +1 -3
  180. package/contracts/interfaces/v0.8.x/IFilteredMinterDAExpV1.sol +1 -3
  181. package/contracts/interfaces/v0.8.x/IFilteredMinterDALinV1.sol +1 -3
  182. package/contracts/interfaces/v0.8.x/IFilteredMinterHolderV2.sol +1 -3
  183. package/contracts/interfaces/v0.8.x/IFilteredMinterMerkleV2.sol +1 -3
  184. package/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Base.sol +115 -11
  185. package/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Engine.sol +84 -8
  186. package/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Engine_Flex.sol +26 -8
  187. package/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Engine_Flex_PreV3p2.sol +141 -0
  188. package/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Engine_PreV3p2.sol +78 -0
  189. package/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_ProjectFinance.sol +47 -0
  190. package/contracts/interfaces/v0.8.x/IGenArt721Minter_PBAB.sol +91 -0
  191. package/contracts/interfaces/v0.8.x/IPseudorandomAtomic.sol +1 -3
  192. package/contracts/interfaces/v0.8.x/ISharedMinterDAExpSettlementV0.sol +19 -0
  193. package/contracts/interfaces/v0.8.x/ISharedMinterRAMV0.sol +23 -0
  194. package/contracts/interfaces/v0.8.x/ISharedMinterRequired.sol +20 -0
  195. package/contracts/interfaces/v0.8.x/ISharedMinterSEAV0.sol +1 -4
  196. package/contracts/interfaces/v0.8.x/ISharedMinterV0.sol +12 -6
  197. package/contracts/interfaces/v0.8.x/ISplitAtomicFactoryV0.sol +81 -0
  198. package/contracts/interfaces/v0.8.x/ISplitAtomicV0.sol +72 -0
  199. package/contracts/interfaces/v0.8.x/ISplitProviderV0.sol +49 -0
  200. package/contracts/interfaces/v0.8.x/integration-refs/splits-0x-v2/ISplitFactoryV2.sol +62 -0
  201. package/contracts/libs/v0.8.x/ABHelpers.sol +18 -4
  202. package/contracts/libs/v0.8.x/BitMap.sol +112 -0
  203. package/contracts/libs/v0.8.x/BytecodeStorageV2.sol +593 -0
  204. package/contracts/libs/v0.8.x/DependencyRegistryStorageLib.sol +90 -0
  205. package/contracts/libs/v0.8.x/ERC721_PackedHashSeedV1.sol +591 -0
  206. package/contracts/libs/v0.8.x/PackedBools.sol +42 -0
  207. package/contracts/libs/v0.8.x/V3FlexLib.sol +591 -0
  208. package/contracts/libs/v0.8.x/minter-libs/DAExpLib.sol +10 -12
  209. package/contracts/libs/v0.8.x/minter-libs/DALinLib.sol +4 -9
  210. package/contracts/libs/v0.8.x/minter-libs/GenericMinterEventsLib.sol +44 -44
  211. package/contracts/libs/v0.8.x/minter-libs/MaxInvocationsLib.sol +64 -63
  212. package/contracts/libs/v0.8.x/minter-libs/MerkleLib.sol +14 -10
  213. package/contracts/libs/v0.8.x/minter-libs/RAMLib.sol +2927 -0
  214. package/contracts/libs/v0.8.x/minter-libs/SEALib.sol +60 -62
  215. package/contracts/libs/v0.8.x/minter-libs/SetPriceLib.sol +4 -8
  216. package/contracts/libs/v0.8.x/minter-libs/SettlementExpLib.sol +92 -89
  217. package/contracts/libs/v0.8.x/minter-libs/SplitFundsLib.sol +21 -15
  218. package/contracts/libs/v0.8.x/minter-libs/TokenHolderLib.sol +5 -4
  219. package/contracts/minter-suite/MinterFilter/MinterFilterV2.sol +16 -10
  220. package/contracts/minter-suite/Minters/MinterDAExpHolderV5.sol +2 -2
  221. package/contracts/minter-suite/Minters/MinterDAExpSettlementV3.sol +19 -15
  222. package/contracts/minter-suite/Minters/MinterDAExpV5.sol +2 -2
  223. package/contracts/minter-suite/Minters/MinterDALinHolderV5.sol +2 -2
  224. package/contracts/minter-suite/Minters/MinterDALinV5.sol +2 -2
  225. package/contracts/minter-suite/Minters/MinterRAMV0.sol +1205 -0
  226. package/contracts/minter-suite/Minters/MinterSEAV1.sol +21 -32
  227. package/contracts/minter-suite/Minters/MinterSetPriceERC20V5.sol +17 -8
  228. package/contracts/minter-suite/Minters/MinterSetPriceHolderV5.sol +2 -2
  229. package/contracts/minter-suite/Minters/MinterSetPriceMerkleV5.sol +2 -2
  230. package/contracts/minter-suite/Minters/MinterSetPricePolyptychERC20V5.sol +23 -9
  231. package/contracts/minter-suite/Minters/MinterSetPricePolyptychV5.sol +2 -2
  232. package/contracts/minter-suite/Minters/MinterSetPriceV5.sol +2 -2
  233. package/contracts/minter-suite/Minters/one-off/MinterSetPriceV5_SingleCore.sol +446 -0
  234. package/contracts/mock/BytecodeV2LibCallsMock.sol +128 -0
  235. package/contracts/mock/BytecodeV2TextCR_DMock.sol +316 -0
  236. package/contracts/mock/ForceSendMock.sol +22 -0
  237. package/contracts/mock/Mock0xSplitsV2PullFactory.sol +75 -0
  238. package/contracts/mock/Mock0xSplitsV2Splitter.sol +47 -0
  239. package/contracts/mock/MockAdminACLV0.sol +21 -0
  240. package/contracts/mock/MockAdminACLV0_PROHIBITION.sol +21 -0
  241. package/contracts/mock/ReentrancyGenArt721MinterMock.sol +47 -0
  242. package/contracts/mock/ReentrancySplitterMocks.sol +67 -0
  243. package/contracts/randomizer/primitive/PseudorandomAtomicBasic.sol +1 -1
  244. package/contracts/randomizer/shared/SharedRandomizerV0.sol +1 -1
  245. package/contracts/split/SplitAtomicFactoryV0.sol +121 -0
  246. package/contracts/split/SplitAtomicV0.sol +265 -0
  247. package/contracts/split/split-provider/SplitProviderV0.sol +201 -0
  248. package/package.json +62 -34
  249. package/artifacts/contracts/GenArt721CoreV3.sol/GenArt721CoreV3.json +0 -1965
  250. package/artifacts/contracts/explorations/GenArt721CoreV3_Explorations.sol/GenArt721CoreV3_Explorations.json +0 -1939
  251. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20V4.sol/MinterSetPriceERC20V4.json +0 -768
  252. package/artifacts/contracts/royalty-registry/GenArt721RoyaltyOverride.sol/GenArt721RoyaltyOverride.json +0 -208
  253. package/artifacts/contracts/royalty-registry/GenArt721RoyaltyOverride_PBAB.sol/GenArt721RoyaltyOverride_PBAB.json +0 -301
  254. package/contracts/archive/readme.md +0 -16
  255. package/contracts/engine/README.md +0 -21
  256. package/contracts/royalty-registry/GenArt721RoyaltyOverride.sol +0 -168
  257. package/contracts/royalty-registry/GenArt721RoyaltyOverride_PBAB.sol +0 -221
@@ -176,18 +176,49 @@ contract GenArt721Minter_PBAB is ReentrancyGuard {
176
176
  }
177
177
 
178
178
  /**
179
- * @notice Purchases a token from project `_projectId`.
179
+ * @notice Purchases a token from project `_projectId` with ETH.
180
180
  * @param _projectId Project ID to mint a token on.
181
181
  * @return _tokenId Token ID of minted token
182
182
  */
183
183
  function purchase(
184
184
  uint256 _projectId
185
185
  ) public payable returns (uint256 _tokenId) {
186
- return purchaseTo(msg.sender, _projectId);
186
+ // pass currency address as ETH
187
+ address _currencyAddress = address(0);
188
+ uint256 _maxPricePerToken = msg.value;
189
+
190
+ return
191
+ purchaseTo(
192
+ msg.sender,
193
+ _projectId,
194
+ _maxPricePerToken,
195
+ _currencyAddress
196
+ );
187
197
  }
188
198
 
189
199
  /**
190
- * @notice Purchases a token from project `_projectId` and sets
200
+ * @notice Purchases a token from project `_projectId` with ETH or any ERC-20 token.
201
+ * @param _projectId Project ID to mint a token on.
202
+ * @param _maxPricePerToken Maximum price of token being allowed by the purchaser, no decimal places.
203
+ * @param _currencyAddress Currency address of token. `address(0)` if minting with ETH.
204
+ * @return _tokenId Token ID of minted token
205
+ */
206
+ function purchase(
207
+ uint256 _projectId,
208
+ uint256 _maxPricePerToken,
209
+ address _currencyAddress
210
+ ) public payable returns (uint256 _tokenId) {
211
+ return
212
+ purchaseTo(
213
+ msg.sender,
214
+ _projectId,
215
+ _maxPricePerToken,
216
+ _currencyAddress
217
+ );
218
+ }
219
+
220
+ /**
221
+ * @notice Purchases a token from project `_projectId` with ETH and sets
191
222
  * the token's owner to `_to`.
192
223
  * @param _to Address to be the new token's owner.
193
224
  * @param _projectId Project ID to mint a token on.
@@ -196,6 +227,28 @@ contract GenArt721Minter_PBAB is ReentrancyGuard {
196
227
  function purchaseTo(
197
228
  address _to,
198
229
  uint256 _projectId
230
+ ) public payable returns (uint256 _tokenId) {
231
+ // pass currency address as ETH
232
+ address _currencyAddress = address(0);
233
+ uint256 _maxPricePerToken = msg.value;
234
+
235
+ return purchaseTo(_to, _projectId, _maxPricePerToken, _currencyAddress);
236
+ }
237
+
238
+ /**
239
+ * @notice Purchases a token from project `_projectId` with ETH or any ERC-20 token and sets
240
+ * the token's owner to `_to`.
241
+ * @param _to Address to be the new token's owner.
242
+ * @param _projectId Project ID to mint a token on.
243
+ * @param _maxPricePerToken Maximum price of token being allowed by the purchaser, no decimal places. Required if currency is ERC20.
244
+ * @param _currencyAddress Currency address of token. `address(0)` if minting with ETH.
245
+ * @return _tokenId Token ID of minted token
246
+ */
247
+ function purchaseTo(
248
+ address _to,
249
+ uint256 _projectId,
250
+ uint256 _maxPricePerToken,
251
+ address _currencyAddress
199
252
  ) public payable nonReentrant returns (uint256 _tokenId) {
200
253
  // CHECKS
201
254
  require(
@@ -207,6 +260,20 @@ contract GenArt721Minter_PBAB is ReentrancyGuard {
207
260
  require(msg.sender == tx.origin, "No Contract Buys");
208
261
  }
209
262
 
263
+ uint256 pricePerTokenInWei = genArtCoreContract
264
+ .projectIdToPricePerTokenInWei(_projectId);
265
+ address configuredCurrencyAddress = genArtCoreContract
266
+ .projectIdToCurrencyAddress(_projectId);
267
+ // validate that the currency address matches the project configured currency
268
+ require(
269
+ _currencyAddress == configuredCurrencyAddress,
270
+ "Currency addresses must match"
271
+ );
272
+
273
+ // if configured currency is ETH validate that msg.value is the same as max price per token
274
+ if (configuredCurrencyAddress == address(0)) {
275
+ require(msg.value == _maxPricePerToken, "inconsistent msg.value");
276
+ }
210
277
  // limit mints per address by project
211
278
  if (projectMintLimit[_projectId] > 0) {
212
279
  require(
@@ -244,13 +311,13 @@ contract GenArt721Minter_PBAB is ReentrancyGuard {
244
311
  }
245
312
 
246
313
  // validate and split funds
247
- if (
248
- keccak256(
249
- abi.encodePacked(
250
- genArtCoreContract.projectIdToCurrencySymbol(_projectId)
251
- )
252
- ) != keccak256(abi.encodePacked("ETH"))
253
- ) {
314
+ if (configuredCurrencyAddress != address(0)) {
315
+ // validate that the specified maximum price is greater than or equal to the price per token
316
+ require(
317
+ _maxPricePerToken >= pricePerTokenInWei,
318
+ "Only max price gte token price"
319
+ );
320
+
254
321
  require(
255
322
  msg.value == 0,
256
323
  "this project accepts a different currency and cannot accept ETH"
@@ -258,28 +325,19 @@ contract GenArt721Minter_PBAB is ReentrancyGuard {
258
325
  require(
259
326
  IERC20(
260
327
  genArtCoreContract.projectIdToCurrencyAddress(_projectId)
261
- ).allowance(msg.sender, address(this)) >=
262
- genArtCoreContract.projectIdToPricePerTokenInWei(
263
- _projectId
264
- ),
328
+ ).allowance(msg.sender, address(this)) >= pricePerTokenInWei,
265
329
  "Insufficient Funds Approved for TX"
266
330
  );
267
331
  require(
268
332
  IERC20(
269
333
  genArtCoreContract.projectIdToCurrencyAddress(_projectId)
270
- ).balanceOf(msg.sender) >=
271
- genArtCoreContract.projectIdToPricePerTokenInWei(
272
- _projectId
273
- ),
334
+ ).balanceOf(msg.sender) >= pricePerTokenInWei,
274
335
  "Insufficient balance."
275
336
  );
276
337
  _splitFundsERC20(_projectId);
277
338
  } else {
278
339
  require(
279
- msg.value >=
280
- genArtCoreContract.projectIdToPricePerTokenInWei(
281
- _projectId
282
- ),
340
+ msg.value >= pricePerTokenInWei,
283
341
  "Must send minimum value to mint!"
284
342
  );
285
343
  _splitFundsETH(_projectId);
@@ -0,0 +1,419 @@
1
+ // SPDX-License-Identifier: LGPL-3.0-only
2
+ // Created By: Art Blocks Inc.
3
+
4
+ // @dev fixed to specific solidity version for clarity and for more clear
5
+ // source code verification purposes.
6
+ pragma solidity 0.8.22;
7
+
8
+ import {AdminACLV0} from "../../AdminACLV0.sol";
9
+ import {IGenArt721CoreContractV3_Engine, EngineConfiguration} from "../../interfaces/v0.8.x/IGenArt721CoreContractV3_Engine.sol";
10
+ import {ICoreRegistryV1} from "../../interfaces/v0.8.x/ICoreRegistryV1.sol";
11
+ import {IEngineFactoryV0} from "../../interfaces/v0.8.x/IEngineFactoryV0.sol";
12
+ import {IAdminACLV0_Extended} from "../../interfaces/v0.8.x/IAdminACLV0_Extended.sol";
13
+
14
+ import "@openzeppelin-5.0/contracts/access/Ownable.sol";
15
+ import {Clones} from "@openzeppelin-5.0/contracts/proxy/Clones.sol";
16
+ import {IERC20} from "@openzeppelin-5.0/contracts/token/ERC20/IERC20.sol";
17
+ import {SafeERC20} from "@openzeppelin-5.0/contracts/token/ERC20/utils/SafeERC20.sol";
18
+ import {Create2} from "@openzeppelin-5.0/contracts/utils/Create2.sol";
19
+
20
+ /**
21
+ * @title EngineFactoryV0
22
+ * @author Art Blocks Inc.
23
+ * @notice Factory contract for creating new Engine and Engine Flex Core contracts.
24
+ * @dev This contract is deployed once, and then used to create new Engine and Engine
25
+ * Flex Core contracts. The contract may be abandoned once it is no longer needed.
26
+ * Once abandoned, the contract can no longer be used to create new Engine and Engine
27
+ * Flex Core contracts.
28
+ * The contract is initialized with a required contract type.
29
+ * The contract is initialized with an Engine and Engine Flex implementation contract, which is cloned
30
+ * when creating new Engine and Engine Flex Core contracts.
31
+ */
32
+ contract EngineFactoryV0 is Ownable, IEngineFactoryV0 {
33
+ // public type
34
+ bytes32 public constant type_ = "EngineFactoryV0";
35
+
36
+ // base URI host for all Engine contracts on this network/chainID
37
+ string public defaultBaseURIHost;
38
+
39
+ /**
40
+ * The implementation contract that is cloned when creating new Engine
41
+ * contracts.
42
+ */
43
+ address public immutable engineImplementation;
44
+ /**
45
+ * The implementation contract that is cloned when creating new Engine
46
+ * Flex contracts.
47
+ */
48
+ address public immutable engineFlexImplementation;
49
+
50
+ // Address of core registry contract.
51
+ address public immutable coreRegistry;
52
+
53
+ /// version and type of Engine implementation contract
54
+ string public engineCoreType;
55
+ string public engineCoreVersion;
56
+
57
+ /// version and type of Engine Flex implementation contract
58
+ string public flexCoreType;
59
+ string public flexCoreVersion;
60
+
61
+ /**
62
+ * Indicates whether the contract is abandoned.
63
+ * Once abandoned, the contract can no longer be used to create new Engine
64
+ * and Engine Flex contracts.
65
+ */
66
+ bool public isAbandoned; // default false
67
+
68
+ // pseudorandom salt nonce to prevent collisions for multiple contract deployments in single block
69
+ uint256 private _pseudorandomSaltNonce;
70
+
71
+ /**
72
+ * Represents a generic call operation.
73
+ */
74
+ struct Call {
75
+ address to;
76
+ bytes data;
77
+ }
78
+
79
+ /**
80
+ * @notice validates and assigns immutable configuration variables and
81
+ * sets state variables
82
+ * @param engineImplementation_ address of the Engine
83
+ * implementation contract
84
+ * @param engineFlexImplementation_ address of the Engine Flex
85
+ * implementation contract
86
+ * @param coreRegistry_ address of the core registry contract
87
+ * @param owner_ address of the initial owner
88
+ * @param defaultBaseURIHost_ default base URI prefix for all Engine contracts,
89
+ * e.g. "https://token.artblocks.io/" for mainnet, "https://token.arbitrum.artblocks.io/" for arbitrum, etc.
90
+ */
91
+ constructor(
92
+ address engineImplementation_,
93
+ address engineFlexImplementation_,
94
+ address coreRegistry_,
95
+ address owner_,
96
+ string memory defaultBaseURIHost_
97
+ ) Ownable(owner_) {
98
+ _onlyNonZeroAddress(engineImplementation_);
99
+ _onlyNonZeroAddress(engineFlexImplementation_);
100
+ _onlyNonZeroAddress(coreRegistry_);
101
+ _onlyNonZeroAddress(owner_);
102
+
103
+ defaultBaseURIHost = defaultBaseURIHost_;
104
+
105
+ engineImplementation = engineImplementation_;
106
+ engineFlexImplementation = engineFlexImplementation_;
107
+ coreRegistry = coreRegistry_;
108
+
109
+ engineCoreType = IGenArt721CoreContractV3_Engine(engineImplementation)
110
+ .coreType();
111
+ engineCoreVersion = IGenArt721CoreContractV3_Engine(
112
+ engineImplementation
113
+ ).coreVersion();
114
+ flexCoreType = IGenArt721CoreContractV3_Engine(engineFlexImplementation)
115
+ .coreType();
116
+ flexCoreVersion = IGenArt721CoreContractV3_Engine(
117
+ engineFlexImplementation
118
+ ).coreVersion();
119
+
120
+ // emit event
121
+ emit Deployed({
122
+ engineImplementation: engineImplementation_,
123
+ engineFlexImplementation: engineFlexImplementation_,
124
+ type_: type_
125
+ });
126
+ }
127
+
128
+ /**
129
+ * @notice Creates a new Engine or Engine Flex contract with the provided
130
+ * `engineConfiguration`, depending on the `engineCoreContractType`.
131
+ * Reverts if invalid configuration is provided, or if in an invalid deployment
132
+ * state (e.g. if the contract is abandoned or does not own the core registry).
133
+ * @param engineCoreContractType Type of Engine Core contract.
134
+ * @param engineConfiguration EngineConfiguration data to configure the
135
+ * contract with.
136
+ * @param adminACLContract Address of admin access control contract, to be
137
+ * set as contract owner. A new contract will be deployed if address is null.
138
+ * @param salt Salt used to deterministically deploy the clone. If null, a
139
+ * pseudorandom salt is generated.
140
+ * @return engineContract The address of the newly created Engine or Engine Flex
141
+ * contract. The address is also emitted in the `EngineContractCreated` event.
142
+ */
143
+ function createEngineContract(
144
+ IEngineFactoryV0.EngineCoreType engineCoreContractType,
145
+ EngineConfiguration calldata engineConfiguration,
146
+ address adminACLContract,
147
+ bytes32 salt
148
+ ) external onlyOwner returns (address engineContract) {
149
+ require(!isAbandoned, "factory is abandoned");
150
+ // validate engine contract configuration
151
+ _onlyNonZeroAddress(engineConfiguration.renderProviderAddress);
152
+ _onlyNonZeroAddress(engineConfiguration.randomizerContract);
153
+
154
+ // check if salt is empty and generate a pseudorandom one if so
155
+ if (salt == bytes32(0)) {
156
+ salt = _generatePseudorandomSalt();
157
+ }
158
+
159
+ if (adminACLContract == address(0)) {
160
+ _onlyNonZeroAddress(engineConfiguration.newSuperAdminAddress);
161
+ // deploy new AdminACLV0 contract and update super admin
162
+ adminACLContract = Create2.deploy({
163
+ amount: 0,
164
+ salt: _generatePseudorandomSalt(),
165
+ bytecode: type(AdminACLV0).creationCode
166
+ });
167
+ address[] memory tmpEmptyArray = new address[](0);
168
+
169
+ IAdminACLV0_Extended(adminACLContract).changeSuperAdmin(
170
+ engineConfiguration.newSuperAdminAddress,
171
+ tmpEmptyArray
172
+ );
173
+ } else {
174
+ // Use existing Admin ACL Contract, newSuperAdminAddress should not be populated
175
+ require(
176
+ engineConfiguration.newSuperAdminAddress == address(0),
177
+ "AdminACL already exists"
178
+ );
179
+ }
180
+
181
+ address implementation = engineCoreContractType ==
182
+ IEngineFactoryV0.EngineCoreType.Engine
183
+ ? engineImplementation
184
+ : engineFlexImplementation;
185
+
186
+ engineContract = Clones.cloneDeterministic({
187
+ implementation: implementation,
188
+ salt: salt
189
+ });
190
+
191
+ IGenArt721CoreContractV3_Engine(engineContract).initialize({
192
+ engineConfiguration: engineConfiguration,
193
+ adminACLContract_: adminACLContract,
194
+ defaultBaseURIHost: defaultBaseURIHost
195
+ });
196
+
197
+ (
198
+ string memory coreContractType,
199
+ string memory coreContractVersion
200
+ ) = engineCoreContractType == IEngineFactoryV0.EngineCoreType.Engine
201
+ ? (engineCoreType, engineCoreVersion)
202
+ : (flexCoreType, flexCoreVersion);
203
+
204
+ // register the new Engine contract
205
+ ICoreRegistryV1(coreRegistry).registerContract(
206
+ engineContract,
207
+ _stringToBytes32(coreContractVersion),
208
+ _stringToBytes32(coreContractType)
209
+ );
210
+ // emit event
211
+ emit EngineContractCreated(engineContract);
212
+ }
213
+
214
+ /**
215
+ * @notice Calls transferOwnership on the core registry.
216
+ * Useful for updating the owner of the core registry contract.
217
+ * @param _owner address of the new owner
218
+ */
219
+ function transferCoreRegistryOwnership(address _owner) external onlyOwner {
220
+ Ownable(coreRegistry).transferOwnership(_owner);
221
+ }
222
+
223
+ /**
224
+ * @notice Registers multiple contracts with the core registry.
225
+ * @param contractAddresses An array of contract addresses to register.
226
+ * @param coreVersions An array of versions corresponding to the contract addresses.
227
+ * @param coreTypes An array of types corresponding to the contract addresses.
228
+ */
229
+ function registerMultipleContracts(
230
+ address[] calldata contractAddresses,
231
+ bytes32[] calldata coreVersions,
232
+ bytes32[] calldata coreTypes
233
+ ) external onlyOwner {
234
+ // @dev pure forwarding - input validation is done in the core registry
235
+ ICoreRegistryV1(coreRegistry).registerContracts({
236
+ contractAddresses: contractAddresses,
237
+ coreVersions: coreVersions,
238
+ coreTypes: coreTypes
239
+ });
240
+ }
241
+
242
+ /**
243
+ * @notice Unregisters multiple contracts from the core registry.
244
+ * @param contractAddresses An array of contract addresses to unregister.
245
+ */
246
+ function unregisterMultipleContracts(
247
+ address[] calldata contractAddresses
248
+ ) external onlyOwner {
249
+ // @dev pure forwarding - input validation is done in the core registry
250
+ ICoreRegistryV1(coreRegistry).unregisterContracts(contractAddresses);
251
+ }
252
+
253
+ /**
254
+ * @notice Abandons the contract, preventing it from being used to create
255
+ * new Engine and Engine Flex contracts.
256
+ * Only callable by the owner, and only once; reverts otherwise.
257
+ */
258
+ function abandon() external onlyOwner {
259
+ require(!isAbandoned, "factory is abandoned");
260
+ // set isAbandoned to true
261
+ isAbandoned = true;
262
+ // emit event
263
+ emit Abandoned();
264
+ }
265
+
266
+ /**
267
+ * @dev This contract is not intended to hold funds. This function,
268
+ * `drainETH`, and `drainERC20` are implemented to prevent the loss
269
+ * of funds that might be sent to this contract inadvertently.
270
+ */
271
+ receive() external payable {}
272
+
273
+ /**
274
+ * @notice Drains the contract's balance to the `recipient`.
275
+ * @param recipient The address to send funds to.
276
+ * Only callable by the owner.
277
+ */
278
+ function drainETH(address payable recipient) external onlyOwner {
279
+ uint256 balance = address(this).balance;
280
+ if (balance > 0) {
281
+ (bool success, ) = recipient.call{value: balance}("");
282
+ require(success, "Payment failed");
283
+ }
284
+ }
285
+
286
+ /**
287
+ * @notice Drains the contract's balance of an input ERC20 token to
288
+ * the `recipient`.
289
+ * @param ERC20TokenAddress The address of the ERC20 token to withdraw.
290
+ * @param recipient The address to send ERC20 tokens to.
291
+ * Only callable by the owner.
292
+ */
293
+ function drainERC20(
294
+ address ERC20TokenAddress,
295
+ address recipient
296
+ ) external onlyOwner {
297
+ IERC20 token = IERC20(ERC20TokenAddress);
298
+ uint256 balance = token.balanceOf(address(this));
299
+ if (balance > 0) {
300
+ SafeERC20.safeTransfer({
301
+ token: token,
302
+ to: recipient,
303
+ value: balance
304
+ });
305
+ }
306
+ }
307
+
308
+ /**
309
+ * @notice Execute a batch of calls.
310
+ * @dev The calls are executed in order, reverting if any of them fails. Can
311
+ * only be called by the owner. It is safe to check ownership only once here
312
+ * because the owner status is only used to gate access to the function, not
313
+ * to validate each individual call. Even if ownership is transferred during
314
+ * the sequence of calls, it does not affect the execution logic or security,
315
+ * as ownership is solely used to prevent unauthorized use of this batch
316
+ * execution capability. This is particularly useful to safely interact
317
+ * with contracts or addresses that might deem this contract eligible for
318
+ * airdrops, thereby avoiding loss of funds.
319
+ * @param _calls The calls to execute
320
+ */
321
+ function execCalls(
322
+ Call[] calldata _calls
323
+ )
324
+ external
325
+ onlyOwner
326
+ returns (uint256 blockNumber, bytes[] memory returnData)
327
+ {
328
+ blockNumber = block.number;
329
+ uint256 length = _calls.length;
330
+ returnData = new bytes[](length);
331
+
332
+ for (uint256 i = 0; i < length; ++i) {
333
+ Call calldata calli = _calls[i];
334
+
335
+ // check for existence of code at the target address
336
+ if (calli.to.code.length == 0) {
337
+ // when the call is to an EOA, the calldata must be empty.
338
+ require(calli.data.length == 0, "Invalid call data");
339
+ }
340
+
341
+ (bool success, bytes memory data) = calli.to.call(calli.data);
342
+ require(success, string(data));
343
+ returnData[i] = data;
344
+ }
345
+ }
346
+
347
+ /**
348
+ * @dev Predict the deterministic address for a new core contract of type
349
+ * `engineCoreContractType` and salt `salt`, deployed using the function
350
+ * `createEngineContract`.
351
+ * Reverts if `salt` is null, because the factory generates a pseudorandom
352
+ * salt in that case.
353
+ * @param engineCoreContractType Type of Engine Core contract.
354
+ * @param salt Salt used to deterministically deploy the clone.
355
+ */
356
+ function predictDeterministicAddress(
357
+ IEngineFactoryV0.EngineCoreType engineCoreContractType,
358
+ bytes32 salt
359
+ ) external view returns (address predicted) {
360
+ // cannot predict if salt is null, because factory generates pseudorandom salt
361
+ if (salt == bytes32(0)) {
362
+ revert("null salt = pseudorandom addr");
363
+ }
364
+ return
365
+ Clones.predictDeterministicAddress({
366
+ implementation: engineCoreContractType ==
367
+ IEngineFactoryV0.EngineCoreType.Engine
368
+ ? engineImplementation
369
+ : engineFlexImplementation,
370
+ salt: salt
371
+ });
372
+ }
373
+
374
+ /**
375
+ * @notice helper function to generate a pseudorandom salt
376
+ * @return result pseudorandom salt
377
+ */
378
+ function _generatePseudorandomSalt() internal returns (bytes32 result) {
379
+ // get and increment nonce to prevent same-block collisions
380
+ uint256 nonce = _pseudorandomSaltNonce++;
381
+ return
382
+ keccak256(
383
+ abi.encodePacked(
384
+ nonce,
385
+ block.timestamp,
386
+ block.number,
387
+ address(this)
388
+ )
389
+ );
390
+ }
391
+
392
+ /**
393
+ * @notice helper function to convert a string to a bytes32.
394
+ * Caution: This function only works properly for short strings.
395
+ * @param source string to convert
396
+ * @return result bytes32 representation of the string
397
+ */
398
+ function _stringToBytes32(
399
+ string memory source
400
+ ) internal pure returns (bytes32 result) {
401
+ bytes memory tempString = bytes(source);
402
+ if (tempString.length == 0) {
403
+ return 0x0;
404
+ }
405
+
406
+ assembly {
407
+ result := mload(add(source, 32))
408
+ }
409
+ }
410
+
411
+ /**
412
+ * @notice helper function to validate that an address is non-zero.
413
+ * Reverts if the address is zero.
414
+ * @param address_ address to validate
415
+ */
416
+ function _onlyNonZeroAddress(address address_) internal pure {
417
+ require(address_ != address(0), "Must input non-zero address");
418
+ }
419
+ }