hardhat 2.19.4 → 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 (317) hide show
  1. package/README.md +6 -0
  2. package/builtin-tasks/compile.js +11 -2
  3. package/builtin-tasks/compile.js.map +1 -1
  4. package/builtin-tasks/node.js +3 -3
  5. package/builtin-tasks/node.js.map +1 -1
  6. package/internal/cli/analytics.d.ts.map +1 -1
  7. package/internal/cli/analytics.js +2 -1
  8. package/internal/cli/analytics.js.map +1 -1
  9. package/internal/cli/cli.js +33 -0
  10. package/internal/cli/cli.js.map +1 -1
  11. package/internal/cli/project-creation.d.ts +1 -1
  12. package/internal/cli/project-creation.js +4 -7
  13. package/internal/cli/project-creation.js.map +1 -1
  14. package/internal/cli/version-notifier.d.ts +2 -0
  15. package/internal/cli/version-notifier.d.ts.map +1 -0
  16. package/internal/cli/version-notifier.js +217 -0
  17. package/internal/cli/version-notifier.js.map +1 -0
  18. package/internal/constants.d.ts.map +1 -1
  19. package/internal/constants.js +1 -0
  20. package/internal/constants.js.map +1 -1
  21. package/internal/core/config/config-loading.d.ts.map +1 -1
  22. package/internal/core/config/config-loading.js +3 -3
  23. package/internal/core/config/config-loading.js.map +1 -1
  24. package/internal/core/config/config-resolution.d.ts.map +1 -1
  25. package/internal/core/config/config-resolution.js +18 -6
  26. package/internal/core/config/config-resolution.js.map +1 -1
  27. package/internal/core/config/config-validation.d.ts +2 -2
  28. package/internal/core/config/config-validation.d.ts.map +1 -1
  29. package/internal/core/config/config-validation.js +12 -2
  30. package/internal/core/config/config-validation.js.map +1 -1
  31. package/internal/core/config/default-config.d.ts.map +1 -1
  32. package/internal/core/config/default-config.js +11 -0
  33. package/internal/core/config/default-config.js.map +1 -1
  34. package/internal/core/jsonrpc/types/base-types.d.ts +1 -1
  35. package/internal/core/jsonrpc/types/base-types.d.ts.map +1 -1
  36. package/internal/core/jsonrpc/types/base-types.js +7 -5
  37. package/internal/core/jsonrpc/types/base-types.js.map +1 -1
  38. package/internal/core/jsonrpc/types/input/callRequest.d.ts +2 -0
  39. package/internal/core/jsonrpc/types/input/callRequest.d.ts.map +1 -1
  40. package/internal/core/jsonrpc/types/input/callRequest.js +2 -0
  41. package/internal/core/jsonrpc/types/input/callRequest.js.map +1 -1
  42. package/internal/core/jsonrpc/types/input/transactionRequest.d.ts +4 -0
  43. package/internal/core/jsonrpc/types/input/transactionRequest.d.ts.map +1 -1
  44. package/internal/core/jsonrpc/types/input/transactionRequest.js +2 -0
  45. package/internal/core/jsonrpc/types/input/transactionRequest.js.map +1 -1
  46. package/internal/core/jsonrpc/types/output/block.d.ts +6 -0
  47. package/internal/core/jsonrpc/types/output/block.d.ts.map +1 -1
  48. package/internal/core/jsonrpc/types/output/block.js +3 -0
  49. package/internal/core/jsonrpc/types/output/block.js.map +1 -1
  50. package/internal/core/providers/accounts.d.ts.map +1 -1
  51. package/internal/core/providers/accounts.js +10 -10
  52. package/internal/core/providers/accounts.js.map +1 -1
  53. package/internal/core/providers/gas-providers.d.ts.map +1 -1
  54. package/internal/core/providers/gas-providers.js +7 -0
  55. package/internal/core/providers/gas-providers.js.map +1 -1
  56. package/internal/core/providers/util.js +2 -2
  57. package/internal/core/providers/util.js.map +1 -1
  58. package/internal/hardhat-network/jsonrpc/client.d.ts +3 -3
  59. package/internal/hardhat-network/jsonrpc/client.d.ts.map +1 -1
  60. package/internal/hardhat-network/jsonrpc/client.js +9 -9
  61. package/internal/hardhat-network/jsonrpc/client.js.map +1 -1
  62. package/internal/hardhat-network/provider/BlockchainData.d.ts +5 -5
  63. package/internal/hardhat-network/provider/BlockchainData.d.ts.map +1 -1
  64. package/internal/hardhat-network/provider/BlockchainData.js +10 -10
  65. package/internal/hardhat-network/provider/BlockchainData.js.map +1 -1
  66. package/internal/hardhat-network/provider/HardhatBlockchain.d.ts +7 -0
  67. package/internal/hardhat-network/provider/HardhatBlockchain.d.ts.map +1 -1
  68. package/internal/hardhat-network/provider/HardhatBlockchain.js +14 -2
  69. package/internal/hardhat-network/provider/HardhatBlockchain.js.map +1 -1
  70. package/internal/hardhat-network/provider/TxPool.d.ts +2 -3
  71. package/internal/hardhat-network/provider/TxPool.d.ts.map +1 -1
  72. package/internal/hardhat-network/provider/TxPool.js +16 -16
  73. package/internal/hardhat-network/provider/TxPool.js.map +1 -1
  74. package/internal/hardhat-network/provider/ethereumjs-workarounds.js +1 -1
  75. package/internal/hardhat-network/provider/ethereumjs-workarounds.js.map +1 -1
  76. package/internal/hardhat-network/provider/filter.d.ts +5 -6
  77. package/internal/hardhat-network/provider/filter.d.ts.map +1 -1
  78. package/internal/hardhat-network/provider/filter.js +2 -2
  79. package/internal/hardhat-network/provider/filter.js.map +1 -1
  80. package/internal/hardhat-network/provider/fork/ForkBlockchain.d.ts +7 -0
  81. package/internal/hardhat-network/provider/fork/ForkBlockchain.d.ts.map +1 -1
  82. package/internal/hardhat-network/provider/fork/ForkBlockchain.js +21 -4
  83. package/internal/hardhat-network/provider/fork/ForkBlockchain.js.map +1 -1
  84. package/internal/hardhat-network/provider/fork/ForkStateManager.d.ts +16 -9
  85. package/internal/hardhat-network/provider/fork/ForkStateManager.d.ts.map +1 -1
  86. package/internal/hardhat-network/provider/fork/ForkStateManager.js +42 -25
  87. package/internal/hardhat-network/provider/fork/ForkStateManager.js.map +1 -1
  88. package/internal/hardhat-network/provider/fork/rpcToBlockData.d.ts.map +1 -1
  89. package/internal/hardhat-network/provider/fork/rpcToBlockData.js +3 -0
  90. package/internal/hardhat-network/provider/fork/rpcToBlockData.js.map +1 -1
  91. package/internal/hardhat-network/provider/fork/rpcToTxData.d.ts +2 -2
  92. package/internal/hardhat-network/provider/fork/rpcToTxData.d.ts.map +1 -1
  93. package/internal/hardhat-network/provider/modules/base.js +4 -4
  94. package/internal/hardhat-network/provider/modules/base.js.map +1 -1
  95. package/internal/hardhat-network/provider/modules/eth.d.ts.map +1 -1
  96. package/internal/hardhat-network/provider/modules/eth.js +16 -9
  97. package/internal/hardhat-network/provider/modules/eth.js.map +1 -1
  98. package/internal/hardhat-network/provider/modules/logger.d.ts +1 -1
  99. package/internal/hardhat-network/provider/modules/logger.d.ts.map +1 -1
  100. package/internal/hardhat-network/provider/modules/logger.js +17 -17
  101. package/internal/hardhat-network/provider/modules/logger.js.map +1 -1
  102. package/internal/hardhat-network/provider/node-types.d.ts +17 -13
  103. package/internal/hardhat-network/provider/node-types.d.ts.map +1 -1
  104. package/internal/hardhat-network/provider/node.d.ts +6 -2
  105. package/internal/hardhat-network/provider/node.d.ts.map +1 -1
  106. package/internal/hardhat-network/provider/node.js +148 -79
  107. package/internal/hardhat-network/provider/node.js.map +1 -1
  108. package/internal/hardhat-network/provider/output.d.ts +3 -0
  109. package/internal/hardhat-network/provider/output.d.ts.map +1 -1
  110. package/internal/hardhat-network/provider/output.js +23 -9
  111. package/internal/hardhat-network/provider/output.js.map +1 -1
  112. package/internal/hardhat-network/provider/return-data.d.ts +3 -4
  113. package/internal/hardhat-network/provider/return-data.d.ts.map +1 -1
  114. package/internal/hardhat-network/provider/return-data.js +4 -3
  115. package/internal/hardhat-network/provider/return-data.js.map +1 -1
  116. package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.d.ts +8 -10
  117. package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.d.ts.map +1 -1
  118. package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.js +9 -9
  119. package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.js.map +1 -1
  120. package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.d.ts +8 -10
  121. package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.d.ts.map +1 -1
  122. package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.js +9 -9
  123. package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.js.map +1 -1
  124. package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.d.ts +9 -10
  125. package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.d.ts.map +1 -1
  126. package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.js +6 -7
  127. package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.js.map +1 -1
  128. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.d.ts +5 -6
  129. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.d.ts.map +1 -1
  130. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.js +1 -1
  131. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.js.map +1 -1
  132. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.d.ts +4 -5
  133. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.d.ts.map +1 -1
  134. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.js +1 -1
  135. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.js.map +1 -1
  136. package/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.d.ts +7 -8
  137. package/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.d.ts.map +1 -1
  138. package/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.js +2 -2
  139. package/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.js.map +1 -1
  140. package/internal/hardhat-network/provider/transactions/ReadOnlyValidUnknownTypeTransaction.d.ts +7 -8
  141. package/internal/hardhat-network/provider/transactions/ReadOnlyValidUnknownTypeTransaction.d.ts.map +1 -1
  142. package/internal/hardhat-network/provider/transactions/ReadOnlyValidUnknownTypeTransaction.js +2 -2
  143. package/internal/hardhat-network/provider/transactions/ReadOnlyValidUnknownTypeTransaction.js.map +1 -1
  144. package/internal/hardhat-network/provider/types/HardhatBlockchainInterface.d.ts +4 -5
  145. package/internal/hardhat-network/provider/types/HardhatBlockchainInterface.d.ts.map +1 -1
  146. package/internal/hardhat-network/provider/utils/makeAccount.js +1 -1
  147. package/internal/hardhat-network/provider/utils/makeAccount.js.map +1 -1
  148. package/internal/hardhat-network/provider/utils/makeCommon.d.ts.map +1 -1
  149. package/internal/hardhat-network/provider/utils/makeCommon.js +5 -3
  150. package/internal/hardhat-network/provider/utils/makeCommon.js.map +1 -1
  151. package/internal/hardhat-network/provider/utils/makeFakeSignature.d.ts +2 -2
  152. package/internal/hardhat-network/provider/utils/makeFakeSignature.d.ts.map +1 -1
  153. package/internal/hardhat-network/provider/utils/makeFakeSignature.js +15 -1
  154. package/internal/hardhat-network/provider/utils/makeFakeSignature.js.map +1 -1
  155. package/internal/hardhat-network/provider/utils/makeStateTrie.js +2 -2
  156. package/internal/hardhat-network/provider/utils/makeStateTrie.js.map +1 -1
  157. package/internal/hardhat-network/provider/utils/putGenesisBlock.d.ts +1 -3
  158. package/internal/hardhat-network/provider/utils/putGenesisBlock.d.ts.map +1 -1
  159. package/internal/hardhat-network/provider/utils/putGenesisBlock.js +6 -2
  160. package/internal/hardhat-network/provider/utils/putGenesisBlock.js.map +1 -1
  161. package/internal/hardhat-network/provider/utils/random.d.ts +3 -3
  162. package/internal/hardhat-network/provider/utils/random.d.ts.map +1 -1
  163. package/internal/hardhat-network/provider/utils/random.js +2 -2
  164. package/internal/hardhat-network/provider/utils/random.js.map +1 -1
  165. package/internal/hardhat-network/stack-traces/consoleLogger.js +42 -44
  166. package/internal/hardhat-network/stack-traces/consoleLogger.js.map +1 -1
  167. package/internal/hardhat-network/stack-traces/constants.d.ts +1 -1
  168. package/internal/hardhat-network/stack-traces/constants.js +1 -1
  169. package/internal/hardhat-network/stack-traces/contracts-identifier.js +1 -1
  170. package/internal/hardhat-network/stack-traces/contracts-identifier.js.map +1 -1
  171. package/internal/hardhat-network/stack-traces/debug.js +12 -12
  172. package/internal/hardhat-network/stack-traces/debug.js.map +1 -1
  173. package/internal/hardhat-network/stack-traces/error-inferrer.d.ts.map +1 -1
  174. package/internal/hardhat-network/stack-traces/error-inferrer.js +5 -4
  175. package/internal/hardhat-network/stack-traces/error-inferrer.js.map +1 -1
  176. package/internal/hardhat-network/stack-traces/library-utils.d.ts +4 -4
  177. package/internal/hardhat-network/stack-traces/library-utils.d.ts.map +1 -1
  178. package/internal/hardhat-network/stack-traces/library-utils.js.map +1 -1
  179. package/internal/hardhat-network/stack-traces/message-trace.d.ts +8 -9
  180. package/internal/hardhat-network/stack-traces/message-trace.d.ts.map +1 -1
  181. package/internal/hardhat-network/stack-traces/model.d.ts +5 -5
  182. package/internal/hardhat-network/stack-traces/model.d.ts.map +1 -1
  183. package/internal/hardhat-network/stack-traces/model.js +5 -5
  184. package/internal/hardhat-network/stack-traces/model.js.map +1 -1
  185. package/internal/hardhat-network/stack-traces/panic-errors.js +1 -1
  186. package/internal/hardhat-network/stack-traces/panic-errors.js.map +1 -1
  187. package/internal/hardhat-network/stack-traces/solidity-errors.d.ts.map +1 -1
  188. package/internal/hardhat-network/stack-traces/solidity-errors.js +3 -3
  189. package/internal/hardhat-network/stack-traces/solidity-errors.js.map +1 -1
  190. package/internal/hardhat-network/stack-traces/solidity-stack-trace.d.ts +2 -3
  191. package/internal/hardhat-network/stack-traces/solidity-stack-trace.d.ts.map +1 -1
  192. package/internal/hardhat-network/stack-traces/solidityTracer.d.ts.map +1 -1
  193. package/internal/hardhat-network/stack-traces/solidityTracer.js +3 -2
  194. package/internal/hardhat-network/stack-traces/solidityTracer.js.map +1 -1
  195. package/internal/hardhat-network/stack-traces/vm-debug-tracer.d.ts.map +1 -1
  196. package/internal/hardhat-network/stack-traces/vm-debug-tracer.js +34 -28
  197. package/internal/hardhat-network/stack-traces/vm-debug-tracer.js.map +1 -1
  198. package/internal/hardhat-network/stack-traces/vm-tracer.d.ts +1 -2
  199. package/internal/hardhat-network/stack-traces/vm-tracer.d.ts.map +1 -1
  200. package/internal/hardhat-network/stack-traces/vm-tracer.js +9 -9
  201. package/internal/hardhat-network/stack-traces/vm-tracer.js.map +1 -1
  202. package/internal/solidity/compiler/downloader.d.ts.map +1 -1
  203. package/internal/solidity/compiler/downloader.js +4 -4
  204. package/internal/solidity/compiler/downloader.js.map +1 -1
  205. package/internal/solidity/compiler/index.d.ts +2 -1
  206. package/internal/solidity/compiler/index.d.ts.map +1 -1
  207. package/internal/solidity/compiler/index.js +25 -2
  208. package/internal/solidity/compiler/index.js.map +1 -1
  209. package/internal/solidity/compiler/solc-info.d.ts.map +1 -1
  210. package/internal/solidity/compiler/solc-info.js +1 -0
  211. package/internal/solidity/compiler/solc-info.js.map +1 -1
  212. package/internal/util/abi-helpers.d.ts +2 -3
  213. package/internal/util/abi-helpers.d.ts.map +1 -1
  214. package/internal/util/abi-helpers.js.map +1 -1
  215. package/internal/util/bigint.d.ts +1 -2
  216. package/internal/util/bigint.d.ts.map +1 -1
  217. package/internal/util/bigint.js +2 -2
  218. package/internal/util/bigint.js.map +1 -1
  219. package/internal/util/fs-utils.d.ts +1 -1
  220. package/internal/util/fs-utils.js +1 -1
  221. package/internal/util/hardforks.d.ts +2 -1
  222. package/internal/util/hardforks.d.ts.map +1 -1
  223. package/internal/util/hardforks.js +2 -0
  224. package/internal/util/hardforks.js.map +1 -1
  225. package/internal/util/keccak.d.ts +1 -2
  226. package/internal/util/keccak.d.ts.map +1 -1
  227. package/internal/util/keccak.js +1 -1
  228. package/internal/util/keccak.js.map +1 -1
  229. package/internal/util/multi-process-mutex.d.ts +12 -0
  230. package/internal/util/multi-process-mutex.d.ts.map +1 -0
  231. package/internal/util/multi-process-mutex.js +116 -0
  232. package/internal/util/multi-process-mutex.js.map +1 -0
  233. package/internal/util/report-telemetry-consent.js +3 -1
  234. package/internal/util/report-telemetry-consent.js.map +1 -1
  235. package/package.json +13 -11
  236. package/sample-projects/javascript/contracts/Lock.sol +1 -1
  237. package/sample-projects/javascript/hardhat.config.js +1 -1
  238. package/sample-projects/javascript-esm/contracts/Lock.sol +1 -1
  239. package/sample-projects/javascript-esm/hardhat.config.cjs +1 -1
  240. package/sample-projects/typescript/contracts/Lock.sol +1 -1
  241. package/sample-projects/typescript/hardhat.config.ts +1 -1
  242. package/sample-projects/typescript-viem/contracts/Lock.sol +1 -1
  243. package/sample-projects/typescript-viem/hardhat.config.ts +1 -1
  244. package/src/builtin-tasks/compile.ts +20 -2
  245. package/src/builtin-tasks/node.ts +8 -4
  246. package/src/internal/cli/analytics.ts +4 -1
  247. package/src/internal/cli/cli.ts +13 -1
  248. package/src/internal/cli/project-creation.ts +5 -10
  249. package/src/internal/cli/version-notifier.ts +268 -0
  250. package/src/internal/constants.ts +1 -0
  251. package/src/internal/core/config/config-loading.ts +2 -1
  252. package/src/internal/core/config/config-resolution.ts +20 -1
  253. package/src/internal/core/config/config-validation.ts +28 -2
  254. package/src/internal/core/config/default-config.ts +11 -0
  255. package/src/internal/core/jsonrpc/types/base-types.ts +12 -7
  256. package/src/internal/core/jsonrpc/types/input/callRequest.ts +3 -0
  257. package/src/internal/core/jsonrpc/types/input/transactionRequest.ts +5 -1
  258. package/src/internal/core/jsonrpc/types/output/block.ts +3 -0
  259. package/src/internal/core/providers/accounts.ts +24 -13
  260. package/src/internal/core/providers/gas-providers.ts +8 -0
  261. package/src/internal/core/providers/util.ts +2 -2
  262. package/src/internal/hardhat-network/jsonrpc/client.ts +7 -4
  263. package/src/internal/hardhat-network/provider/BlockchainData.ts +6 -6
  264. package/src/internal/hardhat-network/provider/HardhatBlockchain.ts +28 -3
  265. package/src/internal/hardhat-network/provider/TxPool.ts +19 -16
  266. package/src/internal/hardhat-network/provider/ethereumjs-workarounds.ts +4 -5
  267. package/src/internal/hardhat-network/provider/filter.ts +11 -8
  268. package/src/internal/hardhat-network/provider/fork/ForkBlockchain.ts +40 -7
  269. package/src/internal/hardhat-network/provider/fork/ForkStateManager.ts +79 -39
  270. package/src/internal/hardhat-network/provider/fork/rpcToBlockData.ts +3 -0
  271. package/src/internal/hardhat-network/provider/fork/rpcToTxData.ts +2 -2
  272. package/src/internal/hardhat-network/provider/modules/base.ts +5 -5
  273. package/src/internal/hardhat-network/provider/modules/eth.ts +40 -14
  274. package/src/internal/hardhat-network/provider/modules/logger.ts +17 -14
  275. package/src/internal/hardhat-network/provider/node-types.ts +19 -12
  276. package/src/internal/hardhat-network/provider/node.ts +210 -86
  277. package/src/internal/hardhat-network/provider/output.ts +35 -8
  278. package/src/internal/hardhat-network/provider/return-data.ts +6 -5
  279. package/src/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.ts +24 -25
  280. package/src/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.ts +24 -25
  281. package/src/internal/hardhat-network/provider/transactions/FakeSenderTransaction.ts +27 -16
  282. package/src/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.ts +7 -8
  283. package/src/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.ts +6 -5
  284. package/src/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.ts +15 -8
  285. package/src/internal/hardhat-network/provider/transactions/ReadOnlyValidUnknownTypeTransaction.ts +15 -8
  286. package/src/internal/hardhat-network/provider/types/HardhatBlockchainInterface.ts +4 -4
  287. package/src/internal/hardhat-network/provider/utils/makeAccount.ts +2 -2
  288. package/src/internal/hardhat-network/provider/utils/makeCommon.ts +9 -3
  289. package/src/internal/hardhat-network/provider/utils/makeFakeSignature.ts +21 -7
  290. package/src/internal/hardhat-network/provider/utils/makeStateTrie.ts +3 -3
  291. package/src/internal/hardhat-network/provider/utils/putGenesisBlock.ts +10 -5
  292. package/src/internal/hardhat-network/provider/utils/random.ts +5 -5
  293. package/src/internal/hardhat-network/stack-traces/consoleLogger.ts +13 -13
  294. package/src/internal/hardhat-network/stack-traces/constants.ts +1 -1
  295. package/src/internal/hardhat-network/stack-traces/contracts-identifier.ts +4 -4
  296. package/src/internal/hardhat-network/stack-traces/debug.ts +1 -1
  297. package/src/internal/hardhat-network/stack-traces/error-inferrer.ts +6 -5
  298. package/src/internal/hardhat-network/stack-traces/library-utils.ts +6 -6
  299. package/src/internal/hardhat-network/stack-traces/message-trace.ts +8 -8
  300. package/src/internal/hardhat-network/stack-traces/model.ts +5 -5
  301. package/src/internal/hardhat-network/stack-traces/panic-errors.ts +1 -1
  302. package/src/internal/hardhat-network/stack-traces/solidity-errors.ts +4 -2
  303. package/src/internal/hardhat-network/stack-traces/solidity-stack-trace.ts +2 -2
  304. package/src/internal/hardhat-network/stack-traces/solidityTracer.ts +3 -2
  305. package/src/internal/hardhat-network/stack-traces/vm-debug-tracer.ts +49 -38
  306. package/src/internal/hardhat-network/stack-traces/vm-tracer.ts +15 -13
  307. package/src/internal/sentry/transport.ts +1 -1
  308. package/src/internal/solidity/compiler/downloader.ts +5 -4
  309. package/src/internal/solidity/compiler/index.ts +22 -2
  310. package/src/internal/solidity/compiler/solc-info.ts +1 -0
  311. package/src/internal/util/abi-helpers.ts +2 -2
  312. package/src/internal/util/bigint.ts +4 -4
  313. package/src/internal/util/fs-utils.ts +1 -1
  314. package/src/internal/util/hardforks.ts +2 -0
  315. package/src/internal/util/keccak.ts +2 -2
  316. package/src/internal/util/multi-process-mutex.ts +133 -0
  317. package/src/internal/util/report-telemetry-consent.ts +4 -1
