hardhat 2.13.0-dev.2 → 2.13.0-dev.3

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 (292) hide show
  1. package/builtin-tasks/compile.js +16 -6
  2. package/builtin-tasks/compile.js.map +1 -1
  3. package/builtin-tasks/flatten.js +1 -1
  4. package/builtin-tasks/flatten.js.map +1 -1
  5. package/builtin-tasks/help.js +2 -4
  6. package/builtin-tasks/help.js.map +1 -1
  7. package/builtin-tasks/task-names.d.ts +1 -0
  8. package/builtin-tasks/task-names.d.ts.map +1 -1
  9. package/builtin-tasks/task-names.js +3 -2
  10. package/builtin-tasks/task-names.js.map +1 -1
  11. package/builtin-tasks/test.js +22 -1
  12. package/builtin-tasks/test.js.map +1 -1
  13. package/internal/cli/bootstrap.d.ts +1 -0
  14. package/internal/cli/bootstrap.js +12 -20
  15. package/internal/cli/bootstrap.js.map +1 -1
  16. package/internal/cli/cli.d.ts +0 -1
  17. package/internal/cli/cli.d.ts.map +1 -1
  18. package/internal/cli/cli.js +20 -29
  19. package/internal/cli/cli.js.map +1 -1
  20. package/internal/cli/project-creation.d.ts +1 -2
  21. package/internal/cli/project-creation.d.ts.map +1 -1
  22. package/internal/cli/project-creation.js +105 -36
  23. package/internal/cli/project-creation.js.map +1 -1
  24. package/internal/cli/prompt.d.ts +2 -2
  25. package/internal/cli/prompt.d.ts.map +1 -1
  26. package/internal/cli/prompt.js +1 -2
  27. package/internal/cli/prompt.js.map +1 -1
  28. package/internal/cli/types.d.ts +1 -0
  29. package/internal/cli/types.d.ts.map +1 -1
  30. package/internal/core/config/config-env.d.ts +5 -11
  31. package/internal/core/config/config-env.d.ts.map +1 -1
  32. package/internal/core/config/config-env.js +2 -13
  33. package/internal/core/config/config-env.js.map +1 -1
  34. package/internal/core/config/config-loading.d.ts +2 -1
  35. package/internal/core/config/config-loading.d.ts.map +1 -1
  36. package/internal/core/config/config-loading.js +25 -7
  37. package/internal/core/config/config-loading.js.map +1 -1
  38. package/internal/core/config/config-validation.d.ts +2 -0
  39. package/internal/core/config/config-validation.d.ts.map +1 -1
  40. package/internal/core/config/config-validation.js +18 -1
  41. package/internal/core/config/config-validation.js.map +1 -1
  42. package/internal/core/config/extenders.d.ts +4 -7
  43. package/internal/core/config/extenders.d.ts.map +1 -1
  44. package/internal/core/config/extenders.js +5 -12
  45. package/internal/core/config/extenders.js.map +1 -1
  46. package/internal/core/errors-list.d.ts +28 -7
  47. package/internal/core/errors-list.d.ts.map +1 -1
  48. package/internal/core/errors-list.js +33 -10
  49. package/internal/core/errors-list.js.map +1 -1
  50. package/internal/core/jsonrpc/types/input/blockTag.d.ts +3 -3
  51. package/internal/core/jsonrpc/types/input/blockTag.d.ts.map +1 -1
  52. package/internal/core/project-structure.d.ts.map +1 -1
  53. package/internal/core/project-structure.js +6 -0
  54. package/internal/core/project-structure.js.map +1 -1
  55. package/internal/core/providers/construction.d.ts.map +1 -1
  56. package/internal/core/providers/construction.js +25 -5
  57. package/internal/core/providers/construction.js.map +1 -1
  58. package/internal/core/providers/http.d.ts +2 -2
  59. package/internal/core/providers/http.d.ts.map +1 -1
  60. package/internal/core/providers/http.js +41 -19
  61. package/internal/core/providers/http.js.map +1 -1
  62. package/internal/core/runtime-environment.d.ts +4 -2
  63. package/internal/core/runtime-environment.d.ts.map +1 -1
  64. package/internal/core/runtime-environment.js +39 -47
  65. package/internal/core/runtime-environment.js.map +1 -1
  66. package/internal/core/tasks/dsl.d.ts +6 -6
  67. package/internal/core/tasks/dsl.d.ts.map +1 -1
  68. package/internal/core/tasks/dsl.js.map +1 -1
  69. package/internal/core/tasks/task-definitions.d.ts +2 -2
  70. package/internal/core/tasks/task-definitions.d.ts.map +1 -1
  71. package/internal/core/tasks/task-definitions.js.map +1 -1
  72. package/internal/hardhat-network/jsonrpc/handler.d.ts +1 -0
  73. package/internal/hardhat-network/jsonrpc/handler.d.ts.map +1 -1
  74. package/internal/hardhat-network/jsonrpc/handler.js +13 -18
  75. package/internal/hardhat-network/jsonrpc/handler.js.map +1 -1
  76. package/internal/hardhat-network/provider/RethnetState.d.ts +26 -0
  77. package/internal/hardhat-network/provider/RethnetState.d.ts.map +1 -0
  78. package/internal/hardhat-network/provider/RethnetState.js +84 -0
  79. package/internal/hardhat-network/provider/RethnetState.js.map +1 -0
  80. package/internal/hardhat-network/provider/modules/evm.d.ts +2 -1
  81. package/internal/hardhat-network/provider/modules/evm.d.ts.map +1 -1
  82. package/internal/hardhat-network/provider/modules/evm.js +10 -4
  83. package/internal/hardhat-network/provider/modules/evm.js.map +1 -1
  84. package/internal/hardhat-network/provider/node-types.d.ts +1 -1
  85. package/internal/hardhat-network/provider/node-types.d.ts.map +1 -1
  86. package/internal/hardhat-network/provider/node.d.ts +1 -0
  87. package/internal/hardhat-network/provider/node.d.ts.map +1 -1
  88. package/internal/hardhat-network/provider/node.js +6 -4
  89. package/internal/hardhat-network/provider/node.js.map +1 -1
  90. package/internal/hardhat-network/provider/provider.d.ts +25 -21
  91. package/internal/hardhat-network/provider/provider.d.ts.map +1 -1
  92. package/internal/hardhat-network/provider/provider.js +25 -42
  93. package/internal/hardhat-network/provider/provider.js.map +1 -1
  94. package/internal/hardhat-network/provider/return-data.js +2 -2
  95. package/internal/hardhat-network/provider/return-data.js.map +1 -1
  96. package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.d.ts.map +1 -1
  97. package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.js +4 -2
  98. package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.js.map +1 -1
  99. package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.d.ts.map +1 -1
  100. package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.js +4 -2
  101. package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.js.map +1 -1
  102. package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.d.ts.map +1 -1
  103. package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.js +4 -2
  104. package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.js.map +1 -1
  105. package/internal/hardhat-network/provider/utils/bloom.d.ts +32 -0
  106. package/internal/hardhat-network/provider/utils/bloom.d.ts.map +1 -0
  107. package/internal/hardhat-network/provider/utils/bloom.js +79 -0
  108. package/internal/hardhat-network/provider/utils/bloom.js.map +1 -0
  109. package/internal/hardhat-network/provider/utils/convertToRethnet.d.ts +12 -0
  110. package/internal/hardhat-network/provider/utils/convertToRethnet.d.ts.map +1 -0
  111. package/internal/hardhat-network/provider/utils/convertToRethnet.js +162 -0
  112. package/internal/hardhat-network/provider/utils/convertToRethnet.js.map +1 -0
  113. package/internal/hardhat-network/provider/utils/makeFakeSignature.d.ts +7 -0
  114. package/internal/hardhat-network/provider/utils/makeFakeSignature.d.ts.map +1 -0
  115. package/internal/hardhat-network/provider/utils/makeFakeSignature.js +31 -0
  116. package/internal/hardhat-network/provider/utils/makeFakeSignature.js.map +1 -0
  117. package/internal/hardhat-network/provider/utils/putGenesisBlock.d.ts +1 -1
  118. package/internal/hardhat-network/provider/utils/putGenesisBlock.d.ts.map +1 -1
  119. package/internal/hardhat-network/provider/utils/putGenesisBlock.js +2 -2
  120. package/internal/hardhat-network/provider/utils/putGenesisBlock.js.map +1 -1
  121. package/internal/hardhat-network/provider/vm/block-builder.d.ts +31 -0
  122. package/internal/hardhat-network/provider/vm/block-builder.d.ts.map +1 -0
  123. package/internal/hardhat-network/provider/vm/block-builder.js +151 -0
  124. package/internal/hardhat-network/provider/vm/block-builder.js.map +1 -0
  125. package/internal/hardhat-network/provider/vm/creation.d.ts +10 -0
  126. package/internal/hardhat-network/provider/vm/creation.d.ts.map +1 -0
  127. package/internal/hardhat-network/provider/vm/creation.js +29 -0
  128. package/internal/hardhat-network/provider/vm/creation.js.map +1 -0
  129. package/internal/hardhat-network/provider/vm/dual.d.ts +43 -0
  130. package/internal/hardhat-network/provider/vm/dual.d.ts.map +1 -0
  131. package/internal/hardhat-network/provider/vm/dual.js +488 -0
  132. package/internal/hardhat-network/provider/vm/dual.js.map +1 -0
  133. package/internal/hardhat-network/provider/vm/ethereumjs.d.ts +56 -0
  134. package/internal/hardhat-network/provider/vm/ethereumjs.d.ts.map +1 -0
  135. package/internal/hardhat-network/provider/vm/ethereumjs.js +416 -0
  136. package/internal/hardhat-network/provider/vm/ethereumjs.js.map +1 -0
  137. package/internal/hardhat-network/provider/vm/exit.d.ts +23 -0
  138. package/internal/hardhat-network/provider/vm/exit.d.ts.map +1 -0
  139. package/internal/hardhat-network/provider/vm/exit.js +130 -0
  140. package/internal/hardhat-network/provider/vm/exit.js.map +1 -0
  141. package/internal/hardhat-network/provider/vm/rethnet.d.ts +99 -0
  142. package/internal/hardhat-network/provider/vm/rethnet.d.ts.map +1 -0
  143. package/internal/hardhat-network/provider/vm/rethnet.js +284 -0
  144. package/internal/hardhat-network/provider/vm/rethnet.js.map +1 -0
  145. package/internal/hardhat-network/provider/vm/vm-adapter.d.ts +52 -0
  146. package/internal/hardhat-network/provider/vm/vm-adapter.d.ts.map +1 -0
  147. package/internal/hardhat-network/provider/vm/vm-adapter.js +3 -0
  148. package/internal/hardhat-network/provider/vm/vm-adapter.js.map +1 -0
  149. package/internal/hardhat-network/stack-traces/compiler-to-model.d.ts.map +1 -1
  150. package/internal/hardhat-network/stack-traces/compiler-to-model.js +37 -11
  151. package/internal/hardhat-network/stack-traces/compiler-to-model.js.map +1 -1
  152. package/internal/hardhat-network/stack-traces/consoleLogger.js.map +1 -1
  153. package/internal/hardhat-network/stack-traces/constants.d.ts +1 -1
  154. package/internal/hardhat-network/stack-traces/constants.js +1 -1
  155. package/internal/hardhat-network/stack-traces/debug.d.ts.map +1 -1
  156. package/internal/hardhat-network/stack-traces/debug.js +6 -2
  157. package/internal/hardhat-network/stack-traces/debug.js.map +1 -1
  158. package/internal/hardhat-network/stack-traces/error-inferrer.d.ts +1 -0
  159. package/internal/hardhat-network/stack-traces/error-inferrer.d.ts.map +1 -1
  160. package/internal/hardhat-network/stack-traces/error-inferrer.js +85 -55
  161. package/internal/hardhat-network/stack-traces/error-inferrer.js.map +1 -1
  162. package/internal/hardhat-network/stack-traces/model.d.ts +3 -1
  163. package/internal/hardhat-network/stack-traces/model.d.ts.map +1 -1
  164. package/internal/hardhat-network/stack-traces/model.js +9 -1
  165. package/internal/hardhat-network/stack-traces/model.js.map +1 -1
  166. package/internal/hardhat-network/stack-traces/solidity-errors.js +2 -2
  167. package/internal/hardhat-network/stack-traces/solidity-errors.js.map +1 -1
  168. package/internal/hardhat-network/stack-traces/solidity-stack-trace.d.ts +2 -2
  169. package/internal/hardhat-network/stack-traces/solidity-stack-trace.d.ts.map +1 -1
  170. package/internal/hardhat-network/stack-traces/solidityTracer.d.ts.map +1 -1
  171. package/internal/hardhat-network/stack-traces/solidityTracer.js +1 -0
  172. package/internal/hardhat-network/stack-traces/solidityTracer.js.map +1 -1
  173. package/internal/lib/hardhat-lib.d.ts.map +1 -1
  174. package/internal/lib/hardhat-lib.js +1 -4
  175. package/internal/lib/hardhat-lib.js.map +1 -1
  176. package/internal/solidity/compiler/downloader.js +2 -2
  177. package/internal/solidity/compiler/downloader.js.map +1 -1
  178. package/internal/solidity/compiler/index.js +1 -1
  179. package/internal/solidity/compiler/index.js.map +1 -1
  180. package/internal/solidity/resolver.d.ts +4 -3
  181. package/internal/solidity/resolver.d.ts.map +1 -1
  182. package/internal/solidity/resolver.js +18 -7
  183. package/internal/solidity/resolver.js.map +1 -1
  184. package/internal/util/abi-helpers.d.ts +1 -0
  185. package/internal/util/abi-helpers.d.ts.map +1 -1
  186. package/internal/util/abi-helpers.js +9 -0
  187. package/internal/util/abi-helpers.js.map +1 -1
  188. package/internal/util/download.d.ts.map +1 -1
  189. package/internal/util/download.js +12 -11
  190. package/internal/util/download.js.map +1 -1
  191. package/internal/util/packageInfo.d.ts +6 -1
  192. package/internal/util/packageInfo.d.ts.map +1 -1
  193. package/internal/util/packageInfo.js +14 -11
  194. package/internal/util/packageInfo.js.map +1 -1
  195. package/internal/util/proxy.d.ts +2 -0
  196. package/internal/util/proxy.d.ts.map +1 -0
  197. package/internal/util/proxy.js +19 -0
  198. package/internal/util/proxy.js.map +1 -0
  199. package/package.json +9 -10
  200. package/register.js +1 -4
  201. package/register.js.map +1 -1
  202. package/sample-projects/javascript/hardhat.config.js +1 -1
  203. package/sample-projects/javascript/scripts/deploy.js +2 -2
  204. package/sample-projects/javascript-esm/LICENSE.md +11 -0
  205. package/sample-projects/javascript-esm/README.md +13 -0
  206. package/sample-projects/javascript-esm/contracts/Lock.sol +34 -0
  207. package/sample-projects/javascript-esm/hardhat.config.cjs +6 -0
  208. package/sample-projects/javascript-esm/scripts/deploy.js +22 -0
  209. package/sample-projects/javascript-esm/test/Lock.js +123 -0
  210. package/sample-projects/typescript/hardhat.config.ts +1 -1
  211. package/sample-projects/typescript/scripts/deploy.ts +2 -2
  212. package/sample-projects/typescript/tsconfig.json +2 -1
  213. package/src/builtin-tasks/compile.ts +28 -7
  214. package/src/builtin-tasks/flatten.ts +4 -1
  215. package/src/builtin-tasks/help.ts +15 -16
  216. package/src/builtin-tasks/task-names.ts +2 -0
  217. package/src/builtin-tasks/test.ts +30 -2
  218. package/src/internal/artifacts.ts +947 -0
  219. package/src/internal/cli/bootstrap.ts +14 -36
  220. package/src/internal/cli/cli.ts +38 -43
  221. package/src/internal/cli/project-creation.ts +128 -47
  222. package/src/internal/cli/prompt.ts +2 -4
  223. package/src/internal/cli/types.ts +2 -0
  224. package/src/internal/core/config/config-env.ts +15 -27
  225. package/src/internal/core/config/config-loading.ts +35 -11
  226. package/src/internal/core/config/config-validation.ts +20 -0
  227. package/src/internal/core/config/extenders.ts +6 -15
  228. package/src/internal/core/errors-list.ts +36 -10
  229. package/src/internal/core/project-structure.ts +8 -0
  230. package/src/internal/core/providers/construction.ts +29 -24
  231. package/src/internal/core/providers/http.ts +38 -26
  232. package/src/internal/core/runtime-environment.ts +65 -60
  233. package/src/internal/core/tasks/dsl.ts +17 -17
  234. package/src/internal/core/tasks/task-definitions.ts +6 -2
  235. package/src/internal/hardhat-network/jsonrpc/handler.ts +31 -28
  236. package/src/internal/hardhat-network/provider/modules/evm.ts +15 -3
  237. package/src/internal/hardhat-network/provider/node-types.ts +1 -1
  238. package/src/internal/hardhat-network/provider/node.ts +5 -1
  239. package/src/internal/hardhat-network/provider/provider.ts +60 -49
  240. package/src/internal/hardhat-network/provider/return-data.ts +2 -2
  241. package/src/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.ts +5 -2
  242. package/src/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.ts +5 -2
  243. package/src/internal/hardhat-network/provider/transactions/FakeSenderTransaction.ts +5 -2
  244. package/src/internal/hardhat-network/provider/utils/makeFakeSignature.ts +46 -0
  245. package/src/internal/hardhat-network/provider/utils/putGenesisBlock.ts +2 -2
  246. package/src/internal/hardhat-network/stack-traces/compiler-to-model.ts +71 -9
  247. package/src/internal/hardhat-network/stack-traces/consoleLogger.ts +1 -1
  248. package/src/internal/hardhat-network/stack-traces/constants.ts +1 -1
  249. package/src/internal/hardhat-network/stack-traces/debug.ts +9 -2
  250. package/src/internal/hardhat-network/stack-traces/error-inferrer.ts +177 -89
  251. package/src/internal/hardhat-network/stack-traces/model.ts +11 -1
  252. package/src/internal/hardhat-network/stack-traces/solidity-errors.ts +2 -2
  253. package/src/internal/hardhat-network/stack-traces/solidity-stack-trace.ts +2 -2
  254. package/src/internal/hardhat-network/stack-traces/solidityTracer.ts +3 -0
  255. package/src/internal/lib/hardhat-lib.ts +1 -6
  256. package/src/internal/solidity/compiler/downloader.ts +2 -2
  257. package/src/internal/solidity/compiler/index.ts +1 -1
  258. package/src/internal/solidity/resolver.ts +28 -11
  259. package/src/internal/util/abi-helpers.ts +9 -0
  260. package/src/internal/util/download.ts +13 -15
  261. package/src/internal/util/packageInfo.ts +24 -10
  262. package/src/internal/util/proxy.ts +18 -0
  263. package/src/register.ts +1 -6
  264. package/src/types/artifacts.ts +14 -112
  265. package/src/types/config.ts +2 -0
  266. package/src/types/runtime.ts +16 -13
  267. package/types/artifacts.d.ts +10 -96
  268. package/types/artifacts.d.ts.map +1 -1
  269. package/types/config.d.ts +2 -0
  270. package/types/config.d.ts.map +1 -1
  271. package/types/runtime.d.ts +9 -10
  272. package/types/runtime.d.ts.map +1 -1
  273. package/internal/artifacts/caching.d.ts +0 -28
  274. package/internal/artifacts/caching.d.ts.map +0 -1
  275. package/internal/artifacts/caching.js +0 -178
  276. package/internal/artifacts/caching.js.map +0 -1
  277. package/internal/artifacts/index.d.ts +0 -45
  278. package/internal/artifacts/index.d.ts.map +0 -1
  279. package/internal/artifacts/index.js +0 -191
  280. package/internal/artifacts/index.js.map +0 -1
  281. package/internal/artifacts/mutable.d.ts +0 -29
  282. package/internal/artifacts/mutable.d.ts.map +0 -1
  283. package/internal/artifacts/mutable.js +0 -226
  284. package/internal/artifacts/mutable.js.map +0 -1
  285. package/internal/artifacts/readonly.d.ts +0 -94
  286. package/internal/artifacts/readonly.d.ts.map +0 -1
  287. package/internal/artifacts/readonly.js +0 -343
  288. package/internal/artifacts/readonly.js.map +0 -1
  289. package/src/internal/artifacts/caching.ts +0 -259
  290. package/src/internal/artifacts/index.ts +0 -302
  291. package/src/internal/artifacts/mutable.ts +0 -330
  292. package/src/internal/artifacts/readonly.ts +0 -470
