hardhat 2.19.5 → 2.20.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 (275) hide show
  1. package/builtin-tasks/node.js +3 -3
  2. package/builtin-tasks/node.js.map +1 -1
  3. package/internal/cli/analytics.d.ts.map +1 -1
  4. package/internal/cli/analytics.js +2 -1
  5. package/internal/cli/analytics.js.map +1 -1
  6. package/internal/cli/project-creation.d.ts +1 -1
  7. package/internal/cli/project-creation.js +1 -1
  8. package/internal/constants.d.ts.map +1 -1
  9. package/internal/constants.js +1 -0
  10. package/internal/constants.js.map +1 -1
  11. package/internal/core/config/config-resolution.d.ts.map +1 -1
  12. package/internal/core/config/config-resolution.js +8 -0
  13. package/internal/core/config/config-resolution.js.map +1 -1
  14. package/internal/core/config/config-validation.d.ts.map +1 -1
  15. package/internal/core/config/config-validation.js +10 -0
  16. package/internal/core/config/config-validation.js.map +1 -1
  17. package/internal/core/config/default-config.d.ts.map +1 -1
  18. package/internal/core/config/default-config.js +11 -0
  19. package/internal/core/config/default-config.js.map +1 -1
  20. package/internal/core/jsonrpc/types/base-types.d.ts +1 -1
  21. package/internal/core/jsonrpc/types/base-types.d.ts.map +1 -1
  22. package/internal/core/jsonrpc/types/base-types.js +7 -5
  23. package/internal/core/jsonrpc/types/base-types.js.map +1 -1
  24. package/internal/core/jsonrpc/types/input/callRequest.d.ts +2 -0
  25. package/internal/core/jsonrpc/types/input/callRequest.d.ts.map +1 -1
  26. package/internal/core/jsonrpc/types/input/callRequest.js +2 -0
  27. package/internal/core/jsonrpc/types/input/callRequest.js.map +1 -1
  28. package/internal/core/jsonrpc/types/input/transactionRequest.d.ts +4 -0
  29. package/internal/core/jsonrpc/types/input/transactionRequest.d.ts.map +1 -1
  30. package/internal/core/jsonrpc/types/input/transactionRequest.js +2 -0
  31. package/internal/core/jsonrpc/types/input/transactionRequest.js.map +1 -1
  32. package/internal/core/jsonrpc/types/output/block.d.ts +6 -0
  33. package/internal/core/jsonrpc/types/output/block.d.ts.map +1 -1
  34. package/internal/core/jsonrpc/types/output/block.js +3 -0
  35. package/internal/core/jsonrpc/types/output/block.js.map +1 -1
  36. package/internal/core/providers/accounts.d.ts.map +1 -1
  37. package/internal/core/providers/accounts.js +10 -10
  38. package/internal/core/providers/accounts.js.map +1 -1
  39. package/internal/core/providers/util.js +2 -2
  40. package/internal/core/providers/util.js.map +1 -1
  41. package/internal/hardhat-network/jsonrpc/client.d.ts +3 -3
  42. package/internal/hardhat-network/jsonrpc/client.d.ts.map +1 -1
  43. package/internal/hardhat-network/jsonrpc/client.js +9 -9
  44. package/internal/hardhat-network/jsonrpc/client.js.map +1 -1
  45. package/internal/hardhat-network/provider/BlockchainData.d.ts +5 -5
  46. package/internal/hardhat-network/provider/BlockchainData.d.ts.map +1 -1
  47. package/internal/hardhat-network/provider/BlockchainData.js +10 -10
  48. package/internal/hardhat-network/provider/BlockchainData.js.map +1 -1
  49. package/internal/hardhat-network/provider/HardhatBlockchain.d.ts +7 -0
  50. package/internal/hardhat-network/provider/HardhatBlockchain.d.ts.map +1 -1
  51. package/internal/hardhat-network/provider/HardhatBlockchain.js +14 -2
  52. package/internal/hardhat-network/provider/HardhatBlockchain.js.map +1 -1
  53. package/internal/hardhat-network/provider/TxPool.d.ts +2 -3
  54. package/internal/hardhat-network/provider/TxPool.d.ts.map +1 -1
  55. package/internal/hardhat-network/provider/TxPool.js +16 -16
  56. package/internal/hardhat-network/provider/TxPool.js.map +1 -1
  57. package/internal/hardhat-network/provider/ethereumjs-workarounds.js +1 -1
  58. package/internal/hardhat-network/provider/ethereumjs-workarounds.js.map +1 -1
  59. package/internal/hardhat-network/provider/filter.d.ts +5 -6
  60. package/internal/hardhat-network/provider/filter.d.ts.map +1 -1
  61. package/internal/hardhat-network/provider/filter.js +2 -2
  62. package/internal/hardhat-network/provider/filter.js.map +1 -1
  63. package/internal/hardhat-network/provider/fork/ForkBlockchain.d.ts +7 -0
  64. package/internal/hardhat-network/provider/fork/ForkBlockchain.d.ts.map +1 -1
  65. package/internal/hardhat-network/provider/fork/ForkBlockchain.js +21 -4
  66. package/internal/hardhat-network/provider/fork/ForkBlockchain.js.map +1 -1
  67. package/internal/hardhat-network/provider/fork/ForkStateManager.d.ts +16 -9
  68. package/internal/hardhat-network/provider/fork/ForkStateManager.d.ts.map +1 -1
  69. package/internal/hardhat-network/provider/fork/ForkStateManager.js +42 -25
  70. package/internal/hardhat-network/provider/fork/ForkStateManager.js.map +1 -1
  71. package/internal/hardhat-network/provider/fork/rpcToBlockData.d.ts.map +1 -1
  72. package/internal/hardhat-network/provider/fork/rpcToBlockData.js +3 -0
  73. package/internal/hardhat-network/provider/fork/rpcToBlockData.js.map +1 -1
  74. package/internal/hardhat-network/provider/fork/rpcToTxData.d.ts +2 -2
  75. package/internal/hardhat-network/provider/fork/rpcToTxData.d.ts.map +1 -1
  76. package/internal/hardhat-network/provider/modules/base.js +4 -4
  77. package/internal/hardhat-network/provider/modules/base.js.map +1 -1
  78. package/internal/hardhat-network/provider/modules/eth.d.ts.map +1 -1
  79. package/internal/hardhat-network/provider/modules/eth.js +16 -9
  80. package/internal/hardhat-network/provider/modules/eth.js.map +1 -1
  81. package/internal/hardhat-network/provider/modules/logger.d.ts +1 -1
  82. package/internal/hardhat-network/provider/modules/logger.d.ts.map +1 -1
  83. package/internal/hardhat-network/provider/modules/logger.js +17 -17
  84. package/internal/hardhat-network/provider/modules/logger.js.map +1 -1
  85. package/internal/hardhat-network/provider/node-types.d.ts +17 -13
  86. package/internal/hardhat-network/provider/node-types.d.ts.map +1 -1
  87. package/internal/hardhat-network/provider/node.d.ts +6 -2
  88. package/internal/hardhat-network/provider/node.d.ts.map +1 -1
  89. package/internal/hardhat-network/provider/node.js +148 -79
  90. package/internal/hardhat-network/provider/node.js.map +1 -1
  91. package/internal/hardhat-network/provider/output.d.ts +3 -0
  92. package/internal/hardhat-network/provider/output.d.ts.map +1 -1
  93. package/internal/hardhat-network/provider/output.js +23 -9
  94. package/internal/hardhat-network/provider/output.js.map +1 -1
  95. package/internal/hardhat-network/provider/return-data.d.ts +3 -4
  96. package/internal/hardhat-network/provider/return-data.d.ts.map +1 -1
  97. package/internal/hardhat-network/provider/return-data.js +4 -3
  98. package/internal/hardhat-network/provider/return-data.js.map +1 -1
  99. package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.d.ts +8 -10
  100. package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.d.ts.map +1 -1
  101. package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.js +9 -9
  102. package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.js.map +1 -1
  103. package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.d.ts +8 -10
  104. package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.d.ts.map +1 -1
  105. package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.js +9 -9
  106. package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.js.map +1 -1
  107. package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.d.ts +9 -10
  108. package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.d.ts.map +1 -1
  109. package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.js +6 -7
  110. package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.js.map +1 -1
  111. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.d.ts +5 -6
  112. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.d.ts.map +1 -1
  113. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.js +1 -1
  114. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.js.map +1 -1
  115. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.d.ts +4 -5
  116. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.d.ts.map +1 -1
  117. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.js +1 -1
  118. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.js.map +1 -1
  119. package/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.d.ts +7 -8
  120. package/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.d.ts.map +1 -1
  121. package/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.js +2 -2
  122. package/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.js.map +1 -1
  123. package/internal/hardhat-network/provider/transactions/ReadOnlyValidUnknownTypeTransaction.d.ts +7 -8
  124. package/internal/hardhat-network/provider/transactions/ReadOnlyValidUnknownTypeTransaction.d.ts.map +1 -1
  125. package/internal/hardhat-network/provider/transactions/ReadOnlyValidUnknownTypeTransaction.js +2 -2
  126. package/internal/hardhat-network/provider/transactions/ReadOnlyValidUnknownTypeTransaction.js.map +1 -1
  127. package/internal/hardhat-network/provider/types/HardhatBlockchainInterface.d.ts +4 -5
  128. package/internal/hardhat-network/provider/types/HardhatBlockchainInterface.d.ts.map +1 -1
  129. package/internal/hardhat-network/provider/utils/makeAccount.js +1 -1
  130. package/internal/hardhat-network/provider/utils/makeAccount.js.map +1 -1
  131. package/internal/hardhat-network/provider/utils/makeCommon.d.ts.map +1 -1
  132. package/internal/hardhat-network/provider/utils/makeCommon.js +5 -3
  133. package/internal/hardhat-network/provider/utils/makeCommon.js.map +1 -1
  134. package/internal/hardhat-network/provider/utils/makeFakeSignature.d.ts +2 -2
  135. package/internal/hardhat-network/provider/utils/makeFakeSignature.d.ts.map +1 -1
  136. package/internal/hardhat-network/provider/utils/makeFakeSignature.js +15 -1
  137. package/internal/hardhat-network/provider/utils/makeFakeSignature.js.map +1 -1
  138. package/internal/hardhat-network/provider/utils/makeStateTrie.js +2 -2
  139. package/internal/hardhat-network/provider/utils/makeStateTrie.js.map +1 -1
  140. package/internal/hardhat-network/provider/utils/putGenesisBlock.d.ts +1 -3
  141. package/internal/hardhat-network/provider/utils/putGenesisBlock.d.ts.map +1 -1
  142. package/internal/hardhat-network/provider/utils/putGenesisBlock.js +6 -2
  143. package/internal/hardhat-network/provider/utils/putGenesisBlock.js.map +1 -1
  144. package/internal/hardhat-network/provider/utils/random.d.ts +3 -3
  145. package/internal/hardhat-network/provider/utils/random.d.ts.map +1 -1
  146. package/internal/hardhat-network/provider/utils/random.js +2 -2
  147. package/internal/hardhat-network/provider/utils/random.js.map +1 -1
  148. package/internal/hardhat-network/stack-traces/consoleLogger.js +42 -44
  149. package/internal/hardhat-network/stack-traces/consoleLogger.js.map +1 -1
  150. package/internal/hardhat-network/stack-traces/constants.d.ts +1 -1
  151. package/internal/hardhat-network/stack-traces/constants.js +1 -1
  152. package/internal/hardhat-network/stack-traces/contracts-identifier.js +1 -1
  153. package/internal/hardhat-network/stack-traces/contracts-identifier.js.map +1 -1
  154. package/internal/hardhat-network/stack-traces/debug.js +12 -12
  155. package/internal/hardhat-network/stack-traces/debug.js.map +1 -1
  156. package/internal/hardhat-network/stack-traces/error-inferrer.d.ts.map +1 -1
  157. package/internal/hardhat-network/stack-traces/error-inferrer.js +5 -4
  158. package/internal/hardhat-network/stack-traces/error-inferrer.js.map +1 -1
  159. package/internal/hardhat-network/stack-traces/library-utils.d.ts +4 -4
  160. package/internal/hardhat-network/stack-traces/library-utils.d.ts.map +1 -1
  161. package/internal/hardhat-network/stack-traces/library-utils.js.map +1 -1
  162. package/internal/hardhat-network/stack-traces/message-trace.d.ts +8 -9
  163. package/internal/hardhat-network/stack-traces/message-trace.d.ts.map +1 -1
  164. package/internal/hardhat-network/stack-traces/model.d.ts +5 -5
  165. package/internal/hardhat-network/stack-traces/model.d.ts.map +1 -1
  166. package/internal/hardhat-network/stack-traces/model.js +5 -5
  167. package/internal/hardhat-network/stack-traces/model.js.map +1 -1
  168. package/internal/hardhat-network/stack-traces/solidity-errors.d.ts.map +1 -1
  169. package/internal/hardhat-network/stack-traces/solidity-errors.js +3 -3
  170. package/internal/hardhat-network/stack-traces/solidity-errors.js.map +1 -1
  171. package/internal/hardhat-network/stack-traces/solidity-stack-trace.d.ts +2 -3
  172. package/internal/hardhat-network/stack-traces/solidity-stack-trace.d.ts.map +1 -1
  173. package/internal/hardhat-network/stack-traces/solidityTracer.d.ts.map +1 -1
  174. package/internal/hardhat-network/stack-traces/solidityTracer.js +3 -2
  175. package/internal/hardhat-network/stack-traces/solidityTracer.js.map +1 -1
  176. package/internal/hardhat-network/stack-traces/vm-debug-tracer.d.ts.map +1 -1
  177. package/internal/hardhat-network/stack-traces/vm-debug-tracer.js +34 -28
  178. package/internal/hardhat-network/stack-traces/vm-debug-tracer.js.map +1 -1
  179. package/internal/hardhat-network/stack-traces/vm-tracer.d.ts +1 -2
  180. package/internal/hardhat-network/stack-traces/vm-tracer.d.ts.map +1 -1
  181. package/internal/hardhat-network/stack-traces/vm-tracer.js +9 -9
  182. package/internal/hardhat-network/stack-traces/vm-tracer.js.map +1 -1
  183. package/internal/solidity/compiler/downloader.d.ts.map +1 -1
  184. package/internal/solidity/compiler/downloader.js +2 -2
  185. package/internal/solidity/compiler/downloader.js.map +1 -1
  186. package/internal/solidity/compiler/solc-info.d.ts.map +1 -1
  187. package/internal/solidity/compiler/solc-info.js +1 -0
  188. package/internal/solidity/compiler/solc-info.js.map +1 -1
  189. package/internal/util/abi-helpers.d.ts +2 -3
  190. package/internal/util/abi-helpers.d.ts.map +1 -1
  191. package/internal/util/abi-helpers.js.map +1 -1
  192. package/internal/util/bigint.d.ts +1 -2
  193. package/internal/util/bigint.d.ts.map +1 -1
  194. package/internal/util/bigint.js +2 -2
  195. package/internal/util/bigint.js.map +1 -1
  196. package/internal/util/hardforks.d.ts +2 -1
  197. package/internal/util/hardforks.d.ts.map +1 -1
  198. package/internal/util/hardforks.js +2 -0
  199. package/internal/util/hardforks.js.map +1 -1
  200. package/internal/util/keccak.d.ts +1 -2
  201. package/internal/util/keccak.d.ts.map +1 -1
  202. package/internal/util/keccak.js +1 -1
  203. package/internal/util/keccak.js.map +1 -1
  204. package/package.json +12 -11
  205. package/sample-projects/javascript/contracts/Lock.sol +1 -1
  206. package/sample-projects/javascript/hardhat.config.js +1 -1
  207. package/sample-projects/javascript-esm/contracts/Lock.sol +1 -1
  208. package/sample-projects/javascript-esm/hardhat.config.cjs +1 -1
  209. package/sample-projects/typescript/contracts/Lock.sol +1 -1
  210. package/sample-projects/typescript/hardhat.config.ts +1 -1
  211. package/sample-projects/typescript-viem/contracts/Lock.sol +1 -1
  212. package/sample-projects/typescript-viem/hardhat.config.ts +1 -1
  213. package/src/builtin-tasks/node.ts +8 -4
  214. package/src/internal/cli/analytics.ts +4 -1
  215. package/src/internal/cli/project-creation.ts +1 -1
  216. package/src/internal/constants.ts +1 -0
  217. package/src/internal/core/config/config-resolution.ts +13 -0
  218. package/src/internal/core/config/config-validation.ts +19 -0
  219. package/src/internal/core/config/default-config.ts +11 -0
  220. package/src/internal/core/jsonrpc/types/base-types.ts +12 -7
  221. package/src/internal/core/jsonrpc/types/input/callRequest.ts +3 -0
  222. package/src/internal/core/jsonrpc/types/input/transactionRequest.ts +5 -1
  223. package/src/internal/core/jsonrpc/types/output/block.ts +3 -0
  224. package/src/internal/core/providers/accounts.ts +24 -13
  225. package/src/internal/core/providers/util.ts +2 -2
  226. package/src/internal/hardhat-network/jsonrpc/client.ts +7 -4
  227. package/src/internal/hardhat-network/provider/BlockchainData.ts +6 -6
  228. package/src/internal/hardhat-network/provider/HardhatBlockchain.ts +28 -3
  229. package/src/internal/hardhat-network/provider/TxPool.ts +19 -16
  230. package/src/internal/hardhat-network/provider/ethereumjs-workarounds.ts +4 -5
  231. package/src/internal/hardhat-network/provider/filter.ts +11 -8
  232. package/src/internal/hardhat-network/provider/fork/ForkBlockchain.ts +40 -7
  233. package/src/internal/hardhat-network/provider/fork/ForkStateManager.ts +79 -39
  234. package/src/internal/hardhat-network/provider/fork/rpcToBlockData.ts +3 -0
  235. package/src/internal/hardhat-network/provider/fork/rpcToTxData.ts +2 -2
  236. package/src/internal/hardhat-network/provider/modules/base.ts +5 -5
  237. package/src/internal/hardhat-network/provider/modules/eth.ts +40 -14
  238. package/src/internal/hardhat-network/provider/modules/logger.ts +17 -14
  239. package/src/internal/hardhat-network/provider/node-types.ts +19 -12
  240. package/src/internal/hardhat-network/provider/node.ts +210 -86
  241. package/src/internal/hardhat-network/provider/output.ts +35 -8
  242. package/src/internal/hardhat-network/provider/return-data.ts +6 -5
  243. package/src/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.ts +24 -25
  244. package/src/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.ts +24 -25
  245. package/src/internal/hardhat-network/provider/transactions/FakeSenderTransaction.ts +27 -16
  246. package/src/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.ts +7 -8
  247. package/src/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.ts +6 -5
  248. package/src/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.ts +15 -8
  249. package/src/internal/hardhat-network/provider/transactions/ReadOnlyValidUnknownTypeTransaction.ts +15 -8
  250. package/src/internal/hardhat-network/provider/types/HardhatBlockchainInterface.ts +4 -4
  251. package/src/internal/hardhat-network/provider/utils/makeAccount.ts +2 -2
  252. package/src/internal/hardhat-network/provider/utils/makeCommon.ts +9 -3
  253. package/src/internal/hardhat-network/provider/utils/makeFakeSignature.ts +21 -7
  254. package/src/internal/hardhat-network/provider/utils/makeStateTrie.ts +3 -3
  255. package/src/internal/hardhat-network/provider/utils/putGenesisBlock.ts +10 -5
  256. package/src/internal/hardhat-network/provider/utils/random.ts +5 -5
  257. package/src/internal/hardhat-network/stack-traces/consoleLogger.ts +13 -13
  258. package/src/internal/hardhat-network/stack-traces/constants.ts +1 -1
  259. package/src/internal/hardhat-network/stack-traces/contracts-identifier.ts +4 -4
  260. package/src/internal/hardhat-network/stack-traces/debug.ts +1 -1
  261. package/src/internal/hardhat-network/stack-traces/error-inferrer.ts +6 -5
  262. package/src/internal/hardhat-network/stack-traces/library-utils.ts +6 -6
  263. package/src/internal/hardhat-network/stack-traces/message-trace.ts +8 -8
  264. package/src/internal/hardhat-network/stack-traces/model.ts +5 -5
  265. package/src/internal/hardhat-network/stack-traces/solidity-errors.ts +4 -2
  266. package/src/internal/hardhat-network/stack-traces/solidity-stack-trace.ts +2 -2
  267. package/src/internal/hardhat-network/stack-traces/solidityTracer.ts +3 -2
  268. package/src/internal/hardhat-network/stack-traces/vm-debug-tracer.ts +49 -38
  269. package/src/internal/hardhat-network/stack-traces/vm-tracer.ts +15 -13
  270. package/src/internal/solidity/compiler/downloader.ts +3 -2
  271. package/src/internal/solidity/compiler/solc-info.ts +1 -0
  272. package/src/internal/util/abi-helpers.ts +2 -2
  273. package/src/internal/util/bigint.ts +4 -4
  274. package/src/internal/util/hardforks.ts +2 -0
  275. package/src/internal/util/keccak.ts +2 -2
