@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
@@ -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
- ) external onlyArtist(_projectId) {
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].pricePerTokenInWei = _pricePerTokenInWei;
276
- projectConfig[_projectId].priceIsConfigured = true;
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
- // okay if this underflows because if statement will always eval false.
372
- // this is only for gas optimization (core enforces maxInvocations).
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
- if (tokenId % ONE_MILLION == _projectConfig.maxInvocations - 1) {
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
- ) external onlyArtist(_projectId) {
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
- // okay if this underflows because if statement will always eval false.
307
- // this is only for gas optimization (core enforces maxInvocations).
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
- if (tokenId % ONE_MILLION == _projectConfig.maxInvocations - 1) {
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.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",