hardhat 3.4.1 → 3.4.2

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 (119) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/src/cli.js +5 -5
  3. package/dist/src/cli.js.map +1 -1
  4. package/dist/src/internal/builtin-plugins/artifacts/artifact-manager.d.ts.map +1 -1
  5. package/dist/src/internal/builtin-plugins/artifacts/artifact-manager.js +10 -3
  6. package/dist/src/internal/builtin-plugins/artifacts/artifact-manager.js.map +1 -1
  7. package/dist/src/internal/builtin-plugins/coverage/exports.d.ts +1 -1
  8. package/dist/src/internal/builtin-plugins/coverage/exports.d.ts.map +1 -1
  9. package/dist/src/internal/builtin-plugins/coverage/exports.js +1 -1
  10. package/dist/src/internal/builtin-plugins/coverage/exports.js.map +1 -1
  11. package/dist/src/internal/builtin-plugins/coverage/helpers/accessors.d.ts +7 -0
  12. package/dist/src/internal/builtin-plugins/coverage/helpers/accessors.d.ts.map +1 -0
  13. package/dist/src/internal/builtin-plugins/coverage/helpers/accessors.js +24 -0
  14. package/dist/src/internal/builtin-plugins/coverage/helpers/accessors.js.map +1 -0
  15. package/dist/src/internal/builtin-plugins/coverage/helpers/compat.d.ts +4 -0
  16. package/dist/src/internal/builtin-plugins/coverage/helpers/compat.d.ts.map +1 -0
  17. package/dist/src/internal/builtin-plugins/coverage/helpers/compat.js +27 -0
  18. package/dist/src/internal/builtin-plugins/coverage/helpers/compat.js.map +1 -0
  19. package/dist/src/internal/builtin-plugins/coverage/hook-handlers/clean.js +1 -1
  20. package/dist/src/internal/builtin-plugins/coverage/hook-handlers/clean.js.map +1 -1
  21. package/dist/src/internal/builtin-plugins/coverage/hook-handlers/hre.d.ts.map +1 -1
  22. package/dist/src/internal/builtin-plugins/coverage/hook-handlers/hre.js +18 -15
  23. package/dist/src/internal/builtin-plugins/coverage/hook-handlers/hre.js.map +1 -1
  24. package/dist/src/internal/builtin-plugins/coverage/hook-handlers/solidity.js +1 -1
  25. package/dist/src/internal/builtin-plugins/coverage/hook-handlers/solidity.js.map +1 -1
  26. package/dist/src/internal/builtin-plugins/coverage/hook-handlers/test.js +1 -1
  27. package/dist/src/internal/builtin-plugins/coverage/hook-handlers/test.js.map +1 -1
  28. package/dist/src/internal/builtin-plugins/gas-analytics/helpers/accessors.d.ts.map +1 -1
  29. package/dist/src/internal/builtin-plugins/gas-analytics/helpers/accessors.js +10 -4
  30. package/dist/src/internal/builtin-plugins/gas-analytics/helpers/accessors.js.map +1 -1
  31. package/dist/src/internal/builtin-plugins/gas-analytics/hook-handlers/hre.d.ts.map +1 -1
  32. package/dist/src/internal/builtin-plugins/gas-analytics/hook-handlers/hre.js +18 -14
  33. package/dist/src/internal/builtin-plugins/gas-analytics/hook-handlers/hre.js.map +1 -1
  34. package/dist/src/internal/builtin-plugins/gas-analytics/snapshot-cheatcodes.d.ts.map +1 -1
  35. package/dist/src/internal/builtin-plugins/gas-analytics/snapshot-cheatcodes.js +2 -7
  36. package/dist/src/internal/builtin-plugins/gas-analytics/snapshot-cheatcodes.js.map +1 -1
  37. package/dist/src/internal/builtin-plugins/network-manager/config-resolution.js +1 -1
  38. package/dist/src/internal/builtin-plugins/network-manager/config-resolution.js.map +1 -1
  39. package/dist/src/internal/builtin-plugins/network-manager/edr/edr-constants.d.ts +14 -0
  40. package/dist/src/internal/builtin-plugins/network-manager/edr/edr-constants.d.ts.map +1 -0
  41. package/dist/src/internal/builtin-plugins/network-manager/edr/edr-constants.js +40 -0
  42. package/dist/src/internal/builtin-plugins/network-manager/edr/edr-constants.js.map +1 -0
  43. package/dist/src/internal/builtin-plugins/network-manager/edr/edr-provider.d.ts +1 -12
  44. package/dist/src/internal/builtin-plugins/network-manager/edr/edr-provider.d.ts.map +1 -1
  45. package/dist/src/internal/builtin-plugins/network-manager/edr/edr-provider.js +0 -39
  46. package/dist/src/internal/builtin-plugins/network-manager/edr/edr-provider.js.map +1 -1
  47. package/dist/src/internal/builtin-plugins/network-manager/edr/types/hardfork.d.ts.map +1 -1
  48. package/dist/src/internal/builtin-plugins/network-manager/edr/types/hardfork.js +2 -5
  49. package/dist/src/internal/builtin-plugins/network-manager/edr/types/hardfork.js.map +1 -1
  50. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/convert-to-edr.js +1 -1
  51. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/convert-to-edr.js.map +1 -1
  52. package/dist/src/internal/builtin-plugins/node/helpers.js +1 -1
  53. package/dist/src/internal/builtin-plugins/node/helpers.js.map +1 -1
  54. package/dist/src/internal/builtin-plugins/solidity/build-system/build-system.d.ts.map +1 -1
  55. package/dist/src/internal/builtin-plugins/solidity/build-system/build-system.js +50 -20
  56. package/dist/src/internal/builtin-plugins/solidity/build-system/build-system.js.map +1 -1
  57. package/dist/src/internal/builtin-plugins/solidity/hook-handlers/hre.d.ts.map +1 -1
  58. package/dist/src/internal/builtin-plugins/solidity/hook-handlers/hre.js +6 -1
  59. package/dist/src/internal/builtin-plugins/solidity/hook-handlers/hre.js.map +1 -1
  60. package/dist/src/internal/builtin-plugins/solidity-test/task-action.js +1 -1
  61. package/dist/src/internal/builtin-plugins/solidity-test/task-action.js.map +1 -1
  62. package/dist/src/internal/builtin-plugins/test/task-action.js +1 -1
  63. package/dist/src/internal/builtin-plugins/test/task-action.js.map +1 -1
  64. package/dist/src/internal/cli/init/init.d.ts.map +1 -1
  65. package/dist/src/internal/cli/init/init.js +17 -8
  66. package/dist/src/internal/cli/init/init.js.map +1 -1
  67. package/dist/src/internal/cli/init/template.d.ts.map +1 -1
  68. package/dist/src/internal/cli/init/template.js +5 -14
  69. package/dist/src/internal/cli/init/template.js.map +1 -1
  70. package/dist/src/internal/cli/node-version.d.ts +1 -1
  71. package/dist/src/internal/cli/node-version.d.ts.map +1 -1
  72. package/dist/src/internal/cli/node-version.js +16 -9
  73. package/dist/src/internal/cli/node-version.js.map +1 -1
  74. package/dist/src/internal/core/hook-manager.d.ts.map +1 -1
  75. package/dist/src/internal/core/hook-manager.js +194 -57
  76. package/dist/src/internal/core/hook-manager.js.map +1 -1
  77. package/dist/src/internal/core/hre.js +2 -2
  78. package/dist/src/internal/core/hre.js.map +1 -1
  79. package/dist/src/internal/core/lazy-user-interruptions.d.ts +11 -0
  80. package/dist/src/internal/core/lazy-user-interruptions.d.ts.map +1 -0
  81. package/dist/src/internal/core/lazy-user-interruptions.js +39 -0
  82. package/dist/src/internal/core/lazy-user-interruptions.js.map +1 -0
  83. package/package.json +2 -2
  84. package/src/cli.ts +5 -5
  85. package/src/internal/builtin-plugins/artifacts/artifact-manager.ts +12 -5
  86. package/src/internal/builtin-plugins/coverage/exports.ts +1 -1
  87. package/src/internal/builtin-plugins/coverage/helpers/accessors.ts +44 -0
  88. package/src/internal/builtin-plugins/coverage/helpers/compat.ts +37 -0
  89. package/src/internal/builtin-plugins/coverage/hook-handlers/clean.ts +1 -1
  90. package/src/internal/builtin-plugins/coverage/hook-handlers/hre.ts +26 -16
  91. package/src/internal/builtin-plugins/coverage/hook-handlers/solidity.ts +1 -1
  92. package/src/internal/builtin-plugins/coverage/hook-handlers/test.ts +1 -1
  93. package/src/internal/builtin-plugins/gas-analytics/helpers/accessors.ts +12 -5
  94. package/src/internal/builtin-plugins/gas-analytics/hook-handlers/hre.ts +29 -17
  95. package/src/internal/builtin-plugins/gas-analytics/snapshot-cheatcodes.ts +2 -6
  96. package/src/internal/builtin-plugins/network-manager/config-resolution.ts +1 -1
  97. package/src/internal/builtin-plugins/network-manager/edr/edr-constants.ts +61 -0
  98. package/src/internal/builtin-plugins/network-manager/edr/edr-provider.ts +0 -59
  99. package/src/internal/builtin-plugins/network-manager/edr/types/hardfork.ts +3 -9
  100. package/src/internal/builtin-plugins/network-manager/edr/utils/convert-to-edr.ts +1 -1
  101. package/src/internal/builtin-plugins/node/helpers.ts +1 -1
  102. package/src/internal/builtin-plugins/solidity/build-system/build-system.ts +69 -43
  103. package/src/internal/builtin-plugins/solidity/hook-handlers/hre.ts +13 -4
  104. package/src/internal/builtin-plugins/solidity-test/task-action.ts +1 -1
  105. package/src/internal/builtin-plugins/test/task-action.ts +1 -1
  106. package/src/internal/cli/init/init.ts +31 -13
  107. package/src/internal/cli/init/template.ts +22 -27
  108. package/src/internal/cli/node-version.ts +19 -11
  109. package/src/internal/core/hook-manager.ts +265 -101
  110. package/src/internal/core/hre.ts +2 -2
  111. package/src/internal/core/lazy-user-interruptions.ts +75 -0
  112. package/templates/hardhat-3/01-node-test-runner-viem/package.json +2 -2
  113. package/templates/hardhat-3/02-mocha-ethers/package.json +2 -2
  114. package/templates/hardhat-3/03-minimal/package.json +1 -1
  115. package/dist/src/internal/builtin-plugins/coverage/helpers.d.ts +0 -15
  116. package/dist/src/internal/builtin-plugins/coverage/helpers.d.ts.map +0 -1
  117. package/dist/src/internal/builtin-plugins/coverage/helpers.js +0 -35
  118. package/dist/src/internal/builtin-plugins/coverage/helpers.js.map +0 -1
  119. package/src/internal/builtin-plugins/coverage/helpers.ts +0 -63