@@ -1,36 +1,38 @@
1
1
  import { Block, HeaderData } from "@nomicfoundation/ethereumjs-block";
2
- import { Common, CustomCommonOpts } from "@nomicfoundation/ethereumjs-common";
2
+ import {
3
+ Common,
4
+ EVMStateManagerInterface,
5
+ } from "@nomicfoundation/ethereumjs-common";
6
+ import { ERROR } from "@nomicfoundation/ethereumjs-evm/dist/cjs/exceptions";
3
7
  import {
4
8
  AccessListEIP2930Transaction,
5
9
  FeeMarketEIP1559Transaction,
6
- Transaction,
10
+ LegacyTransaction,
7
11
  TypedTransaction,
12
+ BlobEIP4844Transaction,
8
13
  } from "@nomicfoundation/ethereumjs-tx";
9
14
  import {
10
15
  Address,
11
16
  ECDSASignature,
12
- bigIntToBuffer,
13
- bufferToHex,
17
+ bigIntToBytes,
18
+ bytesToHex as bufferToHex,
14
19
  ecsign,
20
+ equalsBytes,
15
21
  hashPersonalMessage,
16
22
  privateToAddress,
17
23
  setLengthLeft,
18
- toBuffer,
19
- bufferToBigInt,
24
+ toBytes,
25
+ bytesToBigInt,
26
+ Account,
20
27
  } from "@nomicfoundation/ethereumjs-util";
