@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,770 @@
|
|
|
1
|
+
// SPDX-License-Identifier: LGPL-3.0-only
|
|
2
|
+
// Created By: Art Blocks Inc.
|
|
3
|
+
|
|
4
|
+
pragma solidity ^0.8.0;
|
|
5
|
+
|
|
6
|
+
import {MaxInvocationsLib} from "./MaxInvocationsLib.sol";
|
|
7
|
+
import {DAExpLib} from "./DAExpLib.sol";
|
|
8
|
+
import {SplitFundsLib} from "./SplitFundsLib.sol";
|
|
9
|
+
import {AuthLib} from "../AuthLib.sol";
|
|
10
|
+
import {GenericMinterEventsLib} from "./GenericMinterEventsLib.sol";
|
|
11
|
+
|
|
12
|
+
import {SafeCast} from "@openzeppelin-4.7/contracts/utils/math/SafeCast.sol";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @title Art Blocks Settlement Library for Exponential Auctions
|
|
16
|
+
* @notice This library manages the settlement logic for Art Blocks settlement
|
|
17
|
+
* minters. It provides functionality for managing a project's settlement state
|
|
18
|
+
* via the SettlementAuctionProjectConfig struct, and managing an individual's
|
|
19
|
+
* settlement state on a given project via the Receipt struct.
|
|
20
|
+
* @author Art Blocks Inc.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
library SettlementExpLib {
|
|
24
|
+
using SafeCast for uint256;
|
|
25
|
+
/**
|
|
26
|
+
* @notice Receipt updated event. Emitted when a receipt is updated.
|
|
27
|
+
* @param purchaser purchaser address of updated receipt
|
|
28
|
+
* @param projectId project ID of updated receipt
|
|
29
|
+
* @param coreContract core contract address of updated receipt
|
|
30
|
+
* @param numPurchased new number of tokens purchased on project
|
|
31
|
+
* @param netPosted new net funds posted on project
|
|
32
|
+
*/
|
|
33
|
+
event ReceiptUpdated(
|
|
34
|
+
address indexed purchaser,
|
|
35
|
+
uint256 indexed projectId,
|
|
36
|
+
address indexed coreContract,
|
|
37
|
+
uint24 numPurchased,
|
|
38
|
+
uint256 netPosted
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
// position of Settlement Exp Lib storage, using a diamond storage pattern
|
|
42
|
+
// for this library
|
|
43
|
+
bytes32 constant SETTLEMENT_EXP_LIB_STORAGE_POSITION =
|
|
44
|
+
keccak256("settlementExpLib.storage");
|
|
45
|
+
|
|
46
|
+
bytes32 internal constant CONFIG_CURRENT_SETTLED_PRICE =
|
|
47
|
+
"currentSettledPrice";
|
|
48
|
+
bytes32 internal constant CONFIG_AUCTION_REVENUES_COLLECTED =
|
|
49
|
+
"auctionRevenuesCollected";
|
|
50
|
+
|
|
51
|
+
// The SettlementAuctionProjectConfig struct tracks the state of a project's
|
|
52
|
+
// settlement auction. It tracks the number of tokens minted that have
|
|
53
|
+
// potential of future settlement, the latest purchase price of a token on
|
|
54
|
+
// the project, and whether or not the auction's revenues have been
|
|
55
|
+
// collected.
|
|
56
|
+
struct SettlementAuctionProjectConfig {
|
|
57
|
+
// set to true only after artist + admin revenues have been collected
|
|
58
|
+
bool auctionRevenuesCollected;
|
|
59
|
+
// number of tokens minted that have potential of future settlement.
|
|
60
|
+
// @dev max uint24 > 16.7 million tokens > 1 million tokens/project max
|
|
61
|
+
uint24 numSettleableInvocations;
|
|
62
|
+
// When non-zero, this value is used as a reference when an auction is
|
|
63
|
+
// reset by admin, and then a new auction is configured by an artist.
|
|
64
|
+
// In that case, the new auction will be required to have a starting
|
|
65
|
+
// price less than or equal to this value, if one or more purchases
|
|
66
|
+
// have been made on this minter.
|
|
67
|
+
// @dev max uint88 ~= 3e26 Wei = ~300 million ETH, which is well above
|
|
68
|
+
// the expected prices of any NFT mint in the foreseeable future.
|
|
69
|
+
// This enables struct packing.
|
|
70
|
+
uint88 latestPurchasePrice;
|
|
71
|
+
// Track per-project fund balance, in wei. This is used as a redundant
|
|
72
|
+
// backstop to prevent one project from draining the minter's balance
|
|
73
|
+
// of ETH from other projects, which is a worthwhile failsafe on this
|
|
74
|
+
// shared minter.
|
|
75
|
+
// @dev max uint88 ~= 3e26 Wei = ~300 million ETH, which is well above
|
|
76
|
+
// the expected revenues for a single auction.
|
|
77
|
+
// This enables struct packing.
|
|
78
|
+
uint88 projectBalance;
|
|
79
|
+
// field to store the number of purchases that have been made on the
|
|
80
|
+
// project, on this minter. This is used to track if unexpected mints
|
|
81
|
+
// from sources other than this minter occur during an auction.
|
|
82
|
+
// @dev max uint24 allows for > max project supply of 1 million tokens
|
|
83
|
+
// @dev important to pack this field with other fields updated during a
|
|
84
|
+
// purchase, for gas efficiency
|
|
85
|
+
uint24 numPurchasesOnMinter;
|
|
86
|
+
// The number of tokens to be auctioned for the project on this minter.
|
|
87
|
+
// This is defined as the number of invocations remaining at the time
|
|
88
|
+
// of a project's first mint.
|
|
89
|
+
uint24 numTokensToBeAuctioned;
|
|
90
|
+
// --- @dev end of storage slot ---
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// The Receipt struct tracks the state of a user's settlement on a given
|
|
94
|
+
// project. It tracks the total funds posted by the user on the project
|
|
95
|
+
// and the number of tokens purchased by the user on the project.
|
|
96
|
+
struct Receipt {
|
|
97
|
+
// max uint232 allows for > 1e51 ETH (much more than max supply)
|
|
98
|
+
uint232 netPosted;
|
|
99
|
+
// max uint24 still allows for > max project supply of 1 million tokens
|
|
100
|
+
uint24 numPurchased;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Diamond storage pattern is used in this library
|
|
104
|
+
struct SettlementExpLibStorage {
|
|
105
|
+
mapping(address coreContract => mapping(uint256 projectId => SettlementAuctionProjectConfig)) settlementAuctionProjectConfigs;
|
|
106
|
+
mapping(address walletAddress => mapping(address coreContract => mapping(uint256 projectId => Receipt))) receipts;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* @notice This function updates the _receipt to include `msg.value` and increments
|
|
111
|
+
* the number of tokens purchased by 1. It then checks that the updated
|
|
112
|
+
* receipt is valid (i.e. sufficient funds have been posted for the
|
|
113
|
+
* number of tokens purchased on the updated receipt), and reverts if not.
|
|
114
|
+
* The new receipt net posted and num purchased are then returned to make
|
|
115
|
+
* the values available in a gas-efficient manner to the caller of this
|
|
116
|
+
* function.
|
|
117
|
+
* @param walletAddress Address of user to update receipt for
|
|
118
|
+
* @param projectId Project ID to update receipt for
|
|
119
|
+
* @param coreContract Core contract address
|
|
120
|
+
* @param currentPriceInWei current price of token in Wei
|
|
121
|
+
* @return netPosted total funds posted by user on project (that have not
|
|
122
|
+
* been yet settled), including the current transaction
|
|
123
|
+
* @return numPurchased total number of tokens purchased by user on
|
|
124
|
+
* project, including the current transaction
|
|
125
|
+
*/
|
|
126
|
+
function _validateReceiptEffects(
|
|
127
|
+
address walletAddress,
|
|
128
|
+
uint256 projectId,
|
|
129
|
+
address coreContract,
|
|
130
|
+
uint256 currentPriceInWei
|
|
131
|
+
) private returns (uint232 netPosted, uint24 numPurchased) {
|
|
132
|
+
Receipt storage receipt = getReceipt({
|
|
133
|
+
walletAddress: walletAddress,
|
|
134
|
+
projectId: projectId,
|
|
135
|
+
coreContract: coreContract
|
|
136
|
+
});
|
|
137
|
+
// in memory copy + update
|
|
138
|
+
netPosted = (receipt.netPosted + msg.value).toUint232();
|
|
139
|
+
numPurchased = receipt.numPurchased + 1;
|
|
140
|
+
|
|
141
|
+
// require sufficient payment on project
|
|
142
|
+
require(
|
|
143
|
+
netPosted >= numPurchased * currentPriceInWei,
|
|
144
|
+
"Min value to mint req."
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
// update Receipt in storage
|
|
148
|
+
receipt.netPosted = netPosted;
|
|
149
|
+
receipt.numPurchased = numPurchased;
|
|
150
|
+
|
|
151
|
+
// emit event indicating new receipt state
|
|
152
|
+
emit ReceiptUpdated({
|
|
153
|
+
purchaser: msg.sender,
|
|
154
|
+
projectId: projectId,
|
|
155
|
+
coreContract: coreContract,
|
|
156
|
+
numPurchased: numPurchased,
|
|
157
|
+
netPosted: netPosted
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* @notice Distributes the net revenues from the project's auction, and
|
|
163
|
+
* marks the auction as having had its revenues collected.
|
|
164
|
+
* IMPORTANT - this affects state and distributes revenue funds, so it
|
|
165
|
+
* performs all three of CHECKS, EFFECTS and INTERACTIONS.
|
|
166
|
+
* This function updates a project's balance to reflect the amount of
|
|
167
|
+
* revenues distributed, and will revert if underflow occurs.
|
|
168
|
+
* @param projectId Project ID to get revenues for
|
|
169
|
+
* @param coreContract Core contract address
|
|
170
|
+
*/
|
|
171
|
+
function distributeArtistAndAdminRevenues(
|
|
172
|
+
uint256 projectId,
|
|
173
|
+
address coreContract
|
|
174
|
+
) internal {
|
|
175
|
+
// load the project's settlement auction config
|
|
176
|
+
SettlementAuctionProjectConfig
|
|
177
|
+
storage settlementAuctionProjectConfig = getSettlementAuctionProjectConfig({
|
|
178
|
+
projectId: projectId,
|
|
179
|
+
coreContract: coreContract
|
|
180
|
+
});
|
|
181
|
+
// require revenues to not have already been collected
|
|
182
|
+
require(
|
|
183
|
+
!settlementAuctionProjectConfig.auctionRevenuesCollected,
|
|
184
|
+
"Revenues already collected"
|
|
185
|
+
);
|
|
186
|
+
// refresh max invocations, updating any local values that are
|
|
187
|
+
// illogical with respect to the current core contract state, and
|
|
188
|
+
// ensuring that local maxHasBeenInvoked is accurate.
|
|
189
|
+
MaxInvocationsLib.refreshMaxInvocations({
|
|
190
|
+
projectId: projectId,
|
|
191
|
+
coreContract: coreContract
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
// get the current net price of the auction - reverts if no auction
|
|
195
|
+
// is configured.
|
|
196
|
+
// @dev we use _getPriceUnsafe here, since we just safely synced the
|
|
197
|
+
// project's max invocations and maxHasBeenInvoked, which guarantees
|
|
198
|
+
// an accurate price calculation from _getPriceUnsafe, while being
|
|
199
|
+
// more gas efficient than getPriceSafe.
|
|
200
|
+
// @dev price is guaranteed <= _projectConfig.latestPurchasePrice,
|
|
201
|
+
// since this minter enforces monotonically decreasing purchase prices.
|
|
202
|
+
// @dev we can trust maxHasBeenInvoked, since we just
|
|
203
|
+
// refreshed it above with refreshMaxInvocations, preventing any
|
|
204
|
+
// false negatives
|
|
205
|
+
bool maxHasBeenInvoked = MaxInvocationsLib.getMaxHasBeenInvoked({
|
|
206
|
+
projectId: projectId,
|
|
207
|
+
coreContract: coreContract
|
|
208
|
+
});
|
|
209
|
+
uint256 price = getPriceUnsafe({
|
|
210
|
+
projectId: projectId,
|
|
211
|
+
coreContract: coreContract,
|
|
212
|
+
maxHasBeenInvoked: maxHasBeenInvoked
|
|
213
|
+
});
|
|
214
|
+
// if the price is not base price, require that the auction have
|
|
215
|
+
// reached max invocations. This prevents premature withdrawl
|
|
216
|
+
// before final auction price is possible to know.
|
|
217
|
+
uint256 basePrice = DAExpLib.getAuctionBasePrice({
|
|
218
|
+
projectId: projectId,
|
|
219
|
+
coreContract: coreContract
|
|
220
|
+
});
|
|
221
|
+
if (price != basePrice) {
|
|
222
|
+
require(maxHasBeenInvoked, "Active auction not yet sold out");
|
|
223
|
+
// if max has been invoked, but all tokens to be auctioned were not
|
|
224
|
+
// sold, nonstandard activity has been detected (e.g. project max
|
|
225
|
+
// invocations were reduced on core contract after initial
|
|
226
|
+
// purchase, purchases were made on a different minter after
|
|
227
|
+
// initial purchase, etc.), which could artifically inflate
|
|
228
|
+
// sellout price and harm purchasers. In that case, we should
|
|
229
|
+
// not revert (since max invocations have been reached), but we
|
|
230
|
+
// should require admin to be the caller of this function.
|
|
231
|
+
// This provides separation of powers to protect collectors who
|
|
232
|
+
// participated in the auction.
|
|
233
|
+
// Note that if admin determines the artist has been malicious,
|
|
234
|
+
// admin should replace artist address with a wallet controlled by
|
|
235
|
+
// admin on the core contract, update payee address on the core,
|
|
236
|
+
// collect revenues using this function, then distribute any
|
|
237
|
+
// additional settlement funds to purchasers at admin's discretion.
|
|
238
|
+
if (
|
|
239
|
+
!_allTokensToBeAuctionedWereSold(settlementAuctionProjectConfig)
|
|
240
|
+
) {
|
|
241
|
+
AuthLib.onlyCoreAdminACL({
|
|
242
|
+
coreContract: coreContract,
|
|
243
|
+
sender: msg.sender,
|
|
244
|
+
contract_: address(this),
|
|
245
|
+
selector: bytes4(
|
|
246
|
+
keccak256(
|
|
247
|
+
"distributeArtistAndAdminRevenues(uint256,address)"
|
|
248
|
+
)
|
|
249
|
+
)
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
} else {
|
|
253
|
+
// base price of zero indicates that the auction has not been configured,
|
|
254
|
+
// since base price of zero is not allowed when configuring an auction.
|
|
255
|
+
// @dev no coverage else branch of following line because redundant
|
|
256
|
+
require(basePrice > 0, "Only latestPurchasePrice > 0");
|
|
257
|
+
// if the price is base price, the auction is valid and may be claimed
|
|
258
|
+
// update the latest purchase price to the base price, to ensure
|
|
259
|
+
// the base price is used for all future settlement calculations
|
|
260
|
+
// EFFECTS
|
|
261
|
+
// @dev base price value was just loaded from uint88 in storage,
|
|
262
|
+
// so no safe cast required
|
|
263
|
+
settlementAuctionProjectConfig.latestPurchasePrice = uint88(
|
|
264
|
+
basePrice
|
|
265
|
+
);
|
|
266
|
+
// notify indexing service of settled price update
|
|
267
|
+
// @dev acknowledge that this event may be emitted prior to
|
|
268
|
+
// other state updates in this function, but that is okay because
|
|
269
|
+
// the settled price is the only value updated with this event
|
|
270
|
+
emit GenericMinterEventsLib.ConfigValueSet({
|
|
271
|
+
projectId: projectId,
|
|
272
|
+
coreContract: coreContract,
|
|
273
|
+
key: CONFIG_CURRENT_SETTLED_PRICE,
|
|
274
|
+
value: basePrice
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
settlementAuctionProjectConfig.auctionRevenuesCollected = true;
|
|
278
|
+
// calculate the artist and admin revenues
|
|
279
|
+
uint256 netRevenues = settlementAuctionProjectConfig
|
|
280
|
+
.numSettleableInvocations * price;
|
|
281
|
+
|
|
282
|
+
// reduce project balance by the amount of ETH being distributed
|
|
283
|
+
// @dev underflow checked automatically in solidity ^0.8
|
|
284
|
+
settlementAuctionProjectConfig.projectBalance -= netRevenues.toUint88();
|
|
285
|
+
|
|
286
|
+
// INTERACTIONS
|
|
287
|
+
SplitFundsLib.splitRevenuesETHNoRefund({
|
|
288
|
+
projectId: projectId,
|
|
289
|
+
valueInWei: netRevenues,
|
|
290
|
+
coreContract: coreContract
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
emit GenericMinterEventsLib.ConfigValueSet({
|
|
294
|
+
projectId: projectId,
|
|
295
|
+
coreContract: coreContract,
|
|
296
|
+
key: CONFIG_AUCTION_REVENUES_COLLECTED,
|
|
297
|
+
value: true
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* @notice Reclaims excess settlement funds for purchaser wallet
|
|
303
|
+
* `purchaserAddress` on project `projectId`. Excess settlement funds are
|
|
304
|
+
* the amount of funds posted by the purchaser that are in excess of the
|
|
305
|
+
* amount required to settle the purchaser's tokens on the project.
|
|
306
|
+
* Excess settlement funds are sent to address `to`, and function reverts
|
|
307
|
+
* if send fails.
|
|
308
|
+
* @param projectId Project ID to reclaim excess settlement funds for
|
|
309
|
+
* @param coreContract Core contract address
|
|
310
|
+
* @param purchaserAddress Address to reclaim excess settlement funds for
|
|
311
|
+
* @param to Address to send excess settlement funds to
|
|
312
|
+
*/
|
|
313
|
+
function reclaimProjectExcessSettlementFundsTo(
|
|
314
|
+
address payable to,
|
|
315
|
+
uint256 projectId,
|
|
316
|
+
address coreContract,
|
|
317
|
+
address purchaserAddress
|
|
318
|
+
) internal {
|
|
319
|
+
(
|
|
320
|
+
uint256 excessSettlementFunds,
|
|
321
|
+
uint256 requiredAmountPosted
|
|
322
|
+
) = getProjectExcessSettlementFunds({
|
|
323
|
+
projectId: projectId,
|
|
324
|
+
coreContract: coreContract,
|
|
325
|
+
walletAddress: purchaserAddress
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
SettlementAuctionProjectConfig
|
|
329
|
+
storage settlementAuctionProjectConfig = getSettlementAuctionProjectConfig({
|
|
330
|
+
projectId: projectId,
|
|
331
|
+
coreContract: coreContract
|
|
332
|
+
});
|
|
333
|
+
Receipt storage receipt = getReceipt({
|
|
334
|
+
walletAddress: purchaserAddress,
|
|
335
|
+
coreContract: coreContract,
|
|
336
|
+
projectId: projectId
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
uint232 newNetPosted = requiredAmountPosted.toUint232();
|
|
340
|
+
receipt.netPosted = newNetPosted;
|
|
341
|
+
|
|
342
|
+
// reduce project balance by the amount of ETH being distributed
|
|
343
|
+
// @dev underflow checked automatically in solidity ^0.8
|
|
344
|
+
settlementAuctionProjectConfig.projectBalance -= excessSettlementFunds
|
|
345
|
+
.toUint88();
|
|
346
|
+
|
|
347
|
+
emit ReceiptUpdated({
|
|
348
|
+
purchaser: purchaserAddress,
|
|
349
|
+
projectId: projectId,
|
|
350
|
+
coreContract: coreContract,
|
|
351
|
+
numPurchased: receipt.numPurchased,
|
|
352
|
+
netPosted: newNetPosted
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
// INTERACTIONS
|
|
356
|
+
bool success_;
|
|
357
|
+
(success_, ) = to.call{value: excessSettlementFunds}("");
|
|
358
|
+
require(success_, "Reclaiming failed");
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* @notice Performs updates to project state prior to a mint being
|
|
363
|
+
* initiated, during a purchase transaction. Specifically, this updates the
|
|
364
|
+
* number of purchases on this minter (and populates expected number of
|
|
365
|
+
* tokens to be auctioned if this is first purchase), increases the
|
|
366
|
+
* project's balance by the amount of funds sent with the transaction,
|
|
367
|
+
* updates the purchaser's receipt to reflect the new funds posted, checks
|
|
368
|
+
* that the updated receipt has sufficient funds posted for the number of
|
|
369
|
+
* tokens to be purchased after this transaction, and updates the project's
|
|
370
|
+
* latest purchase price to the current price of the token.
|
|
371
|
+
* Reverts if insuffient funds have been posted for the number of tokens to
|
|
372
|
+
* be purchased after this transaction.
|
|
373
|
+
* @param projectId Project ID to perform the pre-mint effects for
|
|
374
|
+
* @param coreContract Core contract address
|
|
375
|
+
* @param currentPriceInWei current price of token in Wei
|
|
376
|
+
* @param msgValue msg.value sent with mint transaction
|
|
377
|
+
* @param purchaserAddress Wallet address of purchaser
|
|
378
|
+
*/
|
|
379
|
+
function preMintEffects(
|
|
380
|
+
uint256 projectId,
|
|
381
|
+
address coreContract,
|
|
382
|
+
uint256 currentPriceInWei,
|
|
383
|
+
uint256 msgValue,
|
|
384
|
+
address purchaserAddress
|
|
385
|
+
) internal {
|
|
386
|
+
// load the project's settlement auction config and receipt
|
|
387
|
+
SettlementAuctionProjectConfig
|
|
388
|
+
storage settlementAuctionProjectConfig = getSettlementAuctionProjectConfig({
|
|
389
|
+
projectId: projectId,
|
|
390
|
+
coreContract: coreContract
|
|
391
|
+
});
|
|
392
|
+
|
|
393
|
+
// if this is the first purchase on this minter, set the number of
|
|
394
|
+
// of tokens to be auctioned to:
|
|
395
|
+
// (minter max invocations) - (current core contract invocations)
|
|
396
|
+
if (settlementAuctionProjectConfig.numPurchasesOnMinter == 0) {
|
|
397
|
+
// get up-to-data invocation data from core contract
|
|
398
|
+
(
|
|
399
|
+
uint256 coreInvocations,
|
|
400
|
+
uint256 coreMaxInvocations
|
|
401
|
+
) = MaxInvocationsLib.coreContractInvocationData({
|
|
402
|
+
projectId: projectId,
|
|
403
|
+
coreContract: coreContract
|
|
404
|
+
});
|
|
405
|
+
// snap chalkline on the number of tokens to be auctioned on this
|
|
406
|
+
// minter
|
|
407
|
+
// @dev acknowledge that this value may be stale if the core
|
|
408
|
+
// contract's max invocations were reduced since the last time
|
|
409
|
+
// the minter's max invocations were updated, but that is desired.
|
|
410
|
+
// That case would be classified as "nonstandard activity", so we
|
|
411
|
+
// want to require admin to be the withdrawer of revenues in that
|
|
412
|
+
// case.
|
|
413
|
+
uint256 minterMaxInvocations = MaxInvocationsLib.getMaxInvocations({
|
|
414
|
+
projectId: projectId,
|
|
415
|
+
coreContract: coreContract
|
|
416
|
+
});
|
|
417
|
+
// @dev prefer to use stale value minterMaxInvocations here, since
|
|
418
|
+
// if it is stale, the artist could have decreased max invocations
|
|
419
|
+
// on core contract at last moment unexpectedly, and we want to
|
|
420
|
+
// equire admin to be the withdrawer of revenues in that case.
|
|
421
|
+
settlementAuctionProjectConfig.numTokensToBeAuctioned = uint24(
|
|
422
|
+
minterMaxInvocations - coreInvocations
|
|
423
|
+
);
|
|
424
|
+
// edge case: minter max invocations > core contract max invocations.
|
|
425
|
+
// could be caused by either:
|
|
426
|
+
// - core contract max invocations reduced after configuring
|
|
427
|
+
// auction (this is generally accidental by artist), and did not
|
|
428
|
+
// subsequently update minter's max invocations
|
|
429
|
+
// - artist decreased max invocations on core contract at last
|
|
430
|
+
// moment prior to this initial mint (this is suspicious)
|
|
431
|
+
// either way, we want to update minter's local max invocations, so
|
|
432
|
+
// that the minter returns the most up-to-date value from function
|
|
433
|
+
// `projectMaxHasBeenInvoked` in the future.
|
|
434
|
+
// @dev note that this edge case will end up being classified as
|
|
435
|
+
// "nonstandard activity" in case of sellout above base price, and
|
|
436
|
+
// will require admin concurrence in those cases.
|
|
437
|
+
if (minterMaxInvocations > coreMaxInvocations) {
|
|
438
|
+
// update minter's max invocations to match core contract
|
|
439
|
+
MaxInvocationsLib.syncProjectMaxInvocationsToCore({
|
|
440
|
+
projectId: projectId,
|
|
441
|
+
coreContract: coreContract
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
// increment the number of purchases on this minter during every purchase
|
|
447
|
+
settlementAuctionProjectConfig.numPurchasesOnMinter++;
|
|
448
|
+
|
|
449
|
+
// update project balance
|
|
450
|
+
settlementAuctionProjectConfig.projectBalance += msgValue.toUint88();
|
|
451
|
+
|
|
452
|
+
_validateReceiptEffects({
|
|
453
|
+
walletAddress: purchaserAddress,
|
|
454
|
+
projectId: projectId,
|
|
455
|
+
coreContract: coreContract,
|
|
456
|
+
currentPriceInWei: currentPriceInWei
|
|
457
|
+
});
|
|
458
|
+
|
|
459
|
+
// update latest purchase price (on this minter) in storage
|
|
460
|
+
// @dev this is used to enforce monotonically decreasing purchase price
|
|
461
|
+
// across multiple auctions
|
|
462
|
+
settlementAuctionProjectConfig.latestPurchasePrice = currentPriceInWei
|
|
463
|
+
.toUint88();
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/**
|
|
467
|
+
* @notice Performs updates to project state after a mint has been
|
|
468
|
+
* successfully completed.
|
|
469
|
+
* Specifically, this function distributes revenues if the auction revenues
|
|
470
|
+
* have been collected, or increments the number of settleable invocations
|
|
471
|
+
* if the auction revenues have not been collected.
|
|
472
|
+
* @param projectId Project ID to perform post-mint updates for
|
|
473
|
+
* @param coreContract Core contract address
|
|
474
|
+
* @param currentPriceInWei current price of token in Wei (the value to be
|
|
475
|
+
* distributed if revenues have been collected)
|
|
476
|
+
*/
|
|
477
|
+
function postMintInteractions(
|
|
478
|
+
uint256 projectId,
|
|
479
|
+
address coreContract,
|
|
480
|
+
uint256 currentPriceInWei
|
|
481
|
+
) internal {
|
|
482
|
+
// load the project's settlement auction config
|
|
483
|
+
SettlementAuctionProjectConfig
|
|
484
|
+
storage settlementAuctionProjectConfig = getSettlementAuctionProjectConfig({
|
|
485
|
+
projectId: projectId,
|
|
486
|
+
coreContract: coreContract
|
|
487
|
+
});
|
|
488
|
+
if (settlementAuctionProjectConfig.auctionRevenuesCollected) {
|
|
489
|
+
// if revenues have been collected, split revenues immediately.
|
|
490
|
+
// @dev note that we are guaranteed to be at auction base price,
|
|
491
|
+
// since we know we didn't sellout prior to this tx.
|
|
492
|
+
// note that we don't refund msg.sender here, since a separate
|
|
493
|
+
// settlement mechanism is provided on this minter, unrelated to
|
|
494
|
+
// msg.value
|
|
495
|
+
|
|
496
|
+
// reduce project balance by the amount of ETH being distributed
|
|
497
|
+
// @dev specifically, this is not decremented by msg.value, as
|
|
498
|
+
// msg.sender is not refunded here
|
|
499
|
+
// @dev underflow checked automatically in solidity ^0.8
|
|
500
|
+
settlementAuctionProjectConfig.projectBalance -= currentPriceInWei
|
|
501
|
+
.toUint88();
|
|
502
|
+
|
|
503
|
+
// INTERACTIONS
|
|
504
|
+
SplitFundsLib.splitRevenuesETHNoRefund({
|
|
505
|
+
projectId: projectId,
|
|
506
|
+
valueInWei: currentPriceInWei,
|
|
507
|
+
coreContract: coreContract
|
|
508
|
+
});
|
|
509
|
+
} else {
|
|
510
|
+
// increment the number of settleable invocations that will be
|
|
511
|
+
// claimable by the artist and admin once auction is validated.
|
|
512
|
+
// do not split revenue here since will be claimed at a later time.
|
|
513
|
+
settlementAuctionProjectConfig.numSettleableInvocations++;
|
|
514
|
+
// @dev project balance is unaffected because no funds are distributed
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
/**
|
|
519
|
+
* Returns number of purchases that have been made on the minter, for a
|
|
520
|
+
* given project.
|
|
521
|
+
* @param projectId The id of the project.
|
|
522
|
+
* @param coreContract The address of the core contract.
|
|
523
|
+
*/
|
|
524
|
+
function getNumPurchasesOnMinter(
|
|
525
|
+
uint256 projectId,
|
|
526
|
+
address coreContract
|
|
527
|
+
) internal view returns (uint256) {
|
|
528
|
+
SettlementAuctionProjectConfig
|
|
529
|
+
storage settlementAuctionProjectConfig = getSettlementAuctionProjectConfig({
|
|
530
|
+
projectId: projectId,
|
|
531
|
+
coreContract: coreContract
|
|
532
|
+
});
|
|
533
|
+
return settlementAuctionProjectConfig.numPurchasesOnMinter;
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
/**
|
|
537
|
+
* @notice Returns the excess settlement funds for purchaser wallet
|
|
538
|
+
* `walletAddress` on project `projectId`. Excess settlement funds are
|
|
539
|
+
* the amount of funds posted by the purchaser that are in excess of the
|
|
540
|
+
* amount required to settle the purchaser's tokens on the project.
|
|
541
|
+
* @param projectId Project ID to get revenues for
|
|
542
|
+
* @param coreContract Core contract address
|
|
543
|
+
* @param walletAddress Address to get excess settlement funds for
|
|
544
|
+
* @return excessSettlementFunds excess settlement funds, in wei
|
|
545
|
+
* @return requiredAmountPosted required amount to be posted by user, in wei
|
|
546
|
+
*/
|
|
547
|
+
function getProjectExcessSettlementFunds(
|
|
548
|
+
uint256 projectId,
|
|
549
|
+
address coreContract,
|
|
550
|
+
address walletAddress
|
|
551
|
+
)
|
|
552
|
+
internal
|
|
553
|
+
view
|
|
554
|
+
returns (uint256 excessSettlementFunds, uint256 requiredAmountPosted)
|
|
555
|
+
{
|
|
556
|
+
// load the project's settlement auction config
|
|
557
|
+
SettlementAuctionProjectConfig
|
|
558
|
+
storage _settlementAuctionProjectConfig = getSettlementAuctionProjectConfig({
|
|
559
|
+
projectId: projectId,
|
|
560
|
+
coreContract: coreContract
|
|
561
|
+
});
|
|
562
|
+
// load the user's receipt
|
|
563
|
+
Receipt storage receipt = getReceipt({
|
|
564
|
+
walletAddress: walletAddress,
|
|
565
|
+
projectId: projectId,
|
|
566
|
+
coreContract: coreContract
|
|
567
|
+
});
|
|
568
|
+
// require that a user has purchased at least one token on this project
|
|
569
|
+
uint256 numPurchased = receipt.numPurchased;
|
|
570
|
+
require(numPurchased > 0, "No purchases made by this address");
|
|
571
|
+
|
|
572
|
+
uint256 currentSettledTokenPrice = _settlementAuctionProjectConfig
|
|
573
|
+
.latestPurchasePrice;
|
|
574
|
+
|
|
575
|
+
// calculate the excess settlement funds amount
|
|
576
|
+
// implicit overflow/underflow checks in solidity ^0.8
|
|
577
|
+
requiredAmountPosted = numPurchased * currentSettledTokenPrice;
|
|
578
|
+
excessSettlementFunds = receipt.netPosted - requiredAmountPosted;
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
/**
|
|
582
|
+
* @notice Gets price of minting a token on project `projectId` given
|
|
583
|
+
* the project's AuctionParameters and current block timestamp.
|
|
584
|
+
* Reverts if auction has not yet started or auction is unconfigured, and
|
|
585
|
+
* local hasMaxBeenInvoked is false and revenues have not been withdrawn.
|
|
586
|
+
* Price is guaranteed to be accurate unless the minter's local
|
|
587
|
+
* hasMaxBeenInvoked is stale and returning a false negative.
|
|
588
|
+
* @dev when an accurate price is required regardless of the current state
|
|
589
|
+
* state of the locally cached minter max invocations, use the less gas
|
|
590
|
+
* efficient function `getPriceSafe`.
|
|
591
|
+
* @param projectId Project ID to get price of token for.
|
|
592
|
+
* @param coreContract Core contract address to get price for.
|
|
593
|
+
* @param maxHasBeenInvoked Bool representing if maxHasBeenInvoked for the
|
|
594
|
+
* project.
|
|
595
|
+
* @return uint256 current price of token in Wei, accurate if minter max
|
|
596
|
+
* invocations are up to date
|
|
597
|
+
* @dev This method calculates price decay using a linear interpolation
|
|
598
|
+
* of exponential decay based on the artist-provided half-life for price
|
|
599
|
+
* decay, `priceDecayHalfLifeSeconds`.
|
|
600
|
+
*/
|
|
601
|
+
function getPriceUnsafe(
|
|
602
|
+
uint256 projectId,
|
|
603
|
+
address coreContract,
|
|
604
|
+
bool maxHasBeenInvoked
|
|
605
|
+
) internal view returns (uint256) {
|
|
606
|
+
// load the project's settlement auction config
|
|
607
|
+
SettlementAuctionProjectConfig
|
|
608
|
+
storage settlementAuctionProjectConfig = getSettlementAuctionProjectConfig({
|
|
609
|
+
projectId: projectId,
|
|
610
|
+
coreContract: coreContract
|
|
611
|
+
});
|
|
612
|
+
// return latest purchase price if:
|
|
613
|
+
// - minter is aware of a sold-out auction (without updating max
|
|
614
|
+
// invocation value)
|
|
615
|
+
// - auction revenues have been collected, at which point the latest
|
|
616
|
+
// purchase price will never change again
|
|
617
|
+
if (
|
|
618
|
+
maxHasBeenInvoked ||
|
|
619
|
+
settlementAuctionProjectConfig.auctionRevenuesCollected
|
|
620
|
+
) {
|
|
621
|
+
return settlementAuctionProjectConfig.latestPurchasePrice;
|
|
622
|
+
}
|
|
623
|
+
// otherwise calculate price based on current block timestamp and
|
|
624
|
+
// auction configuration
|
|
625
|
+
// @dev this will revert if auction has not yet started or auction is
|
|
626
|
+
// unconfigured, which is relied upon for security.
|
|
627
|
+
return
|
|
628
|
+
DAExpLib.getPriceExp({
|
|
629
|
+
projectId: projectId,
|
|
630
|
+
coreContract: coreContract
|
|
631
|
+
});
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
/**
|
|
635
|
+
* @notice Gets price of minting a token on project `projectId` given
|
|
636
|
+
* the project's AuctionParameters and current block timestamp.
|
|
637
|
+
* This is labeled as "safe", because price is guaranteed to be accurate
|
|
638
|
+
* even in the case of a stale locally cached minter max invocations.
|
|
639
|
+
* Reverts if auction has not yet started or auction is unconfigured, and
|
|
640
|
+
* auction has not sold out or revenues have not been withdrawn.
|
|
641
|
+
* @dev This method is less gas efficient than `getPriceUnsafe`, but is
|
|
642
|
+
* guaranteed to be accurate.
|
|
643
|
+
* @param projectId Project ID to get price of token for.
|
|
644
|
+
* @param coreContract Core contract address to get price for.
|
|
645
|
+
* @return tokenPriceInWei current price of token in Wei
|
|
646
|
+
* @dev This method calculates price decay using a linear interpolation
|
|
647
|
+
* of exponential decay based on the artist-provided half-life for price
|
|
648
|
+
* decay, `priceDecayHalfLifeSeconds`.
|
|
649
|
+
*/
|
|
650
|
+
function getPriceSafe(
|
|
651
|
+
uint256 projectId,
|
|
652
|
+
address coreContract
|
|
653
|
+
) internal view returns (uint256 tokenPriceInWei) {
|
|
654
|
+
// load the project's settlement auction config
|
|
655
|
+
SettlementAuctionProjectConfig
|
|
656
|
+
storage settlementAuctionProjectConfig = getSettlementAuctionProjectConfig({
|
|
657
|
+
projectId: projectId,
|
|
658
|
+
coreContract: coreContract
|
|
659
|
+
});
|
|
660
|
+
// accurately check if project has sold out
|
|
661
|
+
if (
|
|
662
|
+
MaxInvocationsLib.projectMaxHasBeenInvokedSafe({
|
|
663
|
+
projectId: projectId,
|
|
664
|
+
coreContract: coreContract
|
|
665
|
+
})
|
|
666
|
+
) {
|
|
667
|
+
// max invocations have been reached, return the latest purchased
|
|
668
|
+
// price
|
|
669
|
+
tokenPriceInWei = settlementAuctionProjectConfig
|
|
670
|
+
.latestPurchasePrice;
|
|
671
|
+
} else {
|
|
672
|
+
// if not sold out, return the current price via getPriceUnsafe
|
|
673
|
+
tokenPriceInWei = getPriceUnsafe({
|
|
674
|
+
projectId: projectId,
|
|
675
|
+
coreContract: coreContract,
|
|
676
|
+
maxHasBeenInvoked: false // this branch is only reached if max invocations have not been reached
|
|
677
|
+
});
|
|
678
|
+
}
|
|
679
|
+
return tokenPriceInWei;
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
/**
|
|
683
|
+
* @notice Returns if a new auction's start price is valid, given the current
|
|
684
|
+
* state of the project's settlement auction configuration.
|
|
685
|
+
* @param projectId Project ID to check start price for
|
|
686
|
+
* @param coreContract Core contract address to check start price for
|
|
687
|
+
* @param startPrice starting price of new auction, in wei
|
|
688
|
+
*/
|
|
689
|
+
function isValidStartPrice(
|
|
690
|
+
uint256 projectId,
|
|
691
|
+
address coreContract,
|
|
692
|
+
uint256 startPrice
|
|
693
|
+
) internal view returns (bool) {
|
|
694
|
+
// load the project's settlement auction config
|
|
695
|
+
SettlementAuctionProjectConfig
|
|
696
|
+
storage settlementAuctionProjectConfig = getSettlementAuctionProjectConfig({
|
|
697
|
+
projectId: projectId,
|
|
698
|
+
coreContract: coreContract
|
|
699
|
+
});
|
|
700
|
+
// If previous purchases have been made, require monotonically
|
|
701
|
+
// decreasing purchase prices to preserve settlement and revenue
|
|
702
|
+
// claiming logic. Since base price is always non-zero, if
|
|
703
|
+
// latestPurchasePrice is zero, then no previous purchases have been
|
|
704
|
+
// made, and startPrice may be set to any value.
|
|
705
|
+
return (settlementAuctionProjectConfig.latestPurchasePrice == 0 || // never purchased
|
|
706
|
+
startPrice <= settlementAuctionProjectConfig.latestPurchasePrice);
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
/**
|
|
710
|
+
* Loads the SettlementAuctionProjectConfig for a given project and core
|
|
711
|
+
* contract.
|
|
712
|
+
* @param projectId Project Id to get config for
|
|
713
|
+
* @param coreContract Core contract address to get config for
|
|
714
|
+
*/
|
|
715
|
+
function getSettlementAuctionProjectConfig(
|
|
716
|
+
uint256 projectId,
|
|
717
|
+
address coreContract
|
|
718
|
+
) internal view returns (SettlementAuctionProjectConfig storage) {
|
|
719
|
+
return s().settlementAuctionProjectConfigs[coreContract][projectId];
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
/**
|
|
723
|
+
* Loads the Receipt for a given user, project and core contract.
|
|
724
|
+
* @param walletAddress User address to get receipt for
|
|
725
|
+
* @param projectId Project Id to get config for
|
|
726
|
+
* @param coreContract Core contract address to get config for
|
|
727
|
+
*/
|
|
728
|
+
function getReceipt(
|
|
729
|
+
address walletAddress,
|
|
730
|
+
uint256 projectId,
|
|
731
|
+
address coreContract
|
|
732
|
+
) internal view returns (Receipt storage) {
|
|
733
|
+
return s().receipts[walletAddress][coreContract][projectId];
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
/**
|
|
737
|
+
* @notice Return the storage struct for reading and writing. This library
|
|
738
|
+
* uses a diamond storage pattern when managing storage.
|
|
739
|
+
* @return storageStruct The SettlementExpLibStorage struct.
|
|
740
|
+
*/
|
|
741
|
+
function s()
|
|
742
|
+
internal
|
|
743
|
+
pure
|
|
744
|
+
returns (SettlementExpLibStorage storage storageStruct)
|
|
745
|
+
{
|
|
746
|
+
bytes32 position = SETTLEMENT_EXP_LIB_STORAGE_POSITION;
|
|
747
|
+
assembly ("memory-safe") {
|
|
748
|
+
storageStruct.slot := position
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
/**
|
|
753
|
+
* Returns if all tokens to be auctioned were sold, for a given project.
|
|
754
|
+
* Returns false if the number of tokens to be auctioned is zero, since
|
|
755
|
+
* that is the default value for unconfigured values.
|
|
756
|
+
* @param settlementAuctionProjectConfig The SettlementAuctionProjectConfig
|
|
757
|
+
* struct of the project to check.
|
|
758
|
+
*/
|
|
759
|
+
function _allTokensToBeAuctionedWereSold(
|
|
760
|
+
SettlementAuctionProjectConfig storage settlementAuctionProjectConfig
|
|
761
|
+
) private view returns (bool) {
|
|
762
|
+
// @dev load numAllocations into memory for gas efficiency
|
|
763
|
+
uint256 numTokensToBeAuctioned = settlementAuctionProjectConfig
|
|
764
|
+
.numTokensToBeAuctioned;
|
|
765
|
+
return
|
|
766
|
+
numTokensToBeAuctioned > 0 &&
|
|
767
|
+
settlementAuctionProjectConfig.numPurchasesOnMinter ==
|
|
768
|
+
numTokensToBeAuctioned;
|
|
769
|
+
}
|
|
770
|
+
}
|