@@ -1,26 +1,36 @@
1
1
  import type { HardhatRuntimeEnvironmentHooks } from "../../../../types/hooks.js";
2
+ import type { CoverageManagerImplementation as CoverageManagerImplementationT } from "../coverage-manager.js";
2
3
 
3
- import { CoverageManagerImplementation } from "../coverage-manager.js";
4
- import { getCoveragePath, setCoverageManager } from "../helpers.js";
4
+ import { getCoveragePath, setCoverageManager } from "../helpers/accessors.js";
5
+
6
+ let CoverageManagerImplementation:
7
+ | typeof CoverageManagerImplementationT
8
+ | undefined;
5
9
 
6
10
  export default async (): Promise<Partial<HardhatRuntimeEnvironmentHooks>> => ({
7
11
  created: async (context, hre) => {
8
- if (context.globalOptions.coverage) {
9
- const coveragePath = getCoveragePath(hre.config.paths.root);
10
- const coverageManager = new CoverageManagerImplementation(coveragePath);
12
+ if (!context.globalOptions.coverage) {
13
+ return;
14
+ }
11
15
 
12
- setCoverageManager(hre, coverageManager);
16
+ if (CoverageManagerImplementation === undefined) {
17
+ ({ CoverageManagerImplementation } = await import(
18
+ "../coverage-manager.js"
19
+ ));
20
+ }
13
21
 
14
- // NOTE: We register this hook dynamically because we use the information about
15
- // the existence of onCoverageData hook handlers to determine whether coverage
16
- // is enabled or not.
17
- hre.hooks.registerHandlers("network", {
18
- onCoverageData: async (_context, coverageData) => {
19
- await coverageManager.addData(coverageData);
22
+ const coveragePath = getCoveragePath(hre.config.paths.root);
23
+ const coverageManager = new CoverageManagerImplementation(coveragePath);
20
24
 
21
- return;
22
- },
23
- });
24
- }
25
+ setCoverageManager(hre, coverageManager);
26
+
27
+ // NOTE: We register this hook dynamically because we use the information about
28
+ // the existence of onCoverageData hook handlers to determine whether coverage
29
+ // is enabled or not.
30
+ hre.hooks.registerHandlers("network", {
31
+ onCoverageData: async (_context, coverageData) => {
32
+ await coverageManager.addData(coverageData);
33
+ },
34
+ });
25
35
  },
26
36
  });
