@artblocks/contracts 1.3.2 → 1.4.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.
- package/README.md +11 -10
- package/artifacts/contracts/AdminACLV0RoyaltyRegistry.sol/AdminACLV0RoyaltyRegistry.json +193 -0
- package/artifacts/contracts/AdminACLV0RoyaltyRegistry.sol/IRoyaltyRegistry.json +35 -0
- package/artifacts/contracts/AdminACLV1.sol/AdminACLV1.json +2 -2
- package/artifacts/contracts/BytecodeStorageReaders/BytecodeStorageReaderContractV2.sol/BytecodeStorageReaderContractV2.json +2 -2
- package/artifacts/contracts/BytecodeStorageReaders/BytecodeStorageReaderContractV2_Web3Call.sol/BytecodeStorageReaderContractV2_Web3Call.json +2 -2
- package/artifacts/contracts/BytecodeStorageV2Writer.sol/BytecodeStorageV2Writer.json +2 -2
- package/artifacts/contracts/DependencyRegistryV0.sol/DependencyRegistryV0.json +210 -2
- package/artifacts/contracts/GenArt721CoreV3_Curated.sol/GenArt721CoreV3_Curated.json +235 -20
- package/artifacts/contracts/GenArt721CoreV3_Curated_Flex.sol/GenArt721CoreV3_Curated_Flex.json +3197 -0
- package/artifacts/contracts/GenArt721CoreV3_Explorations_Flex.sol/GenArt721CoreV3_Explorations_Flex.json +3192 -0
- package/artifacts/contracts/OwnedCreate2FactoryV0.sol/OwnedCreate2FactoryV0.json +2 -2
- package/artifacts/contracts/archive/GenArt721CoreV3.sol/GenArt721CoreV3.json +27 -2
- package/artifacts/contracts/archive/GenArt721CoreV3_Explorations.sol/GenArt721CoreV3_Explorations.json +27 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV2.sol/MinterDAExpV2.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV3.sol/MinterDAExpV3.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV4.sol/MinterDAExpV4.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol/MinterDAExpSettlementV0.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV1.sol/MinterDAExpSettlementV1.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV2.sol/MinterDAExpSettlementV2.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV2.sol/MinterDALinV2.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV3.sol/MinterDALinV3.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV4.sol/MinterDALinV4.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV1.sol/MinterHolderV1.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV2.sol/MinterHolderV2.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV3.sol/MinterHolderV3.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV4.sol/MinterHolderV4.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV1.sol/MinterMerkleV1.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV2.sol/MinterMerkleV2.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV3.sol/MinterMerkleV3.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV4.sol/MinterMerkleV4.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV5.sol/MinterMerkleV5.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterPolyptych/MinterPolyptychV0.sol/IGenArt721CoreContractV3WithRandomizer.json +25 -0
- package/artifacts/contracts/archive/minter-suite/Minters/MinterPolyptych/MinterPolyptychV0.sol/MinterPolyptychV0.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterSEA/MinterSEAV0.sol/MinterSEAV0.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV2.sol/MinterSetPriceV2.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV3.sol/MinterSetPriceV3.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV4.sol/MinterSetPriceV4.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V2.sol/MinterSetPriceERC20V2.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V3.sol/MinterSetPriceERC20V3.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V4.sol/MinterSetPriceERC20V4.json +2 -2
- package/artifacts/contracts/engine/V3/EngineFactoryV0.sol/EngineFactoryV0.json +28 -2
- package/artifacts/contracts/engine/V3/GenArt721CoreV3_Engine.sol/GenArt721CoreV3_Engine.json +239 -20
- package/artifacts/contracts/engine/V3/GenArt721CoreV3_Engine_Flex.sol/GenArt721CoreV3_Engine_Flex.json +267 -48
- package/artifacts/contracts/engine/V3/forks/GenArt721CoreV3_Engine_Flex_PROOF.sol/GenArt721CoreV3_Engine_Flex_PROOF.json +27 -2
- package/artifacts/contracts/engine/V3/forks/PROHIBITION/AdminACLV0_PROHIBITION.sol/AdminACLV0_PROHIBITION.json +2 -2
- package/artifacts/contracts/engine/V3/forks/PROHIBITION/GenArt721CoreV3_Engine_Flex_PROHIBITION.sol/GenArt721CoreV3_Engine_Flex_PROHIBITION.json +27 -2
- package/artifacts/contracts/engine/V3/forks/PROHIBITION/interfaces/IGenArt721CoreContractV3_Engine_Flex_PROHIBITION.sol/IGenArt721CoreContractV3_Engine_Flex_PROHIBITION.json +25 -0
- package/artifacts/contracts/engine/V3/transfer-hooks/AbstractTransferHook.sol/AbstractTransferHook.json +79 -0
- package/artifacts/contracts/engine/V3/transfer-hooks/OwnerHistoryTransferHook.sol/OwnerHistoryTransferHook.json +315 -0
- package/artifacts/contracts/generator/GenArt721GeneratorV0.sol/GenArt721GeneratorV0.json +2 -2
- package/artifacts/contracts/interfaces/v0.8.x/IClaimMinter.sol/IClaimMinter.json +189 -0
- package/artifacts/contracts/interfaces/v0.8.x/IDependencyRegistryV0.sol/IDependencyRegistryV0.json +149 -0
- package/artifacts/contracts/interfaces/v0.8.x/IEngineFactoryV0.sol/IEngineFactoryV0.json +26 -0
- package/artifacts/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3.sol/IGenArt721CoreContractV3.json +25 -0
- package/artifacts/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Base.sol/IGenArt721CoreContractV3_Base.json +25 -0
- package/artifacts/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Engine.sol/IGenArt721CoreContractV3_Engine.json +123 -0
- package/artifacts/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Engine_Flex.sol/IGenArt721CoreContractV3_Engine_Flex.json +123 -0
- package/artifacts/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Engine_Flex_PreV3p2.sol/IGenArt721CoreContractV3_Engine_Flex_PreV3p2.json +25 -0
- package/artifacts/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Engine_PreV3p2.sol/IGenArt721CoreContractV3_Engine_PreV3p2.json +25 -0
- package/artifacts/contracts/interfaces/v0.8.x/IOwnerHistoryTransferHook.sol/IOwnerHistoryTransferHook.json +299 -0
- package/artifacts/contracts/interfaces/v0.8.x/ISRHooks.sol/ISRHooks.json +432 -0
- package/artifacts/contracts/interfaces/v0.8.x/ISeaDropShimForContract.sol/ISeaDropShimForContract.json +0 -13
- package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterTieredAllowV0.sol/ISharedMinterTieredAllowV0.json +94 -0
- package/artifacts/contracts/interfaces/v0.8.x/ITransferHook.sol/ITransferHook.json +63 -0
- package/artifacts/contracts/libs/v0.8.x/AuthLib.sol/AuthLib.json +2 -2
- package/artifacts/contracts/libs/v0.8.x/BytecodeStorageV2.sol/BytecodeStorageReader.json +2 -2
- package/artifacts/contracts/libs/v0.8.x/BytecodeStorageV2.sol/BytecodeStorageWriter.json +2 -2
- package/artifacts/contracts/libs/v0.8.x/DependencyRegistryStorageLib.sol/DependencyRegistryStorageLib.json +2 -2
- package/artifacts/contracts/libs/v0.8.x/ENSLib.sol/ENSLib.json +10 -0
- package/artifacts/contracts/libs/v0.8.x/ENSLib.sol/IUniversalResolver.json +45 -0
- package/artifacts/contracts/libs/v0.8.x/EnumerableSetUint16.sol/EnumerableSetUint16.json +10 -0
- package/artifacts/contracts/libs/v0.8.x/FeistelWalkLib.sol/FeistelWalkLib.json +10 -0
- package/artifacts/contracts/libs/v0.8.x/ImmutableUint16Array.sol/ImmutableUint16Array.json +10 -0
- package/artifacts/contracts/libs/v0.8.x/V3EngineLib.sol/V3EngineLib.json +163 -0
- package/artifacts/contracts/libs/v0.8.x/V3FlexLib.sol/V3FlexLib.json +2 -2
- package/artifacts/contracts/libs/v0.8.x/V3TransferHookLib.sol/V3TransferHookLib.json +79 -0
- package/artifacts/contracts/libs/v0.8.x/minter-libs/MaxInvocationsLib.sol/MaxInvocationsLib.json +2 -2
- package/artifacts/contracts/libs/v0.8.x/minter-libs/OnChainAllowlistLib.sol/OnChainAllowlistLib.json +10 -0
- package/artifacts/contracts/libs/v0.8.x/minter-libs/PolyptychLib.sol/PolyptychLib.json +2 -2
- package/artifacts/contracts/libs/v0.8.x/minter-libs/RAMLib.sol/RAMLib.json +2 -2
- package/artifacts/contracts/libs/v0.8.x/minter-libs/SEALib.sol/SEALib.json +2 -2
- package/artifacts/contracts/libs/v0.8.x/minter-libs/SettlementExpLib.sol/SettlementExpLib.json +2 -2
- package/artifacts/contracts/libs/v0.8.x/minter-libs/SplitFundsLib.sol/SplitFundsLib.json +2 -2
- package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV1.sol/MinterFilterV1.json +2 -2
- package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV2.sol/MinterFilterV2.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterDAExpHolderV5.sol/MinterDAExpHolderV5.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterDAExpSettlementV3.sol/MinterDAExpSettlementV3.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterDAExpV5.sol/MinterDAExpV5.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterDALinHolderV5.sol/MinterDALinHolderV5.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterDALinV5.sol/MinterDALinV5.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterMinPriceMerkleV0.sol/MinterMinPriceMerkleV0.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterMinPriceV0.sol/MinterMinPriceV0.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterRAMV0.sol/MinterRAMV0.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterSEAV1.sol/MinterSEAV1.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20V5.sol/MinterSetPriceERC20V5.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceHolderV5.sol/MinterSetPriceHolderV5.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceMerkleV5.sol/MinterSetPriceMerkleV5.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceOnChainAllowV0.sol/MinterSetPriceOnChainAllowV0.json +522 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPricePolyptychERC20V5.sol/MinterSetPricePolyptychERC20V5.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterSetPricePolyptychV5.sol/MinterSetPricePolyptychV5.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceTieredAllowV1.sol/MinterSetPriceTieredAllowV1.json +715 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceV5.sol/MinterSetPriceV5.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterSlidingScaleV0.sol/MinterSlidingScaleV0.json +431 -0
- package/artifacts/contracts/minter-suite/Minters/one-off/ClaimMinter.sol/ClaimMinter.json +502 -0
- package/artifacts/contracts/minter-suite/Minters/one-off/MinterSetPriceTieredOnChainAllowV0.sol/MinterSetPriceTieredOnChainAllowV0.json +673 -0
- package/artifacts/contracts/minter-suite/Minters/one-off/MinterSetPriceV5_SingleCore.sol/MinterSetPriceV5_SingleCore.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/one-off/SeaDropXArtBlocksShim.sol/SeaDropXArtBlocksShim.json +6 -19
- package/artifacts/contracts/mock/BytecodeV2TextCR_DMock.sol/BytecodeV2TextCR_DMock.json +2 -2
- package/artifacts/contracts/mock/DummySharedMinter.sol/DummySharedMinter.json +2 -2
- package/artifacts/contracts/mock/ENSLibMock.sol/ENSLibMock.json +30 -0
- package/artifacts/contracts/mock/EnumerableSetUint16Mock.sol/EnumerableSetUint16Mock.json +146 -0
- package/artifacts/contracts/mock/FeistelWalkLibMock.sol/FeistelWalkLibMock.json +142 -0
- package/artifacts/contracts/mock/ForceSendMock.sol/ForceSendMock.json +2 -2
- package/artifacts/contracts/mock/GenArt721CoreV3_Engine_IncorrectCoreType.sol/GenArt721CoreV3_Engine_IncorrectCoreType.json +2 -2
- package/artifacts/contracts/mock/ImmutableUint16ArrayMock.sol/ImmutableUint16ArrayMock.json +89 -0
- package/artifacts/contracts/mock/MockAdminACLV0_PROHIBITION.sol/MockAdminACLV0Events_PROHIBITION.json +2 -2
- package/artifacts/contracts/mock/MockGenArt721V3Core.sol/MockGenArt721V3Core.json +490 -0
- package/artifacts/contracts/mock/MockPMP.sol/MockPMP.json +523 -0
- package/artifacts/contracts/mock/MockTransferHook.sol/MockTransferHook.json +453 -0
- package/artifacts/contracts/mock/MockTransferHookTestHelpers.sol/MockBatchTransferrer.json +39 -0
- package/artifacts/contracts/mock/MockTransferHookTestHelpers.sol/MockForwardingERC721Receiver.json +71 -0
- package/artifacts/contracts/mock/MockTransferHookTestHelpers.sol/MockSpoofingCore.json +94 -0
- package/artifacts/contracts/mock/RandomizerV2_NoAssignMock.sol/RandomizerV2_NoAssignMock.json +2 -2
- package/artifacts/contracts/mock/ReentrancyBatchMockShared.sol/IBatchMinter.json +64 -0
- package/artifacts/contracts/mock/ReentrancyBatchMockShared.sol/ReentrancyBatchMockShared.json +113 -0
- package/artifacts/contracts/mock/RelayExecutorTestHelper.sol/MockTarget.json +74 -0
- package/artifacts/contracts/mock/RelayExecutorTestHelper.sol/RelayExecutorPartialRevertsTestHelper.json +138 -0
- package/artifacts/contracts/mock/RelayExecutorTestHelper.sol/RelayExecutorTestHelper.json +119 -0
- package/artifacts/contracts/randomizer/deprecated/PolyptychRandomizerV0.sol/BasicPolyptychRandomizerV0.json +2 -2
- package/artifacts/contracts/randomizer/deprecated/RandomizerV2.sol/BasicRandomizerV2.json +2 -2
- package/artifacts/contracts/randomizer/shared/SharedRandomizerV0.sol/SharedRandomizerV0.json +2 -2
- package/artifacts/contracts/relay/RelayExecutor.sol/RelayExecutor.json +101 -0
- package/artifacts/contracts/relay/RelayExecutorPartialReverts.sol/RelayExecutorPartialReverts.json +120 -0
- package/artifacts/contracts/royalty-registry/GenArt721RoyaltyOverrideSplits.sol/GenArt721RoyaltyOverrideSplits.json +263 -0
- package/artifacts/contracts/utils/MintMulticallUtil.sol/IMinterSetPriceV5.json +40 -0
- package/artifacts/contracts/utils/MintMulticallUtil.sol/MintMulticallUtil.json +163 -0
- package/artifacts/contracts/web3call/PMPV0.sol/PMPV0.json +2 -2
- package/artifacts/contracts/web3call/PMPV1.sol/PMPV1.json +648 -0
- package/artifacts/contracts/web3call/augment-hooks/InjectBaseGasFee.sol/InjectBaseGasFee.json +2 -2
- package/artifacts/contracts/web3call/augment-hooks/InjectBlockHeight.sol/InjectBlockHeight.json +83 -0
- package/artifacts/contracts/web3call/augment-hooks/InjectBlockHeightAndArtistProjectOverrides.sol/InjectBlockHeightAndArtistProjectOverrides.json +226 -0
- package/artifacts/contracts/web3call/augment-hooks/InjectBlockHeightAndNumOwnedProjectTokens.sol/InjectBlockHeightAndNumOwnedProjectTokens.json +182 -0
- package/artifacts/contracts/web3call/augment-hooks/InjectBlockHeightProjectInvocationsAndArtistProjectOverrides.sol/InjectBlockHeightProjectInvocationsAndArtistProjectOverrides.json +226 -0
- package/artifacts/contracts/web3call/augment-hooks/InjectBlockTimestamp.sol/InjectBlockTimestamp.json +83 -0
- package/artifacts/contracts/web3call/augment-hooks/InjectBytesPerToken.sol/InjectBytesPerToken.json +358 -0
- package/artifacts/contracts/web3call/augment-hooks/InjectChromieSquiggleFloorPrice.sol/InjectChromieSquiggleFloorPrice.json +2 -2
- package/artifacts/contracts/web3call/augment-hooks/InjectIsNounsDaoMember.sol/InjectIsNounsDaoMember.json +2 -2
- package/artifacts/contracts/web3call/augment-hooks/InjectIsProjectFullyMinted.sol/InjectIsProjectFullyMinted.json +2 -2
- package/artifacts/contracts/web3call/augment-hooks/InjectPolyptychTokenHash.sol/InjectPolyptychTokenHash.json +2 -2
- package/artifacts/contracts/web3call/augment-hooks/InjectTokenHashSeed.sol/InjectTokenHashSeed.json +2 -2
- package/artifacts/contracts/web3call/augment-hooks/InjectTokenOwner.sol/InjectTokenOwner.json +2 -2
- package/artifacts/contracts/web3call/augment-hooks/InjectTokenOwnerEthBalance.sol/InjectTokenOwnerEthBalance.json +2 -2
- package/artifacts/contracts/web3call/augment-hooks/InjectUSDCTotalSupply.sol/InjectUSDCTotalSupply.json +2 -2
- package/artifacts/contracts/web3call/augment-hooks/SRHooks.sol/SRHooks.json +899 -0
- package/artifacts/contracts/web3call/combined-hooks/LiftHooks.sol/IGenArt721V0_Minimal.json +30 -0
- package/artifacts/contracts/web3call/combined-hooks/LiftHooks.sol/IRelic.json +35 -0
- package/artifacts/contracts/web3call/combined-hooks/LiftHooks.sol/LiftHooks.json +256 -0
- package/artifacts/contracts/web3call/configure-hooks/{abstractPMPConfigureHook.sol → AbstractPMPConfigureHook.sol}/AbstractPMPConfigureHook.json +1 -1
- package/artifacts/contracts/web3call/configure-hooks/PMPConfigureLockHook.sol/PMPConfigureLockHook.json +195 -0
- package/contracts/AdminACLV0RoyaltyRegistry.sol +142 -0
- package/contracts/DependencyRegistryV0.sol +143 -13
- package/contracts/GenArt721CoreV3_Curated.sol +1 -1
- package/contracts/GenArt721CoreV3_Curated_Flex.sol +173 -0
- package/contracts/GenArt721CoreV3_Explorations_Flex.sol +159 -0
- package/contracts/engine/V3/EngineFactoryV0.sol +20 -1
- package/contracts/engine/V3/GenArt721CoreV3_Engine.sol +286 -299
- package/contracts/engine/V3/GenArt721CoreV3_Engine_Flex.sol +292 -301
- package/contracts/engine/V3/transfer-hooks/AbstractTransferHook.sol +101 -0
- package/contracts/engine/V3/transfer-hooks/OwnerHistoryTransferHook.sol +291 -0
- package/contracts/generator/GenArt721GeneratorV0.sol +145 -47
- package/contracts/helpers/ERC1967ProxyImport.sol +5 -0
- package/contracts/interfaces/v0.8.x/IArtblocksRoyaltyOverride.sol +1 -1
- package/contracts/interfaces/v0.8.x/IClaimMinter.sol +70 -0
- package/contracts/interfaces/v0.8.x/IDependencyRegistryV0.sol +95 -0
- package/contracts/interfaces/v0.8.x/IEngineFactoryV0.sol +15 -0
- package/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Base.sol +21 -2
- package/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3_Engine.sol +72 -0
- package/contracts/interfaces/v0.8.x/IOwnerHistoryTransferHook.sol +119 -0
- package/contracts/interfaces/v0.8.x/ISRHooks.sol +229 -0
- package/contracts/interfaces/v0.8.x/ISeaDropShimForContract.sol +0 -6
- package/contracts/interfaces/v0.8.x/ISharedMinterTieredAllowV0.sol +69 -0
- package/contracts/interfaces/v0.8.x/ITransferHook.sol +48 -0
- package/contracts/libs/v0.8.x/DependencyRegistryStorageLib.sol +12 -0
- package/contracts/libs/v0.8.x/ENSLib.sol +85 -0
- package/contracts/libs/v0.8.x/EnumerableSetUint16.sol +429 -0
- package/contracts/libs/v0.8.x/FeistelWalkLib.sol +221 -0
- package/contracts/libs/v0.8.x/ImmutableUint16Array.sol +201 -0
- package/contracts/libs/v0.8.x/V3EngineLib.sol +490 -0
- package/contracts/libs/v0.8.x/V3TransferHookLib.sol +251 -0
- package/contracts/libs/v0.8.x/minter-libs/OnChainAllowlistLib.sol +165 -0
- package/contracts/minter-suite/Minters/MinterSetPriceOnChainAllowV0.sol +632 -0
- package/contracts/minter-suite/Minters/MinterSetPriceTieredAllowV1.sol +871 -0
- package/contracts/minter-suite/Minters/MinterSlidingScaleV0.sol +493 -0
- package/contracts/minter-suite/Minters/one-off/ClaimMinter.sol +595 -0
- package/contracts/minter-suite/Minters/one-off/MinterSetPriceTieredOnChainAllowV0.sol +894 -0
- package/contracts/minter-suite/Minters/one-off/SeaDropXArtBlocksShim.sol +59 -41
- package/contracts/mock/ENSLibMock.sol +25 -0
- package/contracts/mock/EnumerableSetUint16Mock.sol +88 -0
- package/contracts/mock/FeistelWalkLibMock.sol +81 -0
- package/contracts/mock/ImmutableUint16ArrayMock.sol +62 -0
- package/contracts/mock/MockGenArt721V3Core.sol +416 -0
- package/contracts/mock/MockPMP.sol +287 -0
- package/contracts/mock/MockTransferHook.sol +160 -0
- package/contracts/mock/MockTransferHookTestHelpers.sol +96 -0
- package/contracts/mock/ReentrancyBatchMockShared.sol +53 -0
- package/contracts/mock/RelayExecutorTestHelper.sol +44 -0
- package/contracts/relay/RelayExecutor.sol +61 -0
- package/contracts/relay/RelayExecutorPartialReverts.sol +79 -0
- package/contracts/royalty-registry/GenArt721RoyaltyOverrideSplits.sol +130 -0
- package/contracts/utils/MintMulticallUtil.sol +103 -0
- package/contracts/web3call/PMPV1.sol +1204 -0
- package/contracts/web3call/augment-hooks/AbstractPMPAugmentHook.sol +1 -1
- package/contracts/web3call/augment-hooks/InjectBaseGasFee.sol +1 -1
- package/contracts/web3call/augment-hooks/InjectBlockHeight.sol +57 -0
- package/contracts/web3call/augment-hooks/InjectBlockHeightAndArtistProjectOverrides.sol +310 -0
- package/contracts/web3call/augment-hooks/InjectBlockHeightAndNumOwnedProjectTokens.sol +141 -0
- package/contracts/web3call/augment-hooks/InjectBlockHeightProjectInvocationsAndArtistProjectOverrides.sol +326 -0
- package/contracts/web3call/augment-hooks/InjectBlockTimestamp.sol +57 -0
- package/contracts/web3call/augment-hooks/InjectBytesPerToken.sol +279 -0
- package/contracts/web3call/augment-hooks/InjectIsProjectFullyMinted.sol +1 -1
- package/contracts/web3call/augment-hooks/InjectTokenHashSeed.sol +1 -1
- package/contracts/web3call/augment-hooks/InjectTokenOwner.sol +1 -1
- package/contracts/web3call/augment-hooks/InjectTokenOwnerEthBalance.sol +1 -1
- package/contracts/web3call/augment-hooks/SRHooks.sol +1722 -0
- package/contracts/web3call/combined-hooks/LiftHooks.sol +304 -0
- package/contracts/web3call/configure-hooks/{abstractPMPConfigureHook.sol → AbstractPMPConfigureHook.sol} +1 -1
- package/contracts/web3call/configure-hooks/PMPConfigureLockHook.sol +107 -0
- package/package.json +39 -24
|
@@ -0,0 +1,490 @@
|
|
|
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_Base} from "../../interfaces/v0.8.x/IGenArt721CoreContractV3_Base.sol";
|
|
7
|
+
import {IGenArt721CoreContractV3_ProjectFinance} from "../../interfaces/v0.8.x/IGenArt721CoreContractV3_ProjectFinance.sol";
|
|
8
|
+
import {ISplitProviderV0} from "../../interfaces/v0.8.x/ISplitProviderV0.sol";
|
|
9
|
+
|
|
10
|
+
import {Strings} from "@openzeppelin-5.0/contracts/utils/Strings.sol";
|
|
11
|
+
import {Bytes32Strings} from "./Bytes32Strings.sol";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @title Shared helper library for V3 Engine and Engine Flex cores.
|
|
15
|
+
* @author Art Blocks Inc.
|
|
16
|
+
* @notice External library (DELEGATECALL) used by both `GenArt721CoreV3_Engine`
|
|
17
|
+
* and `GenArt721CoreV3_Engine_Flex`. Offloading this logic keeps both cores
|
|
18
|
+
* under the 24KB bytecode size limit while guaranteeing there is exactly one
|
|
19
|
+
* implementation of it, rather than one copy per core.
|
|
20
|
+
* @dev Hosts project-finance logic (ERC-2981 royalty info, primary revenue
|
|
21
|
+
* splits, royalty splitter assignment, artist payment proposals), input
|
|
22
|
+
* validation shared by both cores, and default base URI construction.
|
|
23
|
+
* @dev Events are emitted under the calling core's address because all
|
|
24
|
+
* functions here are reached via DELEGATECALL. Event ordering within each
|
|
25
|
+
* function intentionally matches the ordering of the pre-offload core
|
|
26
|
+
* implementations, so off-chain indexing is unaffected by the refactor.
|
|
27
|
+
*/
|
|
28
|
+
library V3EngineLib {
|
|
29
|
+
using Strings for address;
|
|
30
|
+
using Bytes32Strings for bytes32;
|
|
31
|
+
|
|
32
|
+
/// @dev max percentage value for artist/additional payee splits
|
|
33
|
+
uint256 private constant ONE_HUNDRED = 100;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @notice Payee fields for an artist split proposal or admin acceptance.
|
|
37
|
+
* @dev Grouped into a struct to avoid stack-too-deep in the cores.
|
|
38
|
+
*/
|
|
39
|
+
struct ArtistSplitProposal {
|
|
40
|
+
uint256 projectId;
|
|
41
|
+
address payable artistAddress;
|
|
42
|
+
address payable additionalPayeePrimarySales;
|
|
43
|
+
uint256 additionalPayeePrimarySalesPercentage;
|
|
44
|
+
address payable additionalPayeeSecondarySales;
|
|
45
|
+
uint256 additionalPayeeSecondarySalesPercentage;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @notice ERC-2981 royalty info for a project's finance struct.
|
|
50
|
+
* @param projectFinance Project finance storage for the queried project.
|
|
51
|
+
* @param salePrice Sale price to calculate the royalty amount from.
|
|
52
|
+
* @return receiver Address that should be sent the royalty payment.
|
|
53
|
+
* @return royaltyAmount Royalty payment amount for `salePrice`.
|
|
54
|
+
*/
|
|
55
|
+
function royaltyInfo(
|
|
56
|
+
IGenArt721CoreContractV3_ProjectFinance.ProjectFinance
|
|
57
|
+
storage projectFinance,
|
|
58
|
+
uint256 salePrice
|
|
59
|
+
) external view returns (address receiver, uint256 royaltyAmount) {
|
|
60
|
+
// @dev royalty splitter created upon project creation, so will always
|
|
61
|
+
// exist for a valid token ID
|
|
62
|
+
receiver = projectFinance.royaltySplitter;
|
|
63
|
+
// @dev important to cast to uint256 before multiplying to avoid overflow
|
|
64
|
+
uint256 totalRoyaltyBPS = (100 *
|
|
65
|
+
uint256(projectFinance.secondaryMarketRoyaltyPercentage)) +
|
|
66
|
+
projectFinance.platformProviderSecondarySalesBPS +
|
|
67
|
+
projectFinance.renderProviderSecondarySalesBPS;
|
|
68
|
+
// @dev totalRoyaltyBPS guaranteed to be <= 10,000
|
|
69
|
+
if (totalRoyaltyBPS > 10_000) {
|
|
70
|
+
revert IGenArt721CoreContractV3_Base.GenArt721Error(
|
|
71
|
+
IGenArt721CoreContractV3_Base.ErrorCodes.OverMaxSumOfBPS
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
// @dev overflow automatically checked in solidity 0.8
|
|
75
|
+
// @dev totalRoyaltyBPS guaranteed to be <= 10_000, so overflow only
|
|
76
|
+
// possible with unreasonably high salePrice values near uint256 max
|
|
77
|
+
royaltyAmount = (salePrice * totalRoyaltyBPS) / 10_000;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* @notice Primary revenue split view.
|
|
82
|
+
* @dev Three-way split between the render provider, the platform provider,
|
|
83
|
+
* and the artist. Safe to perform given that in the case of loss of
|
|
84
|
+
* precision Solidity will round down.
|
|
85
|
+
*/
|
|
86
|
+
function getPrimaryRevenueSplits(
|
|
87
|
+
IGenArt721CoreContractV3_ProjectFinance.ProjectFinance
|
|
88
|
+
storage projectFinance,
|
|
89
|
+
uint256 price,
|
|
90
|
+
uint256 renderProviderPrimarySalesPercentage,
|
|
91
|
+
uint256 platformProviderPrimarySalesPercentage,
|
|
92
|
+
address payable renderProviderPrimarySalesAddress,
|
|
93
|
+
address payable platformProviderPrimarySalesAddress
|
|
94
|
+
)
|
|
95
|
+
external
|
|
96
|
+
view
|
|
97
|
+
returns (
|
|
98
|
+
uint256 renderProviderRevenue_,
|
|
99
|
+
address payable renderProviderAddress_,
|
|
100
|
+
uint256 platformProviderRevenue_,
|
|
101
|
+
address payable platformProviderAddress_,
|
|
102
|
+
uint256 artistRevenue_,
|
|
103
|
+
address payable artistAddress_,
|
|
104
|
+
uint256 additionalPayeePrimaryRevenue_,
|
|
105
|
+
address payable additionalPayeePrimaryAddress_
|
|
106
|
+
)
|
|
107
|
+
{
|
|
108
|
+
uint256 projectFunds = price;
|
|
109
|
+
renderProviderRevenue_ =
|
|
110
|
+
(price * renderProviderPrimarySalesPercentage) /
|
|
111
|
+
ONE_HUNDRED;
|
|
112
|
+
// renderProviderRevenue_ percentage is always <=100, so guaranteed to never underflow
|
|
113
|
+
projectFunds -= renderProviderRevenue_;
|
|
114
|
+
platformProviderRevenue_ =
|
|
115
|
+
(price * platformProviderPrimarySalesPercentage) /
|
|
116
|
+
ONE_HUNDRED;
|
|
117
|
+
// platformProviderRevenue_ percentage is always <=100, so guaranteed to never underflow
|
|
118
|
+
projectFunds -= platformProviderRevenue_;
|
|
119
|
+
additionalPayeePrimaryRevenue_ =
|
|
120
|
+
(projectFunds *
|
|
121
|
+
projectFinance.additionalPayeePrimarySalesPercentage) /
|
|
122
|
+
ONE_HUNDRED;
|
|
123
|
+
// additionalPayeePrimarySalesPercentage is always <=100, so guaranteed
|
|
124
|
+
// to never underflow
|
|
125
|
+
artistRevenue_ = projectFunds - additionalPayeePrimaryRevenue_;
|
|
126
|
+
// set addresses from storage
|
|
127
|
+
renderProviderAddress_ = renderProviderPrimarySalesAddress;
|
|
128
|
+
platformProviderAddress_ = platformProviderPrimarySalesAddress;
|
|
129
|
+
if (artistRevenue_ > 0) {
|
|
130
|
+
artistAddress_ = projectFinance.artistAddress;
|
|
131
|
+
}
|
|
132
|
+
if (additionalPayeePrimaryRevenue_ > 0) {
|
|
133
|
+
additionalPayeePrimaryAddress_ = projectFinance
|
|
134
|
+
.additionalPayeePrimarySales;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* @notice Assign a project's royalty splitter.
|
|
140
|
+
* @dev Loads values from `projectFinance`, so storage must be updated
|
|
141
|
+
* before calling. Includes a trusted splitter-provider interaction that is
|
|
142
|
+
* entrusted not to reenter the core.
|
|
143
|
+
*/
|
|
144
|
+
function assignSplitter(
|
|
145
|
+
IGenArt721CoreContractV3_ProjectFinance.ProjectFinance
|
|
146
|
+
storage projectFinance,
|
|
147
|
+
ISplitProviderV0 splitProvider,
|
|
148
|
+
uint256 projectId
|
|
149
|
+
) external {
|
|
150
|
+
_assignSplitter({
|
|
151
|
+
projectFinance: projectFinance,
|
|
152
|
+
splitProvider: splitProvider,
|
|
153
|
+
projectId: projectId
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* @notice Artist proposal of updated payment addresses and splits.
|
|
159
|
+
* Automatically accepts the proposal if no payee addresses are being
|
|
160
|
+
* modified, if the proposal only removes payee addresses, or if
|
|
161
|
+
* `autoApprove` is true.
|
|
162
|
+
* @dev Emits, in order, `ProposedArtistAddressesAndSplits` and — only on
|
|
163
|
+
* automatic acceptance — `ProjectRoyaltySplitterUpdated` followed by
|
|
164
|
+
* `AcceptedArtistAddressesAndSplits`. This ordering matches the
|
|
165
|
+
* pre-offload core implementation and must be preserved.
|
|
166
|
+
* @param proposal Proposed payee addresses and percentages.
|
|
167
|
+
* @param projectFinance Project finance storage for the project.
|
|
168
|
+
* @param proposedHashes Core's `proposedArtistAddressesAndSplitsHash`.
|
|
169
|
+
* @param autoApprove Core's `autoApproveArtistSplitProposals`.
|
|
170
|
+
* @param splitProvider Core's split provider, used on automatic accept.
|
|
171
|
+
*/
|
|
172
|
+
function proposeArtistPaymentAddressesAndSplits(
|
|
173
|
+
ArtistSplitProposal memory proposal,
|
|
174
|
+
IGenArt721CoreContractV3_ProjectFinance.ProjectFinance
|
|
175
|
+
storage projectFinance,
|
|
176
|
+
mapping(uint256 => bytes32) storage proposedHashes,
|
|
177
|
+
bool autoApprove,
|
|
178
|
+
ISplitProviderV0 splitProvider
|
|
179
|
+
) external {
|
|
180
|
+
// checks
|
|
181
|
+
if (
|
|
182
|
+
proposal.additionalPayeePrimarySalesPercentage > ONE_HUNDRED ||
|
|
183
|
+
proposal.additionalPayeeSecondarySalesPercentage > ONE_HUNDRED
|
|
184
|
+
) {
|
|
185
|
+
revert IGenArt721CoreContractV3_Base.GenArt721Error(
|
|
186
|
+
IGenArt721CoreContractV3_Base.ErrorCodes.MaxOf100Percent
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
if (
|
|
190
|
+
proposal.additionalPayeePrimarySalesPercentage > 0 &&
|
|
191
|
+
proposal.additionalPayeePrimarySales == address(0)
|
|
192
|
+
) {
|
|
193
|
+
revert IGenArt721CoreContractV3_Base.GenArt721Error(
|
|
194
|
+
IGenArt721CoreContractV3_Base
|
|
195
|
+
.ErrorCodes
|
|
196
|
+
.PrimaryPayeeIsZeroAddress
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
if (
|
|
200
|
+
proposal.additionalPayeeSecondarySalesPercentage > 0 &&
|
|
201
|
+
proposal.additionalPayeeSecondarySales == address(0)
|
|
202
|
+
) {
|
|
203
|
+
revert IGenArt721CoreContractV3_Base.GenArt721Error(
|
|
204
|
+
IGenArt721CoreContractV3_Base
|
|
205
|
+
.ErrorCodes
|
|
206
|
+
.SecondaryPayeeIsZeroAddress
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
// effects
|
|
210
|
+
// emit event for off-chain indexing
|
|
211
|
+
// note: always emit a proposal event, even in the pathway of
|
|
212
|
+
// automatic approval, to simplify indexing expectations
|
|
213
|
+
emit IGenArt721CoreContractV3_Base.ProposedArtistAddressesAndSplits(
|
|
214
|
+
proposal.projectId,
|
|
215
|
+
proposal.artistAddress,
|
|
216
|
+
proposal.additionalPayeePrimarySales,
|
|
217
|
+
proposal.additionalPayeePrimarySalesPercentage,
|
|
218
|
+
proposal.additionalPayeeSecondarySales,
|
|
219
|
+
proposal.additionalPayeeSecondarySalesPercentage
|
|
220
|
+
);
|
|
221
|
+
// automatically accept if no proposed addresses modifications, or if
|
|
222
|
+
// the proposal only removes payee addresses, or if contract is set to
|
|
223
|
+
// always auto-approve.
|
|
224
|
+
// store proposal hash on-chain, only if not automatic accept
|
|
225
|
+
bool automaticAccept = autoApprove;
|
|
226
|
+
if (!automaticAccept) {
|
|
227
|
+
// block scope to avoid stack too deep error
|
|
228
|
+
bool artistUnchanged = proposal.artistAddress ==
|
|
229
|
+
projectFinance.artistAddress;
|
|
230
|
+
bool additionalPrimaryUnchangedOrRemoved = (proposal
|
|
231
|
+
.additionalPayeePrimarySales ==
|
|
232
|
+
projectFinance.additionalPayeePrimarySales) ||
|
|
233
|
+
(proposal.additionalPayeePrimarySales == address(0));
|
|
234
|
+
bool additionalSecondaryUnchangedOrRemoved = (proposal
|
|
235
|
+
.additionalPayeeSecondarySales ==
|
|
236
|
+
projectFinance.additionalPayeeSecondarySales) ||
|
|
237
|
+
(proposal.additionalPayeeSecondarySales == address(0));
|
|
238
|
+
automaticAccept =
|
|
239
|
+
artistUnchanged &&
|
|
240
|
+
additionalPrimaryUnchangedOrRemoved &&
|
|
241
|
+
additionalSecondaryUnchangedOrRemoved;
|
|
242
|
+
}
|
|
243
|
+
if (automaticAccept) {
|
|
244
|
+
// clear any previously proposed values
|
|
245
|
+
proposedHashes[proposal.projectId] = bytes32(0);
|
|
246
|
+
|
|
247
|
+
// update storage
|
|
248
|
+
// artist address can change during automatic accept if
|
|
249
|
+
// autoApproveArtistSplitProposals is true
|
|
250
|
+
_updateProjectFinancePayees({
|
|
251
|
+
projectFinance: projectFinance,
|
|
252
|
+
proposal: proposal
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
// assign project's splitter
|
|
256
|
+
// @dev only call after all previous storage updates
|
|
257
|
+
_assignSplitter({
|
|
258
|
+
projectFinance: projectFinance,
|
|
259
|
+
splitProvider: splitProvider,
|
|
260
|
+
projectId: proposal.projectId
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
// emit event for off-chain indexing
|
|
264
|
+
emit IGenArt721CoreContractV3_Base.AcceptedArtistAddressesAndSplits(
|
|
265
|
+
proposal.projectId
|
|
266
|
+
);
|
|
267
|
+
} else {
|
|
268
|
+
proposedHashes[proposal.projectId] = _hashProposal(proposal);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* @notice Admin acceptance of a proposed set of payment addresses and
|
|
274
|
+
* splits. Reverts unless `proposal` matches the stored proposal hash.
|
|
275
|
+
* @dev Emits, in order, `ProjectRoyaltySplitterUpdated` followed by
|
|
276
|
+
* `AcceptedArtistAddressesAndSplits`. This ordering matches the
|
|
277
|
+
* pre-offload core implementation and must be preserved.
|
|
278
|
+
* @param proposal Payee addresses and percentages being accepted.
|
|
279
|
+
* @param projectFinance Project finance storage for the project.
|
|
280
|
+
* @param proposedHashes Core's `proposedArtistAddressesAndSplitsHash`.
|
|
281
|
+
* @param splitProvider Core's split provider.
|
|
282
|
+
*/
|
|
283
|
+
function adminAcceptArtistAddressesAndSplits(
|
|
284
|
+
ArtistSplitProposal memory proposal,
|
|
285
|
+
IGenArt721CoreContractV3_ProjectFinance.ProjectFinance
|
|
286
|
+
storage projectFinance,
|
|
287
|
+
mapping(uint256 => bytes32) storage proposedHashes,
|
|
288
|
+
ISplitProviderV0 splitProvider
|
|
289
|
+
) external {
|
|
290
|
+
// checks
|
|
291
|
+
if (proposedHashes[proposal.projectId] != _hashProposal(proposal)) {
|
|
292
|
+
revert IGenArt721CoreContractV3_Base.GenArt721Error(
|
|
293
|
+
IGenArt721CoreContractV3_Base.ErrorCodes.MustMatchArtistProposal
|
|
294
|
+
);
|
|
295
|
+
}
|
|
296
|
+
// effects
|
|
297
|
+
_updateProjectFinancePayees({
|
|
298
|
+
projectFinance: projectFinance,
|
|
299
|
+
proposal: proposal
|
|
300
|
+
});
|
|
301
|
+
// clear proposed values
|
|
302
|
+
proposedHashes[proposal.projectId] = bytes32(0);
|
|
303
|
+
|
|
304
|
+
// assign project's splitter
|
|
305
|
+
// @dev only call after all previous storage updates
|
|
306
|
+
_assignSplitter({
|
|
307
|
+
projectFinance: projectFinance,
|
|
308
|
+
splitProvider: splitProvider,
|
|
309
|
+
projectId: proposal.projectId
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
// emit event for off-chain indexing
|
|
313
|
+
emit IGenArt721CoreContractV3_Base.AcceptedArtistAddressesAndSplits(
|
|
314
|
+
proposal.projectId
|
|
315
|
+
);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* @notice Detailed input validation for a project's aspect ratio string.
|
|
320
|
+
* Reverts unless `aspectRatio` is at most 11 characters, contains at least
|
|
321
|
+
* one digit, and contains no characters other than digits and at most one
|
|
322
|
+
* decimal separator.
|
|
323
|
+
*/
|
|
324
|
+
function validateAspectRatio(string memory aspectRatio) external pure {
|
|
325
|
+
bytes memory aspectRatioBytes = bytes(aspectRatio);
|
|
326
|
+
uint256 bytesLength = aspectRatioBytes.length;
|
|
327
|
+
if (bytesLength > 11) {
|
|
328
|
+
revert IGenArt721CoreContractV3_Base.GenArt721Error(
|
|
329
|
+
IGenArt721CoreContractV3_Base.ErrorCodes.AspectRatioTooLong
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
bool hasSeenDecimalSeparator = false;
|
|
333
|
+
bool hasSeenNumber = false;
|
|
334
|
+
for (uint256 i; i < bytesLength; i++) {
|
|
335
|
+
bytes1 character = aspectRatioBytes[i];
|
|
336
|
+
// Allow as many #s as desired.
|
|
337
|
+
if (character >= 0x30 && character <= 0x39) {
|
|
338
|
+
// 9-0
|
|
339
|
+
// We need to ensure there is at least 1 `9-0` occurrence.
|
|
340
|
+
hasSeenNumber = true;
|
|
341
|
+
continue;
|
|
342
|
+
}
|
|
343
|
+
if (character == 0x2E) {
|
|
344
|
+
// .
|
|
345
|
+
// Allow no more than 1 `.` occurrence.
|
|
346
|
+
if (!hasSeenDecimalSeparator) {
|
|
347
|
+
hasSeenDecimalSeparator = true;
|
|
348
|
+
continue;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
revert IGenArt721CoreContractV3_Base.GenArt721Error(
|
|
352
|
+
IGenArt721CoreContractV3_Base
|
|
353
|
+
.ErrorCodes
|
|
354
|
+
.AspectRatioImproperFormat
|
|
355
|
+
);
|
|
356
|
+
}
|
|
357
|
+
if (!hasSeenNumber) {
|
|
358
|
+
revert IGenArt721CoreContractV3_Base.GenArt721Error(
|
|
359
|
+
IGenArt721CoreContractV3_Base.ErrorCodes.AspectRatioNoNumbers
|
|
360
|
+
);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* @notice Script type/version format check. Reverts unless
|
|
366
|
+
* `scriptTypeAndVersion` contains exactly one at-sign (0x40) character.
|
|
367
|
+
*/
|
|
368
|
+
function validateScriptTypeAndVersion(
|
|
369
|
+
bytes32 scriptTypeAndVersion
|
|
370
|
+
) external pure {
|
|
371
|
+
if (
|
|
372
|
+
!scriptTypeAndVersion.containsExactCharacterQty({
|
|
373
|
+
utf8CharCode: uint8(bytes1("@")), // 0x40
|
|
374
|
+
targetQty: uint8(1)
|
|
375
|
+
})
|
|
376
|
+
) {
|
|
377
|
+
revert IGenArt721CoreContractV3_Base.GenArt721Error(
|
|
378
|
+
IGenArt721CoreContractV3_Base
|
|
379
|
+
.ErrorCodes
|
|
380
|
+
.ScriptTypeAndVersionFormat
|
|
381
|
+
);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* @notice Build a core's initial default base URI, of the form
|
|
387
|
+
* `{host}{coreContract}/`.
|
|
388
|
+
* @dev Offloaded from the cores because `Strings.toHexString` is otherwise
|
|
389
|
+
* only reachable from contract initialization, and is a meaningful share
|
|
390
|
+
* of the size-constrained Engine Flex core's bytecode.
|
|
391
|
+
* @param host Base URI prefix, e.g. "https://token.artblocks.io/".
|
|
392
|
+
* @param coreContract Core contract address to embed in the URI.
|
|
393
|
+
*/
|
|
394
|
+
function buildDefaultBaseURI(
|
|
395
|
+
string memory host,
|
|
396
|
+
address coreContract
|
|
397
|
+
) external pure returns (string memory) {
|
|
398
|
+
return string.concat(host, coreContract.toHexString(), "/");
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* @notice Write a proposal's payee addresses and percentages to a
|
|
403
|
+
* project's finance storage.
|
|
404
|
+
* @dev Percentages are validated to be <= 100 by the calling function, or
|
|
405
|
+
* by the proposal hash matching a previously validated proposal, so the
|
|
406
|
+
* uint8 casts below cannot truncate.
|
|
407
|
+
*/
|
|
408
|
+
function _updateProjectFinancePayees(
|
|
409
|
+
IGenArt721CoreContractV3_ProjectFinance.ProjectFinance
|
|
410
|
+
storage projectFinance,
|
|
411
|
+
ArtistSplitProposal memory proposal
|
|
412
|
+
) private {
|
|
413
|
+
projectFinance.artistAddress = proposal.artistAddress;
|
|
414
|
+
projectFinance.additionalPayeePrimarySales = proposal
|
|
415
|
+
.additionalPayeePrimarySales;
|
|
416
|
+
// safe to cast as uint8 as max is 100%, max uint8 is 255
|
|
417
|
+
projectFinance.additionalPayeePrimarySalesPercentage = uint8(
|
|
418
|
+
proposal.additionalPayeePrimarySalesPercentage
|
|
419
|
+
);
|
|
420
|
+
projectFinance.additionalPayeeSecondarySales = proposal
|
|
421
|
+
.additionalPayeeSecondarySales;
|
|
422
|
+
// safe to cast as uint8 as max is 100%, max uint8 is 255
|
|
423
|
+
projectFinance.additionalPayeeSecondarySalesPercentage = uint8(
|
|
424
|
+
proposal.additionalPayeeSecondarySalesPercentage
|
|
425
|
+
);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* @notice Hash of a proposal's payee fields, as stored in the core's
|
|
430
|
+
* `proposedArtistAddressesAndSplitsHash` mapping.
|
|
431
|
+
* @dev Encoding must exactly match the pre-offload core implementation, so
|
|
432
|
+
* that proposals made against prior core versions hash identically.
|
|
433
|
+
* `projectId` is intentionally excluded, matching prior behavior.
|
|
434
|
+
*/
|
|
435
|
+
function _hashProposal(
|
|
436
|
+
ArtistSplitProposal memory proposal
|
|
437
|
+
) private pure returns (bytes32) {
|
|
438
|
+
return
|
|
439
|
+
keccak256(
|
|
440
|
+
abi.encode(
|
|
441
|
+
proposal.artistAddress,
|
|
442
|
+
proposal.additionalPayeePrimarySales,
|
|
443
|
+
proposal.additionalPayeePrimarySalesPercentage,
|
|
444
|
+
proposal.additionalPayeeSecondarySales,
|
|
445
|
+
proposal.additionalPayeeSecondarySalesPercentage
|
|
446
|
+
)
|
|
447
|
+
);
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/**
|
|
451
|
+
* @notice Assign a project's royalty splitter and emit
|
|
452
|
+
* `ProjectRoyaltySplitterUpdated`.
|
|
453
|
+
* @dev Private so that this library's external entry points share a single
|
|
454
|
+
* copy, rather than the logic being inlined into each calling core.
|
|
455
|
+
*/
|
|
456
|
+
function _assignSplitter(
|
|
457
|
+
IGenArt721CoreContractV3_ProjectFinance.ProjectFinance
|
|
458
|
+
storage projectFinance,
|
|
459
|
+
ISplitProviderV0 splitProvider,
|
|
460
|
+
uint256 projectId
|
|
461
|
+
) private {
|
|
462
|
+
// assign project's royalty splitter
|
|
463
|
+
// @dev loads values from storage, so need to ensure storage has been updated
|
|
464
|
+
address royaltySplitter = splitProvider.getOrCreateSplitter(
|
|
465
|
+
ISplitProviderV0.SplitInputs({
|
|
466
|
+
platformProviderSecondarySalesAddress: projectFinance
|
|
467
|
+
.platformProviderSecondarySalesAddress,
|
|
468
|
+
platformProviderSecondarySalesBPS: projectFinance
|
|
469
|
+
.platformProviderSecondarySalesBPS,
|
|
470
|
+
renderProviderSecondarySalesAddress: projectFinance
|
|
471
|
+
.renderProviderSecondarySalesAddress,
|
|
472
|
+
renderProviderSecondarySalesBPS: projectFinance
|
|
473
|
+
.renderProviderSecondarySalesBPS,
|
|
474
|
+
artistTotalRoyaltyPercentage: projectFinance
|
|
475
|
+
.secondaryMarketRoyaltyPercentage,
|
|
476
|
+
artist: projectFinance.artistAddress,
|
|
477
|
+
additionalPayee: projectFinance.additionalPayeeSecondarySales,
|
|
478
|
+
additionalPayeePercentage: projectFinance
|
|
479
|
+
.additionalPayeeSecondarySalesPercentage
|
|
480
|
+
})
|
|
481
|
+
);
|
|
482
|
+
|
|
483
|
+
projectFinance.royaltySplitter = royaltySplitter;
|
|
484
|
+
|
|
485
|
+
emit IGenArt721CoreContractV3_Base.ProjectRoyaltySplitterUpdated({
|
|
486
|
+
projectId: projectId,
|
|
487
|
+
royaltySplitter: royaltySplitter
|
|
488
|
+
});
|
|
489
|
+
}
|
|
490
|
+
}
|