hardhat 2.20.1 → 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 -153
  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 -2999
  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,630 +0,0 @@
1
- import { Journal } from "@nomicfoundation/ethereumjs-evm/dist/cjs/journal";
2
- import { TypedTransaction } from "@nomicfoundation/ethereumjs-tx";
3
- import { AfterTxEvent, VM } from "@nomicfoundation/ethereumjs-vm";
4
- import {
5
- EVMResult,
6
- InterpreterStep,
7
- Message,
8
- } from "@nomicfoundation/ethereumjs-evm";
9
- import {
10
- Address,
11
- bytesToBigInt,
12
- setLengthLeft,
13
- toBytes,
14
- } from "@nomicfoundation/ethereumjs-util";
15
-
16
- import { assertHardhatInvariant } from "../../core/errors";
17
- import { RpcDebugTracingConfig } from "../../core/jsonrpc/types/input/debugTraceTransaction";
18
- import { InvalidInputError } from "../../core/providers/errors";
19
- import { RpcDebugTraceOutput, RpcStructLog } from "../provider/output";
20
- import * as BigIntUtils from "../../util/bigint";
21
-
22
- /* eslint-disable @nomicfoundation/hardhat-internal-rules/only-hardhat-error */
23
-
24
- interface StructLog {
25
- depth: number;
26
- gas: number;
27
- gasCost: number;
28
- op: string;
29
- pc: number;
30
- memory: string[];
31
- stack: string[];
32
- storage: Record<string, string>;
33
- memSize: number;
34
- error?: object;
35
- }
36
-
37
- type Storage = Record<string, string>;
38
-
39
- interface DebugMessage {
40
- structLogs: Array<StructLog | DebugMessage>;
41
- to: string;
42
- result?: EVMResult;
43
- }
44
-
45
- type NestedStructLogs = Array<StructLog | NestedStructLogs>;
46
-
47
- function isStructLog(
48
- message: StructLog | DebugMessage | undefined
49
- ): message is StructLog {
50
- return message !== undefined && !("structLogs" in message);
51
- }
52
-
53
- const EMPTY_MEMORY_WORD = "0".repeat(64);
54
-
55
- export class VMDebugTracer {
56
- private _lastTrace?: RpcDebugTraceOutput;
57
- private _config: RpcDebugTracingConfig;
58
-
59
- private _messages: DebugMessage[] = [];
60
- private _addressToStorage: Record<string, Storage> = {};
61
-
62
- private _error: any;
63
-
64
- constructor(private readonly _vm: VM) {
65
- this._beforeMessageHandler = this._beforeMessageHandler.bind(this);
66
- this._afterMessageHandler = this._afterMessageHandler.bind(this);
67
- this._beforeTxHandler = this._beforeTxHandler.bind(this);
68
- this._stepHandler = this._stepHandler.bind(this);
69
- this._afterTxHandler = this._afterTxHandler.bind(this);
70
- }
71
-
72
- /**
73
- * Run the `action` callback and trace its execution
74
- */
75
- public async trace(
76
- action: () => Promise<void>,
77
- config: RpcDebugTracingConfig
78
- ): Promise<RpcDebugTraceOutput> {
79
- try {
80
- this._enableTracing(config);
81
- this._config = config;
82
-
83
- await action();
84
-
85
- if (this._error !== undefined) {
86
- throw this._error;
87
- }
88
-
89
- return this._getDebugTrace();
90
- } finally {
91
- this._disableTracing();
92
- }
93
- }
94
-
95
- private _enableTracing(config: RpcDebugTracingConfig) {
96
- assertHardhatInvariant(
97
- this._vm.evm.events !== undefined,
98
- "EVM should have an 'events' property"
99
- );
100
-
101
- this._vm.events.on("beforeTx", this._beforeTxHandler);
102
-
103
- this._vm.evm.events.on("beforeMessage", this._beforeMessageHandler);
104
- this._vm.evm.events.on("step", this._stepHandler);
105
- this._vm.evm.events.on("afterMessage", this._afterMessageHandler);
106
-
107
- this._vm.events.on("afterTx", this._afterTxHandler);
108
-
109
- this._config = config;
110
- }
111
-
112
- private _disableTracing() {
113
- assertHardhatInvariant(
114
- this._vm.evm.events !== undefined,
115
- "EVM should have an 'events' property"
116
- );
117
-
118
- this._vm.events.removeListener("beforeTx", this._beforeTxHandler);
119
-
120
- this._vm.evm.events.removeListener(
121
- "beforeMessage",
122
- this._beforeMessageHandler
123
- );
124
- this._vm.evm.events.removeListener("step", this._stepHandler);
125
- this._vm.evm.events.removeListener(
126
- "afterMessage",
127
- this._afterMessageHandler
128
- );
129
- this._vm.events.removeListener("afterTx", this._afterTxHandler);
130
- this._config = undefined;
131
- }
132
-
133
- private _getDebugTrace(): RpcDebugTraceOutput {
134
- if (this._lastTrace === undefined) {
135
- throw new Error(
136
- "No debug trace available. Please run the transaction first"
137
- );
138
- }
139
- return this._lastTrace;
140
- }
141
-
142
- private async _beforeTxHandler(_tx: TypedTransaction, next: any) {
143
- this._lastTrace = undefined;
144
- this._messages = [];
145
- this._addressToStorage = {};
146
- next();
147
- }
148
-
149
- private async _beforeMessageHandler(message: Message, next: any) {
150
- const debugMessage: DebugMessage = {
151
- structLogs: [],
152
- to: message.to?.toString() ?? "",
153
- };
154
-
155
- if (this._messages.length > 0) {
156
- const previousMessage = this._messages[this._messages.length - 1];
157
-
158
- previousMessage.structLogs.push(debugMessage);
159
- }
160
-
161
- this._messages.push(debugMessage);
162
-
163
- next();
164
- }
165
-
166
- private async _stepHandler(step: InterpreterStep, next: any) {
167
- try {
168
- assertHardhatInvariant(
169
- this._messages.length > 0,
170
- "Step handler should be called after at least one beforeMessage handler"
171
- );
172
-
173
- const structLog = await this._stepToStructLog(step);
174
- this._messages[this._messages.length - 1].structLogs.push(structLog);
175
- } catch (e: any) {
176
- // errors thrown in event handlers are lost, so we save this error to
177
- // re-throw it in the `trace` function
178
- this._error = e;
179
- this._disableTracing();
180
- }
181
-
182
- next();
183
- }
184
-
185
- private async _afterMessageHandler(result: EVMResult, next: any) {
186
- const lastMessage = this._messages[this._messages.length - 1];
187
-
188
- lastMessage.result = result;
189
-
190
- if (this._messages.length > 1) {
191
- this._messages.pop();
192
- }
193
-
194
- next();
195
- }
196
-
197
- private async _afterTxHandler(result: AfterTxEvent, next: any) {
198
- const { default: flattenDeep } = await import("lodash/flattenDeep");
199
- const topLevelMessage = this._messages[0];
200
-
201
- const nestedStructLogs = await this._messageToNestedStructLogs(
202
- topLevelMessage,
203
- topLevelMessage.to
204
- );
205
-
206
- const rpcStructLogs: RpcStructLog[] = flattenDeep(nestedStructLogs).map(
207
- (structLog) => {
208
- const rpcStructLog: RpcStructLog = structLog;
209
-
210
- // geth doesn't return this value
211
- delete rpcStructLog.memSize;
212
-
213
- if (this._config?.disableMemory === true) {
214
- delete rpcStructLog.memory;
215
- }
216
- if (this._config?.disableStack === true) {
217
- delete rpcStructLog.stack;
218
- }
219
- if (this._config?.disableStorage === true) {
220
- delete rpcStructLog.storage;
221
- }
222
-
223
- return rpcStructLog;
224
- }
225
- );
226
-
227
- // geth does this for some reason
228
- if (
229
- rpcStructLogs.length > 0 &&
230
- result.execResult.exceptionError?.error === "out of gas"
231
- ) {
232
- rpcStructLogs[rpcStructLogs.length - 1].error = {};
233
- }
234
-
235
- this._lastTrace = {
236
- gas: Number(result.totalGasSpent),
237
- failed: result.execResult.exceptionError !== undefined,
238
- returnValue: Buffer.from(result.execResult.returnValue).toString("hex"),
239
- structLogs: rpcStructLogs,
240
- };
241
-
242
- next();
243
- }
244
-
245
- private async _messageToNestedStructLogs(
246
- message: DebugMessage,
247
- address: string
248
- ): Promise<NestedStructLogs> {
249
- const nestedStructLogs: NestedStructLogs = [];
250
-
251
- for (const [i, messageOrStructLog] of message.structLogs.entries()) {
252
- if (isStructLog(messageOrStructLog)) {
253
- const structLog: StructLog = messageOrStructLog;
254
-
255
- nestedStructLogs.push(structLog);
256
-
257
- // update the storage of the current address
258
- const addressStorage = this._addressToStorage[address] ?? {};
259
- structLog.storage = {
260
- ...addressStorage,
261
- ...structLog.storage,
262
- };
263
- this._addressToStorage[address] = {
264
- ...structLog.storage,
265
- };
266
-
267
- if (i === 0) {
268
- continue;
269
- }
270
-
271
- let previousStructLog = nestedStructLogs[nestedStructLogs.length - 2];
272
-
273
- if (Array.isArray(previousStructLog)) {
274
- previousStructLog = nestedStructLogs[nestedStructLogs.length - 3];
275
- } else {
276
- // if the previous log is not a message, we update its gasCost
277
- // using the gas difference between both steps
278
- previousStructLog.gasCost = previousStructLog.gas - structLog.gas;
279
- }
280
-
281
- assertHardhatInvariant(
282
- !Array.isArray(previousStructLog),
283
- "There shouldn't be two messages one after another"
284
- );
285
-
286
- // memory opcodes reflect the expanded memory in that step,
287
- // so we correct them
288
- if (
289
- previousStructLog.op === "MSTORE" ||
290
- previousStructLog.op === "MLOAD"
291
- ) {
292
- const memoryLengthDifference =
293
- structLog.memory.length - previousStructLog.memory.length;
294
- for (let k = 0; k < memoryLengthDifference; k++) {
295
- previousStructLog.memory.push(EMPTY_MEMORY_WORD);
296
- }
297
- }
298
- } else {
299
- const subMessage: DebugMessage = messageOrStructLog;
300
-
301
- const lastStructLog = nestedStructLogs[nestedStructLogs.length - 1];
302
-
303
- assertHardhatInvariant(
304
- !Array.isArray(lastStructLog),
305
- "There shouldn't be two messages one after another"
306
- );
307
-
308
- const isDelegateCall = lastStructLog.op === "DELEGATECALL";
309
-
310
- const messageNestedStructLogs = await this._messageToNestedStructLogs(
311
- subMessage,
312
- isDelegateCall ? address : subMessage.to
313
- );
314
-
315
- nestedStructLogs.push(messageNestedStructLogs);
316
- }
317
- }
318
-
319
- return nestedStructLogs;
320
- }
321
-
322
- private _getMemory(step: InterpreterStep): string[] {
323
- const rawMemory =
324
- Buffer.from(step.memory)
325
- .toString("hex")
326
- .match(/.{1,64}/g) ?? [];
327
-
328
- // Remove the additional non allocated memory
329
- return rawMemory.slice(0, Number(step.memoryWordCount));
330
- }
331
-
332
- private _getStack(step: InterpreterStep): string[] {
333
- const stack = step.stack
334
- .slice()
335
- .map((el: bigint) => el.toString(16).padStart(64, "0"));
336
- return stack;
337
- }
338
-
339
- private async _stepToStructLog(step: InterpreterStep): Promise<StructLog> {
340
- const memory = this._getMemory(step);
341
- const stack = this._getStack(step);
342
-
343
- let gasCost = step.opcode.fee;
344
-
345
- let op = step.opcode.name === "KECCAK256" ? "SHA3" : step.opcode.name;
346
- let error: object | undefined;
347
-
348
- const storage: Storage = {};
349
-
350
- if (step.opcode.name === "SLOAD") {
351
- const address = step.address;
352
- const [keyBuffer] = this._getFromStack(stack, 1);
353
- const key: Uint8Array = setLengthLeft(keyBuffer, 32);
354
-
355
- const storageValue = await this._getContractStorage(address, key);
356
-
357
- storage[toWord(key)] = toWord(storageValue);
358
- } else if (step.opcode.name === "SSTORE") {
359
- const [keyBuffer, valueBuffer] = this._getFromStack(stack, 2);
360
- const key = toWord(keyBuffer);
361
- const storageValue = toWord(valueBuffer);
362
-
363
- storage[key] = storageValue;
364
- } else if (step.opcode.name === "REVERT") {
365
- const [offsetBuffer, lengthBuffer] = this._getFromStack(stack, 2);
366
- const length = bytesToBigInt(lengthBuffer);
367
- const offset = bytesToBigInt(offsetBuffer);
368
-
369
- const [gasIncrease, addedWords] = this._memoryExpansion(
370
- BigInt(memory.length),
371
- length + offset
372
- );
373
-
374
- gasCost += Number(gasIncrease);
375
-
376
- for (let i = 0; i < addedWords; i++) {
377
- memory.push(EMPTY_MEMORY_WORD);
378
- }
379
- } else if (step.opcode.name === "CREATE2") {
380
- const [, , memoryUsedBuffer] = this._getFromStack(stack, 3);
381
- const memoryUsed = bytesToBigInt(memoryUsedBuffer);
382
- const sha3ExtraCost =
383
- BigIntUtils.divUp(memoryUsed, 32n) * this._sha3WordGas();
384
- gasCost += Number(sha3ExtraCost);
385
- } else if (
386
- step.opcode.name === "CALL" ||
387
- step.opcode.name === "STATICCALL" ||
388
- step.opcode.name === "DELEGATECALL"
389
- ) {
390
- // this is a port of what geth does to compute the
391
- // gasCost of a *CALL step, with some simplifications
392
- // because we don't support pre-spuriousDragon hardforks
393
- let valueBuffer = Uint8Array.from([]);
394
- let [
395
- callCostBuffer,
396
- recipientAddressBuffer,
397
- inBuffer,
398
- inSizeBuffer,
399
- outBuffer,
400
- outSizeBuffer,
401
- ] = this._getFromStack(stack, 6);
402
-
403
- // CALL has 7 parameters
404
- if (step.opcode.name === "CALL") {
405
- [
406
- callCostBuffer,
407
- recipientAddressBuffer,
408
- valueBuffer,
409
- inBuffer,
410
- inSizeBuffer,
411
- outBuffer,
412
- outSizeBuffer,
413
- ] = this._getFromStack(stack, 7);
414
- }
415
-
416
- const callCost = bytesToBigInt(callCostBuffer);
417
-
418
- const value = bytesToBigInt(valueBuffer);
419
-
420
- const memoryLength = BigInt(memory.length);
421
- const inBN = bytesToBigInt(inBuffer);
422
- const inSizeBN = bytesToBigInt(inSizeBuffer);
423
- const inPosition = inSizeBN === 0n ? inSizeBN : inBN + inSizeBN;
424
- const outBN = bytesToBigInt(outBuffer);
425
- const outSizeBN = bytesToBigInt(outSizeBuffer);
426
- const outPosition = outSizeBN === 0n ? outSizeBN : outBN + outSizeBN;
427
- const memSize = inPosition > outPosition ? inPosition : outPosition;
428
- const toAddress = new Address(recipientAddressBuffer.slice(-20));
429
-
430
- const constantGas = this._callConstantGas();
431
- const availableGas = step.gasLeft - constantGas;
432
-
433
- const [memoryGas] = this._memoryExpansion(memoryLength, memSize);
434
-
435
- const dynamicGas = await this._callDynamicGas(
436
- toAddress,
437
- value,
438
- availableGas,
439
- memoryGas,
440
- callCost
441
- );
442
-
443
- gasCost = Number(constantGas + dynamicGas);
444
- } else if (step.opcode.name === "CALLCODE") {
445
- // finding an existing tx that uses CALLCODE or compiling a contract
446
- // so that it uses this opcode is hard,
447
- // so we just throw
448
- throw new InvalidInputError(
449
- "Transactions that use CALLCODE are not supported by Hardhat's debug_traceTransaction"
450
- );
451
- } else if (step.opcode.name === "INVALID") {
452
- const code = await this._getContractCode(step.codeAddress);
453
-
454
- const opcodeHex = code[step.pc].toString(16);
455
- op = `opcode 0x${opcodeHex} not defined`;
456
- error = {};
457
- }
458
-
459
- const structLog: StructLog = {
460
- pc: step.pc,
461
- op,
462
- gas: Number(step.gasLeft),
463
- gasCost,
464
- depth: step.depth + 1,
465
- stack,
466
- memory,
467
- storage,
468
- memSize: Number(step.memoryWordCount),
469
- };
470
-
471
- if (error !== undefined) {
472
- structLog.error = error;
473
- }
474
-
475
- return structLog;
476
- }
477
-
478
- private _memoryGas(): bigint {
479
- return this._vm.common.param("gasPrices", "memory");
480
- }
481
-
482
- private _sha3WordGas(): bigint {
483
- return this._vm.common.param("gasPrices", "sha3Word");
484
- }
485
-
486
- private _callConstantGas(): bigint {
487
- if (this._vm.common.gteHardfork("berlin")) {
488
- return this._vm.common.param("gasPrices", "warmstorageread");
489
- }
490
-
491
- return this._vm.common.param("gasPrices", "call");
492
- }
493
-
494
- private _callNewAccountGas(): bigint {
495
- return this._vm.common.param("gasPrices", "callNewAccount");
496
- }
497
-
498
- private _callValueTransferGas(): bigint {
499
- return this._vm.common.param("gasPrices", "callValueTransfer");
500
- }
501
-
502
- private _quadCoeffDiv(): bigint {
503
- return this._vm.common.param("gasPrices", "quadCoeffDiv");
504
- }
505
-
506
- private async _isAddressEmpty(address: Address): Promise<boolean> {
507
- const account = await this._vm.stateManager.getAccount(address);
508
- return account?.isEmpty() ?? true;
509
- }
510
-
511
- private _getContractStorage(
512
- address: Address,
513
- key: Uint8Array
514
- ): Promise<Uint8Array> {
515
- return this._vm.stateManager.getContractStorage(address, key);
516
- }
517
-
518
- private _getContractCode(address: Address): Promise<Uint8Array> {
519
- return this._vm.stateManager.getContractCode(address);
520
- }
521
-
522
- private async _callDynamicGas(
523
- address: Address,
524
- value: bigint,
525
- availableGas: bigint,
526
- memoryGas: bigint,
527
- callCost: bigint
528
- ): Promise<bigint> {
529
- // The available gas is reduced when the address is cold
530
- if (this._vm.common.gteHardfork("berlin")) {
531
- const journal = this._vm.evm.journal;
532
- if (!(journal instanceof Journal)) {
533
- throw new Error("evm.journal is not an instance of Journal");
534
- }
535
- const isWarmed = journal.isWarmedAddress(address.toBytes());
536
-
537
- const coldCost =
538
- this._vm.common.param("gasPrices", "coldaccountaccess") -
539
- this._vm.common.param("gasPrices", "warmstorageread");
540
-
541
- // This comment is copied verbatim from geth:
542
- // The WarmStorageReadCostEIP2929 (100) is already deducted in the form of a constant cost, so
543
- // the cost to charge for cold access, if any, is Cold - Warm
544
- if (!isWarmed) {
545
- availableGas -= coldCost;
546
- }
547
- }
548
-
549
- let gas = 0n;
550
-
551
- const transfersValue = value !== 0n;
552
- const addressIsEmpty = await this._isAddressEmpty(address);
553
-
554
- if (transfersValue && addressIsEmpty) {
555
- gas += this._callNewAccountGas();
556
- }
557
-
558
- if (transfersValue) {
559
- gas += this._callValueTransferGas();
560
- }
561
-
562
- gas += memoryGas;
563
-
564
- gas += this._callGas(availableGas, gas, callCost);
565
-
566
- return gas;
567
- }
568
-
569
- private _callGas(
570
- availableGas: bigint,
571
- base: bigint,
572
- callCost: bigint
573
- ): bigint {
574
- availableGas -= base;
575
-
576
- const gas = availableGas - availableGas / 64n;
577
-
578
- if (callCost > gas) {
579
- return gas;
580
- }
581
-
582
- return callCost;
583
- }
584
-
585
- /**
586
- * Returns the increase in gas and the number of added words
587
- */
588
- private _memoryExpansion(
589
- currentWords: bigint,
590
- newSize: bigint
591
- ): [bigint, bigint] {
592
- const currentSize = currentWords * 32n;
593
- const currentWordsLength = (currentSize + 31n) / 32n;
594
- const newWordsLength = (newSize + 31n) / 32n;
595
-
596
- const wordsDiff = newWordsLength - currentWordsLength;
597
-
598
- if (newSize > currentSize) {
599
- const newTotalFee = this._memoryFee(newWordsLength);
600
- const currentTotalFee = this._memoryFee(currentWordsLength);
601
-
602
- const fee = newTotalFee - currentTotalFee;
603
-
604
- return [fee, wordsDiff];
605
- }
606
-
607
- return [0n, 0n];
608
- }
609
-
610
- private _getFromStack(stack: string[], count: number): Uint8Array[] {
611
- return stack
612
- .slice(-count)
613
- .reverse()
614
- .map((value) => `0x${value}`)
615
- .map(toBytes);
616
- }
617
-
618
- private _memoryFee(words: bigint): bigint {
619
- const square = words * words;
620
- const linCoef = words * this._memoryGas();
621
- const quadCoef = square / this._quadCoeffDiv();
622
- const newTotalFee = linCoef + quadCoef;
623
-
624
- return newTotalFee;
625
- }
626
- }
627
-
628
- function toWord(b: Uint8Array): string {
629
- return Buffer.from(b).toString("hex").padStart(64, "0");
630
- }