hardhat 2.20.0 → 2.21.0-dev.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 (271) hide show
  1. package/internal/core/jsonrpc/types/input/blockTag.d.ts +3 -3
  2. package/internal/core/jsonrpc/types/input/filterRequest.d.ts +6 -6
  3. package/internal/core/providers/construction.d.ts.map +1 -1
  4. package/internal/core/providers/construction.js +28 -4
  5. package/internal/core/providers/construction.js.map +1 -1
  6. package/internal/core/providers/http.d.ts +2 -0
  7. package/internal/core/providers/http.d.ts.map +1 -1
  8. package/internal/core/providers/http.js +2 -1
  9. package/internal/core/providers/http.js.map +1 -1
  10. package/internal/core/runtime-environment.d.ts.map +1 -1
  11. package/internal/core/runtime-environment.js.map +1 -1
  12. package/internal/hardhat-network/jsonrpc/client.d.ts +0 -2
  13. package/internal/hardhat-network/jsonrpc/client.d.ts.map +1 -1
  14. package/internal/hardhat-network/jsonrpc/client.js +0 -16
  15. package/internal/hardhat-network/jsonrpc/client.js.map +1 -1
  16. package/internal/hardhat-network/jsonrpc/handler.js +9 -1
  17. package/internal/hardhat-network/jsonrpc/handler.js.map +1 -1
  18. package/internal/hardhat-network/provider/BlockchainData.d.ts +5 -5
  19. package/internal/hardhat-network/provider/BlockchainData.d.ts.map +1 -1
  20. package/internal/hardhat-network/provider/BlockchainData.js +10 -10
  21. package/internal/hardhat-network/provider/BlockchainData.js.map +1 -1
  22. package/internal/hardhat-network/provider/HardhatBlockchain.d.ts +0 -7
  23. package/internal/hardhat-network/provider/HardhatBlockchain.d.ts.map +1 -1
  24. package/internal/hardhat-network/provider/HardhatBlockchain.js +2 -14
  25. package/internal/hardhat-network/provider/HardhatBlockchain.js.map +1 -1
  26. package/internal/hardhat-network/provider/TxPool.d.ts +3 -2
  27. package/internal/hardhat-network/provider/TxPool.d.ts.map +1 -1
  28. package/internal/hardhat-network/provider/TxPool.js +16 -16
  29. package/internal/hardhat-network/provider/TxPool.js.map +1 -1
  30. package/internal/hardhat-network/provider/ethereumjs-workarounds.js +1 -1
  31. package/internal/hardhat-network/provider/ethereumjs-workarounds.js.map +1 -1
  32. package/internal/hardhat-network/provider/filter.d.ts +6 -5
  33. package/internal/hardhat-network/provider/filter.d.ts.map +1 -1
  34. package/internal/hardhat-network/provider/filter.js +2 -2
  35. package/internal/hardhat-network/provider/filter.js.map +1 -1
  36. package/internal/hardhat-network/provider/fork/ForkBlockchain.d.ts +0 -7
  37. package/internal/hardhat-network/provider/fork/ForkBlockchain.d.ts.map +1 -1
  38. package/internal/hardhat-network/provider/fork/ForkBlockchain.js +4 -21
  39. package/internal/hardhat-network/provider/fork/ForkBlockchain.js.map +1 -1
  40. package/internal/hardhat-network/provider/fork/ForkStateManager.d.ts +13 -19
  41. package/internal/hardhat-network/provider/fork/ForkStateManager.d.ts.map +1 -1
  42. package/internal/hardhat-network/provider/fork/ForkStateManager.js +61 -59
  43. package/internal/hardhat-network/provider/fork/ForkStateManager.js.map +1 -1
  44. package/internal/hardhat-network/provider/fork/rpcToBlockData.d.ts.map +1 -1
  45. package/internal/hardhat-network/provider/fork/rpcToBlockData.js +0 -3
  46. package/internal/hardhat-network/provider/fork/rpcToBlockData.js.map +1 -1
  47. package/internal/hardhat-network/provider/fork/rpcToTxData.d.ts +2 -2
  48. package/internal/hardhat-network/provider/fork/rpcToTxData.d.ts.map +1 -1
  49. package/internal/hardhat-network/provider/fork/rpcToTxData.js +1 -1
  50. package/internal/hardhat-network/provider/fork/rpcToTxData.js.map +1 -1
  51. package/internal/hardhat-network/provider/modules/base.js +4 -4
  52. package/internal/hardhat-network/provider/modules/base.js.map +1 -1
  53. package/internal/hardhat-network/provider/modules/eth.d.ts.map +1 -1
  54. package/internal/hardhat-network/provider/modules/eth.js +9 -16
  55. package/internal/hardhat-network/provider/modules/eth.js.map +1 -1
  56. package/internal/hardhat-network/provider/modules/logger.d.ts +6 -84
  57. package/internal/hardhat-network/provider/modules/logger.d.ts.map +1 -1
  58. package/internal/hardhat-network/provider/modules/logger.js +3 -530
  59. package/internal/hardhat-network/provider/modules/logger.js.map +1 -1
  60. package/internal/hardhat-network/provider/node-types.d.ts +2 -65
  61. package/internal/hardhat-network/provider/node-types.d.ts.map +1 -1
  62. package/internal/hardhat-network/provider/node-types.js +0 -5
  63. package/internal/hardhat-network/provider/node-types.js.map +1 -1
  64. package/internal/hardhat-network/provider/node.d.ts +2 -6
  65. package/internal/hardhat-network/provider/node.d.ts.map +1 -1
  66. package/internal/hardhat-network/provider/node.js +79 -148
  67. package/internal/hardhat-network/provider/node.js.map +1 -1
  68. package/internal/hardhat-network/provider/output.d.ts +0 -14
  69. package/internal/hardhat-network/provider/output.d.ts.map +1 -1
  70. package/internal/hardhat-network/provider/output.js +0 -264
  71. package/internal/hardhat-network/provider/output.js.map +1 -1
  72. package/internal/hardhat-network/provider/provider.d.ts +26 -25
  73. package/internal/hardhat-network/provider/provider.d.ts.map +1 -1
  74. package/internal/hardhat-network/provider/provider.js +342 -186
  75. package/internal/hardhat-network/provider/provider.js.map +1 -1
  76. package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.d.ts +10 -8
  77. package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.d.ts.map +1 -1
  78. package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.js +9 -9
  79. package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.js.map +1 -1
  80. package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.d.ts +10 -8
  81. package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.d.ts.map +1 -1
  82. package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.js +9 -9
  83. package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.js.map +1 -1
  84. package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.d.ts +10 -9
  85. package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.d.ts.map +1 -1
  86. package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.js +7 -6
  87. package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.js.map +1 -1
  88. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.d.ts +6 -5
  89. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.d.ts.map +1 -1
  90. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.js +1 -1
  91. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.js.map +1 -1
  92. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.d.ts +5 -4
  93. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.d.ts.map +1 -1
  94. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.js +1 -1
  95. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.js.map +1 -1
  96. package/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.d.ts +8 -7
  97. package/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.d.ts.map +1 -1
  98. package/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.js +2 -2
  99. package/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.js.map +1 -1
  100. package/internal/hardhat-network/provider/transactions/ReadOnlyValidUnknownTypeTransaction.d.ts +8 -7
  101. package/internal/hardhat-network/provider/transactions/ReadOnlyValidUnknownTypeTransaction.d.ts.map +1 -1
  102. package/internal/hardhat-network/provider/transactions/ReadOnlyValidUnknownTypeTransaction.js +2 -2
  103. package/internal/hardhat-network/provider/transactions/ReadOnlyValidUnknownTypeTransaction.js.map +1 -1
  104. package/internal/hardhat-network/provider/types/HardhatBlockchainInterface.d.ts +5 -4
  105. package/internal/hardhat-network/provider/types/HardhatBlockchainInterface.d.ts.map +1 -1
  106. package/internal/hardhat-network/provider/utils/convertToEdr.d.ts +14 -0
  107. package/internal/hardhat-network/provider/utils/convertToEdr.d.ts.map +1 -0
  108. package/internal/hardhat-network/provider/utils/convertToEdr.js +191 -0
  109. package/internal/hardhat-network/provider/utils/convertToEdr.js.map +1 -0
  110. package/internal/hardhat-network/provider/utils/getCurrentTimestamp.d.ts +0 -1
  111. package/internal/hardhat-network/provider/utils/getCurrentTimestamp.d.ts.map +1 -1
  112. package/internal/hardhat-network/provider/utils/getCurrentTimestamp.js +1 -5
  113. package/internal/hardhat-network/provider/utils/getCurrentTimestamp.js.map +1 -1
  114. package/internal/hardhat-network/provider/utils/makeCommon.d.ts +1 -1
  115. package/internal/hardhat-network/provider/utils/makeCommon.d.ts.map +1 -1
  116. package/internal/hardhat-network/provider/utils/makeCommon.js +1 -3
  117. package/internal/hardhat-network/provider/utils/makeCommon.js.map +1 -1
  118. package/internal/hardhat-network/provider/utils/makeFakeSignature.d.ts +2 -2
  119. package/internal/hardhat-network/provider/utils/makeFakeSignature.d.ts.map +1 -1
  120. package/internal/hardhat-network/provider/utils/makeFakeSignature.js +1 -15
  121. package/internal/hardhat-network/provider/utils/makeFakeSignature.js.map +1 -1
  122. package/internal/hardhat-network/provider/utils/makeForkClient.d.ts +10 -1
  123. package/internal/hardhat-network/provider/utils/makeForkClient.d.ts.map +1 -1
  124. package/internal/hardhat-network/provider/utils/makeForkClient.js +38 -18
  125. package/internal/hardhat-network/provider/utils/makeForkClient.js.map +1 -1
  126. package/internal/hardhat-network/provider/utils/makeStateTrie.js +2 -2
  127. package/internal/hardhat-network/provider/utils/makeStateTrie.js.map +1 -1
  128. package/internal/hardhat-network/provider/utils/putGenesisBlock.d.ts +3 -1
  129. package/internal/hardhat-network/provider/utils/putGenesisBlock.d.ts.map +1 -1
  130. package/internal/hardhat-network/provider/utils/putGenesisBlock.js +2 -6
  131. package/internal/hardhat-network/provider/utils/putGenesisBlock.js.map +1 -1
  132. package/internal/hardhat-network/provider/utils/random.d.ts +1 -0
  133. package/internal/hardhat-network/provider/utils/random.d.ts.map +1 -1
  134. package/internal/hardhat-network/provider/utils/random.js +7 -1
  135. package/internal/hardhat-network/provider/utils/random.js.map +1 -1
  136. package/internal/hardhat-network/provider/utils/reorgs-protection.d.ts +1 -1
  137. package/internal/hardhat-network/provider/utils/reorgs-protection.d.ts.map +1 -1
  138. package/internal/hardhat-network/provider/utils/reorgs-protection.js +5 -5
  139. package/internal/hardhat-network/provider/utils/reorgs-protection.js.map +1 -1
  140. package/internal/hardhat-network/provider/vm/exit.d.ts +22 -0
  141. package/internal/hardhat-network/provider/vm/exit.d.ts.map +1 -0
  142. package/internal/hardhat-network/provider/vm/exit.js +93 -0
  143. package/internal/hardhat-network/provider/vm/exit.js.map +1 -0
  144. package/internal/hardhat-network/provider/vm/minimal-vm.d.ts +29 -0
  145. package/internal/hardhat-network/provider/vm/minimal-vm.d.ts.map +1 -0
  146. package/internal/hardhat-network/provider/vm/minimal-vm.js +46 -0
  147. package/internal/hardhat-network/provider/vm/minimal-vm.js.map +1 -0
  148. package/internal/hardhat-network/provider/vm/proxy-vm.d.ts +36 -0
  149. package/internal/hardhat-network/provider/vm/proxy-vm.d.ts.map +1 -0
  150. package/internal/hardhat-network/provider/vm/proxy-vm.js +73 -0
  151. package/internal/hardhat-network/provider/vm/proxy-vm.js.map +1 -0
  152. package/internal/hardhat-network/provider/vm/types.d.ts +27 -0
  153. package/internal/hardhat-network/provider/vm/types.d.ts.map +1 -0
  154. package/internal/hardhat-network/provider/vm/types.js +3 -0
  155. package/internal/hardhat-network/provider/vm/types.js.map +1 -0
  156. package/internal/hardhat-network/stack-traces/consoleLogger.d.ts +6 -0
  157. package/internal/hardhat-network/stack-traces/consoleLogger.d.ts.map +1 -1
  158. package/internal/hardhat-network/stack-traces/consoleLogger.js +33 -16
  159. package/internal/hardhat-network/stack-traces/consoleLogger.js.map +1 -1
  160. package/internal/hardhat-network/stack-traces/contracts-identifier.d.ts +1 -2
  161. package/internal/hardhat-network/stack-traces/contracts-identifier.d.ts.map +1 -1
  162. package/internal/hardhat-network/stack-traces/contracts-identifier.js +6 -7
  163. package/internal/hardhat-network/stack-traces/contracts-identifier.js.map +1 -1
  164. package/internal/hardhat-network/stack-traces/debug.js +6 -6
  165. package/internal/hardhat-network/stack-traces/debug.js.map +1 -1
  166. package/internal/hardhat-network/stack-traces/error-inferrer.d.ts.map +1 -1
  167. package/internal/hardhat-network/stack-traces/error-inferrer.js +13 -7
  168. package/internal/hardhat-network/stack-traces/error-inferrer.js.map +1 -1
  169. package/internal/hardhat-network/stack-traces/message-trace.d.ts +8 -3
  170. package/internal/hardhat-network/stack-traces/message-trace.d.ts.map +1 -1
  171. package/internal/hardhat-network/stack-traces/message-trace.js +22 -1
  172. package/internal/hardhat-network/stack-traces/message-trace.js.map +1 -1
  173. package/internal/hardhat-network/stack-traces/model.d.ts +8 -0
  174. package/internal/hardhat-network/stack-traces/model.d.ts.map +1 -1
  175. package/internal/hardhat-network/stack-traces/model.js +52 -0
  176. package/internal/hardhat-network/stack-traces/model.js.map +1 -1
  177. package/internal/hardhat-network/stack-traces/opcodes.d.ts +1 -0
  178. package/internal/hardhat-network/stack-traces/opcodes.d.ts.map +1 -1
  179. package/internal/hardhat-network/stack-traces/opcodes.js +5 -1
  180. package/internal/hardhat-network/stack-traces/opcodes.js.map +1 -1
  181. package/internal/hardhat-network/stack-traces/solidity-errors.js +2 -2
  182. package/internal/hardhat-network/stack-traces/solidity-errors.js.map +1 -1
  183. package/internal/hardhat-network/stack-traces/solidityTracer.d.ts.map +1 -1
  184. package/internal/hardhat-network/stack-traces/solidityTracer.js +5 -5
  185. package/internal/hardhat-network/stack-traces/solidityTracer.js.map +1 -1
  186. package/internal/hardhat-network/stack-traces/vm-debug-tracer.d.ts.map +1 -1
  187. package/internal/hardhat-network/stack-traces/vm-debug-tracer.js +28 -34
  188. package/internal/hardhat-network/stack-traces/vm-debug-tracer.js.map +1 -1
  189. package/internal/hardhat-network/stack-traces/vm-trace-decoder.d.ts +7 -0
  190. package/internal/hardhat-network/stack-traces/vm-trace-decoder.d.ts.map +1 -1
  191. package/internal/hardhat-network/stack-traces/vm-trace-decoder.js +69 -2
  192. package/internal/hardhat-network/stack-traces/vm-trace-decoder.js.map +1 -1
  193. package/internal/hardhat-network/stack-traces/vm-tracer.d.ts +7 -12
  194. package/internal/hardhat-network/stack-traces/vm-tracer.d.ts.map +1 -1
  195. package/internal/hardhat-network/stack-traces/vm-tracer.js +46 -65
  196. package/internal/hardhat-network/stack-traces/vm-tracer.js.map +1 -1
  197. package/internal/util/date.d.ts +1 -0
  198. package/internal/util/date.d.ts.map +1 -1
  199. package/internal/util/date.js +5 -1
  200. package/internal/util/date.js.map +1 -1
  201. package/internal/util/hardforks.d.ts +2 -0
  202. package/internal/util/hardforks.d.ts.map +1 -1
  203. package/internal/util/hardforks.js +27 -1
  204. package/internal/util/hardforks.js.map +1 -1
  205. package/package.json +18 -16
  206. package/src/internal/core/providers/construction.ts +7 -9
  207. package/src/internal/core/providers/http.ts +3 -1
  208. package/src/internal/core/runtime-environment.ts +2 -1
  209. package/src/internal/hardhat-network/jsonrpc/client.ts +1 -28
  210. package/src/internal/hardhat-network/jsonrpc/handler.ts +9 -1
  211. package/src/internal/hardhat-network/provider/modules/logger.ts +6 -801
  212. package/src/internal/hardhat-network/provider/node-types.ts +2 -89
  213. package/src/internal/hardhat-network/provider/output.ts +0 -352
  214. package/src/internal/hardhat-network/provider/provider.ts +482 -263
  215. package/src/internal/hardhat-network/provider/utils/convertToEdr.ts +228 -0
  216. package/src/internal/hardhat-network/provider/utils/getCurrentTimestamp.ts +0 -4
  217. package/src/internal/hardhat-network/provider/utils/makeCommon.ts +1 -12
  218. package/src/internal/hardhat-network/provider/utils/makeForkClient.ts +63 -24
  219. package/src/internal/hardhat-network/provider/utils/random.ts +8 -1
  220. package/src/internal/hardhat-network/provider/utils/reorgs-protection.ts +5 -5
  221. package/src/internal/hardhat-network/provider/vm/exit.ts +101 -0
  222. package/src/internal/hardhat-network/provider/vm/minimal-vm.ts +101 -0
  223. package/src/internal/hardhat-network/provider/vm/types.ts +31 -0
  224. package/src/internal/hardhat-network/stack-traces/consoleLogger.ts +40 -21
  225. package/src/internal/hardhat-network/stack-traces/contracts-identifier.ts +10 -12
  226. package/src/internal/hardhat-network/stack-traces/debug.ts +6 -6
  227. package/src/internal/hardhat-network/stack-traces/error-inferrer.ts +15 -8
  228. package/src/internal/hardhat-network/stack-traces/message-trace.ts +40 -4
  229. package/src/internal/hardhat-network/stack-traces/model.ts +61 -0
  230. package/src/internal/hardhat-network/stack-traces/opcodes.ts +4 -0
  231. package/src/internal/hardhat-network/stack-traces/solidity-errors.ts +2 -2
  232. package/src/internal/hardhat-network/stack-traces/solidityTracer.ts +6 -5
  233. package/src/internal/hardhat-network/stack-traces/vm-trace-decoder.ts +113 -4
  234. package/src/internal/hardhat-network/stack-traces/vm-tracer.ts +67 -95
  235. package/src/internal/util/date.ts +4 -0
  236. package/src/internal/util/hardforks.ts +52 -0
  237. package/src/internal/hardhat-network/provider/BlockchainBase.ts +0 -185
  238. package/src/internal/hardhat-network/provider/BlockchainData.ts +0 -261
  239. package/src/internal/hardhat-network/provider/HardhatBlockchain.ts +0 -140
  240. package/src/internal/hardhat-network/provider/PoolState.ts +0 -48
  241. package/src/internal/hardhat-network/provider/TransactionQueue.ts +0 -158
  242. package/src/internal/hardhat-network/provider/TxPool.ts +0 -715
  243. package/src/internal/hardhat-network/provider/ethereumjs-workarounds.ts +0 -21
  244. package/src/internal/hardhat-network/provider/filter.ts +0 -142
  245. package/src/internal/hardhat-network/provider/fork/ForkBlockchain.ts +0 -433
  246. package/src/internal/hardhat-network/provider/fork/ForkStateManager.ts +0 -480
  247. package/src/internal/hardhat-network/provider/fork/rpcToBlockData.ts +0 -35
  248. package/src/internal/hardhat-network/provider/fork/rpcToTxData.ts +0 -44
  249. package/src/internal/hardhat-network/provider/modules/base.ts +0 -156
  250. package/src/internal/hardhat-network/provider/modules/debug.ts +0 -104
  251. package/src/internal/hardhat-network/provider/modules/eth.ts +0 -1781
  252. package/src/internal/hardhat-network/provider/modules/evm.ts +0 -249
  253. package/src/internal/hardhat-network/provider/modules/hardhat.ts +0 -481
  254. package/src/internal/hardhat-network/provider/modules/net.ts +0 -60
  255. package/src/internal/hardhat-network/provider/modules/personal.ts +0 -40
  256. package/src/internal/hardhat-network/provider/modules/web3.ts +0 -49
  257. package/src/internal/hardhat-network/provider/node.ts +0 -2993
  258. package/src/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.ts +0 -226
  259. package/src/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.ts +0 -224
  260. package/src/internal/hardhat-network/provider/transactions/FakeSenderTransaction.ts +0 -216
  261. package/src/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.ts +0 -143
  262. package/src/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.ts +0 -144
  263. package/src/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.ts +0 -171
  264. package/src/internal/hardhat-network/provider/transactions/ReadOnlyValidUnknownTypeTransaction.ts +0 -169
  265. package/src/internal/hardhat-network/provider/types/HardhatBlockchainInterface.ts +0 -25
  266. package/src/internal/hardhat-network/provider/utils/makeFakeSignature.ts +0 -60
  267. package/src/internal/hardhat-network/provider/utils/makeStateTrie.ts +0 -29
  268. package/src/internal/hardhat-network/provider/utils/putGenesisBlock.ts +0 -61
  269. package/src/internal/hardhat-network/provider/utils/reorganizeTransactionsLists.ts +0 -45
  270. package/src/internal/hardhat-network/provider/utils/txMapToArray.ts +0 -7
  271. package/src/internal/hardhat-network/stack-traces/vm-debug-tracer.ts +0 -630