@@ -0,0 +1,268 @@
1
+ import boxen from "boxen";
2
+ import chalk from "chalk";
3
+ import fsExtra from "fs-extra";
4
+ import { join } from "node:path";
5
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
6
+ import semver from "semver";
7
+
8
+ import { getCacheDir } from "../util/global-dir";
9
+ import { getHardhatVersion } from "../util/packageInfo";
10
+
11
+ const GITHUB_API_URL = "https://api.github.com";
12
+ const GITHUB_OWNER = "NomicFoundation";
13
+ const GITHUB_REPO = "hardhat";
14
+ const V3_RELEASE_TAG = "hardhat@3.0.0";
15
+ const V3_RELEASE_VERSION_NOTIFIER_ASSET_NAME = "version-notifier-message.txt";
16
+ const V3_RELEASE_MAX_TIMES_SHOWN = 5;
17
+ const CURRENT_HARDHAT_MAJOR_VERSION = 2;
18
+
19
+ const boxenOptions = {
20
+ padding: 1,
21
+ borderStyle: "round",
22
+ borderColor: "yellow",
23
+ } as const;
24
+
25
+ interface VersionNotifierCache {
26
+ lastCheck: string | 0;
27
+ v3TimesShown: number;
28
+ v3Release?: Release;
29
+ v3ReleaseMessage?: string;
30
+ }
31
+
32
+ /* eslint-disable @typescript-eslint/naming-convention */
33
+ interface Release {
34
+ name: string;
35
+ tag_name: string;
36
+ draft: boolean;
37
+ prerelease: boolean;
38
+ published_at: string;
39
+ html_url: string;
40
+ assets: Array<{
41
+ name: string;
42
+ browser_download_url: string;
43
+ }>;
44
+ body: string; // release notes
45
+ }
46
+ /* eslint-enable @typescript-eslint/naming-convention */
47
+
48
+ export async function showNewVersionNotification() {
49
+ const cache = await readCache();
50
+
51
+ const lastCheckDate = new Date(cache.lastCheck);
52
+ const now = new Date();
53
+ const oneDay = 1000 * 60 * 60 * 24;
54
+
55
+ if (now.getTime() - lastCheckDate.getTime() < oneDay) {
56
+ return;
57
+ }
58
+
59
+ const hardhatVersion = getHardhatVersion();
60
+
61
+ const releases = await getReleases();
62
+
63
+ const sortedV2Versions = releases
64
+ // filter and map releases to versions
65
+ .flatMap((release) => {
66
+ const [packageName, rawPackageVersion] = release.tag_name.split("@");
67
+
68
+ const packageVersion = semver.valid(rawPackageVersion);
69
+
70
+ // filter out a release if:
71
+ // - it's not a hardhat-core release
72
+ // - it's a draft or a prerelease
73
+ // - the version is invalid
74
+ // - the major version is not the current major
75
+ if (
76
+ packageName !== GITHUB_REPO ||
77
+ release.draft ||
78
+ release.prerelease ||
79
+ packageVersion === null ||
80
+ semver.major(packageVersion) !== CURRENT_HARDHAT_MAJOR_VERSION
81
+ ) {
82
+ return [];
83
+ }
84
+
85
+ return [packageVersion];
86
+ })
87
+ // sort in descending order by version
88
+ .sort((releaseAVersion, releaseBVersion) => {
89
+ return semver.rcompare(releaseAVersion, releaseBVersion);
90
+ });
91
+
92
+ const latestV2Version: string | undefined = sortedV2Versions[0];
93
+
94
+ const v3Release = cache.v3Release ?? (await getV3Release());
95
+
96
+ if (latestV2Version === undefined && v3Release === undefined) {
97
+ // this should never happen unless the github api is down
98
+ return;
99
+ }
100
+
101
+ if (
102
+ latestV2Version !== undefined &&
103
+ semver.gt(latestV2Version, hardhatVersion)
104
+ ) {
105
+ let installationCommand = "npm install";
106
+ if (await fsExtra.pathExists("yarn.lock")) {
107
+ installationCommand = "yarn add";
108
+ } else if (await fsExtra.pathExists("pnpm-lock.yaml")) {
109
+ installationCommand = "pnpm install";
110
+ }
111
+
112
+ console.log(
113
+ boxen(
114
+ `New Hardhat release available! ${chalk.red(
115
+ hardhatVersion
116
+ )} -> ${chalk.green(latestV2Version)}.
117
+
118
+ Changelog: https://hardhat.org/release/${latestV2Version}
119
+
120
+ Run "${installationCommand} hardhat@latest" to update.`,
121
+ boxenOptions
122
+ )
123
+ );
124
+ }
125
+
126
+ if (
127
+ v3Release !== undefined &&
128
+ cache.v3TimesShown < V3_RELEASE_MAX_TIMES_SHOWN
129
+ ) {
130
+ const releaseVersion = semver.valid(v3Release.tag_name.split("@")[1]);
131
+
132
+ if (releaseVersion !== null) {
133
+ cache.v3ReleaseMessage ??= await getV3ReleaseMessage(v3Release);
134
+ if (cache.v3ReleaseMessage !== undefined) {
135
+ console.log(boxen(cache.v3ReleaseMessage, boxenOptions));
136
+ cache.v3TimesShown++;
137
+ }
138
+ }
139
+ }
140
+
141
+ await writeCache({
142
+ ...cache,
143
+ lastCheck: now.toISOString(),
144
+ v3Release,
145
+ });
146
+ }
147
+
148
+ async function readCache(): Promise<VersionNotifierCache> {
149
+ const cacheDir = await getCacheDir();
150
+ const versionNotifierCachePath = join(cacheDir, "version-notifier.json");
151
+
152
+ let cache: VersionNotifierCache = {
153
+ lastCheck: 0, // new Date(0) represents the unix epoch
154
+ v3TimesShown: 0,
155
+ };
156
+ try {
157
+ const fileContents = await readFile(versionNotifierCachePath, "utf-8");
158
+ const { lastCheck, v3TimesShown } = JSON.parse(fileContents);
159
+
160
+ cache = {
161
+ lastCheck: typeof lastCheck === "string" ? lastCheck : 0,
162
+ v3TimesShown: typeof v3TimesShown === "number" ? v3TimesShown : 0,
163
+ };
164
+ } catch (error: any) {
165
+ // We don't care if it fails
166
+ }
167
+
168
+ return cache;
169
+ }
170
+
171
+ async function writeCache(cache: VersionNotifierCache) {
172
+ const cacheDir = await getCacheDir();
173
+ const versionNotifierCachePath = join(cacheDir, "version-notifier.json");
174
+
175
+ try {
176
+ await mkdir(cacheDir, { recursive: true });
177
+ await writeFile(versionNotifierCachePath, JSON.stringify(cache, null, 2));
178
+ } catch (error) {
179
+ // We don't care if it fails
180
+ }
181
+ }
182
+
183
+ async function getReleases(): Promise<Release[]> {
184
+ const { request } = await import("undici");
185
+ let releases: Release[] = [];
186
+
187
+ try {
188
+ const githubResponse = await request(
189
+ `${GITHUB_API_URL}/repos/${GITHUB_OWNER}/${GITHUB_REPO}/releases`,
190
+ {
191
+ method: "GET",
192
+ headers: {
193
+ "User-Agent": "Hardhat",
194
+ "X-GitHub-Api-Version": "2022-11-28",
195
+ },
196
+ query: {
197
+ per_page: 100,
198
+ },
199
+ }
200
+ );
201
+ releases = (await githubResponse.body.json()) as Release[];
202
+ } catch (error: any) {
203
+ // We don't care if it fails
204
+ }
205
+
206
+ return releases;
207
+ }
208
+
209
+ async function getV3Release(): Promise<Release | undefined> {
210
+ const { request } = await import("undici");
211
+ let v3Release: Release | undefined;
212
+
213
+ try {
214
+ const githubResponse = await request(
215
+ `${GITHUB_API_URL}/repos/${GITHUB_OWNER}/${GITHUB_REPO}/releases/tags/${V3_RELEASE_TAG}`,
216
+ {
217
+ method: "GET",
218
+ headers: {
219
+ "User-Agent": "Hardhat",
220
+ "X-GitHub-Api-Version": "2022-11-28",
221
+ },
222
+ }
223
+ );
224
+
225
+ const jsonResponse = (await githubResponse.body.json()) as any;
226
+ if (jsonResponse.message === "Not Found") {
227
+ // eslint-disable-next-line @nomicfoundation/hardhat-internal-rules/only-hardhat-error
228
+ throw new Error("Not Found");
229
+ }
230
+
231
+ v3Release = jsonResponse as Release;
232
+ } catch (error: any) {
233
+ // We don't care if it fails
234
+ }
235
+
236
+ return v3Release;
237
+ }
238
+
239
+ async function getV3ReleaseMessage(
240
+ v3Release: Release
241
+ ): Promise<string | undefined> {
242
+ const { request } = await import("undici");
243
+
244
+ const versionNotifierAsset = v3Release.assets.find(
245
+ ({ name }) => name === V3_RELEASE_VERSION_NOTIFIER_ASSET_NAME
246
+ );
247
+
248
+ if (versionNotifierAsset === undefined) {
249
+ return;
250
+ }
251
+
252
+ let v3ReleaseMessage;
253
+ try {
254
+ const githubResponse = await request(
255
+ versionNotifierAsset.browser_download_url,
256
+ {
257
+ method: "GET",
258
+ maxRedirections: 10,
259
+ }
260
+ );
261
+
262
+ v3ReleaseMessage = await githubResponse.body.text();
263
+ } catch (error: any) {
264
+ // We don't care if it fails
265
+ }
266
+
267
+ return v3ReleaseMessage;
268
+ }
@@ -22,6 +22,7 @@ export const HARDHAT_NETWORK_SUPPORTED_HARDFORKS = [
22
22
  "grayGlacier",
23
23
  "merge",
24
24
  "shanghai",
25
+ "cancun",
25
26
  ];
