hardhat 3.0.0-next.4 → 3.0.0-next.6

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 (117) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/src/internal/builtin-plugins/coverage/index.d.ts +1 -0
  3. package/dist/src/internal/builtin-plugins/coverage/index.d.ts.map +1 -1
  4. package/dist/src/internal/builtin-plugins/coverage/index.js +12 -6
  5. package/dist/src/internal/builtin-plugins/coverage/index.js.map +1 -1
  6. package/dist/src/internal/builtin-plugins/coverage/type-extensions.d.ts +7 -0
  7. package/dist/src/internal/builtin-plugins/coverage/type-extensions.d.ts.map +1 -0
  8. package/dist/src/internal/builtin-plugins/coverage/type-extensions.js +2 -0
  9. package/dist/src/internal/builtin-plugins/coverage/type-extensions.js.map +1 -0
  10. package/dist/src/internal/builtin-plugins/index.d.ts +1 -0
  11. package/dist/src/internal/builtin-plugins/index.d.ts.map +1 -1
  12. package/dist/src/internal/builtin-plugins/index.js +2 -0
  13. package/dist/src/internal/builtin-plugins/index.js.map +1 -1
  14. package/dist/src/internal/builtin-plugins/network-manager/base-provider.d.ts.map +1 -1
  15. package/dist/src/internal/builtin-plugins/network-manager/base-provider.js +2 -5
  16. package/dist/src/internal/builtin-plugins/network-manager/base-provider.js.map +1 -1
  17. package/dist/src/internal/builtin-plugins/network-manager/config-resolution.d.ts +2 -1
  18. package/dist/src/internal/builtin-plugins/network-manager/config-resolution.d.ts.map +1 -1
  19. package/dist/src/internal/builtin-plugins/network-manager/config-resolution.js +76 -75
  20. package/dist/src/internal/builtin-plugins/network-manager/config-resolution.js.map +1 -1
  21. package/dist/src/internal/builtin-plugins/network-manager/edr/edr-context.js +2 -2
  22. package/dist/src/internal/builtin-plugins/network-manager/edr/edr-context.js.map +1 -1
  23. package/dist/src/internal/builtin-plugins/network-manager/edr/edr-provider.d.ts +2 -1
  24. package/dist/src/internal/builtin-plugins/network-manager/edr/edr-provider.d.ts.map +1 -1
  25. package/dist/src/internal/builtin-plugins/network-manager/edr/edr-provider.js +6 -7
  26. package/dist/src/internal/builtin-plugins/network-manager/edr/edr-provider.js.map +1 -1
  27. package/dist/src/internal/builtin-plugins/network-manager/edr/types/hardfork.d.ts +18 -3
  28. package/dist/src/internal/builtin-plugins/network-manager/edr/types/hardfork.d.ts.map +1 -1
  29. package/dist/src/internal/builtin-plugins/network-manager/edr/types/hardfork.js +78 -25
  30. package/dist/src/internal/builtin-plugins/network-manager/edr/types/hardfork.js.map +1 -1
  31. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/convert-to-edr.d.ts +3 -5
  32. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/convert-to-edr.d.ts.map +1 -1
  33. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/convert-to-edr.js +71 -81
  34. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/convert-to-edr.js.map +1 -1
  35. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/hardfork.d.ts +3 -2
  36. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/hardfork.d.ts.map +1 -1
  37. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/hardfork.js +9 -4
  38. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/hardfork.js.map +1 -1
  39. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/accounts/local-accounts.d.ts.map +1 -1
  40. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/accounts/local-accounts.js +5 -3
  41. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/accounts/local-accounts.js.map +1 -1
  42. package/dist/src/internal/builtin-plugins/network-manager/type-extensions/config.d.ts +2 -0
  43. package/dist/src/internal/builtin-plugins/network-manager/type-extensions/config.d.ts.map +1 -1
  44. package/dist/src/internal/builtin-plugins/network-manager/type-validation.d.ts.map +1 -1
  45. package/dist/src/internal/builtin-plugins/network-manager/type-validation.js +60 -26
  46. package/dist/src/internal/builtin-plugins/network-manager/type-validation.js.map +1 -1
  47. package/dist/src/internal/builtin-plugins/solidity-test/reporter.d.ts.map +1 -1
  48. package/dist/src/internal/builtin-plugins/solidity-test/reporter.js +2 -2
  49. package/dist/src/internal/builtin-plugins/solidity-test/reporter.js.map +1 -1
  50. package/dist/src/internal/builtin-plugins/solidity-test/stack-trace-solidity-errors.d.ts.map +1 -1
  51. package/dist/src/internal/builtin-plugins/solidity-test/stack-trace-solidity-errors.js +4 -2
  52. package/dist/src/internal/builtin-plugins/solidity-test/stack-trace-solidity-errors.js.map +1 -1
  53. package/dist/src/internal/builtin-plugins/telemetry/index.d.ts +4 -0
  54. package/dist/src/internal/builtin-plugins/telemetry/index.d.ts.map +1 -0
  55. package/dist/src/internal/builtin-plugins/telemetry/index.js +20 -0
  56. package/dist/src/internal/builtin-plugins/telemetry/index.js.map +1 -0
  57. package/dist/src/internal/builtin-plugins/telemetry/task-action.d.ts +8 -0
  58. package/dist/src/internal/builtin-plugins/telemetry/task-action.d.ts.map +1 -0
  59. package/dist/src/internal/builtin-plugins/telemetry/task-action.js +25 -0
  60. package/dist/src/internal/builtin-plugins/telemetry/task-action.js.map +1 -0
  61. package/dist/src/internal/cli/init/init.d.ts.map +1 -1
  62. package/dist/src/internal/cli/init/init.js +0 -4
  63. package/dist/src/internal/cli/init/init.js.map +1 -1
  64. package/dist/src/internal/cli/main.d.ts.map +1 -1
  65. package/dist/src/internal/cli/main.js +0 -3
  66. package/dist/src/internal/cli/main.js.map +1 -1
  67. package/dist/src/internal/cli/telemetry/analytics/analytics.d.ts +1 -1
  68. package/dist/src/internal/cli/telemetry/analytics/analytics.d.ts.map +1 -1
  69. package/dist/src/internal/cli/telemetry/analytics/analytics.js +7 -7
  70. package/dist/src/internal/cli/telemetry/analytics/analytics.js.map +1 -1
  71. package/dist/src/internal/cli/telemetry/analytics/types.d.ts +3 -3
  72. package/dist/src/internal/cli/telemetry/analytics/types.d.ts.map +1 -1
  73. package/dist/src/internal/cli/telemetry/sentry/subprocess.js +1 -0
  74. package/dist/src/internal/cli/telemetry/sentry/subprocess.js.map +1 -1
  75. package/dist/src/internal/cli/telemetry/telemetry-permissions.d.ts +5 -15
  76. package/dist/src/internal/cli/telemetry/telemetry-permissions.d.ts.map +1 -1
  77. package/dist/src/internal/cli/telemetry/telemetry-permissions.js +29 -65
  78. package/dist/src/internal/cli/telemetry/telemetry-permissions.js.map +1 -1
  79. package/dist/src/types/utils.d.ts +6 -0
  80. package/dist/src/types/utils.d.ts.map +1 -1
  81. package/package.json +8 -8
  82. package/src/internal/builtin-plugins/coverage/index.ts +13 -6
  83. package/src/internal/builtin-plugins/coverage/type-extensions.ts +6 -0
  84. package/src/internal/builtin-plugins/index.ts +3 -0
  85. package/src/internal/builtin-plugins/network-manager/base-provider.ts +2 -7
  86. package/src/internal/builtin-plugins/network-manager/config-resolution.ts +86 -73
  87. package/src/internal/builtin-plugins/network-manager/edr/edr-context.ts +4 -4
  88. package/src/internal/builtin-plugins/network-manager/edr/edr-provider.ts +17 -17
  89. package/src/internal/builtin-plugins/network-manager/edr/types/hardfork.ts +75 -8
  90. package/src/internal/builtin-plugins/network-manager/edr/utils/convert-to-edr.ts +98 -91
  91. package/src/internal/builtin-plugins/network-manager/edr/utils/hardfork.ts +19 -5
  92. package/src/internal/builtin-plugins/network-manager/request-handlers/handlers/accounts/local-accounts.ts +44 -33
  93. package/src/internal/builtin-plugins/network-manager/type-extensions/config.ts +2 -0
  94. package/src/internal/builtin-plugins/network-manager/type-validation.ts +79 -37
  95. package/src/internal/builtin-plugins/solidity-test/reporter.ts +4 -3
  96. package/src/internal/builtin-plugins/solidity-test/stack-trace-solidity-errors.ts +4 -2
  97. package/src/internal/builtin-plugins/telemetry/index.ts +23 -0
  98. package/src/internal/builtin-plugins/telemetry/task-action.ts +45 -0
  99. package/src/internal/cli/init/init.ts +0 -5
  100. package/src/internal/cli/main.ts +0 -5
  101. package/src/internal/cli/telemetry/analytics/analytics.ts +11 -11
  102. package/src/internal/cli/telemetry/analytics/types.ts +3 -3
  103. package/src/internal/cli/telemetry/sentry/subprocess.ts +1 -0
  104. package/src/internal/cli/telemetry/telemetry-permissions.ts +35 -84
  105. package/src/types/utils.ts +7 -0
  106. package/templates/01-node-test-runner-viem/package.json +2 -2
  107. package/templates/02-mocha-ethers/package.json +2 -2
  108. package/dist/src/internal/builtin-plugins/coverage/task-action.d.ts +0 -2
  109. package/dist/src/internal/builtin-plugins/coverage/task-action.d.ts.map +0 -1
  110. package/dist/src/internal/builtin-plugins/coverage/task-action.js +0 -5
  111. package/dist/src/internal/builtin-plugins/coverage/task-action.js.map +0 -1
  112. package/dist/src/internal/cli/prompt/prompt.d.ts +0 -9
  113. package/dist/src/internal/cli/prompt/prompt.d.ts.map +0 -1
  114. package/dist/src/internal/cli/prompt/prompt.js +0 -43
  115. package/dist/src/internal/cli/prompt/prompt.js.map +0 -1
  116. package/src/internal/builtin-plugins/coverage/task-action.ts +0 -9
  117. package/src/internal/cli/prompt/prompt.ts +0 -53
