@artblocks/contracts 1.0.3 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -25
- package/artifacts/contracts/AdminACLV0.sol/AdminACLV0.json +2 -2
- package/artifacts/contracts/AdminACLV1.sol/AdminACLV1.json +2 -2
- package/artifacts/contracts/DependencyRegistryV0.sol/DependencyRegistryV0.json +212 -17
- package/artifacts/contracts/GenArt721CoreV3.sol/GenArt721CoreV3.json +6 -6
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV0.sol/MinterDAExpV0.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV1.sol/MinterDAExpV1.json +2 -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/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/MinterDALin/MinterDALinV0.sol/MinterDALinV0.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV1.sol/MinterDALinV1.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/MinterHolder/MinterHolderV0.sol/MinterHolderV0.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/MinterMerkle/MinterMerkleV0.sol/MinterMerkleV0.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/MinterSetPrice/MinterSetPriceV0.sol/MinterSetPriceV0.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV1.sol/MinterSetPriceV1.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/MinterSetPriceERC20/MinterSetPriceERC20V0.sol/MinterSetPriceERC20V0.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V1.sol/MinterSetPriceERC20V1.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/engine/V2/GenArt721CoreV2_ENGINE_FLEX.sol/GenArt721CoreV2_ENGINE_FLEX.json +2 -2
- package/artifacts/contracts/engine/V2/GenArt721CoreV2_PBAB.sol/GenArt721CoreV2_PBAB.json +2 -2
- package/artifacts/contracts/engine/V2/GenArt721CoreV2_PRTNR.sol/GenArt721CoreV2_PRTNR.json +2 -2
- package/artifacts/contracts/engine/V2/GenArt721MinterBurner_PBAB.sol/GenArt721MinterBurner_PBAB.json +2 -2
- package/artifacts/contracts/engine/V2/GenArt721MinterDAExp_PBAB.sol/GenArt721MinterDAExp_PBAB.json +2 -2
- package/artifacts/contracts/engine/V2/GenArt721Minter_PBAB.sol/GenArt721Minter_PBAB.json +2 -2
- package/artifacts/contracts/engine/V3/GenArt721CoreV3_Engine.sol/GenArt721CoreV3_Engine.json +6 -11
- package/artifacts/contracts/engine/V3/GenArt721CoreV3_Engine_Flex.sol/GenArt721CoreV3_Engine_Flex.json +6 -11
- package/artifacts/contracts/engine/V3/forks/GenArt721CoreV3_Engine_Flex_PROOF.sol/GenArt721CoreV3_Engine_Flex_PROOF.json +6 -11
- 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 +6 -11
- package/artifacts/contracts/engine-registry/CoreRegistryV1.sol/CoreRegistryV1.json +12 -12
- package/artifacts/contracts/engine-registry/EngineRegistryV0.sol/EngineRegistryV0.json +2 -2
- package/artifacts/contracts/explorations/GenArt721CoreV3_Explorations.sol/GenArt721CoreV3_Explorations.json +6 -6
- package/artifacts/contracts/interfaces/{0.5.x → v0.5.x}/IBonusContract.sol/IBonusContract.json +1 -1
- package/artifacts/contracts/interfaces/{0.5.x → v0.5.x}/IGenArt721CoreContractV1.sol/IGenArt721CoreContractV1.json +1 -1
- package/artifacts/contracts/interfaces/{0.5.x → v0.5.x}/IGenArt721CoreV2_PBAB.sol/IGenArt721CoreV2_PBAB.json +1 -1
- package/artifacts/contracts/interfaces/{0.5.x → v0.5.x}/IRandomizer.sol/IRandomizer.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IAdminACLV0.sol/IAdminACLV0.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IArtblocksRoyaltyOverride.sol/IArtblocksRoyaltyOverride.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IBonusContract.sol/IBonusContract.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IBytecodeStorageReader.sol/IBytecodeStorageReader.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/ICoreRegistryV1.sol/ICoreRegistryV1.json +7 -7
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IDelegationRegistry.sol/IDelegationRegistry.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IDependencyRegistryCompatibleV0.sol/IDependencyRegistryCompatibleV0.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IDependencyRegistryV0.sol/IDependencyRegistryV0.json +22 -3
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IEngineRegistryV0.sol/IEngineRegistryV0.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDAExpSettlementV0.sol/IFilteredMinterDAExpSettlementV0.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDAExpSettlementV1.sol/IFilteredMinterDAExpSettlementV1.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDAExpSettlement_Mixin.sol/IFilteredMinterDAExpSettlement_Mixin.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDAExpV0.sol/IFilteredMinterDAExpV0.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDAExpV1.sol/IFilteredMinterDAExpV1.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDALinV0.sol/IFilteredMinterDALinV0.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDALinV1.sol/IFilteredMinterDALinV1.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterHolderV0.sol/IFilteredMinterHolderV0.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterHolderV1.sol/IFilteredMinterHolderV1.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterHolderV2.sol/IFilteredMinterHolderV2.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterMerkleV0.sol/IFilteredMinterMerkleV0.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterMerkleV1.sol/IFilteredMinterMerkleV1.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterMerkleV2.sol/IFilteredMinterMerkleV2.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterSEAV0.sol/IFilteredMinterSEAV0.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterV0.sol/IFilteredMinterV0.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterV1.sol/IFilteredMinterV1.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterV2.sol/IFilteredMinterV2.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreContractExposesHashSeed.sol/IGenArt721CoreContractExposesHashSeed.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreContractV1.sol/IGenArt721CoreContractV1.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreContractV3.sol/IGenArt721CoreContractV3.json +1 -1
- package/artifacts/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3WithSharedRandomizer.sol/IGenArt721CoreContractV3WithSharedRandomizer.json +24 -0
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreContractV3_Base.sol/IGenArt721CoreContractV3_Base.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreContractV3_Engine.sol/IGenArt721CoreContractV3_Engine.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreContractV3_Engine_Flex.sol/IGenArt721CoreContractV3_Engine_Flex.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreV2_PBAB.sol/IGenArt721CoreV2_PBAB.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IManifold.sol/IManifold.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IMinterBaseV0.sol/IMinterBaseV0.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IMinterFilterV0.sol/IMinterFilterV0.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IMinterFilterV1.sol/IMinterFilterV1.json +104 -19
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IMintingAPICoreV0.sol/IMintingAPICoreV0.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IMintingAPIMinterV0.sol/IMintingAPIMinterV0.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IPseudorandomAtomic.sol/IPseudorandomAtomic.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IRandomizer.sol/IRandomizer.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IRandomizerPolyptychV0.sol/IRandomizerPolyptychV0.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IRandomizerV2.sol/IRandomizerV2.json +1 -1
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IRandomizer_V3CoreBase.sol/IRandomizer_V3CoreBase.json +1 -1
- package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterDAExpSettlementV0.sol/ISharedMinterDAExpSettlementV0.json +114 -0
- package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterDAExpV0.sol/ISharedMinterDAExpV0.json +37 -0
- package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterDALinV0.sol/ISharedMinterDALinV0.json +37 -0
- package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterDAV0.sol/ISharedMinterDAV0.json +50 -0
- package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterHolderERC20V0.sol/ISharedMinterHolderERC20V0.json +158 -0
- package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterHolderV0.sol/ISharedMinterHolderV0.json +128 -0
- package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterMerkleV0.sol/ISharedMinterMerkleV0.json +97 -0
- package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterSEAV0.sol/ISharedMinterSEAV0.json +29 -0
- package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterSimplePurchaseV0.sol/ISharedMinterSimplePurchaseV0.json +64 -0
- package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterV0.sol/ISharedMinterV0.json +117 -0
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/ISharedRandomizerV0.sol/ISharedRandomizerV0.json +52 -36
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/IWETH.sol/IWETH.json +1 -1
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/Address.json +2 -2
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/Counters.json +2 -2
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/CustomERC721Metadata.json +2 -2
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/ERC721.json +2 -2
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/ERC721Enumerable.json +2 -2
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/GenArt721CoreV1.json +2 -2
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/SafeMath.json +2 -2
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/Strings.json +2 -2
- package/artifacts/contracts/legacy/GenArt721LegacyMinter.sol/GenArt721LegacyMinter.json +2 -2
- package/artifacts/contracts/libs/integration-refs/delegation-registry/DelegationRegistry.sol/DelegationRegistry.json +2 -2
- package/artifacts/contracts/libs/{0.5.x → v0.5.x}/CustomERC721Metadata.sol/CustomERC721Metadata.json +3 -3
- package/artifacts/contracts/libs/{0.5.x → v0.5.x}/IERC20.sol/IERC20.json +1 -1
- package/artifacts/contracts/libs/{0.5.x → v0.5.x}/SafeMath.sol/SafeMath.json +3 -3
- package/artifacts/contracts/libs/{0.5.x → v0.5.x}/Strings.sol/Strings.json +3 -3
- package/artifacts/contracts/libs/v0.8.x/ABHelpers.sol/ABHelpers.json +10 -0
- package/artifacts/contracts/libs/v0.8.x/AuthLib.sol/AuthLib.json +10 -0
- package/artifacts/contracts/libs/{0.8.x → v0.8.x}/BytecodeStorageV0.sol/BytecodeStorage.json +3 -3
- package/artifacts/contracts/libs/{0.8.x → v0.8.x}/BytecodeStorageV1.sol/BytecodeStorageReader.json +3 -3
- package/artifacts/contracts/libs/{0.8.x → v0.8.x}/BytecodeStorageV1.sol/BytecodeStorageWriter.json +3 -3
- package/artifacts/contracts/libs/{0.8.x → v0.8.x}/Bytes32Strings.sol/Bytes32Strings.json +3 -3
- package/artifacts/contracts/libs/{0.8.x → v0.8.x}/ERC721_PackedHashSeed.sol/ERC721_PackedHashSeed.json +3 -3
- package/artifacts/contracts/libs/{0.8.x → v0.8.x}/SSTORE2.sol/SSTORE2.json +3 -3
- package/artifacts/contracts/libs/v0.8.x/minter-libs/DAExpLib.sol/DAExpLib.json +67 -0
- package/artifacts/contracts/libs/v0.8.x/minter-libs/DALib.sol/DALib.json +30 -0
- package/artifacts/contracts/libs/v0.8.x/minter-libs/DALinLib.sol/DALinLib.json +67 -0
- package/artifacts/contracts/libs/v0.8.x/minter-libs/GenericMinterEventsLib.sol/GenericMinterEventsLib.json +346 -0
- package/artifacts/contracts/libs/v0.8.x/minter-libs/MaxInvocationsLib.sol/MaxInvocationsLib.json +36 -0
- package/artifacts/contracts/libs/v0.8.x/minter-libs/MerkleLib.sol/MerkleLib.json +37 -0
- package/artifacts/contracts/libs/v0.8.x/minter-libs/PolyptychLib.sol/PolyptychLib.json +10 -0
- package/artifacts/contracts/libs/v0.8.x/minter-libs/SEALib.sol/SEALib.json +261 -0
- package/artifacts/contracts/libs/v0.8.x/minter-libs/SetPriceLib.sol/SetPriceLib.json +55 -0
- package/artifacts/contracts/libs/v0.8.x/minter-libs/SettlementExpLib.sol/SettlementExpLib.json +48 -0
- package/artifacts/contracts/libs/v0.8.x/minter-libs/SplitFundsLib.sol/SplitFundsLib.json +42 -0
- package/artifacts/contracts/libs/v0.8.x/minter-libs/TokenHolderLib.sol/TokenHolderLib.json +86 -0
- package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV0.sol/MinterFilterV0.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 +96 -40
- package/artifacts/contracts/minter-suite/Minters/MinterDAExpHolderV5.sol/MinterDAExpHolderV5.json +662 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDAExpSettlementV2.sol/MinterDAExpSettlementV2.json +2 -20
- package/artifacts/contracts/minter-suite/Minters/MinterDAExpSettlementV3.sol/MinterDAExpSettlementV3.json +619 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDAExpV4.sol/MinterDAExpV4.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterDAExpV5.sol/MinterDAExpV5.json +418 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDALinHolderV5.sol/MinterDALinHolderV5.json +662 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDALinV4.sol/MinterDALinV4.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterDALinV5.sol/MinterDALinV5.json +418 -0
- package/artifacts/contracts/minter-suite/Minters/MinterHolderV4.sol/MinterHolderV4.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterMerkleV5.sol/MinterMerkleV5.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterPolyptychV0.sol/MinterPolyptychV0.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterSEAV0.sol/MinterSEAV0.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterSEAV1.sol/MinterSEAV1.json +659 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20V4.sol/MinterSetPriceERC20V4.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20V5.sol/MinterSetPriceERC20V5.json +452 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceHolderV5.sol/MinterSetPriceHolderV5.json +600 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceMerkleV5.sol/MinterSetPriceMerkleV5.json +633 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPricePolyptychERC20V5.sol/MinterSetPricePolyptychERC20V5.json +782 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPricePolyptychV5.sol/MinterSetPricePolyptychV5.json +676 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceV4.sol/MinterSetPriceV4.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceV5.sol/MinterSetPriceV5.json +356 -0
- package/artifacts/contracts/mock/BytecodeV0TextCR_DMock.sol/BytecodeV0TextCR_DMock.json +2 -2
- package/artifacts/contracts/mock/BytecodeV1LibCallsMock.sol/BytecodeV1LibCallsMock.json +2 -2
- package/artifacts/contracts/mock/BytecodeV1TextCR_DMock.sol/BytecodeV1TextCR_DMock.json +4 -4
- package/artifacts/contracts/mock/DeadReceiverBidderMock.sol/DeadReceiverBidderMock.json +25 -2
- package/artifacts/contracts/mock/DummySharedMinter.sol/DummySharedMinter.json +2 -2
- package/artifacts/contracts/mock/ERC20Mock.sol/ERC20Mock.json +28 -2
- package/artifacts/contracts/mock/GenArt721CoreV3_Engine_IncorrectCoreType.sol/GenArt721CoreV3_Engine_IncorrectCoreType.json +6 -11
- package/artifacts/contracts/mock/MockAdminACLV0.sol/MockAdminACLV0Events.json +2 -2
- package/artifacts/contracts/mock/MockAdminACLV0_PROHIBITION.sol/MockAdminACLV0Events_PROHIBITION.json +2 -2
- package/artifacts/contracts/mock/OriginRegisterMock.sol/OriginRegisterMock.json +2 -2
- package/artifacts/contracts/mock/RandomizerV2_NoAssignMock.sol/RandomizerV2_NoAssignMock.json +2 -2
- package/artifacts/contracts/mock/ReentrancyHolderMock.sol/ReentrancyHolderMock.json +2 -2
- package/artifacts/contracts/mock/ReentrancyHolderMockShared.sol/ReentrancyHolderMockShared.json +136 -0
- package/artifacts/contracts/mock/ReentrancyMerkleMock.sol/ReentrancyMerkleMock.json +2 -2
- package/artifacts/contracts/mock/ReentrancyMerkleMockShared.sol/ReentrancyMerkleMockShared.json +105 -0
- package/artifacts/contracts/mock/ReentrancyMock.sol/ReentrancyMock.json +2 -2
- package/artifacts/contracts/mock/ReentrancyMockShared.sol/ReentrancyMockShared.json +100 -0
- package/artifacts/contracts/mock/ReentrancySEAMock.sol/ReentrancySEAAutoBidderMock.json +2 -2
- package/artifacts/contracts/mock/ReentrancySEAMockShared.sol/ReentrancySEAAutoBidderMockShared.json +69 -0
- package/artifacts/contracts/mock/SSTORE2Mock.sol/SSTORE2Mock.json +2 -2
- package/artifacts/contracts/randomizer/deprecated/BasicRandomizer.sol/BasicRandomizer.json +2 -2
- 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/primitive/PseudorandomAtomicBasic.sol/PseudorandomAtomic.json +2 -2
- package/artifacts/contracts/randomizer/shared/SharedRandomizerV0.sol/SharedRandomizerV0.json +58 -42
- package/artifacts/contracts/royalty-registry/GenArt721RoyaltyOverride.sol/GenArt721RoyaltyOverride.json +2 -2
- package/artifacts/contracts/royalty-registry/GenArt721RoyaltyOverride_PBAB.sol/GenArt721RoyaltyOverride_PBAB.json +2 -2
- package/contracts/AdminACLV0.sol +1 -1
- package/contracts/AdminACLV1.sol +1 -1
- package/contracts/DependencyRegistryV0.sol +300 -123
- package/contracts/GenArt721CoreV3.sol +27 -12
- package/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV0.sol +3 -3
- package/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV1.sol +3 -3
- package/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV2.sol +3 -3
- package/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV3.sol +3 -3
- package/contracts/archive/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol +3 -3
- package/contracts/archive/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV1.sol +3 -3
- package/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV0.sol +3 -3
- package/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV1.sol +3 -3
- package/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV2.sol +3 -3
- package/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV3.sol +3 -3
- package/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV0.sol +3 -3
- package/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV1.sol +3 -3
- package/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV2.sol +4 -4
- package/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV3.sol +4 -4
- package/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV0.sol +3 -3
- package/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV1.sol +3 -3
- package/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV2.sol +4 -4
- package/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV3.sol +4 -4
- package/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV4.sol +4 -4
- package/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV0.sol +3 -3
- package/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV1.sol +3 -3
- package/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV2.sol +3 -3
- package/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV3.sol +3 -3
- package/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V0.sol +3 -3
- package/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V1.sol +3 -3
- package/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V2.sol +3 -3
- package/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V3.sol +3 -3
- package/contracts/archive/readme.md +16 -0
- package/contracts/engine/README.md +21 -0
- package/contracts/engine/V2/GenArt721CoreV2_ENGINE_FLEX.sol +2 -2
- package/contracts/engine/V2/GenArt721CoreV2_PBAB.sol +2 -2
- package/contracts/engine/V2/GenArt721CoreV2_PRTNR.sol +3 -3
- package/contracts/engine/V2/GenArt721MinterBurner_PBAB.sol +2 -2
- package/contracts/engine/V2/GenArt721MinterDAExp_PBAB.sol +1 -1
- package/contracts/engine/V2/GenArt721Minter_PBAB.sol +2 -2
- package/contracts/engine/V3/GenArt721CoreV3_Engine.sol +31 -22
- package/contracts/engine/V3/GenArt721CoreV3_Engine_Flex.sol +31 -22
- package/contracts/engine/V3/forks/GenArt721CoreV3_Engine_Flex_PROOF.sol +12 -18
- package/contracts/engine/V3/forks/PROHIBITION/AdminACLV0_PROHIBITION.sol +1 -1
- package/contracts/engine/V3/forks/PROHIBITION/GenArt721CoreV3_Engine_Flex_PROHIBITION.sol +23 -24
- package/contracts/engine/V3/forks/PROHIBITION/interfaces/IAdminACLV0_PROHIBITION.sol +1 -1
- package/contracts/engine/V3/forks/PROHIBITION/interfaces/IGenArt721CoreContractV3_Engine_Flex_PROHIBITION.sol +1 -1
- package/contracts/engine-registry/CoreRegistryV1.sol +58 -65
- package/contracts/engine-registry/EngineRegistryV0.sol +1 -1
- package/contracts/explorations/GenArt721CoreV3_Explorations.sol +27 -12
- package/contracts/interfaces/{0.8.x → v0.8.x}/ICoreRegistryV1.sol +6 -8
- package/contracts/interfaces/{0.8.x → v0.8.x}/IDependencyRegistryV0.sol +5 -2
- package/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3WithSharedRandomizer.sol +23 -0
- package/contracts/interfaces/{0.8.x → v0.8.x}/IMinterFilterV1.sol +45 -19
- package/contracts/interfaces/v0.8.x/IRandomizer_V3CoreBase.sol +23 -0
- package/contracts/interfaces/v0.8.x/ISharedMinterDAExpSettlementV0.sol +28 -0
- package/contracts/interfaces/v0.8.x/ISharedMinterDAExpV0.sol +12 -0
- package/contracts/interfaces/v0.8.x/ISharedMinterDALinV0.sol +12 -0
- package/contracts/interfaces/v0.8.x/ISharedMinterDAV0.sol +13 -0
- package/contracts/interfaces/v0.8.x/ISharedMinterHolderERC20V0.sol +47 -0
- package/contracts/interfaces/v0.8.x/ISharedMinterHolderV0.sol +41 -0
- package/contracts/interfaces/v0.8.x/ISharedMinterMerkleV0.sol +34 -0
- package/contracts/interfaces/v0.8.x/ISharedMinterSEAV0.sol +15 -0
- package/contracts/interfaces/v0.8.x/ISharedMinterSimplePurchaseV0.sol +28 -0
- package/contracts/interfaces/v0.8.x/ISharedMinterV0.sol +43 -0
- package/contracts/interfaces/v0.8.x/ISharedRandomizerV0.sol +123 -0
- package/contracts/legacy/GenArt721CoreV1.sol +2 -2
- package/contracts/legacy/GenArt721LegacyMinter.sol +5 -5
- package/contracts/libs/integration-refs/delegation-registry/DelegationRegistry.sol +1 -1
- package/contracts/libs/v0.8.x/ABHelpers.sol +55 -0
- package/contracts/libs/v0.8.x/AuthLib.sol +196 -0
- package/contracts/libs/{0.8.x → v0.8.x}/Bytes32Strings.sol +5 -5
- package/contracts/libs/v0.8.x/minter-libs/DAExpLib.sol +250 -0
- package/contracts/libs/v0.8.x/minter-libs/DALib.sol +26 -0
- package/contracts/libs/v0.8.x/minter-libs/DALinLib.sol +216 -0
- package/contracts/libs/v0.8.x/minter-libs/GenericMinterEventsLib.sol +171 -0
- package/contracts/libs/v0.8.x/minter-libs/MaxInvocationsLib.sol +488 -0
- package/contracts/libs/v0.8.x/minter-libs/MerkleLib.sol +384 -0
- package/contracts/libs/v0.8.x/minter-libs/PolyptychLib.sol +240 -0
- package/contracts/libs/v0.8.x/minter-libs/SEALib.sol +995 -0
- package/contracts/libs/v0.8.x/minter-libs/SetPriceLib.sol +166 -0
- package/contracts/libs/v0.8.x/minter-libs/SettlementExpLib.sol +770 -0
- package/contracts/libs/v0.8.x/minter-libs/SplitFundsLib.sol +741 -0
- package/contracts/libs/v0.8.x/minter-libs/TokenHolderLib.sol +291 -0
- package/contracts/minter-suite/MinterFilter/MinterFilterV0.sol +3 -3
- package/contracts/minter-suite/MinterFilter/MinterFilterV1.sol +5 -5
- package/contracts/minter-suite/MinterFilter/MinterFilterV2.sol +414 -297
- package/contracts/minter-suite/Minters/MinterBase_v0_1_1.sol +4 -4
- package/contracts/minter-suite/Minters/MinterDAExpHolderV5.sol +866 -0
- package/contracts/minter-suite/Minters/MinterDAExpSettlementV2.sol +4 -57
- package/contracts/minter-suite/Minters/MinterDAExpSettlementV3.sol +886 -0
- package/contracts/minter-suite/Minters/MinterDAExpV4.sol +3 -3
- package/contracts/minter-suite/Minters/MinterDAExpV5.sol +545 -0
- package/contracts/minter-suite/Minters/MinterDALinHolderV5.sol +857 -0
- package/contracts/minter-suite/Minters/MinterDALinV4.sol +3 -3
- package/contracts/minter-suite/Minters/MinterDALinV5.sol +534 -0
- package/contracts/minter-suite/Minters/MinterHolderV4.sol +4 -4
- package/contracts/minter-suite/Minters/MinterMerkleV5.sol +4 -4
- package/contracts/minter-suite/Minters/MinterPolyptychV0.sol +6 -6
- package/contracts/minter-suite/Minters/MinterSEAV0.sol +3 -3
- package/contracts/minter-suite/Minters/MinterSEAV1.sol +853 -0
- package/contracts/minter-suite/Minters/MinterSetPriceERC20V4.sol +5 -5
- package/contracts/minter-suite/Minters/MinterSetPriceERC20V5.sol +545 -0
- package/contracts/minter-suite/Minters/MinterSetPriceHolderV5.sol +730 -0
- package/contracts/minter-suite/Minters/MinterSetPriceMerkleV5.sol +714 -0
- package/contracts/minter-suite/Minters/MinterSetPricePolyptychERC20V5.sol +1012 -0
- package/contracts/minter-suite/Minters/MinterSetPricePolyptychV5.sol +868 -0
- package/contracts/minter-suite/Minters/MinterSetPriceV4.sol +3 -3
- package/contracts/minter-suite/Minters/MinterSetPriceV5.sol +414 -0
- package/contracts/mock/BytecodeV0TextCR_DMock.sol +1 -1
- package/contracts/mock/BytecodeV1LibCallsMock.sol +1 -1
- package/contracts/mock/BytecodeV1TextCR_DMock.sol +1 -1
- package/contracts/mock/DeadReceiverBidderMock.sol +15 -0
- package/contracts/mock/DummySharedMinter.sol +2 -2
- package/contracts/mock/ERC20Mock.sol +16 -0
- package/contracts/mock/GenArt721CoreV3_Engine_IncorrectCoreType.sol +11 -18
- package/contracts/mock/MockAdminACLV0.sol +1 -1
- package/contracts/mock/MockAdminACLV0_PROHIBITION.sol +1 -1
- package/contracts/mock/OriginRegisterMock.sol +1 -1
- package/contracts/mock/ReentrancyHolderMock.sol +1 -1
- package/contracts/mock/ReentrancyHolderMockShared.sol +59 -0
- package/contracts/mock/ReentrancyMerkleMock.sol +1 -1
- package/contracts/mock/ReentrancyMerkleMockShared.sol +58 -0
- package/contracts/mock/ReentrancyMock.sol +1 -1
- package/contracts/mock/ReentrancyMockShared.sol +48 -0
- package/contracts/mock/ReentrancySEAMock.sol +1 -1
- package/contracts/mock/ReentrancySEAMockShared.sol +40 -0
- package/contracts/mock/SSTORE2Mock.sol +1 -1
- package/contracts/randomizer/deprecated/BasicRandomizer.sol +1 -1
- package/contracts/randomizer/deprecated/PolyptychRandomizerV0.sol +2 -2
- package/contracts/randomizer/deprecated/RandomizerV2.sol +2 -2
- package/contracts/randomizer/primitive/PseudorandomAtomicBasic.sol +1 -1
- package/contracts/randomizer/shared/SharedRandomizerV0.sol +134 -111
- package/contracts/royalty-registry/GenArt721RoyaltyOverride.sol +2 -2
- package/contracts/royalty-registry/GenArt721RoyaltyOverride_PBAB.sol +2 -2
- package/package.json +57 -36
- package/LICENSE +0 -165
- package/contracts/interfaces/0.8.x/IRandomizer_V3CoreBase.sol +0 -10
- package/contracts/interfaces/0.8.x/ISharedRandomizerV0.sol +0 -105
- /package/contracts/interfaces/{0.5.x → v0.5.x}/IBonusContract.sol +0 -0
- /package/contracts/interfaces/{0.5.x → v0.5.x}/IGenArt721CoreContractV1.sol +0 -0
- /package/contracts/interfaces/{0.5.x → v0.5.x}/IGenArt721CoreV2_PBAB.sol +0 -0
- /package/contracts/interfaces/{0.5.x → v0.5.x}/IRandomizer.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IAdminACLV0.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IArtblocksRoyaltyOverride.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IBonusContract.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IBytecodeStorageReader.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IDelegationRegistry.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IDependencyRegistryCompatibleV0.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IEngineRegistryV0.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDAExpSettlementV0.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDAExpSettlementV1.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDAExpSettlement_Mixin.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDAExpV0.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDAExpV1.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDALinV0.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterDALinV1.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterHolderV0.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterHolderV1.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterHolderV2.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterMerkleV0.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterMerkleV1.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterMerkleV2.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterSEAV0.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterV0.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterV1.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IFilteredMinterV2.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreContractExposesHashSeed.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreContractV1.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreContractV3.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreContractV3_Base.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreContractV3_Engine.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreContractV3_Engine_Flex.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IGenArt721CoreV2_PBAB.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IManifold.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IMinterBaseV0.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IMinterFilterV0.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IMintingAPICoreV0.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IMintingAPIMinterV0.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IPseudorandomAtomic.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IRandomizer.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IRandomizerPolyptychV0.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IRandomizerV2.sol +0 -0
- /package/contracts/interfaces/{0.8.x → v0.8.x}/IWETH.sol +0 -0
- /package/contracts/libs/{0.5.x → v0.5.x}/CustomERC721Metadata.sol +0 -0
- /package/contracts/libs/{0.5.x → v0.5.x}/IERC20.sol +0 -0
- /package/contracts/libs/{0.5.x → v0.5.x}/SafeMath.sol +0 -0
- /package/contracts/libs/{0.5.x → v0.5.x}/Strings.sol +0 -0
- /package/contracts/libs/{0.8.x → v0.8.x}/BytecodeStorageV0.sol +0 -0
- /package/contracts/libs/{0.8.x → v0.8.x}/BytecodeStorageV1.sol +0 -0
- /package/contracts/libs/{0.8.x → v0.8.x}/ERC721_PackedHashSeed.sol +0 -0
- /package/contracts/libs/{0.8.x → v0.8.x}/SSTORE2.sol +0 -0
|
@@ -0,0 +1,741 @@
|
|
|
1
|
+
// SPDX-License-Identifier: LGPL-3.0-only
|
|
2
|
+
// Created By: Art Blocks Inc.
|
|
3
|
+
|
|
4
|
+
pragma solidity ^0.8.0;
|
|
5
|
+
|
|
6
|
+
import {IMinterBaseV0} from "../../../interfaces/v0.8.x/IMinterBaseV0.sol";
|
|
7
|
+
import {IGenArt721CoreContractV3_Base} from "../../../interfaces/v0.8.x/IGenArt721CoreContractV3_Base.sol";
|
|
8
|
+
import {IGenArt721CoreContractV3} from "../../../interfaces/v0.8.x/IGenArt721CoreContractV3.sol";
|
|
9
|
+
import {IGenArt721CoreContractV3_Engine} from "../../../interfaces/v0.8.x/IGenArt721CoreContractV3_Engine.sol";
|
|
10
|
+
|
|
11
|
+
import {IERC20} from "@openzeppelin-4.7/contracts/token/ERC20/IERC20.sol";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @title Art Blocks Split Funds Library
|
|
15
|
+
* @notice This library is designed for the Art Blocks platform. It splits
|
|
16
|
+
* Ether (ETH) and ERC20 token funds among stakeholders, such as sender
|
|
17
|
+
* (if refund is applicable), providers, artists, and artists' additional
|
|
18
|
+
* payees.
|
|
19
|
+
* @author Art Blocks Inc.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
library SplitFundsLib {
|
|
23
|
+
/**
|
|
24
|
+
* @notice Currency updated for project `projectId` to symbol
|
|
25
|
+
* `currencySymbol` and address `currencyAddress`.
|
|
26
|
+
* @param projectId Project ID currency was updated for
|
|
27
|
+
* @param coreContract Core contract address currency was updated for
|
|
28
|
+
* @param currencyAddress Currency address
|
|
29
|
+
* @param currencySymbol Currency symbol
|
|
30
|
+
*/
|
|
31
|
+
event ProjectCurrencyInfoUpdated(
|
|
32
|
+
uint256 indexed projectId,
|
|
33
|
+
address indexed coreContract,
|
|
34
|
+
address indexed currencyAddress,
|
|
35
|
+
string currencySymbol
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
// position of Split Funds Lib storage, using a diamond storage pattern
|
|
39
|
+
// for this library
|
|
40
|
+
bytes32 constant SPLIT_FUNDS_LIB_STORAGE_POSITION =
|
|
41
|
+
keccak256("splitfundslib.storage");
|
|
42
|
+
|
|
43
|
+
// contract-level variables
|
|
44
|
+
struct IsEngineCache {
|
|
45
|
+
bool isEngine;
|
|
46
|
+
bool isCached;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// project-level variables
|
|
50
|
+
struct SplitFundsProjectConfig {
|
|
51
|
+
address currencyAddress; // address(0) if ETH
|
|
52
|
+
string currencySymbol; // Assumed to be ETH if null
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Diamond storage pattern is used in this library
|
|
56
|
+
struct SplitFundsLibStorage {
|
|
57
|
+
mapping(address coreContract => mapping(uint256 projectId => SplitFundsProjectConfig)) splitFundsProjectConfigs;
|
|
58
|
+
mapping(address coreContract => IsEngineCache) isEngineCacheConfigs;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @notice splits ETH funds between sender (if refund), providers,
|
|
63
|
+
* artist, and artist's additional payee for a token purchased on
|
|
64
|
+
* project `projectId`.
|
|
65
|
+
* WARNING: This function uses msg.value and msg.sender to determine
|
|
66
|
+
* refund amounts, and therefore may not be applicable to all use cases
|
|
67
|
+
* (e.g. do not use with Dutch Auctions with on-chain settlement).
|
|
68
|
+
* @dev This function relies on msg.sender and msg.value, so it must be
|
|
69
|
+
* called directly from the contract that is receiving the payment.
|
|
70
|
+
* @dev possible DoS during splits is acknowledged, and mitigated by
|
|
71
|
+
* business practices, including end-to-end testing on mainnet, and
|
|
72
|
+
* admin-accepted artist payment addresses.
|
|
73
|
+
* @param projectId Project ID for which funds shall be split.
|
|
74
|
+
* @param pricePerTokenInWei Current price of token, in Wei.
|
|
75
|
+
* @param coreContract Address of the GenArt721CoreContract associated
|
|
76
|
+
* with the project.
|
|
77
|
+
*/
|
|
78
|
+
function splitFundsETHRefundSender(
|
|
79
|
+
uint256 projectId,
|
|
80
|
+
uint256 pricePerTokenInWei,
|
|
81
|
+
address coreContract
|
|
82
|
+
) internal {
|
|
83
|
+
if (msg.value > 0) {
|
|
84
|
+
// send refund to sender
|
|
85
|
+
uint256 refund = msg.value - pricePerTokenInWei;
|
|
86
|
+
if (refund > 0) {
|
|
87
|
+
(bool success_, ) = msg.sender.call{value: refund}("");
|
|
88
|
+
require(success_, "Refund failed");
|
|
89
|
+
}
|
|
90
|
+
// split revenues
|
|
91
|
+
splitRevenuesETHNoRefund({
|
|
92
|
+
projectId: projectId,
|
|
93
|
+
valueInWei: pricePerTokenInWei,
|
|
94
|
+
coreContract: coreContract
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* @notice Splits ETH revenues between providers, artist, and artist's
|
|
101
|
+
* additional payee for revenue generated by project `projectId`.
|
|
102
|
+
* This function does NOT refund msg.sender, and does NOT use msg.value
|
|
103
|
+
* when determining the value to be split.
|
|
104
|
+
* @dev possible DoS during splits is acknowledged, and mitigated by
|
|
105
|
+
* business practices, including end-to-end testing on mainnet, and
|
|
106
|
+
* admin-accepted artist payment addresses.
|
|
107
|
+
* @param projectId Project ID for which funds shall be split.
|
|
108
|
+
* @param valueInWei Value to be split, in Wei.
|
|
109
|
+
* @param coreContract Address of the GenArt721CoreContract
|
|
110
|
+
* associated with the project.
|
|
111
|
+
*/
|
|
112
|
+
function splitRevenuesETHNoRefund(
|
|
113
|
+
uint256 projectId,
|
|
114
|
+
uint256 valueInWei,
|
|
115
|
+
address coreContract
|
|
116
|
+
) internal {
|
|
117
|
+
if (valueInWei == 0) {
|
|
118
|
+
return; // return early
|
|
119
|
+
}
|
|
120
|
+
// split funds between platforms, artist, and artist's
|
|
121
|
+
// additional payee
|
|
122
|
+
bool isEngine_ = isEngine(coreContract);
|
|
123
|
+
uint256 renderProviderRevenue;
|
|
124
|
+
address payable renderProviderAddress;
|
|
125
|
+
uint256 platformProviderRevenue;
|
|
126
|
+
address payable platformProviderAddress;
|
|
127
|
+
uint256 artistRevenue;
|
|
128
|
+
address payable artistAddress;
|
|
129
|
+
uint256 additionalPayeePrimaryRevenue;
|
|
130
|
+
address payable additionalPayeePrimaryAddress;
|
|
131
|
+
if (isEngine_) {
|
|
132
|
+
// get engine splits
|
|
133
|
+
(
|
|
134
|
+
renderProviderRevenue,
|
|
135
|
+
renderProviderAddress,
|
|
136
|
+
platformProviderRevenue,
|
|
137
|
+
platformProviderAddress,
|
|
138
|
+
artistRevenue,
|
|
139
|
+
artistAddress,
|
|
140
|
+
additionalPayeePrimaryRevenue,
|
|
141
|
+
additionalPayeePrimaryAddress
|
|
142
|
+
) = IGenArt721CoreContractV3_Engine(coreContract)
|
|
143
|
+
.getPrimaryRevenueSplits({
|
|
144
|
+
_projectId: projectId,
|
|
145
|
+
_price: valueInWei
|
|
146
|
+
});
|
|
147
|
+
} else {
|
|
148
|
+
// get flagship splits
|
|
149
|
+
// @dev note that platformProviderAddress and
|
|
150
|
+
// platformProviderRevenue remain 0 for flagship
|
|
151
|
+
(
|
|
152
|
+
renderProviderRevenue, // artblocks revenue
|
|
153
|
+
renderProviderAddress, // artblocks address
|
|
154
|
+
artistRevenue,
|
|
155
|
+
artistAddress,
|
|
156
|
+
additionalPayeePrimaryRevenue,
|
|
157
|
+
additionalPayeePrimaryAddress
|
|
158
|
+
) = IGenArt721CoreContractV3(coreContract).getPrimaryRevenueSplits({
|
|
159
|
+
_projectId: projectId,
|
|
160
|
+
_price: valueInWei
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
// require total revenue split is 100%
|
|
164
|
+
// @dev note that platformProviderRevenue remains 0 for flagship
|
|
165
|
+
require(
|
|
166
|
+
renderProviderRevenue +
|
|
167
|
+
platformProviderRevenue +
|
|
168
|
+
artistRevenue +
|
|
169
|
+
additionalPayeePrimaryRevenue ==
|
|
170
|
+
valueInWei,
|
|
171
|
+
"Invalid revenue split totals"
|
|
172
|
+
);
|
|
173
|
+
// distribute revenues
|
|
174
|
+
// @dev note that platformProviderAddress and platformProviderRevenue
|
|
175
|
+
// remain 0 for flagship
|
|
176
|
+
_sendPaymentsETH({
|
|
177
|
+
platformProviderRevenue: platformProviderRevenue,
|
|
178
|
+
platformProviderAddress: platformProviderAddress,
|
|
179
|
+
renderProviderRevenue: renderProviderRevenue,
|
|
180
|
+
renderProviderAddress: renderProviderAddress,
|
|
181
|
+
artistRevenue: artistRevenue,
|
|
182
|
+
artistAddress: artistAddress,
|
|
183
|
+
additionalPayeePrimaryRevenue: additionalPayeePrimaryRevenue,
|
|
184
|
+
additionalPayeePrimaryAddress: additionalPayeePrimaryAddress
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* @notice Splits ERC20 funds between providers, artist, and artist's
|
|
190
|
+
* additional payee, for a token purchased on project `projectId`.
|
|
191
|
+
* The function performs checks to ensure that the ERC20 token is
|
|
192
|
+
* approved for transfer, and that a non-zero ERC20 token address is
|
|
193
|
+
* configured.
|
|
194
|
+
* @dev This function relies on msg.sender, so it must be
|
|
195
|
+
* called directly from the contract that is receiving the payment.
|
|
196
|
+
* @dev possible DoS during splits is acknowledged, and mitigated by
|
|
197
|
+
* business practices, including end-to-end testing on mainnet, and
|
|
198
|
+
* admin-accepted artist payment addresses.
|
|
199
|
+
* @param projectId Project ID for which funds shall be split.
|
|
200
|
+
* @param pricePerToken Current price of token, no decimals.
|
|
201
|
+
* @param coreContract Core contract address.
|
|
202
|
+
*/
|
|
203
|
+
function splitFundsERC20(
|
|
204
|
+
uint256 projectId,
|
|
205
|
+
uint256 pricePerToken,
|
|
206
|
+
address coreContract
|
|
207
|
+
) internal {
|
|
208
|
+
if (pricePerToken == 0) {
|
|
209
|
+
return; // nothing to split, return early
|
|
210
|
+
}
|
|
211
|
+
IERC20 projectCurrency;
|
|
212
|
+
// block scope to avoid stack too deep error
|
|
213
|
+
{
|
|
214
|
+
SplitFundsProjectConfig
|
|
215
|
+
storage splitFundsProjectConfig = getSplitFundsProjectConfig({
|
|
216
|
+
projectId: projectId,
|
|
217
|
+
coreContract: coreContract
|
|
218
|
+
});
|
|
219
|
+
address currencyAddress = splitFundsProjectConfig.currencyAddress;
|
|
220
|
+
require(
|
|
221
|
+
currencyAddress != address(0),
|
|
222
|
+
"ERC20: payment not configured"
|
|
223
|
+
);
|
|
224
|
+
require(msg.value == 0, "ERC20: No ETH when using ERC20");
|
|
225
|
+
// ERC20 token is used for payment
|
|
226
|
+
validateERC20Approvals({
|
|
227
|
+
msgSender: msg.sender,
|
|
228
|
+
currencyAddress: currencyAddress,
|
|
229
|
+
pricePerToken: pricePerToken
|
|
230
|
+
});
|
|
231
|
+
projectCurrency = IERC20(currencyAddress);
|
|
232
|
+
}
|
|
233
|
+
// split remaining funds between foundation, artist, and artist's
|
|
234
|
+
bool isEngine_ = isEngine(coreContract);
|
|
235
|
+
uint256 renderProviderRevenue;
|
|
236
|
+
address payable renderProviderAddress;
|
|
237
|
+
uint256 platformProviderRevenue;
|
|
238
|
+
address payable platformProviderAddress;
|
|
239
|
+
uint256 artistRevenue;
|
|
240
|
+
address payable artistAddress;
|
|
241
|
+
uint256 additionalPayeePrimaryRevenue;
|
|
242
|
+
address payable additionalPayeePrimaryAddress;
|
|
243
|
+
if (isEngine_) {
|
|
244
|
+
// get engine splits
|
|
245
|
+
(
|
|
246
|
+
renderProviderRevenue,
|
|
247
|
+
renderProviderAddress,
|
|
248
|
+
platformProviderRevenue,
|
|
249
|
+
platformProviderAddress,
|
|
250
|
+
artistRevenue,
|
|
251
|
+
artistAddress,
|
|
252
|
+
additionalPayeePrimaryRevenue,
|
|
253
|
+
additionalPayeePrimaryAddress
|
|
254
|
+
) = IGenArt721CoreContractV3_Engine(coreContract)
|
|
255
|
+
.getPrimaryRevenueSplits({
|
|
256
|
+
_projectId: projectId,
|
|
257
|
+
_price: pricePerToken
|
|
258
|
+
});
|
|
259
|
+
} else {
|
|
260
|
+
// get flagship splits
|
|
261
|
+
// @dev note that platformProviderAddress and
|
|
262
|
+
// platformProviderRevenue remain 0 for flagship
|
|
263
|
+
(
|
|
264
|
+
renderProviderRevenue, // artblocks revenue
|
|
265
|
+
renderProviderAddress, // artblocks address
|
|
266
|
+
artistRevenue,
|
|
267
|
+
artistAddress,
|
|
268
|
+
additionalPayeePrimaryRevenue,
|
|
269
|
+
additionalPayeePrimaryAddress
|
|
270
|
+
) = IGenArt721CoreContractV3(coreContract).getPrimaryRevenueSplits({
|
|
271
|
+
_projectId: projectId,
|
|
272
|
+
_price: pricePerToken
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
// require total revenue split is 100%
|
|
276
|
+
// @dev note that platformProviderRevenue remains 0 for flagship
|
|
277
|
+
require(
|
|
278
|
+
renderProviderRevenue +
|
|
279
|
+
platformProviderRevenue +
|
|
280
|
+
artistRevenue +
|
|
281
|
+
additionalPayeePrimaryRevenue ==
|
|
282
|
+
pricePerToken,
|
|
283
|
+
"Invalid revenue split totals"
|
|
284
|
+
);
|
|
285
|
+
// distribute revenues
|
|
286
|
+
// @dev note that platformProviderAddress and platformProviderRevenue
|
|
287
|
+
// remain 0 for flagship
|
|
288
|
+
_sendPaymentsERC20({
|
|
289
|
+
projectCurrency: projectCurrency,
|
|
290
|
+
platformProviderRevenue: platformProviderRevenue,
|
|
291
|
+
platformProviderAddress: platformProviderAddress,
|
|
292
|
+
renderProviderRevenue: renderProviderRevenue,
|
|
293
|
+
renderProviderAddress: renderProviderAddress,
|
|
294
|
+
artistRevenue: artistRevenue,
|
|
295
|
+
artistAddress: artistAddress,
|
|
296
|
+
additionalPayeePrimaryRevenue: additionalPayeePrimaryRevenue,
|
|
297
|
+
additionalPayeePrimaryAddress: additionalPayeePrimaryAddress
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* @notice Updates payment currency of the referenced
|
|
303
|
+
* SplitFundsProjectConfig to be `currencySymbol` at address
|
|
304
|
+
* `currencyAddress`.
|
|
305
|
+
* Only supports setting currency info of ERC20 tokens.
|
|
306
|
+
* Returns bool that is true if the price should be reset after this
|
|
307
|
+
* update. Price is recommended to be reset if the currency address was
|
|
308
|
+
* previously configured, but is now being updated to a different currency
|
|
309
|
+
* address. This is to protect accidental price reductions when changing
|
|
310
|
+
* currency if an artist is changing currencies in an unpaused state.
|
|
311
|
+
* @dev artist-defined currency symbol is used instead of any on-chain
|
|
312
|
+
* currency symbol.
|
|
313
|
+
* @param projectId Project ID to update.
|
|
314
|
+
* @param coreContract Core contract address.
|
|
315
|
+
* @param currencySymbol Currency symbol.
|
|
316
|
+
* @param currencyAddress Currency address.
|
|
317
|
+
* @return recommendPriceReset True if the price should be reset after this
|
|
318
|
+
* update.
|
|
319
|
+
*/
|
|
320
|
+
function updateProjectCurrencyInfoERC20(
|
|
321
|
+
uint256 projectId,
|
|
322
|
+
address coreContract,
|
|
323
|
+
string memory currencySymbol,
|
|
324
|
+
address currencyAddress
|
|
325
|
+
) internal returns (bool recommendPriceReset) {
|
|
326
|
+
// CHECKS
|
|
327
|
+
require(currencyAddress != address(0), "null address, only ERC20");
|
|
328
|
+
require(bytes(currencySymbol).length > 0, "only non-null symbol");
|
|
329
|
+
// EFFECTS
|
|
330
|
+
SplitFundsProjectConfig
|
|
331
|
+
storage splitFundsProjectConfig = getSplitFundsProjectConfig({
|
|
332
|
+
projectId: projectId,
|
|
333
|
+
coreContract: coreContract
|
|
334
|
+
});
|
|
335
|
+
// recommend price reset if currency address was previously configured
|
|
336
|
+
if (splitFundsProjectConfig.currencyAddress != address(0)) {
|
|
337
|
+
recommendPriceReset = true;
|
|
338
|
+
}
|
|
339
|
+
splitFundsProjectConfig.currencySymbol = currencySymbol;
|
|
340
|
+
splitFundsProjectConfig.currencyAddress = currencyAddress;
|
|
341
|
+
|
|
342
|
+
emit ProjectCurrencyInfoUpdated({
|
|
343
|
+
projectId: projectId,
|
|
344
|
+
coreContract: coreContract,
|
|
345
|
+
currencyAddress: currencyAddress,
|
|
346
|
+
currencySymbol: currencySymbol
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* @notice Force sends `amount` (in wei) ETH to `to`, with a gas stipend
|
|
352
|
+
* equal to `minterRefundGasLimit`.
|
|
353
|
+
* If sending via the normal procedure fails, force sends the ETH by
|
|
354
|
+
* creating a temporary contract which uses `SELFDESTRUCT` to force send
|
|
355
|
+
* the ETH.
|
|
356
|
+
* Reverts if the current contract has insufficient balance.
|
|
357
|
+
* @param to The address to send ETH to.
|
|
358
|
+
* @param amount The amount of ETH to send.
|
|
359
|
+
* @param minterRefundGasLimit The gas limit to use when sending ETH, prior
|
|
360
|
+
* to fallback.
|
|
361
|
+
* @dev This function is adapted from the `forceSafeTransferETH` function
|
|
362
|
+
* in the `https://github.com/Vectorized/solady` repository, with
|
|
363
|
+
* modifications to not check if the current contract has sufficient
|
|
364
|
+
* balance. Therefore, the contract should be checked for sufficient
|
|
365
|
+
* balance before calling this function in the minter itself, if
|
|
366
|
+
* applicable.
|
|
367
|
+
*/
|
|
368
|
+
function forceSafeTransferETH(
|
|
369
|
+
address to,
|
|
370
|
+
uint256 amount,
|
|
371
|
+
uint256 minterRefundGasLimit
|
|
372
|
+
) internal {
|
|
373
|
+
// Manually inlined because the compiler doesn't inline functions with
|
|
374
|
+
// branches.
|
|
375
|
+
/// @solidity memory-safe-assembly
|
|
376
|
+
assembly {
|
|
377
|
+
// @dev intentionally do not check if this contract has sufficient
|
|
378
|
+
// balance, because that is not intended to be a valid state.
|
|
379
|
+
|
|
380
|
+
// Transfer the ETH and check if it succeeded or not.
|
|
381
|
+
if iszero(call(minterRefundGasLimit, to, amount, 0, 0, 0, 0)) {
|
|
382
|
+
// if the transfer failed, we create a temporary contract with
|
|
383
|
+
// initialization code that uses `SELFDESTRUCT` to force send
|
|
384
|
+
// the ETH.
|
|
385
|
+
// note: Compatible with `SENDALL`:
|
|
386
|
+
// https://eips.ethereum.org/EIPS/eip-4758
|
|
387
|
+
|
|
388
|
+
//---------------------------------------------------------------------------------------------------------------//
|
|
389
|
+
// Opcode | Opcode + Arguments | Description | Stack View //
|
|
390
|
+
//---------------------------------------------------------------------------------------------------------------//
|
|
391
|
+
// Contract creation code that uses `SELFDESTRUCT` to force send ETH to a specified address. //
|
|
392
|
+
// Creation code summary: 0x73<20-byte toAddress>0xff //
|
|
393
|
+
//---------------------------------------------------------------------------------------------------------------//
|
|
394
|
+
// 0x73 | 0x73_toAddress | PUSH20 toAddress | toAddress //
|
|
395
|
+
// 0xFF | 0xFF | SELFDESTRUCT | //
|
|
396
|
+
//---------------------------------------------------------------------------------------------------------------//
|
|
397
|
+
// Store the address in scratch space, starting at 0x00, which begins the 20-byte address at 32-20=12 in memory
|
|
398
|
+
// @dev use scratch space because we have enough space for simple creation code (less than 0x40 bytes)
|
|
399
|
+
mstore(0x00, to)
|
|
400
|
+
// store opcode PUSH20 immediately before the address, starting at 0x0b (11) in memory
|
|
401
|
+
mstore8(0x0b, 0x73)
|
|
402
|
+
// store opcode SELFDESTRUCT immediately after the address, starting at 0x20 (32) in memory
|
|
403
|
+
mstore8(0x20, 0xff)
|
|
404
|
+
// this will always succeed because the contract creation code is
|
|
405
|
+
// valid, and the address is valid because it is a 20-byte value
|
|
406
|
+
if iszero(create(amount, 0x0b, 0x16)) {
|
|
407
|
+
// @dev For better gas estimation.
|
|
408
|
+
if iszero(gt(gas(), 1000000)) {
|
|
409
|
+
revert(0, 0)
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/**
|
|
417
|
+
* @notice Returns whether or not the provided address `coreContract`
|
|
418
|
+
* is an Art Blocks Engine core contract. Caches the result for future access.
|
|
419
|
+
* @param coreContract Address of the core contract to check.
|
|
420
|
+
*/
|
|
421
|
+
function isEngine(address coreContract) internal returns (bool) {
|
|
422
|
+
IsEngineCache storage isEngineCache = getIsEngineCacheConfig(
|
|
423
|
+
coreContract
|
|
424
|
+
);
|
|
425
|
+
// check cache, return early if cached
|
|
426
|
+
if (isEngineCache.isCached) {
|
|
427
|
+
return isEngineCache.isEngine;
|
|
428
|
+
}
|
|
429
|
+
// populate cache and return result
|
|
430
|
+
bool isEngine_ = getV3CoreIsEngineView(coreContract);
|
|
431
|
+
isEngineCache.isCached = true;
|
|
432
|
+
isEngineCache.isEngine = isEngine_;
|
|
433
|
+
return isEngine_;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
/**
|
|
437
|
+
* @notice Returns whether a V3 core contract is an Art Blocks Engine
|
|
438
|
+
* contract or not. Return value of false indicates that the core is a
|
|
439
|
+
* flagship contract. This function does not update the cache state for the
|
|
440
|
+
* given V3 core contract.
|
|
441
|
+
* @dev this function reverts if a core contract does not return the
|
|
442
|
+
* expected number of return values from getPrimaryRevenueSplits() for
|
|
443
|
+
* either a flagship or engine core contract.
|
|
444
|
+
* @dev this function uses the length of the return data (in bytes) to
|
|
445
|
+
* determine whether the core is an engine or not.
|
|
446
|
+
* @param coreContract The address of the deployed core contract.
|
|
447
|
+
*/
|
|
448
|
+
function getV3CoreIsEngineView(
|
|
449
|
+
address coreContract
|
|
450
|
+
) internal view returns (bool) {
|
|
451
|
+
// call getPrimaryRevenueSplits() on core contract
|
|
452
|
+
bytes memory payload = abi.encodeWithSignature(
|
|
453
|
+
"getPrimaryRevenueSplits(uint256,uint256)",
|
|
454
|
+
0,
|
|
455
|
+
0
|
|
456
|
+
);
|
|
457
|
+
(bool success, bytes memory returnData) = coreContract.staticcall(
|
|
458
|
+
payload
|
|
459
|
+
);
|
|
460
|
+
require(success, "getPrimaryRevenueSplits() call failed");
|
|
461
|
+
// determine whether core is engine or not, based on return data length
|
|
462
|
+
uint256 returnDataLength = returnData.length;
|
|
463
|
+
if (returnDataLength == 6 * 32) {
|
|
464
|
+
// 6 32-byte words returned if flagship (not engine)
|
|
465
|
+
// @dev 6 32-byte words are expected because the non-engine core
|
|
466
|
+
// contracts return a payout address and uint256 payment value for
|
|
467
|
+
// the artist, and artist's additional payee, and Art Blocks.
|
|
468
|
+
// also note that per Solidity ABI encoding, the address return
|
|
469
|
+
// values are padded to 32 bytes.
|
|
470
|
+
|
|
471
|
+
return false;
|
|
472
|
+
} else if (returnDataLength == 8 * 32) {
|
|
473
|
+
// 8 32-byte words returned if engine
|
|
474
|
+
// @dev 8 32-byte words are expected because the engine core
|
|
475
|
+
// contracts return a payout address and uint256 payment value for
|
|
476
|
+
// the artist, artist's additional payee, render provider
|
|
477
|
+
// typically Art Blocks, and platform provider (partner).
|
|
478
|
+
// also note that per Solidity ABI encoding, the address return
|
|
479
|
+
// values are padded to 32 bytes.
|
|
480
|
+
return true;
|
|
481
|
+
} else {
|
|
482
|
+
// unexpected return value length
|
|
483
|
+
revert("Unexpected revenue split bytes");
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
/**
|
|
488
|
+
* @notice Gets the currency address and symbol for the referenced
|
|
489
|
+
* SplitFundsProjectConfig.
|
|
490
|
+
* Only supports ERC20 tokens - returns currencySymbol of `UNCONFIG` if
|
|
491
|
+
* `currencyAddress` is zero.
|
|
492
|
+
* @param projectId Project ID to get config for
|
|
493
|
+
* @param coreContract Core contract address to get config for
|
|
494
|
+
* @return currencyAddress
|
|
495
|
+
* @return currencySymbol
|
|
496
|
+
*/
|
|
497
|
+
function getCurrencyInfoERC20(
|
|
498
|
+
uint256 projectId,
|
|
499
|
+
address coreContract
|
|
500
|
+
)
|
|
501
|
+
internal
|
|
502
|
+
view
|
|
503
|
+
returns (address currencyAddress, string memory currencySymbol)
|
|
504
|
+
{
|
|
505
|
+
SplitFundsProjectConfig
|
|
506
|
+
storage splitFundsProjectConfig = getSplitFundsProjectConfig({
|
|
507
|
+
projectId: projectId,
|
|
508
|
+
coreContract: coreContract
|
|
509
|
+
});
|
|
510
|
+
currencyAddress = splitFundsProjectConfig.currencyAddress;
|
|
511
|
+
// default to "UNCONFIG" if project currency address is initial value
|
|
512
|
+
currencySymbol = currencyAddress == address(0)
|
|
513
|
+
? "UNCONFIG"
|
|
514
|
+
: splitFundsProjectConfig.currencySymbol;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
/**
|
|
518
|
+
* @notice Gets the balance of `currencyAddress` ERC20 tokens for `walletAddress`.
|
|
519
|
+
* @param currencyAddress ERC20 token address.
|
|
520
|
+
* @param walletAddress wallet address.
|
|
521
|
+
* @return balance
|
|
522
|
+
*/
|
|
523
|
+
function getERC20Balance(
|
|
524
|
+
address currencyAddress,
|
|
525
|
+
address walletAddress
|
|
526
|
+
) internal view returns (uint256) {
|
|
527
|
+
return IERC20(currencyAddress).balanceOf(walletAddress);
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
/**
|
|
531
|
+
* @notice Gets the allowance of `spenderAddress` to spend `walletAddress`'s
|
|
532
|
+
* `currencyAddress` ERC20 tokens.
|
|
533
|
+
* @param currencyAddress ERC20 token address.
|
|
534
|
+
* @param walletAddress wallet address.
|
|
535
|
+
* @param spenderAddress spender address.
|
|
536
|
+
* @return allowance
|
|
537
|
+
*/
|
|
538
|
+
function getERC20Allowance(
|
|
539
|
+
address currencyAddress,
|
|
540
|
+
address walletAddress,
|
|
541
|
+
address spenderAddress
|
|
542
|
+
) internal view returns (uint256 allowance) {
|
|
543
|
+
allowance = IERC20(currencyAddress).allowance({
|
|
544
|
+
owner: walletAddress,
|
|
545
|
+
spender: spenderAddress
|
|
546
|
+
});
|
|
547
|
+
return allowance;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
/**
|
|
551
|
+
* @notice Function validates that `msgSender` has approved the contract to spend at least
|
|
552
|
+
* `pricePerToken` of `currencyAddress` ERC20 tokens, and that
|
|
553
|
+
* `msgSender` has a balance of at least `pricePerToken` of
|
|
554
|
+
* `currencyAddress` ERC20 tokens.
|
|
555
|
+
* Reverts if insufficient allowance or balance.
|
|
556
|
+
* @param msgSender Address of the message sender to validate.
|
|
557
|
+
* @param currencyAddress Address of the ERC20 token to validate.
|
|
558
|
+
* @param pricePerToken Price per token to validate (no decimals)
|
|
559
|
+
*/
|
|
560
|
+
function validateERC20Approvals(
|
|
561
|
+
address msgSender,
|
|
562
|
+
address currencyAddress,
|
|
563
|
+
uint256 pricePerToken
|
|
564
|
+
) private view {
|
|
565
|
+
require(
|
|
566
|
+
IERC20(currencyAddress).allowance({
|
|
567
|
+
owner: msgSender,
|
|
568
|
+
spender: address(this)
|
|
569
|
+
}) >= pricePerToken,
|
|
570
|
+
"Insufficient ERC20 allowance"
|
|
571
|
+
);
|
|
572
|
+
require(
|
|
573
|
+
IERC20(currencyAddress).balanceOf(msgSender) >= pricePerToken,
|
|
574
|
+
"Insufficient ERC20 balance"
|
|
575
|
+
);
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
/**
|
|
579
|
+
* @notice Sends ETH revenues between providers, artist, and artist's
|
|
580
|
+
* additional payee. Reverts if any payment fails.
|
|
581
|
+
* @param platformProviderRevenue Platform Provider revenue.
|
|
582
|
+
* @param platformProviderAddress Platform Provider address.
|
|
583
|
+
* @param renderProviderRevenue Render Provider revenue.
|
|
584
|
+
* @param renderProviderAddress Render Provider address.
|
|
585
|
+
* @param artistRevenue Artist revenue.
|
|
586
|
+
* @param artistAddress Artist address.
|
|
587
|
+
* @param additionalPayeePrimaryRevenue Additional Payee revenue.
|
|
588
|
+
* @param additionalPayeePrimaryAddress Additional Payee address.
|
|
589
|
+
*/
|
|
590
|
+
function _sendPaymentsETH(
|
|
591
|
+
uint256 platformProviderRevenue,
|
|
592
|
+
address payable platformProviderAddress,
|
|
593
|
+
uint256 renderProviderRevenue,
|
|
594
|
+
address payable renderProviderAddress,
|
|
595
|
+
uint256 artistRevenue,
|
|
596
|
+
address payable artistAddress,
|
|
597
|
+
uint256 additionalPayeePrimaryRevenue,
|
|
598
|
+
address payable additionalPayeePrimaryAddress
|
|
599
|
+
) private {
|
|
600
|
+
// Platform Provider payment (only possible if engine)
|
|
601
|
+
if (platformProviderRevenue > 0) {
|
|
602
|
+
(bool success, ) = platformProviderAddress.call{
|
|
603
|
+
value: platformProviderRevenue
|
|
604
|
+
}("");
|
|
605
|
+
require(success, "Platform Provider payment failed");
|
|
606
|
+
}
|
|
607
|
+
// Render Provider / Art Blocks payment
|
|
608
|
+
if (renderProviderRevenue > 0) {
|
|
609
|
+
(bool success, ) = renderProviderAddress.call{
|
|
610
|
+
value: renderProviderRevenue
|
|
611
|
+
}("");
|
|
612
|
+
require(success, "Render Provider payment failed");
|
|
613
|
+
}
|
|
614
|
+
// artist payment
|
|
615
|
+
if (artistRevenue > 0) {
|
|
616
|
+
(bool success, ) = artistAddress.call{value: artistRevenue}("");
|
|
617
|
+
require(success, "Artist payment failed");
|
|
618
|
+
}
|
|
619
|
+
// additional payee payment
|
|
620
|
+
if (additionalPayeePrimaryRevenue > 0) {
|
|
621
|
+
(bool success, ) = additionalPayeePrimaryAddress.call{
|
|
622
|
+
value: additionalPayeePrimaryRevenue
|
|
623
|
+
}("");
|
|
624
|
+
require(success, "Additional Payee payment failed");
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
/**
|
|
629
|
+
* @notice Sends ERC20 revenues between providers, artist, and artist's
|
|
630
|
+
* additional payee. Reverts if any payment fails. All revenue values
|
|
631
|
+
* should not use decimals.
|
|
632
|
+
* @dev This function relies on msg.sender, so it must be called from
|
|
633
|
+
* the contract that is receiving the payment.
|
|
634
|
+
* @param projectCurrency IERC20 payment token.
|
|
635
|
+
* @param platformProviderRevenue Platform Provider revenue.
|
|
636
|
+
* @param platformProviderAddress Platform Provider address.
|
|
637
|
+
* @param renderProviderRevenue Render Provider revenue.
|
|
638
|
+
* @param renderProviderAddress Render Provider address.
|
|
639
|
+
* @param artistRevenue Artist revenue.
|
|
640
|
+
* @param artistAddress Artist address.
|
|
641
|
+
* @param additionalPayeePrimaryRevenue Additional Payee revenue.
|
|
642
|
+
* @param additionalPayeePrimaryAddress Additional Payee address.
|
|
643
|
+
*/
|
|
644
|
+
function _sendPaymentsERC20(
|
|
645
|
+
IERC20 projectCurrency,
|
|
646
|
+
uint256 platformProviderRevenue,
|
|
647
|
+
address payable platformProviderAddress,
|
|
648
|
+
uint256 renderProviderRevenue,
|
|
649
|
+
address payable renderProviderAddress,
|
|
650
|
+
uint256 artistRevenue,
|
|
651
|
+
address payable artistAddress,
|
|
652
|
+
uint256 additionalPayeePrimaryRevenue,
|
|
653
|
+
address payable additionalPayeePrimaryAddress
|
|
654
|
+
) private {
|
|
655
|
+
// Platform Provider payment (only possible if engine)
|
|
656
|
+
if (platformProviderRevenue > 0) {
|
|
657
|
+
require(
|
|
658
|
+
projectCurrency.transferFrom({
|
|
659
|
+
from: msg.sender,
|
|
660
|
+
to: platformProviderAddress,
|
|
661
|
+
amount: platformProviderRevenue
|
|
662
|
+
}),
|
|
663
|
+
"Platform Provider payment failed"
|
|
664
|
+
);
|
|
665
|
+
}
|
|
666
|
+
// Art Blocks payment
|
|
667
|
+
if (renderProviderRevenue > 0) {
|
|
668
|
+
require(
|
|
669
|
+
projectCurrency.transferFrom({
|
|
670
|
+
from: msg.sender,
|
|
671
|
+
to: renderProviderAddress,
|
|
672
|
+
amount: renderProviderRevenue
|
|
673
|
+
}),
|
|
674
|
+
"Render Provider payment failed"
|
|
675
|
+
);
|
|
676
|
+
}
|
|
677
|
+
// artist payment
|
|
678
|
+
if (artistRevenue > 0) {
|
|
679
|
+
require(
|
|
680
|
+
projectCurrency.transferFrom({
|
|
681
|
+
from: msg.sender,
|
|
682
|
+
to: artistAddress,
|
|
683
|
+
amount: artistRevenue
|
|
684
|
+
}),
|
|
685
|
+
"Artist payment failed"
|
|
686
|
+
);
|
|
687
|
+
}
|
|
688
|
+
// additional payee payment
|
|
689
|
+
if (additionalPayeePrimaryRevenue > 0) {
|
|
690
|
+
// @dev some ERC20 may not revert on transfer failure, so we
|
|
691
|
+
// check the return value
|
|
692
|
+
require(
|
|
693
|
+
projectCurrency.transferFrom({
|
|
694
|
+
from: msg.sender,
|
|
695
|
+
to: additionalPayeePrimaryAddress,
|
|
696
|
+
amount: additionalPayeePrimaryRevenue
|
|
697
|
+
}),
|
|
698
|
+
"Additional Payee payment failed"
|
|
699
|
+
);
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
/**
|
|
704
|
+
* @notice Loads the SplitFundsProjectConfig for a given project and core
|
|
705
|
+
* contract.
|
|
706
|
+
* @param projectId Project Id to get config for
|
|
707
|
+
* @param coreContract Core contract address to get config for
|
|
708
|
+
*/
|
|
709
|
+
function getSplitFundsProjectConfig(
|
|
710
|
+
uint256 projectId,
|
|
711
|
+
address coreContract
|
|
712
|
+
) internal view returns (SplitFundsProjectConfig storage) {
|
|
713
|
+
return s().splitFundsProjectConfigs[coreContract][projectId];
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
/**
|
|
717
|
+
* @notice Loads the IsEngineCache for a given core contract.
|
|
718
|
+
* @param coreContract Core contract address to get config for
|
|
719
|
+
*/
|
|
720
|
+
function getIsEngineCacheConfig(
|
|
721
|
+
address coreContract
|
|
722
|
+
) internal view returns (IsEngineCache storage) {
|
|
723
|
+
return s().isEngineCacheConfigs[coreContract];
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
/**
|
|
727
|
+
* @notice Return the storage struct for reading and writing. This library
|
|
728
|
+
* uses a diamond storage pattern when managing storage.
|
|
729
|
+
* @return storageStruct The SetPriceLibStorage struct.
|
|
730
|
+
*/
|
|
731
|
+
function s()
|
|
732
|
+
internal
|
|
733
|
+
pure
|
|
734
|
+
returns (SplitFundsLibStorage storage storageStruct)
|
|
735
|
+
{
|
|
736
|
+
bytes32 position = SPLIT_FUNDS_LIB_STORAGE_POSITION;
|
|
737
|
+
assembly ("memory-safe") {
|
|
738
|
+
storageStruct.slot := position
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
}
|