hardhat 3.1.12 → 3.3.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 (304) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/dist/src/internal/builtin-global-options.d.ts.map +1 -1
  3. package/dist/src/internal/builtin-global-options.js +14 -1
  4. package/dist/src/internal/builtin-global-options.js.map +1 -1
  5. package/dist/src/internal/builtin-plugins/coverage/helpers.d.ts +5 -0
  6. package/dist/src/internal/builtin-plugins/coverage/helpers.d.ts.map +1 -1
  7. package/dist/src/internal/builtin-plugins/coverage/helpers.js +12 -0
  8. package/dist/src/internal/builtin-plugins/coverage/helpers.js.map +1 -1
  9. package/dist/src/internal/builtin-plugins/coverage/hook-handlers/hre.d.ts.map +1 -1
  10. package/dist/src/internal/builtin-plugins/coverage/hook-handlers/hre.js +2 -5
  11. package/dist/src/internal/builtin-plugins/coverage/hook-handlers/hre.js.map +1 -1
  12. package/dist/src/internal/builtin-plugins/coverage/hook-handlers/solidity.d.ts.map +1 -1
  13. package/dist/src/internal/builtin-plugins/coverage/hook-handlers/solidity.js +3 -5
  14. package/dist/src/internal/builtin-plugins/coverage/hook-handlers/solidity.js.map +1 -1
  15. package/dist/src/internal/builtin-plugins/coverage/hook-handlers/test.d.ts.map +1 -1
  16. package/dist/src/internal/builtin-plugins/coverage/hook-handlers/test.js +4 -15
  17. package/dist/src/internal/builtin-plugins/coverage/hook-handlers/test.js.map +1 -1
  18. package/dist/src/internal/builtin-plugins/gas-analytics/gas-analytics-manager.d.ts +11 -10
  19. package/dist/src/internal/builtin-plugins/gas-analytics/gas-analytics-manager.d.ts.map +1 -1
  20. package/dist/src/internal/builtin-plugins/gas-analytics/gas-analytics-manager.js +80 -13
  21. package/dist/src/internal/builtin-plugins/gas-analytics/gas-analytics-manager.js.map +1 -1
  22. package/dist/src/internal/builtin-plugins/gas-analytics/helpers.d.ts +5 -5
  23. package/dist/src/internal/builtin-plugins/gas-analytics/helpers.d.ts.map +1 -1
  24. package/dist/src/internal/builtin-plugins/gas-analytics/helpers.js +25 -3
  25. package/dist/src/internal/builtin-plugins/gas-analytics/helpers.js.map +1 -1
  26. package/dist/src/internal/builtin-plugins/gas-analytics/hook-handlers/hre.d.ts.map +1 -1
  27. package/dist/src/internal/builtin-plugins/gas-analytics/hook-handlers/hre.js +4 -5
  28. package/dist/src/internal/builtin-plugins/gas-analytics/hook-handlers/hre.js.map +1 -1
  29. package/dist/src/internal/builtin-plugins/gas-analytics/hook-handlers/test.d.ts.map +1 -1
  30. package/dist/src/internal/builtin-plugins/gas-analytics/hook-handlers/test.js +13 -17
  31. package/dist/src/internal/builtin-plugins/gas-analytics/hook-handlers/test.js.map +1 -1
  32. package/dist/src/internal/builtin-plugins/gas-analytics/index.d.ts.map +1 -1
  33. package/dist/src/internal/builtin-plugins/gas-analytics/index.js +8 -1
  34. package/dist/src/internal/builtin-plugins/gas-analytics/index.js.map +1 -1
  35. package/dist/src/internal/builtin-plugins/gas-analytics/type-extensions.d.ts +1 -0
  36. package/dist/src/internal/builtin-plugins/gas-analytics/type-extensions.d.ts.map +1 -1
  37. package/dist/src/internal/builtin-plugins/gas-analytics/types.d.ts +33 -0
  38. package/dist/src/internal/builtin-plugins/gas-analytics/types.d.ts.map +1 -1
  39. package/dist/src/internal/builtin-plugins/network-manager/accounts/derive-private-keys.d.ts.map +1 -1
  40. package/dist/src/internal/builtin-plugins/network-manager/accounts/derive-private-keys.js +12 -2
  41. package/dist/src/internal/builtin-plugins/network-manager/accounts/derive-private-keys.js.map +1 -1
  42. package/dist/src/internal/builtin-plugins/network-manager/edr/edr-provider.d.ts +9 -3
  43. package/dist/src/internal/builtin-plugins/network-manager/edr/edr-provider.d.ts.map +1 -1
  44. package/dist/src/internal/builtin-plugins/network-manager/edr/edr-provider.js +65 -42
  45. package/dist/src/internal/builtin-plugins/network-manager/edr/edr-provider.js.map +1 -1
  46. package/dist/src/internal/builtin-plugins/network-manager/edr/genesis-state.d.ts +11 -0
  47. package/dist/src/internal/builtin-plugins/network-manager/edr/genesis-state.d.ts.map +1 -0
  48. package/dist/src/internal/builtin-plugins/network-manager/edr/genesis-state.js +104 -0
  49. package/dist/src/internal/builtin-plugins/network-manager/edr/genesis-state.js.map +1 -0
  50. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/trace-formatters.d.ts +6 -0
  51. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/trace-formatters.d.ts.map +1 -0
  52. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/trace-formatters.js +152 -0
  53. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/trace-formatters.js.map +1 -0
  54. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/trace-output.d.ts +19 -0
  55. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/trace-output.d.ts.map +1 -0
  56. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/trace-output.js +104 -0
  57. package/dist/src/internal/builtin-plugins/network-manager/edr/utils/trace-output.js.map +1 -0
  58. package/dist/src/internal/builtin-plugins/network-manager/hook-handlers/hre.js +1 -1
  59. package/dist/src/internal/builtin-plugins/network-manager/hook-handlers/hre.js.map +1 -1
  60. package/dist/src/internal/builtin-plugins/network-manager/hook-handlers/network.d.ts.map +1 -1
  61. package/dist/src/internal/builtin-plugins/network-manager/hook-handlers/network.js +8 -8
  62. package/dist/src/internal/builtin-plugins/network-manager/hook-handlers/network.js.map +1 -1
  63. package/dist/src/internal/builtin-plugins/network-manager/http-provider.d.ts.map +1 -1
  64. package/dist/src/internal/builtin-plugins/network-manager/http-provider.js +1 -0
  65. package/dist/src/internal/builtin-plugins/network-manager/http-provider.js.map +1 -1
  66. package/dist/src/internal/builtin-plugins/network-manager/network-manager.d.ts +2 -2
  67. package/dist/src/internal/builtin-plugins/network-manager/network-manager.d.ts.map +1 -1
  68. package/dist/src/internal/builtin-plugins/network-manager/network-manager.js +78 -8
  69. package/dist/src/internal/builtin-plugins/network-manager/network-manager.js.map +1 -1
  70. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/accounts/local-accounts.d.ts.map +1 -1
  71. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/accounts/local-accounts.js +56 -33
  72. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers/accounts/local-accounts.js.map +1 -1
  73. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers-array.d.ts +0 -3
  74. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers-array.d.ts.map +1 -1
  75. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers-array.js +9 -12
  76. package/dist/src/internal/builtin-plugins/network-manager/request-handlers/handlers-array.js.map +1 -1
  77. package/dist/src/internal/builtin-plugins/node/artifacts/build-info-watcher.d.ts.map +1 -1
  78. package/dist/src/internal/builtin-plugins/node/artifacts/build-info-watcher.js +1 -1
  79. package/dist/src/internal/builtin-plugins/node/artifacts/build-info-watcher.js.map +1 -1
  80. package/dist/src/internal/builtin-plugins/node/helpers.d.ts.map +1 -1
  81. package/dist/src/internal/builtin-plugins/node/helpers.js +6 -2
  82. package/dist/src/internal/builtin-plugins/node/helpers.js.map +1 -1
  83. package/dist/src/internal/builtin-plugins/node/json-rpc/handler.js +7 -2
  84. package/dist/src/internal/builtin-plugins/node/json-rpc/handler.js.map +1 -1
  85. package/dist/src/internal/builtin-plugins/solidity/build-system/artifacts.d.ts.map +1 -1
  86. package/dist/src/internal/builtin-plugins/solidity/build-system/artifacts.js +4 -0
  87. package/dist/src/internal/builtin-plugins/solidity/build-system/artifacts.js.map +1 -1
  88. package/dist/src/internal/builtin-plugins/solidity/build-system/build-system.d.ts +5 -1
  89. package/dist/src/internal/builtin-plugins/solidity/build-system/build-system.d.ts.map +1 -1
  90. package/dist/src/internal/builtin-plugins/solidity/build-system/build-system.js +86 -47
  91. package/dist/src/internal/builtin-plugins/solidity/build-system/build-system.js.map +1 -1
  92. package/dist/src/internal/builtin-plugins/solidity/build-system/cache.d.ts +1 -0
  93. package/dist/src/internal/builtin-plugins/solidity/build-system/cache.d.ts.map +1 -1
  94. package/dist/src/internal/builtin-plugins/solidity/build-system/cache.js.map +1 -1
  95. package/dist/src/internal/builtin-plugins/solidity/build-system/compilation-job.d.ts +3 -3
  96. package/dist/src/internal/builtin-plugins/solidity/build-system/compilation-job.d.ts.map +1 -1
  97. package/dist/src/internal/builtin-plugins/solidity/build-system/compilation-job.js +24 -4
  98. package/dist/src/internal/builtin-plugins/solidity/build-system/compilation-job.js.map +1 -1
  99. package/dist/src/internal/builtin-plugins/solidity/build-system/compiler/compiler.d.ts +16 -0
  100. package/dist/src/internal/builtin-plugins/solidity/build-system/compiler/compiler.d.ts.map +1 -1
  101. package/dist/src/internal/builtin-plugins/solidity/build-system/compiler/compiler.js +1 -1
  102. package/dist/src/internal/builtin-plugins/solidity/build-system/compiler/compiler.js.map +1 -1
  103. package/dist/src/internal/builtin-plugins/solidity/build-system/compiler/downloader.d.ts.map +1 -1
  104. package/dist/src/internal/builtin-plugins/solidity/build-system/compiler/downloader.js +1 -2
  105. package/dist/src/internal/builtin-plugins/solidity/build-system/compiler/downloader.js.map +1 -1
  106. package/dist/src/internal/builtin-plugins/solidity/build-system/compiler/index.d.ts +10 -0
  107. package/dist/src/internal/builtin-plugins/solidity/build-system/compiler/index.d.ts.map +1 -1
  108. package/dist/src/internal/builtin-plugins/solidity/build-system/compiler/index.js +29 -6
  109. package/dist/src/internal/builtin-plugins/solidity/build-system/compiler/index.js.map +1 -1
  110. package/dist/src/internal/builtin-plugins/solidity/build-system/solc-config-selection.d.ts +2 -2
  111. package/dist/src/internal/builtin-plugins/solidity/build-system/solc-config-selection.d.ts.map +1 -1
  112. package/dist/src/internal/builtin-plugins/solidity/build-system/solc-config-selection.js.map +1 -1
  113. package/dist/src/internal/builtin-plugins/solidity/build-system/solc-info.d.ts +6 -0
  114. package/dist/src/internal/builtin-plugins/solidity/build-system/solc-info.d.ts.map +1 -1
  115. package/dist/src/internal/builtin-plugins/solidity/build-system/solc-info.js +11 -0
  116. package/dist/src/internal/builtin-plugins/solidity/build-system/solc-info.js.map +1 -1
  117. package/dist/src/internal/builtin-plugins/solidity/config.d.ts +4 -2
  118. package/dist/src/internal/builtin-plugins/solidity/config.d.ts.map +1 -1
  119. package/dist/src/internal/builtin-plugins/solidity/config.js +249 -64
  120. package/dist/src/internal/builtin-plugins/solidity/config.js.map +1 -1
  121. package/dist/src/internal/builtin-plugins/solidity/exports.d.ts +3 -0
  122. package/dist/src/internal/builtin-plugins/solidity/exports.d.ts.map +1 -0
  123. package/dist/src/internal/builtin-plugins/solidity/exports.js +3 -0
  124. package/dist/src/internal/builtin-plugins/solidity/exports.js.map +1 -0
  125. package/dist/src/internal/builtin-plugins/solidity/hook-handlers/config.d.ts.map +1 -1
  126. package/dist/src/internal/builtin-plugins/solidity/hook-handlers/config.js +2 -1
  127. package/dist/src/internal/builtin-plugins/solidity/hook-handlers/config.js.map +1 -1
  128. package/dist/src/internal/builtin-plugins/solidity/hook-handlers/solidity.d.ts +4 -0
  129. package/dist/src/internal/builtin-plugins/solidity/hook-handlers/solidity.d.ts.map +1 -0
  130. package/dist/src/internal/builtin-plugins/solidity/hook-handlers/solidity.js +7 -0
  131. package/dist/src/internal/builtin-plugins/solidity/hook-handlers/solidity.js.map +1 -0
  132. package/dist/src/internal/builtin-plugins/solidity/index.d.ts.map +1 -1
  133. package/dist/src/internal/builtin-plugins/solidity/index.js +1 -0
  134. package/dist/src/internal/builtin-plugins/solidity/index.js.map +1 -1
  135. package/dist/src/internal/builtin-plugins/solidity/solidity-hooks.d.ts +18 -0
  136. package/dist/src/internal/builtin-plugins/solidity/solidity-hooks.d.ts.map +1 -0
  137. package/dist/src/internal/builtin-plugins/solidity/solidity-hooks.js +33 -0
  138. package/dist/src/internal/builtin-plugins/solidity/solidity-hooks.js.map +1 -0
  139. package/dist/src/internal/builtin-plugins/solidity/type-extensions.d.ts +201 -28
  140. package/dist/src/internal/builtin-plugins/solidity/type-extensions.d.ts.map +1 -1
  141. package/dist/src/internal/builtin-plugins/solidity/type-extensions.js.map +1 -1
  142. package/dist/src/internal/builtin-plugins/solidity-test/edr-artifacts.d.ts +12 -6
  143. package/dist/src/internal/builtin-plugins/solidity-test/edr-artifacts.d.ts.map +1 -1
  144. package/dist/src/internal/builtin-plugins/solidity-test/edr-artifacts.js +9 -7
  145. package/dist/src/internal/builtin-plugins/solidity-test/edr-artifacts.js.map +1 -1
  146. package/dist/src/internal/builtin-plugins/solidity-test/formatters.d.ts +1 -12
  147. package/dist/src/internal/builtin-plugins/solidity-test/formatters.d.ts.map +1 -1
  148. package/dist/src/internal/builtin-plugins/solidity-test/formatters.js +0 -150
  149. package/dist/src/internal/builtin-plugins/solidity-test/formatters.js.map +1 -1
  150. package/dist/src/internal/builtin-plugins/solidity-test/helpers.d.ts +4 -3
  151. package/dist/src/internal/builtin-plugins/solidity-test/helpers.d.ts.map +1 -1
  152. package/dist/src/internal/builtin-plugins/solidity-test/helpers.js +5 -9
  153. package/dist/src/internal/builtin-plugins/solidity-test/helpers.js.map +1 -1
  154. package/dist/src/internal/builtin-plugins/solidity-test/index.d.ts.map +1 -1
  155. package/dist/src/internal/builtin-plugins/solidity-test/index.js +0 -7
  156. package/dist/src/internal/builtin-plugins/solidity-test/index.js.map +1 -1
  157. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/constants.d.ts +7 -0
  158. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/constants.d.ts.map +1 -0
  159. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/constants.js +20 -0
  160. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/constants.js.map +1 -0
  161. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/helpers.d.ts +24 -0
  162. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/helpers.d.ts.map +1 -0
  163. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/helpers.js +68 -0
  164. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/helpers.js.map +1 -0
  165. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/index.d.ts +13 -0
  166. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/index.d.ts.map +1 -0
  167. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/index.js +136 -0
  168. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/index.js.map +1 -0
  169. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/parsing.d.ts +19 -0
  170. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/parsing.d.ts.map +1 -0
  171. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/parsing.js +133 -0
  172. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/parsing.js.map +1 -0
  173. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/types.d.ts +10 -0
  174. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/types.d.ts.map +1 -0
  175. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/types.js +2 -0
  176. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/types.js.map +1 -0
  177. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/validation.d.ts +12 -0
  178. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/validation.d.ts.map +1 -0
  179. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/validation.js +81 -0
  180. package/dist/src/internal/builtin-plugins/solidity-test/inline-config/validation.js.map +1 -0
  181. package/dist/src/internal/builtin-plugins/solidity-test/reporter.d.ts +1 -1
  182. package/dist/src/internal/builtin-plugins/solidity-test/reporter.d.ts.map +1 -1
  183. package/dist/src/internal/builtin-plugins/solidity-test/reporter.js +5 -2
  184. package/dist/src/internal/builtin-plugins/solidity-test/reporter.js.map +1 -1
  185. package/dist/src/internal/builtin-plugins/solidity-test/task-action.d.ts +0 -1
  186. package/dist/src/internal/builtin-plugins/solidity-test/task-action.d.ts.map +1 -1
  187. package/dist/src/internal/builtin-plugins/solidity-test/task-action.js +30 -20
  188. package/dist/src/internal/builtin-plugins/solidity-test/task-action.js.map +1 -1
  189. package/dist/src/internal/builtin-plugins/test/index.d.ts.map +1 -1
  190. package/dist/src/internal/builtin-plugins/test/index.js +0 -7
  191. package/dist/src/internal/builtin-plugins/test/index.js.map +1 -1
  192. package/dist/src/internal/builtin-plugins/test/task-action.d.ts +0 -1
  193. package/dist/src/internal/builtin-plugins/test/task-action.d.ts.map +1 -1
  194. package/dist/src/internal/builtin-plugins/test/task-action.js +27 -13
  195. package/dist/src/internal/builtin-plugins/test/task-action.js.map +1 -1
  196. package/dist/src/internal/cli/help/get-help-string.d.ts.map +1 -1
  197. package/dist/src/internal/cli/help/get-help-string.js +1 -1
  198. package/dist/src/internal/cli/help/get-help-string.js.map +1 -1
  199. package/dist/src/internal/cli/init/init.d.ts.map +1 -1
  200. package/dist/src/internal/cli/init/init.js +1 -1
  201. package/dist/src/internal/cli/init/init.js.map +1 -1
  202. package/dist/src/internal/cli/init/prompt.d.ts.map +1 -1
  203. package/dist/src/internal/cli/init/prompt.js +1 -7
  204. package/dist/src/internal/cli/init/prompt.js.map +1 -1
  205. package/dist/src/internal/core/hre.d.ts +2 -1
  206. package/dist/src/internal/core/hre.d.ts.map +1 -1
  207. package/dist/src/internal/core/hre.js +18 -0
  208. package/dist/src/internal/core/hre.js.map +1 -1
  209. package/dist/src/internal/core/plugins/detect-plugin-npm-dependency-problems.d.ts.map +1 -1
  210. package/dist/src/internal/core/plugins/detect-plugin-npm-dependency-problems.js +6 -1
  211. package/dist/src/internal/core/plugins/detect-plugin-npm-dependency-problems.js.map +1 -1
  212. package/dist/src/internal/core/user-interruptions.d.ts.map +1 -1
  213. package/dist/src/internal/core/user-interruptions.js +2 -5
  214. package/dist/src/internal/core/user-interruptions.js.map +1 -1
  215. package/dist/src/internal/utils/colorizer.d.ts +10 -0
  216. package/dist/src/internal/utils/colorizer.d.ts.map +1 -0
  217. package/dist/src/internal/utils/colorizer.js +2 -0
  218. package/dist/src/internal/utils/colorizer.js.map +1 -0
  219. package/dist/src/internal/utils/package.d.ts.map +1 -1
  220. package/dist/src/internal/utils/package.js +1 -1
  221. package/dist/src/internal/utils/package.js.map +1 -1
  222. package/dist/src/types/global-options.d.ts +1 -0
  223. package/dist/src/types/global-options.d.ts.map +1 -1
  224. package/dist/src/types/hooks.d.ts +32 -0
  225. package/dist/src/types/hooks.d.ts.map +1 -1
  226. package/dist/src/types/network.d.ts +1 -1
  227. package/dist/src/types/network.d.ts.map +1 -1
  228. package/dist/src/types/solidity/compilation-job.d.ts +5 -5
  229. package/dist/src/types/solidity/compilation-job.d.ts.map +1 -1
  230. package/dist/src/types/solidity/solidity-artifacts.d.ts +15 -0
  231. package/dist/src/types/solidity/solidity-artifacts.d.ts.map +1 -1
  232. package/package.json +7 -6
  233. package/src/internal/builtin-global-options.ts +15 -1
  234. package/src/internal/builtin-plugins/coverage/helpers.ts +31 -0
  235. package/src/internal/builtin-plugins/coverage/hook-handlers/hre.ts +2 -10
  236. package/src/internal/builtin-plugins/coverage/hook-handlers/solidity.ts +3 -12
  237. package/src/internal/builtin-plugins/coverage/hook-handlers/test.ts +4 -25
  238. package/src/internal/builtin-plugins/gas-analytics/gas-analytics-manager.ts +118 -18
  239. package/src/internal/builtin-plugins/gas-analytics/helpers.ts +44 -3
  240. package/src/internal/builtin-plugins/gas-analytics/hook-handlers/hre.ts +6 -10
  241. package/src/internal/builtin-plugins/gas-analytics/hook-handlers/test.ts +18 -26
  242. package/src/internal/builtin-plugins/gas-analytics/index.ts +9 -1
  243. package/src/internal/builtin-plugins/gas-analytics/type-extensions.ts +1 -0
  244. package/src/internal/builtin-plugins/gas-analytics/types.ts +37 -0
  245. package/src/internal/builtin-plugins/network-manager/accounts/derive-private-keys.ts +25 -3
  246. package/src/internal/builtin-plugins/network-manager/edr/edr-provider.ts +107 -56
  247. package/src/internal/builtin-plugins/network-manager/edr/genesis-state.ts +179 -0
  248. package/src/internal/builtin-plugins/network-manager/edr/utils/trace-formatters.ts +197 -0
  249. package/src/internal/builtin-plugins/network-manager/edr/utils/trace-output.ts +137 -0
  250. package/src/internal/builtin-plugins/network-manager/hook-handlers/hre.ts +1 -0
  251. package/src/internal/builtin-plugins/network-manager/hook-handlers/network.ts +8 -11
  252. package/src/internal/builtin-plugins/network-manager/http-provider.ts +1 -0
  253. package/src/internal/builtin-plugins/network-manager/network-manager.ts +112 -12
  254. package/src/internal/builtin-plugins/network-manager/request-handlers/handlers/accounts/local-accounts.ts +98 -34
  255. package/src/internal/builtin-plugins/network-manager/request-handlers/handlers-array.ts +10 -30
  256. package/src/internal/builtin-plugins/node/artifacts/build-info-watcher.ts +1 -2
  257. package/src/internal/builtin-plugins/node/helpers.ts +9 -2
  258. package/src/internal/builtin-plugins/node/json-rpc/handler.ts +8 -2
  259. package/src/internal/builtin-plugins/solidity/build-system/artifacts.ts +7 -2
  260. package/src/internal/builtin-plugins/solidity/build-system/build-system.ts +141 -65
  261. package/src/internal/builtin-plugins/solidity/build-system/cache.ts +1 -0
  262. package/src/internal/builtin-plugins/solidity/build-system/compilation-job.ts +34 -7
  263. package/src/internal/builtin-plugins/solidity/build-system/compiler/compiler.ts +1 -1
  264. package/src/internal/builtin-plugins/solidity/build-system/compiler/downloader.ts +1 -7
  265. package/src/internal/builtin-plugins/solidity/build-system/compiler/index.ts +44 -9
  266. package/src/internal/builtin-plugins/solidity/build-system/solc-config-selection.ts +4 -2
  267. package/src/internal/builtin-plugins/solidity/build-system/solc-info.ts +15 -0
  268. package/src/internal/builtin-plugins/solidity/config.ts +337 -105
  269. package/src/internal/builtin-plugins/solidity/exports.ts +2 -0
  270. package/src/internal/builtin-plugins/solidity/hook-handlers/config.ts +3 -0
  271. package/src/internal/builtin-plugins/solidity/hook-handlers/solidity.ts +9 -0
  272. package/src/internal/builtin-plugins/solidity/index.ts +1 -0
  273. package/src/internal/builtin-plugins/solidity/solidity-hooks.ts +53 -0
  274. package/src/internal/builtin-plugins/solidity/type-extensions.ts +258 -31
  275. package/src/internal/builtin-plugins/solidity-test/edr-artifacts.ts +22 -10
  276. package/src/internal/builtin-plugins/solidity-test/formatters.ts +1 -213
  277. package/src/internal/builtin-plugins/solidity-test/helpers.ts +8 -8
  278. package/src/internal/builtin-plugins/solidity-test/index.ts +0 -7
  279. package/src/internal/builtin-plugins/solidity-test/inline-config/constants.ts +21 -0
  280. package/src/internal/builtin-plugins/solidity-test/inline-config/helpers.ts +99 -0
  281. package/src/internal/builtin-plugins/solidity-test/inline-config/index.ts +272 -0
  282. package/src/internal/builtin-plugins/solidity-test/inline-config/parsing.ts +186 -0
  283. package/src/internal/builtin-plugins/solidity-test/inline-config/types.ts +9 -0
  284. package/src/internal/builtin-plugins/solidity-test/inline-config/validation.ts +122 -0
  285. package/src/internal/builtin-plugins/solidity-test/reporter.ts +6 -6
  286. package/src/internal/builtin-plugins/solidity-test/task-action.ts +52 -38
  287. package/src/internal/builtin-plugins/test/index.ts +0 -7
  288. package/src/internal/builtin-plugins/test/task-action.ts +39 -24
  289. package/src/internal/cli/help/get-help-string.ts +2 -2
  290. package/src/internal/cli/init/init.ts +1 -1
  291. package/src/internal/cli/init/prompt.ts +1 -14
  292. package/src/internal/core/hre.ts +33 -0
  293. package/src/internal/core/plugins/detect-plugin-npm-dependency-problems.ts +8 -1
  294. package/src/internal/core/user-interruptions.ts +3 -5
  295. package/src/internal/utils/colorizer.ts +9 -0
  296. package/src/internal/utils/package.ts +1 -2
  297. package/src/types/global-options.ts +1 -0
  298. package/src/types/hooks.ts +37 -0
  299. package/src/types/network.ts +2 -2
  300. package/src/types/solidity/compilation-job.ts +5 -5
  301. package/src/types/solidity/solidity-artifacts.ts +16 -0
  302. package/templates/hardhat-3/01-node-test-runner-viem/package.json +6 -6
  303. package/templates/hardhat-3/02-mocha-ethers/package.json +11 -11
  304. package/templates/hardhat-3/03-minimal/package.json +1 -1
