hardhat 3.3.0 → 3.4.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 (255) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/dist/src/internal/builtin-plugins/artifacts/artifact-manager.d.ts.map +1 -1
  3. package/dist/src/internal/builtin-plugins/artifacts/artifact-manager.js +5 -13
  4. package/dist/src/internal/builtin-plugins/artifacts/artifact-manager.js.map +1 -1
  5. package/dist/src/internal/builtin-plugins/console/task-action.d.ts.map +1 -1
  6. package/dist/src/internal/builtin-plugins/console/task-action.js +2 -1
  7. package/dist/src/internal/builtin-plugins/console/task-action.js.map +1 -1
  8. package/dist/src/internal/builtin-plugins/gas-analytics/exports.d.ts +1 -1
  9. package/dist/src/internal/builtin-plugins/gas-analytics/exports.d.ts.map +1 -1
  10. package/dist/src/internal/builtin-plugins/gas-analytics/exports.js +1 -1
  11. package/dist/src/internal/builtin-plugins/gas-analytics/exports.js.map +1 -1
  12. package/dist/src/internal/builtin-plugins/gas-analytics/function-gas-snapshots.d.ts.map +1 -1
  13. package/dist/src/internal/builtin-plugins/gas-analytics/function-gas-snapshots.js +1 -2
  14. package/dist/src/internal/builtin-plugins/gas-analytics/function-gas-snapshots.js.map +1 -1
  15. package/dist/src/internal/builtin-plugins/gas-analytics/gas-analytics-manager.d.ts +7 -5
  16. package/dist/src/internal/builtin-plugins/gas-analytics/gas-analytics-manager.d.ts.map +1 -1
  17. package/dist/src/internal/builtin-plugins/gas-analytics/gas-analytics-manager.js +60 -44
  18. package/dist/src/internal/builtin-plugins/gas-analytics/gas-analytics-manager.js.map +1 -1
  19. package/dist/src/internal/builtin-plugins/gas-analytics/helpers/accessors.d.ts +6 -0
  20. package/dist/src/internal/builtin-plugins/gas-analytics/helpers/accessors.d.ts.map +1 -0
  21. package/dist/src/internal/builtin-plugins/gas-analytics/helpers/accessors.js +14 -0
  22. package/dist/src/internal/builtin-plugins/gas-analytics/helpers/accessors.js.map +1 -0
  23. package/dist/src/internal/builtin-plugins/gas-analytics/helpers/compat.d.ts +4 -0
  24. package/dist/src/internal/builtin-plugins/gas-analytics/helpers/compat.d.ts.map +1 -0
  25. package/dist/src/internal/builtin-plugins/gas-analytics/helpers/compat.js +27 -0
  26. package/dist/src/internal/builtin-plugins/gas-analytics/helpers/compat.js.map +1 -0
  27. package/dist/src/internal/builtin-plugins/gas-analytics/helpers/utils.d.ts +36 -0
  28. package/dist/src/internal/builtin-plugins/gas-analytics/helpers/utils.d.ts.map +1 -0
  29. package/dist/src/internal/builtin-plugins/gas-analytics/helpers/utils.js +86 -0
  30. package/dist/src/internal/builtin-plugins/gas-analytics/helpers/utils.js.map +1 -0
  31. package/dist/src/internal/builtin-plugins/gas-analytics/hook-handlers/hre.js +1 -1
  32. package/dist/src/internal/builtin-plugins/gas-analytics/hook-handlers/hre.js.map +1 -1
  33. package/dist/src/internal/builtin-plugins/gas-analytics/hook-handlers/test.js +1 -1
  34. package/dist/src/internal/builtin-plugins/gas-analytics/hook-handlers/test.js.map +1 -1
  35. package/dist/src/internal/builtin-plugins/gas-analytics/snapshot-cheatcodes.d.ts.map +1 -1
  36. package/dist/src/internal/builtin-plugins/gas-analytics/snapshot-cheatcodes.js +1 -2
  37. package/dist/src/internal/builtin-plugins/gas-analytics/snapshot-cheatcodes.js.map +1 -1
  38. package/dist/src/internal/builtin-plugins/gas-analytics/types.d.ts +10 -2
  39. package/dist/src/internal/builtin-plugins/gas-analytics/types.d.ts.map +1 -1
  40. package/dist/src/internal/builtin-plugins/network-manager/edr/stack-traces/solidity-stack-trace.d.ts +4 -4
  41. package/dist/src/internal/builtin-plugins/network-manager/edr/stack-traces/solidity-stack-trace.d.ts.map +1 -1
  42. package/dist/src/internal/builtin-plugins/network-manager/edr/stack-traces/solidity-stack-trace.js +2 -2
  43. package/dist/src/internal/builtin-plugins/network-manager/edr/stack-traces/solidity-stack-trace.js.map +1 -1
  44. package/dist/src/internal/builtin-plugins/network-manager/edr/stack-traces/stack-trace-solidity-errors.d.ts +6 -3
  45. package/dist/src/internal/builtin-plugins/network-manager/edr/stack-traces/stack-trace-solidity-errors.d.ts.map +1 -1
  46. package/dist/src/internal/builtin-plugins/network-manager/edr/stack-traces/stack-trace-solidity-errors.js +23 -5
  47. package/dist/src/internal/builtin-plugins/network-manager/edr/stack-traces/stack-trace-solidity-errors.js.map +1 -1
  48. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/convert-to-edr.d.ts.map +1 -1
  49. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/convert-to-edr.js +2 -1
  50. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/convert-to-edr.js.map +1 -1
  51. package/dist/src/internal/builtin-plugins/network-manager/hook-handlers/hre.d.ts.map +1 -1
  52. package/dist/src/internal/builtin-plugins/network-manager/hook-handlers/hre.js +22 -0
  53. package/dist/src/internal/builtin-plugins/network-manager/hook-handlers/hre.js.map +1 -1
  54. package/dist/src/internal/builtin-plugins/network-manager/hook-handlers/network.d.ts.map +1 -1
  55. package/dist/src/internal/builtin-plugins/network-manager/hook-handlers/network.js +17 -9
  56. package/dist/src/internal/builtin-plugins/network-manager/hook-handlers/network.js.map +1 -1
  57. package/dist/src/internal/builtin-plugins/network-manager/network-manager.d.ts +11 -1
  58. package/dist/src/internal/builtin-plugins/network-manager/network-manager.d.ts.map +1 -1
  59. package/dist/src/internal/builtin-plugins/network-manager/network-manager.js +86 -19
  60. package/dist/src/internal/builtin-plugins/network-manager/network-manager.js.map +1 -1
  61. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/accounts/hd-wallet-handler.d.ts.map +1 -1
  62. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/accounts/hd-wallet-handler.js.map +1 -1
  63. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/accounts/local-accounts.d.ts +1 -0
  64. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/accounts/local-accounts.d.ts.map +1 -1
  65. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/accounts/local-accounts.js +22 -8
  66. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/accounts/local-accounts.js.map +1 -1
  67. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/accounts/sender.d.ts +2 -0
  68. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/accounts/sender.d.ts.map +1 -1
  69. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/accounts/sender.js +19 -12
  70. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/accounts/sender.js.map +1 -1
  71. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/chain-id/chain-id-handler.d.ts +1 -0
  72. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/chain-id/chain-id-handler.d.ts.map +1 -1
  73. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/chain-id/chain-id-handler.js +9 -3
  74. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/chain-id/chain-id-handler.js.map +1 -1
  75. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/gas/automatic-gas-handler.d.ts +2 -0
  76. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/gas/automatic-gas-handler.d.ts.map +1 -1
  77. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/gas/automatic-gas-handler.js +5 -1
  78. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/gas/automatic-gas-handler.js.map +1 -1
  79. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/gas/automatic-gas-price-handler.d.ts +1 -0
  80. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/gas/automatic-gas-price-handler.d.ts.map +1 -1
  81. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/gas/automatic-gas-price-handler.js +5 -1
  82. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/gas/automatic-gas-price-handler.js.map +1 -1
  83. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/gas/fixed-gas-handler.d.ts +1 -0
  84. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/gas/fixed-gas-handler.d.ts.map +1 -1
  85. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/gas/fixed-gas-handler.js +5 -1
  86. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/gas/fixed-gas-handler.js.map +1 -1
  87. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/gas/fixed-gas-price-handler.d.ts +1 -0
  88. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/gas/fixed-gas-price-handler.d.ts.map +1 -1
  89. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/gas/fixed-gas-price-handler.js +5 -1
  90. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/gas/fixed-gas-price-handler.js.map +1 -1
  91. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/types.d.ts +9 -0
  92. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/types.d.ts.map +1 -1
  93. package/dist/src/internal/builtin-plugins/network-manager/revert-error-code.d.ts +2 -0
  94. package/dist/src/internal/builtin-plugins/network-manager/revert-error-code.d.ts.map +1 -0
  95. package/dist/src/internal/builtin-plugins/network-manager/revert-error-code.js +3 -0
  96. package/dist/src/internal/builtin-plugins/network-manager/revert-error-code.js.map +1 -0
  97. package/dist/src/internal/builtin-plugins/network-manager/type-extensions/config.d.ts +1 -1
  98. package/dist/src/internal/builtin-plugins/network-manager/type-extensions/config.d.ts.map +1 -1
  99. package/dist/src/internal/builtin-plugins/network-manager/type-validation.d.ts.map +1 -1
  100. package/dist/src/internal/builtin-plugins/network-manager/type-validation.js +2 -1
  101. package/dist/src/internal/builtin-plugins/network-manager/type-validation.js.map +1 -1
  102. package/dist/src/internal/builtin-plugins/node/json-rpc/handler.d.ts.map +1 -1
  103. package/dist/src/internal/builtin-plugins/node/json-rpc/handler.js +8 -2
  104. package/dist/src/internal/builtin-plugins/node/json-rpc/handler.js.map +1 -1
  105. package/dist/src/internal/builtin-plugins/node/task-action.js +2 -2
  106. package/dist/src/internal/builtin-plugins/node/task-action.js.map +1 -1
  107. package/dist/src/internal/builtin-plugins/run/task-action.d.ts.map +1 -1
  108. package/dist/src/internal/builtin-plugins/run/task-action.js +2 -1
  109. package/dist/src/internal/builtin-plugins/run/task-action.js.map +1 -1
  110. package/dist/src/internal/builtin-plugins/solidity/build-system/artifacts.d.ts.map +1 -1
  111. package/dist/src/internal/builtin-plugins/solidity/build-system/artifacts.js +3 -0
  112. package/dist/src/internal/builtin-plugins/solidity/build-system/artifacts.js.map +1 -1
  113. package/dist/src/internal/builtin-plugins/solidity/build-system/build-system.d.ts +1 -1
  114. package/dist/src/internal/builtin-plugins/solidity/build-system/build-system.d.ts.map +1 -1
  115. package/dist/src/internal/builtin-plugins/solidity/build-system/build-system.js +114 -31
  116. package/dist/src/internal/builtin-plugins/solidity/build-system/build-system.js.map +1 -1
  117. package/dist/src/internal/builtin-plugins/solidity/build-system/cache.d.ts +2 -0
  118. package/dist/src/internal/builtin-plugins/solidity/build-system/cache.d.ts.map +1 -1
  119. package/dist/src/internal/builtin-plugins/solidity/build-system/cache.js.map +1 -1
  120. package/dist/src/internal/builtin-plugins/solidity/build-system/compilation-job.d.ts +3 -1
  121. package/dist/src/internal/builtin-plugins/solidity/build-system/compilation-job.d.ts.map +1 -1
  122. package/dist/src/internal/builtin-plugins/solidity/build-system/compilation-job.js +11 -3
  123. package/dist/src/internal/builtin-plugins/solidity/build-system/compilation-job.js.map +1 -1
  124. package/dist/src/internal/builtin-plugins/solidity/build-system/dependency-graph.d.ts.map +1 -1
  125. package/dist/src/internal/builtin-plugins/solidity/build-system/dependency-graph.js +5 -5
  126. package/dist/src/internal/builtin-plugins/solidity/build-system/dependency-graph.js.map +1 -1
  127. package/dist/src/internal/builtin-plugins/solidity/build-system/solc-info.d.ts.map +1 -1
  128. package/dist/src/internal/builtin-plugins/solidity/build-system/solc-info.js +1 -0
  129. package/dist/src/internal/builtin-plugins/solidity/build-system/solc-info.js.map +1 -1
  130. package/dist/src/internal/builtin-plugins/solidity/build-system/warning-suppression.js +2 -2
  131. package/dist/src/internal/builtin-plugins/solidity/build-system/warning-suppression.js.map +1 -1
  132. package/dist/src/internal/builtin-plugins/solidity/config.d.ts.map +1 -1
  133. package/dist/src/internal/builtin-plugins/solidity/config.js +19 -16
  134. package/dist/src/internal/builtin-plugins/solidity/config.js.map +1 -1
  135. package/dist/src/internal/builtin-plugins/solidity/constants.d.ts +3 -0
  136. package/dist/src/internal/builtin-plugins/solidity/constants.d.ts.map +1 -0
  137. package/dist/src/internal/builtin-plugins/solidity/constants.js +19 -0
  138. package/dist/src/internal/builtin-plugins/solidity/constants.js.map +1 -0
  139. package/dist/src/internal/builtin-plugins/solidity/tasks/build.d.ts +1 -1
  140. package/dist/src/internal/builtin-plugins/solidity/tasks/build.d.ts.map +1 -1
  141. package/dist/src/internal/builtin-plugins/solidity/tasks/build.js +225 -55
  142. package/dist/src/internal/builtin-plugins/solidity/tasks/build.js.map +1 -1
  143. package/dist/src/internal/builtin-plugins/solidity/type-extensions.d.ts +30 -4
  144. package/dist/src/internal/builtin-plugins/solidity/type-extensions.d.ts.map +1 -1
  145. package/dist/src/internal/builtin-plugins/solidity/type-extensions.js.map +1 -1
  146. package/dist/src/internal/builtin-plugins/solidity-test/config.d.ts.map +1 -1
  147. package/dist/src/internal/builtin-plugins/solidity-test/config.js +5 -3
  148. package/dist/src/internal/builtin-plugins/solidity-test/config.js.map +1 -1
  149. package/dist/src/internal/builtin-plugins/solidity-test/helpers.d.ts +0 -2
  150. package/dist/src/internal/builtin-plugins/solidity-test/helpers.d.ts.map +1 -1
  151. package/dist/src/internal/builtin-plugins/solidity-test/helpers.js +0 -3
  152. package/dist/src/internal/builtin-plugins/solidity-test/helpers.js.map +1 -1
  153. package/dist/src/internal/builtin-plugins/solidity-test/runner.d.ts +2 -8
  154. package/dist/src/internal/builtin-plugins/solidity-test/runner.d.ts.map +1 -1
  155. package/dist/src/internal/builtin-plugins/solidity-test/runner.js +47 -50
  156. package/dist/src/internal/builtin-plugins/solidity-test/runner.js.map +1 -1
  157. package/dist/src/internal/builtin-plugins/solidity-test/stack-trace-solidity-errors.d.ts.map +1 -1
  158. package/dist/src/internal/builtin-plugins/solidity-test/stack-trace-solidity-errors.js +11 -2
  159. package/dist/src/internal/builtin-plugins/solidity-test/stack-trace-solidity-errors.js.map +1 -1
  160. package/dist/src/internal/builtin-plugins/solidity-test/task-action.d.ts.map +1 -1
  161. package/dist/src/internal/builtin-plugins/solidity-test/task-action.js +108 -32
  162. package/dist/src/internal/builtin-plugins/solidity-test/task-action.js.map +1 -1
  163. package/dist/src/internal/builtin-plugins/solidity-test/type-extensions.d.ts +1 -2
  164. package/dist/src/internal/builtin-plugins/solidity-test/type-extensions.d.ts.map +1 -1
  165. package/dist/src/internal/builtin-plugins/test/task-action.d.ts.map +1 -1
  166. package/dist/src/internal/builtin-plugins/test/task-action.js +3 -4
  167. package/dist/src/internal/builtin-plugins/test/task-action.js.map +1 -1
  168. package/dist/src/internal/cli/main.d.ts.map +1 -1
  169. package/dist/src/internal/cli/main.js +8 -0
  170. package/dist/src/internal/cli/main.js.map +1 -1
  171. package/dist/src/types/artifacts.d.ts +5 -4
  172. package/dist/src/types/artifacts.d.ts.map +1 -1
  173. package/dist/src/types/network.d.ts +39 -0
  174. package/dist/src/types/network.d.ts.map +1 -1
  175. package/dist/src/types/solidity/build-system.d.ts +66 -3
  176. package/dist/src/types/solidity/build-system.d.ts.map +1 -1
  177. package/dist/src/types/solidity/build-system.js.map +1 -1
  178. package/dist/src/types/solidity/compilation-job.d.ts +6 -0
  179. package/dist/src/types/solidity/compilation-job.d.ts.map +1 -1
  180. package/dist/src/types/solidity/solidity-artifacts.d.ts +14 -0
  181. package/dist/src/types/solidity/solidity-artifacts.d.ts.map +1 -1
  182. package/package.json +8 -8
  183. package/src/internal/builtin-plugins/artifacts/artifact-manager.ts +9 -15
  184. package/src/internal/builtin-plugins/console/task-action.ts +2 -1
  185. package/src/internal/builtin-plugins/gas-analytics/exports.ts +1 -1
  186. package/src/internal/builtin-plugins/gas-analytics/function-gas-snapshots.ts +1 -2
  187. package/src/internal/builtin-plugins/gas-analytics/gas-analytics-manager.ts +100 -61
  188. package/src/internal/builtin-plugins/gas-analytics/helpers/accessors.ts +31 -0
  189. package/src/internal/builtin-plugins/gas-analytics/helpers/compat.ts +37 -0
  190. package/src/internal/builtin-plugins/gas-analytics/helpers/utils.ts +112 -0
  191. package/src/internal/builtin-plugins/gas-analytics/hook-handlers/hre.ts +1 -1
  192. package/src/internal/builtin-plugins/gas-analytics/hook-handlers/test.ts +1 -1
  193. package/src/internal/builtin-plugins/gas-analytics/snapshot-cheatcodes.ts +1 -2
  194. package/src/internal/builtin-plugins/gas-analytics/types.ts +11 -2
  195. package/src/internal/builtin-plugins/network-manager/edr/stack-traces/solidity-stack-trace.ts +4 -0
  196. package/src/internal/builtin-plugins/network-manager/edr/stack-traces/stack-trace-solidity-errors.ts +28 -4
  197. package/src/internal/builtin-plugins/network-manager/edr/utils/convert-to-edr.ts +2 -1
  198. package/src/internal/builtin-plugins/network-manager/hook-handlers/hre.ts +29 -0
  199. package/src/internal/builtin-plugins/network-manager/hook-handlers/network.ts +20 -14
  200. package/src/internal/builtin-plugins/network-manager/network-manager.ts +130 -27
  201. package/src/internal/builtin-plugins/network-manager/request-handlers/handlers/accounts/hd-wallet-handler.ts +1 -0
  202. package/src/internal/builtin-plugins/network-manager/request-handlers/handlers/accounts/local-accounts.ts +30 -13
  203. package/src/internal/builtin-plugins/network-manager/request-handlers/handlers/accounts/sender.ts +25 -17
  204. package/src/internal/builtin-plugins/network-manager/request-handlers/handlers/chain-id/chain-id-handler.ts +13 -5
  205. package/src/internal/builtin-plugins/network-manager/request-handlers/handlers/gas/automatic-gas-handler.ts +7 -1
  206. package/src/internal/builtin-plugins/network-manager/request-handlers/handlers/gas/automatic-gas-price-handler.ts +7 -1
  207. package/src/internal/builtin-plugins/network-manager/request-handlers/handlers/gas/fixed-gas-handler.ts +7 -1
  208. package/src/internal/builtin-plugins/network-manager/request-handlers/handlers/gas/fixed-gas-price-handler.ts +7 -1
  209. package/src/internal/builtin-plugins/network-manager/request-handlers/types.ts +10 -0
  210. package/src/internal/builtin-plugins/network-manager/revert-error-code.ts +2 -0
  211. package/src/internal/builtin-plugins/network-manager/type-extensions/config.ts +1 -1
  212. package/src/internal/builtin-plugins/network-manager/type-validation.ts +5 -1
  213. package/src/internal/builtin-plugins/node/json-rpc/handler.ts +10 -2
  214. package/src/internal/builtin-plugins/node/task-action.ts +2 -2
  215. package/src/internal/builtin-plugins/run/task-action.ts +2 -1
  216. package/src/internal/builtin-plugins/solidity/build-system/artifacts.ts +3 -0
  217. package/src/internal/builtin-plugins/solidity/build-system/build-system.ts +156 -34
  218. package/src/internal/builtin-plugins/solidity/build-system/cache.ts +2 -0
  219. package/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts +15 -9
  220. package/src/internal/builtin-plugins/solidity/build-system/dependency-graph.ts +9 -7
  221. package/src/internal/builtin-plugins/solidity/build-system/solc-info.ts +1 -0
  222. package/src/internal/builtin-plugins/solidity/build-system/warning-suppression.ts +2 -2
  223. package/src/internal/builtin-plugins/solidity/config.ts +23 -13
  224. package/src/internal/builtin-plugins/solidity/constants.ts +21 -0
  225. package/src/internal/builtin-plugins/solidity/tasks/build.ts +359 -74
  226. package/src/internal/builtin-plugins/solidity/type-extensions.ts +38 -8
  227. package/src/internal/builtin-plugins/solidity-test/config.ts +11 -2
  228. package/src/internal/builtin-plugins/solidity-test/helpers.ts +0 -7
  229. package/src/internal/builtin-plugins/solidity-test/runner.ts +64 -83
  230. package/src/internal/builtin-plugins/solidity-test/stack-trace-solidity-errors.ts +15 -2
  231. package/src/internal/builtin-plugins/solidity-test/task-action.ts +161 -43
  232. package/src/internal/builtin-plugins/solidity-test/type-extensions.ts +1 -2
  233. package/src/internal/builtin-plugins/test/task-action.ts +3 -4
  234. package/src/internal/cli/main.ts +14 -0
  235. package/src/types/artifacts.ts +5 -4
  236. package/src/types/network.ts +48 -0
  237. package/src/types/solidity/build-system.ts +66 -3
  238. package/src/types/solidity/compilation-job.ts +7 -0
  239. package/src/types/solidity/solidity-artifacts.ts +16 -0
  240. package/templates/hardhat-2/04-mocha-viem-ts/package.json +1 -1
  241. package/templates/hardhat-3/01-node-test-runner-viem/gitignore +11 -0
  242. package/templates/hardhat-3/01-node-test-runner-viem/package.json +12 -12
  243. package/templates/hardhat-3/01-node-test-runner-viem/scripts/send-op-tx.ts +1 -1
  244. package/templates/hardhat-3/01-node-test-runner-viem/test/Counter.ts +1 -1
  245. package/templates/hardhat-3/02-mocha-ethers/gitignore +11 -0
  246. package/templates/hardhat-3/02-mocha-ethers/package.json +14 -14
  247. package/templates/hardhat-3/02-mocha-ethers/scripts/send-op-tx.ts +1 -1
  248. package/templates/hardhat-3/02-mocha-ethers/test/Counter.ts +1 -1
  249. package/templates/hardhat-3/03-minimal/gitignore +11 -0
  250. package/templates/hardhat-3/03-minimal/package.json +1 -1
  251. package/dist/src/internal/builtin-plugins/gas-analytics/helpers.d.ts +0 -14
  252. package/dist/src/internal/builtin-plugins/gas-analytics/helpers.d.ts.map +0 -1
  253. package/dist/src/internal/builtin-plugins/gas-analytics/helpers.js +0 -55
  254. package/dist/src/internal/builtin-plugins/gas-analytics/helpers.js.map +0 -1
  255. package/src/internal/builtin-plugins/gas-analytics/helpers.ts +0 -96
