@artblocks/contracts 0.0.1
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/.env.example +10 -0
- package/LICENSE +165 -0
- package/README.md +286 -0
- package/artifacts/contracts/AdminACLV0.sol/AdminACLV0.json +164 -0
- package/artifacts/contracts/AdminACLV1.sol/AdminACLV1.json +248 -0
- package/artifacts/contracts/BasicRandomizer.sol/BasicRandomizer.json +24 -0
- package/artifacts/contracts/BasicRandomizerV2.sol/BasicRandomizerV2.json +102 -0
- package/artifacts/contracts/DependencyRegistryV0.sol/DependencyRegistryV0.json +1020 -0
- package/artifacts/contracts/GenArt721CoreV3.sol/GenArt721CoreV3.json +1928 -0
- package/artifacts/contracts/GenArt721CoreV3_Engine.sol/GenArt721CoreV3_Engine.json +1942 -0
- package/artifacts/contracts/engine/GenArt721CoreV2_ENGINE_FLEX.sol/GenArt721CoreV2_ENGINE_FLEX.json +1708 -0
- package/artifacts/contracts/engine/GenArt721CoreV2_PBAB.sol/GenArt721CoreV2_PBAB.json +1410 -0
- package/artifacts/contracts/engine/GenArt721CoreV2_PRTNR.sol/GenArt721CoreV2_PRTNR.json +1436 -0
- package/artifacts/contracts/engine/GenArt721MinterBurner_PBAB.sol/GenArt721MinterBurner_PBAB.json +437 -0
- package/artifacts/contracts/engine/GenArt721MinterDAExp_PBAB.sol/GenArt721MinterDAExp_PBAB.json +508 -0
- package/artifacts/contracts/engine/GenArt721Minter_PBAB.sol/GenArt721Minter_PBAB.json +381 -0
- package/artifacts/contracts/engine-registry/EngineRegistryV0.sol/EngineRegistryV0.json +109 -0
- package/artifacts/contracts/engine-registry/future/EngineRegistryV1.sol/EngineRegistryV1.json +109 -0
- package/artifacts/contracts/explorations/GenArt721CoreV3_Explorations.sol/GenArt721CoreV3_Explorations.json +1902 -0
- package/artifacts/contracts/interfaces/0.5.x/IBonusContract.sol/IBonusContract.json +47 -0
- package/artifacts/contracts/interfaces/0.5.x/IGenArt721CoreContractV1.sol/IGenArt721CoreContractV1.json +413 -0
- package/artifacts/contracts/interfaces/0.5.x/IGenArt721CoreV2_PBAB.sol/IGenArt721CoreV2_PBAB.json +392 -0
- package/artifacts/contracts/interfaces/0.5.x/IRandomizer.sol/IRandomizer.json +26 -0
- package/artifacts/contracts/interfaces/0.8.x/IAdminACLV0.sol/IAdminACLV0.json +122 -0
- package/artifacts/contracts/interfaces/0.8.x/IArtblocksRoyaltyOverride.sol/IArtblocksRoyaltyOverride.json +59 -0
- package/artifacts/contracts/interfaces/0.8.x/IBonusContract.sol/IBonusContract.json +43 -0
- package/artifacts/contracts/interfaces/0.8.x/IDelegationRegistry.sol/IDelegationRegistry.json +510 -0
- package/artifacts/contracts/interfaces/0.8.x/IDependencyRegistryCompatibleV0.sol/IDependencyRegistryCompatibleV0.json +53 -0
- package/artifacts/contracts/interfaces/0.8.x/IDependencyRegistryV0.sol/IDependencyRegistryV0.json +350 -0
- package/artifacts/contracts/interfaces/0.8.x/IEngineRegistryV0.sol/IEngineRegistryV0.json +85 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlementV0.sol/IFilteredMinterDAExpSettlementV0.json +730 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDAExpV0.sol/IFilteredMinterDAExpV0.json +311 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDAExpV1.sol/IFilteredMinterDAExpV1.json +617 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDALinV0.sol/IFilteredMinterDALinV0.json +292 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDALinV1.sol/IFilteredMinterDALinV1.json +598 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterHolderV0.sol/IFilteredMinterHolderV0.json +355 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterHolderV1.sol/IFilteredMinterHolderV1.json +368 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterHolderV2.sol/IFilteredMinterHolderV2.json +674 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterMerkleV0.sol/IFilteredMinterMerkleV0.json +551 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterMerkleV1.sol/IFilteredMinterMerkleV1.json +564 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterMerkleV2.sol/IFilteredMinterMerkleV2.json +601 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterV0.sol/IFilteredMinterV0.json +216 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterV1.sol/IFilteredMinterV1.json +485 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterV2.sol/IFilteredMinterV2.json +522 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV1.sol/IGenArt721CoreContractV1.json +299 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3.sol/IGenArt721CoreContractV3.json +609 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Base.sol/IGenArt721CoreContractV3_Base.json +448 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Engine.sol/IGenArt721CoreContractV3_Engine.json +649 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreV2_PBAB.sol/IGenArt721CoreV2_PBAB.json +362 -0
- package/artifacts/contracts/interfaces/0.8.x/IManifold.sol/IManifold.json +35 -0
- package/artifacts/contracts/interfaces/0.8.x/IMinterFilterV0.sol/IMinterFilterV0.json +192 -0
- package/artifacts/contracts/interfaces/0.8.x/IRandomizer.sol/IRandomizer.json +24 -0
- package/artifacts/contracts/interfaces/0.8.x/IRandomizerV2.sol/IRandomizerV2.json +37 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/Address.json +10 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/Counters.json +10 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/CustomERC721Metadata.json +425 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/ERC165.json +38 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/ERC721.json +322 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/ERC721Enumerable.json +384 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/GenArt721CoreV1.json +1773 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/IERC165.json +32 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/IERC721.json +316 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/IERC721Enumerable.json +378 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/IERC721Receiver.json +47 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/SafeMath.json +10 -0
- package/artifacts/contracts/legacy/GenArt721CoreV1.sol/Strings.json +10 -0
- package/artifacts/contracts/legacy/GenArt721LegacyMinter.sol/GenArt721LegacyMinter.json +338 -0
- package/artifacts/contracts/libs/0.5.x/CustomERC721Metadata.sol/CustomERC721Metadata.json +425 -0
- package/artifacts/contracts/libs/0.5.x/IERC20.sol/IERC20.json +206 -0
- package/artifacts/contracts/libs/0.5.x/SafeMath.sol/SafeMath.json +10 -0
- package/artifacts/contracts/libs/0.5.x/Strings.sol/Strings.json +10 -0
- package/artifacts/contracts/libs/0.8.x/BytecodeStorage.sol/BytecodeStorage.json +10 -0
- package/artifacts/contracts/libs/0.8.x/Bytes32Strings.sol/Bytes32Strings.json +10 -0
- package/artifacts/contracts/libs/0.8.x/ERC721_PackedHashSeed.sol/ERC721_PackedHashSeed.json +357 -0
- package/artifacts/contracts/libs/integration-refs/delegation-registry/DelegationRegistry.sol/DelegationRegistry.json +529 -0
- package/artifacts/contracts/libs/integration-refs/gnosis-safe/GnosisSafeMock.sol/GnosisSafeMock.json +1037 -0
- package/artifacts/contracts/libs/integration-refs/gnosis-safe/GnosisSafeProxyFactoryMock.sol/GnosisSafeProxyFactoryMock.json +172 -0
- package/artifacts/contracts/libs/integration-refs/gnosis-safe/MultiSendMock.sol/MultiSendMock.json +24 -0
- package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV0.sol/MinterFilterV0.json +342 -0
- package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV1.sol/MinterFilterV1.json +322 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDAExp/MinterDAExpV2.sol/MinterDAExpV2.json +550 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDAExp/MinterDAExpV3.sol/MinterDAExpV3.json +856 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol/MinterDAExpSettlementV0.json +1053 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDALin/MinterDALinV2.sol/MinterDALinV2.json +526 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDALin/MinterDALinV3.sol/MinterDALinV3.json +832 -0
- package/artifacts/contracts/minter-suite/Minters/MinterHolder/MinterHolderV2.sol/MinterHolderV2.json +794 -0
- package/artifacts/contracts/minter-suite/Minters/MinterHolder/MinterHolderV3.sol/MinterHolderV3.json +1100 -0
- package/artifacts/contracts/minter-suite/Minters/MinterMerkle/MinterMerkleV3.sol/MinterMerkleV3.json +1002 -0
- package/artifacts/contracts/minter-suite/Minters/MinterMerkle/MinterMerkleV4.sol/MinterMerkleV4.json +1039 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPrice/MinterSetPriceV2.sol/MinterSetPriceV2.json +365 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPrice/MinterSetPriceV3.sol/MinterSetPriceV3.json +671 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPrice/deprecated/MinterSetPriceV1.sol/MinterSetPriceV1.json +288 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V2.sol/MinterSetPriceERC20V2.json +436 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V3.sol/MinterSetPriceERC20V3.json +742 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20/deprecated/MinterSetPriceERC20V0.sol/MinterSetPriceERC20V0.json +461 -0
- package/artifacts/contracts/mock/BytecodeTextCR_DMock.sol/BytecodeTextCR_DMock.json +194 -0
- package/artifacts/contracts/mock/DeadReceiverMock.sol/DeadReceiverMock.json +15 -0
- package/artifacts/contracts/mock/ERC20Mock.sol/ERC20Mock.json +292 -0
- package/artifacts/contracts/mock/MockAdminACLV0.sol/MockAdminACLV0Events.json +165 -0
- package/artifacts/contracts/mock/RandomizerV2_NoAssignMock.sol/RandomizerV2_NoAssignMock.json +128 -0
- package/artifacts/contracts/mock/ReentrancyHolderMock.sol/ReentrancyHolderMock.json +118 -0
- package/artifacts/contracts/mock/ReentrancyMerkleMock.sol/ReentrancyMerkleMock.json +87 -0
- package/artifacts/contracts/mock/ReentrancyMock.sol/ReentrancyMock.json +82 -0
- package/artifacts/contracts/royalty-registry/GenArt721RoyaltyOverride.sol/GenArt721RoyaltyOverride.json +208 -0
- package/artifacts/contracts/royalty-registry/GenArt721RoyaltyOverride_PBAB.sol/GenArt721RoyaltyOverride_PBAB.json +301 -0
- package/contracts/AdminACLV0.sol +103 -0
- package/contracts/AdminACLV1.sol +193 -0
- package/contracts/BasicRandomizer.sol +23 -0
- package/contracts/BasicRandomizerV2.sol +36 -0
- package/contracts/DependencyRegistryV0.sol +893 -0
- package/contracts/GenArt721CoreV3.sol +2001 -0
- package/contracts/GenArt721CoreV3_Engine.sol +2061 -0
- package/contracts/engine/GenArt721CoreV2_ENGINE_FLEX.sol +887 -0
- package/contracts/engine/GenArt721CoreV2_PBAB.sol +695 -0
- package/contracts/engine/GenArt721CoreV2_PRTNR.sol +749 -0
- package/contracts/engine/GenArt721MinterBurner_PBAB.sol +467 -0
- package/contracts/engine/GenArt721MinterDAExp_PBAB.sol +614 -0
- package/contracts/engine/GenArt721Minter_PBAB.sol +420 -0
- package/contracts/engine-registry/EngineRegistryV0.sol +72 -0
- package/contracts/engine-registry/future/EngineRegistryV1.sol +86 -0
- package/contracts/explorations/GenArt721CoreV3_Explorations.sol +1989 -0
- package/contracts/interfaces/0.5.x/IBonusContract.sol +10 -0
- package/contracts/interfaces/0.5.x/IGenArt721CoreContractV1.sol +91 -0
- package/contracts/interfaces/0.5.x/IGenArt721CoreV2_PBAB.sol +92 -0
- package/contracts/interfaces/0.5.x/IRandomizer.sol +8 -0
- package/contracts/interfaces/0.8.x/IAdminACLV0.sol +51 -0
- package/contracts/interfaces/0.8.x/IArtblocksRoyaltyOverride.sol +34 -0
- package/contracts/interfaces/0.8.x/IBonusContract.sol +10 -0
- package/contracts/interfaces/0.8.x/IDelegationRegistry.sol +221 -0
- package/contracts/interfaces/0.8.x/IDependencyRegistryCompatibleV0.sol +31 -0
- package/contracts/interfaces/0.8.x/IDependencyRegistryV0.sol +95 -0
- package/contracts/interfaces/0.8.x/IEngineRegistryV0.sol +38 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlementV0.sol +70 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterDAExpV0.sol +35 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterDAExpV1.sol +16 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterDALinV0.sol +32 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterDALinV1.sol +16 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterHolderV0.sol +68 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterHolderV1.sol +19 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterHolderV2.sol +19 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterMerkleV0.sol +37 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterMerkleV1.sol +19 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterMerkleV2.sol +19 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterV0.sol +74 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterV1.sol +127 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterV2.sol +30 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreContractV1.sol +73 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3.sol +79 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Base.sol +127 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Engine.sol +80 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreV2_PBAB.sol +91 -0
- package/contracts/interfaces/0.8.x/IManifold.sol +24 -0
- package/contracts/interfaces/0.8.x/IMinterFilterV0.sol +47 -0
- package/contracts/interfaces/0.8.x/IRandomizer.sol +8 -0
- package/contracts/interfaces/0.8.x/IRandomizerV2.sol +15 -0
- package/contracts/legacy/GenArt721CoreV1.sol +1593 -0
- package/contracts/legacy/GenArt721LegacyMinter.sol +275 -0
- package/contracts/libs/0.5.x/CustomERC721Metadata.sol +52 -0
- package/contracts/libs/0.5.x/IERC20.sol +96 -0
- package/contracts/libs/0.5.x/SafeMath.sol +98 -0
- package/contracts/libs/0.5.x/Strings.sol +92 -0
- package/contracts/libs/0.8.x/BytecodeStorage.sol +314 -0
- package/contracts/libs/0.8.x/Bytes32Strings.sol +66 -0
- package/contracts/libs/0.8.x/ERC721_PackedHashSeed.sol +514 -0
- package/contracts/libs/integration-refs/delegation-registry/DelegationRegistry.sol +663 -0
- package/contracts/libs/integration-refs/gnosis-safe/GnosisSafeMock.sol +6 -0
- package/contracts/libs/integration-refs/gnosis-safe/GnosisSafeProxyFactoryMock.sol +6 -0
- package/contracts/libs/integration-refs/gnosis-safe/MultiSendMock.sol +6 -0
- package/contracts/minter-suite/MinterFilter/MinterFilterV0.sol +291 -0
- package/contracts/minter-suite/MinterFilter/MinterFilterV1.sol +320 -0
- package/contracts/minter-suite/Minters/MinterDAExp/MinterDAExpV2.sol +571 -0
- package/contracts/minter-suite/Minters/MinterDAExp/MinterDAExpV3.sol +622 -0
- package/contracts/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol +1066 -0
- package/contracts/minter-suite/Minters/MinterDALin/MinterDALinV2.sol +527 -0
- package/contracts/minter-suite/Minters/MinterDALin/MinterDALinV3.sol +576 -0
- package/contracts/minter-suite/Minters/MinterHolder/MinterHolderV2.sol +749 -0
- package/contracts/minter-suite/Minters/MinterHolder/MinterHolderV3.sol +798 -0
- package/contracts/minter-suite/Minters/MinterMerkle/MinterMerkleV3.sol +682 -0
- package/contracts/minter-suite/Minters/MinterMerkle/MinterMerkleV4.sol +733 -0
- package/contracts/minter-suite/Minters/MinterSetPrice/MinterSetPriceV2.sol +350 -0
- package/contracts/minter-suite/Minters/MinterSetPrice/MinterSetPriceV3.sol +401 -0
- package/contracts/minter-suite/Minters/MinterSetPrice/deprecated/MinterSetPriceV1.sol +274 -0
- package/contracts/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V2.sol +491 -0
- package/contracts/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V3.sol +542 -0
- package/contracts/minter-suite/Minters/MinterSetPriceERC20/deprecated/MinterSetPriceERC20V0.sol +470 -0
- package/contracts/mock/BytecodeTextCR_DMock.sol +184 -0
- package/contracts/mock/DeadReceiverMock.sol +13 -0
- package/contracts/mock/ERC20Mock.sol +11 -0
- package/contracts/mock/MockAdminACLV0.sol +65 -0
- package/contracts/mock/RandomizerV2_NoAssignMock.sol +43 -0
- package/contracts/mock/ReentrancyHolderMock.sol +50 -0
- package/contracts/mock/ReentrancyMerkleMock.sol +64 -0
- package/contracts/mock/ReentrancyMock.sol +44 -0
- package/contracts/royalty-registry/GenArt721RoyaltyOverride.sol +168 -0
- package/contracts/royalty-registry/GenArt721RoyaltyOverride_PBAB.sol +221 -0
- package/package.json +83 -0
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
// SPDX-License-Identifier: LGPL-3.0-only
|
|
2
|
+
// Created By: Art Blocks Inc.
|
|
3
|
+
|
|
4
|
+
import "../../interfaces/0.8.x/IMinterFilterV0.sol";
|
|
5
|
+
import "../../interfaces/0.8.x/IFilteredMinterV0.sol";
|
|
6
|
+
import "../../interfaces/0.8.x/IGenArt721CoreContractV1.sol";
|
|
7
|
+
|
|
8
|
+
import "@openzeppelin-4.5/contracts/utils/structs/EnumerableMap.sol";
|
|
9
|
+
|
|
10
|
+
pragma solidity 0.8.9;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @title Minter filter contract that allows filtered minters to be set
|
|
14
|
+
* on a per-project basis.
|
|
15
|
+
* @author Art Blocks Inc.
|
|
16
|
+
*/
|
|
17
|
+
contract MinterFilterV0 is IMinterFilterV0 {
|
|
18
|
+
/**
|
|
19
|
+
* @notice This minter is to be considered `_coreContractAddress`'s
|
|
20
|
+
* canonical minter.
|
|
21
|
+
* @dev may be vestigial after migrating to V3 core contracts
|
|
22
|
+
*/
|
|
23
|
+
event IsCanonicalMinterFilter(address indexed _coreContractAddress);
|
|
24
|
+
|
|
25
|
+
// add Enumerable Map methods
|
|
26
|
+
using EnumerableMap for EnumerableMap.UintToAddressMap;
|
|
27
|
+
|
|
28
|
+
/// Core contract address this minter interacts with
|
|
29
|
+
address public immutable genArt721CoreAddress;
|
|
30
|
+
|
|
31
|
+
/// This contract only uses the portion of V3 interface also on V1 core
|
|
32
|
+
IGenArt721CoreContractV1 private immutable genArtCoreContract;
|
|
33
|
+
|
|
34
|
+
/// projectId => minter address
|
|
35
|
+
EnumerableMap.UintToAddressMap private minterForProject;
|
|
36
|
+
|
|
37
|
+
/// minter address => qty projects currently using minter
|
|
38
|
+
mapping(address => uint256) public numProjectsUsingMinter;
|
|
39
|
+
|
|
40
|
+
/// minter address => is an approved minter?
|
|
41
|
+
mapping(address => bool) public isApprovedMinter;
|
|
42
|
+
|
|
43
|
+
modifier onlyCoreWhitelisted() {
|
|
44
|
+
require(
|
|
45
|
+
genArtCoreContract.isWhitelisted(msg.sender),
|
|
46
|
+
"Only Core whitelisted"
|
|
47
|
+
);
|
|
48
|
+
_;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
modifier onlyCoreWhitelistedOrArtist(uint256 _projectId) {
|
|
52
|
+
require(
|
|
53
|
+
(genArtCoreContract.isWhitelisted(msg.sender) ||
|
|
54
|
+
msg.sender ==
|
|
55
|
+
genArtCoreContract.projectIdToArtistAddress(_projectId)),
|
|
56
|
+
"Only Core whitelisted or Artist"
|
|
57
|
+
);
|
|
58
|
+
_;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
modifier projectExists(uint256 _projectId) {
|
|
62
|
+
require(
|
|
63
|
+
_projectId < genArtCoreContract.nextProjectId(),
|
|
64
|
+
"Only existing projects"
|
|
65
|
+
);
|
|
66
|
+
_;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
modifier usingApprovedMinter(address _minterAddress) {
|
|
70
|
+
require(
|
|
71
|
+
isApprovedMinter[_minterAddress],
|
|
72
|
+
"Only approved minters are allowed"
|
|
73
|
+
);
|
|
74
|
+
_;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
modifier onlyMintWhitelisted() {
|
|
78
|
+
require(
|
|
79
|
+
genArtCoreContract.isMintWhitelisted(address(this)),
|
|
80
|
+
"Only mint allowlisted"
|
|
81
|
+
);
|
|
82
|
+
_;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* @notice Initializes contract to be a Minter for `_genArt721Address`.
|
|
87
|
+
* @param _genArt721Address Art Blocks core contract address
|
|
88
|
+
* this contract will be a minter for. Can never be updated.
|
|
89
|
+
*/
|
|
90
|
+
constructor(address _genArt721Address) {
|
|
91
|
+
genArt721CoreAddress = _genArt721Address;
|
|
92
|
+
genArtCoreContract = IGenArt721CoreContractV1(_genArt721Address);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* @notice Emits event notifying indexers that this is core contract's
|
|
97
|
+
* canonical minter filter.
|
|
98
|
+
* @dev may be vestigial after migrating to V3 core contracts
|
|
99
|
+
*/
|
|
100
|
+
function alertAsCanonicalMinterFilter()
|
|
101
|
+
external
|
|
102
|
+
onlyCoreWhitelisted
|
|
103
|
+
onlyMintWhitelisted
|
|
104
|
+
{
|
|
105
|
+
emit IsCanonicalMinterFilter(genArt721CoreAddress);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* @notice Approves minter `_minterAddress`.
|
|
110
|
+
* @param _minterAddress Minter to be added as an approved minter.
|
|
111
|
+
*/
|
|
112
|
+
function addApprovedMinter(
|
|
113
|
+
address _minterAddress
|
|
114
|
+
) external onlyCoreWhitelisted {
|
|
115
|
+
isApprovedMinter[_minterAddress] = true;
|
|
116
|
+
emit MinterApproved(
|
|
117
|
+
_minterAddress,
|
|
118
|
+
IFilteredMinterV0(_minterAddress).minterType()
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* @notice Removes previously approved minter `_minterAddress`.
|
|
124
|
+
* @param _minterAddress Minter to remove.
|
|
125
|
+
*/
|
|
126
|
+
function removeApprovedMinter(
|
|
127
|
+
address _minterAddress
|
|
128
|
+
) external onlyCoreWhitelisted {
|
|
129
|
+
require(
|
|
130
|
+
numProjectsUsingMinter[_minterAddress] == 0,
|
|
131
|
+
"Only unused minters"
|
|
132
|
+
);
|
|
133
|
+
isApprovedMinter[_minterAddress] = false;
|
|
134
|
+
emit MinterRevoked(_minterAddress);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* @notice Sets minter for project `_projectId` to minter
|
|
139
|
+
* `_minterAddress`.
|
|
140
|
+
* @param _projectId Project ID to set minter for.
|
|
141
|
+
* @param _minterAddress Minter to be the project's minter.
|
|
142
|
+
*/
|
|
143
|
+
function setMinterForProject(
|
|
144
|
+
uint256 _projectId,
|
|
145
|
+
address _minterAddress
|
|
146
|
+
)
|
|
147
|
+
external
|
|
148
|
+
onlyCoreWhitelistedOrArtist(_projectId)
|
|
149
|
+
usingApprovedMinter(_minterAddress)
|
|
150
|
+
projectExists(_projectId)
|
|
151
|
+
{
|
|
152
|
+
// decrement number of projects using a previous minter
|
|
153
|
+
(bool hasPreviousMinter, address previousMinter) = minterForProject
|
|
154
|
+
.tryGet(_projectId);
|
|
155
|
+
if (hasPreviousMinter) {
|
|
156
|
+
numProjectsUsingMinter[previousMinter]--;
|
|
157
|
+
}
|
|
158
|
+
// add new minter
|
|
159
|
+
numProjectsUsingMinter[_minterAddress]++;
|
|
160
|
+
minterForProject.set(_projectId, _minterAddress);
|
|
161
|
+
emit ProjectMinterRegistered(
|
|
162
|
+
_projectId,
|
|
163
|
+
_minterAddress,
|
|
164
|
+
IFilteredMinterV0(_minterAddress).minterType()
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* @notice Updates project `_projectId` to have no configured minter.
|
|
170
|
+
* @param _projectId Project ID to remove minter.
|
|
171
|
+
* @dev requires project to have an assigned minter
|
|
172
|
+
*/
|
|
173
|
+
function removeMinterForProject(
|
|
174
|
+
uint256 _projectId
|
|
175
|
+
) external onlyCoreWhitelistedOrArtist(_projectId) {
|
|
176
|
+
_removeMinterForProject(_projectId);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* @notice Updates an array of project IDs to have no configured minter.
|
|
181
|
+
* @param _projectIds Array of project IDs to remove minters for.
|
|
182
|
+
* @dev requires all project IDs to have an assigned minter
|
|
183
|
+
* @dev caution with respect to single tx gas limits
|
|
184
|
+
*/
|
|
185
|
+
function removeMintersForProjects(
|
|
186
|
+
uint256[] calldata _projectIds
|
|
187
|
+
) external onlyCoreWhitelisted {
|
|
188
|
+
uint256 numProjects = _projectIds.length;
|
|
189
|
+
for (uint256 i; i < numProjects; i++) {
|
|
190
|
+
_removeMinterForProject(_projectIds[i]);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* @notice Updates project `_projectId` to have no configured minter
|
|
196
|
+
* (reverts tx if project does not have an assigned minter).
|
|
197
|
+
* @param _projectId Project ID to remove minter.
|
|
198
|
+
*/
|
|
199
|
+
function _removeMinterForProject(uint256 _projectId) private {
|
|
200
|
+
// remove minter for project and emit
|
|
201
|
+
// `minterForProject.get()` reverts tx if no minter set for project
|
|
202
|
+
numProjectsUsingMinter[minterForProject.get(_projectId)]--;
|
|
203
|
+
minterForProject.remove(_projectId);
|
|
204
|
+
emit ProjectMinterRemoved(_projectId);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* @notice Mint a token from project `_projectId` to `_to`, originally
|
|
209
|
+
* purchased by `sender`.
|
|
210
|
+
* @param _to The new token's owner.
|
|
211
|
+
* @param _projectId Project ID to mint a new token on.
|
|
212
|
+
* @param sender Address purchasing a new token.
|
|
213
|
+
* @return _tokenId Token ID of minted token
|
|
214
|
+
* @dev reverts w/nonexistent key error when project has no assigned minter
|
|
215
|
+
*/
|
|
216
|
+
function mint(
|
|
217
|
+
address _to,
|
|
218
|
+
uint256 _projectId,
|
|
219
|
+
address sender
|
|
220
|
+
) external returns (uint256 _tokenId) {
|
|
221
|
+
// CHECKS
|
|
222
|
+
// minter is the project's minter
|
|
223
|
+
require(
|
|
224
|
+
msg.sender == minterForProject.get(_projectId),
|
|
225
|
+
"Only assigned minter"
|
|
226
|
+
);
|
|
227
|
+
// EFFECTS
|
|
228
|
+
uint256 tokenId = genArtCoreContract.mint(_to, _projectId, sender);
|
|
229
|
+
return tokenId;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* @notice Gets the assigned minter for project `_projectId`.
|
|
234
|
+
* @param _projectId Project ID to query.
|
|
235
|
+
* @return address Minter address assigned to project `_projectId`
|
|
236
|
+
* @dev requires project to have an assigned minter
|
|
237
|
+
*/
|
|
238
|
+
function getMinterForProject(
|
|
239
|
+
uint256 _projectId
|
|
240
|
+
) external view returns (address) {
|
|
241
|
+
(bool _hasMinter, address _currentMinter) = minterForProject.tryGet(
|
|
242
|
+
_projectId
|
|
243
|
+
);
|
|
244
|
+
require(_hasMinter, "No minter assigned");
|
|
245
|
+
return _currentMinter;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* @notice Queries if project `_projectId` has an assigned minter.
|
|
250
|
+
* @param _projectId Project ID to query.
|
|
251
|
+
* @return bool true if project has an assigned minter, else false
|
|
252
|
+
* @dev requires project to have an assigned minter
|
|
253
|
+
*/
|
|
254
|
+
function projectHasMinter(uint256 _projectId) external view returns (bool) {
|
|
255
|
+
(bool _hasMinter, ) = minterForProject.tryGet(_projectId);
|
|
256
|
+
return _hasMinter;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* @notice Gets quantity of projects that have assigned minters.
|
|
261
|
+
* @return uint256 quantity of projects that have assigned minters
|
|
262
|
+
*/
|
|
263
|
+
function getNumProjectsWithMinters() external view returns (uint256) {
|
|
264
|
+
return minterForProject.length();
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* @notice Get project ID and minter address at index `_index` of
|
|
269
|
+
* enumerable map.
|
|
270
|
+
* @param _index enumerable map index to query.
|
|
271
|
+
* @return projectId project ID at index `_index`
|
|
272
|
+
* @return minterAddress minter address for project at index `_index`
|
|
273
|
+
* @return minterType minter type of minter at minterAddress
|
|
274
|
+
* @dev index must be < quantity of projects that have assigned minters
|
|
275
|
+
*/
|
|
276
|
+
function getProjectAndMinterInfoAt(
|
|
277
|
+
uint256 _index
|
|
278
|
+
)
|
|
279
|
+
external
|
|
280
|
+
view
|
|
281
|
+
returns (
|
|
282
|
+
uint256 projectId,
|
|
283
|
+
address minterAddress,
|
|
284
|
+
string memory minterType
|
|
285
|
+
)
|
|
286
|
+
{
|
|
287
|
+
(projectId, minterAddress) = minterForProject.at(_index);
|
|
288
|
+
minterType = IFilteredMinterV0(minterAddress).minterType();
|
|
289
|
+
return (projectId, minterAddress, minterType);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
// SPDX-License-Identifier: LGPL-3.0-only
|
|
2
|
+
// Created By: Art Blocks Inc.
|
|
3
|
+
|
|
4
|
+
import "../../interfaces/0.8.x/IMinterFilterV0.sol";
|
|
5
|
+
import "../../interfaces/0.8.x/IFilteredMinterV0.sol";
|
|
6
|
+
import "../../interfaces/0.8.x/IAdminACLV0.sol";
|
|
7
|
+
import "../../interfaces/0.8.x/IGenArt721CoreContractV3.sol";
|
|
8
|
+
|
|
9
|
+
import "@openzeppelin-4.5/contracts/utils/structs/EnumerableMap.sol";
|
|
10
|
+
|
|
11
|
+
pragma solidity 0.8.17;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @title Minter filter contract that allows filtered minters to be set
|
|
15
|
+
* on a per-project basis.
|
|
16
|
+
* This is designed to be used with IGenArt721CoreContractV3 contracts.
|
|
17
|
+
* @author Art Blocks Inc.
|
|
18
|
+
* @notice Privileged Roles and Ownership:
|
|
19
|
+
* This contract is designed to be managed, with limited powers.
|
|
20
|
+
* Privileged roles and abilities are controlled by the core contract's Admin
|
|
21
|
+
* ACL contract and a project's artist. Both of these roles hold extensive
|
|
22
|
+
* power and can modify a project's current minter.
|
|
23
|
+
* Care must be taken to ensure that the admin ACL contract and artist
|
|
24
|
+
* addresses are secure behind a multi-sig or other access control mechanism.
|
|
25
|
+
* ----------------------------------------------------------------------------
|
|
26
|
+
* The following functions are restricted to the core contract's Admin ACL
|
|
27
|
+
* contract:
|
|
28
|
+
* - addApprovedMinters
|
|
29
|
+
* - removeApprovedMinters
|
|
30
|
+
* - removeMintersForProjects
|
|
31
|
+
* ----------------------------------------------------------------------------
|
|
32
|
+
* The following functions are restricted to the core contract's Admin ACL
|
|
33
|
+
* contract or a project's artist:
|
|
34
|
+
* - setMinterForProject
|
|
35
|
+
* - removeMinterForProject
|
|
36
|
+
* ----------------------------------------------------------------------------
|
|
37
|
+
* Additional admin and artist privileged roles may be described on minters
|
|
38
|
+
*/
|
|
39
|
+
contract MinterFilterV1 is IMinterFilterV0 {
|
|
40
|
+
// add Enumerable Map methods
|
|
41
|
+
using EnumerableMap for EnumerableMap.UintToAddressMap;
|
|
42
|
+
|
|
43
|
+
/// Core contract address this minter interacts with
|
|
44
|
+
address public immutable genArt721CoreAddress;
|
|
45
|
+
|
|
46
|
+
/// This contract integrates with the IV3 core contract
|
|
47
|
+
IGenArt721CoreContractV3 private immutable genArtCoreContract;
|
|
48
|
+
|
|
49
|
+
/// projectId => minter address
|
|
50
|
+
EnumerableMap.UintToAddressMap private minterForProject;
|
|
51
|
+
|
|
52
|
+
/// minter address => qty projects currently using minter
|
|
53
|
+
mapping(address => uint256) public numProjectsUsingMinter;
|
|
54
|
+
|
|
55
|
+
/// minter address => is an approved minter?
|
|
56
|
+
mapping(address => bool) public isApprovedMinter;
|
|
57
|
+
|
|
58
|
+
modifier onlyNonZeroAddress(address _address) {
|
|
59
|
+
require(_address != address(0), "Must input non-zero address");
|
|
60
|
+
_;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// modifier to restrict access to only AdminACL allowed calls
|
|
64
|
+
// @dev defers which ACL contract is used to the core contract
|
|
65
|
+
modifier onlyCoreAdminACL(bytes4 _selector) {
|
|
66
|
+
require(_coreAdminACLAllowed(_selector), "Only Core AdminACL allowed");
|
|
67
|
+
_;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// modifier to restrict access to only the artist of `_projectId`, or
|
|
71
|
+
// AdminACL allowed calls
|
|
72
|
+
// @dev defers which ACL contract is used to the core contract
|
|
73
|
+
modifier onlyCoreAdminACLOrArtist(uint256 _projectId, bytes4 _selector) {
|
|
74
|
+
require(
|
|
75
|
+
msg.sender ==
|
|
76
|
+
genArtCoreContract.projectIdToArtistAddress(_projectId) ||
|
|
77
|
+
_coreAdminACLAllowed(_selector),
|
|
78
|
+
"Only Core AdminACL or Artist"
|
|
79
|
+
);
|
|
80
|
+
_;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
modifier onlyValidProjectId(uint256 _projectId) {
|
|
84
|
+
require(
|
|
85
|
+
_projectId < genArtCoreContract.nextProjectId(),
|
|
86
|
+
"Only existing projects"
|
|
87
|
+
);
|
|
88
|
+
_;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
modifier usingApprovedMinter(address _minterAddress) {
|
|
92
|
+
require(
|
|
93
|
+
isApprovedMinter[_minterAddress],
|
|
94
|
+
"Only approved minters are allowed"
|
|
95
|
+
);
|
|
96
|
+
_;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* @notice Initializes contract to be a Minter for `_genArt721Address`.
|
|
101
|
+
* @param _genArt721Address Art Blocks core contract address
|
|
102
|
+
* this contract will be a minter for. Can never be updated.
|
|
103
|
+
*/
|
|
104
|
+
constructor(
|
|
105
|
+
address _genArt721Address
|
|
106
|
+
) onlyNonZeroAddress(_genArt721Address) {
|
|
107
|
+
genArt721CoreAddress = _genArt721Address;
|
|
108
|
+
genArtCoreContract = IGenArt721CoreContractV3(_genArt721Address);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* @notice Internal function that determines if msg.sender is allowed to
|
|
113
|
+
* call a function on this contract. Defers to core contract's
|
|
114
|
+
* adminACLAllowed function.
|
|
115
|
+
*/
|
|
116
|
+
function _coreAdminACLAllowed(bytes4 _selector) internal returns (bool) {
|
|
117
|
+
return
|
|
118
|
+
genArtCoreContract.adminACLAllowed(
|
|
119
|
+
msg.sender,
|
|
120
|
+
address(this),
|
|
121
|
+
_selector
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* @notice Approves minter `_minterAddress`.
|
|
127
|
+
* @param _minterAddress Minter to be added as an approved minter.
|
|
128
|
+
*/
|
|
129
|
+
function addApprovedMinter(
|
|
130
|
+
address _minterAddress
|
|
131
|
+
)
|
|
132
|
+
external
|
|
133
|
+
onlyCoreAdminACL(this.addApprovedMinter.selector)
|
|
134
|
+
onlyNonZeroAddress(_minterAddress)
|
|
135
|
+
{
|
|
136
|
+
isApprovedMinter[_minterAddress] = true;
|
|
137
|
+
emit MinterApproved(
|
|
138
|
+
_minterAddress,
|
|
139
|
+
IFilteredMinterV0(_minterAddress).minterType()
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* @notice Removes previously approved minter `_minterAddress`.
|
|
145
|
+
* @param _minterAddress Minter to remove.
|
|
146
|
+
*/
|
|
147
|
+
function removeApprovedMinter(
|
|
148
|
+
address _minterAddress
|
|
149
|
+
) external onlyCoreAdminACL(this.removeApprovedMinter.selector) {
|
|
150
|
+
require(isApprovedMinter[_minterAddress], "Only approved minters");
|
|
151
|
+
require(
|
|
152
|
+
numProjectsUsingMinter[_minterAddress] == 0,
|
|
153
|
+
"Only unused minters"
|
|
154
|
+
);
|
|
155
|
+
isApprovedMinter[_minterAddress] = false;
|
|
156
|
+
emit MinterRevoked(_minterAddress);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* @notice Sets minter for project `_projectId` to minter
|
|
161
|
+
* `_minterAddress`.
|
|
162
|
+
* @param _projectId Project ID to set minter for.
|
|
163
|
+
* @param _minterAddress Minter to be the project's minter.
|
|
164
|
+
*/
|
|
165
|
+
function setMinterForProject(
|
|
166
|
+
uint256 _projectId,
|
|
167
|
+
address _minterAddress
|
|
168
|
+
)
|
|
169
|
+
external
|
|
170
|
+
onlyCoreAdminACLOrArtist(_projectId, this.setMinterForProject.selector)
|
|
171
|
+
usingApprovedMinter(_minterAddress)
|
|
172
|
+
onlyValidProjectId(_projectId)
|
|
173
|
+
{
|
|
174
|
+
// decrement number of projects using a previous minter
|
|
175
|
+
(bool hasPreviousMinter, address previousMinter) = minterForProject
|
|
176
|
+
.tryGet(_projectId);
|
|
177
|
+
if (hasPreviousMinter) {
|
|
178
|
+
numProjectsUsingMinter[previousMinter]--;
|
|
179
|
+
}
|
|
180
|
+
// add new minter
|
|
181
|
+
numProjectsUsingMinter[_minterAddress]++;
|
|
182
|
+
minterForProject.set(_projectId, _minterAddress);
|
|
183
|
+
emit ProjectMinterRegistered(
|
|
184
|
+
_projectId,
|
|
185
|
+
_minterAddress,
|
|
186
|
+
IFilteredMinterV0(_minterAddress).minterType()
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* @notice Updates project `_projectId` to have no configured minter.
|
|
192
|
+
* @param _projectId Project ID to remove minter.
|
|
193
|
+
* @dev requires project to have an assigned minter
|
|
194
|
+
*/
|
|
195
|
+
function removeMinterForProject(
|
|
196
|
+
uint256 _projectId
|
|
197
|
+
)
|
|
198
|
+
external
|
|
199
|
+
onlyCoreAdminACLOrArtist(
|
|
200
|
+
_projectId,
|
|
201
|
+
this.removeMinterForProject.selector
|
|
202
|
+
)
|
|
203
|
+
{
|
|
204
|
+
_removeMinterForProject(_projectId);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* @notice Updates an array of project IDs to have no configured minter.
|
|
209
|
+
* @param _projectIds Array of project IDs to remove minters for.
|
|
210
|
+
* @dev requires all project IDs to have an assigned minter
|
|
211
|
+
* @dev caution with respect to single tx gas limits
|
|
212
|
+
*/
|
|
213
|
+
function removeMintersForProjects(
|
|
214
|
+
uint256[] calldata _projectIds
|
|
215
|
+
) external onlyCoreAdminACL(this.removeMintersForProjects.selector) {
|
|
216
|
+
uint256 numProjects = _projectIds.length;
|
|
217
|
+
for (uint256 i; i < numProjects; i++) {
|
|
218
|
+
_removeMinterForProject(_projectIds[i]);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* @notice Updates project `_projectId` to have no configured minter
|
|
224
|
+
* (reverts tx if project does not have an assigned minter).
|
|
225
|
+
* @param _projectId Project ID to remove minter.
|
|
226
|
+
*/
|
|
227
|
+
function _removeMinterForProject(uint256 _projectId) private {
|
|
228
|
+
// remove minter for project and emit
|
|
229
|
+
// `minterForProject.get()` reverts tx if no minter set for project
|
|
230
|
+
numProjectsUsingMinter[minterForProject.get(_projectId)]--;
|
|
231
|
+
minterForProject.remove(_projectId);
|
|
232
|
+
emit ProjectMinterRemoved(_projectId);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* @notice Mint a token from project `_projectId` to `_to`, originally
|
|
237
|
+
* purchased by `sender`.
|
|
238
|
+
* @param _to The new token's owner.
|
|
239
|
+
* @param _projectId Project ID to mint a new token on.
|
|
240
|
+
* @param sender Address purchasing a new token.
|
|
241
|
+
* @return _tokenId Token ID of minted token
|
|
242
|
+
* @dev reverts w/nonexistent key error when project has no assigned minter
|
|
243
|
+
*/
|
|
244
|
+
function mint(
|
|
245
|
+
address _to,
|
|
246
|
+
uint256 _projectId,
|
|
247
|
+
address sender
|
|
248
|
+
) external returns (uint256 _tokenId) {
|
|
249
|
+
// CHECKS
|
|
250
|
+
// minter is the project's minter
|
|
251
|
+
require(
|
|
252
|
+
msg.sender == minterForProject.get(_projectId),
|
|
253
|
+
"Only assigned minter"
|
|
254
|
+
);
|
|
255
|
+
// EFFECTS
|
|
256
|
+
uint256 tokenId = genArtCoreContract.mint_Ecf(_to, _projectId, sender);
|
|
257
|
+
return tokenId;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* @notice Gets the assigned minter for project `_projectId`.
|
|
262
|
+
* @param _projectId Project ID to query.
|
|
263
|
+
* @return address Minter address assigned to project `_projectId`
|
|
264
|
+
* @dev requires project to have an assigned minter
|
|
265
|
+
*/
|
|
266
|
+
function getMinterForProject(
|
|
267
|
+
uint256 _projectId
|
|
268
|
+
) external view onlyValidProjectId(_projectId) returns (address) {
|
|
269
|
+
(bool _hasMinter, address _currentMinter) = minterForProject.tryGet(
|
|
270
|
+
_projectId
|
|
271
|
+
);
|
|
272
|
+
require(_hasMinter, "No minter assigned");
|
|
273
|
+
return _currentMinter;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* @notice Queries if project `_projectId` has an assigned minter.
|
|
278
|
+
* @param _projectId Project ID to query.
|
|
279
|
+
* @return bool true if project has an assigned minter, else false
|
|
280
|
+
*/
|
|
281
|
+
function projectHasMinter(
|
|
282
|
+
uint256 _projectId
|
|
283
|
+
) external view onlyValidProjectId(_projectId) returns (bool) {
|
|
284
|
+
(bool _hasMinter, ) = minterForProject.tryGet(_projectId);
|
|
285
|
+
return _hasMinter;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* @notice Gets quantity of projects that have assigned minters.
|
|
290
|
+
* @return uint256 quantity of projects that have assigned minters
|
|
291
|
+
*/
|
|
292
|
+
function getNumProjectsWithMinters() external view returns (uint256) {
|
|
293
|
+
return minterForProject.length();
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* @notice Get project ID and minter address at index `_index` of
|
|
298
|
+
* enumerable map.
|
|
299
|
+
* @param _index enumerable map index to query.
|
|
300
|
+
* @return projectId project ID at index `_index`
|
|
301
|
+
* @return minterAddress minter address for project at index `_index`
|
|
302
|
+
* @return minterType minter type of minter at minterAddress
|
|
303
|
+
* @dev index must be < quantity of projects that have assigned minters
|
|
304
|
+
*/
|
|
305
|
+
function getProjectAndMinterInfoAt(
|
|
306
|
+
uint256 _index
|
|
307
|
+
)
|
|
308
|
+
external
|
|
309
|
+
view
|
|
310
|
+
returns (
|
|
311
|
+
uint256 projectId,
|
|
312
|
+
address minterAddress,
|
|
313
|
+
string memory minterType
|
|
314
|
+
)
|
|
315
|
+
{
|
|
316
|
+
(projectId, minterAddress) = minterForProject.at(_index);
|
|
317
|
+
minterType = IFilteredMinterV0(minterAddress).minterType();
|
|
318
|
+
return (projectId, minterAddress, minterType);
|
|
319
|
+
}
|
|
320
|
+
}
|