hardhat 3.9.0 → 3.10.0

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 (224) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/dist/src/config.d.ts.map +1 -1
  3. package/dist/src/config.js +6 -5
  4. package/dist/src/config.js.map +1 -1
  5. package/dist/src/hhu.d.ts +3 -0
  6. package/dist/src/hhu.d.ts.map +1 -0
  7. package/dist/src/hhu.js +14 -0
  8. package/dist/src/hhu.js.map +1 -0
  9. package/dist/src/internal/builtin-plugins/artifacts/hook-handlers/hre.d.ts.map +1 -1
  10. package/dist/src/internal/builtin-plugins/artifacts/hook-handlers/hre.js +4 -1
  11. package/dist/src/internal/builtin-plugins/artifacts/hook-handlers/hre.js.map +1 -1
  12. package/dist/src/internal/builtin-plugins/gas-analytics/function-gas-snapshots.d.ts +2 -2
  13. package/dist/src/internal/builtin-plugins/gas-analytics/function-gas-snapshots.d.ts.map +1 -1
  14. package/dist/src/internal/builtin-plugins/gas-analytics/function-gas-snapshots.js +21 -23
  15. package/dist/src/internal/builtin-plugins/gas-analytics/function-gas-snapshots.js.map +1 -1
  16. package/dist/src/internal/builtin-plugins/gas-analytics/snapshot-cheatcodes.d.ts +2 -2
  17. package/dist/src/internal/builtin-plugins/gas-analytics/snapshot-cheatcodes.d.ts.map +1 -1
  18. package/dist/src/internal/builtin-plugins/gas-analytics/snapshot-cheatcodes.js +21 -27
  19. package/dist/src/internal/builtin-plugins/gas-analytics/snapshot-cheatcodes.js.map +1 -1
  20. package/dist/src/internal/builtin-plugins/gas-analytics/tasks/solidity-test/task-action.d.ts +3 -1
  21. package/dist/src/internal/builtin-plugins/gas-analytics/tasks/solidity-test/task-action.d.ts.map +1 -1
  22. package/dist/src/internal/builtin-plugins/gas-analytics/tasks/solidity-test/task-action.js +18 -10
  23. package/dist/src/internal/builtin-plugins/gas-analytics/tasks/solidity-test/task-action.js.map +1 -1
  24. package/dist/src/internal/builtin-plugins/hhu/index.d.ts +4 -0
  25. package/dist/src/internal/builtin-plugins/hhu/index.d.ts.map +1 -0
  26. package/dist/src/internal/builtin-plugins/hhu/index.js +9 -0
  27. package/dist/src/internal/builtin-plugins/hhu/index.js.map +1 -0
  28. package/dist/src/internal/builtin-plugins/hhu/tasks/constants/index.d.ts +3 -0
  29. package/dist/src/internal/builtin-plugins/hhu/tasks/constants/index.d.ts.map +1 -0
  30. package/dist/src/internal/builtin-plugins/hhu/tasks/constants/index.js +8 -0
  31. package/dist/src/internal/builtin-plugins/hhu/tasks/constants/index.js.map +1 -0
  32. package/dist/src/internal/builtin-plugins/hhu/tasks/constants/zero-address.d.ts +4 -0
  33. package/dist/src/internal/builtin-plugins/hhu/tasks/constants/zero-address.d.ts.map +1 -0
  34. package/dist/src/internal/builtin-plugins/hhu/tasks/constants/zero-address.js +6 -0
  35. package/dist/src/internal/builtin-plugins/hhu/tasks/constants/zero-address.js.map +1 -0
  36. package/dist/src/internal/builtin-plugins/hhu/tasks/convert/index.d.ts +3 -0
  37. package/dist/src/internal/builtin-plugins/hhu/tasks/convert/index.d.ts.map +1 -0
  38. package/dist/src/internal/builtin-plugins/hhu/tasks/convert/index.js +27 -0
  39. package/dist/src/internal/builtin-plugins/hhu/tasks/convert/index.js.map +1 -0
  40. package/dist/src/internal/builtin-plugins/hhu/tasks/convert/pad.d.ts +10 -0
  41. package/dist/src/internal/builtin-plugins/hhu/tasks/convert/pad.d.ts.map +1 -0
  42. package/dist/src/internal/builtin-plugins/hhu/tasks/convert/pad.js +31 -0
  43. package/dist/src/internal/builtin-plugins/hhu/tasks/convert/pad.js.map +1 -0
  44. package/dist/src/internal/builtin-plugins/hhu/tasks/fetch/block-number.d.ts +4 -0
  45. package/dist/src/internal/builtin-plugins/hhu/tasks/fetch/block-number.d.ts.map +1 -0
  46. package/dist/src/internal/builtin-plugins/hhu/tasks/fetch/block-number.js +17 -0
  47. package/dist/src/internal/builtin-plugins/hhu/tasks/fetch/block-number.js.map +1 -0
  48. package/dist/src/internal/builtin-plugins/hhu/tasks/fetch/index.d.ts +3 -0
  49. package/dist/src/internal/builtin-plugins/hhu/tasks/fetch/index.d.ts.map +1 -0
  50. package/dist/src/internal/builtin-plugins/hhu/tasks/fetch/index.js +8 -0
  51. package/dist/src/internal/builtin-plugins/hhu/tasks/fetch/index.js.map +1 -0
  52. package/dist/src/internal/builtin-plugins/hhu/tasks/index.d.ts +11 -0
  53. package/dist/src/internal/builtin-plugins/hhu/tasks/index.d.ts.map +1 -0
  54. package/dist/src/internal/builtin-plugins/hhu/tasks/index.js +20 -0
  55. package/dist/src/internal/builtin-plugins/hhu/tasks/index.js.map +1 -0
  56. package/dist/src/internal/builtin-plugins/hhu/tasks/utils-task.d.ts +13 -0
  57. package/dist/src/internal/builtin-plugins/hhu/tasks/utils-task.d.ts.map +1 -0
  58. package/dist/src/internal/builtin-plugins/hhu/tasks/utils-task.js +17 -0
  59. package/dist/src/internal/builtin-plugins/hhu/tasks/utils-task.js.map +1 -0
  60. package/dist/src/internal/builtin-plugins/hhu/types.d.ts +45 -0
  61. package/dist/src/internal/builtin-plugins/hhu/types.d.ts.map +1 -0
  62. package/dist/src/internal/builtin-plugins/hhu/types.js +2 -0
  63. package/dist/src/internal/builtin-plugins/hhu/types.js.map +1 -0
  64. package/dist/src/internal/builtin-plugins/index.d.ts.map +1 -1
  65. package/dist/src/internal/builtin-plugins/index.js +5 -0
  66. package/dist/src/internal/builtin-plugins/index.js.map +1 -1
  67. package/dist/src/internal/builtin-plugins/network-manager/accounts/derive-private-keys.js +1 -1
  68. package/dist/src/internal/builtin-plugins/network-manager/edr/edr-provider.d.ts.map +1 -1
  69. package/dist/src/internal/builtin-plugins/network-manager/edr/edr-provider.js +2 -0
  70. package/dist/src/internal/builtin-plugins/network-manager/edr/edr-provider.js.map +1 -1
  71. package/dist/src/internal/builtin-plugins/network-manager/edr/stack-traces/solidity-stack-trace.d.ts +2 -2
  72. package/dist/src/internal/builtin-plugins/network-manager/edr/stack-traces/solidity-stack-trace.d.ts.map +1 -1
  73. package/dist/src/internal/builtin-plugins/network-manager/edr/stack-traces/solidity-stack-trace.js.map +1 -1
  74. package/dist/src/internal/builtin-plugins/network-manager/edr/stack-traces/stack-trace-solidity-errors.d.ts +1 -0
  75. package/dist/src/internal/builtin-plugins/network-manager/edr/stack-traces/stack-trace-solidity-errors.d.ts.map +1 -1
  76. package/dist/src/internal/builtin-plugins/network-manager/edr/stack-traces/stack-trace-solidity-errors.js +17 -0
  77. package/dist/src/internal/builtin-plugins/network-manager/edr/stack-traces/stack-trace-solidity-errors.js.map +1 -1
  78. package/dist/src/internal/builtin-plugins/network-manager/edr/types/hardfork.d.ts +17 -1
  79. package/dist/src/internal/builtin-plugins/network-manager/edr/types/hardfork.d.ts.map +1 -1
  80. package/dist/src/internal/builtin-plugins/network-manager/edr/types/hardfork.js +19 -2
  81. package/dist/src/internal/builtin-plugins/network-manager/edr/types/hardfork.js.map +1 -1
  82. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/convert-to-edr.d.ts.map +1 -1
  83. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/convert-to-edr.js +5 -1
  84. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/convert-to-edr.js.map +1 -1
  85. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/hardfork.d.ts +8 -0
  86. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/hardfork.d.ts.map +1 -1
  87. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/hardfork.js +30 -1
  88. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/hardfork.js.map +1 -1
  89. package/dist/src/internal/builtin-plugins/network-manager/index.d.ts.map +1 -1
  90. package/dist/src/internal/builtin-plugins/network-manager/index.js +2 -10
  91. package/dist/src/internal/builtin-plugins/network-manager/index.js.map +1 -1
  92. package/dist/src/internal/builtin-plugins/network-manager/network-option.d.ts +9 -0
  93. package/dist/src/internal/builtin-plugins/network-manager/network-option.d.ts.map +1 -0
  94. package/dist/src/internal/builtin-plugins/network-manager/network-option.js +15 -0
  95. package/dist/src/internal/builtin-plugins/network-manager/network-option.js.map +1 -0
  96. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/accounts/automatic-sender-handler.d.ts +4 -2
  97. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/accounts/automatic-sender-handler.d.ts.map +1 -1
  98. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/accounts/automatic-sender-handler.js +28 -6
  99. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/accounts/automatic-sender-handler.js.map +1 -1
  100. package/dist/src/internal/builtin-plugins/node/task-action.d.ts.map +1 -1
  101. package/dist/src/internal/builtin-plugins/node/task-action.js +2 -37
  102. package/dist/src/internal/builtin-plugins/node/task-action.js.map +1 -1
  103. package/dist/src/internal/builtin-plugins/node/utils/resolve-node-connection-params.d.ts +19 -0
  104. package/dist/src/internal/builtin-plugins/node/utils/resolve-node-connection-params.d.ts.map +1 -0
  105. package/dist/src/internal/builtin-plugins/node/utils/resolve-node-connection-params.js +47 -0
  106. package/dist/src/internal/builtin-plugins/node/utils/resolve-node-connection-params.js.map +1 -0
  107. package/dist/src/internal/builtin-plugins/solidity/build-system/build-system.d.ts.map +1 -1
  108. package/dist/src/internal/builtin-plugins/solidity/build-system/build-system.js +34 -7
  109. package/dist/src/internal/builtin-plugins/solidity/build-system/build-system.js.map +1 -1
  110. package/dist/src/internal/builtin-plugins/solidity-test/config.d.ts +1 -0
  111. package/dist/src/internal/builtin-plugins/solidity-test/config.d.ts.map +1 -1
  112. package/dist/src/internal/builtin-plugins/solidity-test/config.js +32 -9
  113. package/dist/src/internal/builtin-plugins/solidity-test/config.js.map +1 -1
  114. package/dist/src/internal/builtin-plugins/solidity-test/eip712/canonicalize.d.ts +9 -3
  115. package/dist/src/internal/builtin-plugins/solidity-test/eip712/canonicalize.d.ts.map +1 -1
  116. package/dist/src/internal/builtin-plugins/solidity-test/eip712/canonicalize.js +60 -27
  117. package/dist/src/internal/builtin-plugins/solidity-test/eip712/canonicalize.js.map +1 -1
  118. package/dist/src/internal/builtin-plugins/solidity-test/eip712/index.d.ts +1 -1
  119. package/dist/src/internal/builtin-plugins/solidity-test/eip712/index.d.ts.map +1 -1
  120. package/dist/src/internal/builtin-plugins/solidity-test/eip712/index.js +19 -10
  121. package/dist/src/internal/builtin-plugins/solidity-test/eip712/index.js.map +1 -1
  122. package/dist/src/internal/builtin-plugins/solidity-test/helpers.d.ts.map +1 -1
  123. package/dist/src/internal/builtin-plugins/solidity-test/helpers.js +4 -1
  124. package/dist/src/internal/builtin-plugins/solidity-test/helpers.js.map +1 -1
  125. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/index.d.ts +1 -1
  126. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/index.d.ts.map +1 -1
  127. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/index.js +13 -5
  128. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/index.js.map +1 -1
  129. package/dist/src/internal/builtin-plugins/solidity-test/stack-trace-solidity-errors.d.ts.map +1 -1
  130. package/dist/src/internal/builtin-plugins/solidity-test/stack-trace-solidity-errors.js +3 -1
  131. package/dist/src/internal/builtin-plugins/solidity-test/stack-trace-solidity-errors.js.map +1 -1
  132. package/dist/src/internal/builtin-plugins/solidity-test/task-action.js +2 -2
  133. package/dist/src/internal/builtin-plugins/solidity-test/task-action.js.map +1 -1
  134. package/dist/src/internal/builtin-plugins/solidity-test/type-extensions.d.ts +6 -0
  135. package/dist/src/internal/builtin-plugins/solidity-test/type-extensions.d.ts.map +1 -1
  136. package/dist/src/internal/cli/help/get-global-help-string.d.ts +3 -1
  137. package/dist/src/internal/cli/help/get-global-help-string.d.ts.map +1 -1
  138. package/dist/src/internal/cli/help/get-global-help-string.js +3 -3
  139. package/dist/src/internal/cli/help/get-global-help-string.js.map +1 -1
  140. package/dist/src/internal/cli/help/get-help-string.d.ts +3 -1
  141. package/dist/src/internal/cli/help/get-help-string.d.ts.map +1 -1
  142. package/dist/src/internal/cli/help/get-help-string.js +4 -4
  143. package/dist/src/internal/cli/help/get-help-string.js.map +1 -1
  144. package/dist/src/internal/cli/help/utils.d.ts +3 -1
  145. package/dist/src/internal/cli/help/utils.d.ts.map +1 -1
  146. package/dist/src/internal/cli/help/utils.js +2 -2
  147. package/dist/src/internal/cli/help/utils.js.map +1 -1
  148. package/dist/src/internal/cli/hhu.d.ts +14 -0
  149. package/dist/src/internal/cli/hhu.d.ts.map +1 -0
  150. package/dist/src/internal/cli/hhu.js +184 -0
  151. package/dist/src/internal/cli/hhu.js.map +1 -0
  152. package/dist/src/internal/cli/main.d.ts +0 -25
  153. package/dist/src/internal/cli/main.d.ts.map +1 -1
  154. package/dist/src/internal/cli/main.js +23 -303
  155. package/dist/src/internal/cli/main.js.map +1 -1
  156. package/dist/src/internal/cli/parser.d.ts +25 -0
  157. package/dist/src/internal/cli/parser.d.ts.map +1 -0
  158. package/dist/src/internal/cli/parser.js +282 -0
  159. package/dist/src/internal/cli/parser.js.map +1 -0
  160. package/dist/src/internal/cli/telemetry/analytics/analytics.d.ts +1 -1
  161. package/dist/src/internal/cli/telemetry/analytics/analytics.d.ts.map +1 -1
  162. package/dist/src/internal/cli/telemetry/analytics/analytics.js +2 -1
  163. package/dist/src/internal/cli/telemetry/analytics/analytics.js.map +1 -1
  164. package/dist/src/internal/cli/telemetry/analytics/types.d.ts +1 -0
  165. package/dist/src/internal/cli/telemetry/analytics/types.d.ts.map +1 -1
  166. package/dist/src/internal/using-hardhat2-plugin-errors.d.ts +2 -2
  167. package/dist/src/internal/using-hardhat2-plugin-errors.d.ts.map +1 -1
  168. package/dist/src/internal/using-hardhat2-plugin-errors.js +7 -3
  169. package/dist/src/internal/using-hardhat2-plugin-errors.js.map +1 -1
  170. package/dist/src/plugins.d.ts.map +1 -1
  171. package/dist/src/plugins.js +3 -2
  172. package/dist/src/plugins.js.map +1 -1
  173. package/package.json +4 -4
  174. package/src/config.ts +17 -5
  175. package/src/hhu.ts +18 -0
  176. package/src/internal/builtin-plugins/artifacts/hook-handlers/hre.ts +11 -3
  177. package/src/internal/builtin-plugins/gas-analytics/function-gas-snapshots.ts +32 -32
  178. package/src/internal/builtin-plugins/gas-analytics/snapshot-cheatcodes.ts +32 -36
  179. package/src/internal/builtin-plugins/gas-analytics/tasks/solidity-test/task-action.ts +22 -9
  180. package/src/internal/builtin-plugins/hhu/index.ts +13 -0
  181. package/src/internal/builtin-plugins/hhu/tasks/constants/index.ts +18 -0
  182. package/src/internal/builtin-plugins/hhu/tasks/constants/zero-address.ts +9 -0
  183. package/src/internal/builtin-plugins/hhu/tasks/convert/index.ts +40 -0
  184. package/src/internal/builtin-plugins/hhu/tasks/convert/pad.ts +61 -0
  185. package/src/internal/builtin-plugins/hhu/tasks/fetch/block-number.ts +28 -0
  186. package/src/internal/builtin-plugins/hhu/tasks/fetch/index.ts +18 -0
  187. package/src/internal/builtin-plugins/hhu/tasks/index.ts +36 -0
  188. package/src/internal/builtin-plugins/hhu/tasks/utils-task.ts +29 -0
  189. package/src/internal/builtin-plugins/hhu/types.ts +57 -0
  190. package/src/internal/builtin-plugins/index.ts +6 -0
  191. package/src/internal/builtin-plugins/network-manager/accounts/derive-private-keys.ts +1 -1
  192. package/src/internal/builtin-plugins/network-manager/edr/edr-provider.ts +3 -0
  193. package/src/internal/builtin-plugins/network-manager/edr/stack-traces/solidity-stack-trace.ts +1 -1
  194. package/src/internal/builtin-plugins/network-manager/edr/stack-traces/stack-trace-solidity-errors.ts +33 -0
  195. package/src/internal/builtin-plugins/network-manager/edr/types/hardfork.ts +20 -3
  196. package/src/internal/builtin-plugins/network-manager/edr/utils/convert-to-edr.ts +5 -0
  197. package/src/internal/builtin-plugins/network-manager/edr/utils/hardfork.ts +53 -1
  198. package/src/internal/builtin-plugins/network-manager/index.ts +3 -10
  199. package/src/internal/builtin-plugins/network-manager/network-option.ts +17 -0
  200. package/src/internal/builtin-plugins/network-manager/request-handlers/handlers/accounts/automatic-sender-handler.ts +39 -9
  201. package/src/internal/builtin-plugins/node/task-action.ts +2 -52
  202. package/src/internal/builtin-plugins/node/utils/resolve-node-connection-params.ts +79 -0
  203. package/src/internal/builtin-plugins/solidity/build-system/build-system.ts +51 -8
  204. package/src/internal/builtin-plugins/solidity-test/config.ts +53 -9
  205. package/src/internal/builtin-plugins/solidity-test/eip712/canonicalize.ts +64 -25
  206. package/src/internal/builtin-plugins/solidity-test/eip712/index.ts +23 -13
  207. package/src/internal/builtin-plugins/solidity-test/helpers.ts +5 -1
  208. package/src/internal/builtin-plugins/solidity-test/inline-config/index.ts +20 -9
  209. package/src/internal/builtin-plugins/solidity-test/stack-trace-solidity-errors.ts +6 -1
  210. package/src/internal/builtin-plugins/solidity-test/task-action.ts +2 -2
  211. package/src/internal/builtin-plugins/solidity-test/type-extensions.ts +6 -0
  212. package/src/internal/cli/help/get-global-help-string.ts +3 -2
  213. package/src/internal/cli/help/get-help-string.ts +4 -3
  214. package/src/internal/cli/help/utils.ts +2 -1
  215. package/src/internal/cli/hhu.ts +298 -0
  216. package/src/internal/cli/main.ts +41 -495
  217. package/src/internal/cli/parser.ts +472 -0
  218. package/src/internal/cli/telemetry/analytics/analytics.ts +5 -1
  219. package/src/internal/cli/telemetry/analytics/types.ts +3 -0
  220. package/src/internal/using-hardhat2-plugin-errors.ts +12 -3
  221. package/src/plugins.ts +5 -2
  222. package/templates/hardhat-3/01-node-test-runner-viem/package.json +6 -6
  223. package/templates/hardhat-3/02-mocha-ethers/package.json +9 -9
  224. package/templates/hardhat-3/03-minimal/package.json +1 -1