@@ -2,7 +2,6 @@ import debug from "debug";
2
2
 
3
3
  import {
4
4
  Artifacts as IArtifacts,
5
- ArtifactsSource,
6
5
  EnvironmentExtender,
7
6
  ExperimentalHardhatNetworkMessageTraceHook,
8
7
  HardhatArguments,
@@ -13,6 +12,7 @@ import {
13
12
  ParamDefinition,
14
13
  RunSuperFunction,
15
14
  RunTaskFunction,
15
+ SubtaskArguments,
16
16
  TaskArguments,
17
17
  TaskDefinition,
18
18
  TasksMap,
@@ -21,6 +21,7 @@ import { Artifacts } from "../artifacts";
21
21
  import { MessageTrace } from "../hardhat-network/stack-traces/message-trace";
22
22
  import { lazyObject } from "../util/lazy";
23
23
 
24
+ import { getHardhatVersion } from "../util/packageInfo";
24
25
  import { analyzeModuleNotFoundError } from "./config/config-loading";
25
26
  import { HardhatError } from "./errors";
26
27
  import { ERRORS } from "./errors-list";
@@ -51,6 +52,8 @@ export class Environment implements HardhatRuntimeEnvironment {
51
52
 
52
53
  public entryTaskProfile?: TaskProfile;
53
54
 
55
+ public version: string = getHardhatVersion();
56
+
54
57
  /**
55
58
  * Initializes the Hardhat Runtime Environment and the given
56
59
  * extender functions.
@@ -68,7 +71,6 @@ export class Environment implements HardhatRuntimeEnvironment {
68
71
  public readonly hardhatArguments: HardhatArguments,
69
72
  public readonly tasks: TasksMap,
70
73
  extenders: EnvironmentExtender[] = [],
71
- artifactsExtensions: ArtifactsSource[] = [],
72
74
  experimentalHardhatNetworkMessageTraceHooks: ExperimentalHardhatNetworkMessageTraceHook[] = [],
73
75
  public readonly userConfig: HardhatUserConfig = {}
74
76
  ) {
@@ -87,7 +89,7 @@ export class Environment implements HardhatRuntimeEnvironment {
87
89
  });
88
90
  }
89
91
 
90
- this.artifacts = new Artifacts(config.paths.artifacts, artifactsExtensions);
92
+ this.artifacts = new Artifacts(config.paths.artifacts);
91
93
 
92
94
  const provider = lazyObject(() => {
93
95
  log(`Creating provider for network ${networkName}`);
@@ -119,6 +121,7 @@ export class Environment implements HardhatRuntimeEnvironment {
119
121
  *
120
122
  * @param name The task's name.
121
123
  * @param taskArguments A map of task's arguments.
124
+ * @param subtaskArguments A map of subtasks to their arguments.
122
125
  *
123
126
  * @throws a HH303 if there aren't any defined tasks with the given name.
124
127
  * @returns a promise with the task's execution result.
@@ -126,6 +129,7 @@ export class Environment implements HardhatRuntimeEnvironment {
126
129
  public readonly run: RunTaskFunction = async (
127
130
  name,
128
131
  taskArguments = {},
132
+ subtaskArguments = {},
129
133
  callerTaskProfile?: TaskProfile
130
134
  ) => {
131
135
  const taskDefinition = this.tasks[name];
@@ -140,7 +144,8 @@ export class Environment implements HardhatRuntimeEnvironment {
140
144
 
141
145
  const resolvedTaskArguments = this._resolveValidTaskArguments(
142
146
  taskDefinition,
143
- taskArguments
147
+ taskArguments,
148
+ subtaskArguments
144
149
  );
145
150
 
146
151
  let taskProfile: TaskProfile | undefined;
@@ -158,6 +163,7 @@ export class Environment implements HardhatRuntimeEnvironment {
158
163
  return await this._runTaskDefinition(
159
164
  taskDefinition,
160
165
  resolvedTaskArguments,
166
+ subtaskArguments,
161
167
  taskProfile
162
168
  );
163
169
  } catch (e) {
@@ -217,20 +223,23 @@ export class Environment implements HardhatRuntimeEnvironment {
217
223
  private async _runTaskDefinition(
218
224
  taskDefinition: TaskDefinition,
219
225
  taskArguments: TaskArguments,
226
+ subtaskArguments: SubtaskArguments,
220
227
  taskProfile?: TaskProfile
221
228
  ): Promise<any> {
222
229
  let runSuperFunction: any;
223
230
 
224
231
  if (taskDefinition instanceof OverriddenTaskDefinition) {
225
232
  runSuperFunction = async (
226
- _taskArguments: TaskArguments = taskArguments
233
+ _taskArguments: TaskArguments = taskArguments,
234
+ _subtaskArguments: SubtaskArguments = subtaskArguments
227
235
  ) => {
228
236
  log("Running %s's super", taskDefinition.name);
229
237
 
230
238
  if (taskProfile === undefined) {
231
239
  return this._runTaskDefinition(
232
240
  taskDefinition.parentTaskDefinition,
233
- _taskArguments
241
+ _taskArguments,
242
+ _subtaskArguments
234
243
  );
235
244
  }
236
245
 
@@ -241,6 +250,7 @@ export class Environment implements HardhatRuntimeEnvironment {
241
250
  return await this._runTaskDefinition(
242
251
  taskDefinition.parentTaskDefinition,
243
252
  _taskArguments,
253
+ _subtaskArguments,
244
254
  parentTaskProfile
245
255
  );
246
256
  } finally {
@@ -265,17 +275,30 @@ export class Environment implements HardhatRuntimeEnvironment {
265
275
  const previousRunSuper: any = globalAsAny.runSuper;
266
276
  globalAsAny.runSuper = runSuper;
267
277
 
268
- let modifiedHreWithParentTaskProfile: any | undefined;
278
+ // We create a modified version of `this`, as we want to keep track of the
279
+ // `subtaskArguments` and `taskProfile` through `run` invocations. This
280
+ // way we keep track of callers's data, even when tasks are run in parallel.
281
+ //
282
+ // Note that for this to work we need to set the prototype later
283
+ let modifiedHre: any = {
284
+ ...this,
285
+ run: (
286
+ _name: string,
287
+ _taskArguments: TaskArguments,
288
+ _subtaskArguments: SubtaskArguments
289
+ ) =>
290
+ (this as any).run(
291
+ _name,
292
+ _taskArguments,
293
+ { ..._subtaskArguments, ...subtaskArguments }, // parent subtask args take precedence
294
+ taskProfile
295
+ ),
296
+ };
297
+
269
298
  if (this.hardhatArguments.flamegraph === true) {
270
- // We create a modified version of `this`, as we want to keep track of the
271
- // `taskProfile` and use it as `callerTaskProfile` if the action calls
272
- // `run`, and add a few utility methods.
273
- //
274
- // Note that for this to work we need to set the prototype later
275
- modifiedHreWithParentTaskProfile = {
276
- ...this,
277
- run: (_name: string, _taskArguments: TaskArguments) =>
278
- (this as any).run(_name, _taskArguments, taskProfile),
299
+ // We modify the `this` again to add a few utility methods.
300
+ modifiedHre = {
301
+ ...modifiedHre,
279
302
  adhocProfile: async (_name: string, f: () => Promise<any>) => {
280
303
  const adhocProfile = createTaskProfile(_name);
281
304
  taskProfile!.children.push(adhocProfile);
@@ -295,21 +318,17 @@ export class Environment implements HardhatRuntimeEnvironment {
295
318
  }
296
319
  },
297
320
  };
298
-
299
- Object.setPrototypeOf(
300
- modifiedHreWithParentTaskProfile,
301
- Object.getPrototypeOf(this)
302
- );
303
321
  }
304
322
 
323
+ Object.setPrototypeOf(modifiedHre, Object.getPrototypeOf(this));
324
+
305
325
  const uninjectFromGlobal =
306
- modifiedHreWithParentTaskProfile?.injectToGlobal() ??
307
- this.injectToGlobal();
326
+ modifiedHre?.injectToGlobal() ?? this.injectToGlobal();
308
327
 
309
328
  try {
310
329
  return await taskDefinition.action(
311
330
  taskArguments,
312
- modifiedHreWithParentTaskProfile ?? this,
331
+ modifiedHre ?? this,
313
332
  runSuper
314
333
  );
315
334
  } finally {
@@ -333,9 +352,14 @@ export class Environment implements HardhatRuntimeEnvironment {
333
352
  */
334
353
  private _resolveValidTaskArguments(
335
354
  taskDefinition: TaskDefinition,
336
- taskArguments: TaskArguments
355
+ taskArguments: TaskArguments,
356
+ subtaskArguments: SubtaskArguments
337
357
  ): TaskArguments {
338
- const { paramDefinitions, positionalParamDefinitions } = taskDefinition;
358
+ const {
359
+ name: taskName,
360
+ paramDefinitions,
361
+ positionalParamDefinitions,
362
+ } = taskDefinition;
339
363
 
340
364
  const nonPositionalParamDefinitions = Object.values(paramDefinitions);
341
365
 
@@ -345,45 +369,26 @@ export class Environment implements HardhatRuntimeEnvironment {
345
369
  ...positionalParamDefinitions,
346
370
  ];
347
371
 
348
- const initResolvedArguments: {
349
- errors: HardhatError[];
350
- values: TaskArguments;
351
- } = { errors: [], values: {} };
372
+ const resolvedArguments: TaskArguments = {};
352
373
 
353
- const resolvedArguments = allTaskParamDefinitions.reduce(
354
- ({ errors, values }, paramDefinition) => {
355
- try {
356
- const paramName = paramDefinition.name;
357
- const argumentValue = taskArguments[paramName];
358
- const resolvedArgumentValue = this._resolveArgument(
359
- paramDefinition,
360
- argumentValue,
361
- taskDefinition.name
362
- );
363
- if (resolvedArgumentValue !== undefined) {
364
- values[paramName] = resolvedArgumentValue;
365
- }
366
- } catch (error) {
367
- if (HardhatError.isHardhatError(error)) {
368
- errors.push(error);
369
- }
370
- }
371
- return { errors, values };
372
- },
373
- initResolvedArguments
374
- );
374
+ for (const paramDefinition of allTaskParamDefinitions) {
375
+ const paramName = paramDefinition.name;
376
+ const argumentValue =
377
+ subtaskArguments[taskName]?.[paramName] ?? taskArguments[paramName];
375
378
 
376
- const { errors: resolveErrors, values: resolvedValues } = resolvedArguments;
379
+ const resolvedArgumentValue = this._resolveArgument(
380
+ paramDefinition,
381
+ argumentValue,
382
+ taskDefinition.name
383
+ );
377
384
 
378
- // if has argument errors, throw the first one
379
- if (resolveErrors.length > 0) {
380
- throw resolveErrors[0];
385
+ if (resolvedArgumentValue !== undefined) {
386
+ resolvedArguments[paramName] = resolvedArgumentValue;
387
+ }
381
388
  }
382
389
 
383
- // append the rest of arguments that where not in the task param definitions
384
- const resolvedTaskArguments = { ...taskArguments, ...resolvedValues };
385
-
386
- return resolvedTaskArguments;
390
+ // We keep the args in taskArguments that were not resolved
391
+ return { ...taskArguments, ...resolvedArguments };
387
392
  }
388
393
 
389
394
  /**
@@ -29,10 +29,10 @@ export class TasksDSL {
29
29
  * @param action The task's action.
30
30
  * @returns A task definition.
31
31
  */
32
- public task<ArgsT extends TaskArguments>(
32
+ public task<TaskArgumentsT extends TaskArguments>(
33
33
  name: string,
34
34
  description?: string,
35
- action?: ActionType<ArgsT>
35
+ action?: ActionType<TaskArgumentsT>
36
36
  ): TaskDefinition;
37
37
 
38
38
  /**
@@ -46,15 +46,15 @@ export class TasksDSL {
46
46
  *
47
47
  * @returns A task definition.
48
48
  */
49
- public task<ArgsT extends TaskArguments>(
49
+ public task<TaskArgumentsT extends TaskArguments>(
50
50
  name: string,
51
- action: ActionType<ArgsT>
51
+ action: ActionType<TaskArgumentsT>
52
52
  ): TaskDefinition;
53
53
 
54
- public task<ArgsT extends TaskArguments>(
54
+ public task<TaskArgumentsT extends TaskArguments>(
55
55
  name: string,
56
- descriptionOrAction?: string | ActionType<ArgsT>,
57
- action?: ActionType<ArgsT>
56
+ descriptionOrAction?: string | ActionType<TaskArgumentsT>,
57
+ action?: ActionType<TaskArgumentsT>
58
58
  ): TaskDefinition {
59
59
  return this._addTask(name, descriptionOrAction, action, false);
60
60
  }
@@ -70,10 +70,10 @@ export class TasksDSL {
70
70
  * @param action The task's action.
71
71
  * @returns A task definition.
72
72
  */
73
- public subtask<ArgsT extends TaskArguments>(
73
+ public subtask<TaskArgumentsT extends TaskArguments>(
74
74
  name: string,
75
75
  description?: string,
76
- action?: ActionType<ArgsT>
76
+ action?: ActionType<TaskArgumentsT>
77
77
  ): TaskDefinition;
78
78
 
79
79
  /**
@@ -87,14 +87,14 @@ export class TasksDSL {
87
87
  * @param action The task's action.
88
88
  * @returns A task definition.
89
89
  */
90
- public subtask<ArgsT extends TaskArguments>(
90
+ public subtask<TaskArgumentsT extends TaskArguments>(
91
91
  name: string,
92
- action: ActionType<ArgsT>
92
+ action: ActionType<TaskArgumentsT>
93
93
  ): TaskDefinition;
94
- public subtask<ArgsT extends TaskArguments>(
94
+ public subtask<TaskArgumentsT extends TaskArguments>(
95
95
  name: string,
96
- descriptionOrAction?: string | ActionType<ArgsT>,
97
- action?: ActionType<ArgsT>
96
+ descriptionOrAction?: string | ActionType<TaskArgumentsT>,
97
+ action?: ActionType<TaskArgumentsT>
98
98
  ): TaskDefinition {
99
99
  return this._addTask(name, descriptionOrAction, action, true);
100
100
  }
@@ -108,10 +108,10 @@ export class TasksDSL {
108
108
  return this._tasks;
109
109
  }
110
110
 
111
- private _addTask<ArgT extends TaskArguments>(
111
+ private _addTask<TaskArgumentsT extends TaskArguments>(
112
112
  name: string,
113
- descriptionOrAction?: string | ActionType<ArgT>,
114
- action?: ActionType<ArgT>,
113
+ descriptionOrAction?: string | ActionType<TaskArgumentsT>,
114
+ action?: ActionType<TaskArgumentsT>,
115
115
  isSubtask?: boolean
116
116
  ) {
117
117
  const parentTaskDefinition = this._tasks[name];
@@ -73,7 +73,9 @@ export class SimpleTaskDefinition implements TaskDefinition {
73
73
  * Sets the task's action.
74
74
  * @param action The action.
75
75
  */
76
- public setAction<ArgsT extends TaskArguments>(action: ActionType<ArgsT>) {
76
+ public setAction<TaskArgumentsT extends TaskArguments>(
77
+ action: ActionType<TaskArgumentsT>
78
+ ) {
77
79
  // TODO: There's probably something bad here. See types.ts for more info.
78
80
  this.action = action;
79
81
  return this;
@@ -569,7 +571,9 @@ export class OverriddenTaskDefinition implements TaskDefinition {
569
571
  * Overrides the parent task's action.
570
572
  * @param action the action.
571
573
  */
572
- public setAction<ArgsT extends TaskArguments>(action: ActionType<ArgsT>) {
574
+ public setAction<TaskArgumentsT extends TaskArguments>(
575
+ action: ActionType<TaskArgumentsT>
576
+ ) {
573
577
  // TODO: There's probably something bad here. See types.ts for more info.
574
578
  this._action = action;
575
579
  return this;
@@ -82,40 +82,23 @@ export class JsonRpcHandler {
82
82
  this._provider.addListener("notification", listener);
83
83
 
84
84
  ws.on("message", async (msg) => {
85
- let rpcReq: JsonRpcRequest | undefined;
86
- let rpcResp: JsonRpcResponse | undefined;
85
+ let rpcReq: JsonRpcRequest | JsonRpcRequest[];
86
+ let rpcResp: JsonRpcResponse | JsonRpcResponse[];
87
87
 
88
88
  try {
89
89
  rpcReq = _readWsRequest(msg as string);
90
90
 
91
- if (!isValidJsonRequest(rpcReq)) {
92
- throw new InvalidRequestError("Invalid request");
93
- }
94
-
95
- rpcResp = await this._handleRequest(rpcReq);
96
-
97
- // If eth_subscribe was successful, keep track of the subscription id,
98
- // so we can cleanup on websocket close.
99
- if (
100
- rpcReq.method === "eth_subscribe" &&
101
- isSuccessfulJsonResponse(rpcResp)
102
- ) {
103
- subscriptions.push(rpcResp.result);
104
- }
91
+ rpcResp = Array.isArray(rpcReq)
92
+ ? await Promise.all(
93
+ rpcReq.map((req) =>
94
+ this._handleSingleWsRequest(req, subscriptions)
95
+ )
96
+ )
97
+ : await this._handleSingleWsRequest(rpcReq, subscriptions);
105
98
  } catch (error) {
106
99
  rpcResp = _handleError(error);
107
100
  }
108
101
 
109
- // Validate the RPC response.
110
- if (!isValidJsonResponse(rpcResp)) {
111
- // Malformed response coming from the provider, report to user as an internal error.
112
- rpcResp = _handleError(new InternalError("Internal error"));
113
- }
114
-
115
- if (rpcReq !== undefined) {
116
- rpcResp.id = rpcReq.id;
117
- }
118
-
119
102
  ws.send(JSON.stringify(rpcResp));
120
103
  });
121
104
 
@@ -155,7 +138,9 @@ export class JsonRpcHandler {
155
138
  res.end(JSON.stringify(rpcResp));
156
139
  }
157
140
 
158
- private async _handleSingleRequest(req: any): Promise<JsonRpcResponse> {
141
+ private async _handleSingleRequest(
142
+ req: JsonRpcRequest
143
+ ): Promise<JsonRpcResponse> {
159
144
  if (!isValidJsonRequest(req)) {
160
145
  return _handleError(new InvalidRequestError("Invalid request"));
161
146
  }
@@ -182,6 +167,24 @@ export class JsonRpcHandler {
182
167
  return rpcResp;
183
168
  }
184
169
 
170
+ private async _handleSingleWsRequest(
171
+ rpcReq: JsonRpcRequest,
172
+ subscriptions: string[]
173
+ ) {
174
+ const rpcResp = await this._handleSingleRequest(rpcReq);
175
+
176
+ // If eth_subscribe was successful, keep track of the subscription id,
177
+ // so we can cleanup on websocket close.
178
+ if (
179
+ rpcReq.method === "eth_subscribe" &&
180
+ isSuccessfulJsonResponse(rpcResp)
181
+ ) {
182
+ subscriptions.push(rpcResp.result);
183
+ }
184
+
185
+ return rpcResp;
186
+ }
187
+
185
188
  private _handleRequest = async (
186
189
  req: JsonRpcRequest
187
190
  ): Promise<JsonRpcResponse> => {
@@ -218,7 +221,7 @@ const _readJsonHttpRequest = async (req: IncomingMessage): Promise<any> => {
218
221
  return json;
219
222
  };
220
223
 
221
- const _readWsRequest = (msg: string): JsonRpcRequest => {
224
+ const _readWsRequest = (msg: string): JsonRpcRequest | JsonRpcRequest[] => {
222
225
  let json: any;
223
226
  try {
224
227
  json = JSON.parse(msg);
@@ -32,6 +32,7 @@ export class EvmModule {
32
32
  private readonly _node: HardhatNode,
33
33
  private readonly _miningTimer: MiningTimer,
34
34
  private readonly _logger: ModulesLogger,
35
+ private readonly _allowBlocksWithSameTimestamp: boolean,
35
36
  private readonly _experimentalHardhatNetworkMessageTraceHooks: BoundExperimentalHardhatNetworkMessageTraceHook[] = []
36
37
  ) {}
37
38
 
@@ -86,12 +87,23 @@ export class EvmModule {
86
87
  const latestBlock = await this._node.getLatestBlock();
87
88
  const increment = BigInt(timestamp) - latestBlock.header.timestamp;
88
89
 
89
- if (increment <= 0n) {
90
+ if (increment < 0n) {
90
91
  throw new InvalidInputError(
91
- `Timestamp ${timestamp.toString()} is lower than or equal to previous block's timestamp` +
92
- ` ${latestBlock.header.timestamp}`
92
+ `Timestamp ${timestamp.toString()} is lower than the previous block's timestamp ${
93
+ latestBlock.header.timestamp
94
+ }`
93
95
  );
94
96
  }
97
+
98
+ if (!this._allowBlocksWithSameTimestamp && increment === 0n) {
99
+ throw new InvalidInputError(
100
+ `Timestamp ${timestamp.toString()} is equal to the previous block's timestamp.
101
+
102
+ Enable the "allowBlocksWithSameTimestamp" option in the Hardhat network configuration to allow this.
103
+ `
104
+ );
105
+ }
106
+
95
107
  this._node.setNextBlockTimestamp(BigInt(timestamp));
96
108
  return timestamp.toString();
97
109
  }
@@ -24,7 +24,6 @@ interface CommonConfig {
24
24
  hardfork: string;
25
25
  minGasPrice: bigint;
26
26
  networkId: number;
27
- networkName: string;
28
27
  allowUnlimitedContractSize?: boolean;
29
28
  initialDate?: Date;
30
29
  tracingConfig?: TracingConfig;
@@ -32,6 +31,7 @@ interface CommonConfig {
32
31
  mempoolOrder: MempoolOrder;
33
32
  coinbase: string;
34
33
  chains: HardhatNetworkChainsConfig;
34
+ allowBlocksWithSameTimestamp: boolean;
35
35
  }
36
36
 
37
37
  export type LocalNodeConfig = CommonConfig;
@@ -146,6 +146,7 @@ export class HardhatNode extends EventEmitter {
146
146
  mempoolOrder,
147
147
  networkId,
148
148
  chainId,
149
+ allowBlocksWithSameTimestamp,
149
150
  } = config;
150
151
 
151
152
  let stateManager: StateManager;
@@ -293,6 +294,7 @@ export class HardhatNode extends EventEmitter {
293
294
  hardfork,
294
295
  hardforkActivations,
295
296
  mixHashGenerator,
297
+ allowBlocksWithSameTimestamp,
296
298
  tracingConfig,
297
299
  forkNetworkId,
298
300
  forkBlockNum,
@@ -378,6 +380,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
378
380
  public readonly hardfork: HardforkName,
379
381
  private readonly _hardforkActivations: HardforkHistoryConfig,
380
382
  private _mixHashGenerator: RandomBufferGenerator,
383
+ private _allowBlocksWithSameTimestamp: boolean,
381
384
  tracingConfig?: TracingConfig,
382
385
  private _forkNetworkId?: number,
383
386
  private _forkBlockNumber?: bigint,
@@ -494,7 +497,8 @@ Hardhat Network's forking functionality only works with blocks from at least spu
494
497
  const [, offsetShouldChange, newOffset] = timestampAndOffset;
495
498
 
496
499
  const needsTimestampIncrease =
497
- await this._timestampClashesWithPreviousBlockOne(blockTimestamp);
500
+ !this._allowBlocksWithSameTimestamp &&
501
+ (await this._timestampClashesWithPreviousBlockOne(blockTimestamp));
498
502
  if (needsTimestampIncrease) {
499
503
  blockTimestamp += 1n;
500
504
  }