@@ -9,7 +9,7 @@ import { readUtf8File } from "@nomicfoundation/hardhat-utils/fs";
9
9
  import { findClosestPackageRoot } from "@nomicfoundation/hardhat-utils/package";
10
10
  import debug from "debug";
11
11
 
12
- import { getCoverageManager } from "../helpers.js";
12
+ import { getCoverageManager } from "../helpers/accessors.js";
13
13
  import { instrumentSolidityFileForCompilationJob } from "../instrumentation.js";
14
14
 
15
15
  const log = debug("hardhat:core:coverage:hook-handlers:solidity");
@@ -1,6 +1,6 @@
1
1
  import type { HookContext, TestHooks } from "../../../../types/hooks.js";
2
2
 
3
- import { getCoverageManager } from "../helpers.js";
3
+ import { getCoverageManager } from "../helpers/accessors.js";
4
4
 
5
5
  export default async (): Promise<Partial<TestHooks>> => ({
6
6
  onTestRunStart: async (context, id, next) => {
@@ -1,3 +1,12 @@
1
+ // NOTE: This file is imported from hot paths — the plugin's `created` hook
2
+ // handler and task-actions that may run on every `hardhat test` invocation
3
+ // regardless of whether the feature is enabled. It must stay lightweight:
4
+ // do not add top-level imports that pull in the gas-analytics-manager module
5
+ // graph (chalk, debug, node:crypto, file-system traversal, etc.), or the
6
+ // `--gas-stats` lazy-load is silently defeated for every caller.
7
+ // If a new helper needs a heavy dependency, put it in a sibling file
8
+ // (e.g. `helpers/utils.ts`) so the accessors file's import cost stays flat.
9
+
1
10
  import type { HookContext } from "../../../../types/hooks.js";
2
11
  import type { HardhatRuntimeEnvironment } from "../../../../types/hre.js";
3
12
  import type { GasAnalyticsManager } from "../types.js";
@@ -5,16 +14,14 @@ import type { GasAnalyticsManager } from "../types.js";
5
14
  import { assertHardhatInvariant } from "@nomicfoundation/hardhat-errors";
6
15
 
7
16
  import { HardhatRuntimeEnvironmentImplementation } from "../../../core/hre.js";
8
- import { GasAnalyticsManagerImplementation } from "../gas-analytics-manager.js";
9
17
 
10
18
  export function getGasAnalyticsManager(
11
19
  hookContextOrHre: HookContext | HardhatRuntimeEnvironment,
12
20
  ): GasAnalyticsManager {
13
21
  assertHardhatInvariant(
14
- "_gasAnalytics" in hookContextOrHre &&
15
- hookContextOrHre._gasAnalytics instanceof
16
- GasAnalyticsManagerImplementation,
17
- "Expected _gasAnalytics to be an instance of GasAnalyticsManagerImplementation",
22
+ hookContextOrHre instanceof HardhatRuntimeEnvironmentImplementation &&
23
+ hookContextOrHre._gasAnalytics !== undefined,
24
+ "Expected _gasAnalytics to be installed on the HRE",
18
25
  );
19
26
  return hookContextOrHre._gasAnalytics;
20
27
  }
@@ -1,29 +1,41 @@
1
1
  import type { HardhatRuntimeEnvironmentHooks } from "../../../../types/hooks.js";
2
+ import type { GasAnalyticsManagerImplementation as GasAnalyticsManagerImplementationT } from "../gas-analytics-manager.js";
2
3
 
3
- import { GasAnalyticsManagerImplementation } from "../gas-analytics-manager.js";
4
4
  import { setGasAnalyticsManager } from "../helpers/accessors.js";
5
5
 
6
+ let GasAnalyticsManagerImplementation:
7
+ | typeof GasAnalyticsManagerImplementationT
8
+ | undefined;
9
+
6
10
  export default async (): Promise<Partial<HardhatRuntimeEnvironmentHooks>> => ({
7
11
  created: async (context, hre) => {
8
12
  if (
9
- context.globalOptions.gasStats ||
10
- context.globalOptions.gasStatsJson !== undefined
13
+ !context.globalOptions.gasStats &&
14
+ context.globalOptions.gasStatsJson === undefined
11
15
  ) {
12
- const gasAnalyticsManager = new GasAnalyticsManagerImplementation(
13
- hre.config.paths.cache,
14
- );
15
-
16
- setGasAnalyticsManager(hre, gasAnalyticsManager);
16
+ return;
17
+ }
17
18
 
18
- // NOTE: We register this hook dynamically to avoid a circular dependency
19
- // between gas-analytics and network-manager plugins. The network-manager
20
- // checks for the existence of onGasReported handlers to determine if gas
21
- // analytics is enabled, rather than directly checking the global option.
22
- hre.hooks.registerHandlers("network", {
23
- onGasMeasurement: (_context, gasMeasurement) => {
24
- gasAnalyticsManager.addGasMeasurement(gasMeasurement);
25
- },
26
- });
19
+ if (GasAnalyticsManagerImplementation === undefined) {
20
+ ({ GasAnalyticsManagerImplementation } = await import(
21
+ "../gas-analytics-manager.js"
22
+ ));
27
23
  }
24
+
25
+ const gasAnalyticsManager = new GasAnalyticsManagerImplementation(
26
+ hre.config.paths.cache,
27
+ );
28
+
29
+ setGasAnalyticsManager(hre, gasAnalyticsManager);
30
+
31
+ // NOTE: We register this hook dynamically to avoid a circular dependency
32
+ // between gas-analytics and network-manager plugins. The network-manager
33
+ // checks for the existence of onGasReported handlers to determine if gas
34
+ // analytics is enabled, rather than directly checking the global option.
35
+ hre.hooks.registerHandlers("network", {
36
+ onGasMeasurement: (_context, gasMeasurement) => {
37
+ gasAnalyticsManager.addGasMeasurement(gasMeasurement);
38
+ },
39
+ });
28
40
  },
29
41
  });
@@ -7,6 +7,7 @@ import { ensureError } from "@nomicfoundation/hardhat-utils/error";
7
7
  import {
8
8
  FileNotFoundError,
9
9
  readdir,
10
+ readdirOrEmpty,
10
11
  readJsonFile,
11
12
  remove,
12
13
  writeJsonFile,
@@ -116,9 +117,8 @@ async function deleteOrphanedSnapshotFiles(
116
117
  snapshotsDir: string,
117
118
  currentGroups: Set<string>,
118
119
  ): Promise<void> {
119
- let dirEntries: string[];
120
120
  try {
121
- dirEntries = await readdir(snapshotsDir);
121
+ const dirEntries = await readdirOrEmpty(snapshotsDir);
122
122
 
123
123
  for (const entry of dirEntries) {
124
124
  if (entry.endsWith(".json")) {
@@ -131,10 +131,6 @@ async function deleteOrphanedSnapshotFiles(
131
131
  }
132
132
  } catch (error) {
133
133
  ensureError(error);
134
- // Directory doesn't exist yet, nothing to clean up
135
- if (error instanceof FileNotFoundError) {
136
- return;
137
- }
138
134
  throw new HardhatError(
139
135
  HardhatError.ERRORS.CORE.SOLIDITY_TESTS.SNAPSHOT_WRITE_ERROR,
140
136
  { snapshotsPath: snapshotsDir, error: error.message },
@@ -36,7 +36,7 @@ import { DEFAULT_CHAIN_DESCRIPTORS } from "./chain-descriptors.js";
36
36
  import {
37
37
  DEFAULT_EDR_NETWORK_HD_ACCOUNTS_CONFIG_PARAMS,
38
38
  EDR_NETWORK_DEFAULT_COINBASE,
39
- } from "./edr/edr-provider.js";
39
+ } from "./edr/edr-constants.js";
40
40
  import { getCurrentHardfork } from "./edr/types/hardfork.js";
41
41
  import { isHttpNetworkHdAccountsUserConfig } from "./type-validation.js";
42
42
 
@@ -0,0 +1,61 @@
1
+ import type { EdrNetworkHDAccountsConfig } from "../../../../types/config.js";
2
+ import type { DefaultHDAccountsConfigParams } from "../accounts/constants.js";
3
+
4
+ import { deepEqual } from "@nomicfoundation/hardhat-utils/lang";
5
+
6
+ import { DEFAULT_HD_ACCOUNTS_CONFIG_PARAMS } from "../accounts/constants.js";
7
+
8
+ export const EDR_NETWORK_DEFAULT_COINBASE =
9
+ "0xc014ba5ec014ba5ec014ba5ec014ba5ec014ba5e";
10
+
11
+ interface EdrNetworkDefaultHDAccountsConfigParams
12
+ extends DefaultHDAccountsConfigParams {
13
+ mnemonic: string;
14
+ accountsBalance: bigint;
15
+ }
16
+
17
+ export const EDR_NETWORK_MNEMONIC =
18
+ "test test test test test test test test test test test junk";
19
+ export const DEFAULT_EDR_NETWORK_BALANCE = 10000000000000000000000n;
20
+ export const DEFAULT_EDR_NETWORK_HD_ACCOUNTS_CONFIG_PARAMS: EdrNetworkDefaultHDAccountsConfigParams =
21
+ {
22
+ ...DEFAULT_HD_ACCOUNTS_CONFIG_PARAMS,
23
+ mnemonic: EDR_NETWORK_MNEMONIC,
24
+ accountsBalance: DEFAULT_EDR_NETWORK_BALANCE,
25
+ };
26
+
27
+ export async function isDefaultEdrNetworkHDAccountsConfig(
28
+ accounts: EdrNetworkHDAccountsConfig,
29
+ ): Promise<boolean> {
30
+ return await deepEqual(
31
+ {
32
+ ...accounts,
33
+ mnemonic: await accounts.mnemonic.get(),
34
+ passphrase: await accounts.passphrase.get(),
35
+ },
36
+ DEFAULT_EDR_NETWORK_HD_ACCOUNTS_CONFIG_PARAMS,
37
+ );
38
+ }
39
+
40
+ export const EDR_NETWORK_DEFAULT_PRIVATE_KEYS: string[] = [
41
+ "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80",
42
+ "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d",
43
+ "0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a",
44
+ "0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6",
45
+ "0x47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a",
46
+ "0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba",
47
+ "0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e",
48
+ "0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356",
49
+ "0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97",
50
+ "0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6",
51
+ "0xf214f2b2cd398c806f84e317254e0f0b801d0643303237d97a22a48e01628897",
52
+ "0x701b615bbdfb9de65240bc28bd21bbc0d996645a3dd57e7b12bc2bdf6f192c82",
53
+ "0xa267530f49f8280200edf313ee7af6b827f2a8bce2897751d06a843f644967b1",
54
+ "0x47c99abed3324a2707c28affff1267e45918ec8c3f20b8aa892e8b065d2942dd",
55
+ "0xc526ee95bf44d8fc405a158bb884d9d1238d99f0612e9f33d006bb0789009aaa",
56
+ "0x8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61",
57
+ "0xea6c44ac03bff858b476bba40716402b03e41b8e97e276d1baec7c37d42484a0",
58
+ "0x689af8efa8c651a91ad287602527f3af2fe9f6501a7ac4b061667b5a93e037fd",
59
+ "0xde9be858da4a475276426320d5e9262ecfc3ba460bfac56360bfa6c4c28b4ee0",
60
+ "0xdf57089febbacf7ba0bc227dafbffa9fc08a93fdc68e1e42411a14efcf23656e",
61
+ ];
@@ -3,7 +3,6 @@ import type { LoggerConfig } from "./types/logger.js";
3
3
  import type {
4
4
  ChainDescriptorsConfig,
5
5
  EdrNetworkConfig,
6
- EdrNetworkHDAccountsConfig,
7
6
  } from "../../../../types/config.js";
8
7
  import type {
9
8
  EthSubscription,
@@ -13,7 +12,6 @@ import type {
13
12
  SuccessfulJsonRpcResponse,
14
13
  } from "../../../../types/providers.js";
15
14
  import type { RequireField } from "../../../../types/utils.js";
16
- import type { DefaultHDAccountsConfigParams } from "../accounts/constants.js";
17
15
  import type { JsonRpcRequestWrapperFunction } from "../network-manager.js";
18
16
  import type { TraceOutputManager } from "./utils/trace-output.js";
19
17
  import type {
@@ -33,14 +31,12 @@ import {
33
31
  import { toSeconds } from "@nomicfoundation/hardhat-utils/date";
34
32
  import { ensureError } from "@nomicfoundation/hardhat-utils/error";
35
33
  import { numberToHexString } from "@nomicfoundation/hardhat-utils/hex";
36
- import { deepEqual } from "@nomicfoundation/hardhat-utils/lang";
37
34
  import debug from "debug";
38
35
 
39
36
  import { sendErrorTelemetry } from "../../../cli/telemetry/error-reporter/reporter.js";
40
37
  import { EDR_NETWORK_REVERT_SNAPSHOT_EVENT } from "../../../constants.js";
41
38
  import { hardhatChainTypeToEdrChainType } from "../../../edr/chain-type.js";
42
39
  import { getGlobalEdrContext } from "../../../edr/context.js";
43
- import { DEFAULT_HD_ACCOUNTS_CONFIG_PARAMS } from "../accounts/constants.js";
44
40
  import { BaseProvider } from "../base-provider.js";
45
41
  import { getJsonRpcRequest, isFailedJsonRpcResponse } from "../json-rpc.js";
46
42
  import {
@@ -65,61 +61,6 @@ import { printLine, replaceLastLine } from "./utils/logger.js";
65
61
 
66
62
  const log = debug("hardhat:core:hardhat-network:provider");
67
63
 
68
- export const EDR_NETWORK_DEFAULT_COINBASE =
69
- "0xc014ba5ec014ba5ec014ba5ec014ba5ec014ba5e";
70
-
71
- interface EdrNetworkDefaultHDAccountsConfigParams
72
- extends DefaultHDAccountsConfigParams {
73
- mnemonic: string;
74
- accountsBalance: bigint;
75
- }
76
-
77
- export const EDR_NETWORK_MNEMONIC =
78
- "test test test test test test test test test test test junk";
79
- export const DEFAULT_EDR_NETWORK_BALANCE = 10000000000000000000000n;
80
- export const DEFAULT_EDR_NETWORK_HD_ACCOUNTS_CONFIG_PARAMS: EdrNetworkDefaultHDAccountsConfigParams =
81
- {
82
- ...DEFAULT_HD_ACCOUNTS_CONFIG_PARAMS,
83
- mnemonic: EDR_NETWORK_MNEMONIC,
84
- accountsBalance: DEFAULT_EDR_NETWORK_BALANCE,
85
- };
86
-
87
- export async function isDefaultEdrNetworkHDAccountsConfig(
88
- accounts: EdrNetworkHDAccountsConfig,
89
- ): Promise<boolean> {
90
- return await deepEqual(
91
- {
92
- ...accounts,
93
- mnemonic: await accounts.mnemonic.get(),
94
- passphrase: await accounts.passphrase.get(),
95
- },
96
- DEFAULT_EDR_NETWORK_HD_ACCOUNTS_CONFIG_PARAMS,
97
- );
98
- }
99
-
100
- export const EDR_NETWORK_DEFAULT_PRIVATE_KEYS: string[] = [
101
- "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80",
102
- "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d",
103
- "0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a",
104
- "0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6",
105
- "0x47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a",
106
- "0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba",
107
- "0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e",
108
- "0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356",
109
- "0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97",
110
- "0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6",
111
- "0xf214f2b2cd398c806f84e317254e0f0b801d0643303237d97a22a48e01628897",
112
- "0x701b615bbdfb9de65240bc28bd21bbc0d996645a3dd57e7b12bc2bdf6f192c82",
113
- "0xa267530f49f8280200edf313ee7af6b827f2a8bce2897751d06a843f644967b1",
114
- "0x47c99abed3324a2707c28affff1267e45918ec8c3f20b8aa892e8b065d2942dd",
115
- "0xc526ee95bf44d8fc405a158bb884d9d1238d99f0612e9f33d006bb0789009aaa",
116
- "0x8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61",
117
- "0xea6c44ac03bff858b476bba40716402b03e41b8e97e276d1baec7c37d42484a0",
118
- "0x689af8efa8c651a91ad287602527f3af2fe9f6501a7ac4b061667b5a93e037fd",
119
- "0xde9be858da4a475276426320d5e9262ecfc3ba460bfac56360bfa6c4c28b4ee0",
120
- "0xdf57089febbacf7ba0bc227dafbffa9fc08a93fdc68e1e42411a14efcf23656e",
121
- ];
122
-
123
64
  interface EdrProviderConfig {
124
65
  chainDescriptors: ChainDescriptorsConfig;
125
66
  networkConfig: RequireField<EdrNetworkConfig, "chainType">;
@@ -1,12 +1,6 @@
1
1
  import type { ChainType } from "../../../../../types/network.js";
2
2
 
3
- import { l1HardforkLatest, opLatestHardfork } from "@nomicfoundation/edr";
4
-
5
3
  import { OPTIMISM_CHAIN_TYPE } from "../../../../constants.js";
6
- import {
7
- edrL1HardforkToHardhatL1HardforkName,
8
- edrOpHardforkToHardhatOpHardforkName,
9
- } from "../utils/convert-to-edr.js";
10
4
 
11
5
  export enum L1HardforkName {
12
6
  FRONTIER = "chainstart",
@@ -51,9 +45,9 @@ export function getHardforks(chainType: ChainType): string[] {
51
45
  }
52
46
 
53
47
  export function getCurrentHardfork(chainType: ChainType): string {
54
- return chainType === OPTIMISM_CHAIN_TYPE
55
- ? edrOpHardforkToHardhatOpHardforkName(opLatestHardfork())
56
- : edrL1HardforkToHardhatL1HardforkName(l1HardforkLatest());
48
+ const order =
49
+ chainType === OPTIMISM_CHAIN_TYPE ? OP_HARDFORK_ORDER : L1_HARDFORK_ORDER;
50
+ return order[order.length - 1];
57
51
  }
58
52
 
59
53
  /**
@@ -61,7 +61,7 @@ import {
61
61
  DEFAULT_EDR_NETWORK_BALANCE,
62
62
  EDR_NETWORK_DEFAULT_PRIVATE_KEYS,
63
63
  isDefaultEdrNetworkHDAccountsConfig,
64
- } from "../edr-provider.js";
64
+ } from "../edr-constants.js";
65
65
  import { L1HardforkName, OpHardforkName } from "../types/hardfork.js";
66
66
 
67
67
  import { getL1HardforkName, getOpHardforkName } from "./hardfork.js";
@@ -17,7 +17,7 @@ import chalk from "chalk";
17
17
  let microEthSigner: typeof MicroEthSignerT | undefined;
18
18
 
19
19
  import { sendErrorTelemetry } from "../../cli/telemetry/error-reporter/reporter.js";
20
- import { isDefaultEdrNetworkHDAccountsConfig } from "../network-manager/edr/edr-provider.js";
20
+ import { isDefaultEdrNetworkHDAccountsConfig } from "../network-manager/edr/edr-constants.js";
21
21
  import { normalizeEdrNetworkAccountsConfig } from "../network-manager/edr/utils/convert-to-edr.js";
22
22
 
23
23
  export async function formatEdrNetworkConfigAccounts(
@@ -49,6 +49,7 @@ import {
49
49
  writeJsonFile,
50
50
  writeJsonFileAsStream,
51
51
  writeUtf8File,
52
+ readdirOrEmpty,
52
53
  } from "@nomicfoundation/hardhat-utils/fs";
53
54
  import { shortenPath } from "@nomicfoundation/hardhat-utils/path";
54
55
  import { createSpinner } from "@nomicfoundation/hardhat-utils/spinner";
@@ -176,23 +177,15 @@ export class SolidityBuildSystemImplementation implements SolidityBuildSystem {
176
177
  options: { scope?: BuildScope } = {},
177
178
  ): Promise<string[]> {
178
179
  const scope = options.scope ?? "contracts";
179
- const unified = !this.#options.solidityConfig.splitTestsCompilation;
180
180
 
181
181
  this.#ensureSplitCompilationModeIfTestsScope(scope);
182
182
 
183
+ const unified = !this.#options.solidityConfig.splitTestsCompilation;
184
+ const { localContractFiles, sourceTestFiles } =
185
+ await this.#getSoliditySourcesRootFilePaths();
186
+
183
187
  switch (scope) {
184
188
  case "contracts": {
185
- const localContractFiles = (
186
- await Promise.all(
187
- this.#options.soliditySourcesPaths.map((dir) =>
188
- getAllFilesMatching(
189
- dir,
190
- (f) => f.endsWith(".sol") && !f.endsWith(".t.sol"),
191
- ),
192
- ),
193
- )
194
- ).flat(1);
195
-
196
189
  const npmFilesToBuild =
197
190
  this.#options.solidityConfig.npmFilesToBuild.map(
198
191
  npmModuleToNpmRootPath,
@@ -204,18 +197,12 @@ export class SolidityBuildSystemImplementation implements SolidityBuildSystem {
204
197
 
205
198
  // In unified mode, contracts scope returns all roots: contracts,
206
199
  // tests, and npm files.
207
- const testFiles = (
208
- await Promise.all([
209
- getAllFilesMatching(this.#options.solidityTestsPath, (f) =>
210
- f.endsWith(".sol"),
211
- ),
212
- ...this.#options.soliditySourcesPaths.map(async (dir) => {
213
- return await getAllFilesMatching(dir, (f) =>
214
- f.endsWith(".t.sol"),
215
- );
216
- }),
217
- ])
218
- ).flat(1);
200
+ const testFiles = [
201
+ ...(await getAllFilesMatching(this.#options.solidityTestsPath, (f) =>
202
+ f.endsWith(".sol"),
203
+ )),
204
+ ...sourceTestFiles,
205
+ ];
219
206
 
220
207
  // Remove duplicates in case there is an intersection between
221
208
  // the tests.solidity paths and the sources paths
@@ -224,18 +211,12 @@ export class SolidityBuildSystemImplementation implements SolidityBuildSystem {
224
211
  );
225
212
  }
226
213
  case "tests": {
227
- let rootFilePaths = (
228
- await Promise.all([
229
- getAllFilesMatching(this.#options.solidityTestsPath, (f) =>
230
- f.endsWith(".sol"),
231
- ),
232
- ...this.#options.soliditySourcesPaths.map(async (dir) => {
233
- return await getAllFilesMatching(dir, (f) =>
234
- f.endsWith(".t.sol"),
235
- );
236
- }),
237
- ])
238
- ).flat(1);
214
+ let rootFilePaths = [
215
+ ...(await getAllFilesMatching(this.#options.solidityTestsPath, (f) =>
216
+ f.endsWith(".sol"),
217
+ )),
218
+ ...sourceTestFiles,
219
+ ];
239
220
 
240
221
  // NOTE: We remove duplicates in case there is an intersection between
241
222
  // the tests.solidity paths and the sources paths
@@ -245,6 +226,46 @@ export class SolidityBuildSystemImplementation implements SolidityBuildSystem {
245
226
  }
246
227
  }
247
228
 
229
+ /**
230
+ * Returns all the root files from the different solidity source dirs in the
231
+ * config, partitioned into contract files and test files according to their
232
+ * extensions.
233
+ */
234
+ async #getSoliditySourcesRootFilePaths(): Promise<{
235
+ localContractFiles: string[];
236
+ sourceTestFiles: string[];
237
+ }> {
238
+ const sourceFileGroups = await Promise.all(
239
+ this.#options.soliditySourcesPaths.map(async (dir) => {
240
+ const localSolidityFiles = await getAllFilesMatching(dir, (f) =>
241
+ f.endsWith(".sol"),
242
+ );
243
+
244
+ const localContractFiles: string[] = [];
245
+ const sourceTestFiles: string[] = [];
246
+
247
+ for (const file of localSolidityFiles) {
248
+ if (file.endsWith(".t.sol")) {
249
+ sourceTestFiles.push(file);
250
+ } else {
251
+ localContractFiles.push(file);
252
+ }
253
+ }
254
+
255
+ return { localContractFiles, sourceTestFiles };
256
+ }),
257
+ );
258
+
259
+ return {
260
+ localContractFiles: sourceFileGroups.flatMap(
261
+ ({ localContractFiles }) => localContractFiles,
262
+ ),
263
+ sourceTestFiles: sourceFileGroups.flatMap(
264
+ ({ sourceTestFiles }) => sourceTestFiles,
265
+ ),
266
+ };
267
+ }
268
+
248
269
  public isSuccessfulBuildResult(
249
270
  buildResult: CompilationJobCreationError | Map<string, FileBuildResult>,
250
271
  ): buildResult is Map<string, FileBuildResult> {
@@ -1102,18 +1123,23 @@ export class SolidityBuildSystemImplementation implements SolidityBuildSystem {
1102
1123
  reachableBuildInfoIds.filter((id) => id !== undefined),
1103
1124
  );
1104
1125
 
1105
- // Get all the reachable build info files
1106
- const buildInfoFiles = await getAllFilesMatching(buildInfosDir, (f) =>
1107
- f.startsWith(buildInfosDir + path.sep),
1108
- );
1126
+ // The build-info directory is expected to be flat: every build-info file
1127
+ // lives directly under it, so a non-recursive `readdir` is enough.
1128
+ const buildInfoFiles = await readdirOrEmpty(buildInfosDir);
1109
1129
 
1110
1130
  for (const buildInfoFile of buildInfoFiles) {
1111
- const basename = path.basename(buildInfoFile);
1131
+ let id: string | undefined;
1112
1132
 
1113
- const id = basename.substring(0, basename.indexOf("."));
1133
+ if (buildInfoFile.endsWith(".output.json")) {
1134
+ id = buildInfoFile.slice(0, -".output.json".length);
1135
+ } else if (buildInfoFile.endsWith(".json")) {
1136
+ id = buildInfoFile.slice(0, -".json".length);
1137
+ } else {
1138
+ continue;
1139
+ }
1114
1140
 
1115
1141
  if (!reachableBuildInfoIdsSet.has(id)) {
1116
- await remove(buildInfoFile);
1142
+ await remove(path.join(buildInfosDir, buildInfoFile));
1117
1143
  }
1118
1144
  }
1119
1145
 
@@ -21,7 +21,14 @@ import type {
21
21
  CompilerOutputError,
22
22
  } from "../../../../types/solidity/compiler-io.js";
23
23
  import type { SolidityBuildInfo } from "../../../../types/solidity.js";
24
- import type { SolidityBuildSystemOptions } from "../build-system/build-system.js";
24
+ import type {
25
+ SolidityBuildSystemOptions,
26
+ SolidityBuildSystemImplementation as SolidityBuildSystemImplementationT,
27
+ } from "../build-system/build-system.js";
28
+
29
+ let SolidityBuildSystemImplementation:
30
+ | typeof SolidityBuildSystemImplementationT
31
+ | undefined;
25
32
 
26
33
  class LazySolidityBuildSystem implements SolidityBuildSystem {
27
34
  readonly #hooks: HookManager;
@@ -126,9 +133,11 @@ class LazySolidityBuildSystem implements SolidityBuildSystem {
126
133
  }
127
134
 
128
135
  async #getBuildSystem(): Promise<SolidityBuildSystem> {
129
- const { SolidityBuildSystemImplementation } = await import(
130
- "../build-system/build-system.js"
131
- );
136
+ if (SolidityBuildSystemImplementation === undefined) {
137
+ const buildSystemModule = await import("../build-system/build-system.js");
138
+ SolidityBuildSystemImplementation =
139
+ buildSystemModule.SolidityBuildSystemImplementation;
140
+ }
132
141
 
133
142
  if (this.#buildSystem === undefined) {
134
143
  this.#buildSystem = new SolidityBuildSystemImplementation(
@@ -27,7 +27,7 @@ import { getFullyQualifiedName } from "../../../utils/contract-names.js";
27
27
  import { errorResult, successfulResult } from "../../../utils/result.js";
28
28
  import { isSupportedChainType } from "../../edr/chain-type.js";
29
29
  import { ArtifactManagerImplementation } from "../artifacts/artifact-manager.js";
30
- import { getCoverageManager } from "../coverage/helpers.js";
30
+ import { getCoverageManager } from "../coverage/helpers/accessors.js";
31
31
  import { getGasAnalyticsManager } from "../gas-analytics/helpers/accessors.js";
32
32
  import { edrGasReportToHardhatGasMeasurements } from "../network-manager/edr/utils/convert-to-edr.js";
33
33
 
@@ -16,7 +16,7 @@ import {
16
16
  isResult,
17
17
  successfulResult,
18
18
  } from "../../../utils/result.js";
19
- import { getCoverageManager } from "../coverage/helpers.js";
19
+ import { getCoverageManager } from "../coverage/helpers/accessors.js";
20
20
  import { getGasAnalyticsManager } from "../gas-analytics/helpers/accessors.js";
21
21
 
22
22
  interface TestActionArguments {