@@ -1,15 +1,21 @@
1
1
  import type { HardhatUserConfig } from "../../../config.js";
2
2
  import type {
3
+ SolidityCompilerConfig,
4
+ SolidityCompilerUserConfig,
3
5
  HardhatConfig,
4
6
  MultiVersionSolidityUserConfig,
5
7
  SingleVersionSolidityUserConfig,
6
- SolcConfig,
7
- SolcUserConfig,
8
8
  SolidityBuildProfileConfig,
9
9
  SolidityConfig,
10
10
  SolidityUserConfig,
11
+ CommonSolidityCompilerUserConfig,
12
+ SolcSolidityCompilerConfig,
13
+ SolcSolidityCompilerUserConfig,
11
14
  } from "../../../types/config.js";
12
- import type { HardhatUserConfigValidationError } from "../../../types/hooks.js";
15
+ import type {
16
+ HardhatConfigValidationError,
17
+ HardhatUserConfigValidationError,
18
+ } from "../../../types/hooks.js";
13
19
 
14
20
  import { deepMerge, isObject } from "@nomicfoundation/hardhat-utils/lang";
15
21
  import { resolveFromRoot } from "@nomicfoundation/hardhat-utils/path";
@@ -22,107 +28,182 @@ import { z } from "zod";
22
28
 