21
28
  import {
22
29
  Bloom,
23
- EEI,
24
30
  RunBlockResult,
25
31
  RunTxResult,
26
32
  VM,
27
33
  } from "@nomicfoundation/ethereumjs-vm";
28
34
  import { EVM, EVMResult } from "@nomicfoundation/ethereumjs-evm";
29
- import { ERROR } from "@nomicfoundation/ethereumjs-evm/dist/exceptions";
30
- import {
31
- DefaultStateManager,
32
- StateManager,
33
- } from "@nomicfoundation/ethereumjs-statemanager";
35
+ import { DefaultStateManager } from "@nomicfoundation/ethereumjs-statemanager";
34
36
  import { SignTypedDataVersion, signTypedData } from "@metamask/eth-sig-util";
35
37
  import chalk from "chalk";
36
38
  import { randomBytes } from "crypto";
@@ -132,6 +134,10 @@ import { RandomBufferGenerator } from "./utils/random";
132
134
 
133
135
  type ExecResult = EVMResult["execResult"];
134
136
 
137
+ const BEACON_ROOT_ADDRESS = "0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02";
138
+ const BEACON_ROOT_BYTECODE =
139
+ "0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500";
140
+
135
141
  const log = debug("hardhat:core:hardhat-network:node");
136
142
 
