@artblocks/contracts 1.0.1 → 1.0.3
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 +67 -154
- 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 +22 -4
- package/artifacts/contracts/GenArt721CoreV3.sol/GenArt721CoreV3.json +42 -5
- 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/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/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/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/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/MinterSetPriceERC20V2.sol/MinterSetPriceERC20V2.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V3.sol/MinterSetPriceERC20V3.json +2 -2
- package/artifacts/contracts/engine/{GenArt721CoreV2_ENGINE_FLEX.sol → V2/GenArt721CoreV2_ENGINE_FLEX.sol}/GenArt721CoreV2_ENGINE_FLEX.json +3 -3
- package/artifacts/contracts/engine/{GenArt721CoreV2_PBAB.sol → V2/GenArt721CoreV2_PBAB.sol}/GenArt721CoreV2_PBAB.json +3 -3
- package/artifacts/contracts/engine/{GenArt721CoreV2_PRTNR.sol → V2/GenArt721CoreV2_PRTNR.sol}/GenArt721CoreV2_PRTNR.json +3 -3
- package/artifacts/contracts/engine/{GenArt721MinterBurner_PBAB.sol → V2/GenArt721MinterBurner_PBAB.sol}/GenArt721MinterBurner_PBAB.json +3 -3
- package/artifacts/contracts/engine/{GenArt721MinterDAExp_PBAB.sol → V2/GenArt721MinterDAExp_PBAB.sol}/GenArt721MinterDAExp_PBAB.json +3 -3
- package/artifacts/contracts/engine/{GenArt721Minter_PBAB.sol → V2/GenArt721Minter_PBAB.sol}/GenArt721Minter_PBAB.json +3 -3
- package/artifacts/contracts/engine/V3/GenArt721CoreV3_Engine.sol/GenArt721CoreV3_Engine.json +1960 -0
- package/artifacts/contracts/engine/V3/GenArt721CoreV3_Engine_Flex.sol/GenArt721CoreV3_Engine_Flex.json +2247 -0
- package/artifacts/contracts/engine/V3/forks/GenArt721CoreV3_Engine_Flex_PROOF.sol/GenArt721CoreV3_Engine_Flex_PROOF.json +2247 -0
- package/artifacts/contracts/engine/V3/forks/PROHIBITION/AdminACLV0_PROHIBITION.sol/AdminACLV0_PROHIBITION.json +401 -0
- package/artifacts/contracts/engine/V3/forks/PROHIBITION/GenArt721CoreV3_Engine_Flex_PROHIBITION.sol/GenArt721CoreV3_Engine_Flex_PROHIBITION.json +2281 -0
- package/artifacts/contracts/engine/V3/forks/PROHIBITION/interfaces/IAdminACLV0_PROHIBITION.sol/IAdminACLV0_PROHIBITION.json +359 -0
- package/artifacts/contracts/engine/V3/forks/PROHIBITION/interfaces/IGenArt721CoreContractV3_Engine_Flex_PROHIBITION.sol/IGenArt721CoreContractV3_Engine_Flex_PROHIBITION.json +1094 -0
- package/artifacts/contracts/engine-registry/CoreRegistryV1.sol/CoreRegistryV1.json +242 -0
- package/artifacts/contracts/engine-registry/EngineRegistryV0.sol/EngineRegistryV0.json +2 -2
- package/artifacts/contracts/explorations/GenArt721CoreV3_Explorations.sol/GenArt721CoreV3_Explorations.json +41 -4
- package/artifacts/contracts/interfaces/0.8.x/IBytecodeStorageReader.sol/IBytecodeStorageReader.json +111 -0
- package/artifacts/contracts/interfaces/0.8.x/ICoreRegistryV1.sol/ICoreRegistryV1.json +172 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterSEAV0.sol/IFilteredMinterSEAV0.json +1034 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractExposesHashSeed.sol/IGenArt721CoreContractExposesHashSeed.json +30 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3.sol/IGenArt721CoreContractV3.json +162 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Base.sol/IGenArt721CoreContractV3_Base.json +162 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Engine.sol/IGenArt721CoreContractV3_Engine.json +137 -13
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Engine_Flex.sol/IGenArt721CoreContractV3_Engine_Flex.json +1060 -0
- package/artifacts/contracts/interfaces/0.8.x/IMinterFilterV1.sol/IMinterFilterV1.json +429 -0
- package/artifacts/contracts/interfaces/0.8.x/IPseudorandomAtomic.sol/IPseudorandomAtomic.json +30 -0
- package/artifacts/contracts/interfaces/0.8.x/IRandomizer_V3CoreBase.sol/IRandomizer_V3CoreBase.json +24 -0
- package/artifacts/contracts/interfaces/0.8.x/ISharedRandomizerV0.sol/ISharedRandomizerV0.json +207 -0
- package/artifacts/contracts/interfaces/0.8.x/IWETH.sol/IWETH.json +55 -0
- package/artifacts/contracts/libs/0.8.x/{BytecodeStorage.sol → BytecodeStorageV0.sol}/BytecodeStorage.json +3 -3
- package/artifacts/contracts/libs/0.8.x/BytecodeStorageV1.sol/BytecodeStorageReader.json +163 -0
- package/artifacts/contracts/libs/0.8.x/BytecodeStorageV1.sol/BytecodeStorageWriter.json +10 -0
- package/artifacts/contracts/libs/0.8.x/Bytes32Strings.sol/Bytes32Strings.json +2 -2
- package/artifacts/contracts/libs/0.8.x/ERC721_PackedHashSeed.sol/ERC721_PackedHashSeed.json +2 -2
- package/artifacts/contracts/libs/0.8.x/SSTORE2.sol/SSTORE2.json +10 -0
- package/artifacts/contracts/libs/integration-refs/delegation-registry/DelegationRegistry.sol/DelegationRegistry.json +2 -2
- package/artifacts/contracts/libs/integration-refs/gnosis-safe/GnosisSafeMock.sol/GnosisSafeMock.json +2 -2
- package/artifacts/contracts/libs/integration-refs/gnosis-safe/GnosisSafeProxyFactoryMock.sol/GnosisSafeProxyFactoryMock.json +2 -2
- package/artifacts/contracts/libs/integration-refs/gnosis-safe/MultiSendMock.sol/MultiSendMock.json +2 -2
- package/artifacts/contracts/libs/integration-refs/weth9/weth9.sol/WETH9_.json +295 -0
- package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV1.sol/MinterFilterV1.json +2 -2
- package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV2.sol/MinterFilterV2.json +692 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDAExpSettlementV2.sol/MinterDAExpSettlementV2.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterDAExpV4.sol/MinterDAExpV4.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterDALinV4.sol/MinterDALinV4.json +2 -2
- 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/IGenArt721CoreContractV3WithRandomizer.json +104 -124
- package/artifacts/contracts/minter-suite/Minters/MinterPolyptychV0.sol/MinterPolyptychV0.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterSEAV0.sol/MinterSEAV0.json +1289 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20V4.sol/MinterSetPriceERC20V4.json +2 -2
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceV4.sol/MinterSetPriceV4.json +2 -2
- package/artifacts/contracts/mock/{BytecodeTextCR_DMock.sol/BytecodeTextCR_DMock.json → BytecodeV0TextCR_DMock.sol/BytecodeV0TextCR_DMock.json} +4 -4
- package/artifacts/contracts/mock/BytecodeV1LibCallsMock.sol/BytecodeV1LibCallsMock.json +135 -0
- package/artifacts/contracts/mock/BytecodeV1TextCR_DMock.sol/BytecodeV1TextCR_DMock.json +301 -0
- package/artifacts/contracts/mock/DeadReceiverBidderMock.sol/DeadReceiverBidderMock.json +33 -0
- package/artifacts/contracts/mock/DeadReceiverMock.sol/DeadReceiverMock.json +2 -2
- package/artifacts/contracts/mock/DummySharedMinter.sol/DummySharedMinter.json +114 -0
- package/artifacts/contracts/mock/ERC20Mock.sol/ERC20Mock.json +2 -2
- package/artifacts/contracts/mock/GasLimitReceiverBidderMock.sol/GasLimitReceiverBidderMock.json +46 -0
- package/artifacts/contracts/mock/GasLimitReceiverMock.sol/GasLimitReceiverMock.json +28 -0
- package/artifacts/contracts/mock/GenArt721CoreV3_Engine_IncorrectCoreType.sol/GenArt721CoreV3_Engine_IncorrectCoreType.json +22 -4
- package/artifacts/contracts/mock/MockAdminACLV0.sol/MockAdminACLV0Events.json +2 -2
- package/artifacts/contracts/mock/MockAdminACLV0_PROHIBITION.sol/MockAdminACLV0Events_PROHIBITION.json +440 -0
- package/artifacts/contracts/mock/OriginRegisterMock.sol/OriginRegisterMock.json +39 -0
- 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 +51 -0
- package/artifacts/contracts/mock/SSTORE2Mock.sol/SSTORE2Mock.json +118 -0
- package/artifacts/contracts/{BasicRandomizer.sol → randomizer/deprecated/BasicRandomizer.sol}/BasicRandomizer.json +3 -3
- package/artifacts/contracts/randomizer/deprecated/BasicRandomizerBase_v0_0_0.sol/RandomizerBase.json +10 -0
- package/artifacts/contracts/randomizer/deprecated/PolyptychRandomizerV0.sol/BasicPolyptychRandomizerV0.json +229 -0
- package/artifacts/contracts/randomizer/deprecated/RandomizerV2.sol/BasicRandomizerV2.json +102 -0
- package/artifacts/contracts/randomizer/primitive/PseudorandomAtomicBasic.sol/PseudorandomAtomic.json +30 -0
- package/artifacts/contracts/randomizer/shared/SharedRandomizerV0.sol/SharedRandomizerV0.json +231 -0
- package/artifacts/contracts/royalty-registry/GenArt721RoyaltyOverride.sol/GenArt721RoyaltyOverride.json +2 -2
- package/contracts/AdminACLV0.sol +1 -1
- package/contracts/AdminACLV1.sol +1 -1
- package/contracts/DependencyRegistryV0.sol +89 -141
- package/contracts/GenArt721CoreV3.sol +160 -204
- package/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV2.sol +1 -1
- package/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV3.sol +1 -1
- package/contracts/archive/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol +1 -1
- package/contracts/archive/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV1.sol +1 -1
- package/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV2.sol +1 -1
- package/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV3.sol +1 -1
- package/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV1.sol +1 -1
- package/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV2.sol +1 -1
- package/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV3.sol +1 -1
- package/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV1.sol +1 -1
- package/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV2.sol +1 -1
- package/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV3.sol +1 -1
- package/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV4.sol +1 -1
- package/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV2.sol +1 -1
- package/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV3.sol +1 -1
- package/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V2.sol +1 -1
- package/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V3.sol +1 -1
- package/contracts/engine/{GenArt721CoreV2_ENGINE_FLEX.sol → V2/GenArt721CoreV2_ENGINE_FLEX.sol} +2 -2
- package/contracts/engine/{GenArt721CoreV2_PBAB.sol → V2/GenArt721CoreV2_PBAB.sol} +2 -2
- package/contracts/engine/{GenArt721CoreV2_PRTNR.sol → V2/GenArt721CoreV2_PRTNR.sol} +3 -3
- package/contracts/engine/{GenArt721MinterBurner_PBAB.sol → V2/GenArt721MinterBurner_PBAB.sol} +2 -2
- package/contracts/engine/{GenArt721MinterDAExp_PBAB.sol → V2/GenArt721MinterDAExp_PBAB.sol} +2 -2
- package/contracts/engine/{GenArt721Minter_PBAB.sol → V2/GenArt721Minter_PBAB.sol} +2 -2
- package/contracts/{GenArt721CoreV3_Engine.sol → engine/V3/GenArt721CoreV3_Engine.sol} +163 -216
- package/contracts/engine/V3/GenArt721CoreV3_Engine_Flex.sol +2283 -0
- package/contracts/engine/V3/forks/GenArt721CoreV3_Engine_Flex_PROOF.sol +2293 -0
- package/contracts/engine/V3/forks/PROHIBITION/AdminACLV0_PROHIBITION.sol +281 -0
- package/contracts/engine/V3/forks/PROHIBITION/GenArt721CoreV3_Engine_Flex_PROHIBITION.sol +2354 -0
- package/contracts/engine/V3/forks/PROHIBITION/interfaces/IAdminACLV0_PROHIBITION.sol +123 -0
- package/contracts/engine/V3/forks/PROHIBITION/interfaces/IGenArt721CoreContractV3_Engine_Flex_PROHIBITION.sol +29 -0
- package/contracts/engine-registry/CoreRegistryV1.sol +254 -0
- package/contracts/engine-registry/EngineRegistryV0.sol +1 -1
- package/contracts/explorations/GenArt721CoreV3_Explorations.sol +164 -190
- package/contracts/interfaces/0.8.x/IBytecodeStorageReader.sol +62 -0
- package/contracts/interfaces/0.8.x/ICoreRegistryV1.sol +27 -0
- package/contracts/interfaces/0.8.x/IDelegationRegistry.sol +1 -1
- package/contracts/interfaces/0.8.x/IDependencyRegistryCompatibleV0.sol +1 -1
- package/contracts/interfaces/0.8.x/IDependencyRegistryV0.sol +1 -1
- package/contracts/interfaces/0.8.x/IEngineRegistryV0.sol +1 -1
- package/contracts/interfaces/0.8.x/IFilteredMinterSEAV0.sol +164 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreContractExposesHashSeed.sol +11 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Base.sol +42 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Engine.sol +0 -8
- package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Engine_Flex.sol +132 -0
- package/contracts/interfaces/0.8.x/IMinterFilterV1.sol +158 -0
- package/contracts/interfaces/0.8.x/IPseudorandomAtomic.sol +16 -0
- package/contracts/interfaces/0.8.x/IRandomizerPolyptychV0.sol +1 -1
- package/contracts/interfaces/0.8.x/IRandomizerV2.sol +2 -5
- package/contracts/interfaces/0.8.x/IRandomizer_V3CoreBase.sol +10 -0
- package/contracts/interfaces/0.8.x/ISharedRandomizerV0.sol +105 -0
- package/contracts/interfaces/0.8.x/IWETH.sol +11 -0
- package/contracts/libs/0.8.x/BytecodeStorageV1.sol +399 -0
- package/contracts/libs/0.8.x/SSTORE2.sol +109 -0
- package/contracts/libs/integration-refs/delegation-registry/DelegationRegistry.sol +1 -1
- package/contracts/libs/integration-refs/weth9/weth9.sol +765 -0
- package/contracts/minter-suite/MinterFilter/MinterFilterV1.sol +36 -48
- package/contracts/minter-suite/MinterFilter/MinterFilterV2.sol +756 -0
- package/contracts/minter-suite/Minters/MinterDAExpSettlementV2.sol +27 -35
- package/contracts/minter-suite/Minters/MinterDAExpV4.sol +17 -22
- package/contracts/minter-suite/Minters/MinterDALinV4.sol +16 -18
- package/contracts/minter-suite/Minters/MinterHolderV4.sol +20 -20
- package/contracts/minter-suite/Minters/MinterMerkleV5.sol +14 -16
- package/contracts/minter-suite/Minters/MinterPolyptychV0.sol +37 -36
- package/contracts/minter-suite/Minters/MinterSEAV0.sol +1273 -0
- package/contracts/minter-suite/Minters/MinterSetPriceERC20V4.sol +12 -12
- package/contracts/minter-suite/Minters/MinterSetPriceV4.sol +10 -11
- package/contracts/mock/{BytecodeTextCR_DMock.sol → BytecodeV0TextCR_DMock.sol} +5 -5
- package/contracts/mock/BytecodeV1LibCallsMock.sol +114 -0
- package/contracts/mock/BytecodeV1TextCR_DMock.sol +233 -0
- package/contracts/mock/DeadReceiverBidderMock.sol +23 -0
- package/contracts/mock/DeadReceiverMock.sol +1 -1
- package/contracts/mock/DummySharedMinter.sol +75 -0
- package/contracts/mock/GasLimitReceiverBidderMock.sol +23 -0
- package/contracts/mock/GasLimitReceiverMock.sol +19 -0
- package/contracts/mock/GenArt721CoreV3_Engine_IncorrectCoreType.sol +14 -27
- package/contracts/mock/MockAdminACLV0.sol +1 -1
- package/contracts/mock/MockAdminACLV0_PROHIBITION.sol +207 -0
- package/contracts/mock/OriginRegisterMock.sol +27 -0
- package/contracts/mock/RandomizerV2_NoAssignMock.sol +3 -12
- package/contracts/mock/ReentrancySEAMock.sol +36 -0
- package/contracts/mock/SSTORE2Mock.sol +93 -0
- package/contracts/{BasicRandomizer.sol → randomizer/deprecated/BasicRandomizer.sol} +1 -1
- package/contracts/randomizer/deprecated/BasicRandomizerBase_v0_0_0.sol +23 -0
- package/contracts/{BasicPolyptychRandomizerV0.sol → randomizer/deprecated/PolyptychRandomizerV0.sol} +20 -29
- package/contracts/{BasicRandomizerV2.sol → randomizer/deprecated/RandomizerV2.sol} +6 -14
- package/contracts/randomizer/primitive/PseudorandomAtomicBasic.sol +30 -0
- package/contracts/randomizer/shared/SharedRandomizerV0.sol +245 -0
- package/package.json +36 -30
- package/.env.example +0 -10
- package/artifacts/contracts/BasicPolyptychRandomizerV0.sol/BasicPolyptychRandomizerV0.json +0 -229
- package/artifacts/contracts/BasicRandomizerV2.sol/BasicRandomizerV2.json +0 -102
- package/artifacts/contracts/GenArt721CoreV3_Engine.sol/GenArt721CoreV3_Engine.json +0 -1942
- package/artifacts/contracts/engine-registry/future/EngineRegistryV1.sol/EngineRegistryV1.json +0 -109
- package/contracts/engine-registry/future/EngineRegistryV1.sol +0 -86
- /package/contracts/libs/0.8.x/{BytecodeStorage.sol → BytecodeStorageV0.sol} +0 -0
|
@@ -0,0 +1,756 @@
|
|
|
1
|
+
// SPDX-License-Identifier: LGPL-3.0-only
|
|
2
|
+
// Created By: Art Blocks Inc.
|
|
3
|
+
|
|
4
|
+
pragma solidity 0.8.19;
|
|
5
|
+
|
|
6
|
+
import "../../interfaces/0.8.x/IMinterFilterV1.sol";
|
|
7
|
+
import "../../interfaces/0.8.x/IFilteredMinterV0.sol";
|
|
8
|
+
import "../../interfaces/0.8.x/IGenArt721CoreContractV3_Base.sol";
|
|
9
|
+
import "../../interfaces/0.8.x/ICoreRegistryV1.sol";
|
|
10
|
+
|
|
11
|
+
import "../../libs/0.8.x/Bytes32Strings.sol";
|
|
12
|
+
|
|
13
|
+
import "@openzeppelin-4.7/contracts/access/Ownable.sol";
|
|
14
|
+
import "@openzeppelin-4.7/contracts/utils/structs/EnumerableMap.sol";
|
|
15
|
+
import "@openzeppelin-4.7/contracts/utils/structs/EnumerableSet.sol";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @title MinterFilterV2
|
|
19
|
+
* @dev At the time of deployment, this contract is intended to be used with
|
|
20
|
+
* core contracts that implement IGenArt721CoreContractV3_Base.
|
|
21
|
+
* @author Art Blocks Inc.
|
|
22
|
+
* @notice This Minter Filter V2 contract allows minters to be set on a
|
|
23
|
+
* per-project basis, for any registered core contract. This minter filter does
|
|
24
|
+
* not extend the previous version of the minter filters, as the previous
|
|
25
|
+
* version is not compatible with multiple core contracts.
|
|
26
|
+
*
|
|
27
|
+
* This contract is designed to be managed by an Admin ACL contract, as well as
|
|
28
|
+
* delegated privileges to core contract artists and Admin ACL contracts.
|
|
29
|
+
* These roles hold extensive power and can arbitrarily control and modify
|
|
30
|
+
* how a project's tokens may be minted.
|
|
31
|
+
* Care must be taken to ensure that the admin ACL contract and artist
|
|
32
|
+
* addresses are secure behind a multi-sig or other access control mechanism.
|
|
33
|
+
* ----------------------------------------------------------------------------
|
|
34
|
+
* The following functions are restricted as allowed by this contract's Admin
|
|
35
|
+
* ACL:
|
|
36
|
+
* - updateCoreRegistry
|
|
37
|
+
* - approveMinterGlobally
|
|
38
|
+
* - revokeMinterGlobally
|
|
39
|
+
* - removeMintersForProjectsOnContracts
|
|
40
|
+
* ----------------------------------------------------------------------------
|
|
41
|
+
* The following functions are restricted as allowed by each core contract's
|
|
42
|
+
* Admin ACL contract:
|
|
43
|
+
* - approveMinterForContract
|
|
44
|
+
* - revokeMinterForContract
|
|
45
|
+
* - removeMintersForProjectsOnContract
|
|
46
|
+
* ----------------------------------------------------------------------------
|
|
47
|
+
* The following functions are restricted as allowed by each core contract's
|
|
48
|
+
* Admin ACL contract, or to the artist address of the project:
|
|
49
|
+
* - setMinterForProject
|
|
50
|
+
* - removeMinterForProject
|
|
51
|
+
* ----------------------------------------------------------------------------
|
|
52
|
+
* Additional admin and artist privileged roles may be described on minters,
|
|
53
|
+
* registries, and other contracts that may interact with this contract.
|
|
54
|
+
*/
|
|
55
|
+
contract MinterFilterV2 is Ownable, IMinterFilterV1 {
|
|
56
|
+
// add Enumerable Map methods
|
|
57
|
+
using EnumerableMap for EnumerableMap.UintToAddressMap;
|
|
58
|
+
using EnumerableSet for EnumerableSet.AddressSet;
|
|
59
|
+
// add Bytes32Strings methods
|
|
60
|
+
using Bytes32Strings for bytes32;
|
|
61
|
+
|
|
62
|
+
/// version & type of this core contract
|
|
63
|
+
bytes32 constant MINTER_FILTER_VERSION = "v2.0.0";
|
|
64
|
+
|
|
65
|
+
function minterFilterVersion() external pure returns (string memory) {
|
|
66
|
+
return MINTER_FILTER_VERSION.toString();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
bytes32 constant MINTER_FILTER_TYPE = "MinterFilterV2";
|
|
70
|
+
|
|
71
|
+
function minterFilterType() external pure returns (string memory) {
|
|
72
|
+
return MINTER_FILTER_TYPE.toString();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/// Admin ACL contract for this minter filter
|
|
76
|
+
IAdminACLV0 public adminACLContract;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* @notice Core registry, that tracks all registered core contracts
|
|
80
|
+
*/
|
|
81
|
+
ICoreRegistryV1 public coreRegistry;
|
|
82
|
+
|
|
83
|
+
/// minter address => qty projects across all core contracts currently
|
|
84
|
+
/// using the minter
|
|
85
|
+
mapping(address => uint256) public numProjectsUsingMinter;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Enumerable Set of globally approved minters.
|
|
89
|
+
* This is a Set of addresses that are approved to mint on any
|
|
90
|
+
* project, for any core contract.
|
|
91
|
+
* @dev note that contract admins can extend a separate Set of minters for
|
|
92
|
+
* their core contract via the `approveMinterForContract` function.
|
|
93
|
+
*/
|
|
94
|
+
EnumerableSet.AddressSet private globallyApprovedMinters;
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Mapping of core contract addresses to Enumerable Sets of approved
|
|
98
|
+
* minters for that core contract.
|
|
99
|
+
* @dev note that contract admins can extend this Set for their core
|
|
100
|
+
* contract by via the `approveMinterForContract` function, and can remove
|
|
101
|
+
* minters from this Set via the `revokeMinterForContract` function.
|
|
102
|
+
*/
|
|
103
|
+
mapping(address => EnumerableSet.AddressSet)
|
|
104
|
+
private contractApprovedMinters;
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Mapping of core contract addresses to Enumerable Maps of project IDs to
|
|
108
|
+
* minter addresses.
|
|
109
|
+
*/
|
|
110
|
+
mapping(address => EnumerableMap.UintToAddressMap) private minterForProject;
|
|
111
|
+
|
|
112
|
+
function _onlyNonZeroAddress(address _address) internal pure {
|
|
113
|
+
require(_address != address(0), "Only non-zero address");
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* @notice Function to restrict access to only AdminACL allowed calls
|
|
118
|
+
* on a given core contract.
|
|
119
|
+
* @dev defers to the ACL contract used by the core contract
|
|
120
|
+
* @param _selector function selector to be checked
|
|
121
|
+
*/
|
|
122
|
+
function _onlyAdminACL(bytes4 _selector) internal {
|
|
123
|
+
require(
|
|
124
|
+
adminACLAllowed(msg.sender, address(this), _selector),
|
|
125
|
+
"Only Admin ACL allowed"
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* @notice Function to restrict access to only AdminACL allowed calls
|
|
131
|
+
* on a given core contract.
|
|
132
|
+
* @dev defers to the ACL contract used by the core contract
|
|
133
|
+
* @param _coreContract core contract address
|
|
134
|
+
* @param _selector function selector to be checked
|
|
135
|
+
*/
|
|
136
|
+
function _onlyCoreAdminACL(
|
|
137
|
+
address _coreContract,
|
|
138
|
+
bytes4 _selector
|
|
139
|
+
) internal {
|
|
140
|
+
require(
|
|
141
|
+
IGenArt721CoreContractV3_Base(_coreContract).adminACLAllowed(
|
|
142
|
+
msg.sender,
|
|
143
|
+
address(this),
|
|
144
|
+
_selector
|
|
145
|
+
),
|
|
146
|
+
"Only Core AdminACL allowed"
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// function to restrict access to only core AdminACL or the project artist
|
|
151
|
+
function _onlyCoreAdminACLOrArtist(
|
|
152
|
+
uint256 _projectId,
|
|
153
|
+
address _coreContract,
|
|
154
|
+
bytes4 _selector
|
|
155
|
+
) internal {
|
|
156
|
+
IGenArt721CoreContractV3_Base genArtCoreContract_Base = IGenArt721CoreContractV3_Base(
|
|
157
|
+
_coreContract
|
|
158
|
+
);
|
|
159
|
+
require(
|
|
160
|
+
(msg.sender ==
|
|
161
|
+
genArtCoreContract_Base.projectIdToArtistAddress(_projectId)) ||
|
|
162
|
+
(
|
|
163
|
+
genArtCoreContract_Base.adminACLAllowed(
|
|
164
|
+
msg.sender,
|
|
165
|
+
address(this),
|
|
166
|
+
_selector
|
|
167
|
+
)
|
|
168
|
+
),
|
|
169
|
+
"Only Artist or Core Admin ACL"
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// function to restrict access to only core contracts registered with the
|
|
174
|
+
// currently configured core registry. This is used to prevent
|
|
175
|
+
// non-registered core contracts from being used with this minter filter.
|
|
176
|
+
function _onlyRegisteredCoreContract(address _coreContract) internal view {
|
|
177
|
+
// @dev use core registry to check if core contract is registered
|
|
178
|
+
require(
|
|
179
|
+
coreRegistry.isRegisteredContract(_coreContract),
|
|
180
|
+
"Only registered core contract"
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// function to restrict access to only valid project IDs
|
|
185
|
+
function _onlyValidProjectId(
|
|
186
|
+
uint256 _projectId,
|
|
187
|
+
address _coreContract
|
|
188
|
+
) internal view {
|
|
189
|
+
IGenArt721CoreContractV3_Base genArtCoreContract = IGenArt721CoreContractV3_Base(
|
|
190
|
+
_coreContract
|
|
191
|
+
);
|
|
192
|
+
require(
|
|
193
|
+
(_projectId >= genArtCoreContract.startingProjectId()) &&
|
|
194
|
+
(_projectId < genArtCoreContract.nextProjectId()),
|
|
195
|
+
"Only valid project ID"
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// checks if minter is globally approved or approved for a core contract
|
|
200
|
+
function _onlyApprovedMinter(
|
|
201
|
+
address _coreContract,
|
|
202
|
+
address _minter
|
|
203
|
+
) internal view {
|
|
204
|
+
require(
|
|
205
|
+
isApprovedMinterForContract(_coreContract, _minter),
|
|
206
|
+
"Only approved minters"
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* @notice Initializes contract to be a Minter for `_genArt721Address`.
|
|
212
|
+
* @param _adminACLContract Address of admin access control contract, to be
|
|
213
|
+
* set as contract owner.
|
|
214
|
+
* @param _coreRegistry Address of core registry contract.
|
|
215
|
+
*/
|
|
216
|
+
constructor(address _adminACLContract, address _coreRegistry) {
|
|
217
|
+
// set AdminACL management contract as owner
|
|
218
|
+
_transferOwnership(_adminACLContract);
|
|
219
|
+
// set core registry contract
|
|
220
|
+
_updateCoreRegistry(_coreRegistry);
|
|
221
|
+
emit Deployed();
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/// @dev override to prevent renouncing ownership
|
|
225
|
+
/// @dev not permission gated since this immediately reverts
|
|
226
|
+
function renounceOwnership() public pure override {
|
|
227
|
+
revert("Cannot renounce ownership");
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* @notice Updates the core registry contract to be used by this contract.
|
|
232
|
+
* Only callable as allowed by AdminACL of this contract.
|
|
233
|
+
* @param _coreRegistry Address of the new core registry contract.
|
|
234
|
+
*/
|
|
235
|
+
function updateCoreRegistry(address _coreRegistry) external {
|
|
236
|
+
_onlyAdminACL(this.updateCoreRegistry.selector);
|
|
237
|
+
_updateCoreRegistry(_coreRegistry);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* @notice Globally approves minter `_minter` to be available for
|
|
242
|
+
* minting on any project, for any core contract.
|
|
243
|
+
* Only callable as allowed by AdminACL of this contract.
|
|
244
|
+
* @dev Reverts if minter is already globally approved, or does not
|
|
245
|
+
* implement minterType().
|
|
246
|
+
* @param _minter Minter to be approved.
|
|
247
|
+
*/
|
|
248
|
+
function approveMinterGlobally(address _minter) external {
|
|
249
|
+
_onlyAdminACL(this.approveMinterGlobally.selector);
|
|
250
|
+
// @dev add() returns true only if the value was not already in the Set
|
|
251
|
+
require(
|
|
252
|
+
globallyApprovedMinters.add(_minter),
|
|
253
|
+
"Minter already approved"
|
|
254
|
+
);
|
|
255
|
+
emit MinterApprovedGlobally(
|
|
256
|
+
_minter,
|
|
257
|
+
IFilteredMinterV0(_minter).minterType()
|
|
258
|
+
);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* @notice Removes previously globally approved minter `_minter`
|
|
263
|
+
* from the list of globally approved minters.
|
|
264
|
+
* Only callable as allowed by AdminACL of this contract.
|
|
265
|
+
* Reverts if minter is not globally approved, or if minter is still
|
|
266
|
+
* in use by any project.
|
|
267
|
+
* @dev intentionally do not check if minter is still in use by any
|
|
268
|
+
* project, meaning that any projects currently using the minter will
|
|
269
|
+
* continue to be able to use it. If existing projects should be forced
|
|
270
|
+
* to discontinue using a minter, the minter may be removed by the minter
|
|
271
|
+
* filter admin in bulk via the `TODO` function.
|
|
272
|
+
* @param _minter Minter to remove.
|
|
273
|
+
*/
|
|
274
|
+
function revokeMinterGlobally(address _minter) external {
|
|
275
|
+
_onlyAdminACL(this.revokeMinterGlobally.selector);
|
|
276
|
+
// @dev remove() returns true only if the value was already in the Set
|
|
277
|
+
require(
|
|
278
|
+
globallyApprovedMinters.remove(_minter),
|
|
279
|
+
"Only previously approved minter"
|
|
280
|
+
);
|
|
281
|
+
emit MinterRevokedGlobally(_minter);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* @notice Approves minter `_minter` to be available for minting on
|
|
286
|
+
* any project on core contarct `_coreContract`.
|
|
287
|
+
* Only callable as allowed by AdminACL of core contract `_coreContract`.
|
|
288
|
+
* Reverts if core contract is not registered, if minter is already
|
|
289
|
+
* approved for the contract, or if minter does not implement minterType().
|
|
290
|
+
* @param _coreContract Core contract to approve minter for.
|
|
291
|
+
* @param _minter Minter to be approved.
|
|
292
|
+
*/
|
|
293
|
+
function approveMinterForContract(
|
|
294
|
+
address _coreContract,
|
|
295
|
+
address _minter
|
|
296
|
+
) external {
|
|
297
|
+
_onlyRegisteredCoreContract(_coreContract);
|
|
298
|
+
_onlyCoreAdminACL(
|
|
299
|
+
_coreContract,
|
|
300
|
+
this.approveMinterForContract.selector
|
|
301
|
+
);
|
|
302
|
+
// @dev add() returns true only if the value was not already in the Set
|
|
303
|
+
require(
|
|
304
|
+
contractApprovedMinters[_coreContract].add(_minter),
|
|
305
|
+
"Minter already approved"
|
|
306
|
+
);
|
|
307
|
+
emit MinterApprovedForContract({
|
|
308
|
+
coreContract: _coreContract,
|
|
309
|
+
minter: _minter,
|
|
310
|
+
minterType: IFilteredMinterV0(_minter).minterType()
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* @notice Removes previously approved minter `_minter` from the
|
|
316
|
+
* list of approved minters on core contract `_coreContract`.
|
|
317
|
+
* Only callable as allowed by AdminACL of core contract `_coreContract`.
|
|
318
|
+
* Reverts if core contract is not registered, or if minter is not approved
|
|
319
|
+
* on contract.
|
|
320
|
+
* @dev intentionally does not check if minter is still in use by any
|
|
321
|
+
* project, meaning that any projects currently using the minter will
|
|
322
|
+
* continue to be able to use it. If existing projects should be forced
|
|
323
|
+
* to discontinue using a minter, the minter may be removed by the contract
|
|
324
|
+
* admin in bulk via the `TODO` function.
|
|
325
|
+
* @param _minter Minter to remove.
|
|
326
|
+
*/
|
|
327
|
+
function revokeMinterForContract(
|
|
328
|
+
address _coreContract,
|
|
329
|
+
address _minter
|
|
330
|
+
) external {
|
|
331
|
+
_onlyRegisteredCoreContract(_coreContract);
|
|
332
|
+
_onlyCoreAdminACL(_coreContract, this.revokeMinterForContract.selector);
|
|
333
|
+
// @dev intentionally do not check if minter is still in use by any
|
|
334
|
+
// project, since it is possible that a different contract's project is
|
|
335
|
+
// using the minter
|
|
336
|
+
// @dev remove() returns true only if the value was already in the Set
|
|
337
|
+
require(
|
|
338
|
+
contractApprovedMinters[_coreContract].remove(_minter),
|
|
339
|
+
"Only previously approved minter"
|
|
340
|
+
);
|
|
341
|
+
emit MinterRevokedForContract({
|
|
342
|
+
coreContract: _coreContract,
|
|
343
|
+
minter: _minter
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* @notice Sets minter for project `_projectId` on contract `_coreContract`
|
|
349
|
+
* to minter `_minter`.
|
|
350
|
+
* Only callable by the project's artist or as allowed by AdminACL of
|
|
351
|
+
* core contract `_coreContract`.
|
|
352
|
+
* Reverts if:
|
|
353
|
+
* - core contract is not registered
|
|
354
|
+
* - minter is not approved globally on this minter filter or for the
|
|
355
|
+
* project's core contract
|
|
356
|
+
* - project is not valid on the core contract
|
|
357
|
+
* - function is called by an address other than the project's artist
|
|
358
|
+
* or a sender allowed by the core contract's admin ACL
|
|
359
|
+
* - minter does not implement minterType()
|
|
360
|
+
* @param _projectId Project ID to set minter for.
|
|
361
|
+
* @param _coreContract Core contract of project.
|
|
362
|
+
* @param _minter Minter to be the project's minter.
|
|
363
|
+
*/
|
|
364
|
+
function setMinterForProject(
|
|
365
|
+
uint256 _projectId,
|
|
366
|
+
address _coreContract,
|
|
367
|
+
address _minter
|
|
368
|
+
) external {
|
|
369
|
+
/// CHECKS
|
|
370
|
+
_onlyRegisteredCoreContract(_coreContract);
|
|
371
|
+
_onlyCoreAdminACLOrArtist(
|
|
372
|
+
_projectId,
|
|
373
|
+
_coreContract,
|
|
374
|
+
this.setMinterForProject.selector
|
|
375
|
+
);
|
|
376
|
+
_onlyApprovedMinter(_coreContract, _minter);
|
|
377
|
+
_onlyValidProjectId(_projectId, _coreContract);
|
|
378
|
+
/// EFFECTS
|
|
379
|
+
// decrement number of projects using a previous minter
|
|
380
|
+
(bool hasPreviousMinter, address previousMinter) = minterForProject[
|
|
381
|
+
_coreContract
|
|
382
|
+
].tryGet(_projectId);
|
|
383
|
+
if (hasPreviousMinter) {
|
|
384
|
+
numProjectsUsingMinter[previousMinter]--;
|
|
385
|
+
}
|
|
386
|
+
// assign new minter
|
|
387
|
+
numProjectsUsingMinter[_minter]++;
|
|
388
|
+
minterForProject[_coreContract].set(_projectId, _minter);
|
|
389
|
+
emit ProjectMinterRegistered({
|
|
390
|
+
projectId: _projectId,
|
|
391
|
+
coreContract: _coreContract,
|
|
392
|
+
minter: _minter,
|
|
393
|
+
minterType: IFilteredMinterV0(_minter).minterType()
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* @notice Updates project `_projectId` on contract `_coreContract` to have
|
|
399
|
+
* no configured minter.
|
|
400
|
+
* Only callable by the project's artist or as allowed by AdminACL of
|
|
401
|
+
* core contract `_coreContract`.
|
|
402
|
+
* Reverts if:
|
|
403
|
+
* - core contract is not registered
|
|
404
|
+
* - project does not already have a minter assigned
|
|
405
|
+
* - function is called by an address other than the project's artist
|
|
406
|
+
* or a sender allowed by the core contract's admin ACL
|
|
407
|
+
* @param _projectId Project ID to remove minter for.
|
|
408
|
+
* @param _coreContract Core contract of project.
|
|
409
|
+
* @dev requires project to have an assigned minter
|
|
410
|
+
*/
|
|
411
|
+
function removeMinterForProject(
|
|
412
|
+
uint256 _projectId,
|
|
413
|
+
address _coreContract
|
|
414
|
+
) external {
|
|
415
|
+
_onlyRegisteredCoreContract(_coreContract);
|
|
416
|
+
_onlyCoreAdminACLOrArtist(
|
|
417
|
+
_projectId,
|
|
418
|
+
_coreContract,
|
|
419
|
+
this.removeMinterForProject.selector
|
|
420
|
+
);
|
|
421
|
+
// @dev this will revert if project does not have a minter
|
|
422
|
+
_removeMinterForProject(_projectId, _coreContract);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/**
|
|
426
|
+
* @notice Updates an array of project IDs to have no configured minter.
|
|
427
|
+
* Only callable as allowed by AdminACL of core contract `_coreContract`.
|
|
428
|
+
* Reverts if the core contract is not registered, or if any project does
|
|
429
|
+
* not already have a minter assigned.
|
|
430
|
+
* @param _projectIds Array of project IDs to remove minters for.
|
|
431
|
+
* @dev caution with respect to single tx gas limits
|
|
432
|
+
*/
|
|
433
|
+
function removeMintersForProjectsOnContract(
|
|
434
|
+
uint256[] calldata _projectIds,
|
|
435
|
+
address _coreContract
|
|
436
|
+
) external {
|
|
437
|
+
_onlyRegisteredCoreContract(_coreContract);
|
|
438
|
+
_onlyCoreAdminACL(
|
|
439
|
+
_coreContract,
|
|
440
|
+
this.removeMintersForProjectsOnContract.selector
|
|
441
|
+
);
|
|
442
|
+
uint256 numProjects = _projectIds.length;
|
|
443
|
+
for (uint256 i; i < numProjects; ) {
|
|
444
|
+
_removeMinterForProject(_projectIds[i], _coreContract);
|
|
445
|
+
unchecked {
|
|
446
|
+
++i;
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
/**
|
|
452
|
+
* @notice Mint a token from project `_projectId` on contract
|
|
453
|
+
* `_coreContract` to `_to`, originally purchased by `sender`.
|
|
454
|
+
* @param _to The new token's owner.
|
|
455
|
+
* @param _projectId Project ID to mint a new token on.
|
|
456
|
+
* @param _sender Address purchasing a new token.
|
|
457
|
+
* @param _coreContract Core contract of project.
|
|
458
|
+
* @return tokenId Token ID of minted token
|
|
459
|
+
* @dev reverts w/nonexistent key error when project has no assigned minter
|
|
460
|
+
* @dev does not check if core contract is registered, for gas efficiency
|
|
461
|
+
* and because project must have already been assigned a minter, which
|
|
462
|
+
* requires the core contract to have been previously registered. If core
|
|
463
|
+
* contract was unregistered but the project still has an assigned minter,
|
|
464
|
+
* minting will remain possible.
|
|
465
|
+
* @dev function name is optimized for gas.
|
|
466
|
+
*/
|
|
467
|
+
function mint_joo(
|
|
468
|
+
address _to,
|
|
469
|
+
uint256 _projectId,
|
|
470
|
+
address _coreContract,
|
|
471
|
+
address _sender
|
|
472
|
+
) external returns (uint256 tokenId) {
|
|
473
|
+
// CHECKS
|
|
474
|
+
// minter is the project's minter
|
|
475
|
+
require(
|
|
476
|
+
msg.sender == minterForProject[_coreContract].get(_projectId),
|
|
477
|
+
"Only assigned minter"
|
|
478
|
+
);
|
|
479
|
+
// INTERACTIONS
|
|
480
|
+
tokenId = IGenArt721CoreContractV3_Base(_coreContract).mint_Ecf(
|
|
481
|
+
_to,
|
|
482
|
+
_projectId,
|
|
483
|
+
_sender
|
|
484
|
+
);
|
|
485
|
+
return tokenId;
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
/**
|
|
489
|
+
* @notice Gets the assigned minter for project `_projectId` on core
|
|
490
|
+
* contract `_coreContract`.
|
|
491
|
+
* Reverts if project does not have an assigned minter.
|
|
492
|
+
* @param _projectId Project ID to query.
|
|
493
|
+
* @param _coreContract Core contract of project.
|
|
494
|
+
* @return address Minter address assigned to project
|
|
495
|
+
* @dev requires project to have an assigned minter
|
|
496
|
+
* @dev this function intentionally does not check that the core contract
|
|
497
|
+
* is registered, since it must have been registered at the time the
|
|
498
|
+
* project was assigned a minter
|
|
499
|
+
*/
|
|
500
|
+
function getMinterForProject(
|
|
501
|
+
uint256 _projectId,
|
|
502
|
+
address _coreContract
|
|
503
|
+
) external view returns (address) {
|
|
504
|
+
(bool hasMinter, address currentMinter) = minterForProject[
|
|
505
|
+
_coreContract
|
|
506
|
+
].tryGet(_projectId);
|
|
507
|
+
require(hasMinter, "No minter assigned");
|
|
508
|
+
return currentMinter;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
/**
|
|
512
|
+
* @notice Queries if project `_projectId` on core contract `_coreContract`
|
|
513
|
+
* has an assigned minter.
|
|
514
|
+
* @param _projectId Project ID to query.
|
|
515
|
+
* @param _coreContract Core contract of project.
|
|
516
|
+
* @return bool true if project has an assigned minter, else false
|
|
517
|
+
* @dev requires project to have an assigned minter
|
|
518
|
+
* @dev this function intentionally does not check that the core contract
|
|
519
|
+
* is registered, since it must have been registered at the time the
|
|
520
|
+
* project was assigned a minter
|
|
521
|
+
*/
|
|
522
|
+
function projectHasMinter(
|
|
523
|
+
uint256 _projectId,
|
|
524
|
+
address _coreContract
|
|
525
|
+
) external view returns (bool) {
|
|
526
|
+
(bool hasMinter, ) = minterForProject[_coreContract].tryGet(_projectId);
|
|
527
|
+
return hasMinter;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
/**
|
|
531
|
+
* @notice Gets quantity of projects on a given core contract that have
|
|
532
|
+
* assigned minters.
|
|
533
|
+
* @param _coreContract Core contract to query.
|
|
534
|
+
* @return uint256 quantity of projects that have assigned minters
|
|
535
|
+
* @dev this function intentionally does not check that the core contract
|
|
536
|
+
* is registered, since it must have been registered at the time the
|
|
537
|
+
* project was assigned a minter
|
|
538
|
+
*/
|
|
539
|
+
function getNumProjectsOnContractWithMinters(
|
|
540
|
+
address _coreContract
|
|
541
|
+
) external view returns (uint256) {
|
|
542
|
+
return minterForProject[_coreContract].length();
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
/**
|
|
546
|
+
* @notice Get project ID and minter address at index `_index` of
|
|
547
|
+
* enumerable map.
|
|
548
|
+
* @param _coreContract Core contract to query.
|
|
549
|
+
* @param _index enumerable map index to query.
|
|
550
|
+
* @return projectId project ID at index `_index`
|
|
551
|
+
* @return minterAddress minter address for project at index `_index`
|
|
552
|
+
* @return minterType minter type of minter at minterAddress
|
|
553
|
+
* @dev index must be < quantity of projects that have assigned minters,
|
|
554
|
+
* otherwise reverts
|
|
555
|
+
* @dev reverts if minter does not implement minterType() function
|
|
556
|
+
* @dev this function intentionally does not check that the core contract
|
|
557
|
+
* is registered, since it must have been registered at the time the
|
|
558
|
+
* project was assigned a minter
|
|
559
|
+
*/
|
|
560
|
+
function getProjectAndMinterInfoOnContractAt(
|
|
561
|
+
address _coreContract,
|
|
562
|
+
uint256 _index
|
|
563
|
+
)
|
|
564
|
+
external
|
|
565
|
+
view
|
|
566
|
+
returns (
|
|
567
|
+
uint256 projectId,
|
|
568
|
+
address minterAddress,
|
|
569
|
+
string memory minterType
|
|
570
|
+
)
|
|
571
|
+
{
|
|
572
|
+
// @dev at() reverts if index is out of bounds
|
|
573
|
+
(projectId, minterAddress) = minterForProject[_coreContract].at(_index);
|
|
574
|
+
minterType = IFilteredMinterV0(minterAddress).minterType();
|
|
575
|
+
return (projectId, minterAddress, minterType);
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
/**
|
|
579
|
+
* @notice View that returns if a core contract is registered with the
|
|
580
|
+
* core registry, allowing this minter filter to service it.
|
|
581
|
+
* @param _coreContract core contract address to be checked
|
|
582
|
+
* @return bool true if core contract is registered, else false
|
|
583
|
+
*/
|
|
584
|
+
function isRegisteredCoreContract(
|
|
585
|
+
address _coreContract
|
|
586
|
+
) external view override returns (bool) {
|
|
587
|
+
return coreRegistry.isRegisteredContract(_coreContract);
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
/**
|
|
591
|
+
* @notice Gets all projects on core contract `_coreContract` that are
|
|
592
|
+
* using minter `_minter`.
|
|
593
|
+
* Warning: Unbounded gas limit. This function is gas-intensive and should
|
|
594
|
+
* only be used for off-chain queries. Alternatively, the subgraph indexing
|
|
595
|
+
* layer may be used to query these values.
|
|
596
|
+
* @param _coreContract core contract to query
|
|
597
|
+
* @param _minter minter to query
|
|
598
|
+
*/
|
|
599
|
+
function getProjectsOnContractUsingMinter(
|
|
600
|
+
address _coreContract,
|
|
601
|
+
address _minter
|
|
602
|
+
) external view returns (uint256[] memory projectIds) {
|
|
603
|
+
// initialize arrays with maximum potential length
|
|
604
|
+
// @dev use num projects using minter across all contracts since it the
|
|
605
|
+
// maximum length of this array
|
|
606
|
+
uint256 maxNumProjects = numProjectsUsingMinter[_minter];
|
|
607
|
+
projectIds = new uint256[](maxNumProjects);
|
|
608
|
+
// iterate over all projects on contract, adding to array if using
|
|
609
|
+
// `_minter`
|
|
610
|
+
EnumerableMap.UintToAddressMap storage minterMap = minterForProject[
|
|
611
|
+
_coreContract
|
|
612
|
+
];
|
|
613
|
+
uint256 numProjects = minterMap.length();
|
|
614
|
+
uint256 numProjectsOnContractUsingMinter;
|
|
615
|
+
for (uint256 i; i < numProjects; ) {
|
|
616
|
+
(uint256 projectId, address minter) = minterMap.at(i);
|
|
617
|
+
if (minter == _minter) {
|
|
618
|
+
projectIds[numProjectsOnContractUsingMinter++] = projectId;
|
|
619
|
+
}
|
|
620
|
+
unchecked {
|
|
621
|
+
++i;
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
// trim array if necessary
|
|
625
|
+
if (maxNumProjects > numProjectsOnContractUsingMinter) {
|
|
626
|
+
assembly {
|
|
627
|
+
let decrease := sub(
|
|
628
|
+
maxNumProjects,
|
|
629
|
+
numProjectsOnContractUsingMinter
|
|
630
|
+
)
|
|
631
|
+
mstore(projectIds, sub(mload(projectIds), decrease))
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
return projectIds;
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
/**
|
|
638
|
+
* @notice Convenience function that returns whether `_sender` is allowed
|
|
639
|
+
* to call function with selector `_selector` on contract `_contract`, as
|
|
640
|
+
* determined by this contract's current Admin ACL contract. Expected use
|
|
641
|
+
* cases include minter contracts checking if caller is allowed to call
|
|
642
|
+
* admin-gated functions on minter contracts.
|
|
643
|
+
* @param _sender Address of the sender calling function with selector
|
|
644
|
+
* `_selector` on contract `_contract`.
|
|
645
|
+
* @param _contract Address of the contract being called by `_sender`.
|
|
646
|
+
* @param _selector Function selector of the function being called by
|
|
647
|
+
* `_sender`.
|
|
648
|
+
* @return bool Whether `_sender` is allowed to call function with selector
|
|
649
|
+
* `_selector` on contract `_contract`.
|
|
650
|
+
* @dev assumes the Admin ACL contract is the owner of this contract, which
|
|
651
|
+
* is expected to always be true.
|
|
652
|
+
* @dev adminACLContract is expected to either be null address (if owner
|
|
653
|
+
* has renounced ownership), or conform to IAdminACLV0 interface. Check for
|
|
654
|
+
* null address first to avoid revert when admin has renounced ownership.
|
|
655
|
+
*/
|
|
656
|
+
function adminACLAllowed(
|
|
657
|
+
address _sender,
|
|
658
|
+
address _contract,
|
|
659
|
+
bytes4 _selector
|
|
660
|
+
) public returns (bool) {
|
|
661
|
+
return
|
|
662
|
+
owner() != address(0) &&
|
|
663
|
+
adminACLContract.allowed(_sender, _contract, _selector);
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
/**
|
|
667
|
+
* @notice Returns whether `_minter` is globally approved to mint tokens
|
|
668
|
+
* on any contract.
|
|
669
|
+
* @param _minter Address of minter to check.
|
|
670
|
+
*/
|
|
671
|
+
function isGloballyApprovedMinter(
|
|
672
|
+
address _minter
|
|
673
|
+
) public view returns (bool) {
|
|
674
|
+
return globallyApprovedMinters.contains(_minter);
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
/**
|
|
678
|
+
* @notice Returns whether `_minter` is approved to mint tokens on
|
|
679
|
+
* core contract `_coreContract`.
|
|
680
|
+
* @param _coreContract Address of core contract to check.
|
|
681
|
+
* @param _minter Address of minter to check.
|
|
682
|
+
*/
|
|
683
|
+
function isApprovedMinterForContract(
|
|
684
|
+
address _coreContract,
|
|
685
|
+
address _minter
|
|
686
|
+
) public view returns (bool) {
|
|
687
|
+
return
|
|
688
|
+
isGloballyApprovedMinter(_minter) ||
|
|
689
|
+
contractApprovedMinters[_coreContract].contains(_minter);
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
/**
|
|
693
|
+
* @notice Returns contract owner. Set to deployer's address by default on
|
|
694
|
+
* contract deployment.
|
|
695
|
+
* @return address Address of contract owner.
|
|
696
|
+
* @dev ref: https://docs.openzeppelin.com/contracts/4.x/api/access#Ownable
|
|
697
|
+
* @dev owner role was called `admin` prior to V3 core contract
|
|
698
|
+
*/
|
|
699
|
+
function owner()
|
|
700
|
+
public
|
|
701
|
+
view
|
|
702
|
+
override(Ownable, IMinterFilterV1)
|
|
703
|
+
returns (address)
|
|
704
|
+
{
|
|
705
|
+
return Ownable.owner();
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
/**
|
|
709
|
+
* @notice Updates project `_projectId` to have no configured minter
|
|
710
|
+
* Reverts if project does not already have an assigned minter.
|
|
711
|
+
* @param _projectId Project ID to remove minter.
|
|
712
|
+
* @dev requires project to have an assigned minter
|
|
713
|
+
* @dev this function intentionally does not check that the core contract
|
|
714
|
+
* is registered, since it must have been registered at the time the
|
|
715
|
+
* project was assigned a minter
|
|
716
|
+
*/
|
|
717
|
+
function _removeMinterForProject(
|
|
718
|
+
uint256 _projectId,
|
|
719
|
+
address _coreContract
|
|
720
|
+
) internal {
|
|
721
|
+
// remove minter for project and emit
|
|
722
|
+
// @dev `minterForProject.get()` reverts tx if no minter set for project
|
|
723
|
+
numProjectsUsingMinter[
|
|
724
|
+
minterForProject[_coreContract].get(
|
|
725
|
+
_projectId,
|
|
726
|
+
"No minter assigned"
|
|
727
|
+
)
|
|
728
|
+
]--;
|
|
729
|
+
minterForProject[_coreContract].remove(_projectId);
|
|
730
|
+
emit ProjectMinterRemoved(_projectId, _coreContract);
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
/**
|
|
734
|
+
* @notice Transfers ownership of the contract to a new account (`_owner`).
|
|
735
|
+
* Internal function without access restriction.
|
|
736
|
+
* @param _owner New owner.
|
|
737
|
+
* @dev owner role was called `admin` prior to V3 core contract.
|
|
738
|
+
* @dev Overrides and wraps OpenZeppelin's _transferOwnership function to
|
|
739
|
+
* also update adminACLContract for improved introspection.
|
|
740
|
+
*/
|
|
741
|
+
function _transferOwnership(address _owner) internal override {
|
|
742
|
+
Ownable._transferOwnership(_owner);
|
|
743
|
+
adminACLContract = IAdminACLV0(_owner);
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
/**
|
|
747
|
+
* @notice Updates this contract's core registry contract to
|
|
748
|
+
* `_coreRegistry`.
|
|
749
|
+
* @param _coreRegistry New core registry contract address.
|
|
750
|
+
*/
|
|
751
|
+
function _updateCoreRegistry(address _coreRegistry) internal {
|
|
752
|
+
_onlyNonZeroAddress(_coreRegistry);
|
|
753
|
+
coreRegistry = ICoreRegistryV1(_coreRegistry);
|
|
754
|
+
emit CoreRegistryUpdated(_coreRegistry);
|
|
755
|
+
}
|
|
756
|
+
}
|