@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
|
@@ -67,6 +67,9 @@ contract MinterDAExpV4 is ReentrancyGuard, MinterBase, IFilteredMinterDAExpV1 {
|
|
|
67
67
|
/// minterType for this minter
|
|
68
68
|
string public constant minterType = "MinterDAExpV4";
|
|
69
69
|
|
|
70
|
+
/// minter version for this minter
|
|
71
|
+
string public constant minterVersion = "v4.1.0";
|
|
72
|
+
|
|
70
73
|
uint256 constant ONE_MILLION = 1_000_000;
|
|
71
74
|
|
|
72
75
|
struct ProjectConfig {
|
|
@@ -147,7 +150,7 @@ contract MinterDAExpV4 is ReentrancyGuard, MinterBase, IFilteredMinterDAExpV1 {
|
|
|
147
150
|
*/
|
|
148
151
|
function setProjectMaxInvocations(
|
|
149
152
|
uint256 _projectId
|
|
150
|
-
)
|
|
153
|
+
) public onlyArtist(_projectId) {
|
|
151
154
|
uint256 maxInvocations;
|
|
152
155
|
uint256 invocations;
|
|
153
156
|
(invocations, maxInvocations, , , , ) = genArtCoreContract_Base
|
|
@@ -372,6 +375,16 @@ contract MinterDAExpV4 is ReentrancyGuard, MinterBase, IFilteredMinterDAExpV1 {
|
|
|
372
375
|
_startPrice,
|
|
373
376
|
_basePrice
|
|
374
377
|
);
|
|
378
|
+
|
|
379
|
+
// sync local max invocations if not initially populated
|
|
380
|
+
// @dev if local max invocations and maxHasBeenInvoked are both
|
|
381
|
+
// initial values, we know they have not been populated.
|
|
382
|
+
if (
|
|
383
|
+
_projectConfig.maxInvocations == 0 &&
|
|
384
|
+
_projectConfig.maxHasBeenInvoked == false
|
|
385
|
+
) {
|
|
386
|
+
setProjectMaxInvocations(_projectId);
|
|
387
|
+
}
|
|
375
388
|
}
|
|
376
389
|
|
|
377
390
|
/**
|
|
@@ -460,10 +473,25 @@ contract MinterDAExpV4 is ReentrancyGuard, MinterBase, IFilteredMinterDAExpV1 {
|
|
|
460
473
|
// EFFECTS
|
|
461
474
|
tokenId = minterFilter.mint(_to, _projectId, msg.sender);
|
|
462
475
|
|
|
463
|
-
//
|
|
464
|
-
//
|
|
476
|
+
// invocation is token number plus one, and will never overflow due to
|
|
477
|
+
// limit of 1e6 invocations per project. block scope for gas efficiency
|
|
478
|
+
// (i.e. avoid an unnecessary var initialization to 0).
|
|
465
479
|
unchecked {
|
|
466
|
-
|
|
480
|
+
uint256 tokenInvocation = (tokenId % ONE_MILLION) + 1;
|
|
481
|
+
uint256 localMaxInvocations = _projectConfig.maxInvocations;
|
|
482
|
+
// handle the case where the token invocation == minter local max
|
|
483
|
+
// invocations occurred on a different minter, and we have a stale
|
|
484
|
+
// local maxHasBeenInvoked value returning a false negative.
|
|
485
|
+
// @dev this is a CHECK after EFFECTS, so security was considered
|
|
486
|
+
// in detail here.
|
|
487
|
+
require(
|
|
488
|
+
tokenInvocation <= localMaxInvocations,
|
|
489
|
+
"Maximum invocations reached"
|
|
490
|
+
);
|
|
491
|
+
// in typical case, update the local maxHasBeenInvoked value
|
|
492
|
+
// to true if the token invocation == minter local max invocations
|
|
493
|
+
// (enables gas efficient reverts after sellout)
|
|
494
|
+
if (tokenInvocation == localMaxInvocations) {
|
|
467
495
|
_projectConfig.maxHasBeenInvoked = true;
|
|
468
496
|
}
|
|
469
497
|
}
|
|
@@ -67,6 +67,9 @@ contract MinterDALinV4 is ReentrancyGuard, MinterBase, IFilteredMinterDALinV1 {
|
|
|
67
67
|
/// minterType for this minter
|
|
68
68
|
string public constant minterType = "MinterDALinV4";
|
|
69
69
|
|
|
70
|
+
/// minter version for this minter
|
|
71
|
+
string public constant minterVersion = "v4.1.0";
|
|
72
|
+
|
|
70
73
|
uint256 constant ONE_MILLION = 1_000_000;
|
|
71
74
|
|
|
72
75
|
struct ProjectConfig {
|
|
@@ -143,7 +146,7 @@ contract MinterDALinV4 is ReentrancyGuard, MinterBase, IFilteredMinterDALinV1 {
|
|
|
143
146
|
*/
|
|
144
147
|
function setProjectMaxInvocations(
|
|
145
148
|
uint256 _projectId
|
|
146
|
-
)
|
|
149
|
+
) public onlyArtist(_projectId) {
|
|
147
150
|
uint256 maxInvocations;
|
|
148
151
|
uint256 invocations;
|
|
149
152
|
(invocations, maxInvocations, , , , ) = genArtCoreContract_Base
|
|
@@ -343,6 +346,16 @@ contract MinterDALinV4 is ReentrancyGuard, MinterBase, IFilteredMinterDALinV1 {
|
|
|
343
346
|
_startPrice,
|
|
344
347
|
_basePrice
|
|
345
348
|
);
|
|
349
|
+
|
|
350
|
+
// sync local max invocations if not initially populated
|
|
351
|
+
// @dev if local max invocations and maxHasBeenInvoked are both
|
|
352
|
+
// initial values, we know they have not been populated.
|
|
353
|
+
if (
|
|
354
|
+
_projectConfig.maxInvocations == 0 &&
|
|
355
|
+
_projectConfig.maxHasBeenInvoked == false
|
|
356
|
+
) {
|
|
357
|
+
setProjectMaxInvocations(_projectId);
|
|
358
|
+
}
|
|
346
359
|
}
|
|
347
360
|
|
|
348
361
|
/**
|
|
@@ -430,11 +443,25 @@ contract MinterDALinV4 is ReentrancyGuard, MinterBase, IFilteredMinterDALinV1 {
|
|
|
430
443
|
|
|
431
444
|
// EFFECTS
|
|
432
445
|
tokenId = minterFilter.mint(_to, _projectId, msg.sender);
|
|
433
|
-
|
|
434
|
-
//
|
|
435
|
-
//
|
|
446
|
+
// invocation is token number plus one, and will never overflow due to
|
|
447
|
+
// limit of 1e6 invocations per project. block scope for gas efficiency
|
|
448
|
+
// (i.e. avoid an unnecessary var initialization to 0).
|
|
436
449
|
unchecked {
|
|
437
|
-
|
|
450
|
+
uint256 tokenInvocation = (tokenId % ONE_MILLION) + 1;
|
|
451
|
+
uint256 localMaxInvocations = _projectConfig.maxInvocations;
|
|
452
|
+
// handle the case where the token invocation == minter local max
|
|
453
|
+
// invocations occurred on a different minter, and we have a stale
|
|
454
|
+
// local maxHasBeenInvoked value returning a false negative.
|
|
455
|
+
// @dev this is a CHECK after EFFECTS, so security was considered
|
|
456
|
+
// in detail here.
|
|
457
|
+
require(
|
|
458
|
+
tokenInvocation <= localMaxInvocations,
|
|
459
|
+
"Maximum invocations reached"
|
|
460
|
+
);
|
|
461
|
+
// in typical case, update the local maxHasBeenInvoked value
|
|
462
|
+
// to true if the token invocation == minter local max invocations
|
|
463
|
+
// (enables gas efficient reverts after sellout)
|
|
464
|
+
if (tokenInvocation == localMaxInvocations) {
|
|
438
465
|
_projectConfig.maxHasBeenInvoked = true;
|
|
439
466
|
}
|
|
440
467
|
}
|
|
@@ -89,6 +89,9 @@ contract MinterHolderV4 is
|
|
|
89
89
|
/// minterType for this minter
|
|
90
90
|
string public constant minterType = "MinterHolderV4";
|
|
91
91
|
|
|
92
|
+
/// minter version for this minter
|
|
93
|
+
string public constant minterVersion = "v4.1.0";
|
|
94
|
+
|
|
92
95
|
uint256 constant ONE_MILLION = 1_000_000;
|
|
93
96
|
|
|
94
97
|
struct ProjectConfig {
|
|
@@ -352,7 +355,7 @@ contract MinterHolderV4 is
|
|
|
352
355
|
* @dev this enables gas reduction after maxInvocations have been reached -
|
|
353
356
|
* core contracts shall still enforce a maxInvocation check during mint.
|
|
354
357
|
*/
|
|
355
|
-
function setProjectMaxInvocations(uint256 _projectId)
|
|
358
|
+
function setProjectMaxInvocations(uint256 _projectId) public {
|
|
356
359
|
uint256 maxInvocations;
|
|
357
360
|
uint256 invocations;
|
|
358
361
|
(invocations, maxInvocations, , , , ) = genArtCoreContract_Base
|
|
@@ -475,9 +478,20 @@ contract MinterHolderV4 is
|
|
|
475
478
|
uint256 _projectId,
|
|
476
479
|
uint256 _pricePerTokenInWei
|
|
477
480
|
) external onlyArtist(_projectId) {
|
|
478
|
-
projectConfig[_projectId]
|
|
479
|
-
|
|
481
|
+
ProjectConfig storage _projectConfig = projectConfig[_projectId];
|
|
482
|
+
_projectConfig.pricePerTokenInWei = _pricePerTokenInWei;
|
|
483
|
+
_projectConfig.priceIsConfigured = true;
|
|
480
484
|
emit PricePerTokenInWeiUpdated(_projectId, _pricePerTokenInWei);
|
|
485
|
+
|
|
486
|
+
// sync local max invocations if not initially populated
|
|
487
|
+
// @dev if local max invocations and maxHasBeenInvoked are both
|
|
488
|
+
// initial values, we know they have not been populated.
|
|
489
|
+
if (
|
|
490
|
+
_projectConfig.maxInvocations == 0 &&
|
|
491
|
+
_projectConfig.maxHasBeenInvoked == false
|
|
492
|
+
) {
|
|
493
|
+
setProjectMaxInvocations(_projectId);
|
|
494
|
+
}
|
|
481
495
|
}
|
|
482
496
|
|
|
483
497
|
/**
|
|
@@ -669,10 +683,25 @@ contract MinterHolderV4 is
|
|
|
669
683
|
|
|
670
684
|
// NOTE: delegate-vault handling **ends here**.
|
|
671
685
|
|
|
672
|
-
//
|
|
673
|
-
//
|
|
686
|
+
// invocation is token number plus one, and will never overflow due to
|
|
687
|
+
// limit of 1e6 invocations per project. block scope for gas efficiency
|
|
688
|
+
// (i.e. avoid an unnecessary var initialization to 0).
|
|
674
689
|
unchecked {
|
|
675
|
-
|
|
690
|
+
uint256 tokenInvocation = (tokenId % ONE_MILLION) + 1;
|
|
691
|
+
uint256 localMaxInvocations = _projectConfig.maxInvocations;
|
|
692
|
+
// handle the case where the token invocation == minter local max
|
|
693
|
+
// invocations occurred on a different minter, and we have a stale
|
|
694
|
+
// local maxHasBeenInvoked value returning a false negative.
|
|
695
|
+
// @dev this is a CHECK after EFFECTS, so security was considered
|
|
696
|
+
// in detail here.
|
|
697
|
+
require(
|
|
698
|
+
tokenInvocation <= localMaxInvocations,
|
|
699
|
+
"Maximum invocations reached"
|
|
700
|
+
);
|
|
701
|
+
// in typical case, update the local maxHasBeenInvoked value
|
|
702
|
+
// to true if the token invocation == minter local max invocations
|
|
703
|
+
// (enables gas efficient reverts after sellout)
|
|
704
|
+
if (tokenInvocation == localMaxInvocations) {
|
|
676
705
|
_projectConfig.maxHasBeenInvoked = true;
|
|
677
706
|
}
|
|
678
707
|
}
|
|
@@ -79,6 +79,9 @@ contract MinterMerkleV5 is
|
|
|
79
79
|
/// minterType for this minter
|
|
80
80
|
string public constant minterType = "MinterMerkleV5";
|
|
81
81
|
|
|
82
|
+
/// minter version for this minter
|
|
83
|
+
string public constant minterVersion = "v5.1.0";
|
|
84
|
+
|
|
82
85
|
/// project minter configuration keys used by this minter
|
|
83
86
|
bytes32 private constant CONFIG_MERKLE_ROOT = "merkleRoot";
|
|
84
87
|
bytes32 private constant CONFIG_USE_MAX_INVOCATIONS_PER_ADDRESS_OVERRIDE =
|
|
@@ -252,7 +255,7 @@ contract MinterMerkleV5 is
|
|
|
252
255
|
*/
|
|
253
256
|
function setProjectMaxInvocations(
|
|
254
257
|
uint256 _projectId
|
|
255
|
-
)
|
|
258
|
+
) public onlyArtist(_projectId) {
|
|
256
259
|
uint256 maxInvocations;
|
|
257
260
|
uint256 invocations;
|
|
258
261
|
(invocations, maxInvocations, , , , ) = genArtCoreContract_Base
|
|
@@ -375,9 +378,20 @@ contract MinterMerkleV5 is
|
|
|
375
378
|
uint256 _projectId,
|
|
376
379
|
uint256 _pricePerTokenInWei
|
|
377
380
|
) external onlyArtist(_projectId) {
|
|
378
|
-
projectConfig[_projectId]
|
|
379
|
-
|
|
381
|
+
ProjectConfig storage _projectConfig = projectConfig[_projectId];
|
|
382
|
+
_projectConfig.pricePerTokenInWei = _pricePerTokenInWei;
|
|
383
|
+
_projectConfig.priceIsConfigured = true;
|
|
380
384
|
emit PricePerTokenInWeiUpdated(_projectId, _pricePerTokenInWei);
|
|
385
|
+
|
|
386
|
+
// sync local max invocations if not initially populated
|
|
387
|
+
// @dev if local max invocations and maxHasBeenInvoked are both
|
|
388
|
+
// initial values, we know they have not been populated.
|
|
389
|
+
if (
|
|
390
|
+
_projectConfig.maxInvocations == 0 &&
|
|
391
|
+
_projectConfig.maxHasBeenInvoked == false
|
|
392
|
+
) {
|
|
393
|
+
setProjectMaxInvocations(_projectId);
|
|
394
|
+
}
|
|
381
395
|
}
|
|
382
396
|
|
|
383
397
|
/**
|
|
@@ -551,10 +565,25 @@ contract MinterMerkleV5 is
|
|
|
551
565
|
|
|
552
566
|
// NOTE: delegate-vault handling **ends here**.
|
|
553
567
|
|
|
554
|
-
//
|
|
555
|
-
//
|
|
568
|
+
// invocation is token number plus one, and will never overflow due to
|
|
569
|
+
// limit of 1e6 invocations per project. block scope for gas efficiency
|
|
570
|
+
// (i.e. avoid an unnecessary var initialization to 0).
|
|
556
571
|
unchecked {
|
|
557
|
-
|
|
572
|
+
uint256 tokenInvocation = (tokenId % ONE_MILLION) + 1;
|
|
573
|
+
uint256 localMaxInvocations = _projectConfig.maxInvocations;
|
|
574
|
+
// handle the case where the token invocation == minter local max
|
|
575
|
+
// invocations occurred on a different minter, and we have a stale
|
|
576
|
+
// local maxHasBeenInvoked value returning a false negative.
|
|
577
|
+
// @dev this is a CHECK after EFFECTS, so security was considered
|
|
578
|
+
// in detail here.
|
|
579
|
+
require(
|
|
580
|
+
tokenInvocation <= localMaxInvocations,
|
|
581
|
+
"Maximum invocations reached"
|
|
582
|
+
);
|
|
583
|
+
// in typical case, update the local maxHasBeenInvoked value
|
|
584
|
+
// to true if the token invocation == minter local max invocations
|
|
585
|
+
// (enables gas efficient reverts after sellout)
|
|
586
|
+
if (tokenInvocation == localMaxInvocations) {
|
|
558
587
|
_projectConfig.maxHasBeenInvoked = true;
|
|
559
588
|
}
|
|
560
589
|
}
|