@@ -0,0 +1,298 @@
1
+ import type { GlobalOptionDefinitions } from "../../types/global-options.js";
2
+ import type { HardhatRuntimeEnvironment } from "../../types/hre.js";
3
+ import type { Task, TaskDefinition } from "../../types/tasks.js";
4
+ import type { FakeHhuHardhatRuntimeEnvironment } from "../builtin-plugins/hhu/types.js";
5
+
6
+ import {
7
+ assertHardhatInvariant,
8
+ HardhatError,
9
+ } from "@nomicfoundation/hardhat-errors";
10
+ import { isCi } from "@nomicfoundation/hardhat-utils/ci";
11
+ import { createDebug } from "@nomicfoundation/hardhat-utils/debug";
12
+ import { setGlobalOptionsAsEnvVariables } from "@nomicfoundation/hardhat-utils/env";
13
+ import { ensureError } from "@nomicfoundation/hardhat-utils/error";
14
+
15
+ import { isResult } from "../../utils/result.js";
16
+ import { generateTasks } from "../builtin-plugins/hhu/tasks/index.js";
17
+ import { NETWORK_GLOBAL_OPTION } from "../builtin-plugins/network-manager/network-option.js";
18
+ import { globalFlag } from "../core/config.js";
19
+ import { TaskManagerImplementation } from "../core/tasks/task-manager.js";
20
+ import { getHardhatVersion } from "../utils/package.js";
21
+
22
+ import { printErrorMessages } from "./error-handler.js";
23
+ import { getGlobalHelpString } from "./help/get-global-help-string.js";
24
+ import { getHelpString } from "./help/get-help-string.js";
25
+ import {
26
+ parseGlobalOptions,
27
+ parseRawArguments,
28
+ parseTask,
29
+ parseTaskArguments,
30
+ } from "./parser.js";
31
+ import { sendTaskAnalytics } from "./telemetry/analytics/analytics.js";
32
+ import { setupGlobalUnhandledErrorHandlers } from "./telemetry/error-reporter/global-error-handlers.js";
33
+ import { sendErrorTelemetry } from "./telemetry/error-reporter/reporter.js";
34
+
35
+ interface MainOptions {
36
+ print?: (message: string) => void;
37
+ rethrowErrors?: true;
38
+ }
39
+
40
+ export async function main(
41
+ rawArguments: string[],
42
+ options: MainOptions = {},
43
+ ): Promise<void> {
44
+ // We set up the global unhandled errors before running any functionality
45
+ setupGlobalUnhandledErrorHandlers();
46
+
47
+ const print = options.print ?? console.log;
48
+
49
+ const log = createDebug("hardhat:core:hhu:main");
50
+
51
+ let hhuGlobalOptions;
52
+
53
+ log("hhu started");
54
+
55
+ try {
56
+ const cliArguments = parseRawArguments(rawArguments);
57
+
58
+ const usedCliArguments: boolean[] = new Array(cliArguments.length).fill(
59
+ false,
60
+ );
61
+
62
+ hhuGlobalOptions = await parseHhuGlobalOptions(
63
+ cliArguments,
64
+ usedCliArguments,
65
+ );
66
+
67
+ // We forward `network` as an env variable so it's available when we lazily
68
+ // import the real HRE in utils that need it. We explicitly whitelist it
69
+ // (rather than forwarding every hhu global option) so that hhu-only options
70
+ // never leak into the real HRE's global-option namespace.
71
+ setGlobalOptionsAsEnvVariables({ network: hhuGlobalOptions.network });
72
+
73
+ log("Parsed hhu global options");
74
+
75
+ if (hhuGlobalOptions.version) {
76
+ return await printHhuVersionMessage(print);
77
+ }
78
+
79
+ const globalOptionDefinitions: GlobalOptionDefinitions = new Map(
80
+ HHU_GLOBAL_OPTIONS_DEFINITIONS,
81
+ );
82
+
83
+ const rootTasks = taskDefinitionsToTasksMap(
84
+ generateTasks({ prefixWithUtils: false }),
85
+ );
86
+
87
+ const taskOrId = parseTask(cliArguments, usedCliArguments, rootTasks);
88
+
89
+ if (Array.isArray(taskOrId)) {
90
+ if (taskOrId.length === 0) {
91
+ const globalHelp = await getGlobalHelpString(
92
+ rootTasks,
93
+ globalOptionDefinitions,
94
+ { command: "hhu" },
95
+ );
96
+
97
+ print(globalHelp);
98
+ return;
99
+ }
100
+
101
+ throw new HardhatError(
102
+ HardhatError.ERRORS.CORE.TASK_DEFINITIONS.TASK_NOT_FOUND,
103
+ { task: taskOrId.join(" ") },
104
+ );
105
+ }
106
+
107
+ const task = taskOrId;
108
+
109
+ if (task.isEmpty && usedCliArguments.includes(false)) {
110
+ const invalidSubtask = cliArguments[usedCliArguments.indexOf(false)];
111
+
112
+ throw new HardhatError(
113
+ HardhatError.ERRORS.CORE.TASK_DEFINITIONS.UNRECOGNIZED_SUBTASK,
114
+ {
115
+ task: task.id.join(" "),
116
+ invalidSubtask,
117
+ },
118
+ );
119
+ }
120
+
121
+ if (hhuGlobalOptions.help || task.isEmpty) {
122
+ const taskHelp = await getHelpString(task, globalOptionDefinitions, {
123
+ command: "hhu",
124
+ });
125
+
126
+ print(taskHelp);
127
+ return;
128
+ }
129
+
130
+ const taskArguments = parseTaskArguments(
131
+ cliArguments,
132
+ usedCliArguments,
133
+ task,
134
+ );
135
+
136
+ log(`Running task "${task.id.join(" ")}"`);
137
+
138
+ const [taskResult] = await Promise.all([
139
+ task.run(taskArguments),
140
+ sendTaskAnalytics(task.id, "hhu"),
141
+ ]);
142
+
143
+ if (isResult(taskResult) && !taskResult.success) {
144
+ process.exitCode = 1;
145
+ }
146
+ } catch (error) {
147
+ ensureError(error);
148
+ await printErrorMessages(error, hhuGlobalOptions?.showStackTraces);
149
+
150
+ try {
151
+ await sendErrorTelemetry(error);
152
+ } catch (e) {
153
+ log("Couldn't report error to sentry: %O", e);
154
+ }
155
+
156
+ if (options.rethrowErrors) {
157
+ throw error;
158
+ }
159
+
160
+ process.exitCode = 1;
161
+ }
162
+ }
163
+
164
+ const HHU_GLOBAL_OPTIONS_DEFINITIONS: GlobalOptionDefinitions = new Map([
165
+ [
166
+ "help",
167
+ {
168
+ pluginId: "builtin",
169
+ option: globalFlag({
170
+ name: "help",
171
+ shortName: "h",
172
+ description:
173
+ "Show this message, or a task's help if its name is provided.",
174
+ }),
175
+ },
176
+ ],
177
+ [
178
+ "showStackTraces",
179
+ {
180
+ pluginId: "builtin",
181
+ option: globalFlag({
182
+ name: "showStackTraces",
183
+ description: "Show stack traces (always enabled on CI servers).",
184
+ }),
185
+ },
186
+ ],
187
+ [
188
+ "version",
189
+ {
190
+ pluginId: "builtin",
191
+ option: globalFlag({
192
+ name: "version",
193
+ description: "Show the version of hhu.",
194
+ }),
195
+ },
196
+ ],
197
+ [
198
+ "network",
199
+ {
200
+ pluginId: "builtin",
201
+ option: NETWORK_GLOBAL_OPTION,
202
+ },
203
+ ],
204
+ ]);
205
+
206
+ export async function parseHhuGlobalOptions(
207
+ cliArguments: string[],
208
+ usedCliArguments: boolean[],
209
+ ): Promise<{
210
+ help: boolean;
211
+ showStackTraces: boolean;
212
+ version: boolean;
213
+ network: string | undefined;
214
+ }> {
215
+ const hhuGlobalOptions = await parseGlobalOptions(
216
+ HHU_GLOBAL_OPTIONS_DEFINITIONS,
217
+ cliArguments,
218
+ usedCliArguments,
219
+ );
220
+
221
+ return {
222
+ help: hhuGlobalOptions.help ?? false,
223
+ showStackTraces: hhuGlobalOptions.showStackTraces ?? isCi(),
224
+ version: hhuGlobalOptions.version ?? false,
225
+ network: hhuGlobalOptions.network,
226
+ };
227
+ }
228
+
229
+ export async function printHhuVersionMessage(
230
+ print: (message: string) => void = console.log,
231
+ ): Promise<void> {
232
+ print(await getHardhatVersion());
233
+ }
234
+
235
+ function makeStrictProxy<T extends object>(
236
+ name: string,
237
+ object: Partial<T>,
238
+ ): T {
239
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- inaccessible properties will throw an assertion error
240
+ return new Proxy(object as T, {
241
+ get(target, property) {
242
+ assertHardhatInvariant(
243
+ Object.hasOwn(object, property),
244
+ `Unexpected access of property "${String(property)}" in ${name}.`,
245
+ );
246
+
247
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- we know this is safe because of the assertion above
248
+ return target[property as keyof T];
249
+ },
250
+ });
251
+ }
252
+
253
+ function taskDefinitionsToTasksMap(tasks: TaskDefinition[]): Map<string, Task> {
254
+ // To be able to parse the hhu arguments, we need to create a tasks map from
255
+ // the task definitions. The easiest way to do that is by using
256
+ // `TaskManagerImplementation`, but this needs an HRE and we don't want to
257
+ // create one just for this. So we use a fake HRE that has the minimum
258
+ // properties needed.
259
+ //
260
+ // The exception is `network.create`: utils that need a network get the real
261
+ // implementation, which lazily loads Hardhat (and thus creates the project's
262
+ // HRE) only when such a util actually runs.
263
+ //
264
+ // One downside of this approach is that we _won't_ get a compilation error
265
+ // if `TaskManagerImplementation` tries to access a property that doesn't exist in the
266
+ // fake HRE, but tests should catch that.
267
+ //
268
+ // The `satisfies FakeHhuHardhatRuntimeEnvironment` keeps this fake HRE in sync
269
+ // with the surface utils actions rely on.
270
+ const fakeHre = makeStrictProxy<HardhatRuntimeEnvironment>(
271
+ "hhu's proxied HRE",
272
+ {
273
+ config: makeStrictProxy<HardhatRuntimeEnvironment["config"]>(
274
+ "hhu's proxied config",
275
+ {
276
+ tasks,
277
+ plugins: [],
278
+ },
279
+ ),
280
+ network: makeStrictProxy<HardhatRuntimeEnvironment["network"]>(
281
+ "hhu's proxied network",
282
+ {
283
+ create: async (networkOrParams) => {
284
+ const hre = await import("../../index.js");
285
+ return await hre.network.create(networkOrParams);
286
+ },
287
+ },
288
+ ),
289
+ } satisfies FakeHhuHardhatRuntimeEnvironment,
290
+ );
291
+
292
+ const taskManager = new TaskManagerImplementation(
293
+ fakeHre,
294
+ new Map(HHU_GLOBAL_OPTIONS_DEFINITIONS),
295
+ );
296
+
297
+ return taskManager.rootTasks;
298
+ }