@artblocks/contracts 1.0.0 → 1.0.2
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 +8 -1
- package/README.md +44 -165
- package/artifacts/contracts/AdminACLV1.sol/AdminACLV1.json +2 -2
- package/artifacts/contracts/DependencyRegistryV0.sol/DependencyRegistryV0.json +2 -2
- package/artifacts/contracts/GenArt721CoreV3.sol/GenArt721CoreV3.json +2 -2
- package/artifacts/contracts/GenArt721CoreV3_Engine.sol/GenArt721CoreV3_Engine.json +2 -2
- package/artifacts/contracts/GenArt721CoreV3_Engine_Flex.sol/GenArt721CoreV3_Engine_Flex.json +2229 -0
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV0.sol/MinterDAExpV0.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV1.sol/MinterDAExpV1.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV2.sol/MinterDAExpV2.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV3.sol/MinterDAExpV3.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol/MinterDAExpSettlementV0.json +2 -2
- package/artifacts/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterDAExpSettlement}/MinterDAExpSettlementV1.sol/MinterDAExpSettlementV1.json +3 -3
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV0.sol/MinterDALinV0.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV1.sol/MinterDALinV1.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV2.sol/MinterDALinV2.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV3.sol/MinterDALinV3.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV0.sol/MinterHolderV0.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV1.sol/MinterHolderV1.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV2.sol/MinterHolderV2.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV3.sol/MinterHolderV3.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV0.sol/MinterMerkleV0.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV1.sol/MinterMerkleV1.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV2.sol/MinterMerkleV2.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV3.sol/MinterMerkleV3.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV4.sol/MinterMerkleV4.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV0.sol/MinterSetPriceV0.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV1.sol/MinterSetPriceV1.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV2.sol/MinterSetPriceV2.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV3.sol/MinterSetPriceV3.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V0.sol/MinterSetPriceERC20V0.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V1.sol/MinterSetPriceERC20V1.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V2.sol/MinterSetPriceERC20V2.json +2 -2
- package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V3.sol/MinterSetPriceERC20V3.json +2 -2
- package/artifacts/contracts/explorations/GenArt721CoreV3_Explorations.sol/GenArt721CoreV3_Explorations.json +2 -2
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlementV1.sol/IFilteredMinterDAExpSettlementV1.json +767 -0
- package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterSEAV0.sol/IFilteredMinterSEAV0.json +1032 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3.sol/IGenArt721CoreContractV3.json +149 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Base.sol/IGenArt721CoreContractV3_Base.json +149 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Engine.sol/IGenArt721CoreContractV3_Engine.json +130 -0
- package/artifacts/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Engine_Flex.sol/IGenArt721CoreContractV3_Engine_Flex.json +1066 -0
- package/artifacts/contracts/interfaces/0.8.x/IMinterFilterV0.sol/IMinterFilterV0.json +6 -0
- package/artifacts/contracts/interfaces/0.8.x/IRandomizerPolyptychV0.sol/IRandomizerPolyptychV0.json +87 -0
- package/artifacts/contracts/interfaces/0.8.x/IRandomizerV2.sol/IRandomizerV2.json +1 -1
- package/artifacts/contracts/interfaces/0.8.x/IWETH.sol/IWETH.json +55 -0
- package/artifacts/contracts/libs/integration-refs/weth9/weth9.sol/WETH9_.json +295 -0
- package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV0.sol/MinterFilterV0.json +8 -2
- package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV1.sol/MinterFilterV1.json +34 -2
- package/artifacts/contracts/minter-suite/Minters/MinterDAExpSettlementV2.sol/MinterDAExpSettlementV2.json +1127 -0
- package/artifacts/contracts/minter-suite/Minters/MinterDAExpV4.sol/MinterDAExpV4.json +15 -2
- package/artifacts/contracts/minter-suite/Minters/MinterDALinV4.sol/MinterDALinV4.json +15 -2
- package/artifacts/contracts/minter-suite/Minters/MinterHolderV4.sol/MinterHolderV4.json +15 -2
- package/artifacts/contracts/minter-suite/Minters/MinterMerkleV5.sol/MinterMerkleV5.json +15 -2
- package/artifacts/contracts/minter-suite/Minters/MinterPolyptychV0.sol/IGenArt721CoreContractV3WithRandomizer.json +792 -0
- package/artifacts/contracts/minter-suite/Minters/MinterPolyptychV0.sol/MinterPolyptychV0.json +1268 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSEAV0.sol/MinterSEAV0.json +1310 -0
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20V4.sol/MinterSetPriceERC20V4.json +15 -2
- package/artifacts/contracts/minter-suite/Minters/MinterSetPriceV4.sol/MinterSetPriceV4.json +15 -2
- package/artifacts/contracts/mock/DeadReceiverBidderMock.sol/DeadReceiverBidderMock.json +33 -0
- 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 +2 -2
- package/artifacts/contracts/mock/RandomizerV2_NoAssignMock.sol/RandomizerV2_NoAssignMock.json +3 -3
- package/artifacts/contracts/mock/ReentrancySEAMock.sol/ReentrancySEAAutoBidderMock.json +51 -0
- package/artifacts/contracts/{BasicRandomizer.sol → randomizer/BasicRandomizer.sol}/BasicRandomizer.json +3 -3
- package/artifacts/contracts/randomizer/BasicRandomizerBase_v0_0_0.sol/RandomizerBase.json +10 -0
- package/artifacts/contracts/randomizer/PolyptychRandomizerV0.sol/BasicPolyptychRandomizerV0.json +229 -0
- package/artifacts/contracts/randomizer/RandomizerV2.sol/BasicRandomizerV2.json +102 -0
- package/artifacts/contracts/royalty-registry/GenArt721RoyaltyOverride.sol/GenArt721RoyaltyOverride.json +2 -2
- package/contracts/DependencyRegistryV0.sol +74 -113
- package/contracts/GenArt721CoreV3.sol +124 -171
- package/contracts/GenArt721CoreV3_Engine.sol +136 -198
- package/contracts/GenArt721CoreV3_Engine_Flex.sol +2274 -0
- package/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterDAExpSettlement}/MinterDAExpSettlementV1.sol +4 -4
- package/contracts/explorations/GenArt721CoreV3_Explorations.sol +147 -176
- package/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlementV1.sol +21 -0
- package/contracts/interfaces/0.8.x/IFilteredMinterSEAV0.sol +145 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Base.sol +39 -0
- package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Engine.sol +0 -3
- package/contracts/interfaces/0.8.x/IGenArt721CoreContractV3_Engine_Flex.sol +132 -0
- package/contracts/interfaces/0.8.x/IMinterFilterV0.sol +6 -0
- package/contracts/interfaces/0.8.x/IRandomizerPolyptychV0.sol +31 -0
- package/contracts/interfaces/0.8.x/IRandomizerV2.sol +5 -2
- package/contracts/interfaces/0.8.x/IWETH.sol +11 -0
- package/contracts/libs/integration-refs/weth9/weth9.sol +763 -0
- package/contracts/minter-suite/MinterFilter/MinterFilterV1.sol +53 -47
- package/contracts/minter-suite/Minters/MinterDAExpSettlementV2.sol +1304 -0
- package/contracts/minter-suite/Minters/MinterDAExpV4.sol +47 -24
- package/contracts/minter-suite/Minters/MinterDALinV4.sol +46 -21
- package/contracts/minter-suite/Minters/MinterHolderV4.sol +54 -25
- package/contracts/minter-suite/Minters/MinterMerkleV5.sol +47 -20
- package/contracts/minter-suite/Minters/MinterPolyptychV0.sol +998 -0
- package/contracts/minter-suite/Minters/MinterSEAV0.sol +1224 -0
- package/contracts/minter-suite/Minters/MinterSetPriceERC20V4.sol +45 -16
- package/contracts/minter-suite/Minters/MinterSetPriceV4.sol +40 -13
- package/contracts/mock/DeadReceiverBidderMock.sol +23 -0
- package/contracts/mock/GasLimitReceiverBidderMock.sol +23 -0
- package/contracts/mock/GasLimitReceiverMock.sol +19 -0
- package/contracts/mock/RandomizerV2_NoAssignMock.sol +2 -11
- package/contracts/mock/ReentrancySEAMock.sol +36 -0
- package/contracts/{BasicRandomizer.sol → randomizer/BasicRandomizer.sol} +1 -1
- package/contracts/randomizer/BasicRandomizerBase_v0_0_0.sol +23 -0
- package/contracts/randomizer/PolyptychRandomizerV0.sol +117 -0
- package/contracts/{BasicRandomizerV2.sol → randomizer/RandomizerV2.sol} +7 -15
- package/package.json +32 -13
- package/artifacts/contracts/BasicRandomizerV2.sol/BasicRandomizerV2.json +0 -102
|
@@ -6,6 +6,8 @@ import "../../interfaces/0.8.x/IFilteredMinterV0.sol";
|
|
|
6
6
|
import "../../interfaces/0.8.x/IAdminACLV0.sol";
|
|
7
7
|
import "../../interfaces/0.8.x/IGenArt721CoreContractV3.sol";
|
|
8
8
|
|
|
9
|
+
import "../../libs/0.8.x/Bytes32Strings.sol";
|
|
10
|
+
|
|
9
11
|
import "@openzeppelin-4.5/contracts/utils/structs/EnumerableMap.sol";
|
|
10
12
|
|
|
11
13
|
pragma solidity 0.8.17;
|
|
@@ -25,8 +27,8 @@ pragma solidity 0.8.17;
|
|
|
25
27
|
* ----------------------------------------------------------------------------
|
|
26
28
|
* The following functions are restricted to the core contract's Admin ACL
|
|
27
29
|
* contract:
|
|
28
|
-
* -
|
|
29
|
-
* -
|
|
30
|
+
* - addApprovedMinter
|
|
31
|
+
* - removeApprovedMinter
|
|
30
32
|
* - removeMintersForProjects
|
|
31
33
|
* ----------------------------------------------------------------------------
|
|
32
34
|
* The following functions are restricted to the core contract's Admin ACL
|
|
@@ -39,6 +41,21 @@ pragma solidity 0.8.17;
|
|
|
39
41
|
contract MinterFilterV1 is IMinterFilterV0 {
|
|
40
42
|
// add Enumerable Map methods
|
|
41
43
|
using EnumerableMap for EnumerableMap.UintToAddressMap;
|
|
44
|
+
// add Bytes32Strings methods
|
|
45
|
+
using Bytes32Strings for bytes32;
|
|
46
|
+
|
|
47
|
+
/// version & type of this core contract
|
|
48
|
+
bytes32 constant MINTER_FILTER_VERSION = "v1.0.1";
|
|
49
|
+
|
|
50
|
+
function minterFilterVersion() external pure returns (string memory) {
|
|
51
|
+
return MINTER_FILTER_VERSION.toString();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
bytes32 constant MINTER_FILTER_TYPE = "MinterFilterV1";
|
|
55
|
+
|
|
56
|
+
function minterFilterType() external pure returns (string memory) {
|
|
57
|
+
return MINTER_FILTER_TYPE.toString();
|
|
58
|
+
}
|
|
42
59
|
|
|
43
60
|
/// Core contract address this minter interacts with
|
|
44
61
|
address public immutable genArt721CoreAddress;
|
|
@@ -55,45 +72,43 @@ contract MinterFilterV1 is IMinterFilterV0 {
|
|
|
55
72
|
/// minter address => is an approved minter?
|
|
56
73
|
mapping(address => bool) public isApprovedMinter;
|
|
57
74
|
|
|
58
|
-
|
|
75
|
+
function _onlyNonZeroAddress(address _address) internal pure {
|
|
59
76
|
require(_address != address(0), "Must input non-zero address");
|
|
60
|
-
_;
|
|
61
77
|
}
|
|
62
78
|
|
|
63
|
-
//
|
|
79
|
+
// function to restrict access to only AdminACL allowed calls
|
|
64
80
|
// @dev defers which ACL contract is used to the core contract
|
|
65
|
-
|
|
81
|
+
function _onlyCoreAdminACL(bytes4 _selector) internal {
|
|
66
82
|
require(_coreAdminACLAllowed(_selector), "Only Core AdminACL allowed");
|
|
67
|
-
_;
|
|
68
83
|
}
|
|
69
84
|
|
|
70
|
-
//
|
|
85
|
+
// function to restrict access to only the artist of `_projectId`, or
|
|
71
86
|
// AdminACL allowed calls
|
|
72
87
|
// @dev defers which ACL contract is used to the core contract
|
|
73
|
-
|
|
88
|
+
function _onlyCoreAdminACLOrArtist(
|
|
89
|
+
uint256 _projectId,
|
|
90
|
+
bytes4 _selector
|
|
91
|
+
) internal {
|
|
74
92
|
require(
|
|
75
93
|
msg.sender ==
|
|
76
94
|
genArtCoreContract.projectIdToArtistAddress(_projectId) ||
|
|
77
95
|
_coreAdminACLAllowed(_selector),
|
|
78
96
|
"Only Core AdminACL or Artist"
|
|
79
97
|
);
|
|
80
|
-
_;
|
|
81
98
|
}
|
|
82
99
|
|
|
83
|
-
|
|
100
|
+
function _onlyValidProjectId(uint256 _projectId) internal view {
|
|
84
101
|
require(
|
|
85
102
|
_projectId < genArtCoreContract.nextProjectId(),
|
|
86
103
|
"Only existing projects"
|
|
87
104
|
);
|
|
88
|
-
_;
|
|
89
105
|
}
|
|
90
106
|
|
|
91
|
-
|
|
107
|
+
function _usingApprovedMinter(address _minterAddress) internal view {
|
|
92
108
|
require(
|
|
93
109
|
isApprovedMinter[_minterAddress],
|
|
94
110
|
"Only approved minters are allowed"
|
|
95
111
|
);
|
|
96
|
-
_;
|
|
97
112
|
}
|
|
98
113
|
|
|
99
114
|
/**
|
|
@@ -101,11 +116,11 @@ contract MinterFilterV1 is IMinterFilterV0 {
|
|
|
101
116
|
* @param _genArt721Address Art Blocks core contract address
|
|
102
117
|
* this contract will be a minter for. Can never be updated.
|
|
103
118
|
*/
|
|
104
|
-
constructor(
|
|
105
|
-
|
|
106
|
-
) onlyNonZeroAddress(_genArt721Address) {
|
|
119
|
+
constructor(address _genArt721Address) {
|
|
120
|
+
_onlyNonZeroAddress(_genArt721Address);
|
|
107
121
|
genArt721CoreAddress = _genArt721Address;
|
|
108
122
|
genArtCoreContract = IGenArt721CoreContractV3(_genArt721Address);
|
|
123
|
+
emit Deployed();
|
|
109
124
|
}
|
|
110
125
|
|
|
111
126
|
/**
|
|
@@ -126,13 +141,9 @@ contract MinterFilterV1 is IMinterFilterV0 {
|
|
|
126
141
|
* @notice Approves minter `_minterAddress`.
|
|
127
142
|
* @param _minterAddress Minter to be added as an approved minter.
|
|
128
143
|
*/
|
|
129
|
-
function addApprovedMinter(
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
external
|
|
133
|
-
onlyCoreAdminACL(this.addApprovedMinter.selector)
|
|
134
|
-
onlyNonZeroAddress(_minterAddress)
|
|
135
|
-
{
|
|
144
|
+
function addApprovedMinter(address _minterAddress) external {
|
|
145
|
+
_onlyCoreAdminACL(this.addApprovedMinter.selector);
|
|
146
|
+
_onlyNonZeroAddress(_minterAddress);
|
|
136
147
|
isApprovedMinter[_minterAddress] = true;
|
|
137
148
|
emit MinterApproved(
|
|
138
149
|
_minterAddress,
|
|
@@ -144,9 +155,8 @@ contract MinterFilterV1 is IMinterFilterV0 {
|
|
|
144
155
|
* @notice Removes previously approved minter `_minterAddress`.
|
|
145
156
|
* @param _minterAddress Minter to remove.
|
|
146
157
|
*/
|
|
147
|
-
function removeApprovedMinter(
|
|
148
|
-
|
|
149
|
-
) external onlyCoreAdminACL(this.removeApprovedMinter.selector) {
|
|
158
|
+
function removeApprovedMinter(address _minterAddress) external {
|
|
159
|
+
_onlyCoreAdminACL(this.removeApprovedMinter.selector);
|
|
150
160
|
require(isApprovedMinter[_minterAddress], "Only approved minters");
|
|
151
161
|
require(
|
|
152
162
|
numProjectsUsingMinter[_minterAddress] == 0,
|
|
@@ -165,12 +175,13 @@ contract MinterFilterV1 is IMinterFilterV0 {
|
|
|
165
175
|
function setMinterForProject(
|
|
166
176
|
uint256 _projectId,
|
|
167
177
|
address _minterAddress
|
|
168
|
-
)
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
178
|
+
) external {
|
|
179
|
+
_onlyCoreAdminACLOrArtist(
|
|
180
|
+
_projectId,
|
|
181
|
+
this.setMinterForProject.selector
|
|
182
|
+
);
|
|
183
|
+
_usingApprovedMinter(_minterAddress);
|
|
184
|
+
_onlyValidProjectId(_projectId);
|
|
174
185
|
// decrement number of projects using a previous minter
|
|
175
186
|
(bool hasPreviousMinter, address previousMinter) = minterForProject
|
|
176
187
|
.tryGet(_projectId);
|
|
@@ -192,15 +203,11 @@ contract MinterFilterV1 is IMinterFilterV0 {
|
|
|
192
203
|
* @param _projectId Project ID to remove minter.
|
|
193
204
|
* @dev requires project to have an assigned minter
|
|
194
205
|
*/
|
|
195
|
-
function removeMinterForProject(
|
|
196
|
-
|
|
197
|
-
)
|
|
198
|
-
external
|
|
199
|
-
onlyCoreAdminACLOrArtist(
|
|
206
|
+
function removeMinterForProject(uint256 _projectId) external {
|
|
207
|
+
_onlyCoreAdminACLOrArtist(
|
|
200
208
|
_projectId,
|
|
201
209
|
this.removeMinterForProject.selector
|
|
202
|
-
)
|
|
203
|
-
{
|
|
210
|
+
);
|
|
204
211
|
_removeMinterForProject(_projectId);
|
|
205
212
|
}
|
|
206
213
|
|
|
@@ -210,9 +217,8 @@ contract MinterFilterV1 is IMinterFilterV0 {
|
|
|
210
217
|
* @dev requires all project IDs to have an assigned minter
|
|
211
218
|
* @dev caution with respect to single tx gas limits
|
|
212
219
|
*/
|
|
213
|
-
function removeMintersForProjects(
|
|
214
|
-
|
|
215
|
-
) external onlyCoreAdminACL(this.removeMintersForProjects.selector) {
|
|
220
|
+
function removeMintersForProjects(uint256[] calldata _projectIds) external {
|
|
221
|
+
_onlyCoreAdminACL(this.removeMintersForProjects.selector);
|
|
216
222
|
uint256 numProjects = _projectIds.length;
|
|
217
223
|
for (uint256 i; i < numProjects; i++) {
|
|
218
224
|
_removeMinterForProject(_projectIds[i]);
|
|
@@ -265,7 +271,8 @@ contract MinterFilterV1 is IMinterFilterV0 {
|
|
|
265
271
|
*/
|
|
266
272
|
function getMinterForProject(
|
|
267
273
|
uint256 _projectId
|
|
268
|
-
) external view
|
|
274
|
+
) external view returns (address) {
|
|
275
|
+
_onlyValidProjectId(_projectId);
|
|
269
276
|
(bool _hasMinter, address _currentMinter) = minterForProject.tryGet(
|
|
270
277
|
_projectId
|
|
271
278
|
);
|
|
@@ -278,9 +285,8 @@ contract MinterFilterV1 is IMinterFilterV0 {
|
|
|
278
285
|
* @param _projectId Project ID to query.
|
|
279
286
|
* @return bool true if project has an assigned minter, else false
|
|
280
287
|
*/
|
|
281
|
-
function projectHasMinter(
|
|
282
|
-
|
|
283
|
-
) external view onlyValidProjectId(_projectId) returns (bool) {
|
|
288
|
+
function projectHasMinter(uint256 _projectId) external view returns (bool) {
|
|
289
|
+
_onlyValidProjectId(_projectId);
|
|
284
290
|
(bool _hasMinter, ) = minterForProject.tryGet(_projectId);
|
|
285
291
|
return _hasMinter;
|
|
286
292
|
}
|