@artblocks/contracts 1.0.3 → 1.0.4
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 +125 -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 -6
- package/artifacts/contracts/engine/V3/GenArt721CoreV3_Engine_Flex.sol/GenArt721CoreV3_Engine_Flex.json +6 -6
- package/artifacts/contracts/engine/V3/forks/GenArt721CoreV3_Engine_Flex_PROOF.sol/GenArt721CoreV3_Engine_Flex_PROOF.json +4 -4
- 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 -6
- package/artifacts/contracts/engine-registry/CoreRegistryV1.sol/CoreRegistryV1.json +2 -2
- 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 +1 -1
- 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 +3 -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 +86 -1
- 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 +207 -0
- package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterDAExpV0.sol/ISharedMinterDAExpV0.json +93 -0
- package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterDALinV0.sol/ISharedMinterDALinV0.json +93 -0
- package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterDAV0.sol/ISharedMinterDAV0.json +69 -0
- package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterHolderV0.sol/ISharedMinterHolderV0.json +203 -0
- package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterMerkleV0.sol/ISharedMinterMerkleV0.json +123 -0
- package/artifacts/contracts/interfaces/v0.8.x/ISharedMinterSEAV0.sol/ISharedMinterSEAV0.json +261 -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 +533 -0
- package/artifacts/contracts/interfaces/{0.8.x → v0.8.x}/ISharedRandomizerV0.sol/ISharedRandomizerV0.json +42 -26
- 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 +10 -0
- package/artifacts/contracts/libs/v0.8.x/minter-libs/DALinLib.sol/DALinLib.json +10 -0
- package/artifacts/contracts/libs/v0.8.x/minter-libs/MaxInvocationsLib.sol/MaxInvocationsLib.json +10 -0
- package/artifacts/contracts/libs/v0.8.x/minter-libs/MerkleLib.sol/MerkleLib.json +10 -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 +10 -0
- package/artifacts/contracts/libs/v0.8.x/minter-libs/SetPriceLib.sol/SetPriceLib.json +10 -0
- package/artifacts/contracts/libs/v0.8.x/minter-libs/SettlementExpLib.sol/SettlementExpLib.json +10 -0
- package/artifacts/contracts/libs/v0.8.x/minter-libs/SplitFundsLib.sol/SplitFundsLib.json +10 -0
- package/artifacts/contracts/libs/v0.8.x/minter-libs/TokenHolderLib.sol/TokenHolderLib.json +10 -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 +58 -2
- package/artifacts/contracts/minter-suite/Minters/MinterDAExpHolderV5.sol/MinterDAExpHolderV5.json +1228 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDAExpSettlementV2.sol/MinterDAExpSettlementV2.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterDAExpSettlementV3.sol/MinterDAExpSettlementV3.json +1146 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDAExpV4.sol/MinterDAExpV4.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterDAExpV5.sol/MinterDAExpV5.json +909 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDALinHolderV5.sol/MinterDALinHolderV5.json +1228 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDALinV4.sol/MinterDALinV4.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterDALinV5.sol/MinterDALinV5.json +909 -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 +1325 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20V4.sol/MinterSetPriceERC20V4.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20V5.sol/MinterSetPriceERC20V5.json +848 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceHolderV5.sol/MinterSetPriceHolderV5.json +1091 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceMerkleV5.sol/MinterSetPriceMerkleV5.json +1075 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPricePolyptychERC20V5.sol/MinterSetPricePolyptychERC20V5.json +1243 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPricePolyptychV5.sol/MinterSetPricePolyptychV5.json +1167 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceV4.sol/MinterSetPriceV4.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceV5.sol/MinterSetPriceV5.json +772 -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 +4 -4
- 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/ReentrancyMerkleMock.sol/ReentrancyMerkleMock.json +2 -2
- package/artifacts/contracts/mock/ReentrancyMock.sol/ReentrancyMock.json +2 -2
- package/artifacts/contracts/mock/ReentrancySEAMock.sol/ReentrancySEAAutoBidderMock.json +2 -2
- 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 +48 -32
- 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 +216 -107
- 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/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 +29 -14
- package/contracts/engine/V3/GenArt721CoreV3_Engine_Flex.sol +29 -14
- package/contracts/engine/V3/forks/GenArt721CoreV3_Engine_Flex_PROOF.sol +9 -9
- package/contracts/engine/V3/forks/PROHIBITION/AdminACLV0_PROHIBITION.sol +1 -1
- package/contracts/engine/V3/forks/PROHIBITION/GenArt721CoreV3_Engine_Flex_PROHIBITION.sol +20 -15
- 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 +1 -1
- 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}/IDependencyRegistryV0.sol +2 -2
- package/contracts/interfaces/v0.8.x/IGenArt721CoreContractV3WithSharedRandomizer.sol +23 -0
- package/contracts/interfaces/{0.8.x → v0.8.x}/IMinterFilterV1.sol +26 -0
- package/contracts/interfaces/v0.8.x/IRandomizer_V3CoreBase.sol +23 -0
- package/contracts/interfaces/v0.8.x/ISharedMinterDAExpSettlementV0.sol +37 -0
- package/contracts/interfaces/v0.8.x/ISharedMinterDAExpV0.sol +25 -0
- package/contracts/interfaces/v0.8.x/ISharedMinterDALinV0.sol +26 -0
- package/contracts/interfaces/v0.8.x/ISharedMinterDAV0.sol +19 -0
- package/contracts/interfaces/v0.8.x/ISharedMinterHolderV0.sol +69 -0
- package/contracts/interfaces/v0.8.x/ISharedMinterMerkleV0.sol +44 -0
- package/contracts/interfaces/v0.8.x/ISharedMinterSEAV0.sol +78 -0
- package/contracts/interfaces/v0.8.x/ISharedMinterSimplePurchaseV0.sol +28 -0
- package/contracts/interfaces/v0.8.x/ISharedMinterV0.sol +191 -0
- package/contracts/interfaces/{0.8.x → v0.8.x}/ISharedRandomizerV0.sol +42 -24
- 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 +197 -0
- package/contracts/libs/v0.8.x/minter-libs/DAExpLib.sol +125 -0
- package/contracts/libs/v0.8.x/minter-libs/DALinLib.sol +109 -0
- package/contracts/libs/v0.8.x/minter-libs/MaxInvocationsLib.sol +348 -0
- package/contracts/libs/v0.8.x/minter-libs/MerkleLib.sol +175 -0
- package/contracts/libs/v0.8.x/minter-libs/PolyptychLib.sol +160 -0
- package/contracts/libs/v0.8.x/minter-libs/SEALib.sol +320 -0
- package/contracts/libs/v0.8.x/minter-libs/SetPriceLib.sol +44 -0
- package/contracts/libs/v0.8.x/minter-libs/SettlementExpLib.sol +390 -0
- package/contracts/libs/v0.8.x/minter-libs/SplitFundsLib.sol +583 -0
- package/contracts/libs/v0.8.x/minter-libs/TokenHolderLib.sol +153 -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 +83 -9
- package/contracts/minter-suite/Minters/MinterBase_v0_1_1.sol +4 -4
- package/contracts/minter-suite/Minters/MinterDAExpHolderV5.sol +966 -0
- package/contracts/minter-suite/Minters/MinterDAExpSettlementV2.sol +3 -3
- package/contracts/minter-suite/Minters/MinterDAExpSettlementV3.sol +1126 -0
- package/contracts/minter-suite/Minters/MinterDAExpV4.sol +3 -3
- package/contracts/minter-suite/Minters/MinterDAExpV5.sol +606 -0
- package/contracts/minter-suite/Minters/MinterDALinHolderV5.sol +952 -0
- package/contracts/minter-suite/Minters/MinterDALinV4.sol +3 -3
- package/contracts/minter-suite/Minters/MinterDALinV5.sol +591 -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 +1190 -0
- package/contracts/minter-suite/Minters/MinterSetPriceERC20V4.sol +5 -5
- package/contracts/minter-suite/Minters/MinterSetPriceERC20V5.sol +570 -0
- package/contracts/minter-suite/Minters/MinterSetPriceHolderV5.sol +821 -0
- package/contracts/minter-suite/Minters/MinterSetPriceMerkleV5.sol +802 -0
- package/contracts/minter-suite/Minters/MinterSetPricePolyptychERC20V5.sol +1096 -0
- package/contracts/minter-suite/Minters/MinterSetPricePolyptychV5.sol +992 -0
- package/contracts/minter-suite/Minters/MinterSetPriceV4.sol +3 -3
- package/contracts/minter-suite/Minters/MinterSetPriceV5.sol +461 -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 +9 -9
- 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/ReentrancyMerkleMock.sol +1 -1
- package/contracts/mock/ReentrancyMock.sol +1 -1
- package/contracts/mock/ReentrancySEAMock.sol +1 -1
- 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 +91 -76
- package/contracts/royalty-registry/GenArt721RoyaltyOverride.sol +2 -2
- package/contracts/royalty-registry/GenArt721RoyaltyOverride_PBAB.sol +2 -2
- package/package.json +46 -31
- package/LICENSE +0 -165
- package/contracts/interfaces/0.8.x/IRandomizer_V3CoreBase.sol +0 -10
- /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}/ICoreRegistryV1.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}/Bytes32Strings.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,583 @@
|
|
|
1
|
+
// SPDX-License-Identifier: LGPL-3.0-only
|
|
2
|
+
// Created By: Art Blocks Inc.
|
|
3
|
+
|
|
4
|
+
import "../../../interfaces/v0.8.x/IMinterBaseV0.sol";
|
|
5
|
+
import "../../../interfaces/v0.8.x/IGenArt721CoreContractV3_Base.sol";
|
|
6
|
+
import "../../../interfaces/v0.8.x/IGenArt721CoreContractV3.sol";
|
|
7
|
+
import "../../../interfaces/v0.8.x/IGenArt721CoreContractV3_Engine.sol";
|
|
8
|
+
|
|
9
|
+
import "@openzeppelin-4.7/contracts/token/ERC20/IERC20.sol";
|
|
10
|
+
|
|
11
|
+
pragma solidity ^0.8.0;
|
|
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
|
+
// contract-level variables
|
|
24
|
+
struct IsEngineCache {
|
|
25
|
+
bool isEngine;
|
|
26
|
+
bool isCached;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// project-level variables
|
|
30
|
+
struct SplitFundsProjectConfig {
|
|
31
|
+
address currencyAddress; // address(0) if ETH
|
|
32
|
+
string currencySymbol; // Assumed to be ETH if null
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @notice splits ETH funds between sender (if refund), providers,
|
|
37
|
+
* artist, and artist's additional payee for a token purchased on
|
|
38
|
+
* project `_projectId`.
|
|
39
|
+
* WARNING: This function uses msg.value and msg.sender to determine
|
|
40
|
+
* refund amounts, and therefore may not be applicable to all use cases
|
|
41
|
+
* (e.g. do not use with Dutch Auctions with on-chain settlement).
|
|
42
|
+
* @dev This function relies on msg.sender and msg.value, so it must be
|
|
43
|
+
* called directly from the contract that is receiving the payment.
|
|
44
|
+
* @dev possible DoS during splits is acknowledged, and mitigated by
|
|
45
|
+
* business practices, including end-to-end testing on mainnet, and
|
|
46
|
+
* admin-accepted artist payment addresses.
|
|
47
|
+
* @param _projectId Project ID for which funds shall be split.
|
|
48
|
+
* @param _pricePerTokenInWei Current price of token, in Wei.
|
|
49
|
+
* @param _coreContract Address of the GenArt721CoreContract associated
|
|
50
|
+
* with the project.
|
|
51
|
+
* @param _isEngine Whether the core contract is an engine contract.
|
|
52
|
+
*/
|
|
53
|
+
function splitFundsETH(
|
|
54
|
+
uint256 _projectId,
|
|
55
|
+
uint256 _pricePerTokenInWei,
|
|
56
|
+
address _coreContract,
|
|
57
|
+
bool _isEngine
|
|
58
|
+
) internal {
|
|
59
|
+
if (msg.value > 0) {
|
|
60
|
+
bool success_;
|
|
61
|
+
// send refund to sender
|
|
62
|
+
uint256 refund = msg.value - _pricePerTokenInWei;
|
|
63
|
+
if (refund > 0) {
|
|
64
|
+
(success_, ) = msg.sender.call{value: refund}("");
|
|
65
|
+
require(success_, "Refund failed");
|
|
66
|
+
}
|
|
67
|
+
// split revenues
|
|
68
|
+
splitRevenuesETH(
|
|
69
|
+
_projectId,
|
|
70
|
+
_pricePerTokenInWei,
|
|
71
|
+
_coreContract,
|
|
72
|
+
_isEngine
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* @notice Splits ETH revenues between providers, artist, and artist's
|
|
79
|
+
* additional payee for revenue generated by project `_projectId`.
|
|
80
|
+
* @dev possible DoS during splits is acknowledged, and mitigated by
|
|
81
|
+
* business practices, including end-to-end testing on mainnet, and
|
|
82
|
+
* admin-accepted artist payment addresses.
|
|
83
|
+
* @param _projectId Project ID for which funds shall be split.
|
|
84
|
+
* @param _valueInWei Value to be split, in Wei.
|
|
85
|
+
* @param _coreContract Address of the GenArt721CoreContract
|
|
86
|
+
* associated with the project.
|
|
87
|
+
* @param _isEngine Whether the core contract is an engine contract.
|
|
88
|
+
*/
|
|
89
|
+
function splitRevenuesETH(
|
|
90
|
+
uint256 _projectId,
|
|
91
|
+
uint256 _valueInWei,
|
|
92
|
+
address _coreContract,
|
|
93
|
+
bool _isEngine
|
|
94
|
+
) internal {
|
|
95
|
+
if (_valueInWei == 0) {
|
|
96
|
+
return; // return early
|
|
97
|
+
}
|
|
98
|
+
bool success;
|
|
99
|
+
// split funds between platforms, artist, and artist's
|
|
100
|
+
// additional payee
|
|
101
|
+
uint256 renderProviderRevenue_;
|
|
102
|
+
address payable renderProviderAddress_;
|
|
103
|
+
uint256 artistRevenue_;
|
|
104
|
+
address payable artistAddress_;
|
|
105
|
+
uint256 additionalPayeePrimaryRevenue_;
|
|
106
|
+
address payable additionalPayeePrimaryAddress_;
|
|
107
|
+
|
|
108
|
+
if (_isEngine) {
|
|
109
|
+
// get engine splits
|
|
110
|
+
uint256 platformProviderRevenue_;
|
|
111
|
+
address payable platformProviderAddress_;
|
|
112
|
+
(
|
|
113
|
+
renderProviderRevenue_,
|
|
114
|
+
renderProviderAddress_,
|
|
115
|
+
platformProviderRevenue_,
|
|
116
|
+
platformProviderAddress_,
|
|
117
|
+
artistRevenue_,
|
|
118
|
+
artistAddress_,
|
|
119
|
+
additionalPayeePrimaryRevenue_,
|
|
120
|
+
additionalPayeePrimaryAddress_
|
|
121
|
+
) = IGenArt721CoreContractV3_Engine(_coreContract)
|
|
122
|
+
.getPrimaryRevenueSplits(_projectId, _valueInWei);
|
|
123
|
+
// Platform Provider payment (only possible if engine)
|
|
124
|
+
if (platformProviderRevenue_ > 0) {
|
|
125
|
+
(success, ) = platformProviderAddress_.call{
|
|
126
|
+
value: platformProviderRevenue_
|
|
127
|
+
}("");
|
|
128
|
+
require(success, "Platform Provider payment failed");
|
|
129
|
+
}
|
|
130
|
+
} else {
|
|
131
|
+
// get flagship splits
|
|
132
|
+
(
|
|
133
|
+
renderProviderRevenue_, // artblocks revenue
|
|
134
|
+
renderProviderAddress_, // artblocks address
|
|
135
|
+
artistRevenue_,
|
|
136
|
+
artistAddress_,
|
|
137
|
+
additionalPayeePrimaryRevenue_,
|
|
138
|
+
additionalPayeePrimaryAddress_
|
|
139
|
+
) = IGenArt721CoreContractV3(_coreContract).getPrimaryRevenueSplits(
|
|
140
|
+
_projectId,
|
|
141
|
+
_valueInWei
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
// Render Provider / Art Blocks payment
|
|
145
|
+
if (renderProviderRevenue_ > 0) {
|
|
146
|
+
(success, ) = renderProviderAddress_.call{
|
|
147
|
+
value: renderProviderRevenue_
|
|
148
|
+
}("");
|
|
149
|
+
require(success, "Render Provider payment failed");
|
|
150
|
+
}
|
|
151
|
+
// artist payment
|
|
152
|
+
if (artistRevenue_ > 0) {
|
|
153
|
+
(success, ) = artistAddress_.call{value: artistRevenue_}("");
|
|
154
|
+
require(success, "Artist payment failed");
|
|
155
|
+
}
|
|
156
|
+
// additional payee payment
|
|
157
|
+
if (additionalPayeePrimaryRevenue_ > 0) {
|
|
158
|
+
(success, ) = additionalPayeePrimaryAddress_.call{
|
|
159
|
+
value: additionalPayeePrimaryRevenue_
|
|
160
|
+
}("");
|
|
161
|
+
require(success, "Additional Payee payment failed");
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* @notice Splits ERC20 funds between providers, artist, and artist's
|
|
167
|
+
* additional payee, for a token purchased on project `_projectId`.
|
|
168
|
+
* The function performs checks to ensure that the ERC20 token is
|
|
169
|
+
* approved for transfer, and that a non-zero ERC20 token address is
|
|
170
|
+
* configured.
|
|
171
|
+
* @dev This function relies on msg.sender and msg.value, so it must be
|
|
172
|
+
* called directly from the contract that is receiving the payment.
|
|
173
|
+
* @dev possible DoS during splits is acknowledged, and mitigated by
|
|
174
|
+
* business practices, including end-to-end testing on mainnet, and
|
|
175
|
+
* admin-accepted artist payment addresses.
|
|
176
|
+
* @param _splitFundsProjectConfig SplitFundsProjectConfig of the project.
|
|
177
|
+
* @param _projectId Project ID for which funds shall be split.
|
|
178
|
+
* @param _pricePerTokenInWei Current price of token, in Wei.
|
|
179
|
+
* @param _coreContract Core contract address.
|
|
180
|
+
* @param _isEngine Whether the core contract is an engine contract.
|
|
181
|
+
*/
|
|
182
|
+
function splitFundsERC20(
|
|
183
|
+
SplitFundsProjectConfig storage _splitFundsProjectConfig,
|
|
184
|
+
uint256 _projectId,
|
|
185
|
+
uint256 _pricePerTokenInWei,
|
|
186
|
+
address _coreContract,
|
|
187
|
+
bool _isEngine
|
|
188
|
+
) internal {
|
|
189
|
+
if (_pricePerTokenInWei == 0) {
|
|
190
|
+
return; // nothing to split, return early
|
|
191
|
+
}
|
|
192
|
+
address currencyAddress = _splitFundsProjectConfig.currencyAddress;
|
|
193
|
+
require(currencyAddress != address(0), "ERC20: payment not configured");
|
|
194
|
+
require(msg.value == 0, "ERC20: No ETH when using ERC20");
|
|
195
|
+
// ERC20 token is used for payment
|
|
196
|
+
validateERC20Approvals({
|
|
197
|
+
_msgSender: msg.sender,
|
|
198
|
+
_currencyAddress: currencyAddress,
|
|
199
|
+
_pricePerTokenInWei: _pricePerTokenInWei
|
|
200
|
+
});
|
|
201
|
+
IERC20 _projectCurrency = IERC20(currencyAddress);
|
|
202
|
+
// split remaining funds between foundation, artist, and artist's
|
|
203
|
+
// additional payee
|
|
204
|
+
uint256 renderProviderRevenue_;
|
|
205
|
+
address payable renderProviderAddress_;
|
|
206
|
+
uint256 artistRevenue_;
|
|
207
|
+
address payable artistAddress_;
|
|
208
|
+
uint256 additionalPayeePrimaryRevenue_;
|
|
209
|
+
address payable additionalPayeePrimaryAddress_;
|
|
210
|
+
|
|
211
|
+
if (_isEngine) {
|
|
212
|
+
// get engine splits
|
|
213
|
+
uint256 platformProviderRevenue_;
|
|
214
|
+
address payable platformProviderAddress_;
|
|
215
|
+
(
|
|
216
|
+
renderProviderRevenue_,
|
|
217
|
+
renderProviderAddress_,
|
|
218
|
+
platformProviderRevenue_,
|
|
219
|
+
platformProviderAddress_,
|
|
220
|
+
artistRevenue_,
|
|
221
|
+
artistAddress_,
|
|
222
|
+
additionalPayeePrimaryRevenue_,
|
|
223
|
+
additionalPayeePrimaryAddress_
|
|
224
|
+
) = IGenArt721CoreContractV3_Engine(_coreContract)
|
|
225
|
+
.getPrimaryRevenueSplits(_projectId, _pricePerTokenInWei);
|
|
226
|
+
// Platform Provider payment (only possible if engine)
|
|
227
|
+
if (platformProviderRevenue_ > 0) {
|
|
228
|
+
require(
|
|
229
|
+
_projectCurrency.transferFrom(
|
|
230
|
+
msg.sender,
|
|
231
|
+
platformProviderAddress_,
|
|
232
|
+
platformProviderRevenue_
|
|
233
|
+
),
|
|
234
|
+
"Platform Provider payment failed"
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
} else {
|
|
238
|
+
// get flagship splits
|
|
239
|
+
(
|
|
240
|
+
renderProviderRevenue_, // artblocks revenue
|
|
241
|
+
renderProviderAddress_, // artblocks address
|
|
242
|
+
artistRevenue_,
|
|
243
|
+
artistAddress_,
|
|
244
|
+
additionalPayeePrimaryRevenue_,
|
|
245
|
+
additionalPayeePrimaryAddress_
|
|
246
|
+
) = IGenArt721CoreContractV3(_coreContract).getPrimaryRevenueSplits(
|
|
247
|
+
_projectId,
|
|
248
|
+
_pricePerTokenInWei
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
// Art Blocks payment
|
|
252
|
+
if (renderProviderRevenue_ > 0) {
|
|
253
|
+
require(
|
|
254
|
+
_projectCurrency.transferFrom(
|
|
255
|
+
msg.sender,
|
|
256
|
+
renderProviderAddress_,
|
|
257
|
+
renderProviderRevenue_
|
|
258
|
+
),
|
|
259
|
+
"Render Provider payment failed"
|
|
260
|
+
);
|
|
261
|
+
}
|
|
262
|
+
// artist payment
|
|
263
|
+
if (artistRevenue_ > 0) {
|
|
264
|
+
require(
|
|
265
|
+
_projectCurrency.transferFrom(
|
|
266
|
+
msg.sender,
|
|
267
|
+
artistAddress_,
|
|
268
|
+
artistRevenue_
|
|
269
|
+
),
|
|
270
|
+
"Artist payment failed"
|
|
271
|
+
);
|
|
272
|
+
}
|
|
273
|
+
// additional payee payment
|
|
274
|
+
if (additionalPayeePrimaryRevenue_ > 0) {
|
|
275
|
+
// @dev some ERC20 may not revert on transfer failure, so we
|
|
276
|
+
// check the return value
|
|
277
|
+
require(
|
|
278
|
+
_projectCurrency.transferFrom(
|
|
279
|
+
msg.sender,
|
|
280
|
+
additionalPayeePrimaryAddress_,
|
|
281
|
+
additionalPayeePrimaryRevenue_
|
|
282
|
+
),
|
|
283
|
+
"Additional Payee payment failed"
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* @notice Updates payment currency of the referenced
|
|
290
|
+
* SplitFundsProjectConfig to be `_currencySymbol` at address
|
|
291
|
+
* `_currencyAddress`.
|
|
292
|
+
* Only supports setting currency info of ERC20 tokens.
|
|
293
|
+
* @dev artist-defined currency symbol is used instead of any on-chain
|
|
294
|
+
* currency symbol.
|
|
295
|
+
* @param _splitFundsProjectConfig SplitFundsProjectConfig to update.
|
|
296
|
+
* @param _currencySymbol Currency symbol.
|
|
297
|
+
* @param _currencyAddress Currency address.
|
|
298
|
+
*/
|
|
299
|
+
function updateProjectCurrencyInfoERC20(
|
|
300
|
+
SplitFundsProjectConfig storage _splitFundsProjectConfig,
|
|
301
|
+
string memory _currencySymbol,
|
|
302
|
+
address _currencyAddress
|
|
303
|
+
) internal {
|
|
304
|
+
// CHECKS
|
|
305
|
+
require(_currencyAddress != address(0), "null address, only ERC20");
|
|
306
|
+
require(bytes(_currencySymbol).length > 0, "only non-null symbol");
|
|
307
|
+
// EFFECTS
|
|
308
|
+
_splitFundsProjectConfig.currencySymbol = _currencySymbol;
|
|
309
|
+
_splitFundsProjectConfig.currencyAddress = _currencyAddress;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* @notice Force sends `amount` (in wei) ETH to `to`, with a gas stipend
|
|
314
|
+
* equal to `minterRefundGasLimit`.
|
|
315
|
+
* If sending via the normal procedure fails, force sends the ETH by
|
|
316
|
+
* creating a temporary contract which uses `SELFDESTRUCT` to force send
|
|
317
|
+
* the ETH.
|
|
318
|
+
* Reverts if the current contract has insufficient balance.
|
|
319
|
+
* @param _to The address to send ETH to.
|
|
320
|
+
* @param _amount The amount of ETH to send.
|
|
321
|
+
* @dev This function is adapted from the `forceSafeTransferETH` function
|
|
322
|
+
* in the `https://github.com/Vectorized/solady` repository, with
|
|
323
|
+
* modifications to not check if the current contract has sufficient
|
|
324
|
+
* balance. Therefore, the contract should be checked for sufficient
|
|
325
|
+
* balance before calling this function in the minter itself, if
|
|
326
|
+
* applicable.
|
|
327
|
+
*/
|
|
328
|
+
function forceSafeTransferETH(
|
|
329
|
+
address _to,
|
|
330
|
+
uint256 _amount,
|
|
331
|
+
uint256 _minterRefundGasLimit
|
|
332
|
+
) internal {
|
|
333
|
+
// Manually inlined because the compiler doesn't inline functions with
|
|
334
|
+
// branches.
|
|
335
|
+
/// @solidity memory-safe-assembly
|
|
336
|
+
assembly {
|
|
337
|
+
// @dev intentionally do not check if this contract has sufficient
|
|
338
|
+
// balance, because that is not intended to be a valid state.
|
|
339
|
+
|
|
340
|
+
// Transfer the ETH and check if it succeeded or not.
|
|
341
|
+
if iszero(call(_minterRefundGasLimit, _to, _amount, 0, 0, 0, 0)) {
|
|
342
|
+
// if the transfer failed, we create a temporary contract with
|
|
343
|
+
// initialization code that uses `SELFDESTRUCT` to force send
|
|
344
|
+
// the ETH.
|
|
345
|
+
// note: Compatible with `SENDALL`:
|
|
346
|
+
// https://eips.ethereum.org/EIPS/eip-4758
|
|
347
|
+
|
|
348
|
+
//---------------------------------------------------------------------------------------------------------------//
|
|
349
|
+
// Opcode | Opcode + Arguments | Description | Stack View //
|
|
350
|
+
//---------------------------------------------------------------------------------------------------------------//
|
|
351
|
+
// Contract creation code that uses `SELFDESTRUCT` to force send ETH to a specified address. //
|
|
352
|
+
// Creation code summary: 0x73<20-byte toAddress>0xff //
|
|
353
|
+
//---------------------------------------------------------------------------------------------------------------//
|
|
354
|
+
// 0x73 | 0x73_toAddress | PUSH20 toAddress | toAddress //
|
|
355
|
+
// 0xFF | 0xFF | SELFDESTRUCT | //
|
|
356
|
+
//---------------------------------------------------------------------------------------------------------------//
|
|
357
|
+
// Store the address in scratch space, starting at 0x00, which begins the 20-byte address at 32-20=12 in memory
|
|
358
|
+
// @dev use scratch space because we have enough space for simple creation code (less than 0x40 bytes)
|
|
359
|
+
mstore(0x00, _to)
|
|
360
|
+
// store opcode PUSH20 immediately before the address, starting at 0x0b (11) in memory
|
|
361
|
+
mstore8(0x0b, 0x73)
|
|
362
|
+
// store opcode SELFDESTRUCT immediately after the address, starting at 0x20 (32) in memory
|
|
363
|
+
mstore8(0x20, 0xff)
|
|
364
|
+
// this will always succeed because the contract creation code is
|
|
365
|
+
// valid, and the address is valid because it is a 20-byte value
|
|
366
|
+
if iszero(create(_amount, 0x0b, 0x16)) {
|
|
367
|
+
// @dev For better gas estimation.
|
|
368
|
+
if iszero(gt(gas(), 1000000)) {
|
|
369
|
+
revert(0, 0)
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
/**
|
|
377
|
+
* @notice Returns whether or not the provided address `_coreContract`
|
|
378
|
+
* is an Art Blocks Engine core contract. Caches the result for future access.
|
|
379
|
+
* @param _coreContract Address of the core contract to check.
|
|
380
|
+
* @param _isEngineCache The storage pointer to the project's
|
|
381
|
+
* SplitFundsProjectConfig struct.
|
|
382
|
+
*/
|
|
383
|
+
function isEngine(
|
|
384
|
+
address _coreContract,
|
|
385
|
+
IsEngineCache storage _isEngineCache
|
|
386
|
+
) internal returns (bool) {
|
|
387
|
+
if (_isEngineCache.isCached) {
|
|
388
|
+
return _isEngineCache.isEngine;
|
|
389
|
+
} else {
|
|
390
|
+
bool _isEngine = getV3CoreIsEngine(_coreContract, _isEngineCache);
|
|
391
|
+
return _isEngine;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/**
|
|
396
|
+
* @notice Returns whether a V3 core contract is an Art Blocks Engine
|
|
397
|
+
* contract or not. Return value of false indicates that the core is a
|
|
398
|
+
* flagship contract. This function does not update the cache state for the
|
|
399
|
+
* given V3 core contract.
|
|
400
|
+
* @dev this function reverts if a core contract does not return the
|
|
401
|
+
* expected number of return values from getPrimaryRevenueSplits() for
|
|
402
|
+
* either a flagship or engine core contract.
|
|
403
|
+
* @dev this function uses the length of the return data (in bytes) to
|
|
404
|
+
* determine whether the core is an engine or not.
|
|
405
|
+
* @param _coreContract The address of the deployed core contract.
|
|
406
|
+
*/
|
|
407
|
+
function getV3CoreIsEngineView(
|
|
408
|
+
address _coreContract
|
|
409
|
+
) internal view returns (bool) {
|
|
410
|
+
// call getPrimaryRevenueSplits() on core contract
|
|
411
|
+
bytes memory payload = abi.encodeWithSignature(
|
|
412
|
+
"getPrimaryRevenueSplits(uint256,uint256)",
|
|
413
|
+
0,
|
|
414
|
+
0
|
|
415
|
+
);
|
|
416
|
+
(bool success, bytes memory returnData) = _coreContract.staticcall(
|
|
417
|
+
payload
|
|
418
|
+
);
|
|
419
|
+
require(success, "getPrimaryRevenueSplits() call failed");
|
|
420
|
+
// determine whether core is engine or not, based on return data length
|
|
421
|
+
uint256 returnDataLength = returnData.length;
|
|
422
|
+
if (returnDataLength == 6 * 32) {
|
|
423
|
+
// 6 32-byte words returned if flagship (not engine)
|
|
424
|
+
// @dev 6 32-byte words are expected because the non-engine core
|
|
425
|
+
// contracts return a payout address and uint256 payment value for
|
|
426
|
+
// the artist, and artist's additional payee, and Art Blocks.
|
|
427
|
+
// also note that per Solidity ABI encoding, the address return
|
|
428
|
+
// values are padded to 32 bytes.
|
|
429
|
+
|
|
430
|
+
return false;
|
|
431
|
+
} else if (returnDataLength == 8 * 32) {
|
|
432
|
+
// 8 32-byte words returned if engine
|
|
433
|
+
// @dev 8 32-byte words are expected because the engine core
|
|
434
|
+
// contracts return a payout address and uint256 payment value for
|
|
435
|
+
// the artist, artist's additional payee, render provider
|
|
436
|
+
// typically Art Blocks, and platform provider (partner).
|
|
437
|
+
// also note that per Solidity ABI encoding, the address return
|
|
438
|
+
// values are padded to 32 bytes.
|
|
439
|
+
return true;
|
|
440
|
+
} else {
|
|
441
|
+
// unexpected return value length
|
|
442
|
+
revert("Unexpected revenue split bytes");
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* Gets the currency address and symbol for the referenced
|
|
448
|
+
* SplitFundsProjectConfig.
|
|
449
|
+
* Only supports ERC20 tokens - returns currencySymbol of `UNCONFIG` if
|
|
450
|
+
* `currencyAddress` is zero.
|
|
451
|
+
* @param _splitFundsProjectConfig SplitFundsProjectConfig to read
|
|
452
|
+
* @return currencyAddress
|
|
453
|
+
* @return currencySymbol
|
|
454
|
+
*/
|
|
455
|
+
function getCurrencyInfoERC20(
|
|
456
|
+
SplitFundsProjectConfig storage _splitFundsProjectConfig
|
|
457
|
+
)
|
|
458
|
+
internal
|
|
459
|
+
view
|
|
460
|
+
returns (address currencyAddress, string memory currencySymbol)
|
|
461
|
+
{
|
|
462
|
+
currencyAddress = _splitFundsProjectConfig.currencyAddress;
|
|
463
|
+
// default to "UNCONFIG" if project currency address is initial value
|
|
464
|
+
currencySymbol = currencyAddress == address(0)
|
|
465
|
+
? "UNCONFIG"
|
|
466
|
+
: _splitFundsProjectConfig.currencySymbol;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
/**
|
|
470
|
+
* Get the balance of `_currencyAddress` ERC20 tokens for `_walletAddress`.
|
|
471
|
+
* @param _currencyAddress ERC20 token address.
|
|
472
|
+
* @param _walletAddress wallet address.
|
|
473
|
+
* @return balance
|
|
474
|
+
*/
|
|
475
|
+
function getERC20Balance(
|
|
476
|
+
address _currencyAddress,
|
|
477
|
+
address _walletAddress
|
|
478
|
+
) internal view returns (uint256) {
|
|
479
|
+
return IERC20(_currencyAddress).balanceOf(_walletAddress);
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
/**
|
|
483
|
+
* Gets the allowance of `_spenderAddress` to spend `_walletAddress`'s
|
|
484
|
+
* `_currencyAddress` ERC20 tokens.
|
|
485
|
+
* @param _currencyAddress ERC20 token address.
|
|
486
|
+
* @param _walletAddress wallet address.
|
|
487
|
+
* @param _spenderAddress spender address.
|
|
488
|
+
* @return allowance
|
|
489
|
+
*/
|
|
490
|
+
function getERC20Allowance(
|
|
491
|
+
address _currencyAddress,
|
|
492
|
+
address _walletAddress,
|
|
493
|
+
address _spenderAddress
|
|
494
|
+
) internal view returns (uint256 allowance) {
|
|
495
|
+
allowance = IERC20(_currencyAddress).allowance(
|
|
496
|
+
_walletAddress,
|
|
497
|
+
_spenderAddress
|
|
498
|
+
);
|
|
499
|
+
return allowance;
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
/**
|
|
503
|
+
* @notice Returns whether a V3 core contract is an Art Blocks Engine
|
|
504
|
+
* contract or not. Return value of false indicates that the core is a
|
|
505
|
+
* flagship contract. If this function resolves without reverting, it also
|
|
506
|
+
* updates the cache state for the given V3 core contract.
|
|
507
|
+
* @dev this function reverts if a core contract does not return the
|
|
508
|
+
* expected number of return values from getPrimaryRevenueSplits() for
|
|
509
|
+
* either a flagship or engine core contract.
|
|
510
|
+
* @dev this function uses the length of the return data (in bytes) to
|
|
511
|
+
* determine whether the core is an engine or not.
|
|
512
|
+
* @param _coreContract The address of the deployed core contract.
|
|
513
|
+
* @param _isEngineCache The storage pointer to the project's
|
|
514
|
+
* IsEngineCache struct.
|
|
515
|
+
*/
|
|
516
|
+
function getV3CoreIsEngine(
|
|
517
|
+
address _coreContract,
|
|
518
|
+
IsEngineCache storage _isEngineCache
|
|
519
|
+
) private returns (bool) {
|
|
520
|
+
// call getPrimaryRevenueSplits() on core contract
|
|
521
|
+
bytes memory payload = abi.encodeWithSignature(
|
|
522
|
+
"getPrimaryRevenueSplits(uint256,uint256)",
|
|
523
|
+
0,
|
|
524
|
+
0
|
|
525
|
+
);
|
|
526
|
+
(bool success, bytes memory returnData) = _coreContract.call(payload);
|
|
527
|
+
require(success, "getPrimaryRevenueSplits() call failed");
|
|
528
|
+
// determine whether core is engine or not, based on return data length
|
|
529
|
+
uint256 returnDataLength = returnData.length;
|
|
530
|
+
if (returnDataLength == 6 * 32) {
|
|
531
|
+
// 6 32-byte words returned if flagship (not engine)
|
|
532
|
+
// @dev 6 32-byte words are expected because the non-engine core
|
|
533
|
+
// contracts return a payout address and uint256 payment value for
|
|
534
|
+
// the artist, and artist's additional payee, and Art Blocks.
|
|
535
|
+
// also note that per Solidity ABI encoding, the address return
|
|
536
|
+
// values are padded to 32 bytes.
|
|
537
|
+
_isEngineCache.isCached = true;
|
|
538
|
+
_isEngineCache.isEngine = false;
|
|
539
|
+
return false;
|
|
540
|
+
} else if (returnDataLength == 8 * 32) {
|
|
541
|
+
// 8 32-byte words returned if engine
|
|
542
|
+
// @dev 8 32-byte words are expected because the engine core
|
|
543
|
+
// contracts return a payout address and uint256 payment value for
|
|
544
|
+
// the artist, artist's additional payee, render provider
|
|
545
|
+
// typically Art Blocks, and platform provider (partner).
|
|
546
|
+
// also note that per Solidity ABI encoding, the address return
|
|
547
|
+
// values are padded to 32 bytes.
|
|
548
|
+
_isEngineCache.isCached = true;
|
|
549
|
+
_isEngineCache.isEngine = true;
|
|
550
|
+
return true;
|
|
551
|
+
} else {
|
|
552
|
+
// unexpected return value length
|
|
553
|
+
revert("Unexpected revenue split bytes");
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
/**
|
|
558
|
+
* Validate that `_msgSender` has approved the contract to spend at least
|
|
559
|
+
* `_pricePerTokenInWei` of `_currencyAddress` ERC20 tokens, and that
|
|
560
|
+
* `_msgSender` has a balance of at least `_pricePerTokenInWei` of
|
|
561
|
+
* `_currencyAddress` ERC20 tokens.
|
|
562
|
+
* Reverts if insufficient allowance or balance.
|
|
563
|
+
* @param _msgSender Address of the message sender to validate.
|
|
564
|
+
* @param _currencyAddress Address of the ERC20 token to validate.
|
|
565
|
+
* @param _pricePerTokenInWei Price per token in wei to validate.
|
|
566
|
+
*/
|
|
567
|
+
function validateERC20Approvals(
|
|
568
|
+
address _msgSender,
|
|
569
|
+
address _currencyAddress,
|
|
570
|
+
uint256 _pricePerTokenInWei
|
|
571
|
+
) private view {
|
|
572
|
+
require(
|
|
573
|
+
IERC20(_currencyAddress).allowance(_msgSender, address(this)) >=
|
|
574
|
+
_pricePerTokenInWei,
|
|
575
|
+
"Insufficient ERC20 allowance"
|
|
576
|
+
);
|
|
577
|
+
require(
|
|
578
|
+
IERC20(_currencyAddress).balanceOf(_msgSender) >=
|
|
579
|
+
_pricePerTokenInWei,
|
|
580
|
+
"Insufficient ERC20 balance"
|
|
581
|
+
);
|
|
582
|
+
}
|
|
583
|
+
}
|