@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.
Files changed (68) hide show
  1. package/README.md +3 -9
  2. package/artifacts/contracts/AdminACLV1.sol/AdminACLV1.json +2 -2
  3. package/artifacts/contracts/BasicPolyptychRandomizerV0.sol/BasicPolyptychRandomizerV0.json +229 -0
  4. package/artifacts/contracts/BasicRandomizerV2.sol/BasicRandomizerV2.json +3 -3
  5. package/artifacts/contracts/GenArt721CoreV3.sol/GenArt721CoreV3.json +2 -2
  6. package/artifacts/contracts/GenArt721CoreV3_Engine.sol/GenArt721CoreV3_Engine.json +2 -2
  7. package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV0.sol/MinterDAExpV0.json +2 -2
  8. package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV1.sol/MinterDAExpV1.json +2 -2
  9. package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV2.sol/MinterDAExpV2.json +2 -2
  10. package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExp/MinterDAExpV3.sol/MinterDAExpV3.json +2 -2
  11. package/artifacts/contracts/archive/minter-suite/Minters/MinterDAExpSettlement/MinterDAExpSettlementV0.sol/MinterDAExpSettlementV0.json +2 -2
  12. package/artifacts/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterDAExpSettlement}/MinterDAExpSettlementV1.sol/MinterDAExpSettlementV1.json +3 -3
  13. package/artifacts/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV0.sol/MinterDALinV0.json +2 -2
  14. package/artifacts/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV1.sol/MinterDALinV1.json +2 -2
  15. package/artifacts/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV2.sol/MinterDALinV2.json +2 -2
  16. package/artifacts/contracts/archive/minter-suite/Minters/MinterDALin/MinterDALinV3.sol/MinterDALinV3.json +2 -2
  17. package/artifacts/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV0.sol/MinterHolderV0.json +2 -2
  18. package/artifacts/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV1.sol/MinterHolderV1.json +2 -2
  19. package/artifacts/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV2.sol/MinterHolderV2.json +2 -2
  20. package/artifacts/contracts/archive/minter-suite/Minters/MinterHolder/MinterHolderV3.sol/MinterHolderV3.json +2 -2
  21. package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV0.sol/MinterMerkleV0.json +2 -2
  22. package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV1.sol/MinterMerkleV1.json +2 -2
  23. package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV2.sol/MinterMerkleV2.json +2 -2
  24. package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV3.sol/MinterMerkleV3.json +2 -2
  25. package/artifacts/contracts/archive/minter-suite/Minters/MinterMerkle/MinterMerkleV4.sol/MinterMerkleV4.json +2 -2
  26. package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV0.sol/MinterSetPriceV0.json +2 -2
  27. package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV1.sol/MinterSetPriceV1.json +2 -2
  28. package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV2.sol/MinterSetPriceV2.json +2 -2
  29. package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPrice/MinterSetPriceV3.sol/MinterSetPriceV3.json +2 -2
  30. package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V0.sol/MinterSetPriceERC20V0.json +2 -2
  31. package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V1.sol/MinterSetPriceERC20V1.json +2 -2
  32. package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V2.sol/MinterSetPriceERC20V2.json +2 -2
  33. package/artifacts/contracts/archive/minter-suite/Minters/MinterSetPriceERC20/MinterSetPriceERC20V3.sol/MinterSetPriceERC20V3.json +2 -2
  34. package/artifacts/contracts/explorations/GenArt721CoreV3_Explorations.sol/GenArt721CoreV3_Explorations.json +2 -2
  35. package/artifacts/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlementV1.sol/IFilteredMinterDAExpSettlementV1.json +767 -0
  36. package/artifacts/contracts/interfaces/0.8.x/IMinterFilterV0.sol/IMinterFilterV0.json +6 -0
  37. package/artifacts/contracts/interfaces/0.8.x/IRandomizerPolyptychV0.sol/IRandomizerPolyptychV0.json +87 -0
  38. package/artifacts/contracts/interfaces/0.8.x/IRandomizerV2.sol/IRandomizerV2.json +1 -1
  39. package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV0.sol/MinterFilterV0.json +8 -2
  40. package/artifacts/contracts/minter-suite/MinterFilter/MinterFilterV1.sol/MinterFilterV1.json +34 -2
  41. package/artifacts/contracts/minter-suite/Minters/MinterDAExpSettlementV2.sol/MinterDAExpSettlementV2.json +1127 -0
  42. package/artifacts/contracts/minter-suite/Minters/MinterDAExpV4.sol/MinterDAExpV4.json +15 -2
  43. package/artifacts/contracts/minter-suite/Minters/MinterDALinV4.sol/MinterDALinV4.json +15 -2
  44. package/artifacts/contracts/minter-suite/Minters/MinterHolderV4.sol/MinterHolderV4.json +15 -2
  45. package/artifacts/contracts/minter-suite/Minters/MinterMerkleV5.sol/MinterMerkleV5.json +15 -2
  46. package/artifacts/contracts/minter-suite/Minters/MinterPolyptychV0.sol/IGenArt721CoreContractV3WithRandomizer.json +662 -0
  47. package/artifacts/contracts/minter-suite/Minters/MinterPolyptychV0.sol/MinterPolyptychV0.json +1268 -0
  48. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceERC20V4.sol/MinterSetPriceERC20V4.json +15 -2
  49. package/artifacts/contracts/minter-suite/Minters/MinterSetPriceV4.sol/MinterSetPriceV4.json +15 -2
  50. package/artifacts/contracts/mock/GenArt721CoreV3_Engine_IncorrectCoreType.sol/GenArt721CoreV3_Engine_IncorrectCoreType.json +2 -2
  51. package/artifacts/contracts/mock/RandomizerV2_NoAssignMock.sol/RandomizerV2_NoAssignMock.json +3 -3
  52. package/contracts/BasicPolyptychRandomizerV0.sol +126 -0
  53. package/contracts/BasicRandomizerV2.sol +3 -3
  54. package/contracts/{minter-suite/Minters → archive/minter-suite/Minters/MinterDAExpSettlement}/MinterDAExpSettlementV1.sol +4 -4
  55. package/contracts/interfaces/0.8.x/IFilteredMinterDAExpSettlementV1.sol +21 -0
  56. package/contracts/interfaces/0.8.x/IMinterFilterV0.sol +6 -0
  57. package/contracts/interfaces/0.8.x/IRandomizerPolyptychV0.sol +31 -0
  58. package/contracts/interfaces/0.8.x/IRandomizerV2.sol +5 -2
  59. package/contracts/minter-suite/MinterFilter/MinterFilterV1.sol +18 -0
  60. package/contracts/minter-suite/Minters/MinterDAExpSettlementV2.sol +1312 -0
  61. package/contracts/minter-suite/Minters/MinterDAExpV4.sol +32 -4
  62. package/contracts/minter-suite/Minters/MinterDALinV4.sol +32 -5
  63. package/contracts/minter-suite/Minters/MinterHolderV4.sol +35 -6
  64. package/contracts/minter-suite/Minters/MinterMerkleV5.sol +35 -6
  65. package/contracts/minter-suite/Minters/MinterPolyptychV0.sol +998 -0
  66. package/contracts/minter-suite/Minters/MinterSetPriceERC20V4.sol +35 -6
  67. package/contracts/minter-suite/Minters/MinterSetPriceV4.sol +32 -4
  68. 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