26
27
 
27
28
  export const HARDHAT_MEMPOOL_SUPPORTED_ORDERS = ["fifo", "priority"] as const;
@@ -20,7 +20,6 @@ import { getUserConfigPath } from "../project-structure";
20
20
 
21
21
  import { SUPPORTED_SOLIDITY_VERSION_RANGE } from "../../hardhat-network/stack-traces/constants";
22
22
  import { resolveConfig } from "./config-resolution";
23
- import { validateConfig, validateResolvedConfig } from "./config-validation";
24
23
  import { DEFAULT_SOLC_VERSION } from "./default-config";
25
24
 
26
25
  const log = debug("hardhat:core:config");
@@ -68,6 +67,8 @@ export function loadConfigAndTasks(
68
67
  showSolidityConfigWarnings: false,
69
68
  }
70
69
  ): { resolvedConfig: HardhatConfig; userConfig: HardhatUserConfig } {
70
+ const { validateConfig, validateResolvedConfig } =
71
+ require("./config-validation") as typeof import("./config-validation");
71
72
  let configPath =
72
73
  hardhatArguments !== undefined ? hardhatArguments.config : undefined;
73
74
 
@@ -1,4 +1,5 @@
1
- import cloneDeep from "lodash/cloneDeep";
1
+ import type { LoDashStatic } from "lodash";
2
+
2
3
  import path from "path";
3
4
  import semver from "semver";
4
5
 
@@ -62,6 +63,7 @@ export function resolveConfig(
62
63
  userConfigPath: string,
63
64
  userConfig: HardhatUserConfig
64
65
  ): HardhatConfig {
66
+ const cloneDeep = require("lodash/cloneDeep") as LoDashStatic["cloneDeep"];
65
67
  userConfig = cloneDeep(userConfig);
66
68
 
67
69
  return {
@@ -77,6 +79,7 @@ export function resolveConfig(
77
79
  function resolveNetworksConfig(
78
80
  networksConfig: NetworksUserConfig = {}
79
81
  ): NetworksConfig {
82
+ const cloneDeep = require("lodash/cloneDeep") as LoDashStatic["cloneDeep"];
80
83
  const hardhatNetworkConfig = networksConfig[HARDHAT_NETWORK_NAME];
81
84
 
82
85
  const localhostNetworkConfig =
@@ -128,6 +131,7 @@ function normalizeHexString(str: string): string {
128
131
  function resolveHardhatNetworkConfig(
129
132
  hardhatNetworkConfig: HardhatNetworkUserConfig = {}
130
133
  ): HardhatNetworkConfig {
134
+ const cloneDeep = require("lodash/cloneDeep") as LoDashStatic["cloneDeep"];
131
135
  const clonedDefaultHardhatNetworkParams = cloneDeep(
132
136
  defaultHardhatNetworkParams
133
137
  );
@@ -234,6 +238,19 @@ function resolveHardhatNetworkConfig(
234
238
  delete config.initialBaseFeePerGas;
235
239
  }
236
240
 
241
+ if (
242
+ hardhatNetworkConfig.enableTransientStorage === true &&
243
+ hardhatNetworkConfig.hardfork === undefined
244
+ ) {
245
+ config.hardfork = "cancun";
246
+ }
247
+ if (
248
+ hardhatNetworkConfig.enableTransientStorage === false &&
249
+ hardhatNetworkConfig.hardfork === undefined
250
+ ) {
251
+ config.hardfork = "shanghai";
252
+ }
253
+
237
254
  return config;
238
255
  }
239
256
 
@@ -246,6 +263,7 @@ function isHdAccountsConfig(
246
263
  function resolveHttpNetworkConfig(
247
264
  networkConfig: HttpNetworkUserConfig
248
265
  ): HttpNetworkConfig {
266
+ const cloneDeep = require("lodash/cloneDeep") as LoDashStatic["cloneDeep"];
249
267
  const accounts: HttpNetworkAccountsConfig =
250
268
  networkConfig.accounts === undefined
251
269
  ? defaultHttpNetworkParams.accounts
@@ -427,6 +445,7 @@ function resolveCompiler(compiler: SolcUserConfig): SolcConfig {
427
445
  }
428
446
 
429
447
  function resolveMochaConfig(userConfig: HardhatUserConfig): Mocha.MochaOptions {
448
+ const cloneDeep = require("lodash/cloneDeep") as LoDashStatic["cloneDeep"];
430
449
  return {
431
450
  ...cloneDeep(defaultMochaOptions),
432
451
  ...userConfig.mocha,
@@ -1,8 +1,12 @@
1
1
  import type { HardhatConfig as HardhatConfigT } from "../../../types";
2
+ import type {
3
+ Context,
4
+ ValidationError,
5
+ getFunctionName as getFunctionNameT,
6
+ } from "io-ts/lib";
7
+ import type { Reporter } from "io-ts/lib/Reporter";
2
8
 
3
9
  import * as t from "io-ts";
4
- import { Context, getFunctionName, ValidationError } from "io-ts/lib";
5
- import { Reporter } from "io-ts/lib/Reporter";
6
10
 
7
11
  import {
8
12
  HARDHAT_MEMPOOL_SUPPORTED_ORDERS,
@@ -19,6 +23,9 @@ import { defaultHardhatNetworkParams } from "./default-config";
19
23
 
20
24
  function stringify(v: any): string {
21
25
  if (typeof v === "function") {
26
+ const { getFunctionName } = require("io-ts/lib") as {
27
+ getFunctionName: typeof getFunctionNameT;
28
+ };
22
29
  return getFunctionName(v);
23
30
  }
24
31
  if (typeof v === "number" && !isFinite(v)) {
@@ -491,6 +498,25 @@ export function getValidationErrors(config: any): string[] {
491
498
  }
492
499
  });
493
500
  }
501
+
502
+ if (hardhatNetwork.hardfork !== undefined) {
503
+ if (
504
+ !hardforkGte(hardhatNetwork.hardfork, HardforkName.CANCUN) &&
505
+ hardhatNetwork.enableTransientStorage === true
506
+ ) {
507
+ errors.push(
508
+ `'enableTransientStorage' cannot be enabled if the hardfork is explicitly set to a pre-cancun value. If you want to use transient storage, use 'cancun' as the hardfork.`
509
+ );
510
+ }
511
+ if (
512
+ hardforkGte(hardhatNetwork.hardfork, HardforkName.CANCUN) &&
513
+ hardhatNetwork.enableTransientStorage === false
514
+ ) {
515
+ errors.push(
516
+ `'enableTransientStorage' cannot be disabled if the hardfork is explicitly set to cancun or later. If you want to disable transient storage, use a hardfork before 'cancun'.`
517
+ );
518
+ }
519
+ }
494
520
  }
495
521
 
496
522
  for (const [networkName, netConfig] of Object.entries<any>(
@@ -129,6 +129,17 @@ export const defaultHardhatNetworkParams: Omit<
129
129
  ]),
130
130
  },
131
131
  ],
132
+ [
133
+ 11155111, // sepolia
134
+ {
135
+ hardforkHistory: new Map([
136
+ [HardforkName.GRAY_GLACIER, 0],
137
+ [HardforkName.MERGE, 1_450_409],
138
+ [HardforkName.SHANGHAI, 2_990_908],
139
+ [HardforkName.CANCUN, 5_187_023],
140
+ ]),
141
+ },
142
+ ],
132
143
  ]),
133
144
  };
134
145
 
@@ -1,7 +1,7 @@
1
1
  import {
2
- bufferToHex,
2
+ bytesToHex as bufferToHex,
3
3
  isValidAddress,
4
- toBuffer,
4
+ toBytes,
5
5
  } from "@nomicfoundation/ethereumjs-util";
6
6
  import * as t from "io-ts";
7
7
 
@@ -22,14 +22,16 @@ export const rpcQuantity = new t.Type<bigint>(
22
22
  export const rpcData = new t.Type<Buffer>(
23
23
  "DATA",
24
24
  Buffer.isBuffer,
25
- (u, c) => (isRpcDataString(u) ? t.success(toBuffer(u)) : t.failure(u, c)),
25
+ (u, c) =>
26
+ isRpcDataString(u) ? t.success(Buffer.from(toBytes(u))) : t.failure(u, c),
26
27
  t.identity
27
28
  );
28
29
 
29
30
  export const rpcHash = new t.Type<Buffer>(
30
31
  "HASH",
31
32
  (v): v is Buffer => Buffer.isBuffer(v) && v.length === HASH_LENGTH_BYTES,
32
- (u, c) => (isRpcHashString(u) ? t.success(toBuffer(u)) : t.failure(u, c)),
33
+ (u, c) =>
34
+ isRpcHashString(u) ? t.success(Buffer.from(toBytes(u))) : t.failure(u, c),
33
35
  t.identity
34
36
  );
35
37
 
@@ -96,7 +98,10 @@ function validateStorageSlot(u: unknown, c: t.Context): t.Validation<bigint> {
96
98
  export const rpcAddress = new t.Type<Buffer>(
97
99
  "ADDRESS",
98
100
  (v): v is Buffer => Buffer.isBuffer(v) && v.length === ADDRESS_LENGTH_BYTES,
99
- (u, c) => (isRpcAddressString(u) ? t.success(toBuffer(u)) : t.failure(u, c)),
101
+ (u, c) =>
102
+ isRpcAddressString(u)
103
+ ? t.success(Buffer.from(toBytes(u)))
104
+ : t.failure(u, c),
100
105
  t.identity
101
106
  );
102
107
 
@@ -173,7 +178,7 @@ export function rpcDataToBigInt(data: string): bigint {
173
178
  }
174
179
 
175
180
  export function bufferToRpcData(
176
- buffer: Buffer,
181
+ buffer: Uint8Array,
177
182
  padToBytes: number = 0
178
183
  ): string {
179
184
  let s = bufferToHex(buffer);
@@ -191,7 +196,7 @@ export function rpcDataToBuffer(data: string): Buffer {
191
196
  });
192
197
  }
193
198
 
194
- return toBuffer(data);
199
+ return Buffer.from(toBytes(data));
195
200
  }
196
201
 
197
202
  // Type guards
@@ -5,6 +5,7 @@ import { rpcAccessList } from "../access-list";
5
5
  import {
6
6
  rpcAddress,
7
7
  rpcData,
8
+ rpcHash,
8
9
  rpcQuantity,
9
10
  rpcStorageSlot,
10
11
  rpcStorageSlotHexString,
@@ -23,6 +24,8 @@ export const rpcCallRequest = t.type(
23
24
  accessList: optionalOrNullable(rpcAccessList),
24
25
  maxFeePerGas: optionalOrNullable(rpcQuantity),
25
26
  maxPriorityFeePerGas: optionalOrNullable(rpcQuantity),
27
+ blobs: optionalOrNullable(t.array(rpcData)),
28
+ blobVersionedHashes: optionalOrNullable(t.array(rpcHash)),
26
29
  },
27
30
  "RpcCallRequest"
28
31
  );
@@ -2,7 +2,7 @@ import * as t from "io-ts";
2
2
 
3
3
  import { optionalOrNullable } from "../../../../util/io-ts";
4
4
  import { rpcAccessList } from "../access-list";
5
- import { rpcAddress, rpcData, rpcQuantity } from "../base-types";
5
+ import { rpcAddress, rpcData, rpcHash, rpcQuantity } from "../base-types";
6
6
 
7
7
  // Type used by eth_sendTransaction
8
8
  export const rpcTransactionRequest = t.type(
@@ -18,6 +18,8 @@ export const rpcTransactionRequest = t.type(
18
18
  chainId: optionalOrNullable(rpcQuantity),
19
19
  maxFeePerGas: optionalOrNullable(rpcQuantity),
20
20
  maxPriorityFeePerGas: optionalOrNullable(rpcQuantity),
21
+ blobs: optionalOrNullable(t.array(rpcData)),
22
+ blobVersionedHashes: optionalOrNullable(t.array(rpcHash)),
21
23
  },
22
24
  "RpcTransactionRequest"
23
25
  );
@@ -38,6 +40,8 @@ export interface RpcTransactionRequestInput {
38
40
  }>;
39
41
  maxFeePerGas?: string;
40
42
  maxPriorityFeePerGas?: string;
43
+ blobs?: string[];
44
+ blobVersionedHashes?: string[];
41
45
  }
42
46
 
43
47
  export type RpcTransactionRequest = t.TypeOf<typeof rpcTransactionRequest>;
@@ -38,6 +38,9 @@ const baseBlockResponse = {
38
38
  baseFeePerGas: optional(rpcQuantity),
39
39
  withdrawals: optional(t.array(rpcWithdrawalItem)),
40
40
  withdrawalsRoot: optional(rpcHash),
41
+ parentBeaconBlockRoot: optional(rpcHash),
42
+ blobGasUsed: optional(rpcQuantity),
43
+ excessBlobGas: optional(rpcQuantity),
41
44
  };
42
45
 
43
46
  export type RpcBlock = t.TypeOf<typeof rpcBlock>;
@@ -43,8 +43,13 @@ export class LocalAccountsProvider extends ProviderWrapperWithChainId {
43
43
  }
44
44
 
45
45
  public async request(args: RequestArguments): Promise<unknown> {
46
- const { ecsign, hashPersonalMessage, toRpcSig, toBuffer, bufferToHex } =
47
- await import("@nomicfoundation/ethereumjs-util");
46
+ const {
47
+ ecsign,
48
+ hashPersonalMessage,
49
+ toRpcSig,
50
+ toBytes,
51
+ bytesToHex: bufferToHex,
52
+ } = await import("@nomicfoundation/ethereumjs-util");
48
53
 
49
54
  if (
50
55
  args.method === "eth_accounts" ||
@@ -65,7 +70,7 @@ export class LocalAccountsProvider extends ProviderWrapperWithChainId {
65
70
  }
66
71
 
67
72
  const privateKey = this._getPrivateKeyForAddress(address);
68
- const messageHash = hashPersonalMessage(toBuffer(data));
73
+ const messageHash = hashPersonalMessage(toBytes(data));
69
74
  const signature = ecsign(messageHash, privateKey);
70
75
  return toRpcSig(signature.v, signature.r, signature.s);
71
76
  }
@@ -84,7 +89,7 @@ export class LocalAccountsProvider extends ProviderWrapperWithChainId {
84
89
  }
85
90
 
86
91
  const privateKey = this._getPrivateKeyForAddress(address);
87
- const messageHash = hashPersonalMessage(toBuffer(data));
92
+ const messageHash = hashPersonalMessage(toBytes(data));
88
93
  const signature = ecsign(messageHash, privateKey);
89
94
  return toRpcSig(signature.v, signature.r, signature.s);
90
95
  }
@@ -189,13 +194,13 @@ export class LocalAccountsProvider extends ProviderWrapperWithChainId {
189
194
 
190
195
  private _initializePrivateKeys(localAccountsHexPrivateKeys: string[]) {
191
196
  const {
192
- bufferToHex,
193
- toBuffer,
197
+ bytesToHex: bufferToHex,
198
+ toBytes,
194
199
  privateToAddress,
195
200
  } = require("@nomicfoundation/ethereumjs-util");
196
201
 
197
202
  const privateKeys: Buffer[] = localAccountsHexPrivateKeys.map((h) =>
198
- toBuffer(h)
203
+ toBytes(h)
199
204
  );
200
205
 
201
206
  for (const pk of privateKeys) {
@@ -205,7 +210,9 @@ export class LocalAccountsProvider extends ProviderWrapperWithChainId {
205
210
  }
206
211
 
207
212
  private _getPrivateKeyForAddress(address: Buffer): Buffer {
208
- const { bufferToHex } = require("@nomicfoundation/ethereumjs-util");
213
+ const {
214
+ bytesToHex: bufferToHex,
215
+ } = require("@nomicfoundation/ethereumjs-util");
209
216
  const pk = this._addressToPrivateKey.get(bufferToHex(address));
210
217
  if (pk === undefined) {
211
218
  throw new HardhatError(ERRORS.NETWORK.NOT_LOCAL_ACCOUNT, {
@@ -225,7 +232,9 @@ export class LocalAccountsProvider extends ProviderWrapperWithChainId {
225
232
  }
226
233
 
227
234
  private async _getNonce(address: Buffer): Promise<bigint> {
228
- const { bufferToHex } = await import("@nomicfoundation/ethereumjs-util");
235
+ const { bytesToHex: bufferToHex } = await import(
236
+ "@nomicfoundation/ethereumjs-util"
237
+ );
229
238
 
230
239
  const response = (await this._wrappedProvider.request({
231
240
  method: "eth_getTransactionCount",
@@ -239,8 +248,8 @@ export class LocalAccountsProvider extends ProviderWrapperWithChainId {
239
248
  transactionRequest: RpcTransactionRequest,
240
249
  chainId: number,
241
250
  privateKey: Buffer
242
- ): Promise<Buffer> {
243
- const { AccessListEIP2930Transaction, Transaction } = await import(
251
+ ): Promise<Uint8Array> {
252
+ const { AccessListEIP2930Transaction, LegacyTransaction } = await import(
244
253
  "@nomicfoundation/ethereumjs-tx"
245
254
  );
246
255
 
@@ -282,7 +291,7 @@ export class LocalAccountsProvider extends ProviderWrapperWithChainId {
282
291
  { common }
283
292
  );
284
293
  } else {
285
- transaction = Transaction.fromTxData(txData, { common });
294
+ transaction = LegacyTransaction.fromTxData(txData, { common });
286
295
  }
287
296
 
288
297
  const signedTransaction = transaction.sign(privateKey);
@@ -311,7 +320,9 @@ export class HDWalletProvider extends LocalAccountsProvider {
311
320
  passphrase
312
321
  );
313
322
 
314
- const { bufferToHex } = require("@nomicfoundation/ethereumjs-util");
323
+ const {
324
+ bytesToHex: bufferToHex,
325
+ } = require("@nomicfoundation/ethereumjs-util");
315
326
  const privateKeysAsHex = privateKeys.map((pk) => bufferToHex(pk));
316
327
  super(provider, privateKeysAsHex);
317
328
  }
@@ -273,6 +273,14 @@ export class AutomaticGasPriceProvider extends ProviderWrapper {
273
273
  }
274
274
  }
275
275
 
276
+ // If after all of these we still have a 0 wei maxPriorityFeePerGas, we
277
+ // use 1 wei. This is to improve the UX of the automatic gas price
278
+ // on chains that are very empty (i.e local testnets). This will be very
279
+ // unlikely to trigger on a live chain.
280
+ if (maxPriorityFeePerGas === 0n) {
281
+ maxPriorityFeePerGas = 1n;
282
+ }
283
+
276
284
  return {
277
285
  // Each block increases the base fee by 1/8 at most, when full.
278
286
  // We have the next block's base fee, so we compute a cap for the
@@ -53,7 +53,7 @@ export function normalizeHardhatNetworkAccountsConfig(
53
53
  return accountsConfig;
54
54
  }
55
55
 
56
- const { bufferToHex } = require("@nomicfoundation/ethereumjs-util");
56
+ const { bytesToHex } = require("@nomicfoundation/ethereumjs-util");
57
57
 
58
58
  return derivePrivateKeys(
59
59
  accountsConfig.mnemonic,
@@ -62,7 +62,7 @@ export function normalizeHardhatNetworkAccountsConfig(
62
62
  accountsConfig.count,
63
63
  accountsConfig.passphrase
64
64
  ).map((pk) => ({
65
- privateKey: bufferToHex(pk),
65
+ privateKey: bytesToHex(pk),
66
66
  balance: accountsConfig.accountsBalance ?? DEFAULT_HARDHAT_NETWORK_BALANCE,
67
67
  }));
68
68
  }