@@ -36,13 +36,24 @@ import {
36
36
  MERGE,
37
37
  SHANGHAI,
38
38
  CANCUN,
39
- OPTIMISM_CHAIN_TYPE as EDR_OPTIMISM_CHAIN_TYPE,
39
+ OP_CHAIN_TYPE as EDR_OP_CHAIN_TYPE,
40
40
  L1_CHAIN_TYPE as EDR_L1_CHAIN_TYPE,
41
41
  GENERIC_CHAIN_TYPE as EDR_GENERIC_CHAIN_TYPE,
42
+ BEDROCK,
43
+ REGOLITH,
44
+ CANYON,
45
+ ECOTONE,
46
+ FJORD,
47
+ GRANITE,
48
+ HOLOCENE,
42
49
  } from "@ignored/edr-optimism";
43
50
  import { getUnprefixedHexString } from "@nomicfoundation/hardhat-utils/hex";
44
51
 
45
- import { L1_CHAIN_TYPE, OPTIMISM_CHAIN_TYPE } from "../../../../constants.js";
52
+ import {
53
+ GENERIC_CHAIN_TYPE,
54
+ L1_CHAIN_TYPE,
55
+ OPTIMISM_CHAIN_TYPE,
56
+ } from "../../../../constants.js";
46
57
  import { FixedValueConfigurationVariable } from "../../../../core/configuration-variables.js";