@@ -1,5 +1,6 @@
1
1
  import type {
2
2
  ContractGasStatsJson,
3
+ DeploymentGasStatsJsonEntry,
3
4
  GasAnalyticsManager,
4
5
  GasMeasurement,
5
6
  GasStatsJson,
@@ -10,7 +11,10 @@ import type { TableItem } from "@nomicfoundation/hardhat-utils/format";
10
11
  import crypto from "node:crypto";
11
12
  import path from "node:path";
12
13
 
13
- import { HardhatError } from "@nomicfoundation/hardhat-errors";
14
+ import {
15
+ HardhatError,
16
+ assertHardhatInvariant,
17
+ } from "@nomicfoundation/hardhat-errors";
14
18
  import { formatTable } from "@nomicfoundation/hardhat-utils/format";
15
19
  import {
16
20
  ensureDir,
@@ -27,12 +31,27 @@ import debug from "debug";
27
31
 
28
32
  import { parseFullyQualifiedName } from "../../../utils/contract-names.js";
29
33
 
34
+ import {
35
+ avg,
36
+ getDisplayKey,
37
+ getFunctionName,
38
+ getProxyLabel,
39
+ getUserFqn,
40
+ makeGroupKey,
41
+ median,
42
+ } from "./helpers/utils.js";
43
+
30
44
  const gasStatsLog = debug(
31
45
  "hardhat:core:gas-analytics:gas-analytics-manager:gas-stats",
32
46
  );
33
47
 
48
+ interface DeploymentGasStats extends GasStats {
49
+ runtimeSize: number;
50
+ }
51
+
34
52
  interface ContractGasStats {
35
- deployment?: GasStats;
53
+ proxyChain: string[];
54
+ deployment?: DeploymentGasStats;
36
55
  functions: Map<
37
56
  string, // function name or signature (if overloaded)
38
57
  GasStats
@@ -52,7 +71,9 @@ interface GasStats {
52
71
  type GasMeasurementsByContract = Map<string, ContractGasMeasurements>;
53
72
 
54
73
  interface ContractGasMeasurements {
74
+ proxyChain: string[];
55
75
  deployments: number[];
76
+ deploymentRuntimeSize?: number;
56
77
  functions: Map<
57
78
  string, // functionSig
58
79
  number[]
@@ -170,18 +191,25 @@ export class GasAnalyticsManagerImplementation implements GasAnalyticsManager {
170
191
  const gasStatsByContract: GasStatsByContract = new Map();
171
192
  const measurementsByContract = this._aggregateGasMeasurements();
172
193
 
173
- for (const [contractFqn, measurements] of measurementsByContract) {
194
+ for (const [groupKey, measurements] of measurementsByContract) {
174
195
  const contractGasStats: ContractGasStats = {
196
+ proxyChain: measurements.proxyChain,
175
197
  functions: new Map(),
176
198
  };
177
199
 
178
200
  if (measurements.deployments.length > 0) {
201
+ assertHardhatInvariant(
202
+ measurements.deploymentRuntimeSize !== undefined,
203
+ "deploymentRuntimeSize must be set when deployments exist",
204
+ );
205
+
179
206
  contractGasStats.deployment = {
180
207
  min: Math.min(...measurements.deployments),
181
208
  max: Math.max(...measurements.deployments),
182
209
  avg: Math.round(avg(measurements.deployments)),
183
210
  median: Math.round(median(measurements.deployments)),
184
211
  count: measurements.deployments.length,
212
+ runtimeSize: measurements.deploymentRuntimeSize,
185
213
  };
186
214
  }
187
215
 
@@ -207,7 +235,20 @@ export class GasAnalyticsManagerImplementation implements GasAnalyticsManager {
207
235
  );
208
236
  }
209
237
 
210
- gasStatsByContract.set(contractFqn, contractGasStats);
238
+ gasStatsByContract.set(groupKey, contractGasStats);
239
+ }
240
+
241
+ // Duplicate deployment stats from direct-call groups to proxied groups
242
+ for (const [groupKey, stats] of gasStatsByContract) {
243
+ if (stats.proxyChain.length > 0 && stats.deployment === undefined) {
244
+ // Extract contractFqn from the groupKey (everything before the first \0)
245
+ const contractFqn = groupKey.split("\0")[0];
246
+ const directKey = makeGroupKey(contractFqn, []);
247
+ const directStats = gasStatsByContract.get(directKey);
248
+ if (directStats?.deployment !== undefined) {
249
+ stats.deployment = directStats.deployment;
250
+ }
251
+ }
211
252
  }
212
253
 
213
254
  return gasStatsByContract;
@@ -220,22 +261,28 @@ export class GasAnalyticsManagerImplementation implements GasAnalyticsManager {
220
261
  const measurementsByContract: GasMeasurementsByContract = new Map();
221
262
 
222
263
  for (const currentMeasurement of this.gasMeasurements) {
223
- let contractMeasurements = measurementsByContract.get(
224
- currentMeasurement.contractFqn,
225
- );
264
+ const proxyChain =
265
+ currentMeasurement.type === "function"
266
+ ? currentMeasurement.proxyChain
267
+ : [];
268
+ const groupKey = makeGroupKey(currentMeasurement.contractFqn, proxyChain);
269
+
270
+ let contractMeasurements = measurementsByContract.get(groupKey);
226
271
  if (contractMeasurements === undefined) {
227
272
  contractMeasurements = {
273
+ proxyChain,
228
274
  deployments: [],
229
275
  functions: new Map(),
230
276
  };
231
- measurementsByContract.set(
232
- currentMeasurement.contractFqn,
233
- contractMeasurements,
234
- );
277
+ measurementsByContract.set(groupKey, contractMeasurements);
235
278
  }
236
279
 
237
280
  if (currentMeasurement.type === "deployment") {
238
281
  contractMeasurements.deployments.push(currentMeasurement.gas);
282
+ if (contractMeasurements.deploymentRuntimeSize === undefined) {
283
+ contractMeasurements.deploymentRuntimeSize =
284
+ currentMeasurement.runtimeSize;
285
+ }
239
286
  } else {
240
287
  let measurements = contractMeasurements.functions.get(
241
288
  currentMeasurement.functionSig,
@@ -267,15 +314,16 @@ export class GasAnalyticsManagerImplementation implements GasAnalyticsManager {
267
314
  rows.push({ type: "title", text: chalk.bold("Gas Usage Statistics") });
268
315
  }
269
316
 
270
- // Sort contracts alphabetically for consistent output
271
- const sortedContracts = [...gasStatsByContract.entries()].sort(([a], [b]) =>
272
- a.localeCompare(b),
273
- );
274
-
275
- for (const [contractFqn, contractGasStats] of sortedContracts) {
317
+ const sortedContracts = getSortedContractEntries(gasStatsByContract);
318
+ for (const {
319
+ userFqn,
320
+ proxyLabel,
321
+ stats: contractGasStats,
322
+ } of sortedContracts) {
276
323
  rows.push({
277
324
  type: "section-header",
278
- text: chalk.cyan.bold(getUserFqn(contractFqn)),
325
+ text: chalk.cyan.bold(userFqn),
326
+ subtitle: proxyLabel !== undefined ? chalk.cyan(proxyLabel) : undefined,
279
327
  });
280
328
 
281
329
  if (contractGasStats.functions.size > 0) {
@@ -337,6 +385,13 @@ export class GasAnalyticsManagerImplementation implements GasAnalyticsManager {
337
385
  `${contractGasStats.deployment.count}`,
338
386
  ],
339
387
  });
388
+ rows.push({
389
+ type: "header",
390
+ cells: [
391
+ chalk.yellow("Bytecode size"),
392
+ `${contractGasStats.deployment.runtimeSize}`,
393
+ ],
394
+ });
340
395
  }
341
396
  }
342
397
 
@@ -349,19 +404,13 @@ export class GasAnalyticsManagerImplementation implements GasAnalyticsManager {
349
404
  public _generateGasStatsJson(
350
405
  gasStatsByContract: GasStatsByContract,
351
406
  ): GasStatsJson {
352
- const sortedContracts = [...gasStatsByContract.entries()]
353
- .map(([internalFqn, stats]) => ({
354
- userFqn: getUserFqn(internalFqn),
355
- stats,
356
- }))
357
- .sort((a, b) => a.userFqn.localeCompare(b.userFqn));
358
-
407
+ const sortedContracts = getSortedContractEntries(gasStatsByContract);
359
408
  const contracts: Record<string, ContractGasStatsJson> = {};
360
409
 
361
- for (const { userFqn, stats } of sortedContracts) {
410
+ for (const { userFqn, displayKey, stats } of sortedContracts) {
362
411
  const { sourceName, contractName } = parseFullyQualifiedName(userFqn);
363
412
 
364
- const deployment: GasStatsJsonEntry | null =
413
+ const deployment: DeploymentGasStatsJsonEntry | null =
365
414
  stats.deployment !== undefined ? { ...stats.deployment } : null;
366
415
 
367
416
  let functions: Record<string, GasStatsJsonEntry> | null = null;
@@ -377,44 +426,34 @@ export class GasAnalyticsManagerImplementation implements GasAnalyticsManager {
377
426
  functions = Object.fromEntries(sortedFunctions);
378
427
  }
379
428
 
380
- contracts[userFqn] = { sourceName, contractName, deployment, functions };
429
+ contracts[displayKey] = {
430
+ sourceName,
431
+ contractName,
432
+ proxyChain: stats.proxyChain.map(getUserFqn),
433
+ deployment,
434
+ functions,
435
+ };
381
436
  }
382
437
 
383
438
  return { contracts };
384
439
  }
385
440
  }
386
441
 
387
- export function avg(values: number[]): number {
388
- return values.reduce((a, c) => a + c, 0) / values.length;
389
- }
390
-
391
- export function median(values: number[]): number {
392
- const sorted = [...values].sort((a, b) => a - b);
393
- const mid = Math.floor(sorted.length / 2);
394
-
395
- return sorted.length % 2 === 1
396
- ? sorted[mid]
397
- : (sorted[mid - 1] + sorted[mid]) / 2;
398
- }
399
-
400
- export function getUserFqn(inputFqn: string): string {
401
- if (inputFqn.startsWith("project/")) {
402
- return inputFqn.slice("project/".length);
403
- }
404
-
405
- if (inputFqn.startsWith("npm/")) {
406
- const withoutPrefix = inputFqn.slice("npm/".length);
407
- // Match "<pkg>@<version>/<rest>", where <pkg> may be scoped (@scope/pkg)
408
- const match = withoutPrefix.match(/^(@?[^@/]+(?:\/[^@/]+)*)@[^/]+\/(.*)$/);
409
- if (match !== null) {
410
- return `${match[1]}/${match[2]}`;
411
- }
412
- return withoutPrefix;
413
- }
414
-
415
- return inputFqn;
416
- }
417
-
418
- export function getFunctionName(signature: string): string {
419
- return signature.split("(")[0];
442
+ function getSortedContractEntries(
443
+ gasStatsByContract: GasStatsByContract,
444
+ ): Array<{
445
+ userFqn: string;
446
+ displayKey: string;
447
+ proxyLabel: string | undefined;
448
+ stats: ContractGasStats;
449
+ }> {
450
+ return [...gasStatsByContract.entries()]
451
+ .map(([groupKey, stats]) => {
452
+ const contractFqn = groupKey.split("\0")[0];
453
+ const userFqn = getUserFqn(contractFqn);
454
+ const displayKey = getDisplayKey(userFqn, stats.proxyChain);
455
+ const proxyLabel = getProxyLabel(stats.proxyChain);
456
+ return { userFqn, displayKey, proxyLabel, stats };
457
+ })
458
+ .sort((a, b) => a.displayKey.localeCompare(b.displayKey));
420
459
  }
@@ -0,0 +1,31 @@
1
+ import type { HookContext } from "../../../../types/hooks.js";
2
+ import type { HardhatRuntimeEnvironment } from "../../../../types/hre.js";
3
+ import type { GasAnalyticsManager } from "../types.js";
4
+
5
+ import { assertHardhatInvariant } from "@nomicfoundation/hardhat-errors";
6
+
7
+ import { HardhatRuntimeEnvironmentImplementation } from "../../../core/hre.js";
8
+ import { GasAnalyticsManagerImplementation } from "../gas-analytics-manager.js";
9
+
10
+ export function getGasAnalyticsManager(
11
+ hookContextOrHre: HookContext | HardhatRuntimeEnvironment,
12
+ ): GasAnalyticsManager {
13
+ assertHardhatInvariant(
14
+ "_gasAnalytics" in hookContextOrHre &&
15
+ hookContextOrHre._gasAnalytics instanceof
16
+ GasAnalyticsManagerImplementation,
17
+ "Expected _gasAnalytics to be an instance of GasAnalyticsManagerImplementation",
18
+ );
19
+ return hookContextOrHre._gasAnalytics;
20
+ }
21
+
22
+ export function setGasAnalyticsManager(
23
+ hre: HardhatRuntimeEnvironment,
24
+ gasAnalyticsManager: GasAnalyticsManager,
25
+ ): void {
26
+ assertHardhatInvariant(
27
+ hre instanceof HardhatRuntimeEnvironmentImplementation,
28
+ "Expected HRE to be an instance of HardhatRuntimeEnvironmentImplementation",
29
+ );
30
+ hre._gasAnalytics = gasAnalyticsManager;
31
+ }
@@ -0,0 +1,37 @@
1
+ import type { HardhatRuntimeEnvironment } from "../../../../types/hre.js";
2
+
3
+ import {
4
+ testRunDone,
5
+ testRunStart,
6
+ testWorkerDone,
7
+ } from "../hook-handlers/test.js";
8
+
9
+ /**
10
+ * The following helpers are kept for backward compatibility with older versions
11
+ * of test runner plugins (hardhat-mocha, hardhat-node-test-runner) that import
12
+ * from "hardhat/internal/gas-analytics".
13
+ */
14
+
15
+ let cachedHre: HardhatRuntimeEnvironment | undefined;
16
+ async function getHre(): Promise<HardhatRuntimeEnvironment> {
17
+ if (cachedHre === undefined) {
18
+ const { default: hre } = await import("../../../../index.js");
19
+ cachedHre = hre;
20
+ }
21
+ return cachedHre;
22
+ }
23
+
24
+ export async function markTestRunStart(id: string): Promise<void> {
25
+ const hre = await getHre();
26
+ await testRunStart(hre, id);
27
+ }
28
+
29
+ export async function markTestWorkerDone(id: string): Promise<void> {
30
+ const hre = await getHre();
31
+ await testWorkerDone(hre, id);
32
+ }
33
+
34
+ export async function markTestRunDone(id: string): Promise<void> {
35
+ const hre = await getHre();
36
+ await testRunDone(hre, id);
37
+ }
@@ -0,0 +1,112 @@
1
+ import chalk from "chalk";
2
+
3
+ /**
4
+ * Converts an internal FQN (e.g. `"project/contracts/Foo.sol:Foo"` or
5
+ * `"npm/@oz/contracts@5.0.0/token/ERC20.sol:ERC20"`) to its user-friendly
6
+ * form by stripping the `project/` prefix or npm version segment.
7
+ */
8
+ export function getUserFqn(inputFqn: string): string {
9
+ if (inputFqn.startsWith("project/")) {
10
+ return inputFqn.slice("project/".length);
11
+ }
12
+
13
+ if (inputFqn.startsWith("npm/")) {
14
+ const withoutPrefix = inputFqn.slice("npm/".length);
15
+ // Match "<pkg>@<version>/<rest>", where <pkg> may be scoped (@scope/pkg)
16
+ const match = withoutPrefix.match(/^(@?[^@/]+(?:\/[^@/]+)*)@[^/]+\/(.*)$/);
17
+ if (match !== null) {
18
+ return `${match[1]}/${match[2]}`;
19
+ }
20
+ return withoutPrefix;
21
+ }
22
+
23
+ return inputFqn;
24
+ }
25
+
26
+ /**
27
+ * Extracts the function name from a Solidity function signature
28
+ * (e.g. `"transfer(address,uint256)"` → `"transfer"`).
29
+ */
30
+ export function getFunctionName(signature: string): string {
31
+ return signature.split("(")[0];
32
+ }
33
+
34
+ /**
35
+ * Builds a deterministic string key for grouping gas measurements by
36
+ * (contractFqn, proxyChain). Uses null-byte separators to avoid collisions.
37
+ */
38
+ export function makeGroupKey(
39
+ contractFqn: string,
40
+ proxyChain: string[],
41
+ ): string {
42
+ if (proxyChain.length === 0) {
43
+ return contractFqn;
44
+ }
45
+ return contractFqn + "\0" + proxyChain.join("\0");
46
+ }
47
+
48
+ /**
49
+ * Returns a human-readable proxy label like `"(via Proxy2 → Proxy)"`,
50
+ * or `undefined` for direct calls. Strips the last element (the
51
+ * implementation) and converts internal FQNs to user-friendly format.
52
+ */
53
+ export function getProxyLabel(proxyChain: string[]): string | undefined {
54
+ const proxies = proxyChain.slice(0, -1).map(getUserFqn);
55
+ if (proxies.length === 0) {
56
+ return undefined;
57
+ }
58
+ return `(via ${proxies.join(" → ")})`;
59
+ }
60
+
61
+ /**
62
+ * Returns a display key for a contract entry, appending the proxy label
63
+ * when the call went through a proxy chain. Used for table headers and
64
+ * JSON object keys.
65
+ */
66
+ export function getDisplayKey(userFqn: string, proxyChain: string[]): string {
67
+ const label = getProxyLabel(proxyChain);
68
+ if (label === undefined) {
69
+ return userFqn;
70
+ }
71
+ return `${userFqn} ${label}`;
72
+ }
73
+
74
+ export function avg(values: number[]): number {
75
+ return values.reduce((a, c) => a + c, 0) / values.length;
76
+ }
77
+
78
+ export function median(values: number[]): number {
79
+ const sorted = [...values].sort((a, b) => a - b);
80
+ const mid = Math.floor(sorted.length / 2);
81
+
82
+ return sorted.length % 2 === 1
83
+ ? sorted[mid]
84
+ : (sorted[mid - 1] + sorted[mid]) / 2;
85
+ }
86
+
87
+ export function formatSectionHeader(
88
+ sectionName: string,
89
+ {
90
+ changedLength,
91
+ addedLength,
92
+ removedLength,
93
+ }: {
94
+ changedLength: number;
95
+ addedLength: number;
96
+ removedLength: number;
97
+ },
98
+ ): string {
99
+ const parts: string[] = [];
100
+
101
+ if (changedLength > 0) {
102
+ parts.push(`${changedLength} changed`);
103
+ }
104
+ if (addedLength > 0) {
105
+ parts.push(`${addedLength} added`);
106
+ }
107
+ if (removedLength > 0) {
108
+ parts.push(`${removedLength} removed`);
109
+ }
110
+
111
+ return `${sectionName}: ${chalk.gray(parts.join(", "))}`;
112
+ }
@@ -1,7 +1,7 @@
1
1
  import type { HardhatRuntimeEnvironmentHooks } from "../../../../types/hooks.js";
2
2
 
3
3
  import { GasAnalyticsManagerImplementation } from "../gas-analytics-manager.js";
4
- import { setGasAnalyticsManager } from "../helpers.js";
4
+ import { setGasAnalyticsManager } from "../helpers/accessors.js";
5
5
 
6
6
  export default async (): Promise<Partial<HardhatRuntimeEnvironmentHooks>> => ({
7
7
  created: async (context, hre) => {
@@ -1,6 +1,6 @@
1
1
  import type { HookContext, TestHooks } from "../../../../types/hooks.js";
2
2
 
3
- import { getGasAnalyticsManager } from "../helpers.js";
3
+ import { getGasAnalyticsManager } from "../helpers/accessors.js";
4
4
 
5
5
  export default async (): Promise<Partial<TestHooks>> => ({
6
6
  onTestRunStart: async (context, id, next) => {
@@ -18,8 +18,7 @@ import {
18
18
  parseFullyQualifiedName,
19
19
  } from "../../../utils/contract-names.js";
20
20
 
21
- import { getUserFqn } from "./gas-analytics-manager.js";
22
- import { formatSectionHeader } from "./helpers.js";
21
+ import { formatSectionHeader, getUserFqn } from "./helpers/utils.js";
23
22
 
24
23
  export const SNAPSHOT_CHEATCODES_DIR = "snapshots";
25
24
 
@@ -9,6 +9,13 @@ export interface GasStatsJsonEntry {
9
9
  count: number;
10
10
  }
11
11
 
12
+ /**
13
+ * Gas statistics for a deployment, including bytecode size.
14
+ */
15
+ export interface DeploymentGasStatsJsonEntry extends GasStatsJsonEntry {
16
+ runtimeSize: number;
17
+ }
18
+
12
19
  /**
13
20
  * Gas statistics for a single contract in the JSON output.
14
21
  * `deployment` is null when the contract was never deployed during the test run
@@ -18,7 +25,8 @@ export interface GasStatsJsonEntry {
18
25
  export interface ContractGasStatsJson {
19
26
  sourceName: string;
20
27
  contractName: string;
21
- deployment: GasStatsJsonEntry | null;
28
+ proxyChain: string[];
29
+ deployment: DeploymentGasStatsJsonEntry | null;
22
30
  functions: Record<string, GasStatsJsonEntry> | null;
23
31
  }
24
32
 
@@ -39,11 +47,12 @@ interface BaseGasMeasurement {
39
47
  interface FunctionGasMeasurement extends BaseGasMeasurement {
40
48
  type: "function";
41
49
  functionSig: string;
50
+ proxyChain: string[];
42
51
  }
43
52
 
44
53
  interface DeploymentGasMeasurement extends BaseGasMeasurement {
45
54
  type: "deployment";
46
- size: number;
55
+ runtimeSize: number;
47
56
  }
48
57
 
49
58
  export type GasMeasurement = FunctionGasMeasurement | DeploymentGasMeasurement;
@@ -25,10 +25,12 @@ import type {
25
25
  InternalFunctionCallStackEntry,
26
26
  ContractCallRunOutOfGasError,
27
27
  CheatcodeErrorStackTraceEntry,
28
+ CheatcodeErrorDetails,
28
29
  } from "@nomicfoundation/edr";
29
30
 
30
31
  import {
31
32
  StackTraceEntryType,
33
+ CheatcodeErrorCode,
32
34
  stackTraceEntryTypeToString,
33
35
  FALLBACK_FUNCTION_NAME,
34
36
  RECEIVE_FUNCTION_NAME,
@@ -42,6 +44,7 @@ import {
42
44
  export {
43
45
  SourceReference,
44
46
  StackTraceEntryType,
47
+ CheatcodeErrorCode,
45
48
  stackTraceEntryTypeToString,
46
49
  FALLBACK_FUNCTION_NAME,
47
50
  RECEIVE_FUNCTION_NAME,
@@ -77,6 +80,7 @@ export type {
77
80
  ContractTooLargeErrorStackTraceEntry,
78
81
  InternalFunctionCallStackEntry,
79
82
  ContractCallRunOutOfGasError,
83
+ CheatcodeErrorDetails,
80
84
  };
81
85
 
82
86
  export type SolidityStackTraceEntry =
@@ -9,8 +9,11 @@ import { assertHardhatInvariant } from "@nomicfoundation/hardhat-errors";
9
9
  import { bytesToHexString } from "@nomicfoundation/hardhat-utils/bytes";
10
10
  import { panicErrorCodeToMessage } from "@nomicfoundation/hardhat-utils/panic-errors";
11
11
 
12
+ import { REVERT_ERROR_CODE } from "../../revert-error-code.js";
13
+
12
14
  import {
13
15
  StackTraceEntryType,
16
+ CheatcodeErrorCode,
14
17
  CONSTRUCTOR_FUNCTION_NAME,
15
18
  PRECOMPILE_FUNCTION_NAME,
16
19
  UNKNOWN_FUNCTION_NAME,
@@ -266,9 +269,25 @@ function getMessageFromLastStackTraceEntry(
266
269
  return `VM Exception while processing transaction: ${panicMessage}`;
267
270
 
268
271
  case StackTraceEntryType.CUSTOM_ERROR:
269
- case StackTraceEntryType.CHEATCODE_ERROR:
270
272
  return `VM Exception while processing transaction: ${stackTraceEntry.message}`;
271
273
 
274
+ case StackTraceEntryType.CHEATCODE_ERROR: {
275
+ let message = stackTraceEntry.message;
276
+
277
+ if (stackTraceEntry.details !== undefined) {
278
+ switch (stackTraceEntry.details.code) {
279
+ case CheatcodeErrorCode.UnsupportedCheatcode:
280
+ message = `Cheatcode '${stackTraceEntry.details.cheatcode}' is not supported by Hardhat.`;
281
+ break;
282
+ case CheatcodeErrorCode.MissingCheatcode:
283
+ message = `Cheatcode '${stackTraceEntry.details.cheatcode}' is not yet available in this version of Hardhat.`;
284
+ break;
285
+ }
286
+ }
287
+
288
+ return `VM Exception while processing transaction: ${message}`;
289
+ }
290
+
272
291
  case StackTraceEntryType.OTHER_EXECUTION_ERROR:
273
292
  // TODO: What if there was returnData?
274
293
  return `Transaction reverted and Hardhat couldn't infer the reason.`;
@@ -293,11 +312,15 @@ function getMessageFromLastStackTraceEntry(
293
312
  }
294
313
 
295
314
  /**
296
- * Note: This error class MUST NOT extend ProviderError, as libraries use the
297
- * code property to detect if they are dealing with a JSON-RPC error, and take
298
- * control of errors.
315
+ * Note: This error class does not extend ProviderError because it carries
316
+ * Solidity-specific data (stackTrace) that ProviderError does not model.
317
+ * It does carry `code = 3` to match the de facto standard used by geth and
318
+ * anvil for execution revert errors, allowing libraries like viem to
319
+ * properly detect and handle revert errors via the error cause chain.
299
320
  **/
300
321
  export class SolidityError extends Error {
322
+ public readonly code: number = REVERT_ERROR_CODE;
323
+
301
324
  constructor(
302
325
  message: string,
303
326
  public readonly stackTrace: SolidityStackTrace,
@@ -305,6 +328,7 @@ export class SolidityError extends Error {
305
328
  public readonly transactionHash?: string,
306
329
  ) {
307
330
  super(message);
331
+ this.name = "SolidityError";
308
332
 
309
333
  Object.defineProperty(this, Symbol.for("nodejs.util.inspect.custom"), {
310
334
  value: () =>
@@ -404,7 +404,7 @@ export function edrGasReportToHardhatGasMeasurements(
404
404
  contractFqn,
405
405
  type: "deployment",
406
406
  gas: Number(deployment.gas),
407
- size: Number(deployment.size),
407
+ runtimeSize: Number(deployment.runtimeSize),
408
408
  });
409
409
  }
410
410
  }
@@ -418,6 +418,7 @@ export function edrGasReportToHardhatGasMeasurements(
418
418
  type: "function",
419
419
  functionSig,
420
420
  gas: Number(call.gas),
421
+ proxyChain: call.proxyChain,
421
422
  });
422
423
  }
423
424
  }
@@ -12,6 +12,14 @@ export default async (): Promise<Partial<HardhatRuntimeEnvironmentHooks>> => ({
12
12
  let networkManager: NetworkManager | undefined;
13
13
 
14
14
  hre.network = {
15
+ async create(networkConnectionParams) {
16
+ if (networkManager === undefined) {
17
+ networkManager = await createNetworkManager(hre, context);
18
+ }
19
+
20
+ return networkManager.create(networkConnectionParams);
21
+ },
22
+
15
23
  async connect(networkConnectionParams) {
16
24
  if (networkManager === undefined) {
17
25
  networkManager = await createNetworkManager(hre, context);
@@ -19,6 +27,15 @@ export default async (): Promise<Partial<HardhatRuntimeEnvironmentHooks>> => ({
19
27
 
20
28
  return networkManager.connect(networkConnectionParams);
21
29
  },
30
+
31
+ async getOrCreate(networkOrParams) {
32
+ if (networkManager === undefined) {
33
+ networkManager = await createNetworkManager(hre, context);
34
+ }
35
+
36
+ return networkManager.getOrCreate(networkOrParams);
37
+ },
38
+
22
39
  async createServer(...params) {
23
40
  if (networkManager === undefined) {
24
41
  networkManager = await createNetworkManager(hre, context);
@@ -27,6 +44,18 @@ export default async (): Promise<Partial<HardhatRuntimeEnvironmentHooks>> => ({
27
44
  return networkManager.createServer(...params);
28
45
  },
29
46
  };
47
+
48
+ // To avoid adding `wasConnectCalled` to the public interface of
49
+ // `NetworkManager`, we add this pass through method that is only
50
+ // called from the `main` function.
51
+ Object.defineProperty(hre.network, "wasConnectCalled", {
52
+ value: () =>
53
+ networkManager !== undefined &&
54
+ "wasConnectCalled" in networkManager &&
55
+ typeof networkManager.wasConnectCalled === "function" &&
56
+ networkManager.wasConnectCalled(),
57
+ enumerable: false,
58
+ });
30
59
  },
31
60
  });
32
61