@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
@@ -0,0 +1,42 @@
1
+ // SPDX-License-Identifier: LGPL-3.0-only
2
+ // Created By: Art Blocks Inc.
3
+
4
+ pragma solidity ^0.8.0;
5
+
6
+ /**
7
+ * @dev Library for packing multiple boolean values into a single uint256.
8
+ * This is useful for storing a large number of bool values in a more compact
9
+ * way than solidify's native bool type, which uses 8 bytes per bool.
10
+ *
11
+ * The implementation is similar to a BitMap, but function names are more
12
+ * descriptive for packing and unpacking multiple bools.
13
+ *
14
+ * Note that the library may still be used in cases where less than 256 bools
15
+ * are needed to be packed. For example, if <= 8 bools are needed, casting may
16
+ * be used outside of the library for compatibility with any size uint.
17
+ */
18
+ library PackedBools {
19
+ function getBool(
20
+ uint256 packedBool,
21
+ uint8 index
22
+ ) internal pure returns (bool) {
23
+ uint256 mask = 1 << index;
24
+ return packedBool & mask != 0;
25
+ }
26
+
27
+ function setBoolTrue(
28
+ uint256 bitMap,
29
+ uint8 index
30
+ ) internal pure returns (uint256 newBitMap) {
31
+ uint256 mask = 1 << index;
32
+ return bitMap | mask;
33
+ }
34
+
35
+ function setBoolFalse(
36
+ uint256 bitMap,
37
+ uint8 index
38
+ ) internal pure returns (uint256 newBitMap) {
39
+ uint256 mask = 1 << index;
40
+ return bitMap & ~mask;
41
+ }
42
+ }
@@ -0,0 +1,591 @@
1
+ // SPDX-License-Identifier: LGPL-3.0-only
2
+ // Created By: Art Blocks Inc.
3
+
4
+ pragma solidity ^0.8.0;
5
+
6
+ import {IGenArt721CoreContractV3_Engine_Flex} from "../../interfaces/v0.8.x/IGenArt721CoreContractV3_Engine_Flex.sol";
7
+
8
+ import {BytecodeStorageWriter, BytecodeStorageReader} from "./BytecodeStorageV2.sol";
9
+
10
+ /**
11
+ * @title Art Blocks V3 Engine Flex - External Helper Library
12
+ * @notice This library is designed to offload bytecode from the V3 Engine
13
+ * Flex contract. It implements logic that may be accessed via DELEGATECALL for
14
+ * operations related to the V3 Engine Flex contract.
15
+ * @author Art Blocks Inc.
16
+ */
17
+
18
+ library V3FlexLib {
19
+ using BytecodeStorageWriter for string;
20
+ using BytecodeStorageWriter for bytes;
21
+ // For the purposes of this implementation, due to the limited scope and
22
+ // existing legacy infrastructure, the library emits the events
23
+ // defined in IGenArt721CoreContractV3_Engine_Flex.sol. The events are
24
+ // manually duplicated here
25
+ /**
26
+ * @notice When an external asset dependency is updated or added, this event is emitted.
27
+ * @param _projectId The project ID of the project that was updated.
28
+ * @param _index The index of the external asset dependency that was updated.
29
+ * @param _cid Field that contains the CID of the dependency if IPFS or ARWEAVE,
30
+ * empty string of ONCHAIN, or a string representation of the Art Blocks Dependency
31
+ * Registry's `dependencyNameAndVersion` if ART_BLOCKS_DEPENDENCY_REGISTRY.
32
+ * @param _dependencyType The type of the external asset dependency.
33
+ * @param _externalAssetDependencyCount The number of external asset dependencies.
34
+ */
35
+ event ExternalAssetDependencyUpdated(
36
+ uint256 indexed _projectId,
37
+ uint256 indexed _index,
38
+ string _cid,
39
+ IGenArt721CoreContractV3_Engine_Flex.ExternalAssetDependencyType _dependencyType,
40
+ uint24 _externalAssetDependencyCount
41
+ );
42
+
43
+ /**
44
+ * @notice The project id `_projectId` has had an external asset dependency removed at index `_index`.
45
+ */
46
+ event ExternalAssetDependencyRemoved(
47
+ uint256 indexed _projectId,
48
+ uint256 indexed _index
49
+ );
50
+
51
+ /**
52
+ * @notice The preferred gateway for dependency type `_dependencyType` has been updated to `_gatewayAddress`.
53
+ */
54
+ event GatewayUpdated(
55
+ IGenArt721CoreContractV3_Engine_Flex.ExternalAssetDependencyType indexed _dependencyType,
56
+ string _gatewayAddress
57
+ );
58
+
59
+ /**
60
+ * @notice The project id `_projectId` has had all external asset dependencies locked.
61
+ * @dev This is a one-way operation. Once locked, the external asset dependencies cannot be updated.
62
+ */
63
+ event ProjectExternalAssetDependenciesLocked(uint256 indexed _projectId);
64
+
65
+ // position of V3 Flex Lib storage, using a diamond storage pattern
66
+ // for this library
67
+ bytes32 constant V3_FLEX_LIB_STORAGE_POSITION =
68
+ keccak256("v3flexlib.storage");
69
+
70
+ // project-level variables
71
+ /**
72
+ * Struct used to store a project's currently configured price, and
73
+ * whether or not the price has been configured.
74
+ */
75
+ struct FlexProjectData {
76
+ bool externalAssetDependenciesLocked;
77
+ uint24 externalAssetDependencyCount;
78
+ mapping(uint256 => IGenArt721CoreContractV3_Engine_Flex.ExternalAssetDependency) externalAssetDependencies;
79
+ }
80
+
81
+ // Diamond storage pattern is used in this library
82
+ struct V3FlexLibStorage {
83
+ string preferredIPFSGateway;
84
+ string preferredArweaveGateway;
85
+ mapping(uint256 projectId => FlexProjectData) flexProjectsData;
86
+ }
87
+
88
+ /**
89
+ * @notice Updates preferredIPFSGateway to `_gateway`.
90
+ * @param _gateway The new preferred IPFS gateway.
91
+ */
92
+ function updateIPFSGateway(string calldata _gateway) external {
93
+ s().preferredIPFSGateway = _gateway;
94
+ emit GatewayUpdated({
95
+ _dependencyType: IGenArt721CoreContractV3_Engine_Flex
96
+ .ExternalAssetDependencyType
97
+ .IPFS,
98
+ _gatewayAddress: _gateway
99
+ });
100
+ }
101
+
102
+ /**
103
+ * @notice Updates preferredArweaveGateway to `_gateway`.
104
+ * @param _gateway The new preferred Arweave gateway.
105
+ */
106
+ function updateArweaveGateway(string calldata _gateway) external {
107
+ s().preferredArweaveGateway = _gateway;
108
+ emit GatewayUpdated({
109
+ _dependencyType: IGenArt721CoreContractV3_Engine_Flex
110
+ .ExternalAssetDependencyType
111
+ .ARWEAVE,
112
+ _gatewayAddress: _gateway
113
+ });
114
+ }
115
+
116
+ /**
117
+ * @notice Locks external asset dependencies for project `_projectId`.
118
+ * Reverts if the external asset dependencies are already locked.
119
+ * @dev This is a one-way operation. Once locked, the external asset dependencies cannot be updated.
120
+ * @param _projectId Project to be locked.
121
+ */
122
+ function lockProjectExternalAssetDependencies(uint256 _projectId) external {
123
+ FlexProjectData storage flexProjectData = getFlexProjectData(
124
+ _projectId
125
+ );
126
+ _onlyUnlockedProjectExternalAssetDependencies(flexProjectData);
127
+ flexProjectData.externalAssetDependenciesLocked = true;
128
+ emit ProjectExternalAssetDependenciesLocked(_projectId);
129
+ }
130
+
131
+ /**
132
+ * @notice Updates external asset dependency for project `_projectId`.
133
+ * @dev Making this an external function adds roughly 1% to the gas cost of adding an asset, but
134
+ * significantly reduces the bytecode of contracts using this library.
135
+ * @param _projectId Project to be updated.
136
+ * @param _index Asset index.
137
+ * @param _cidOrData Field that contains the CID of the dependency if IPFS or ARWEAVE,
138
+ * empty string of ONCHAIN, or a string representation of the Art Blocks Dependency
139
+ * Registry's `dependencyNameAndVersion` if ART_BLOCKS_DEPENDENCY_REGISTRY.
140
+ * @param _dependencyType Asset dependency type.
141
+ * 0 - IPFS
142
+ * 1 - ARWEAVE
143
+ * 2 - ONCHAIN
144
+ * 3 - ART_BLOCKS_DEPENDENCY_REGISTRY
145
+ */
146
+ function updateProjectExternalAssetDependency(
147
+ uint256 _projectId,
148
+ uint256 _index,
149
+ string memory _cidOrData,
150
+ IGenArt721CoreContractV3_Engine_Flex.ExternalAssetDependencyType _dependencyType
151
+ ) external {
152
+ FlexProjectData storage flexProjectData = getFlexProjectData(
153
+ _projectId
154
+ );
155
+ _onlyUnlockedProjectExternalAssetDependencies(flexProjectData);
156
+ uint24 assetCount = flexProjectData.externalAssetDependencyCount;
157
+ require(_index < assetCount, "Asset index out of range");
158
+ // @dev dependencyNameAndVersion are not validated against the dependency registry
159
+ // due to limitations of L1 reads on L2 networks at this time
160
+
161
+ IGenArt721CoreContractV3_Engine_Flex.ExternalAssetDependency
162
+ storage _oldDependency = flexProjectData.externalAssetDependencies[
163
+ _index
164
+ ];
165
+ IGenArt721CoreContractV3_Engine_Flex.ExternalAssetDependencyType _oldDependencyType = _oldDependency
166
+ .dependencyType;
167
+ // update the asset's dependency type to new value in storage
168
+ flexProjectData
169
+ .externalAssetDependencies[_index]
170
+ .dependencyType = _dependencyType;
171
+ // if the incoming dependency type is onchain, we need to write the data to bytecode
172
+ if (
173
+ _dependencyType ==
174
+ IGenArt721CoreContractV3_Engine_Flex
175
+ .ExternalAssetDependencyType
176
+ .ONCHAIN
177
+ ) {
178
+ if (
179
+ _oldDependencyType !=
180
+ IGenArt721CoreContractV3_Engine_Flex
181
+ .ExternalAssetDependencyType
182
+ .ONCHAIN
183
+ ) {
184
+ // we only need to set the cid to an empty string if we are replacing an offchain asset
185
+ // an onchain asset will already have an empty cid
186
+ flexProjectData.externalAssetDependencies[_index].cid = "";
187
+ }
188
+
189
+ flexProjectData
190
+ .externalAssetDependencies[_index]
191
+ .bytecodeAddress = _cidOrData.writeToBytecode();
192
+ // we don't want to emit data, so we emit the cid as an empty string
193
+ _cidOrData = "";
194
+ } else {
195
+ // incoming dependency type is not ONCHAIN, so we set the cid directly with either
196
+ // the incoming cid or string representation of the dependencyNameAndVersion
197
+ flexProjectData.externalAssetDependencies[_index].cid = _cidOrData;
198
+ // clear any previously populated bytecode address
199
+ flexProjectData
200
+ .externalAssetDependencies[_index]
201
+ .bytecodeAddress = address(0);
202
+ }
203
+ emit ExternalAssetDependencyUpdated({
204
+ _projectId: _projectId,
205
+ _index: _index,
206
+ _cid: _cidOrData,
207
+ _dependencyType: _dependencyType,
208
+ _externalAssetDependencyCount: assetCount
209
+ });
210
+ }
211
+
212
+ /**
213
+ * @notice Updates external asset dependency for project `_projectId` of type
214
+ * ONCHAIN using on-chain compression. This function stores the string
215
+ * in a compressed format on-chain. For reads, the compressed script is
216
+ * decompressed on-chain, ensuring the original text is reconstructed without
217
+ * external dependencies.
218
+ * @param _projectId Project to be updated.
219
+ * @param _index Asset index.
220
+ * @param _compressedString Pre-compressed string asset to be added.
221
+ */
222
+ function updateProjectExternalAssetDependencyOnChainCompressed(
223
+ uint256 _projectId,
224
+ uint256 _index,
225
+ bytes memory _compressedString
226
+ ) external {
227
+ FlexProjectData storage flexProjectData = getFlexProjectData(
228
+ _projectId
229
+ );
230
+ _onlyUnlockedProjectExternalAssetDependencies(flexProjectData);
231
+
232
+ // check that the index is within the range of the asset count
233
+ uint24 assetCount = flexProjectData.externalAssetDependencyCount;
234
+ require(_index < assetCount, "Asset index out of range");
235
+
236
+ // EFFECTS
237
+ // overwrite the relevant fields of the previous asset, assigning bytecodeAddress directly
238
+ IGenArt721CoreContractV3_Engine_Flex.ExternalAssetDependency
239
+ storage currentDependency = flexProjectData
240
+ .externalAssetDependencies[_index];
241
+ currentDependency.cid = "";
242
+ currentDependency.dependencyType = IGenArt721CoreContractV3_Engine_Flex
243
+ .ExternalAssetDependencyType
244
+ .ONCHAIN;
245
+ currentDependency.bytecodeAddress = _compressedString
246
+ .writeToBytecodeCompressed();
247
+
248
+ // emit the event
249
+ emit ExternalAssetDependencyUpdated({
250
+ _projectId: _projectId,
251
+ _index: _index,
252
+ _cid: "",
253
+ _dependencyType: IGenArt721CoreContractV3_Engine_Flex
254
+ .ExternalAssetDependencyType
255
+ .ONCHAIN,
256
+ _externalAssetDependencyCount: assetCount
257
+ });
258
+ }
259
+
260
+ /**
261
+ * @notice Updates external asset dependency for project `_projectId` at
262
+ * index `_index`, with data at BytecodeStorage-compatible address
263
+ * `_assetAddress`.
264
+ * @param _projectId Project to be updated.
265
+ * @param _index Asset index.
266
+ * @param _assetAddress Address of the on-chain asset.
267
+ */
268
+ function updateProjectAssetDependencyOnChainAtAddress(
269
+ uint256 _projectId,
270
+ uint256 _index,
271
+ address _assetAddress
272
+ ) external {
273
+ // CHECKS
274
+ FlexProjectData storage flexProjectData = getFlexProjectData(
275
+ _projectId
276
+ );
277
+ _onlyUnlockedProjectExternalAssetDependencies(flexProjectData);
278
+ uint24 assetCount = flexProjectData.externalAssetDependencyCount;
279
+ require(_index < assetCount, "Asset index out of range");
280
+
281
+ // EFFECTS
282
+ // overwrite the relevant fields of the previous asset
283
+ IGenArt721CoreContractV3_Engine_Flex.ExternalAssetDependency
284
+ storage currentDependency = flexProjectData
285
+ .externalAssetDependencies[_index];
286
+ currentDependency.cid = "";
287
+ currentDependency.dependencyType = IGenArt721CoreContractV3_Engine_Flex
288
+ .ExternalAssetDependencyType
289
+ .ONCHAIN;
290
+ currentDependency.bytecodeAddress = _assetAddress;
291
+
292
+ // emit the event
293
+ emit ExternalAssetDependencyUpdated({
294
+ _projectId: _projectId,
295
+ _index: _index,
296
+ _cid: "",
297
+ _dependencyType: IGenArt721CoreContractV3_Engine_Flex
298
+ .ExternalAssetDependencyType
299
+ .ONCHAIN,
300
+ _externalAssetDependencyCount: assetCount
301
+ });
302
+ }
303
+
304
+ /**
305
+ * @notice Removes external asset dependency for project `_projectId` at index `_index`.
306
+ * Removal is done by swapping the element to be removed with the last element in the array, then deleting this last element.
307
+ * Assets with indices higher than `_index` can have their indices adjusted as a result of this operation.
308
+ * @param _projectId Project to be updated.
309
+ * @param _index Asset index
310
+ */
311
+ function removeProjectExternalAssetDependency(
312
+ uint256 _projectId,
313
+ uint256 _index
314
+ ) external {
315
+ FlexProjectData storage flexProjectData = getFlexProjectData(
316
+ _projectId
317
+ );
318
+ _onlyUnlockedProjectExternalAssetDependencies(flexProjectData);
319
+ // ensure the index is within the range of the asset count
320
+ uint24 assetCount = flexProjectData.externalAssetDependencyCount;
321
+ require(_index < assetCount, "Asset index out of range");
322
+ // @dev solidity underflow will revert on the following statement if assetCount is 0
323
+ uint24 lastElementIndex = assetCount - 1;
324
+ // for UX purposes, only allow removal of the last lastElementIndex
325
+ require(_index == lastElementIndex, "Only removal of last asset");
326
+
327
+ // @dev simply delete last element; no need to copy last to deleted index due to require statement above
328
+
329
+ delete flexProjectData.externalAssetDependencies[lastElementIndex];
330
+
331
+ flexProjectData.externalAssetDependencyCount = lastElementIndex;
332
+
333
+ emit ExternalAssetDependencyRemoved({
334
+ _projectId: _projectId,
335
+ _index: _index
336
+ });
337
+ }
338
+
339
+ /**
340
+ * @notice Adds external asset dependency for project `_projectId`.
341
+ * @dev Making this an external function adds roughly 1% to the gas cost of adding an asset, but
342
+ * significantly reduces the bytecode of contracts using this library.
343
+ * @param _projectId Project to be updated.
344
+ * @param _cidOrData Field that contains the CID of the dependency if IPFS or ARWEAVE,
345
+ * empty string of ONCHAIN, or a string representation of the Art Blocks Dependency
346
+ * Registry's `dependencyNameAndVersion` if ART_BLOCKS_DEPENDENCY_REGISTRY.
347
+ * @param _dependencyType Asset dependency type.
348
+ * 0 - IPFS
349
+ * 1 - ARWEAVE
350
+ * 2 - ONCHAIN
351
+ * 3 - ART_BLOCKS_DEPENDENCY_REGISTRY
352
+ */
353
+ function addProjectExternalAssetDependency(
354
+ uint256 _projectId,
355
+ string memory _cidOrData,
356
+ IGenArt721CoreContractV3_Engine_Flex.ExternalAssetDependencyType _dependencyType
357
+ ) external {
358
+ FlexProjectData storage flexProjectData = getFlexProjectData(
359
+ _projectId
360
+ );
361
+ _onlyUnlockedProjectExternalAssetDependencies(flexProjectData);
362
+ // @dev dependencyNameAndVersion are not validated against the dependency registry
363
+ // due to limitations of L1 reads on L2 networks at this time
364
+
365
+ uint24 assetCount = flexProjectData.externalAssetDependencyCount;
366
+ address _bytecodeAddress = address(0);
367
+ // if the incoming dependency type is onchain, we need to write the data to bytecode
368
+ if (
369
+ _dependencyType ==
370
+ IGenArt721CoreContractV3_Engine_Flex
371
+ .ExternalAssetDependencyType
372
+ .ONCHAIN
373
+ ) {
374
+ _bytecodeAddress = _cidOrData.writeToBytecode();
375
+ // we don't want to assign or emit data, so we emit the cid as an empty string
376
+ _cidOrData = "";
377
+ }
378
+
379
+ // append the new asset to the end of the project's asset storage array
380
+ flexProjectData.externalAssetDependencies[
381
+ assetCount
382
+ ] = IGenArt721CoreContractV3_Engine_Flex.ExternalAssetDependency({
383
+ cid: _cidOrData,
384
+ dependencyType: _dependencyType,
385
+ bytecodeAddress: _bytecodeAddress
386
+ });
387
+ // increment the project's asset count
388
+ flexProjectData.externalAssetDependencyCount = assetCount + 1;
389
+
390
+ // emit event indicating the asset has been added
391
+ emit ExternalAssetDependencyUpdated({
392
+ _projectId: _projectId,
393
+ _index: assetCount,
394
+ _cid: _cidOrData,
395
+ _dependencyType: _dependencyType,
396
+ _externalAssetDependencyCount: assetCount + 1
397
+ });
398
+ }
399
+
400
+ /**
401
+ * @notice Adds external asset dependency for project `_projectId` of type
402
+ * ONCHAIN using on-chain compression. This function stores the string
403
+ * in a compressed format on-chain. For reads, the compressed script is
404
+ * decompressed on-chain, ensuring the original text is reconstructed without
405
+ * external dependencies.
406
+ * @param _projectId Project to be updated.
407
+ * @param _compressedString Pre-compressed string asset to be added.
408
+ */
409
+ function addProjectExternalAssetDependencyOnChainCompressed(
410
+ uint256 _projectId,
411
+ bytes memory _compressedString
412
+ ) external {
413
+ FlexProjectData storage flexProjectData = getFlexProjectData(
414
+ _projectId
415
+ );
416
+ _onlyUnlockedProjectExternalAssetDependencies(flexProjectData);
417
+
418
+ // append the new asset to the end of the project's asset storage array
419
+ uint24 assetCount = flexProjectData.externalAssetDependencyCount;
420
+ flexProjectData.externalAssetDependencies[
421
+ assetCount
422
+ ] = IGenArt721CoreContractV3_Engine_Flex.ExternalAssetDependency({
423
+ cid: "",
424
+ dependencyType: IGenArt721CoreContractV3_Engine_Flex
425
+ .ExternalAssetDependencyType
426
+ .ONCHAIN,
427
+ bytecodeAddress: _compressedString.writeToBytecodeCompressed()
428
+ });
429
+
430
+ // increment the asset count
431
+ flexProjectData.externalAssetDependencyCount = assetCount + 1;
432
+
433
+ // emit event indicating the asset has been added
434
+ emit ExternalAssetDependencyUpdated({
435
+ _projectId: _projectId,
436
+ _index: assetCount,
437
+ _cid: "",
438
+ _dependencyType: IGenArt721CoreContractV3_Engine_Flex
439
+ .ExternalAssetDependencyType
440
+ .ONCHAIN,
441
+ _externalAssetDependencyCount: assetCount + 1
442
+ });
443
+ }
444
+
445
+ /**
446
+ * @notice Adds an on-chain external asset dependency for project
447
+ * `_projectId`, with data at BytecodeStorage-compatible address
448
+ * `_assetAddress`.
449
+ * @param _projectId Project to be updated.
450
+ * @param _assetAddress Address of the BytecodeStorageReader-compatible on-chain asset.
451
+ */
452
+ function addProjectAssetDependencyOnChainAtAddress(
453
+ uint256 _projectId,
454
+ address _assetAddress
455
+ ) external {
456
+ FlexProjectData storage flexProjectData = getFlexProjectData(
457
+ _projectId
458
+ );
459
+ _onlyUnlockedProjectExternalAssetDependencies(flexProjectData);
460
+
461
+ // append the new asset to the end of the project's asset storage array
462
+ uint24 assetCount = flexProjectData.externalAssetDependencyCount;
463
+ flexProjectData.externalAssetDependencies[
464
+ assetCount
465
+ ] = IGenArt721CoreContractV3_Engine_Flex.ExternalAssetDependency({
466
+ cid: "",
467
+ dependencyType: IGenArt721CoreContractV3_Engine_Flex
468
+ .ExternalAssetDependencyType
469
+ .ONCHAIN,
470
+ bytecodeAddress: _assetAddress
471
+ });
472
+
473
+ // increment the asset count
474
+ flexProjectData.externalAssetDependencyCount = assetCount + 1;
475
+
476
+ // emit event indicating the asset has been added
477
+ emit ExternalAssetDependencyUpdated({
478
+ _projectId: _projectId,
479
+ _index: assetCount,
480
+ _cid: "",
481
+ _dependencyType: IGenArt721CoreContractV3_Engine_Flex
482
+ .ExternalAssetDependencyType
483
+ .ONCHAIN,
484
+ _externalAssetDependencyCount: assetCount + 1
485
+ });
486
+ }
487
+
488
+ /**
489
+ * @notice Returns external asset dependency count for project `_projectId` at index `_index`.
490
+ */
491
+ function projectExternalAssetDependencyCount(
492
+ uint256 _projectId
493
+ ) external view returns (uint256) {
494
+ FlexProjectData storage flexProjectData = getFlexProjectData(
495
+ _projectId
496
+ );
497
+ return uint256(flexProjectData.externalAssetDependencyCount);
498
+ }
499
+
500
+ /**
501
+ * @notice Returns external asset dependency for project `_projectId` at index `_index`.
502
+ * If the dependencyType is ONCHAIN, the `data` field will contain the extrated bytecode data and `cid`
503
+ * will be an empty string. Conversly, for any other dependencyType, the `data` field will be an empty string
504
+ * and the `bytecodeAddress` will point to the zero address.
505
+ */
506
+ function projectExternalAssetDependencyByIndex(
507
+ uint256 _projectId,
508
+ uint256 _index
509
+ )
510
+ external
511
+ view
512
+ returns (
513
+ IGenArt721CoreContractV3_Engine_Flex.ExternalAssetDependencyWithData
514
+ memory
515
+ )
516
+ {
517
+ FlexProjectData storage flexProjectData = getFlexProjectData(
518
+ _projectId
519
+ );
520
+ IGenArt721CoreContractV3_Engine_Flex.ExternalAssetDependency
521
+ storage _dependency = flexProjectData.externalAssetDependencies[
522
+ _index
523
+ ];
524
+ address _bytecodeAddress = _dependency.bytecodeAddress;
525
+
526
+ return
527
+ IGenArt721CoreContractV3_Engine_Flex
528
+ .ExternalAssetDependencyWithData({
529
+ dependencyType: _dependency.dependencyType,
530
+ cid: _dependency.cid,
531
+ bytecodeAddress: _bytecodeAddress,
532
+ data: (_dependency.dependencyType ==
533
+ IGenArt721CoreContractV3_Engine_Flex
534
+ .ExternalAssetDependencyType
535
+ .ONCHAIN)
536
+ ? BytecodeStorageReader.readFromBytecode(
537
+ _bytecodeAddress
538
+ )
539
+ : ""
540
+ });
541
+ }
542
+
543
+ /**
544
+ * @notice Returns the preferred IPFS gateway.
545
+ */
546
+ function preferredIPFSGateway() external view returns (string memory) {
547
+ return s().preferredIPFSGateway;
548
+ }
549
+
550
+ /**
551
+ * @notice Returns the preferred Arweave gateway.
552
+ */
553
+ function preferredArweaveGateway() external view returns (string memory) {
554
+ return s().preferredArweaveGateway;
555
+ }
556
+
557
+ /**
558
+ * @notice Loads the FlexProjectData for a given project.
559
+ * @param projectId Project Id to get FlexProjectData for
560
+ */
561
+ function getFlexProjectData(
562
+ uint256 projectId
563
+ ) internal view returns (FlexProjectData storage) {
564
+ return s().flexProjectsData[projectId];
565
+ }
566
+
567
+ /**
568
+ * @notice Return the storage struct for reading and writing. This library
569
+ * uses a diamond storage pattern when managing storage.
570
+ * @return storageStruct The V3FlexLibStorage struct.
571
+ */
572
+ function s()
573
+ internal
574
+ pure
575
+ returns (V3FlexLibStorage storage storageStruct)
576
+ {
577
+ bytes32 position = V3_FLEX_LIB_STORAGE_POSITION;
578
+ assembly ("memory-safe") {
579
+ storageStruct.slot := position
580
+ }
581
+ }
582
+
583
+ function _onlyUnlockedProjectExternalAssetDependencies(
584
+ FlexProjectData storage flexProjectData
585
+ ) private view {
586
+ require(
587
+ !flexProjectData.externalAssetDependenciesLocked,
588
+ "External dependencies locked"
589
+ );
590
+ }
591
+ }