47
58
  import { derivePrivateKeys } from "../../accounts/derive-private-keys.js";
48
59
  import {
@@ -50,47 +61,84 @@ import {
50
61
  EDR_NETWORK_DEFAULT_PRIVATE_KEYS,
51
62
  isDefaultEdrNetworkHDAccountsConfig,
52
63
  } from "../edr-provider.js";
53
- import { HardforkName } from "../types/hardfork.js";
64
+ import { L1HardforkName, OpHardforkName } from "../types/hardfork.js";
65
+
66
+ import { getL1HardforkName, getOpHardforkName } from "./hardfork.js";
54
67
 
55
- import { getHardforkName } from "./hardfork.js";
68
+ export function hardhatHardforkToEdrSpecId(
69
+ hardfork: string,
70
+ chainType: ChainType,
71
+ ): string {
72
+ return chainType === OPTIMISM_CHAIN_TYPE
73
+ ? hardhatOpHardforkToEdrSpecId(hardfork)
74
+ : hardhatL1HardforkToEdrSpecId(hardfork);
75
+ }
76
+
77
+ function hardhatOpHardforkToEdrSpecId(hardfork: string): string {
78
+ const hardforkName = getOpHardforkName(hardfork);
79
+
80
+ switch (hardforkName) {
81
+ case OpHardforkName.BEDROCK:
82
+ return BEDROCK;
83
+ case OpHardforkName.REGOLITH:
84
+ return REGOLITH;
85
+ case OpHardforkName.CANYON:
86
+ return CANYON;
87
+ case OpHardforkName.ECOTONE:
88
+ return ECOTONE;
89
+ case OpHardforkName.FJORD:
90
+ return FJORD;
91
+ case OpHardforkName.GRANITE:
92
+ return GRANITE;
93
+ case OpHardforkName.HOLOCENE:
94
+ return HOLOCENE;
95
+ // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- trust but verify
96
+ default:
97
+ const _exhaustiveCheck: never = hardforkName;
98
+ throw new Error(
99
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- we want to print the fork
100
+ `Unknown hardfork name '${hardforkName as string}', this shouldn't happen`,
101
+ );
102
+ }
103
+ }
56
104
 
57
- export function hardhatHardforkToEdrSpecId(hardfork: string): string {
58
- const hardforkName = getHardforkName(hardfork);
105
+ function hardhatL1HardforkToEdrSpecId(hardfork: string): string {
106
+ const hardforkName = getL1HardforkName(hardfork);
59
107
 
60
108
  switch (hardforkName) {
61
- case HardforkName.FRONTIER:
109
+ case L1HardforkName.FRONTIER:
62
110
  return FRONTIER;
63
- case HardforkName.HOMESTEAD:
111
+ case L1HardforkName.HOMESTEAD:
64
112
  return HOMESTEAD;
65
- case HardforkName.DAO:
113
+ case L1HardforkName.DAO:
66
114
  return DAO_FORK;
67
- case HardforkName.TANGERINE_WHISTLE:
115
+ case L1HardforkName.TANGERINE_WHISTLE:
68
116
  return TANGERINE;
69
- case HardforkName.SPURIOUS_DRAGON:
117
+ case L1HardforkName.SPURIOUS_DRAGON:
70
118
  return SPURIOUS_DRAGON;
71
- case HardforkName.BYZANTIUM:
119
+ case L1HardforkName.BYZANTIUM:
72
120
  return BYZANTIUM;
73
- case HardforkName.CONSTANTINOPLE:
121
+ case L1HardforkName.CONSTANTINOPLE:
74
122
  return CONSTANTINOPLE;
75
- case HardforkName.PETERSBURG:
123
+ case L1HardforkName.PETERSBURG:
76
124
  return PETERSBURG;
77
- case HardforkName.ISTANBUL:
125
+ case L1HardforkName.ISTANBUL:
78
126
  return ISTANBUL;
79
- case HardforkName.MUIR_GLACIER:
127
+ case L1HardforkName.MUIR_GLACIER:
80
128
  return MUIR_GLACIER;
81
- case HardforkName.BERLIN:
129
+ case L1HardforkName.BERLIN:
82
130
  return BERLIN;
83
- case HardforkName.LONDON:
131
+ case L1HardforkName.LONDON:
84
132
  return LONDON;
85
- case HardforkName.ARROW_GLACIER:
133
+ case L1HardforkName.ARROW_GLACIER:
86
134
  return ARROW_GLACIER;
87
- case HardforkName.GRAY_GLACIER:
135
+ case L1HardforkName.GRAY_GLACIER:
88
136
  return GRAY_GLACIER;
89
- case HardforkName.MERGE:
137
+ case L1HardforkName.MERGE:
90
138
  return MERGE;
91
- case HardforkName.SHANGHAI:
139
+ case L1HardforkName.SHANGHAI:
92
140
  return SHANGHAI;
93
- case HardforkName.CANCUN:
141
+ case L1HardforkName.CANCUN:
94
142
  return CANCUN;
95
143
  // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- trust but verify
96
144
  default:
@@ -102,49 +150,6 @@ export function hardhatHardforkToEdrSpecId(hardfork: string): string {
102
150
  }
103
151
  }
104
152
 
105
- export function edrSpecIdToHardhatHardfork(specId: string): HardforkName {
106
- switch (specId) {
107
- case FRONTIER:
108
- return HardforkName.FRONTIER;
109
- case HOMESTEAD:
110
- return HardforkName.HOMESTEAD;
111
- case DAO_FORK:
112
- return HardforkName.DAO;
113
- case TANGERINE:
114
- return HardforkName.TANGERINE_WHISTLE;
115
- case SPURIOUS_DRAGON:
116
- return HardforkName.SPURIOUS_DRAGON;
117
- case BYZANTIUM:
118
- return HardforkName.BYZANTIUM;
119
- case CONSTANTINOPLE:
120
- return HardforkName.CONSTANTINOPLE;
121
- case PETERSBURG:
122
- return HardforkName.PETERSBURG;
123
- case ISTANBUL:
124
- return HardforkName.ISTANBUL;
125
- case MUIR_GLACIER:
126
- return HardforkName.MUIR_GLACIER;
127
- case BERLIN:
128
- return HardforkName.BERLIN;
129
- case LONDON:
130
- return HardforkName.LONDON;
131
- case ARROW_GLACIER:
132
- return HardforkName.ARROW_GLACIER;
133
- case GRAY_GLACIER:
134
- return HardforkName.GRAY_GLACIER;
135
- case MERGE:
136
- return HardforkName.MERGE;
137
- case SHANGHAI:
138
- return HardforkName.SHANGHAI;
139
- // HACK: EthereumJS doesn't support Cancun, so report Shanghai
140
- case CANCUN:
141
- return HardforkName.SHANGHAI;
142
-
143
- default:
144
- throw new Error(`Unknown spec id '${specId}', this shouldn't happen`);
145
- }
146
- }
147
-
148
153
  export function hardhatMiningIntervalToEdrMiningInterval(
149
154
  config: EdrNetworkMiningConfig["interval"],
150
155
  ): bigint | IntervalRange | undefined {
@@ -274,28 +279,32 @@ export async function normalizeEdrNetworkAccountsConfig(
274
279
 
275
280
  export function hardhatChainsToEdrChains(
276
281
  chains: EdrNetworkChainsConfig,
282
+ chainType: ChainType,
277
283
  ): ChainConfig[] {
278
- const edrChains: ChainConfig[] = [];
279
-
280
- for (const [chainId, hardforkConfig] of chains) {
281
- const hardforks = [];
282
-
283
- for (const [hardfork, blockNumber] of hardforkConfig.hardforkHistory) {
284
- const specId = hardhatHardforkToEdrSpecId(getHardforkName(hardfork));
285
-
286
- hardforks.push({
287
- blockNumber: BigInt(blockNumber),
288
- specId,
289
- });
290
- }
291
-
292
- edrChains.push({
293
- chainId: BigInt(chainId),
294
- hardforks,
295
- });
296
- }
297
-
298
- return edrChains;
284
+ return (
285
+ Array.from(chains)
286
+ // Skip chains that don't match the expected chain type
287
+ .filter(([_, config]) => {
288
+ if (chainType === GENERIC_CHAIN_TYPE) {
289
+ // When "generic" is requested, include both "generic" and "l1" chains
290
+ return (
291
+ config.chainType === GENERIC_CHAIN_TYPE ||
292
+ config.chainType === L1_CHAIN_TYPE
293
+ );
294
+ }
295
+
296
+ return config.chainType === chainType;
297
+ })
298
+ .map(([chainId, config]) => ({
299
+ chainId: BigInt(chainId),
300
+ hardforks: Array.from(config.hardforkHistory).map(
301
+ ([hardfork, blockNumber]) => ({
302
+ blockNumber: BigInt(blockNumber),
303
+ specId: hardhatHardforkToEdrSpecId(hardfork, config.chainType),
304
+ }),
305
+ ),
306
+ }))
307
+ );
299
308
  }
300
309
 
301
310
  export async function hardhatForkingConfigToEdrForkConfig(
@@ -321,11 +330,9 @@ export async function hardhatForkingConfigToEdrForkConfig(
321
330
  return fork;
322
331
  }
323
332
 
324
- export function hardhatChainTypeToEdrChainType(
325
- chainType: ChainType | undefined,
326
- ): string {
333
+ export function hardhatChainTypeToEdrChainType(chainType: ChainType): string {
327
334
  if (chainType === OPTIMISM_CHAIN_TYPE) {
328
- return EDR_OPTIMISM_CHAIN_TYPE;
335
+ return EDR_OP_CHAIN_TYPE;
329
336
  }
330
337
 
331
338
  if (chainType === L1_CHAIN_TYPE) {
@@ -1,16 +1,30 @@
1
1
  import { assertHardhatInvariant } from "@nomicfoundation/hardhat-errors";
2
2
 
3
- import { HardforkName } from "../types/hardfork.js";
3
+ import { L1HardforkName, OpHardforkName } from "../types/hardfork.js";
4
4
 
5
- export function getHardforkName(name: string): HardforkName {
5
+ export function getL1HardforkName(name: string): L1HardforkName {
6
6
  const hardforkName =
7
- Object.values(HardforkName)[
8
- Object.values<string>(HardforkName).indexOf(name)
7
+ Object.values(L1HardforkName)[
8
+ Object.values<string>(L1HardforkName).indexOf(name)
9
9
  ];
10
10
 
11
11
  assertHardhatInvariant(
12
12
  hardforkName !== undefined,
13
- `Invalid harfork name ${name}`,
13
+ `Invalid hardfork name ${name}`,
14
+ );
15
+
16
+ return hardforkName;
17
+ }
18
+
19
+ export function getOpHardforkName(name: string): OpHardforkName {
20
+ const hardforkName =
21
+ Object.values(OpHardforkName)[
22
+ Object.values<string>(OpHardforkName).indexOf(name)
23
+ ];
24
+
25
+ assertHardhatInvariant(
26
+ hardforkName !== undefined,
27
+ `Invalid hardfork name ${name}`,
14
28
  );
15
29
 
16
30
  return hardforkName;
@@ -314,42 +314,53 @@ export class LocalAccountsHandler extends ChainId implements RequestHandler {
314
314
  );
315
315
 
316
316
  let transaction;
317
+ // strict mode is not meant to be used in the context of hardhat
318
+ const strictMode = false;
317
319
  if (txData.maxFeePerGas !== undefined) {
318
- transaction = Transaction.prepare({
319
- type: "eip1559",
320
- to: checksummedAddress,
321
- nonce: txData.nonce,
322
- chainId: txData.chainId ?? toBigInt(chainId),
323
- value: txData.value !== undefined ? txData.value : 0n,
324
- data: txData.data !== undefined ? bytesToHexString(txData.data) : "",
325
- gasLimit: txData.gasLimit,
326
- maxFeePerGas: txData.maxFeePerGas,
327
- maxPriorityFeePerGas: txData.maxPriorityFeePerGas,
328
- accessList: accessList ?? [],
329
- });
320
+ transaction = Transaction.prepare(
321
+ {
322
+ type: "eip1559",
323
+ to: checksummedAddress,
324
+ nonce: txData.nonce,
325
+ chainId: txData.chainId ?? toBigInt(chainId),
326
+ value: txData.value !== undefined ? txData.value : 0n,
327
+ data: txData.data !== undefined ? bytesToHexString(txData.data) : "",
328
+ gasLimit: txData.gasLimit,
329
+ maxFeePerGas: txData.maxFeePerGas,
330
+ maxPriorityFeePerGas: txData.maxPriorityFeePerGas,
331
+ accessList: accessList ?? [],
332
+ },
333
+ strictMode,
334
+ );
330
335
  } else if (accessList !== undefined) {
331
- transaction = Transaction.prepare({
332
- type: "eip2930",
333
- to: checksummedAddress,
334
- nonce: txData.nonce,
335
- chainId: txData.chainId ?? toBigInt(chainId),
336
- value: txData.value !== undefined ? txData.value : 0n,
337
- data: txData.data !== undefined ? bytesToHexString(txData.data) : "",
338
- gasPrice: txData.gasPrice ?? 0n,
339
- gasLimit: txData.gasLimit,
340
- accessList,
341
- });
336
+ transaction = Transaction.prepare(
337
+ {
338
+ type: "eip2930",
339
+ to: checksummedAddress,
340
+ nonce: txData.nonce,
341
+ chainId: txData.chainId ?? toBigInt(chainId),
342
+ value: txData.value !== undefined ? txData.value : 0n,
343
+ data: txData.data !== undefined ? bytesToHexString(txData.data) : "",
344
+ gasPrice: txData.gasPrice ?? 0n,
345
+ gasLimit: txData.gasLimit,
346
+ accessList,
347
+ },
348
+ strictMode,
349
+ );
342
350
  } else {
343
- transaction = Transaction.prepare({
344
- type: "legacy",
345
- to: checksummedAddress,
346
- nonce: txData.nonce,
347
- chainId: txData.chainId ?? toBigInt(chainId),
348
- value: txData.value !== undefined ? txData.value : 0n,
349
- data: txData.data !== undefined ? bytesToHexString(txData.data) : "",
350
- gasPrice: txData.gasPrice ?? 0n,
351
- gasLimit: txData.gasLimit,
352
- });
351
+ transaction = Transaction.prepare(
352
+ {
353
+ type: "legacy",
354
+ to: checksummedAddress,
355
+ nonce: txData.nonce,
356
+ chainId: txData.chainId ?? toBigInt(chainId),
357
+ value: txData.value !== undefined ? txData.value : 0n,
358
+ data: txData.data !== undefined ? bytesToHexString(txData.data) : "",
359
+ gasPrice: txData.gasPrice ?? 0n,
360
+ gasLimit: txData.gasLimit,
361
+ },
362
+ strictMode,
363
+ );
353
364
  }
354
365
 
355
366
  const signedTransaction = transaction.signBy(privateKey);
@@ -109,6 +109,7 @@ declare module "../../../../types/config.js" {
109
109
  >;
110
110
 
111
111
  export interface EdrNetworkChainUserConfig {
112
+ chainType?: ChainType;
112
113
  hardforkHistory?: HardforkHistoryUserConfig;
113
114
  }
114
115
 
@@ -227,6 +228,7 @@ declare module "../../../../types/config.js" {
227
228
  >;
228
229
 
229
230
  export interface EdrNetworkChainConfig {
231
+ chainType: ChainType;
230
232
  hardforkHistory: HardforkHistoryConfig;
231
233
  }
232
234
 
@@ -33,8 +33,10 @@ import {
33
33
 
34
34
  import {
35
35
  hardforkGte,
36
- HardforkName,
37
- LATEST_HARDFORK,
36
+ L1HardforkName,
37
+ isValidHardforkName,
38
+ getHardforks,
39
+ getCurrentHardfork,
38
40
  } from "./edr/types/hardfork.js";
39
41
 
40
42
  const nonnegativeNumberSchema = z.number().nonnegative();
@@ -43,7 +45,6 @@ const nonnegativeBigIntSchema = z.bigint().nonnegative();
43
45
 
44
46
  const blockNumberSchema = nonnegativeIntSchema;
45
47
  const chainIdSchema = nonnegativeIntSchema;
46
- const hardforkNameSchema = z.nativeEnum(HardforkName);
47
48
 
48
49
  const accountsPrivateKeyUserConfigSchema = unionType(
49
50
  [
@@ -139,12 +140,10 @@ const edrNetworkAccountsUserConfigSchema = conditionalUnionType(
139
140
  `Expected an array with with objects with private key and balance or Configuration Variables, or an object with HD account details`,
140
141
  );
141
142
 
142
- const hardforkHistoryUserConfigSchema = z.map(
143
- hardforkNameSchema,
144
- blockNumberSchema,
145
- );
143
+ const hardforkHistoryUserConfigSchema = z.map(z.string(), blockNumberSchema);
146
144
 
147
145
  const edrNetworkChainUserConfigSchema = z.object({
146
+ chainType: z.optional(chainTypeUserConfigSchema),
148
147
  hardforkHistory: z.optional(hardforkHistoryUserConfigSchema),
149
148
  });
150
149
 
@@ -202,7 +201,7 @@ const edrNetworkUserConfigSchema = z.object({
202
201
  enableRip7212: z.optional(z.boolean()),
203
202
  enableTransientStorage: z.optional(z.boolean()),
204
203
  forking: z.optional(edrNetworkForkingUserConfigSchema),
205
- hardfork: z.optional(hardforkNameSchema),
204
+ hardfork: z.optional(z.string()),
206
205
  initialBaseFeePerGas: z.optional(gasUnitUserConfigSchema),
207
206
  initialDate: z.optional(
208
207
  unionType([z.string(), z.instanceof(Date)], "Expected a string or a Date"),
@@ -221,54 +220,97 @@ const baseNetworkUserConfigSchema = z.discriminatedUnion("type", [
221
220
  ]);
222
221
 
223
222
  function refineEdrNetworkUserConfig(
224
- networkConfig: z.infer<typeof baseNetworkUserConfigSchema>,
223
+ networkConfig: NetworkUserConfig,
225
224
  ctx: RefinementCtx,
226
225
  ): void {
227
226
  if (networkConfig.type === "edr") {
228
227
  const {
229
- hardfork = LATEST_HARDFORK,
228
+ chainType = GENERIC_CHAIN_TYPE,
229
+ hardfork,
230
+ chains,
230
231
  minGasPrice,
231
232
  initialBaseFeePerGas,
232
233
  enableTransientStorage,
233
234
  } = networkConfig;
234
235
 
235
- if (hardforkGte(hardfork, HardforkName.LONDON)) {
236
- if (minGasPrice !== undefined) {
236
+ if (hardfork !== undefined && !isValidHardforkName(hardfork, chainType)) {
237
+ ctx.addIssue({
238
+ code: z.ZodIssueCode.custom,
239
+ path: ["hardfork"],
240
+ message: `Invalid hardfork name ${hardfork} for chainType ${chainType}. Expected ${getHardforks(
241
+ chainType,
242
+ ).join(" | ")}.`,
243
+ });
244
+ }
245
+
246
+ if (chains !== undefined) {
247
+ Array.from(chains).forEach(([chainId, chainConfig], chainIdx) => {
248
+ if (chainConfig.hardforkHistory === undefined) {
249
+ return;
250
+ }
251
+
252
+ const type = chainConfig.chainType ?? GENERIC_CHAIN_TYPE;
253
+ Array.from(chainConfig.hardforkHistory).forEach(
254
+ ([name], hardforkIdx) => {
255
+ if (!isValidHardforkName(name, type)) {
256
+ ctx.addIssue({
257
+ code: z.ZodIssueCode.custom,
258
+ path: [
259
+ "chains",
260
+ chainIdx,
261
+ "value",
262
+ "hardforkHistory",
263
+ hardforkIdx,
264
+ "value",
265
+ ],
266
+ message: `Invalid hardfork name ${name} found in chain ${chainId}. Expected ${getHardforks(type).join(" | ")}.`,
267
+ });
268
+ }
269
+ },
270
+ );
271
+ });
272
+ }
273
+
274
+ const resolvedHardfork = hardfork ?? getCurrentHardfork(chainType);
275
+ if (chainType === L1_CHAIN_TYPE || chainType === GENERIC_CHAIN_TYPE) {
276
+ if (hardforkGte(resolvedHardfork, L1HardforkName.LONDON, chainType)) {
277
+ if (minGasPrice !== undefined) {
278
+ ctx.addIssue({
279
+ code: z.ZodIssueCode.custom,
280
+ message:
281
+ "minGasPrice is not valid for networks with EIP-1559. Try an older hardfork or remove it.",
282
+ });
283
+ }
284
+ } else {
285
+ if (initialBaseFeePerGas !== undefined) {
286
+ ctx.addIssue({
287
+ code: z.ZodIssueCode.custom,
288
+ message:
289
+ "initialBaseFeePerGas is only valid for networks with EIP-1559. Try a newer hardfork or remove it.",
290
+ });
291
+ }
292
+ }
293
+
294
+ if (
295
+ !hardforkGte(resolvedHardfork, L1HardforkName.CANCUN, chainType) &&
296
+ enableTransientStorage === true
297
+ ) {
237
298
  ctx.addIssue({
238
299
  code: z.ZodIssueCode.custom,
239
- message:
240
- "minGasPrice is not valid for networks with EIP-1559. Try an older hardfork or remove it.",
300
+ message: `'enableTransientStorage' is not supported for hardforks before 'cancun'. Please use a hardfork from 'cancun' onwards to enable this feature.`,
241
301
  });
242
302
  }
243
- } else {
244
- if (initialBaseFeePerGas !== undefined) {
303
+ if (
304
+ hardforkGte(resolvedHardfork, L1HardforkName.CANCUN, chainType) &&
305
+ enableTransientStorage === false
306
+ ) {
245
307
  ctx.addIssue({
246
308
  code: z.ZodIssueCode.custom,
247
- message:
248
- "initialBaseFeePerGas is only valid for networks with EIP-1559. Try a newer hardfork or remove it.",
309
+ message: `'enableTransientStorage' must be enabled for hardforks 'cancun' or later. To disable this feature, use a hardfork before 'cancun'.`,
249
310
  });
250
311
  }
251
312
  }
252
313
 
253
- if (
254
- !hardforkGte(hardfork, HardforkName.CANCUN) &&
255
- enableTransientStorage === true
256
- ) {
257
- ctx.addIssue({
258
- code: z.ZodIssueCode.custom,
259
- message: `'enableTransientStorage' is not supported for hardforks before 'cancun'. Please use a hardfork from 'cancun' onwards to enable this feature.`,
260
- });
261
- }
262
- if (
263
- hardforkGte(hardfork, HardforkName.CANCUN) &&
264
- enableTransientStorage === false
265
- ) {
266
- ctx.addIssue({
267
- code: z.ZodIssueCode.custom,
268
- message: `'enableTransientStorage' must be enabled for hardforks 'cancun' or later. To disable this feature, use a hardfork before 'cancun'.`,
269
- });
270
- }
271
-
272
314
  if (
273
315
  typeof networkConfig.mining?.interval === "number" ||
274
316
  Array.isArray(networkConfig.mining?.interval)
@@ -176,9 +176,10 @@ export async function* testReporter(
176
176
  failure.counterexample !== undefined &&
177
177
  failure.counterexample !== null
178
178
  ) {
179
- const counterexamples = Array.isArray(failure.counterexample)
180
- ? failure.counterexample
181
- : [failure.counterexample];
179
+ const counterexamples =
180
+ "sequence" in failure.counterexample
181
+ ? failure.counterexample.sequence
182
+ : [failure.counterexample];
182
183
 
183
184
  for (const counterexample of counterexamples) {
184
185
  const details = Object.entries(counterexample).map(
@@ -46,13 +46,15 @@ export function getMessageFromLastStackTraceEntry(
46
46
  case StackTraceEntryType.DIRECT_LIBRARY_CALL_ERROR:
47
47
  return `Library was called directly`;
48
48
 
49
+ /* These types are not associate with a more detailed error message */
49
50
  case StackTraceEntryType.UNRECOGNIZED_CREATE_ERROR:
50
51
  case StackTraceEntryType.UNRECOGNIZED_CONTRACT_ERROR: {
51
- return "Contract reverted without a reason string";
52
+ return undefined;
52
53
  }
53
54
 
55
+ /* These types are not associate with a more detailed error message */
54
56
  case StackTraceEntryType.REVERT_ERROR: {
55
- return "Contract reverted without a reason string";
57
+ return undefined;
56
58
  }
57
59
 
58
60
  case StackTraceEntryType.PANIC_ERROR:
@@ -0,0 +1,23 @@
1
+ import type { HardhatPlugin } from "../../../types/plugins.js";
2
+
3
+ import { task } from "../../core/config.js";
4
+
5
+ const hardhatPlugin: HardhatPlugin = {
6
+ id: "builtin:telemetry",
7
+ tasks: [
8
+ task("telemetry", "Displays and modifies your telemetry settings")
9
+ .addFlag({
10
+ name: "enable",
11
+ description: "Enable telemetry",
12
+ })
13
+ .addFlag({
14
+ name: "disable",
15
+ description: "Disable telemetry",
16
+ })
17
+ .setAction(import.meta.resolve("./task-action.js"))
18
+ .build(),
19
+ ],
20
+ npmPackage: "hardhat",
21
+ };
22
+
23
+ export default hardhatPlugin;
@@ -0,0 +1,45 @@
1
+ import type { NewTaskActionFunction } from "../../../types/tasks.js";
2
+
3
+ import {
4
+ isTelemetryAllowed,
5
+ setTelemetryEnabled,
6
+ } from "../../cli/telemetry/telemetry-permissions.js";
7
+
8
+ interface TelemetryActionArguments {
9
+ enable: boolean;
10
+ disable: boolean;
11
+ }
12
+
13
+ const configureTelemetry: NewTaskActionFunction<
14
+ TelemetryActionArguments
15
+ > = async ({ enable, disable }) => {
16
+ if (enable && disable) {
17
+ console.error("Cannot enable and disable telemetry at the same time");
18
+ process.exitCode = 1;
19
+ return;
20
+ }
21
+
22
+ if (enable) {
23
+ console.log("Enabling telemetry...");
24
+ await setTelemetryEnabled(true);
25
+ }
26
+
27
+ if (disable) {
28
+ console.log("Disabling telemetry...");
29
+ await setTelemetryEnabled(false);
30
+ }
31
+
32
+ const consent = await isTelemetryAllowed();
33
+
34
+ if (consent) {
35
+ console.log(
36
+ "Telemetry is now enabled, to disable it run `npx hardhat telemetry --disable`",
37
+ );
38
+ } else {
39
+ console.log(
40
+ "Telemetry is now disabled, to enable it run `npx hardhat telemetry --enable`",
41
+ );
42
+ }
43
+ };
44
+
45
+ export default configureTelemetry;