23
29
  import { DEFAULT_BUILD_PROFILES } from "./build-profiles.js";
24
30
  import {
31
+ hasArm64MirrorBuild,
25
32
  hasOfficialArm64Build,
26
33
  missesSomeOfficialNativeBuilds,
27
34
  } from "./build-system/solc-info.js";
28
35
 
29
- const sourcePathsType = conditionalUnionType(
30
- [
31
- [(data) => typeof data === "string", z.string()],
32
- [(data) => Array.isArray(data), z.array(z.string()).nonempty()],
33
- ],
34
- "Expected a string or an array of strings",
35
- );
36
+ /**
37
+ * The top-level type SolidityUserConfig is a union type too complex for
38
+ * TypeScript to handle properly. It accepts fields of different types of
39
+ * configurations. For example, it accepts `compilers` inside of a
40
+ * `SingleVersionSolidityUserConfig`.
41
+ *
42
+ * For this reason, we declare all the fields that shouldn't exist in the
43
+ * presence of another one as incompatible.
44
+ *
45
+ * This object has all the fields that are incompatible with `version`.
46
+ */
47
+ const incompatibleVersionFields = {
48
+ compilers: incompatibleFieldType("This field is incompatible with `version`"),
49
+ overrides: incompatibleFieldType("This field is incompatible with `version`"),
50
+ profiles: incompatibleFieldType("This field is incompatible with `version`"),
51
+ };
52
+
53
+ /**
54
+ * This is the equivalent of `incompatibleVersionFields`, but for the
55
+ * `profiles` field.
56
+ */
57
+ const incompatibleProfileFields = {
58
+ type: incompatibleFieldType("This field is incompatible with `profiles`"),
59
+ version: incompatibleFieldType("This field is incompatible with `profiles`"),
60
+ compilers: incompatibleFieldType(
61
+ "This field is incompatible with `profiles`",
62
+ ),
63
+ overrides: incompatibleFieldType(
64
+ "This field is incompatible with `profiles`",
65
+ ),
66
+ };
67
+
68
+ /**
69
+ * This is the equivalent of `incompatibleVersionFields`, but for the
70
+ * `compilers` field.
71
+ */
72
+ const incompatibleCompilerFields = {
73
+ type: incompatibleFieldType("This field is incompatible with `compilers`"),
74
+ version: incompatibleFieldType("This field is incompatible with `compilers`"),
75
+ profiles: incompatibleFieldType(
76
+ "This field is incompatible with `compilers`",
77
+ ),
78
+ };
36
79
 