@@ -1,17 +1,30 @@
1
1
  import type {
2
2
  Artifacts,
3
3
  BoundExperimentalHardhatNetworkMessageTraceHook,
4
+ CompilerInput,
5
+ CompilerOutput,
4
6
  EIP1193Provider,
5
7
  EthSubscription,
6
8
  HardhatNetworkChainsConfig,
7
9
  RequestArguments,
8
10
  } from "../../../types";
9
11
 
12
+ import {
13
+ EdrContext,
14
+ Provider as EdrProviderT,
15
+ ExecutionResult,
16
+ RawTrace,
17
+ Response,
18
+ SubscriptionEvent,
19
+ TracingMessage,
20
+ TracingStep,
21
+ } from "@nomicfoundation/edr";
10
22
  import { Common } from "@nomicfoundation/ethereumjs-common";
11
23
  import chalk from "chalk";
12
24
  import debug from "debug";
13
25
  import { EventEmitter } from "events";
14
26
  import fsExtra from "fs-extra";
27
+ import * as t from "io-ts";
15
28
  import semver from "semver";
16
29
 
17
30
  import {
@@ -19,24 +32,31 @@ import {
19
32
  HARDHAT_NETWORK_REVERT_SNAPSHOT_EVENT,
20
33
  } from "../../constants";
21
34
  import {
35
+ rpcCompilerInput,
36
+ rpcCompilerOutput,
37
+ } from "../../core/jsonrpc/types/input/solc";
38
+ import { validateParams } from "../../core/jsonrpc/types/input/validation";
39
+ import {
40
+ InvalidArgumentsError,
22
41
  InvalidInputError,
23
- MethodNotFoundError,
24
- MethodNotSupportedError,
25
42
  ProviderError,
26
43
  } from "../../core/providers/errors";
27
- import { Mutex } from "../../vendor/await-semaphore";
28
-
44
+ import { isErrorResponse } from "../../core/providers/http";
45
+ import { getHardforkName } from "../../util/hardforks";
46
+ import { createModelsAndDecodeBytecodes } from "../stack-traces/compiler-to-model";
47
+ import { ConsoleLogger } from "../stack-traces/consoleLogger";
48
+ import { ContractsIdentifier } from "../stack-traces/contracts-identifier";
49
+ import {
50
+ VmTraceDecoder,
51
+ initializeVmTraceDecoder,
52
+ } from "../stack-traces/vm-trace-decoder";
29
53
  import { FIRST_SOLC_VERSION_SUPPORTED } from "../stack-traces/constants";
30
- import { MiningTimer } from "./MiningTimer";
31
- import { DebugModule } from "./modules/debug";
32
- import { EthModule } from "./modules/eth";
33
- import { EvmModule } from "./modules/evm";
34
- import { HardhatModule } from "./modules/hardhat";
35
- import { ModulesLogger } from "./modules/logger";
36
- import { PersonalModule } from "./modules/personal";
37
- import { NetModule } from "./modules/net";
38
- import { Web3Module } from "./modules/web3";
39
- import { HardhatNode } from "./node";
54
+ import { encodeSolidityStackTrace } from "../stack-traces/solidity-errors";
55
+ import { SolidityStackTrace } from "../stack-traces/solidity-stack-trace";
56
+ import { SolidityTracer } from "../stack-traces/solidityTracer";
57
+ import { VMTracer } from "../stack-traces/vm-tracer";
58
+
59
+ import { getPackageJson } from "../../util/packageInfo";
40
60
  import {
41
61
  ForkConfig,
42
62
  GenesisAccount,
@@ -45,18 +65,35 @@ import {
45
65
  NodeConfig,
46
66
  TracingConfig,
47
67
  } from "./node-types";
68
+ import {
69
+ edrRpcDebugTraceToHardhat,
70
+ edrTracingMessageResultToMinimalEVMResult,
71
+ edrTracingMessageToMinimalMessage,
72
+ edrTracingStepToMinimalInterpreterStep,
73
+ ethereumjsIntervalMiningConfigToEdr,
74
+ ethereumjsMempoolOrderToEdrMineOrdering,
75
+ ethereumsjsHardforkToEdrSpecId,
76
+ } from "./utils/convertToEdr";
77
+ import { makeCommon } from "./utils/makeCommon";
78
+ import { LoggerConfig, printLine, replaceLastLine } from "./modules/logger";
79
+ import { MinimalEthereumJsVm, getMinimalEthereumJsVm } from "./vm/minimal-vm";
48
80
 
49
81
  const log = debug("hardhat:core:hardhat-network:provider");
50
82
 
51
- // Set of methods that are never logged
52
- const PRIVATE_RPC_METHODS = new Set([
53
- "hardhat_getStackTraceFailuresCount",
54
- "hardhat_setLoggingEnabled",
55
- ]);
56
-
57
83
  /* eslint-disable @nomicfoundation/hardhat-internal-rules/only-hardhat-error */
58
84
 
59
85
  export const DEFAULT_COINBASE = "0xc014ba5ec014ba5ec014ba5ec014ba5ec014ba5e";
86
+ let _globalEdrContext: EdrContext | undefined;
87
+
88
+ // Lazy initialize the global EDR context.
89
+ export function getGlobalEdrContext(): EdrContext {
90
+ if (_globalEdrContext === undefined) {
91
+ // Only one is allowed to exist
92
+ _globalEdrContext = new EdrContext();
93
+ }
94
+
95
+ return _globalEdrContext;
96
+ }
60
97
 
61
98
  interface HardhatNetworkProviderConfig {
62
99
  hardfork: string;
@@ -83,312 +120,494 @@ interface HardhatNetworkProviderConfig {
83
120
  enableTransientStorage: boolean;
84
121
  }
85
122
 
86
- export class HardhatNetworkProvider
123
+ export function getNodeConfig(
124
+ config: HardhatNetworkProviderConfig,
125
+ tracingConfig?: TracingConfig
126
+ ): NodeConfig {
127
+ return {
128
+ automine: config.automine,
129
+ blockGasLimit: config.blockGasLimit,
130
+ minGasPrice: config.minGasPrice,
131
+ genesisAccounts: config.genesisAccounts,
132
+ allowUnlimitedContractSize: config.allowUnlimitedContractSize,
133
+ tracingConfig,
134
+ initialBaseFeePerGas: config.initialBaseFeePerGas,
135
+ mempoolOrder: config.mempoolOrder,
136
+ hardfork: config.hardfork,
137
+ chainId: config.chainId,
138
+ networkId: config.networkId,
139
+ initialDate: config.initialDate,
140
+ forkConfig: config.forkConfig,
141
+ forkCachePath:
142
+ config.forkConfig !== undefined ? config.forkCachePath : undefined,
143
+ coinbase: config.coinbase ?? DEFAULT_COINBASE,
144
+ chains: config.chains,
145
+ allowBlocksWithSameTimestamp: config.allowBlocksWithSameTimestamp,
146
+ enableTransientStorage: config.enableTransientStorage,
147
+ };
148
+ }
149
+
150
+ export interface RawTraceCallbacks {
151
+ onStep?: (messageTrace: TracingStep) => Promise<void>;
152
+ onBeforeMessage?: (messageTrace: TracingMessage) => Promise<void>;
153
+ onAfterMessage?: (messageTrace: ExecutionResult) => Promise<void>;
154
+ }
155
+
156
+ class EdrProviderEventAdapter extends EventEmitter {}
157
+
158
+ export class EdrProviderWrapper
87
159
  extends EventEmitter
88
160
  implements EIP1193Provider
89
161
  {
90
- private _node?: HardhatNode;
91
- private _ethModule?: EthModule;
92
- private _netModule?: NetModule;
93
- private _web3Module?: Web3Module;
94
- private _evmModule?: EvmModule;
95
- private _hardhatModule?: HardhatModule;
96
- private _debugModule?: DebugModule;
97
- private _personalModule?: PersonalModule;
98
- private readonly _mutex = new Mutex();
99
- // this field is not used here but it's used in the tests
100
- private _common?: Common;
101
-
102
- constructor(
103
- private readonly _config: HardhatNetworkProviderConfig,
104
- private readonly _logger: ModulesLogger,
105
- private readonly _artifacts?: Artifacts
162
+ private _failedStackTraces = 0;
163
+
164
+ private constructor(
165
+ private readonly _provider: EdrProviderT,
166
+ // we add this for backwards-compatibility with plugins like solidity-coverage
167
+ private readonly _node: {
168
+ _vm: MinimalEthereumJsVm;
169
+ },
170
+ private readonly _eventAdapter: EdrProviderEventAdapter,
171
+ private readonly _vmTraceDecoder: VmTraceDecoder,
172
+ private readonly _rawTraceCallbacks: RawTraceCallbacks,
173
+ // The common configuration for EthereumJS VM is not used by EDR, but tests expect it as part of the provider.
174
+ private readonly _common: Common,
175
+ tracingConfig?: TracingConfig
106
176
  ) {
107
177
  super();
108
- }
109
-
110
- public async request(args: RequestArguments): Promise<unknown> {
111
- const release = await this._mutex.acquire();
112
178
 
113
- if (args.params !== undefined && !Array.isArray(args.params)) {
114
- throw new InvalidInputError(
115
- "Hardhat Network doesn't support JSON-RPC params sent as an object"
116
- );
179
+ if (tracingConfig !== undefined) {
180
+ initializeVmTraceDecoder(this._vmTraceDecoder, tracingConfig);
117
181
  }
182
+ }
118
183
 
119
- try {
120
- let result;
121
- if (this._logger.isEnabled() && !PRIVATE_RPC_METHODS.has(args.method)) {
122
- result = await this._sendWithLogging(args.method, args.params);
123
- } else {
124
- result = await this._send(args.method, args.params);
125
- }
184
+ public static async create(
185
+ config: HardhatNetworkProviderConfig,
186
+ loggerConfig: LoggerConfig,
187
+ rawTraceCallbacks: RawTraceCallbacks,
188
+ tracingConfig?: TracingConfig
189
+ ): Promise<EdrProviderWrapper> {
190
+ const { Provider } =
191
+ require("@nomicfoundation/edr") as typeof import("@nomicfoundation/edr");
192
+
193
+ const coinbase = config.coinbase ?? DEFAULT_COINBASE;
194
+
195
+ let fork;
196
+ if (config.forkConfig !== undefined) {
197
+ fork = {
198
+ jsonRpcUrl: config.forkConfig.jsonRpcUrl,
199
+ blockNumber:
200
+ config.forkConfig.blockNumber !== undefined
201
+ ? BigInt(config.forkConfig.blockNumber)
202
+ : undefined,
203
+ };
204
+ }
126
205
 
127
- if (args.method === "hardhat_reset") {
128
- this.emit(HARDHAT_NETWORK_RESET_EVENT);
129
- }
130
- if (args.method === "evm_revert") {
131
- this.emit(HARDHAT_NETWORK_REVERT_SNAPSHOT_EVENT);
206
+ const initialDate =
207
+ config.initialDate !== undefined
208
+ ? BigInt(Math.floor(config.initialDate.getTime() / 1000))
209
+ : undefined;
210
+
211
+ // To accomodate construction ordering, we need an adapter to forward events
212
+ // from the EdrProvider callback to the wrapper's listener
213
+ const eventAdapter = new EdrProviderEventAdapter();
214
+
215
+ const printLineFn = loggerConfig.printLineFn ?? printLine;
216
+ const replaceLastLineFn = loggerConfig.replaceLastLineFn ?? replaceLastLine;
217
+
218
+ const contractsIdentifier = new ContractsIdentifier();
219
+ const vmTraceDecoder = new VmTraceDecoder(contractsIdentifier);
220
+
221
+ const provider = await Provider.withConfig(
222
+ getGlobalEdrContext(),
223
+ {
224
+ allowBlocksWithSameTimestamp:
225
+ config.allowBlocksWithSameTimestamp ?? false,
226
+ allowUnlimitedContractSize: config.allowUnlimitedContractSize,
227
+ bailOnCallFailure: config.throwOnCallFailures,
228
+ bailOnTransactionFailure: config.throwOnTransactionFailures,
229
+ blockGasLimit: BigInt(config.blockGasLimit),
230
+ chainId: BigInt(config.chainId),
231
+ chains: Array.from(config.chains, ([chainId, hardforkConfig]) => {
232
+ return {
233
+ chainId: BigInt(chainId),
234
+ hardforks: Array.from(
235
+ hardforkConfig.hardforkHistory,
236
+ ([hardfork, blockNumber]) => {
237
+ return {
238
+ blockNumber: BigInt(blockNumber),
239
+ specId: ethereumsjsHardforkToEdrSpecId(
240
+ getHardforkName(hardfork)
241
+ ),
242
+ };
243
+ }
244
+ ),
245
+ };
246
+ }),
247
+ cacheDir: config.forkCachePath,
248
+ coinbase: Buffer.from(coinbase.slice(2), "hex"),
249
+ fork,
250
+ hardfork: ethereumsjsHardforkToEdrSpecId(
251
+ getHardforkName(config.hardfork)
252
+ ),
253
+ genesisAccounts: config.genesisAccounts.map((account) => {
254
+ return {
255
+ secretKey: account.privateKey,
256
+ balance: BigInt(account.balance),
257
+ };
258
+ }),
259
+ initialDate,
260
+ initialBaseFeePerGas:
261
+ config.initialBaseFeePerGas !== undefined
262
+ ? BigInt(config.initialBaseFeePerGas!)
263
+ : undefined,
264
+ minGasPrice: config.minGasPrice,
265
+ mining: {
266
+ autoMine: config.automine,
267
+ interval: ethereumjsIntervalMiningConfigToEdr(config.intervalMining),
268
+ memPool: {
269
+ order: ethereumjsMempoolOrderToEdrMineOrdering(config.mempoolOrder),
270
+ },
271
+ },
272
+ networkId: BigInt(config.networkId),
273
+ },
274
+ {
275
+ enable: loggerConfig.enabled,
276
+ decodeConsoleLogInputsCallback: (inputs: Buffer[]) => {
277
+ const consoleLogger = new ConsoleLogger();
278
+ return consoleLogger.getDecodedLogs(inputs);
279
+ },
280
+ getContractAndFunctionNameCallback: (
281
+ code: Buffer,
282
+ calldata?: Buffer
283
+ ) => {
284
+ return vmTraceDecoder.getContractAndFunctionNamesForCall(
285
+ code,
286
+ calldata
287
+ );
288
+ },
289
+ printLineCallback: (message: string, replace: boolean) => {
290
+ if (replace) {
291
+ replaceLastLineFn(message);
292
+ } else {
293
+ printLineFn(message);
294
+ }
295
+ },
296
+ },
297
+ (event: SubscriptionEvent) => {
298
+ eventAdapter.emit("ethEvent", event);
132
299
  }
300
+ );
133
301
 
134
- return result;
135
- } finally {
136
- release();
137
- }
138
- }
139
-
140
- private async _sendWithLogging(
141
- method: string,
142
- params: any[] = []
143
- ): Promise<any> {
144
- try {
145
- const result = await this._send(method, params);
146
- // We log after running the method, because we want to use different
147
- // colors depending on whether it failed or not
302
+ const minimalEthereumJsNode = {
303
+ _vm: getMinimalEthereumJsVm(provider),
304
+ };
148
305
 
149
- // TODO: If an eth_call, eth_sendTransaction, or eth_sendRawTransaction
150
- // fails without throwing, this will be displayed in green. It's unclear
151
- // if this is correct. See Eth module's TODOs for more info.
306
+ const common = makeCommon(getNodeConfig(config));
307
+ const wrapper = new EdrProviderWrapper(
308
+ provider,
309
+ minimalEthereumJsNode,
310
+ eventAdapter,
311
+ vmTraceDecoder,
312
+ rawTraceCallbacks,
313
+ common,
314
+ tracingConfig
315
+ );
152
316
 
153
- if (method !== "hardhat_intervalMine") {
154
- this._logger.printMethod(method);
317
+ // Pass through all events from the provider
318
+ eventAdapter.addListener(
319
+ "ethEvent",
320
+ wrapper._ethEventListener.bind(wrapper)
321
+ );
155
322
 
156
- const printedSomething = this._logger.printLogs();
157
- if (printedSomething) {
158
- this._logger.printEmptyLine();
159
- }
160
- }
323
+ return wrapper;
324
+ }
161
325
 
162
- return result;
163
- } catch (err) {
164
- if (
165
- err instanceof MethodNotFoundError ||
166
- err instanceof MethodNotSupportedError
167
- ) {
168
- this._logger.printMethodNotSupported(method);
326
+ public async request(args: RequestArguments): Promise<unknown> {
327
+ if (args.params !== undefined && !Array.isArray(args.params)) {
328
+ throw new InvalidInputError(
329
+ "Hardhat Network doesn't support JSON-RPC params sent as an object"
330
+ );
331
+ }
169
332
 
170
- throw err;
171
- }
333
+ const params = args.params ?? [];
172
334
 
173
- this._logger.printFailedMethod(method);
174
- this._logger.printLogs();
335
+ if (args.method === "hardhat_addCompilationResult") {
336
+ return this._addCompilationResultAction(
337
+ ...this._addCompilationResultParams(params)
338
+ );
339
+ } else if (args.method === "hardhat_getStackTraceFailuresCount") {
340
+ return this._getStackTraceFailuresCountAction(
341
+ ...this._getStackTraceFailuresCountParams(params)
342
+ );
343
+ }
175
344
 
176
- if (err instanceof Error && !this._logger.isLoggedError(err)) {
177
- if (ProviderError.isProviderError(err)) {
178
- this._logger.printEmptyLine();
179
- this._logger.printErrorMessage(err.message);
345
+ const stringifiedArgs = JSON.stringify({
346
+ method: args.method,
347
+ params,
348
+ });
180
349
 
181
- const isEIP155Error =
182
- err instanceof InvalidInputError && err.message.includes("EIP155");
183
- if (isEIP155Error) {
184
- this._logger.printMetaMaskWarning();
350
+ const responseObject: Response = await this._provider.handleRequest(
351
+ stringifiedArgs
352
+ );
353
+ const response = JSON.parse(responseObject.json);
354
+
355
+ const rawTraces = responseObject.traces;
356
+ for (const rawTrace of rawTraces) {
357
+ const trace = rawTrace.trace();
358
+ for (const traceItem of trace) {
359
+ if ("pc" in traceItem) {
360
+ this._node._vm.evm.events.emit(
361
+ "step",
362
+ edrTracingStepToMinimalInterpreterStep(traceItem)
363
+ );
364
+ if (this._rawTraceCallbacks.onStep !== undefined) {
365
+ await this._rawTraceCallbacks.onStep(traceItem);
366
+ }
367
+ } else if ("executionResult" in traceItem) {
368
+ this._node._vm.evm.events.emit(
369
+ "afterMessage",
370
+ edrTracingMessageResultToMinimalEVMResult(traceItem)
371
+ );
372
+ if (this._rawTraceCallbacks.onAfterMessage !== undefined) {
373
+ await this._rawTraceCallbacks.onAfterMessage(
374
+ traceItem.executionResult
375
+ );
185
376
  }
186
377
  } else {
187
- this._logger.printUnknownError(err);
378
+ this._node._vm.evm.events.emit(
379
+ "beforeMessage",
380
+ edrTracingMessageToMinimalMessage(traceItem)
381
+ );
382
+ if (this._rawTraceCallbacks.onBeforeMessage !== undefined) {
383
+ await this._rawTraceCallbacks.onBeforeMessage(traceItem);
384
+ }
188
385
  }
189
386
  }
190
-
191
- this._logger.printEmptyLine();
192
-
193
- throw err;
194
387
  }
195
- }
196
-
197
- private async _send(method: string, params: any[] = []): Promise<any> {
198
- await this._init();
199
388
 
200
- if (method.startsWith("eth_")) {
201
- return this._ethModule!.processRequest(method, params);
202
- }
389
+ if (isErrorResponse(response)) {
390
+ let error;
203
391
 
204
- if (method.startsWith("net_")) {
205
- return this._netModule!.processRequest(method, params);
206
- }
392
+ const solidityTrace = responseObject.solidityTrace;
393
+ let stackTrace: SolidityStackTrace | undefined;
394
+ if (solidityTrace !== null) {
395
+ stackTrace = await this._rawTraceToSolidityStackTrace(solidityTrace);
396
+ }
207
397
 
208
- if (method.startsWith("web3_")) {
209
- return this._web3Module!.processRequest(method, params);
210
- }
398
+ if (stackTrace !== undefined) {
399
+ error = encodeSolidityStackTrace(response.error.message, stackTrace);
400
+ // Pass data and transaction hash from the original error
401
+ (error as any).data = {
402
+ data: response.error.data?.data ?? undefined,
403
+ transactionHash: response.error.data?.transactionHash ?? undefined,
404
+ };
405
+ } else {
406
+ if (response.error.code === InvalidArgumentsError.CODE) {
407
+ error = new InvalidArgumentsError(response.error.message);
408
+ } else {
409
+ error = new ProviderError(
410
+ response.error.message,
411
+ response.error.code
412
+ );
413
+ }
414
+ error.data = response.error.data;
415
+ }
211
416
 
212
- if (method.startsWith("evm_")) {
213
- return this._evmModule!.processRequest(method, params);
417
+ // eslint-disable-next-line @nomicfoundation/hardhat-internal-rules/only-hardhat-error
418
+ throw error;
214
419
  }
215
420
 
216
- if (method.startsWith("hardhat_")) {
217
- return this._hardhatModule!.processRequest(method, params);
421
+ if (args.method === "hardhat_reset") {
422
+ this.emit(HARDHAT_NETWORK_RESET_EVENT);
423
+ } else if (args.method === "evm_revert") {
424
+ this.emit(HARDHAT_NETWORK_REVERT_SNAPSHOT_EVENT);
218
425
  }
219
426
 
220
- if (method.startsWith("debug_")) {
221
- return this._debugModule!.processRequest(method, params);
427
+ // Override EDR version string with Hardhat version string with EDR backend,
428
+ // e.g. `HardhatNetwork/2.19.0/@nomicfoundation/edr/0.2.0-dev`
429
+ if (args.method === "web3_clientVersion") {
430
+ return clientVersion(response.result);
431
+ } else if (
432
+ args.method === "debug_traceTransaction" ||
433
+ args.method === "debug_traceCall"
434
+ ) {
435
+ return edrRpcDebugTraceToHardhat(response.result);
436
+ } else {
437
+ return response.result;
222
438
  }
439
+ }
223
440
 
224
- if (method.startsWith("personal_")) {
225
- return this._personalModule!.processRequest(method, params);
441
+ private _ethEventListener(event: SubscriptionEvent) {
442
+ const subscription = `0x${event.filterId.toString(16)}`;
443
+ const results = Array.isArray(event.result) ? event.result : [event.result];
444
+ for (const result of results) {
445
+ this._emitLegacySubscriptionEvent(subscription, result);
446
+ this._emitEip1193SubscriptionEvent(subscription, result);
226
447
  }
227
-
228
- throw new MethodNotFoundError(`Method ${method} not found`);
229
448
  }
230
449
 
231
- private async _init() {
232
- if (this._node !== undefined) {
233
- return;
234
- }
450
+ private _emitLegacySubscriptionEvent(subscription: string, result: any) {
451
+ this.emit("notification", {
452
+ subscription,
453
+ result,
454
+ });
455
+ }
235
456
 
236
- const config: NodeConfig = {
237
- automine: this._config.automine,
238
- blockGasLimit: this._config.blockGasLimit,
239
- minGasPrice: this._config.minGasPrice,
240
- genesisAccounts: this._config.genesisAccounts,
241
- allowUnlimitedContractSize: this._config.allowUnlimitedContractSize,
242
- tracingConfig: await this._makeTracingConfig(),
243
- initialBaseFeePerGas: this._config.initialBaseFeePerGas,
244
- mempoolOrder: this._config.mempoolOrder,
245
- hardfork: this._config.hardfork,
246
- chainId: this._config.chainId,
247
- networkId: this._config.networkId,
248
- initialDate: this._config.initialDate,
249
- forkConfig: this._config.forkConfig,
250
- forkCachePath:
251
- this._config.forkConfig !== undefined
252
- ? this._config.forkCachePath
253
- : undefined,
254
- coinbase: this._config.coinbase ?? DEFAULT_COINBASE,
255
- chains: this._config.chains,
256
- allowBlocksWithSameTimestamp: this._config.allowBlocksWithSameTimestamp,
257
- enableTransientStorage: this._config.enableTransientStorage,
457
+ private _emitEip1193SubscriptionEvent(subscription: string, result: unknown) {
458
+ const message: EthSubscription = {
459
+ type: "eth_subscription",
460
+ data: {
461
+ subscription,
462
+ result,
463
+ },
258
464
  };
259
465
 
260
- const [common, node] = await HardhatNode.create(config);
261
-
262
- this._common = common;
263
- this._node = node;
466
+ this.emit("message", message);
467
+ }
264
468
 
265
- this._ethModule = new EthModule(
266
- common,
267
- node,
268
- this._config.throwOnTransactionFailures,
269
- this._config.throwOnCallFailures,
270
- this._logger,
271
- this._config.experimentalHardhatNetworkMessageTraceHooks
469
+ private _addCompilationResultParams(
470
+ params: any[]
471
+ ): [string, CompilerInput, CompilerOutput] {
472
+ return validateParams(
473
+ params,
474
+ t.string,
475
+ rpcCompilerInput,
476
+ rpcCompilerOutput
272
477
  );
478
+ }
273
479
 
274
- const miningTimer = this._makeMiningTimer();
480
+ private async _addCompilationResultAction(
481
+ solcVersion: string,
482
+ compilerInput: CompilerInput,
483
+ compilerOutput: CompilerOutput
484
+ ): Promise<boolean> {
485
+ let bytecodes;
486
+ try {
487
+ bytecodes = createModelsAndDecodeBytecodes(
488
+ solcVersion,
489
+ compilerInput,
490
+ compilerOutput
491
+ );
492
+ } catch (error) {
493
+ console.warn(
494
+ chalk.yellow(
495
+ "The Hardhat Network tracing engine could not be updated. Run Hardhat with --verbose to learn more."
496
+ )
497
+ );
275
498
 
276
- this._netModule = new NetModule(common);
277
- this._web3Module = new Web3Module(node);
278
- this._evmModule = new EvmModule(
279
- node,
280
- miningTimer,
281
- this._logger,
282
- this._config.allowBlocksWithSameTimestamp,
283
- this._config.experimentalHardhatNetworkMessageTraceHooks
284
- );
285
- this._hardhatModule = new HardhatModule(
286
- node,
287
- (forkConfig?: ForkConfig) => this._reset(miningTimer, forkConfig),
288
- (loggingEnabled: boolean) => {
289
- this._logger.setEnabled(loggingEnabled);
290
- },
291
- this._logger,
292
- this._config.experimentalHardhatNetworkMessageTraceHooks
293
- );
294
- this._debugModule = new DebugModule(node);
295
- this._personalModule = new PersonalModule(node);
499
+ log(
500
+ "ContractsIdentifier failed to be updated. Please report this to help us improve Hardhat.\n",
501
+ error
502
+ );
296
503
 
297
- this._forwardNodeEvents(node);
298
- }
504
+ return false;
505
+ }
299
506
 
300
- private async _makeTracingConfig(): Promise<TracingConfig | undefined> {
301
- if (this._artifacts !== undefined) {
302
- const buildInfos = [];
507
+ for (const bytecode of bytecodes) {
508
+ this._vmTraceDecoder.addBytecode(bytecode);
509
+ }
303
510
 
304
- const buildInfoFiles = await this._artifacts.getBuildInfoPaths();
511
+ return true;
512
+ }
305
513
 
306
- try {
307
- for (const buildInfoFile of buildInfoFiles) {
308
- const buildInfo = await fsExtra.readJson(buildInfoFile);
309
- if (semver.gte(buildInfo.solcVersion, FIRST_SOLC_VERSION_SUPPORTED)) {
310
- buildInfos.push(buildInfo);
311
- }
312
- }
514
+ private _getStackTraceFailuresCountParams(params: any[]): [] {
515
+ return validateParams(params);
516
+ }
313
517
 
314
- return {
315
- buildInfos,
316
- };
317
- } catch (error) {
318
- console.warn(
319
- chalk.yellow(
320
- "Stack traces engine could not be initialized. Run Hardhat with --verbose to learn more."
321
- )
322
- );
323
-
324
- log(
325
- "Solidity stack traces disabled: Failed to read solc's input and output files. Please report this to help us improve Hardhat.\n",
326
- error
327
- );
328
- }
329
- }
518
+ private _getStackTraceFailuresCountAction(): number {
519
+ return this._failedStackTraces;
330
520
  }
331
521
 
332
- private _makeMiningTimer(): MiningTimer {
333
- const miningTimer = new MiningTimer(
334
- this._config.intervalMining,
335
- async () => {
336
- try {
337
- await this.request({ method: "hardhat_intervalMine" });
338
- } catch (e) {
339
- console.error("Unexpected error calling hardhat_intervalMine:", e);
340
- }
522
+ private async _rawTraceToSolidityStackTrace(
523
+ rawTrace: RawTrace
524
+ ): Promise<SolidityStackTrace | undefined> {
525
+ const vmTracer = new VMTracer(false);
526
+
527
+ const trace = rawTrace.trace();
528
+ for (const traceItem of trace) {
529
+ if ("pc" in traceItem) {
530
+ await vmTracer.addStep(traceItem);
531
+ } else if ("executionResult" in traceItem) {
532
+ await vmTracer.addAfterMessage(traceItem.executionResult);
533
+ } else {
534
+ await vmTracer.addBeforeMessage(traceItem);
341
535
  }
342
- );
536
+ }
343
537
 
344
- miningTimer.start();
538
+ let vmTrace = vmTracer.getLastTopLevelMessageTrace();
539
+ const vmTracerError = vmTracer.getLastError();
345
540
 
346
- return miningTimer;
347
- }
348
-
349
- private async _reset(miningTimer: MiningTimer, forkConfig?: ForkConfig) {
350
- this._config.forkConfig = forkConfig;
351
- if (this._node !== undefined) {
352
- this._stopForwardingNodeEvents(this._node);
541
+ if (vmTrace !== undefined) {
542
+ vmTrace = this._vmTraceDecoder.tryToDecodeMessageTrace(vmTrace);
353
543
  }
354
- this._node = undefined;
355
544
 
356
- miningTimer.stop();
545
+ try {
546
+ if (vmTrace === undefined || vmTracerError !== undefined) {
547
+ throw vmTracerError;
548
+ }
357
549
 
358
- await this._init();
550
+ const solidityTracer = new SolidityTracer();
551
+ return solidityTracer.getStackTrace(vmTrace);
552
+ } catch (err) {
553
+ this._failedStackTraces += 1;
554
+ log(
555
+ "Could not generate stack trace. Please report this to help us improve Hardhat.\n",
556
+ err
557
+ );
558
+ }
359
559
  }
560
+ }
360
561
 
361
- private _forwardNodeEvents(node: HardhatNode) {
362
- node.addListener("ethEvent", this._ethEventListener);
363
- }
562
+ async function clientVersion(edrClientVersion: string): Promise<string> {
563
+ const hardhatPackage = await getPackageJson();
564
+ const edrVersion = edrClientVersion.split("/")[1];
565
+ return `HardhatNetwork/${hardhatPackage.version}/@nomicfoundation/edr/${edrVersion}`;
566
+ }
364
567
 
365
- private _stopForwardingNodeEvents(node: HardhatNode) {
366
- node.removeListener("ethEvent", this._ethEventListener);
367
- }
568
+ export async function createHardhatNetworkProvider(
569
+ hardhatNetworkProviderConfig: HardhatNetworkProviderConfig,
570
+ loggerConfig: LoggerConfig,
571
+ artifacts?: Artifacts
572
+ ): Promise<EIP1193Provider> {
573
+ return EdrProviderWrapper.create(
574
+ hardhatNetworkProviderConfig,
575
+ loggerConfig,
576
+ {},
577
+ await makeTracingConfig(artifacts)
578
+ );
579
+ }
368
580
 
369
- private _ethEventListener = (payload: { filterId: bigint; result: any }) => {
370
- const subscription = `0x${payload.filterId.toString(16)}`;
371
- const result = payload.result;
372
- this._emitLegacySubscriptionEvent(subscription, result);
373
- this._emitEip1193SubscriptionEvent(subscription, result);
374
- };
581
+ async function makeTracingConfig(
582
+ artifacts: Artifacts | undefined
583
+ ): Promise<TracingConfig | undefined> {
584
+ if (artifacts !== undefined) {
585
+ const buildInfos = [];
375
586
 
376
- private _emitLegacySubscriptionEvent(subscription: string, result: any) {
377
- this.emit("notification", {
378
- subscription,
379
- result,
380
- });
381
- }
587
+ const buildInfoFiles = await artifacts.getBuildInfoPaths();
382
588
 
383
- private _emitEip1193SubscriptionEvent(subscription: string, result: unknown) {
384
- const message: EthSubscription = {
385
- type: "eth_subscription",
386
- data: {
387
- subscription,
388
- result,
389
- },
390
- };
589
+ try {
590
+ for (const buildInfoFile of buildInfoFiles) {
591
+ const buildInfo = await fsExtra.readJson(buildInfoFile);
592
+ if (semver.gte(buildInfo.solcVersion, FIRST_SOLC_VERSION_SUPPORTED)) {
593
+ buildInfos.push(buildInfo);
594
+ }
595
+ }
391
596
 
392
- this.emit("message", message);
597
+ return {
598
+ buildInfos,
599
+ };
600
+ } catch (error) {
601
+ console.warn(
602
+ chalk.yellow(
603
+ "Stack traces engine could not be initialized. Run Hardhat with --verbose to learn more."
604
+ )
605
+ );
606
+
607
+ log(
608
+ "Solidity stack traces disabled: Failed to read solc's input and output files. Please report this to help us improve Hardhat.\n",
609
+ error
610
+ );
611
+ }
393
612
  }
394
613
  }