- ) external onlyArtist(_projectId) {
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
- // okay if this underflows because if statement will always eval false.
464
- // this is only for gas optimization (core enforces maxInvocations).
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
- if (tokenId % ONE_MILLION == _projectConfig.maxInvocations - 1) {
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
- ) external onlyArtist(_projectId) {
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
- // okay if this underflows because if statement will always eval false.
435
- // this is only for gas optimization (core enforces maxInvocations).
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
- if (tokenId % ONE_MILLION == _projectConfig.maxInvocations - 1) {
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) external {
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].pricePerTokenInWei = _pricePerTokenInWei;
479
- projectConfig[_projectId].priceIsConfigured = true;
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
- // okay if this underflows because if statement will always eval false.
673
- // this is only for gas optimization (core enforces maxInvocations).
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
- if (tokenId % ONE_MILLION == _projectConfig.maxInvocations - 1) {
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
- ) external onlyArtist(_projectId) {
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].pricePerTokenInWei = _pricePerTokenInWei;
379
- projectConfig[_projectId].priceIsConfigured = true;
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
- // okay if this underflows because if statement will always eval false.
555
- // this is only for gas optimization (core enforces maxInvocations).
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
- if (tokenId % ONE_MILLION == _projectConfig.maxInvocations - 1) {
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
  }