@artblocks/contracts 1.0.0 → 1.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/README.md +3 -9
- package/artifacts/contracts/AdminACLV1.sol/AdminACLV1.json +2 -2
- package/artifacts/contracts/BasicPolyptychRandomizerV0.sol/BasicPolyptychRandomizerV0.json +229 -0
- package/artifacts/contracts/BasicRandomizerV2.sol/BasicRandomizerV2.json +3 -3
- package/artifacts/contracts/GenArt721CoreV3.sol/GenArt721CoreV3.json +2 -2
- package/artifacts/contracts/GenArt721CoreV3_Engine.sol/GenArt721CoreV3_Engine.json +2 -2
- 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/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/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 +662 -0
- package/artifacts/contracts/minter-suite/Minters/MinterPolyptychV0.sol/MinterPolyptychV0.json +1268 -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/GenArt721CoreV3_Engine_IncorrectCoreType.sol/GenArt721CoreV3_Engine_IncorrectCoreType.json +2 -2
- package/artifacts/contracts/mock/RandomizerV2_NoAssignMock.sol/RandomizerV2_NoAssignMock.json +3 -3
- package/contracts/BasicPolyptychRandomizerV0.sol +126 -0
- package/contracts/BasicRandomizerV2.sol +3 -3
- package/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterDAExpSettlement}/MinterDAExpSettlementV1.sol +4 -4
- package/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlementV1.sol +21 -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/minter-suite/MinterFilter/MinterFilterV1.sol +18 -0
- package/contracts/minter-suite/Minters/MinterDAExpSettlementV2.sol +1312 -0
- package/contracts/minter-suite/Minters/MinterDAExpV4.sol +32 -4
- package/contracts/minter-suite/Minters/MinterDALinV4.sol +32 -5
- package/contracts/minter-suite/Minters/MinterHolderV4.sol +35 -6
- package/contracts/minter-suite/Minters/MinterMerkleV5.sol +35 -6
- package/contracts/minter-suite/Minters/MinterPolyptychV0.sol +998 -0
- package/contracts/minter-suite/Minters/MinterSetPriceERC20V4.sol +35 -6
- package/contracts/minter-suite/Minters/MinterSetPriceV4.sol +32 -4
- package/package.json +8 -2
|
@@ -55,6 +55,9 @@ contract MinterSetPriceERC20V4 is
|
|
|
55
55
|
/// minterType for this minter
|
|
56
56
|
string public constant minterType = "MinterSetPriceERC20V4";
|
|
57
57
|
|
|
58
|
+
/// minter version for this minter
|
|
59
|
+
string public constant minterVersion = "v4.1.0";
|
|
60
|
+
|
|
58
61
|
uint256 constant ONE_MILLION = 1_000_000;
|
|
59
62
|
|
|
60
63
|
struct ProjectConfig {
|
|
@@ -150,7 +153,7 @@ contract MinterSetPriceERC20V4 is
|
|
|
150
153
|
*/
|
|
151
154
|
function setProjectMaxInvocations(
|
|
152
155
|
uint256 _projectId
|
|
153
|
-
)
|
|
156
|
+
) public onlyArtist(_projectId) {
|
|
154
157
|
uint256 maxInvocations;
|
|
155
158
|
uint256 invocations;
|
|
156
159
|
(invocations, maxInvocations, , , , ) = genArtCoreContract_Base
|
|
@@ -272,9 +275,20 @@ contract MinterSetPriceERC20V4 is
|
|
|
272
275
|
uint256 _pricePerTokenInWei
|
|
273
276
|
) external onlyArtist(_projectId) {
|
|
274
277
|
require(_pricePerTokenInWei > 0, "Price may not be 0");
|
|
275
|
-
projectConfig[_projectId]
|
|
276
|
-
|
|
278
|
+
ProjectConfig storage _projectConfig = projectConfig[_projectId];
|
|
279
|
+
_projectConfig.pricePerTokenInWei = _pricePerTokenInWei;
|
|
280
|
+
_projectConfig.priceIsConfigured = true;
|
|
277
281
|
emit PricePerTokenInWeiUpdated(_projectId, _pricePerTokenInWei);
|
|
282
|
+
|
|
283
|
+
// sync local max invocations if not initially populated
|
|
284
|
+
// @dev if local max invocations and maxHasBeenInvoked are both
|
|
285
|
+
// initial values, we know they have not been populated.
|
|
286
|
+
if (
|
|
287
|
+
_projectConfig.maxInvocations == 0 &&
|
|
288
|
+
_projectConfig.maxHasBeenInvoked == false
|
|
289
|
+
) {
|
|
290
|
+
setProjectMaxInvocations(_projectId);
|
|
291
|
+
}
|
|
278
292
|
}
|
|
279
293
|
|
|
280
294
|
/**
|
|
@@ -368,10 +382,25 @@ contract MinterSetPriceERC20V4 is
|
|
|
368
382
|
// EFFECTS
|
|
369
383
|
tokenId = minterFilter.mint(_to, _projectId, msg.sender);
|
|
370
384
|
|
|
371
|
-
//
|
|
372
|
-
//
|
|
385
|
+
// invocation is token number plus one, and will never overflow due to
|
|
386
|
+
// limit of 1e6 invocations per project. block scope for gas efficiency
|
|
387
|
+
// (i.e. avoid an unnecessary var initialization to 0).
|
|
373
388
|
unchecked {
|
|
374
|
-
|
|
389
|
+
uint256 tokenInvocation = (tokenId % ONE_MILLION) + 1;
|
|
390
|
+
uint256 localMaxInvocations = _projectConfig.maxInvocations;
|
|
391
|
+
// handle the case where the token invocation == minter local max
|
|
392
|
+
// invocations occurred on a different minter, and we have a stale
|
|
393
|
+
// local maxHasBeenInvoked value returning a false negative.
|
|
394
|
+
// @dev this is a CHECK after EFFECTS, so security was considered
|
|
395
|
+
// in detail here.
|
|
396
|
+
require(
|
|
397
|
+
tokenInvocation <= localMaxInvocations,
|
|
398
|
+
"Maximum invocations reached"
|
|
399
|
+
);
|
|
400
|
+
// in typical case, update the local maxHasBeenInvoked value
|
|
401
|
+
// to true if the token invocation == minter local max invocations
|
|
402
|
+
// (enables gas efficient reverts after sellout)
|
|
403
|
+
if (tokenInvocation == localMaxInvocations) {
|
|
375
404
|
_projectConfig.maxHasBeenInvoked = true;
|
|
376
405
|
}
|
|
377
406
|
}
|
|
@@ -47,6 +47,9 @@ contract MinterSetPriceV4 is ReentrancyGuard, MinterBase, IFilteredMinterV2 {
|
|
|
47
47
|
/// minterType for this minter
|
|
48
48
|
string public constant minterType = "MinterSetPriceV4";
|
|
49
49
|
|
|
50
|
+
/// minter version for this minter
|
|
51
|
+
string public constant minterVersion = "v4.1.0";
|
|
52
|
+
|
|
50
53
|
uint256 constant ONE_MILLION = 1_000_000;
|
|
51
54
|
|
|
52
55
|
struct ProjectConfig {
|
|
@@ -103,7 +106,7 @@ contract MinterSetPriceV4 is ReentrancyGuard, MinterBase, IFilteredMinterV2 {
|
|
|
103
106
|
*/
|
|
104
107
|
function setProjectMaxInvocations(
|
|
105
108
|
uint256 _projectId
|
|
106
|
-
)
|
|
109
|
+
) public onlyArtist(_projectId) {
|
|
107
110
|
uint256 maxInvocations;
|
|
108
111
|
uint256 invocations;
|
|
109
112
|
(invocations, maxInvocations, , , , ) = genArtCoreContract_Base
|
|
@@ -230,6 +233,16 @@ contract MinterSetPriceV4 is ReentrancyGuard, MinterBase, IFilteredMinterV2 {
|
|
|
230
233
|
_projectConfig.pricePerTokenInWei = _pricePerTokenInWei;
|
|
231
234
|
_projectConfig.priceIsConfigured = true;
|
|
232
235
|
emit PricePerTokenInWeiUpdated(_projectId, _pricePerTokenInWei);
|
|
236
|
+
|
|
237
|
+
// sync local max invocations if not initially populated
|
|
238
|
+
// @dev if local max invocations and maxHasBeenInvoked are both
|
|
239
|
+
// initial values, we know they have not been populated.
|
|
240
|
+
if (
|
|
241
|
+
_projectConfig.maxInvocations == 0 &&
|
|
242
|
+
_projectConfig.maxHasBeenInvoked == false
|
|
243
|
+
) {
|
|
244
|
+
setProjectMaxInvocations(_projectId);
|
|
245
|
+
}
|
|
233
246
|
}
|
|
234
247
|
|
|
235
248
|
/**
|
|
@@ -303,10 +316,25 @@ contract MinterSetPriceV4 is ReentrancyGuard, MinterBase, IFilteredMinterV2 {
|
|
|
303
316
|
// EFFECTS
|
|
304
317
|
tokenId = minterFilter.mint(_to, _projectId, msg.sender);
|
|
305
318
|
|
|
306
|
-
//
|
|
307
|
-
//
|
|
319
|
+
// invocation is token number plus one, and will never overflow due to
|
|
320
|
+
// limit of 1e6 invocations per project. block scope for gas efficiency
|
|
321
|
+
// (i.e. avoid an unnecessary var initialization to 0).
|
|
308
322
|
unchecked {
|
|
309
|
-
|
|
323
|
+
uint256 tokenInvocation = (tokenId % ONE_MILLION) + 1;
|
|
324
|
+
uint256 localMaxInvocations = _projectConfig.maxInvocations;
|
|
325
|
+
// handle the case where the token invocation == minter local max
|
|
326
|
+
// invocations occurred on a different minter, and we have a stale
|
|
327
|
+
// local maxHasBeenInvoked value returning a false negative.
|
|
328
|
+
// @dev this is a CHECK after EFFECTS, so security was considered
|
|
329
|
+
// in detail here.
|
|
330
|
+
require(
|
|
331
|
+
tokenInvocation <= localMaxInvocations,
|
|
332
|
+
"Maximum invocations reached"
|
|
333
|
+
);
|
|
334
|
+
// in typical case, update the local maxHasBeenInvoked value
|
|
335
|
+
// to true if the token invocation == minter local max invocations
|
|
336
|
+
// (enables gas efficient reverts after sellout)
|
|
337
|
+
if (tokenInvocation == localMaxInvocations) {
|
|
310
338
|
_projectConfig.maxHasBeenInvoked = true;
|
|
311
339
|
}
|
|
312
340
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@artblocks/contracts",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Smart contracts used by Art Blocks",
|
|
5
5
|
"files": [
|
|
6
6
|
"/contracts/**/*.sol",
|
|
@@ -17,7 +17,11 @@
|
|
|
17
17
|
"coverage": "hardhat coverage",
|
|
18
18
|
"format": "prettier --write 'contracts/**/*.sol' && prettier --write 'scripts/**/*.ts' && prettier --write 'test/**/*.ts'",
|
|
19
19
|
"lint": "prettier --check 'contracts/**/*.sol' && prettier --check 'scripts/**/*.ts' && prettier --check 'test/**/*.ts' && npx eslint 'test/**/*.ts'",
|
|
20
|
-
"remix": "remixd -s ./ --remix-ide https://remix.ethereum.org"
|
|
20
|
+
"remix": "remixd -s ./ --remix-ide https://remix.ethereum.org",
|
|
21
|
+
"deploy:goerli:v3-engine": "yarn hardhat run --network goerli scripts/engine/V3/generic-engine-deployer.ts",
|
|
22
|
+
"deploy:mainnet:v3-engine": "yarn hardhat run --network mainnet scripts/engine/V3/generic-engine-deployer.ts",
|
|
23
|
+
"deploy:goerli:minter": "yarn hardhat run --network goerli scripts/minter-deployments/generic-minter-deployer-v3core.ts",
|
|
24
|
+
"deploy:mainnet:minter": "yarn hardhat run --network mainnet scripts/minter-deployments/generic-minter-deployer-v3core.ts"
|
|
21
25
|
},
|
|
22
26
|
"husky": {
|
|
23
27
|
"hooks": {
|
|
@@ -46,6 +50,7 @@
|
|
|
46
50
|
"@typechain/ethers-v5": "^6.0.5",
|
|
47
51
|
"@types/jest": "^27.0.3",
|
|
48
52
|
"@types/mocha": "^9.1.1",
|
|
53
|
+
"@types/prompt": "^1.1.5",
|
|
49
54
|
"@typescript-eslint/eslint-plugin": "^5.48.0",
|
|
50
55
|
"@typescript-eslint/parser": "^5.48.0",
|
|
51
56
|
"aws-sdk-client-mock": "^0.6.2",
|
|
@@ -66,6 +71,7 @@
|
|
|
66
71
|
"merkletreejs": "^0.2.31",
|
|
67
72
|
"prettier": "^2.8.1",
|
|
68
73
|
"prettier-plugin-solidity": "^1.1.1",
|
|
74
|
+
"prompt": "^1.3.0",
|
|
69
75
|
"prompt-sync": "^4.2.0",
|
|
70
76
|
"solidity-coverage": "^0.8.0",
|
|
71
77
|
"ts-node": "^9.1.1",
|