37
- const commonSolcUserConfigType = z.object({
80
+ const commonSolidityUserConfigFields = {
38
81
  isolated: z.boolean().optional(),
39
- });
82
+ npmFilesToBuild: z.array(z.string()).optional(),
83
+ };
40
84
 
41
- const solcUserConfigType = z.object({
85
+ const commonSolidityCompilerUserConfigFields = {
86
+ type: z.string().optional(),
42
87
  version: z.string(),
43
88
  settings: z.any().optional(),
44
89
  path: z.string().optional(),
45
- preferWasm: z.boolean().optional(),
46
- compilers: incompatibleFieldType("This field is incompatible with `version`"),
47
- overrides: incompatibleFieldType("This field is incompatible with `version`"),
48
- profiles: incompatibleFieldType("This field is incompatible with `version`"),
49
- });
90
+ };
50
91
 
51
- // NOTE: This is only to match the setup present in ./type-extensions.ts
52
- const singleVersionSolcUserConfigType = solcUserConfigType.extend({
53
- isolated: z.boolean().optional(),
92
+ const solcSolidityCompilerUserConfigType = z.object({
93
+ ...commonSolidityCompilerUserConfigFields,
94
+ type: z.literal("solc").optional(),
54
95
  preferWasm: z.boolean().optional(),
55
96
  });
56
97
 
57
- const multiVersionSolcUserConfigType = commonSolcUserConfigType.extend({
58
- compilers: z.array(solcUserConfigType).nonempty(),
59
- overrides: z.record(z.string(), solcUserConfigType).optional(),
60
- isolated: z.boolean().optional(),
61
- preferWasm: z.boolean().optional(),
62
- version: incompatibleFieldType("This field is incompatible with `compilers`"),
63
- settings: incompatibleFieldType(
64
- "This field is incompatible with `compilers`",
65
- ),
66
- });
98
+ const otherSolidityCompilerUserConfigType = z.object(
99
+ commonSolidityCompilerUserConfigFields,
100
+ );
67
101
 
68
- const commonSolidityUserConfigType = z.object({
69
- npmFilesToBuild: z.array(z.string()).optional(),
70
- });
102
+ // Per-compiler config: preferWasm is only allowed for solc (type undefined or "solc")
103
+ const solidityCompilerUserConfigType = conditionalUnionType(
104
+ [
105
+ [
106
+ (data) =>
107
+ isObject(data) &&
108
+ (!("type" in data) || data.type === undefined || data.type === "solc"),
109
+ solcSolidityCompilerUserConfigType,
110
+ ],
111
+ [
112
+ (data) => isObject(data) && "type" in data && data.type !== "solc",
113
+ otherSolidityCompilerUserConfigType,
114
+ ],
115
+ ],
116
+ "Expected a valid compiler configuration",
117
+ );
71
118
 
72
- const singleVersionSolidityUserConfigType = singleVersionSolcUserConfigType
73
- .merge(commonSolidityUserConfigType)
74
- .extend({
75
- compilers: incompatibleFieldType(
76
- "This field is incompatible with `version`",
77
- ),
78
- overrides: incompatibleFieldType(
79
- "This field is incompatible with `version`",
80
- ),
81
- profiles: incompatibleFieldType(
82
- "This field is incompatible with `version`",
83
- ),
119
+ const solcSingleVersionSolidityUserConfigType =
120
+ solcSolidityCompilerUserConfigType.extend({
121
+ ...commonSolidityUserConfigFields,
122
+ ...incompatibleVersionFields,
84
123
  });
85
124
 
86
- const multiVersionSolidityUserConfigType = multiVersionSolcUserConfigType
87
- .merge(commonSolidityUserConfigType)
88
- .extend({
89
- version: incompatibleFieldType(
90
- "This field is incompatible with `compilers`",
91
- ),
92
- profiles: incompatibleFieldType(
93
- "This field is incompatible with `compilers`",
94
- ),
125
+ const otherSingleVersionSolidityUserConfigType =
126
+ otherSolidityCompilerUserConfigType.extend({
127
+ ...commonSolidityUserConfigFields,
128
+ ...incompatibleVersionFields,
95
129
  });
96
130
 
97
- const buildProfilesSolidityUserConfigType = commonSolidityUserConfigType.extend(
98
- {
99
- profiles: z.record(
100
- z.string(),
101
- conditionalUnionType(
131
+ const singleVersionSolidityUserConfigType = conditionalUnionType(
132
+ [
133
+ [
134
+ (data) =>
135
+ isObject(data) &&
136
+ (!("type" in data) || data.type === undefined || data.type === "solc"),
137
+ solcSingleVersionSolidityUserConfigType,
138
+ ],
139
+ [
140
+ (data) => isObject(data) && "type" in data && data.type !== "solc",
141
+ otherSingleVersionSolidityUserConfigType,
142
+ ],
143
+ ],
144
+ "Expected a valid single-version Solidity configuration",
145
+ );
146
+
147
+ const multiVersionSolidityUserConfigType = z.object({
148
+ preferWasm: z.boolean().optional(),
149
+ compilers: z.array(solidityCompilerUserConfigType).nonempty(),
150
+ overrides: z.record(z.string(), solidityCompilerUserConfigType).optional(),
151
+ ...commonSolidityUserConfigFields,
152
+ ...incompatibleCompilerFields,
153
+ });
154
+
155
+ // This definition needs to be aligned with solidityCompilerUserConfigType.
156
+ // The reason to duplicate it is that we can't `.extend()` a conditional union
157
+ // type.
158
+ const singleVersionBuildProfileUserConfigType = conditionalUnionType(
159
+ [
160
+ [
161
+ (data) =>
162
+ isObject(data) &&
163
+ (!("type" in data) || data.type === undefined || data.type === "solc"),
164
+ solcSolidityCompilerUserConfigType.extend({
165
+ isolated: z.boolean().optional(),
166
+ ...incompatibleVersionFields,
167
+ }),
168
+ ],
169
+ [
170
+ (data) => isObject(data) && "type" in data && data.type !== "solc",
171
+ otherSolidityCompilerUserConfigType.extend({
172
+ isolated: z.boolean().optional(),
173
+ ...incompatibleVersionFields,
174
+ }),
175
+ ],
176
+ ],
177
+ "Expected a valid compiler configuration",
178
+ );
179
+
180
+ const multiVersionBuildProfileUserConfigType = z.object({
181
+ preferWasm: z.boolean().optional(),
182
+ compilers: z.array(solidityCompilerUserConfigType).nonempty(),
183
+ overrides: z.record(z.string(), solidityCompilerUserConfigType).optional(),
184
+ isolated: z.boolean().optional(),
185
+ ...incompatibleCompilerFields,
186
+ });
187
+
188
+ const buildProfilesSolidityUserConfigType = z.object({
189
+ profiles: z.record(
190
+ z.string(),
191
+ conditionalUnionType(
192
+ [
102
193
  [
103
- [
104
- (data) => isObject(data) && "version" in data,
105
- singleVersionSolcUserConfigType,
106
- ],
107
- [
108
- (data) => isObject(data) && "compilers" in data,
109
- multiVersionSolcUserConfigType,
110
- ],
194
+ (data) => isObject(data) && "version" in data,
195
+ singleVersionBuildProfileUserConfigType,
111
196
  ],
112
- "Expected an object configuring one or more versions of Solidity",
113
- ),
114
- ),
115
- version: incompatibleFieldType(
116
- "This field is incompatible with `profiles`",
117
- ),
118
- compilers: incompatibleFieldType(
119
- "This field is incompatible with `profiles`",
120
- ),
121
- overrides: incompatibleFieldType(
122
- "This field is incompatible with `profiles`",
197
+ [
198
+ (data) => isObject(data) && "compilers" in data,
199
+ multiVersionBuildProfileUserConfigType,
200
+ ],
201
+ ],
202
+ "Expected an object configuring one or more versions of Solidity",
123
203
  ),
124
- },
125
- );
204
+ ),
205
+ ...incompatibleProfileFields,
206
+ });
126
207
 
127
208
  const solidityUserConfigType = conditionalUnionType(
128
209
  [
@@ -144,6 +225,14 @@ const solidityUserConfigType = conditionalUnionType(
144
225
  "Expected a version string, an array of version strings, or an object configuring one or more versions of Solidity or multiple build profiles",
145
226
  );
146
227
 
228
+ const sourcePathsType = conditionalUnionType(
229
+ [
230
+ [(data) => typeof data === "string", z.string()],
231
+ [(data) => Array.isArray(data), z.array(z.string()).nonempty()],
232
+ ],
233
+ "Expected a string or an array of strings",
234
+ );
235
+
147
236
  const userConfigType = z.object({
148
237
  paths: z
149
238
  .object({
@@ -183,6 +272,109 @@ export function validateSolidityUserConfig(
183
272
  return result;
184
273
  }
185
274
 
275
+ export function validateSolidityConfig(
276
+ resolvedConfig: HardhatConfig,
277
+ ): HardhatConfigValidationError[] {
278
+ const errors: HardhatConfigValidationError[] = [];
279
+
280
+ errors.push(...validateRegisteredCompilerTypes(resolvedConfig));
281
+ errors.push(...validatePreferWasmRequiresSolc(resolvedConfig));
282
+
283
+ return errors;
284
+ }
285
+
286
+ function validateRegisteredCompilerTypes(
287
+ resolvedConfig: HardhatConfig,
288
+ ): HardhatConfigValidationError[] {
289
+ const errors: HardhatConfigValidationError[] = [];
290
+ const registered = new Set(resolvedConfig.solidity.registeredCompilerTypes);
291
+
292
+ for (const [profileName, profile] of Object.entries(
293
+ resolvedConfig.solidity.profiles,
294
+ )) {
295
+ for (const [i, compiler] of profile.compilers.entries()) {
296
+ const type = compiler.type ?? "solc";
297
+ if (!registered.has(type)) {
298
+ errors.push({
299
+ path: ["solidity", "profiles", profileName, "compilers", i, "type"],
300
+ message: `Unknown compiler type "${type}". Registered types: ${[...registered].join(", ")}`,
301
+ });
302
+ }
303
+ }
304
+ for (const [sourceName, override] of Object.entries(profile.overrides)) {
305
+ const type = override.type ?? "solc";
306
+ if (!registered.has(type)) {
307
+ errors.push({
308
+ path: [
309
+ "solidity",
310
+ "profiles",
311
+ profileName,
312
+ "overrides",
313
+ sourceName,
314
+ "type",
315
+ ],
316
+ message: `Unknown compiler type "${type}". Registered types: ${[...registered].join(", ")}`,
317
+ });
318
+ }
319
+ }
320
+ }
321
+
322
+ return errors;
323
+ }
324
+
325
+ function validatePreferWasmRequiresSolc(
326
+ resolvedConfig: HardhatConfig,
327
+ ): HardhatConfigValidationError[] {
328
+ const errors: HardhatConfigValidationError[] = [];
329
+
330
+ for (const [profileName, profile] of Object.entries(
331
+ resolvedConfig.solidity.profiles,
332
+ )) {
333
+ if (!profile.preferWasm) {
334
+ continue;
335
+ }
336
+
337
+ for (const [i, compiler] of profile.compilers.entries()) {
338
+ const type = compiler.type;
339
+ if (type !== undefined && type !== "solc") {
340
+ /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions
341
+ -- We need to cast because within Hardhat core the type of `type` is
342
+ `never`, as you can only get into this if with a plugin. */
343
+ const compilerType: string = (compiler as any).type;
344
+
345
+ errors.push({
346
+ path: ["solidity", "profiles", profileName, "compilers", i, "type"],
347
+ message: `Compiler type must be "solc" if \`preferWasm\` is \`true\` in the build profile, but found type "${compilerType}"`,
348
+ });
349
+ }
350
+ }
351
+
352
+ for (const [sourceName, override] of Object.entries(profile.overrides)) {
353
+ const type = override.type;
354
+ if (type !== undefined && type !== "solc") {
355
+ /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions
356
+ -- We need to cast because within Hardhat core the type of `type` is
357
+ `never`, as you can only get into this if with a plugin. */
358
+ const overrideType: string = (override as any).type;
359
+
360
+ errors.push({
361
+ path: [
362
+ "solidity",
363
+ "profiles",
364
+ profileName,
365
+ "overrides",
366
+ sourceName,
367
+ "type",
368
+ ],
369
+ message: `Compiler type must be "solc" if \`preferWasm\` is \`true\` in the build profile, but found type "${overrideType}"`,
370
+ });
371
+ }
372
+ }
373
+ }
374
+
375
+ return errors;
376
+ }
377
+
186
378
  export async function resolveSolidityUserConfig(
187
379
  userConfig: HardhatUserConfig,
188
380
  resolvedConfig: HardhatConfig,
@@ -237,6 +429,7 @@ function resolveSolidityConfig(
237
429
  ),
238
430
  },
239
431
  npmFilesToBuild: [],
432
+ registeredCompilerTypes: ["solc"],
240
433
  };
241
434
  }
242
435
 
@@ -251,6 +444,7 @@ function resolveSolidityConfig(
251
444
  ),
252
445
  },
253
446
  npmFilesToBuild: solidityConfig.npmFilesToBuild ?? [],
447
+ registeredCompilerTypes: ["solc"],
254
448
  };
255
449
  }
256
450
 
@@ -280,6 +474,7 @@ function resolveSolidityConfig(
280
474
  return {
281
475
  profiles,
282
476
  npmFilesToBuild: solidityConfig.npmFilesToBuild ?? [],
477
+ registeredCompilerTypes: ["solc"],
283
478
  };
284
479
  }
285
480
 
@@ -291,7 +486,7 @@ function resolveBuildProfileConfig(
291
486
  ): SolidityBuildProfileConfig {
292
487
  if ("version" in solidityConfig) {
293
488
  return {
294
- compilers: [resolveSolcConfig(solidityConfig, production)],
489
+ compilers: [resolveSolidityCompilerConfig(solidityConfig, production)],
295
490
  overrides: {},
296
491
  isolated: solidityConfig.isolated ?? production,
297
492
  preferWasm: solidityConfig.preferWasm ?? false,
@@ -300,13 +495,13 @@ function resolveBuildProfileConfig(
300
495
 
301
496
  return {
302
497
  compilers: solidityConfig.compilers.map((compiler) =>
303
- resolveSolcConfig(compiler, production),
498
+ resolveSolidityCompilerConfig(compiler, production),
304
499
  ),
305
500
  overrides: Object.fromEntries(
306
501
  Object.entries(solidityConfig.overrides ?? {}).map(
307
502
  ([userSourceName, override]) => [
308
503
  userSourceName,
309
- resolveSolcConfig(override, production),
504
+ resolveSolidityCompilerConfig(override, production),
310
505
  ],
311
506
  ),
312
507
  ),
@@ -315,11 +510,11 @@ function resolveBuildProfileConfig(
315
510
  };
316
511
  }
317
512
 
318
- function resolveSolcConfig(
319
- solcConfig: SolcUserConfig,
513
+ function resolveSolidityCompilerConfig(
514
+ compilerConfig: SolidityCompilerUserConfig,
320
515
  production: boolean = false,
321
- ): SolcConfig {
322
- const defaultSolcConfigSettings: SolcConfig["settings"] = {
516
+ ): SolidityCompilerConfig {
517
+ const defaultSettings: SolidityCompilerConfig["settings"] = {
323
518
  outputSelection: {
324
519
  "*": {
325
520
  "": ["ast"],
@@ -334,33 +529,68 @@ function resolveSolcConfig(
334
529
  },
335
530
  };
336
531
 
337
- if (production) {
338
- defaultSolcConfigSettings.optimizer = {
532
+ if (production && isSolcSolidityCompilerUserConfig(compilerConfig)) {
533
+ defaultSettings.optimizer = {
339
534
  enabled: true,
340
535
  runs: 200,
341
536
  };
342
537
  }
343
538
 
344
- // Resolve per-compiler preferWasm:
345
- // If explicitly set, use that value.
346
- // Otherwise, for ARM64 Linux in production, default to true only for
347
- // versions without official ARM64 builds.
348
- let resolvedPreferWasm: boolean | undefined = solcConfig.preferWasm;
349
- if (resolvedPreferWasm === undefined && missesSomeOfficialNativeBuilds()) {
350
- resolvedPreferWasm =
351
- production && !hasOfficialArm64Build(solcConfig.version)
352
- ? true
353
- : undefined;
539
+ const resolvedSettings = deepMerge(
540
+ defaultSettings,
541
+ compilerConfig.settings ?? {},
542
+ );
543
+
544
+ // Resolve solc-specific preferWasm if this is a SolcSolidityCompilerUserConfig
545
+ if (isSolcSolidityCompilerUserConfig(compilerConfig)) {
546
+ // Resolve per-compiler preferWasm:
547
+ // If explicitly set, use that value.
548
+ // Otherwise, for ARM64 Linux:
549
+ // - Versions below the mirror threshold (< 0.5.0) always use WASM,
550
+ // since no native ARM64 build exists anywhere.
551
+ // - In production, versions without official ARM64 builds
552
+ // also default to WASM.
553
+ let resolvedPreferWasm: boolean | undefined = compilerConfig.preferWasm;
554
+ if (resolvedPreferWasm === undefined && missesSomeOfficialNativeBuilds()) {
555
+ const version = compilerConfig.version;
556
+
557
+ if (!hasOfficialArm64Build(version) && !hasArm64MirrorBuild(version)) {
558
+ resolvedPreferWasm = true;
559
+ } else if (production && !hasOfficialArm64Build(version)) {
560
+ resolvedPreferWasm = true;
561
+ }
562
+ }
563
+ const solcResolved: SolcSolidityCompilerConfig = {
564
+ type: compilerConfig.type,
565
+ version: compilerConfig.version,
566
+ settings: resolvedSettings,
567
+ path: compilerConfig.path,
568
+ preferWasm: resolvedPreferWasm,
569
+ };
570
+ return solcResolved;
354
571
  }
355
572
 
573
+ const unknownCompilerConfig =
574
+ /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions --
575
+ We need to cast here because compilerConfig has `never` type here, as this
576
+ case is only accessible when there are other types of compilers registered
577
+ through plugins. */
578
+ compilerConfig as unknown as CommonSolidityCompilerUserConfig;
579
+
356
580
  return {
357
- version: solcConfig.version,
358
- settings: deepMerge(defaultSolcConfigSettings, solcConfig.settings ?? {}),
359
- path: solcConfig.path,
360
- preferWasm: resolvedPreferWasm,
581
+ type: unknownCompilerConfig.type,
582
+ version: unknownCompilerConfig.version,
583
+ settings: resolvedSettings,
584
+ path: unknownCompilerConfig.path,
361
585
  };
362
586
  }
363
587
 
588
+ export function isSolcSolidityCompilerUserConfig(
589
+ config: SolidityCompilerUserConfig,
590
+ ): config is SolcSolidityCompilerUserConfig {
591
+ return config.type === undefined || config.type === "solc";
592
+ }
593
+
364
594
  function copyFromDefault(
365
595
  defaultSolidityConfig:
366
596
  | SingleVersionSolidityUserConfig
@@ -369,18 +599,20 @@ function copyFromDefault(
369
599
  if ("version" in defaultSolidityConfig) {
370
600
  return {
371
601
  version: defaultSolidityConfig.version,
602
+ type: defaultSolidityConfig.type,
372
603
  };
373
604
  }
374
605
 
375
606
  return {
376
607
  compilers: defaultSolidityConfig.compilers.map((c) => ({
377
608
  version: c.version,
609
+ type: c.type,
378
610
  })),
379
611
  overrides: Object.fromEntries(
380
612
  Object.entries(defaultSolidityConfig.overrides ?? {}).map(
381
613
  ([userSourceName, override]) => [
382
614
  userSourceName,
383
- { version: override.version },
615
+ { version: override.version, type: override.type },
384
616
  ],
385
617
  ),
386
618
  ),
@@ -0,0 +1,2 @@
1
+ export { isSolcSolidityCompilerConfig } from "./build-system/build-system.js";
2
+ export { spawnCompile } from "./build-system/compiler/compiler.js";
@@ -2,6 +2,7 @@ import type { ConfigHooks } from "../../../../types/hooks.js";
2
2
 
3
3
  import {
4
4
  resolveSolidityUserConfig,
5
+ validateSolidityConfig,
5
6
  validateSolidityUserConfig,
6
7
  } from "../config.js";
7
8
 
@@ -21,6 +22,8 @@ export default async (): Promise<Partial<ConfigHooks>> => {
21
22
 
22
23
  return resolveSolidityUserConfig(userConfig, resolvedConfig);
23
24
  },
25
+ validateResolvedConfig: async (resolvedConfig) =>
26
+ validateSolidityConfig(resolvedConfig),
24
27
  };
25
28
 
26
29
  return handlers;
@@ -0,0 +1,9 @@
1
+ import type { SolidityHooks } from "../../../../types/hooks.js";
2
+
3
+ import { downloadSolcCompilersHandler } from "../solidity-hooks.js";
4
+
5
+ export default async (): Promise<Partial<SolidityHooks>> => ({
6
+ downloadCompilers: async (_context, compilerConfigs, quiet) => {
7
+ await downloadSolcCompilersHandler(compilerConfigs, quiet);
8
+ },
9
+ });
@@ -41,6 +41,7 @@ const hardhatPlugin: HardhatPlugin = {
41
41
  hookHandlers: {
42
42
  config: () => import("./hook-handlers/config.js"),
43
43
  hre: () => import("./hook-handlers/hre.js"),
44
+ solidity: () => import("./hook-handlers/solidity.js"),
44
45
  },
45
46
  tasks: [
46
47
  {
@@ -0,0 +1,53 @@
1
+ import type { SolidityCompilerConfig } from "../../../types/config.js";
2
+ import type { Compiler } from "../../../types/solidity.js";
3
+
4
+ import { isSolcSolidityCompilerConfig } from "./build-system/build-system.js";
5
+ import {
6
+ downloadSolcCompilers,
7
+ getCompiler,
8
+ } from "./build-system/compiler/index.js";
9
+
10
+ /**
11
+ * Downloads solc compilers for the given configs, filtering out non-solc types.
12
+ * This is the default implementation of the `downloadCompilers` hook handler.
13
+ */
14
+ export async function downloadSolcCompilersHandler(
15
+ compilerConfigs: SolidityCompilerConfig[],
16
+ quiet: boolean,
17
+ ): Promise<void> {
18
+ const solcVersions = new Set(
19
+ compilerConfigs.filter(isSolcSolidityCompilerConfig).map((c) => c.version),
20
+ );
21
+
22
+ if (solcVersions.size > 0) {
23
+ await downloadSolcCompilers(solcVersions, quiet);
24
+ }
25
+ }
26
+
27
+ /**
28
+ * Resolves the preferWasm setting for a given compiler config, falling back
29
+ * to the build profile's preferWasm if not set on the compiler.
30
+ */
31
+ export function resolvePreferWasm(
32
+ compilerConfig: SolidityCompilerConfig,
33
+ buildProfilePreferWasm: boolean,
34
+ ): boolean {
35
+ if (isSolcSolidityCompilerConfig(compilerConfig)) {
36
+ return compilerConfig.preferWasm ?? buildProfilePreferWasm;
37
+ }
38
+ return false;
39
+ }
40
+
41
+ /**
42
+ * Creates a solc Compiler for the given config. This is the default
43
+ * implementation used as the fallback in the `getCompiler` hook chain.
44
+ */
45
+ export async function getSolcCompilerForConfig(
46
+ compilerConfig: SolidityCompilerConfig,
47
+ buildProfilePreferWasm: boolean,
48
+ ): Promise<Compiler> {
49
+ return getCompiler(compilerConfig.version, {
50
+ preferWasm: resolvePreferWasm(compilerConfig, buildProfilePreferWasm),
51
+ compilerPath: compilerConfig.path,
52
+ });
53
+ }