137
143
  /* eslint-disable @nomicfoundation/hardhat-internal-rules/only-hardhat-error */
@@ -156,7 +162,7 @@ export class HardhatNode extends EventEmitter {
156
162
  const allowUnlimitedContractSize =
157
163
  config.allowUnlimitedContractSize ?? false;
158
164
 
159
- let stateManager: StateManager;
165
+ let stateManager: EVMStateManagerInterface;
160
166
  let blockchain: HardhatBlockchainInterface;
161
167
  let initialBlockTimeOffset: bigint | undefined;
162
168
  let nextBlockBaseFeePerGas: bigint | undefined;
@@ -172,6 +178,10 @@ export class HardhatNode extends EventEmitter {
172
178
 
173
179
  const hardfork = getHardforkName(config.hardfork);
174
180
  const mixHashGenerator = RandomBufferGenerator.create("randomMixHashSeed");
181
+ const parentBeaconBlockRootGenerator = RandomBufferGenerator.create(
182
+ "randomParentBeaconBlockRootSeed"
183
+ );
184
+
175
185
  let forkClient: JsonRpcClient | undefined;
176
186
 
177
187
  const common = makeCommon(config);
@@ -200,6 +210,14 @@ export class HardhatNode extends EventEmitter {
200
210
  forkBlockNumber
201
211
  );
202
212
  await forkStateManager.initializeGenesisAccounts(genesisAccounts);
213
+
214
+ if (hardforkGte(hardfork, HardforkName.CANCUN)) {
215
+ await forkStateManager.putContractCode(
216
+ Address.fromString(BEACON_ROOT_ADDRESS),
217
+ Buffer.from(toBytes(BEACON_ROOT_BYTECODE))
218
+ );
219
+ }
220
+
203
221
  stateManager = forkStateManager;
204
222
 
205
223
  blockchain = new ForkBlockchain(forkClient, forkBlockNumber, common);
@@ -236,6 +254,13 @@ export class HardhatNode extends EventEmitter {
236
254
  trie: stateTrie,
237
255
  });
238
256
 
257
+ if (hardforkGte(hardfork, HardforkName.CANCUN)) {
258
+ await stateManager.putContractCode(
259
+ Address.fromString(BEACON_ROOT_ADDRESS),
260
+ Buffer.from(toBytes(BEACON_ROOT_BYTECODE))
261
+ );
262
+ }
263
+
239
264
  const hardhatBlockchain = new HardhatBlockchain(common);
240
265
 
241
266
  const genesisBlockBaseFeePerGas = hardforkGte(
@@ -250,9 +275,10 @@ export class HardhatNode extends EventEmitter {
250
275
  hardhatBlockchain,
251
276
  common,
252
277
  config,
253
- stateTrie,
278
+ await stateManager.getStateRoot(),
254
279
  hardfork,
255
280
  mixHashGenerator.next(),
281
+ parentBeaconBlockRootGenerator.next(),
256
282
  genesisBlockBaseFeePerGas
257
283
  );
258
284
 
@@ -267,11 +293,12 @@ export class HardhatNode extends EventEmitter {
267
293
 
268
294
  const txPool = new TxPool(stateManager, BigInt(blockGasLimit), common);
269
295
 
270
- const eei = new EEI(stateManager, common, blockchain);
271
- const evm = await EVM.create({
272
- eei,
296
+ const evm = new EVM({
273
297
  allowUnlimitedContractSize,
298
+ allowUnlimitedInitCodeSize: allowUnlimitedContractSize,
299
+ blockchain,
274
300
  common,
301
+ stateManager,
275
302
  });
276
303
 
277
304
  const vm = await VM.create({
@@ -282,7 +309,7 @@ export class HardhatNode extends EventEmitter {
282
309
  blockchain,
283
310
  });
284
311
 
285
- const instanceId = bufferToBigInt(randomBytes(32));
312
+ const instanceId = bytesToBigInt(randomBytes(32));
286
313
 
287
314
  const node = new HardhatNode(
288
315
  vm,
@@ -301,6 +328,7 @@ export class HardhatNode extends EventEmitter {
301
328
  hardfork,
302
329
  hardforkActivations,
303
330
  mixHashGenerator,
331
+ parentBeaconBlockRootGenerator,
304
332
  allowUnlimitedContractSize,
305
333
  allowBlocksWithSameTimestamp,
306
334
  tracingConfig,
@@ -339,7 +367,7 @@ The hardfork must be at least spuriousDragon, but ${common.hardfork()} was given
339
367
  return;
340
368
  }
341
369
 
342
- upstreamCommon.setHardforkByBlockNumber(forkBlockNumber);
370
+ upstreamCommon.setHardforkBy({ blockNumber: forkBlockNumber });
343
371
 
344
372
  if (!upstreamCommon.gteHardfork("spuriousDragon")) {
345
373
  throw new InternalError(
@@ -351,7 +379,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
351
379
  }
352
380
  }
353
381
 
354
- private readonly _localAccounts: Map<string, Buffer> = new Map(); // address => private key
382
+ private readonly _localAccounts: Map<string, Uint8Array> = new Map(); // address => private key
355
383
  private readonly _impersonatedAccounts: Set<string> = new Set(); // address
356
384
 
357
385
  private _nextBlockTimestamp: bigint = 0n;
@@ -370,12 +398,12 @@ Hardhat Network's forking functionality only works with blocks from at least spu
370
398
  private _failedStackTraces = 0;
371
399
 
372
400
  // blockNumber => state root
373
- private _irregularStatesByBlockNumber: Map<bigint, Buffer> = new Map();
401
+ private _irregularStatesByBlockNumber: Map<bigint, Uint8Array> = new Map();
374
402
 
375
403
  private constructor(
376
404
  private readonly _vm: VM,
377
405
  private readonly _instanceId: bigint,
378
- private readonly _stateManager: StateManager,
406
+ private readonly _stateManager: EVMStateManagerInterface,
379
407
  private readonly _blockchain: HardhatBlockchainInterface,
380
408
  private readonly _txPool: TxPool,
381
409
  private _automine: boolean,
@@ -389,6 +417,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
389
417
  public readonly hardfork: HardforkName,
390
418
  private readonly _hardforkActivations: HardforkHistoryConfig,
391
419
  private _mixHashGenerator: RandomBufferGenerator,
420
+ private _parentBeaconBlockRootGenerator: RandomBufferGenerator,
392
421
  public readonly allowUnlimitedContractSize: boolean,
393
422
  private _allowBlocksWithSameTimestamp: boolean,
394
423
  tracingConfig?: TracingConfig,
@@ -461,20 +490,25 @@ Hardhat Network's forking functionality only works with blocks from at least spu
461
490
  if (pk !== undefined) {
462
491
  let tx: TypedTransaction;
463
492
 
464
- if ("maxFeePerGas" in txParams) {
493
+ if ("blobs" in txParams) {
494
+ tx = BlobEIP4844Transaction.fromTxData(txParams, {
495
+ common: this._vm.common,
496
+ allowUnlimitedInitCodeSize: true,
497
+ });
498
+ } else if ("maxFeePerGas" in txParams) {
465
499
  tx = FeeMarketEIP1559Transaction.fromTxData(txParams, {
466
- common: this._vm._common,
467
- disableMaxInitCodeSizeCheck: true,
500
+ common: this._vm.common,
501
+ allowUnlimitedInitCodeSize: true,
468
502
  });
469
503
  } else if ("accessList" in txParams) {
470
504
  tx = AccessListEIP2930Transaction.fromTxData(txParams, {
471
- common: this._vm._common,
472
- disableMaxInitCodeSizeCheck: true,
505
+ common: this._vm.common,
506
+ allowUnlimitedInitCodeSize: true,
473
507
  });
474
508
  } else {
475
- tx = Transaction.fromTxData(txParams, {
476
- common: this._vm._common,
477
- disableMaxInitCodeSizeCheck: true,
509
+ tx = LegacyTransaction.fromTxData(txParams, {
510
+ common: this._vm.common,
511
+ allowUnlimitedInitCodeSize: true,
478
512
  });
479
513
  }
480
514
 
@@ -696,7 +730,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
696
730
  this._stateManager.getAccount(address)
697
731
  );
698
732
 
699
- return account.balance;
733
+ return account?.balance ?? 0n;
700
734
  }
701
735
 
702
736
  public async getNextConfirmedNonce(
@@ -707,7 +741,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
707
741
  this._stateManager.getAccount(address)
708
742
  );
709
743
 
710
- return account.nonce;
744
+ return account?.nonce ?? 0n;
711
745
  }
712
746
 
713
747
  public async getAccountNextPendingNonce(address: Address): Promise<bigint> {
@@ -881,10 +915,17 @@ Hardhat Network's forking functionality only works with blocks from at least spu
881
915
  positionIndex: bigint,
882
916
  blockNumberOrPending: bigint | "pending"
883
917
  ): Promise<Buffer> {
884
- const key = setLengthLeft(bigIntToBuffer(positionIndex), 32);
918
+ const key = setLengthLeft(bigIntToBytes(positionIndex), 32);
885
919
 
886
- const data = await this._runInBlockContext(blockNumberOrPending, () =>
887
- this._stateManager.getContractStorage(address, key)
920
+ const data = await this._runInBlockContext(
921
+ blockNumberOrPending,
922
+ async () => {
923
+ const account = await this._stateManager.getAccount(address);
924
+ if (account === undefined) {
925
+ return Uint8Array.from([]);
926
+ }
927
+ return this._stateManager.getContractStorage(address, key);
928
+ }
888
929
  );
889
930
 
890
931
  const EXPECTED_DATA_SIZE = 32;
@@ -895,7 +936,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
895
936
  );
896
937
  }
897
938
 
898
- return data;
939
+ return Buffer.from(data);
899
940
  }
900
941
 
901
942
  public async getBlockByNumber(pending: "pending"): Promise<Block>;
@@ -945,7 +986,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
945
986
  blockNumberOrPending: bigint | "pending"
946
987
  ): Promise<Buffer> {
947
988
  return this._runInBlockContext(blockNumberOrPending, () =>
948
- this._stateManager.getContractCode(address)
989
+ this._stateManager.getContractCode(address).then(Buffer.from)
949
990
  );
950
991
  }
951
992
 
@@ -1002,9 +1043,9 @@ Hardhat Network's forking functionality only works with blocks from at least spu
1002
1043
  }
1003
1044
 
1004
1045
  public async getTransactionReceipt(
1005
- hash: Buffer | string
1046
+ hash: Uint8Array | string
1006
1047
  ): Promise<RpcReceiptOutput | undefined> {
1007
- const hashBuffer = hash instanceof Buffer ? hash : toBuffer(hash);
1048
+ const hashBuffer = hash instanceof Buffer ? hash : toBytes(hash);
1008
1049
  const receipt = await this._blockchain.getTransactionReceipt(hashBuffer);
1009
1050
  return receipt ?? undefined;
1010
1051
  }
@@ -1032,7 +1073,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
1032
1073
  const privateKey = this._getLocalAccountPrivateKey(address);
1033
1074
 
1034
1075
  return signTypedData({
1035
- privateKey,
1076
+ privateKey: Buffer.from(privateKey),
1036
1077
  version: SignTypedDataVersion.V4,
1037
1078
  data: typedData,
1038
1079
  });
@@ -1058,6 +1099,8 @@ Hardhat Network's forking functionality only works with blocks from at least spu
1058
1099
  this.getUserProvidedNextBlockBaseFeePerGas(),
1059
1100
  coinbase: this.getCoinbaseAddress().toString(),
1060
1101
  mixHashGenerator: this._mixHashGenerator.clone(),
1102
+ parentBeaconBlockRootGenerator:
1103
+ this._parentBeaconBlockRootGenerator.clone(),
1061
1104
  };
1062
1105
 
1063
1106
  this._irregularStatesByBlockNumber = new Map(
@@ -1114,6 +1157,8 @@ Hardhat Network's forking functionality only works with blocks from at least spu
1114
1157
  this._coinbase = snapshot.coinbase;
1115
1158
 
1116
1159
  this._mixHashGenerator = snapshot.mixHashGenerator;
1160
+ this._parentBeaconBlockRootGenerator =
1161
+ snapshot.parentBeaconBlockRootGenerator;
1117
1162
 
1118
1163
  // We delete this and the following snapshots, as they can only be used
1119
1164
  // once in Ganache
@@ -1331,8 +1376,16 @@ Hardhat Network's forking functionality only works with blocks from at least spu
1331
1376
  newBalance: bigint
1332
1377
  ): Promise<void> {
1333
1378
  const account = await this._stateManager.getAccount(address);
1334
- account.balance = newBalance;
1335
- await this._stateManager.putAccount(address, account);
1379
+
1380
+ await this._stateManager.putAccount(
1381
+ address,
1382
+ Account.fromAccountData({
1383
+ nonce: account?.nonce,
1384
+ balance: newBalance,
1385
+ storageRoot: account?.storageRoot,
1386
+ codeHash: account?.codeHash,
1387
+ })
1388
+ );
1336
1389
  await this._persistIrregularWorldState();
1337
1390
  }
1338
1391
 
@@ -1354,13 +1407,21 @@ Hardhat Network's forking functionality only works with blocks from at least spu
1354
1407
  );
1355
1408
  }
1356
1409
  const account = await this._stateManager.getAccount(address);
1357
- if (newNonce < account.nonce) {
1410
+ const accountNonce = account?.nonce ?? 0n;
1411
+ if (newNonce < accountNonce) {
1358
1412
  throw new InvalidInputError(
1359
- `New nonce (${newNonce.toString()}) must not be smaller than the existing nonce (${account.nonce.toString()})`
1413
+ `New nonce (${newNonce.toString()}) must not be smaller than the existing nonce (${accountNonce.toString()})`
1360
1414
  );
1361
1415
  }
1362
- account.nonce = newNonce;
1363
- await this._stateManager.putAccount(address, account);
1416
+ await this._stateManager.putAccount(
1417
+ address,
1418
+ Account.fromAccountData({
1419
+ nonce: newNonce,
1420
+ balance: account?.balance,
1421
+ storageRoot: account?.storageRoot,
1422
+ codeHash: account?.codeHash,
1423
+ })
1424
+ );
1364
1425
  await this._persistIrregularWorldState();
1365
1426
  }
1366
1427
 
@@ -1371,7 +1432,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
1371
1432
  ) {
1372
1433
  await this._stateManager.putContractStorage(
1373
1434
  address,
1374
- setLengthLeft(bigIntToBuffer(positionIndex), 32),
1435
+ setLengthLeft(bigIntToBytes(positionIndex), 32),
1375
1436
  value
1376
1437
  );
1377
1438
  await this._persistIrregularWorldState();
@@ -1427,7 +1488,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
1427
1488
  // to avoid having to distinguish between empty and non-existing accounts.
1428
1489
  // We *could* do it during the non-forked mode, but for simplicity we just
1429
1490
  // don't support it at all.
1430
- const isPreSpuriousDragon = !vm._common.gteHardfork("spuriousDragon");
1491
+ const isPreSpuriousDragon = !vm.common.gteHardfork("spuriousDragon");
1431
1492
  if (isPreSpuriousDragon) {
1432
1493
  throw new InvalidInputError(
1433
1494
  "Tracing is not supported for transactions using hardforks older than Spurious Dragon. "
@@ -1439,19 +1500,19 @@ Hardhat Network's forking functionality only works with blocks from at least spu
1439
1500
  const sender = tx.getSenderAddress();
1440
1501
  if (tx.type === 0) {
1441
1502
  txWithCommon = new FakeSenderTransaction(sender, tx, {
1442
- common: vm._common,
1503
+ common: vm.common,
1443
1504
  });
1444
1505
  } else if (tx.type === 1) {
1445
1506
  txWithCommon = new FakeSenderAccessListEIP2930Transaction(
1446
1507
  sender,
1447
1508
  tx,
1448
- { common: vm._common }
1509
+ { common: vm.common }
1449
1510
  );
1450
1511
  } else if (tx.type === 2) {
1451
1512
  txWithCommon = new FakeSenderEIP1559Transaction(
1452
1513
  sender,
1453
1514
  { ...tx, gasPrice: undefined },
1454
- { common: vm._common }
1515
+ { common: vm.common }
1455
1516
  );
1456
1517
  } else {
1457
1518
  throw new InternalError(
@@ -1460,7 +1521,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
1460
1521
  }
1461
1522
 
1462
1523
  const txHash = txWithCommon.hash();
1463
- if (txHash.equals(hash)) {
1524
+ if (equalsBytes(txHash, hash)) {
1464
1525
  const vmDebugTracer = new VMDebugTracer(vm);
1465
1526
  return vmDebugTracer.trace(async () => {
1466
1527
  await vm.runTx({
@@ -1826,6 +1887,10 @@ Hardhat Network's forking functionality only works with blocks from at least spu
1826
1887
  headerData.mixHash = this._getNextMixHash();
1827
1888
  }
1828
1889
 
1890
+ if (this.isPostCancunHardfork()) {
1891
+ headerData.parentBeaconBlockRoot = this._getNextParentBeaconBlockRoot();
1892
+ }
1893
+
1829
1894
  headerData.baseFeePerGas = await this.getNextBlockBaseFeePerGas();
1830
1895
 
1831
1896
  const blockBuilder = await this._vm.buildBlock({
@@ -1895,7 +1960,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
1895
1960
 
1896
1961
  private _getMinimalTransactionFee(): bigint {
1897
1962
  // Typically 21_000 gas
1898
- return this._vm._common.param("gasPrices", "tx");
1963
+ return this._vm.common.param("gasPrices", "tx");
1899
1964
  }
1900
1965
 
1901
1966
  private async _getFakeTransaction(
@@ -1909,18 +1974,18 @@ Hardhat Network's forking functionality only works with blocks from at least spu
1909
1974
 
1910
1975
  if ("maxFeePerGas" in txParams && txParams.maxFeePerGas !== undefined) {
1911
1976
  return new FakeSenderEIP1559Transaction(sender, txParams, {
1912
- common: this._vm._common,
1977
+ common: this._vm.common,
1913
1978
  });
1914
1979
  }
1915
1980
 
1916
1981
  if ("accessList" in txParams && txParams.accessList !== undefined) {
1917
1982
  return new FakeSenderAccessListEIP2930Transaction(sender, txParams, {
1918
- common: this._vm._common,
1983
+ common: this._vm.common,
1919
1984
  });
1920
1985
  }
1921
1986
 
1922
1987
  return new FakeSenderTransaction(sender, txParams, {
1923
- common: this._vm._common,
1988
+ common: this._vm.common,
1924
1989
  });
1925
1990
  }
1926
1991
 
@@ -1948,7 +2013,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
1948
2013
  }
1949
2014
 
1950
2015
  private _initLocalAccounts(genesisAccounts: GenesisAccount[]) {
1951
- const privateKeys = genesisAccounts.map((acc) => toBuffer(acc.privateKey));
2016
+ const privateKeys = genesisAccounts.map((acc) => toBytes(acc.privateKey));
1952
2017
  for (const pk of privateKeys) {
1953
2018
  this._localAccounts.set(bufferToHex(privateToAddress(pk)), pk);
1954
2019
  }
@@ -2110,7 +2175,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
2110
2175
  });
2111
2176
  }
2112
2177
 
2113
- private _getLocalAccountPrivateKey(sender: Address): Buffer {
2178
+ private _getLocalAccountPrivateKey(sender: Address): Uint8Array {
2114
2179
  const senderAddress = sender.toString();
2115
2180
  if (!this._localAccounts.has(senderAddress)) {
2116
2181
  throw new InvalidInputError(`unknown account ${senderAddress}`);
@@ -2130,7 +2195,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
2130
2195
  const receipts = getRpcReceiptOutputsFromLocalBlockExecution(
2131
2196
  block,
2132
2197
  runBlockResult,
2133
- shouldShowTransactionTypeForHardfork(this._vm._common)
2198
+ shouldShowTransactionTypeForHardfork(this._vm.common)
2134
2199
  );
2135
2200
 
2136
2201
  this._blockchain.addTransactionReceipts(receipts);
@@ -2155,7 +2220,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
2155
2220
  getRpcBlock(
2156
2221
  block,
2157
2222
  td,
2158
- shouldShowTransactionTypeForHardfork(this._vm._common),
2223
+ shouldShowTransactionTypeForHardfork(this._vm.common),
2159
2224
  false
2160
2225
  )
2161
2226
  );
@@ -2257,7 +2322,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
2257
2322
  );
2258
2323
  }
2259
2324
 
2260
- private async _restoreBlockContext(stateRoot: Buffer) {
2325
+ private async _restoreBlockContext(stateRoot: Uint8Array) {
2261
2326
  if (this._stateManager instanceof ForkStateManager) {
2262
2327
  return this._stateManager.restoreForkBlockContext(stateRoot);
2263
2328
  }
@@ -2385,7 +2450,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
2385
2450
  for (const [addrToOverride, stateOverrideOptions] of Object.entries(
2386
2451
  stateOverrideSet
2387
2452
  )) {
2388
- const address = new Address(toBuffer(addrToOverride));
2453
+ const address = new Address(toBytes(addrToOverride));
2389
2454
 
2390
2455
  const { balance, nonce, code, state, stateDiff } = stateOverrideOptions;
2391
2456
 
@@ -2451,8 +2516,8 @@ Hardhat Network's forking functionality only works with blocks from at least spu
2451
2516
  for (const [storageKey, value] of Object.entries(newState)) {
2452
2517
  await this._stateManager.putContractStorage(
2453
2518
  address,
2454
- toBuffer(storageKey),
2455
- setLengthLeft(bigIntToBuffer(value), 32)
2519
+ toBytes(storageKey),
2520
+ setLengthLeft(bigIntToBytes(value), 32)
2456
2521
  );
2457
2522
  }
2458
2523
  }
@@ -2493,9 +2558,14 @@ Hardhat Network's forking functionality only works with blocks from at least spu
2493
2558
  // know anything about the txs in the current block
2494
2559
  }
2495
2560
 
2496
- originalCommon = (this._vm as any)._common;
2561
+ originalCommon = (this._vm as any).common;
2562
+
2563
+ assertTransientStorageCompatibility(
2564
+ this._enableTransientStorage,
2565
+ this._vm.common.hardfork() as HardforkName
2566
+ );
2497
2567
 
2498
- (this._vm as any)._common = Common.custom(
2568
+ (this._vm as any).common = Common.custom(
2499
2569
  {
2500
2570
  chainId:
2501
2571
  this._forkBlockNumber === undefined ||
@@ -2506,7 +2576,6 @@ Hardhat Network's forking functionality only works with blocks from at least spu
2506
2576
  },
2507
2577
  {
2508
2578
  hardfork: this._selectHardfork(blockContext.header.number),
2509
- ...this._getTransientStorageSettings(),
2510
2579
  }
2511
2580
  );
2512
2581
 
@@ -2527,7 +2596,32 @@ Hardhat Network's forking functionality only works with blocks from at least spu
2527
2596
  },
2528
2597
  {
2529
2598
  freeze: false,
2530
- common: this._vm._common,
2599
+ common: this._vm.common,
2600
+
2601
+ skipConsensusFormatValidation: true,
2602
+ }
2603
+ );
2604
+ }
2605
+
2606
+ // If this VM is running without cancun, but the block has cancun fields,
2607
+ // we remove them from the block
2608
+ if (
2609
+ !this.isCancunBlock(blockNumberOrPending) &&
2610
+ blockContext.header.blobGasUsed !== undefined
2611
+ ) {
2612
+ blockContext = Block.fromBlockData(
2613
+ {
2614
+ ...blockContext,
2615
+ header: {
2616
+ ...blockContext.header,
2617
+ blobGasUsed: undefined,
2618
+ excessBlobGas: undefined,
2619
+ parentBeaconBlockRoot: undefined,
2620
+ },
2621
+ },
2622
+ {
2623
+ freeze: false,
2624
+ common: this._vm.common,
2531
2625
 
2532
2626
  skipConsensusFormatValidation: true,
2533
2627
  }
@@ -2553,7 +2647,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
2553
2647
  ) {
2554
2648
  blockContext = Block.fromBlockData(blockContext, {
2555
2649
  freeze: false,
2556
- common: this._vm._common,
2650
+ common: this._vm.common,
2557
2651
 
2558
2652
  skipConsensusFormatValidation: true,
2559
2653
  });
@@ -2571,7 +2665,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
2571
2665
  });
2572
2666
  } finally {
2573
2667
  if (originalCommon !== undefined) {
2574
- (this._vm as any)._common = originalCommon;
2668
+ (this._vm as any).common = originalCommon;
2575
2669
  }
2576
2670
  await this._stateManager.setStateRoot(initialStateRoot);
2577
2671
  }
@@ -2636,7 +2730,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
2636
2730
  return this._runInBlockContext(blockNumberOrPending, async () => {
2637
2731
  const account = await this._stateManager.getAccount(address);
2638
2732
 
2639
- return account.nonce;
2733
+ return account?.nonce ?? 0n;
2640
2734
  });
2641
2735
  }
2642
2736
 
@@ -2673,12 +2767,12 @@ Hardhat Network's forking functionality only works with blocks from at least spu
2673
2767
  blockNumberOrPending !== undefined &&
2674
2768
  blockNumberOrPending !== "pending"
2675
2769
  ) {
2676
- return this._vm._common.hardforkGteHardfork(
2770
+ return this._vm.common.hardforkGteHardfork(
2677
2771
  this._selectHardfork(blockNumberOrPending),
2678
2772
  "london"
2679
2773
  );
2680
2774
  }
2681
- return this._vm._common.gteHardfork("london");
2775
+ return this._vm.common.gteHardfork("london");
2682
2776
  }
2683
2777
 
2684
2778
  public isEip4895Active(blockNumberOrPending?: bigint | "pending"): boolean {
@@ -2686,18 +2780,35 @@ Hardhat Network's forking functionality only works with blocks from at least spu
2686
2780
  blockNumberOrPending !== undefined &&
2687
2781
  blockNumberOrPending !== "pending"
2688
2782
  ) {
2689
- return this._vm._common.hardforkGteHardfork(
2783
+ return this._vm.common.hardforkGteHardfork(
2690
2784
  this._selectHardfork(blockNumberOrPending),
2691
2785
  "shanghai"
2692
2786
  );
2693
2787
  }
2694
- return this._vm._common.gteHardfork("shanghai");
2788
+ return this._vm.common.gteHardfork("shanghai");
2789
+ }
2790
+
2791
+ public isCancunBlock(blockNumberOrPending?: bigint | "pending"): boolean {
2792
+ if (
2793
+ blockNumberOrPending !== undefined &&
2794
+ blockNumberOrPending !== "pending"
2795
+ ) {
2796
+ return this._vm.common.hardforkGteHardfork(
2797
+ this._selectHardfork(blockNumberOrPending),
2798
+ "cancun"
2799
+ );
2800
+ }
2801
+ return this._vm.common.gteHardfork("cancun");
2695
2802
  }
2696
2803
 
2697
2804
  public isPostMergeHardfork(): boolean {
2698
2805
  return hardforkGte(this.hardfork, HardforkName.MERGE);
2699
2806
  }
2700
2807
 
2808
+ public isPostCancunHardfork(): boolean {
2809
+ return hardforkGte(this.hardfork, HardforkName.CANCUN);
2810
+ }
2811
+
2701
2812
  public setPrevRandao(prevRandao: Buffer): void {
2702
2813
  this._mixHashGenerator.setNext(prevRandao);
2703
2814
  }
@@ -2716,7 +2827,9 @@ Hardhat Network's forking functionality only works with blocks from at least spu
2716
2827
 
2717
2828
  const latestBlock = await this.getLatestBlock();
2718
2829
 
2719
- const latestBlockHashHex = latestBlock.header.hash().toString("hex");
2830
+ const latestBlockHashHex = Buffer.from(latestBlock.header.hash()).toString(
2831
+ "hex"
2832
+ );
2720
2833
  const latestBlockHash = `0x${latestBlockHashHex}`;
2721
2834
 
2722
2835
  const metadata: HardhatMetadata = {
@@ -2747,10 +2860,14 @@ Hardhat Network's forking functionality only works with blocks from at least spu
2747
2860
  return metadata;
2748
2861
  }
2749
2862
 
2750
- private _getNextMixHash(): Buffer {
2863
+ private _getNextMixHash(): Uint8Array {
2751
2864
  return this._mixHashGenerator.next();
2752
2865
  }
2753
2866
 
2867
+ private _getNextParentBeaconBlockRoot(): Uint8Array {
2868
+ return this._parentBeaconBlockRootGenerator.next();
2869
+ }
2870
+
2754
2871
  private async _getEstimateGasFeePriceFields(
2755
2872
  callParams: CallParams,
2756
2873
  blockNumberOrPending: bigint | "pending"
@@ -2796,7 +2913,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
2796
2913
  this._forkBlockNumber === undefined ||
2797
2914
  blockNumber >= this._forkBlockNumber
2798
2915
  ) {
2799
- return this._vm._common.hardfork() as HardforkName;
2916
+ return this._vm.common.hardfork() as HardforkName;
2800
2917
  }
2801
2918
 
2802
2919
  if (this._hardforkActivations.size === 0) {
@@ -2835,10 +2952,15 @@ Hardhat Network's forking functionality only works with blocks from at least spu
2835
2952
  );
2836
2953
  }
2837
2954
 
2838
- return hardfork;
2955
+ return hardfork === "merge" ? "mergeForkIdTransition" : hardfork;
2839
2956
  }
2840
2957
 
2841
2958
  private _getCommonForTracing(networkId: number, blockNumber: bigint): Common {
2959
+ assertTransientStorageCompatibility(
2960
+ this._enableTransientStorage,
2961
+ this._vm.common.hardfork() as HardforkName
2962
+ );
2963
+
2842
2964
  try {
2843
2965
  const common = Common.custom(
2844
2966
  {
@@ -2847,7 +2969,6 @@ Hardhat Network's forking functionality only works with blocks from at least spu
2847
2969
  },
2848
2970
  {
2849
2971
  hardfork: this._selectHardfork(BigInt(blockNumber)),
2850
- ...this._getTransientStorageSettings(),
2851
2972
  }
2852
2973
  );
2853
2974
 
@@ -2858,12 +2979,15 @@ Hardhat Network's forking functionality only works with blocks from at least spu
2858
2979
  );
2859
2980
  }
2860
2981
  }
2982
+ }
2861
2983
 
2862
- private _getTransientStorageSettings(): Partial<CustomCommonOpts> {
2863
- if (this._enableTransientStorage) {
2864
- return { eips: [1153] };
2865
- }
2866
-
2867
- return {};
2984
+ export function assertTransientStorageCompatibility(
2985
+ enableTransientStorage: boolean,
2986
+ hardfork: HardforkName
2987
+ ) {
2988
+ if (enableTransientStorage && !hardforkGte(hardfork, HardforkName.CANCUN)) {
2989
+ throw new InternalError(
2990
+ `Transient storage is not compatible with hardfork "${hardfork}". To use transient storage, set the hardfork to "cancun" or later.`
2991
+ );
2868
2992
  }
2869
2993
  }