hardhat 2.11.0-dev.0 → 2.11.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 (406) hide show
  1. package/builtin-tasks/clean.js +2 -1
  2. package/builtin-tasks/clean.js.map +1 -1
  3. package/builtin-tasks/compile.js +52 -95
  4. package/builtin-tasks/compile.js.map +1 -1
  5. package/builtin-tasks/flatten.js +2 -21
  6. package/builtin-tasks/flatten.js.map +1 -1
  7. package/builtin-tasks/node.js +1 -1
  8. package/builtin-tasks/node.js.map +1 -1
  9. package/builtin-tasks/test.js +3 -3
  10. package/builtin-tasks/test.js.map +1 -1
  11. package/builtin-tasks/utils/solidity-files-cache.d.ts.map +1 -1
  12. package/builtin-tasks/utils/solidity-files-cache.js +5 -6
  13. package/builtin-tasks/utils/solidity-files-cache.js.map +1 -1
  14. package/internal/artifacts.d.ts +3 -11
  15. package/internal/artifacts.d.ts.map +1 -1
  16. package/internal/artifacts.js +266 -133
  17. package/internal/artifacts.js.map +1 -1
  18. package/internal/cli/cli.js +26 -12
  19. package/internal/cli/cli.js.map +1 -1
  20. package/internal/core/config/config-loading.js +2 -2
  21. package/internal/core/config/config-loading.js.map +1 -1
  22. package/internal/core/config/config-resolution.d.ts.map +1 -1
  23. package/internal/core/config/config-resolution.js +11 -31
  24. package/internal/core/config/config-resolution.js.map +1 -1
  25. package/internal/core/config/default-config.js +1 -1
  26. package/internal/core/config/default-config.js.map +1 -1
  27. package/internal/core/errors-list.d.ts +7 -0
  28. package/internal/core/errors-list.d.ts.map +1 -1
  29. package/internal/core/errors-list.js +28 -11
  30. package/internal/core/errors-list.js.map +1 -1
  31. package/internal/core/errors.d.ts +2 -1
  32. package/internal/core/errors.d.ts.map +1 -1
  33. package/internal/core/errors.js +5 -1
  34. package/internal/core/errors.js.map +1 -1
  35. package/internal/core/execution-mode.d.ts.map +1 -1
  36. package/internal/core/execution-mode.js +2 -21
  37. package/internal/core/execution-mode.js.map +1 -1
  38. package/internal/core/flamegraph.d.ts +4 -0
  39. package/internal/core/flamegraph.d.ts.map +1 -1
  40. package/internal/core/flamegraph.js +13 -3
  41. package/internal/core/flamegraph.js.map +1 -1
  42. package/internal/core/jsonrpc/types/base-types.d.ts.map +1 -1
  43. package/internal/core/jsonrpc/types/base-types.js +12 -12
  44. package/internal/core/jsonrpc/types/base-types.js.map +1 -1
  45. package/internal/core/params/hardhat-params.d.ts.map +1 -1
  46. package/internal/core/params/hardhat-params.js +18 -0
  47. package/internal/core/params/hardhat-params.js.map +1 -1
  48. package/internal/core/providers/accounts.js +9 -9
  49. package/internal/core/providers/accounts.js.map +1 -1
  50. package/internal/core/providers/construction.d.ts.map +1 -1
  51. package/internal/core/providers/construction.js +5 -6
  52. package/internal/core/providers/construction.js.map +1 -1
  53. package/internal/core/providers/gas-providers.d.ts +2 -2
  54. package/internal/core/providers/util.js +1 -1
  55. package/internal/core/providers/util.js.map +1 -1
  56. package/internal/core/runtime-environment.d.ts +6 -0
  57. package/internal/core/runtime-environment.d.ts.map +1 -1
  58. package/internal/core/runtime-environment.js +72 -6
  59. package/internal/core/runtime-environment.js.map +1 -1
  60. package/internal/core/typescript-support.d.ts +1 -1
  61. package/internal/core/typescript-support.d.ts.map +1 -1
  62. package/internal/core/typescript-support.js +6 -2
  63. package/internal/core/typescript-support.js.map +1 -1
  64. package/internal/hardhat-network/jsonrpc/client.d.ts +1 -1
  65. package/internal/hardhat-network/jsonrpc/client.d.ts.map +1 -1
  66. package/internal/hardhat-network/jsonrpc/client.js +10 -10
  67. package/internal/hardhat-network/jsonrpc/client.js.map +1 -1
  68. package/internal/hardhat-network/provider/BlockchainBase.d.ts +4 -4
  69. package/internal/hardhat-network/provider/BlockchainBase.d.ts.map +1 -1
  70. package/internal/hardhat-network/provider/BlockchainBase.js +31 -12
  71. package/internal/hardhat-network/provider/BlockchainBase.js.map +1 -1
  72. package/internal/hardhat-network/provider/BlockchainData.d.ts +3 -3
  73. package/internal/hardhat-network/provider/BlockchainData.d.ts.map +1 -1
  74. package/internal/hardhat-network/provider/BlockchainData.js +15 -15
  75. package/internal/hardhat-network/provider/BlockchainData.js.map +1 -1
  76. package/internal/hardhat-network/provider/HardhatBlockchain.d.ts +3 -3
  77. package/internal/hardhat-network/provider/HardhatBlockchain.d.ts.map +1 -1
  78. package/internal/hardhat-network/provider/HardhatBlockchain.js +2 -2
  79. package/internal/hardhat-network/provider/HardhatBlockchain.js.map +1 -1
  80. package/internal/hardhat-network/provider/PoolState.d.ts +1 -1
  81. package/internal/hardhat-network/provider/PoolState.d.ts.map +1 -1
  82. package/internal/hardhat-network/provider/PoolState.js +21 -2
  83. package/internal/hardhat-network/provider/PoolState.js.map +1 -1
  84. package/internal/hardhat-network/provider/TransactionQueue.d.ts +1 -1
  85. package/internal/hardhat-network/provider/TransactionQueue.d.ts.map +1 -1
  86. package/internal/hardhat-network/provider/TransactionQueue.js +22 -3
  87. package/internal/hardhat-network/provider/TransactionQueue.js.map +1 -1
  88. package/internal/hardhat-network/provider/TxPool.d.ts +4 -4
  89. package/internal/hardhat-network/provider/TxPool.d.ts.map +1 -1
  90. package/internal/hardhat-network/provider/TxPool.js +35 -16
  91. package/internal/hardhat-network/provider/TxPool.js.map +1 -1
  92. package/internal/hardhat-network/provider/ethereumjs-workarounds.js +4 -4
  93. package/internal/hardhat-network/provider/ethereumjs-workarounds.js.map +1 -1
  94. package/internal/hardhat-network/provider/filter.d.ts +1 -1
  95. package/internal/hardhat-network/provider/filter.d.ts.map +1 -1
  96. package/internal/hardhat-network/provider/filter.js +3 -3
  97. package/internal/hardhat-network/provider/filter.js.map +1 -1
  98. package/internal/hardhat-network/provider/fork/ForkBlockchain.d.ts +3 -3
  99. package/internal/hardhat-network/provider/fork/ForkBlockchain.d.ts.map +1 -1
  100. package/internal/hardhat-network/provider/fork/ForkBlockchain.js +13 -12
  101. package/internal/hardhat-network/provider/fork/ForkBlockchain.js.map +1 -1
  102. package/internal/hardhat-network/provider/fork/ForkStateManager.d.ts +3 -5
  103. package/internal/hardhat-network/provider/fork/ForkStateManager.d.ts.map +1 -1
  104. package/internal/hardhat-network/provider/fork/ForkStateManager.js +36 -40
  105. package/internal/hardhat-network/provider/fork/ForkStateManager.js.map +1 -1
  106. package/internal/hardhat-network/provider/fork/rpcToBlockData.d.ts +1 -1
  107. package/internal/hardhat-network/provider/fork/rpcToBlockData.d.ts.map +1 -1
  108. package/internal/hardhat-network/provider/fork/rpcToTxData.d.ts +2 -2
  109. package/internal/hardhat-network/provider/fork/rpcToTxData.d.ts.map +1 -1
  110. package/internal/hardhat-network/provider/fork/rpcToTxData.js.map +1 -1
  111. package/internal/hardhat-network/provider/modules/eth.d.ts +1 -1
  112. package/internal/hardhat-network/provider/modules/eth.d.ts.map +1 -1
  113. package/internal/hardhat-network/provider/modules/eth.js +22 -22
  114. package/internal/hardhat-network/provider/modules/eth.js.map +1 -1
  115. package/internal/hardhat-network/provider/modules/hardhat.d.ts +2 -0
  116. package/internal/hardhat-network/provider/modules/hardhat.d.ts.map +1 -1
  117. package/internal/hardhat-network/provider/modules/hardhat.js +20 -6
  118. package/internal/hardhat-network/provider/modules/hardhat.js.map +1 -1
  119. package/internal/hardhat-network/provider/modules/logger.d.ts +2 -2
  120. package/internal/hardhat-network/provider/modules/logger.d.ts.map +1 -1
  121. package/internal/hardhat-network/provider/modules/logger.js +14 -14
  122. package/internal/hardhat-network/provider/modules/logger.js.map +1 -1
  123. package/internal/hardhat-network/provider/modules/net.d.ts +1 -1
  124. package/internal/hardhat-network/provider/modules/net.d.ts.map +1 -1
  125. package/internal/hardhat-network/provider/modules/personal.js +3 -3
  126. package/internal/hardhat-network/provider/modules/personal.js.map +1 -1
  127. package/internal/hardhat-network/provider/modules/web3.d.ts.map +1 -1
  128. package/internal/hardhat-network/provider/modules/web3.js +4 -5
  129. package/internal/hardhat-network/provider/modules/web3.js.map +1 -1
  130. package/internal/hardhat-network/provider/node-types.d.ts +4 -4
  131. package/internal/hardhat-network/provider/node-types.d.ts.map +1 -1
  132. package/internal/hardhat-network/provider/node.d.ts +5 -4
  133. package/internal/hardhat-network/provider/node.d.ts.map +1 -1
  134. package/internal/hardhat-network/provider/node.js +71 -49
  135. package/internal/hardhat-network/provider/node.js.map +1 -1
  136. package/internal/hardhat-network/provider/output.d.ts +4 -4
  137. package/internal/hardhat-network/provider/output.d.ts.map +1 -1
  138. package/internal/hardhat-network/provider/output.js +24 -5
  139. package/internal/hardhat-network/provider/output.js.map +1 -1
  140. package/internal/hardhat-network/provider/provider.d.ts +2 -2
  141. package/internal/hardhat-network/provider/provider.d.ts.map +1 -1
  142. package/internal/hardhat-network/provider/provider.js +3 -3
  143. package/internal/hardhat-network/provider/provider.js.map +1 -1
  144. package/internal/hardhat-network/provider/return-data.d.ts +1 -1
  145. package/internal/hardhat-network/provider/return-data.d.ts.map +1 -1
  146. package/internal/hardhat-network/provider/return-data.js +5 -4
  147. package/internal/hardhat-network/provider/return-data.js.map +1 -1
  148. package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.d.ts +4 -4
  149. package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.d.ts.map +1 -1
  150. package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.js +8 -8
  151. package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.js.map +1 -1
  152. package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.d.ts +3 -3
  153. package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.d.ts.map +1 -1
  154. package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.js +8 -8
  155. package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.js.map +1 -1
  156. package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.d.ts +3 -3
  157. package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.d.ts.map +1 -1
  158. package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.js +5 -5
  159. package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.js.map +1 -1
  160. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.d.ts +4 -4
  161. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.d.ts.map +1 -1
  162. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.js +25 -6
  163. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.js.map +1 -1
  164. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.d.ts +3 -3
  165. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.d.ts.map +1 -1
  166. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.js +25 -6
  167. package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.js.map +1 -1
  168. package/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.d.ts +3 -3
  169. package/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.d.ts.map +1 -1
  170. package/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.js +2 -2
  171. package/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.js.map +1 -1
  172. package/internal/hardhat-network/provider/types/HardhatBlockchainInterface.d.ts +2 -2
  173. package/internal/hardhat-network/provider/types/HardhatBlockchainInterface.d.ts.map +1 -1
  174. package/internal/hardhat-network/provider/utils/makeAccount.d.ts +1 -1
  175. package/internal/hardhat-network/provider/utils/makeAccount.d.ts.map +1 -1
  176. package/internal/hardhat-network/provider/utils/makeAccount.js +4 -4
  177. package/internal/hardhat-network/provider/utils/makeAccount.js.map +1 -1
  178. package/internal/hardhat-network/provider/utils/makeCommon.d.ts +1 -1
  179. package/internal/hardhat-network/provider/utils/makeCommon.d.ts.map +1 -1
  180. package/internal/hardhat-network/provider/utils/makeCommon.js +2 -2
  181. package/internal/hardhat-network/provider/utils/makeCommon.js.map +1 -1
  182. package/internal/hardhat-network/provider/utils/makeStateTrie.d.ts +1 -1
  183. package/internal/hardhat-network/provider/utils/makeStateTrie.d.ts.map +1 -1
  184. package/internal/hardhat-network/provider/utils/makeStateTrie.js +4 -4
  185. package/internal/hardhat-network/provider/utils/makeStateTrie.js.map +1 -1
  186. package/internal/hardhat-network/provider/utils/putGenesisBlock.d.ts +3 -3
  187. package/internal/hardhat-network/provider/utils/putGenesisBlock.d.ts.map +1 -1
  188. package/internal/hardhat-network/provider/utils/putGenesisBlock.js +4 -4
  189. package/internal/hardhat-network/provider/utils/putGenesisBlock.js.map +1 -1
  190. package/internal/hardhat-network/provider/utils/random.d.ts +2 -1
  191. package/internal/hardhat-network/provider/utils/random.d.ts.map +1 -1
  192. package/internal/hardhat-network/provider/utils/random.js +10 -9
  193. package/internal/hardhat-network/provider/utils/random.js.map +1 -1
  194. package/internal/hardhat-network/provider/utils/reorganizeTransactionsLists.js +21 -2
  195. package/internal/hardhat-network/provider/utils/reorganizeTransactionsLists.js.map +1 -1
  196. package/internal/hardhat-network/provider/utils/txMapToArray.d.ts +1 -1
  197. package/internal/hardhat-network/provider/utils/txMapToArray.d.ts.map +1 -1
  198. package/internal/hardhat-network/stack-traces/consoleLogger.js +45 -45
  199. package/internal/hardhat-network/stack-traces/consoleLogger.js.map +1 -1
  200. package/internal/hardhat-network/stack-traces/constants.d.ts +1 -1
  201. package/internal/hardhat-network/stack-traces/constants.d.ts.map +1 -1
  202. package/internal/hardhat-network/stack-traces/constants.js +1 -1
  203. package/internal/hardhat-network/stack-traces/constants.js.map +1 -1
  204. package/internal/hardhat-network/stack-traces/contracts-identifier.js +2 -2
  205. package/internal/hardhat-network/stack-traces/contracts-identifier.js.map +1 -1
  206. package/internal/hardhat-network/stack-traces/debug.js +13 -13
  207. package/internal/hardhat-network/stack-traces/debug.js.map +1 -1
  208. package/internal/hardhat-network/stack-traces/error-inferrer.js +2 -2
  209. package/internal/hardhat-network/stack-traces/error-inferrer.js.map +1 -1
  210. package/internal/hardhat-network/stack-traces/message-trace.d.ts +1 -1
  211. package/internal/hardhat-network/stack-traces/message-trace.d.ts.map +1 -1
  212. package/internal/hardhat-network/stack-traces/model.js +6 -6
  213. package/internal/hardhat-network/stack-traces/model.js.map +1 -1
  214. package/internal/hardhat-network/stack-traces/panic-errors.d.ts +1 -1
  215. package/internal/hardhat-network/stack-traces/panic-errors.js +9 -9
  216. package/internal/hardhat-network/stack-traces/panic-errors.js.map +1 -1
  217. package/internal/hardhat-network/stack-traces/solidity-errors.js +3 -3
  218. package/internal/hardhat-network/stack-traces/solidity-errors.js.map +1 -1
  219. package/internal/hardhat-network/stack-traces/solidity-stack-trace.d.ts +1 -1
  220. package/internal/hardhat-network/stack-traces/solidityTracer.d.ts +0 -2
  221. package/internal/hardhat-network/stack-traces/solidityTracer.d.ts.map +1 -1
  222. package/internal/hardhat-network/stack-traces/solidityTracer.js +2 -4
  223. package/internal/hardhat-network/stack-traces/solidityTracer.js.map +1 -1
  224. package/internal/hardhat-network/stack-traces/vm-debug-tracer.d.ts +1 -1
  225. package/internal/hardhat-network/stack-traces/vm-debug-tracer.d.ts.map +1 -1
  226. package/internal/hardhat-network/stack-traces/vm-debug-tracer.js +27 -25
  227. package/internal/hardhat-network/stack-traces/vm-debug-tracer.js.map +1 -1
  228. package/internal/hardhat-network/stack-traces/vm-tracer.d.ts +2 -2
  229. package/internal/hardhat-network/stack-traces/vm-tracer.d.ts.map +1 -1
  230. package/internal/hardhat-network/stack-traces/vm-tracer.js +15 -12
  231. package/internal/hardhat-network/stack-traces/vm-tracer.js.map +1 -1
  232. package/internal/lib/hardhat-lib.d.ts.map +1 -1
  233. package/internal/lib/hardhat-lib.js +0 -2
  234. package/internal/lib/hardhat-lib.js.map +1 -1
  235. package/internal/solidity/compilation-job.d.ts.map +1 -1
  236. package/internal/solidity/compilation-job.js +6 -7
  237. package/internal/solidity/compilation-job.js.map +1 -1
  238. package/internal/solidity/compiler/downloader.d.ts +66 -40
  239. package/internal/solidity/compiler/downloader.d.ts.map +1 -1
  240. package/internal/solidity/compiler/downloader.js +180 -154
  241. package/internal/solidity/compiler/downloader.js.map +1 -1
  242. package/internal/solidity/compiler/index.d.ts +8 -4
  243. package/internal/solidity/compiler/index.d.ts.map +1 -1
  244. package/internal/solidity/compiler/index.js +1 -1
  245. package/internal/solidity/compiler/index.js.map +1 -1
  246. package/internal/solidity/dependencyGraph.d.ts.map +1 -1
  247. package/internal/solidity/dependencyGraph.js +3 -5
  248. package/internal/solidity/dependencyGraph.js.map +1 -1
  249. package/internal/solidity/parse.d.ts.map +1 -1
  250. package/internal/solidity/parse.js +2 -58
  251. package/internal/solidity/parse.js.map +1 -1
  252. package/internal/solidity/resolver.d.ts +1 -0
  253. package/internal/solidity/resolver.d.ts.map +1 -1
  254. package/internal/solidity/resolver.js +33 -8
  255. package/internal/solidity/resolver.js.map +1 -1
  256. package/internal/util/bigint.d.ts +13 -24
  257. package/internal/util/bigint.d.ts.map +1 -1
  258. package/internal/util/bigint.js +22 -29
  259. package/internal/util/bigint.js.map +1 -1
  260. package/internal/util/download.d.ts.map +1 -1
  261. package/internal/util/download.js +1 -1
  262. package/internal/util/download.js.map +1 -1
  263. package/internal/util/fs-utils.d.ts +26 -9
  264. package/internal/util/fs-utils.d.ts.map +1 -1
  265. package/internal/util/fs-utils.js +111 -68
  266. package/internal/util/fs-utils.js.map +1 -1
  267. package/internal/util/glob.d.ts +13 -0
  268. package/internal/util/glob.d.ts.map +1 -1
  269. package/internal/util/glob.js +13 -0
  270. package/internal/util/glob.js.map +1 -1
  271. package/internal/util/keccak.d.ts +3 -0
  272. package/internal/util/keccak.d.ts.map +1 -0
  273. package/internal/util/keccak.js +12 -0
  274. package/internal/util/keccak.js.map +1 -0
  275. package/internal/util/scripts-runner.d.ts.map +1 -1
  276. package/internal/util/scripts-runner.js +7 -4
  277. package/internal/util/scripts-runner.js.map +1 -1
  278. package/package.json +15 -15
  279. package/register.js +1 -3
  280. package/register.js.map +1 -1
  281. package/sample-projects/javascript/contracts/Lock.sol +3 -3
  282. package/sample-projects/typescript/contracts/Lock.sol +3 -3
  283. package/src/builtin-tasks/clean.ts +9 -6
  284. package/src/builtin-tasks/compile.ts +96 -128
  285. package/src/builtin-tasks/flatten.ts +2 -3
  286. package/src/builtin-tasks/node.ts +2 -2
  287. package/src/builtin-tasks/test.ts +7 -3
  288. package/src/builtin-tasks/utils/solidity-files-cache.ts +9 -8
  289. package/src/internal/artifacts.ts +392 -182
  290. package/src/internal/cli/cli.ts +43 -17
  291. package/src/internal/core/config/config-loading.ts +1 -1
  292. package/src/internal/core/config/config-resolution.ts +12 -24
  293. package/src/internal/core/config/default-config.ts +1 -1
  294. package/src/internal/core/errors-list.ts +29 -13
  295. package/src/internal/core/errors.ts +10 -2
  296. package/src/internal/core/execution-mode.ts +2 -3
  297. package/src/internal/core/flamegraph.ts +270 -0
  298. package/src/internal/core/jsonrpc/types/base-types.ts +7 -3
  299. package/src/internal/core/params/hardhat-params.ts +18 -0
  300. package/src/internal/core/providers/accounts.ts +8 -8
  301. package/src/internal/core/providers/construction.ts +10 -8
  302. package/src/internal/core/providers/gas-providers.ts +2 -2
  303. package/src/internal/core/providers/util.ts +1 -1
  304. package/src/internal/core/runtime-environment.ts +103 -10
  305. package/src/internal/core/task-profiling.ts +56 -0
  306. package/src/internal/core/typescript-support.ts +11 -2
  307. package/src/internal/hardhat-network/jsonrpc/client.ts +1 -1
  308. package/src/internal/hardhat-network/provider/BlockchainBase.ts +6 -6
  309. package/src/internal/hardhat-network/provider/BlockchainData.ts +5 -5
  310. package/src/internal/hardhat-network/provider/HardhatBlockchain.ts +4 -4
  311. package/src/internal/hardhat-network/provider/PoolState.ts +2 -2
  312. package/src/internal/hardhat-network/provider/TransactionQueue.ts +2 -2
  313. package/src/internal/hardhat-network/provider/TxPool.ts +12 -5
  314. package/src/internal/hardhat-network/provider/ethereumjs-workarounds.ts +3 -3
  315. package/src/internal/hardhat-network/provider/filter.ts +2 -2
  316. package/src/internal/hardhat-network/provider/fork/ForkBlockchain.ts +10 -10
  317. package/src/internal/hardhat-network/provider/fork/ForkStateManager.ts +12 -18
  318. package/src/internal/hardhat-network/provider/fork/rpcToBlockData.ts +1 -1
  319. package/src/internal/hardhat-network/provider/fork/rpcToTxData.ts +5 -2
  320. package/src/internal/hardhat-network/provider/modules/eth.ts +10 -6
  321. package/src/internal/hardhat-network/provider/modules/hardhat.ts +25 -1
  322. package/src/internal/hardhat-network/provider/modules/logger.ts +3 -3
  323. package/src/internal/hardhat-network/provider/modules/net.ts +1 -1
  324. package/src/internal/hardhat-network/provider/modules/personal.ts +1 -1
  325. package/src/internal/hardhat-network/provider/modules/web3.ts +4 -6
  326. package/src/internal/hardhat-network/provider/node-types.ts +6 -6
  327. package/src/internal/hardhat-network/provider/node.ts +25 -12
  328. package/src/internal/hardhat-network/provider/output.ts +6 -6
  329. package/src/internal/hardhat-network/provider/provider.ts +7 -6
  330. package/src/internal/hardhat-network/provider/return-data.ts +9 -5
  331. package/src/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.ts +9 -5
  332. package/src/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.ts +8 -4
  333. package/src/internal/hardhat-network/provider/transactions/FakeSenderTransaction.ts +4 -4
  334. package/src/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.ts +8 -5
  335. package/src/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.ts +4 -4
  336. package/src/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.ts +3 -3
  337. package/src/internal/hardhat-network/provider/types/HardhatBlockchainInterface.ts +2 -2
  338. package/src/internal/hardhat-network/provider/utils/makeAccount.ts +6 -1
  339. package/src/internal/hardhat-network/provider/utils/makeCommon.ts +1 -1
  340. package/src/internal/hardhat-network/provider/utils/makeStateTrie.ts +7 -3
  341. package/src/internal/hardhat-network/provider/utils/putGenesisBlock.ts +6 -6
  342. package/src/internal/hardhat-network/provider/utils/random.ts +17 -14
  343. package/src/internal/hardhat-network/provider/utils/reorganizeTransactionsLists.ts +1 -1
  344. package/src/internal/hardhat-network/stack-traces/consoleLogger.ts +1 -1
  345. package/src/internal/hardhat-network/stack-traces/constants.ts +2 -0
  346. package/src/internal/hardhat-network/stack-traces/contracts-identifier.ts +1 -1
  347. package/src/internal/hardhat-network/stack-traces/debug.ts +1 -1
  348. package/src/internal/hardhat-network/stack-traces/error-inferrer.ts +3 -3
  349. package/src/internal/hardhat-network/stack-traces/message-trace.ts +1 -1
  350. package/src/internal/hardhat-network/stack-traces/model.ts +1 -1
  351. package/src/internal/hardhat-network/stack-traces/panic-errors.ts +11 -11
  352. package/src/internal/hardhat-network/stack-traces/solidity-errors.ts +1 -1
  353. package/src/internal/hardhat-network/stack-traces/solidity-stack-trace.ts +1 -1
  354. package/src/internal/hardhat-network/stack-traces/solidityTracer.ts +1 -4
  355. package/src/internal/hardhat-network/stack-traces/vm-debug-tracer.ts +31 -17
  356. package/src/internal/hardhat-network/stack-traces/vm-tracer.ts +29 -14
  357. package/src/internal/lib/hardhat-lib.ts +0 -3
  358. package/src/internal/solidity/compilation-job.ts +11 -11
  359. package/src/internal/solidity/compiler/downloader.ts +271 -243
  360. package/src/internal/solidity/compiler/index.ts +13 -7
  361. package/src/internal/solidity/dependencyGraph.ts +12 -8
  362. package/src/internal/solidity/parse.ts +4 -70
  363. package/src/internal/solidity/resolver.ts +36 -8
  364. package/src/internal/util/bigint.ts +25 -43
  365. package/src/internal/util/download.ts +2 -2
  366. package/src/internal/util/fs-utils.ts +223 -0
  367. package/src/internal/util/glob.ts +13 -0
  368. package/src/internal/util/keccak.ts +5 -0
  369. package/src/internal/util/scripts-runner.ts +13 -4
  370. package/src/internal/util/wei-values.ts +1 -1
  371. package/src/internal/{hardhat-network/vendor → vendor}/await-semaphore/index.ts +0 -0
  372. package/src/profiling.ts +37 -0
  373. package/src/register.ts +1 -4
  374. package/src/types/artifacts.ts +21 -0
  375. package/src/types/config.ts +7 -7
  376. package/src/types/runtime.ts +2 -0
  377. package/src/utils/source-names.ts +36 -26
  378. package/types/artifacts.d.ts +19 -0
  379. package/types/artifacts.d.ts.map +1 -1
  380. package/types/config.d.ts +7 -7
  381. package/types/runtime.d.ts +2 -0
  382. package/types/runtime.d.ts.map +1 -1
  383. package/utils/source-names.d.ts.map +1 -1
  384. package/utils/source-names.js +25 -36
  385. package/utils/source-names.js.map +1 -1
  386. package/internal/hardhat-network/provider/fork/random.d.ts +0 -7
  387. package/internal/hardhat-network/provider/fork/random.d.ts.map +0 -1
  388. package/internal/hardhat-network/provider/fork/random.js +0 -32
  389. package/internal/hardhat-network/provider/fork/random.js.map +0 -1
  390. package/internal/hardhat-network/provider/utils/bnToHex.d.ts +0 -3
  391. package/internal/hardhat-network/provider/utils/bnToHex.d.ts.map +0 -1
  392. package/internal/hardhat-network/provider/utils/bnToHex.js +0 -9
  393. package/internal/hardhat-network/provider/utils/bnToHex.js.map +0 -1
  394. package/internal/hardhat-network/provider/utils/makeForkCommon.d.ts +0 -4
  395. package/internal/hardhat-network/provider/utils/makeForkCommon.d.ts.map +0 -1
  396. package/internal/hardhat-network/provider/utils/makeForkCommon.js +0 -16
  397. package/internal/hardhat-network/provider/utils/makeForkCommon.js.map +0 -1
  398. package/internal/hardhat-network/vendor/await-semaphore/index.d.ts +0 -12
  399. package/internal/hardhat-network/vendor/await-semaphore/index.d.ts.map +0 -1
  400. package/internal/hardhat-network/vendor/await-semaphore/index.js +0 -64
  401. package/internal/hardhat-network/vendor/await-semaphore/index.js.map +0 -1
  402. package/internal/util/antlr-prototype-pollution-workaround.d.ts +0 -16
  403. package/internal/util/antlr-prototype-pollution-workaround.d.ts.map +0 -1
  404. package/internal/util/antlr-prototype-pollution-workaround.js +0 -22
  405. package/internal/util/antlr-prototype-pollution-workaround.js.map +0 -1
  406. package/src/internal/util/antlr-prototype-pollution-workaround.ts +0 -17
@@ -1,21 +1,16 @@
1
- import chalk from "chalk";
2
- import debug from "debug";
1
+ import path from "path";
3
2
  import fsExtra from "fs-extra";
3
+ import debug from "debug";
4
4
  import os from "os";
5
- import path from "path";
6
-
7
- import { HardhatError } from "../../core/errors";
5
+ import { execFile } from "child_process";
6
+ import { download } from "../../util/download";
7
+ import { assertHardhatInvariant, HardhatError } from "../../core/errors";
8
8
  import { ERRORS } from "../../core/errors-list";
9
+ import { Mutex } from "../../vendor/await-semaphore";
9
10
 
10
- export interface CompilerBuild {
11
- path: string;
12
- version: string;
13
- build: string;
14
- longVersion: string;
15
- keccak256: string;
16
- urls: string[];
17
- platform: CompilerPlatform;
18
- }
11
+ const log = debug("hardhat:core:solidity:downloader");
12
+
13
+ const COMPILER_REPOSITORY_URL = "https://binaries.soliditylang.org";
19
14
 
20
15
  export enum CompilerPlatform {
21
16
  LINUX = "linux-amd64",
@@ -24,304 +19,337 @@ export enum CompilerPlatform {
24
19
  WASM = "wasm",
25
20
  }
26
21
 
27
- interface CompilerPath {
28
- compilerPath: string; // absolute path
22
+ export interface Compiler {
23
+ version: string;
24
+ longVersion: string;
25
+ compilerPath: string;
26
+ isSolcJs: boolean;
27
+ }
28
+
29
+ interface CompilerBuild {
30
+ path: string;
31
+ version: string;
32
+ build: string;
33
+ longVersion: string;
34
+ keccak256: string;
35
+ urls: string[];
29
36
  platform: CompilerPlatform;
30
37
  }
31
38
 
32
- export interface CompilersList {
39
+ interface CompilerList {
33
40
  builds: CompilerBuild[];
34
- releases: {
35
- [version: string]: string;
36
- };
41
+ releases: { [version: string]: string };
37
42
  latestRelease: string;
38
43
  }
39
44
 
40
- const log = debug("hardhat:core:solidity:downloader");
41
-
42
- const COMPILER_FILES_DIR_URL_SOLC = "https://binaries.soliditylang.org/";
43
-
44
- async function downloadFile(
45
- url: string,
46
- destinationFile: string
47
- ): Promise<void> {
48
- const { download } = await import("../../util/download");
49
- log(`Downloading from ${url} to ${destinationFile}`);
50
- await download(url, destinationFile);
45
+ /**
46
+ * A compiler downloader which must be specialized per-platform. It can't and
47
+ * shouldn't support multiple platforms at the same time.
48
+ */
49
+ export interface ICompilerDownloader {
50
+ /**
51
+ * Returns true if the compiler has been downloaded.
52
+ *
53
+ * This function access the filesystem, but doesn't modify it.
54
+ */
55
+ isCompilerDownloaded(version: string): Promise<boolean>;
56
+
57
+ /**
58
+ * Downloads the compiler for a given version, which can later be obtained
59
+ * with getCompiler.
60
+ */
61
+ downloadCompiler(version: string): Promise<void>;
62
+
63
+ /**
64
+ * Returns the compiler, which MUST be downloaded before calling this function.
65
+ *
66
+ * Returns undefined if the compiler has been downloaded but can't be run.
67
+ *
68
+ * This function access the filesystem, but doesn't modify it.
69
+ */
70
+ getCompiler(version: string): Promise<Compiler | undefined>;
51
71
  }
52
72
 
53
- type CompilerDownloaderOptions = Partial<{
54
- download: (url: string, destinationFile: string) => Promise<void>;
55
- forceSolcJs: boolean;
56
- }>;
73
+ /**
74
+ * Default implementation of ICompilerDownloader.
75
+ *
76
+ * Important things to note:
77
+ * 1. If a compiler version is not found, this downloader may fail.
78
+ * 1.1. It only re-downloads the list of compilers once every X time.
79
+ * 1.1.1 If a user tries to download a new compiler before X amount of time
80
+ * has passed since its release, they may need to clean the cache, as
81
+ * indicated in the error messages.
82
+ */
83
+ export class CompilerDownloader implements ICompilerDownloader {
84
+ public static getCompilerPlatform(): CompilerPlatform {
85
+ switch (os.platform()) {
86
+ case "win32":
87
+ return CompilerPlatform.WINDOWS;
88
+ case "linux":
89
+ return CompilerPlatform.LINUX;
90
+ case "darwin":
91
+ return CompilerPlatform.MACOS;
92
+ default:
93
+ return CompilerPlatform.WASM;
94
+ }
95
+ }
57
96
 
58
- export class CompilerDownloader {
59
- private readonly _download: (
60
- url: string,
61
- destinationFile: string
62
- ) => Promise<void>;
63
- private readonly _forceSolcJs: boolean;
97
+ private static _downloaderPerPlatform: Map<string, CompilerDownloader> =
98
+ new Map();
64
99
 
65
- constructor(
66
- private readonly _compilersDir: string,
67
- options: CompilerDownloaderOptions = {}
100
+ public static getConcurrencySafeDownloader(
101
+ platform: CompilerPlatform,
102
+ compilersDir: string
68
103
  ) {
69
- this._download = options.download ?? downloadFile;
70
- this._forceSolcJs = options.forceSolcJs ?? false;
71
- }
104
+ const key = platform + compilersDir;
72
105
 
73
- public async isCompilerDownloaded(version: string): Promise<boolean> {
74
- const compilerBuild = await this.getCompilerBuild(version);
75
- const downloadedFilePath = this._getDownloadedFilePath(compilerBuild);
106
+ if (!this._downloaderPerPlatform.has(key)) {
107
+ this._downloaderPerPlatform.set(
108
+ key,
109
+ new CompilerDownloader(platform, compilersDir)
110
+ );
111
+ }
76
112
 
77
- return this._fileExists(downloadedFilePath);
113
+ return this._downloaderPerPlatform.get(key)!;
78
114
  }
79
115
 
80
- public async verifyCompiler(
81
- compilerBuild: CompilerBuild,
82
- downloadedFilePath: string
83
- ) {
84
- const ethereumjsUtil = await import("@ignored/util");
85
- const { keccak256 } = await import("ethereum-cryptography/keccak");
86
-
87
- const expectedKeccak256 = compilerBuild.keccak256;
88
- const compiler = await fsExtra.readFile(downloadedFilePath);
116
+ public static defaultCompilerListCachePeriod = 3_600_00;
117
+ private readonly _mutex = new Mutex();
89
118
 
90
- const compilerKeccak256 = ethereumjsUtil.bufferToHex(
91
- ethereumjsUtil.arrToBufArr(
92
- keccak256(ethereumjsUtil.bufArrToArr(compiler))
93
- )
94
- );
119
+ /**
120
+ * Use CompilerDownloader.getConcurrencySafeDownloader instead
121
+ */
122
+ constructor(
123
+ private readonly _platform: CompilerPlatform,
124
+ private readonly _compilersDir: string,
125
+ private readonly _compilerListCachePeriodMs = CompilerDownloader.defaultCompilerListCachePeriod,
126
+ private readonly _downloadFunction: typeof download = download
127
+ ) {}
95
128
 
96
- if (expectedKeccak256 !== compilerKeccak256) {
97
- await fsExtra.unlink(downloadedFilePath);
98
- await fsExtra.unlink(this.getCompilersListPath(compilerBuild.platform));
129
+ public async isCompilerDownloaded(version: string): Promise<boolean> {
130
+ const build = await this._getCompilerBuild(version);
99
131
 
100
- throw new HardhatError(ERRORS.SOLC.INVALID_DOWNLOAD, {
101
- remoteVersion: compilerBuild.version,
102
- });
132
+ if (build === undefined) {
133
+ return false;
103
134
  }
104
- }
105
135
 
106
- public async getDownloadedCompilerPath(
107
- version: string
108
- ): Promise<CompilerPath | undefined> {
109
- const { default: AdmZip } = await import("adm-zip");
136
+ const downloadPath = this._getCompilerBinaryPathFromBuild(build);
110
137
 
111
- try {
112
- const compilerBuild = await this.getCompilerBuild(version);
138
+ return fsExtra.pathExists(downloadPath);
139
+ }
113
140
 
114
- let downloadedFilePath = this._getDownloadedFilePath(compilerBuild);
141
+ public async downloadCompiler(version: string): Promise<void> {
142
+ await this._mutex.use(async () => {
143
+ let build = await this._getCompilerBuild(version);
144
+
145
+ if (build === undefined && (await this._shouldDownloadCompilerList())) {
146
+ try {
147
+ await this._downloadCompilerList();
148
+ } catch (e: any) {
149
+ throw new HardhatError(
150
+ ERRORS.SOLC.VERSION_LIST_DOWNLOAD_FAILED,
151
+ {},
152
+ e
153
+ );
154
+ }
115
155
 
116
- if (!(await this._fileExists(downloadedFilePath))) {
117
- await this.downloadCompiler(compilerBuild, downloadedFilePath);
156
+ build = await this._getCompilerBuild(version);
118
157
  }
119
158
 
120
- await this.verifyCompiler(compilerBuild, downloadedFilePath);
121
-
122
- if (
123
- compilerBuild.platform === CompilerPlatform.LINUX ||
124
- compilerBuild.platform === CompilerPlatform.MACOS
125
- ) {
126
- fsExtra.chmodSync(downloadedFilePath, 0o755);
127
- } else if (compilerBuild.platform === CompilerPlatform.WINDOWS) {
128
- // some window builds are zipped, some are not
129
- if (downloadedFilePath.endsWith(".zip")) {
130
- const zip = new AdmZip(downloadedFilePath);
131
- zip.extractAllTo(
132
- path.join(this._compilersDir, compilerBuild.version)
133
- );
134
- downloadedFilePath = path.join(
135
- this._compilersDir,
136
- compilerBuild.version,
137
- "solc.exe"
138
- );
139
- }
159
+ if (build === undefined) {
160
+ throw new HardhatError(ERRORS.SOLC.INVALID_VERSION, { version });
140
161
  }
141
162
 
142
- return {
143
- compilerPath: downloadedFilePath,
144
- platform: compilerBuild.platform,
145
- };
146
- } catch (e) {
147
- if (e instanceof Error) {
148
- if (HardhatError.isHardhatError(e)) {
149
- throw e;
150
- }
151
- console.warn(
152
- chalk.yellow(
153
- `There was an unexpected problem downloading the compiler: ${e.message}`
154
- )
163
+ let downloadPath: string;
164
+ try {
165
+ downloadPath = await this._downloadCompiler(build);
166
+ } catch (e: any) {
167
+ throw new HardhatError(
168
+ ERRORS.SOLC.DOWNLOAD_FAILED,
169
+ {
170
+ remoteVersion: build.longVersion,
171
+ },
172
+ e
155
173
  );
156
174
  }
157
- }
158
- }
159
175
 
160
- public async getCompilersList(
161
- platform: CompilerPlatform,
162
- pendingRetries: number = 3
163
- ): Promise<CompilersList> {
164
- if (!(await this.compilersListExists(platform))) {
165
- await this.downloadCompilersList(platform);
166
- }
167
-
168
- try {
169
- return await fsExtra.readJSON(this.getCompilersListPath(platform));
170
- } catch (error) {
171
- // if parsing throws a syntax error, redownload and parse once more
172
- if (!(error instanceof SyntaxError) || pendingRetries === 0) {
173
- // eslint-disable-next-line @nomiclabs/hardhat-internal-rules/only-hardhat-error
174
- throw error;
176
+ const verified = await this._verifyCompilerDownload(build, downloadPath);
177
+ if (!verified) {
178
+ throw new HardhatError(ERRORS.SOLC.INVALID_DOWNLOAD, {
179
+ remoteVersion: build.longVersion,
180
+ });
175
181
  }
176
182
 
177
- // remove the malformed list and retry
178
- await fsExtra.remove(this.getCompilersListPath(platform));
179
- return this.getCompilersList(platform, pendingRetries - 1);
180
- }
183
+ await this._postProcessCompilerDownload(build, downloadPath);
184
+ });
181
185
  }
182
186
 
183
- public async getCompilerBuild(version: string): Promise<CompilerBuild> {
184
- const platform = this._getCurrentPlatform();
187
+ public async getCompiler(version: string): Promise<Compiler | undefined> {
188
+ const build = await this._getCompilerBuild(version);
185
189
 
186
- if (await this._versionExists(version, platform)) {
187
- try {
188
- return await this._getCompilerBuildByPlatform(version, platform);
189
- } catch {
190
- log("Couldn't download native compiler, using solcjs instead");
191
- }
190
+ assertHardhatInvariant(
191
+ build !== undefined,
192
+ "Trying to get a compiler before it was downloaded"
193
+ );
194
+
195
+ const compilerPath = this._getCompilerBinaryPathFromBuild(build);
196
+
197
+ assertHardhatInvariant(
198
+ await fsExtra.pathExists(compilerPath),
199
+ "Trying to get a compiler before it was downloaded"
200
+ );
201
+
202
+ if (await fsExtra.pathExists(this._getCompilerDoesntWorkFile(build))) {
203
+ return undefined;
192
204
  }
193
205
 
194
- return this._getCompilerBuildByPlatform(version, CompilerPlatform.WASM);
206
+ return {
207
+ version,
208
+ longVersion: build.longVersion,
209
+ compilerPath,
210
+ isSolcJs: this._platform === CompilerPlatform.WASM,
211
+ };
195
212
  }
196
213
 
197
- public async downloadCompilersList(
198
- platform: CompilerPlatform = this._getCurrentPlatform()
199
- ) {
200
- try {
201
- await this._download(
202
- getCompilerListURL(platform),
203
- this.getCompilersListPath(platform)
204
- );
205
- } catch (error: any) {
206
- throw new HardhatError(
207
- ERRORS.SOLC.VERSION_LIST_DOWNLOAD_FAILED,
208
- {},
209
- error
210
- );
214
+ private async _getCompilerBuild(
215
+ version: string
216
+ ): Promise<CompilerBuild | undefined> {
217
+ const listPath = this._getCompilerListPath();
218
+ if (!(await fsExtra.pathExists(listPath))) {
219
+ return undefined;
211
220
  }
221
+
222
+ const list = await this._readCompilerList(listPath);
223
+ return list.builds.find((b) => b.version === version);
212
224
  }
213
225
 
214
- public async downloadCompiler(
215
- compilerBuild: CompilerBuild,
216
- downloadedFilePath: string
217
- ) {
218
- log(
219
- `Downloading compiler version ${compilerBuild.version} platform ${compilerBuild.platform}`
220
- );
226
+ private _getCompilerListPath(): string {
227
+ return path.join(this._compilersDir, this._platform, "list.json");
228
+ }
221
229
 
222
- const compilerUrl = getCompilerURL(
223
- compilerBuild.platform,
224
- compilerBuild.path
225
- );
230
+ private async _readCompilerList(listPath: string): Promise<CompilerList> {
231
+ return fsExtra.readJSON(listPath);
232
+ }
226
233
 
227
- try {
228
- await this._download(compilerUrl, downloadedFilePath);
229
- } catch (error) {
230
- throw new HardhatError(
231
- ERRORS.SOLC.DOWNLOAD_FAILED,
232
- {
233
- remoteVersion: compilerBuild.version,
234
- },
235
- error as Error
236
- );
237
- }
234
+ private _getCompilerDownloadPathFromBuild(build: CompilerBuild): string {
235
+ return path.join(this._compilersDir, this._platform, build.path);
238
236
  }
239
237
 
240
- public async compilersListExists(platform: CompilerPlatform) {
241
- return fsExtra.pathExists(this.getCompilersListPath(platform));
238
+ private _getCompilerBinaryPathFromBuild(build: CompilerBuild): string {
239
+ const downloadPath = this._getCompilerDownloadPathFromBuild(build);
240
+
241
+ if (
242
+ this._platform !== CompilerPlatform.WINDOWS ||
243
+ !downloadPath.endsWith(".zip")
244
+ ) {
245
+ return downloadPath;
246
+ }
247
+
248
+ return path.join(this._compilersDir, build.version, "solc.exe");
242
249
  }
243
250
 
244
- public getCompilersListPath(platform: CompilerPlatform) {
245
- return path.join(this._compilersDir, platform, "list.json");
251
+ private _getCompilerDoesntWorkFile(build: CompilerBuild): string {
252
+ return `${this._getCompilerBinaryPathFromBuild(build)}.does.not.work`;
246
253
  }
247
254
 
248
- private _getDownloadedFilePath(compilerBuild: CompilerBuild): string {
249
- return path.join(
250
- this._compilersDir,
251
- compilerBuild.platform,
252
- compilerBuild.path
253
- );
255
+ private async _shouldDownloadCompilerList(): Promise<boolean> {
256
+ const listPath = this._getCompilerListPath();
257
+ if (!(await fsExtra.pathExists(listPath))) {
258
+ return true;
259
+ }
260
+
261
+ const stats = await fsExtra.stat(listPath);
262
+ const age = new Date().valueOf() - stats.ctimeMs;
263
+
264
+ return age > this._compilerListCachePeriodMs;
254
265
  }
255
266
 
256
- private async _fetchVersionPath(
257
- version: string,
258
- platform: CompilerPlatform
259
- ): Promise<string | undefined> {
260
- const compilersListExisted = await this.compilersListExists(platform);
261
- let list = await this.getCompilersList(platform);
262
- let compilerBuildPath = list.releases[version];
267
+ private async _downloadCompilerList(): Promise<void> {
268
+ log(`Downloading compiler list for platform ${this._platform}`);
269
+ const url = `${COMPILER_REPOSITORY_URL}/${this._platform}/list.json`;
270
+ const downloadPath = this._getCompilerListPath();
263
271
 
264
- // We may need to re-download the compilers list.
265
- if (compilerBuildPath === undefined && compilersListExisted) {
266
- await fsExtra.unlink(this.getCompilersListPath(platform));
272
+ await this._downloadFunction(url, downloadPath);
273
+ }
267
274
 
268
- list = await this.getCompilersList(platform);
269
- compilerBuildPath = list.releases[version];
270
- }
275
+ private async _downloadCompiler(build: CompilerBuild): Promise<string> {
276
+ log(`Downloading compiler ${build.longVersion}`);
277
+ const url = `${COMPILER_REPOSITORY_URL}/${this._platform}/${build.path}`;
278
+ const downloadPath = this._getCompilerDownloadPathFromBuild(build);
271
279
 
272
- return compilerBuildPath;
280
+ await this._downloadFunction(url, downloadPath);
281
+
282
+ return downloadPath;
273
283
  }
274
284
 
275
- private async _versionExists(
276
- version: string,
277
- platform: CompilerPlatform
285
+ private async _verifyCompilerDownload(
286
+ build: CompilerBuild,
287
+ downloadPath: string
278
288
  ): Promise<boolean> {
279
- const versionPath = await this._fetchVersionPath(version, platform);
280
- return versionPath !== undefined;
281
- }
289
+ const ethereumjsUtil = await import("@nomicfoundation/ethereumjs-util");
290
+ const { keccak256 } = await import("../../util/keccak");
282
291
 
283
- private async _getCompilerBuildByPlatform(
284
- version: string,
285
- platform: CompilerPlatform
286
- ): Promise<CompilerBuild> {
287
- const compilerBuildPath = await this._fetchVersionPath(version, platform);
288
- const list = await this.getCompilersList(platform);
289
- const compilerBuild = list.builds.find((b) => b.path === compilerBuildPath);
292
+ const expectedKeccak256 = build.keccak256;
293
+ const compiler = await fsExtra.readFile(downloadPath);
290
294
 
291
- if (compilerBuild === undefined) {
292
- throw new HardhatError(ERRORS.SOLC.INVALID_VERSION, { version });
295
+ const compilerKeccak256 = ethereumjsUtil.bufferToHex(keccak256(compiler));
296
+
297
+ if (expectedKeccak256 !== compilerKeccak256) {
298
+ await fsExtra.unlink(downloadPath);
299
+ return false;
293
300
  }
294
301
 
295
- compilerBuild.platform = platform;
296
- return compilerBuild;
302
+ return true;
297
303
  }
298
304
 
299
- private async _fileExists(filePath: string) {
300
- return fsExtra.pathExists(filePath);
301
- }
305
+ private async _postProcessCompilerDownload(
306
+ build: CompilerBuild,
307
+ downloadPath: string
308
+ ): Promise<void> {
309
+ if (this._platform === CompilerPlatform.WASM) {
310
+ return;
311
+ }
302
312
 
303
- private _getCurrentPlatform(): CompilerPlatform {
304
- if (this._forceSolcJs) {
305
- return CompilerPlatform.WASM;
313
+ if (
314
+ this._platform === CompilerPlatform.LINUX ||
315
+ this._platform === CompilerPlatform.MACOS
316
+ ) {
317
+ fsExtra.chmodSync(downloadPath, 0o755);
318
+ } else if (
319
+ this._platform === CompilerPlatform.WINDOWS &&
320
+ downloadPath.endsWith(".zip")
321
+ ) {
322
+ // some window builds are zipped, some are not
323
+ const { default: AdmZip } = await import("adm-zip");
324
+
325
+ const solcFolder = path.join(this._compilersDir, build.version);
326
+ await fsExtra.ensureDir(solcFolder);
327
+
328
+ const zip = new AdmZip(downloadPath);
329
+ zip.extractAllTo(solcFolder);
306
330
  }
307
331
 
308
- switch (os.platform()) {
309
- case "win32":
310
- return CompilerPlatform.WINDOWS;
311
- case "linux":
312
- return CompilerPlatform.LINUX;
313
- case "darwin":
314
- return CompilerPlatform.MACOS;
315
- default:
316
- return CompilerPlatform.WASM;
332
+ log("Checking native solc binary");
333
+ const nativeSolcWorks = await this._checkNativeSolc(build);
334
+
335
+ if (nativeSolcWorks) {
336
+ return;
317
337
  }
318
- }
319
- }
320
338
 
321
- function getCompilerURL(platform: CompilerPlatform, filePath: string) {
322
- return `${COMPILER_FILES_DIR_URL_SOLC}${platform}/${filePath}`;
323
- }
339
+ await fsExtra.createFile(this._getCompilerDoesntWorkFile(build));
340
+ }
324
341
 
325
- function getCompilerListURL(platform: CompilerPlatform) {
326
- return getCompilerURL(platform, "list.json");
342
+ private _checkNativeSolc(build: CompilerBuild) {
343
+ const solcPath = this._getCompilerBinaryPathFromBuild(build);
344
+ return new Promise((resolve) => {
345
+ try {
346
+ const process = execFile(solcPath, ["--version"]);
347
+ process.on("exit", (code) => {
348
+ resolve(code === 0);
349
+ });
350
+ } catch {
351
+ resolve(false);
352
+ }
353
+ });
354
+ }
327
355
  }
@@ -1,12 +1,17 @@
1
- import { exec } from "child_process";
1
+ import { execFile } from "child_process";
2
2
  import * as fs from "fs";
3
+ import { CompilerInput, CompilerOutput } from "../../../types";
3
4
 
4
- export class Compiler {
5
+ export interface ICompiler {
6
+ compile(input: CompilerInput): Promise<CompilerOutput>;
7
+ }
8
+
9
+ export class Compiler implements ICompiler {
5
10
  private _loadedSolc?: any;
6
11
 
7
12
  constructor(private _pathToSolcJs: string) {}
8
13
 
9
- public async compile(input: any) {
14
+ public async compile(input: CompilerInput) {
10
15
  const solc = await this.getSolc();
11
16
 
12
17
  const jsonOutput = solc.compile(JSON.stringify(input));
@@ -52,13 +57,14 @@ export class Compiler {
52
57
  }
53
58
  }
54
59
 
55
- export class NativeCompiler {
60
+ export class NativeCompiler implements ICompiler {
56
61
  constructor(private _pathToSolc: string) {}
57
62
 
58
- public async compile(input: any) {
63
+ public async compile(input: CompilerInput) {
59
64
  const output: string = await new Promise((resolve, reject) => {
60
- const process = exec(
61
- `${this._pathToSolc} --standard-json`,
65
+ const process = execFile(
66
+ this._pathToSolc,
67
+ [`--standard-json`],
62
68
  {
63
69
  maxBuffer: 1024 * 1024 * 500,
64
70
  },
@@ -9,9 +9,11 @@ export class DependencyGraph implements taskTypes.DependencyGraph {
9
9
  ): Promise<DependencyGraph> {
10
10
  const graph = new DependencyGraph();
11
11
 
12
- for (const resolvedFile of resolvedFiles) {
13
- await graph._addDependenciesFrom(resolver, resolvedFile);
14
- }
12
+ await Promise.all(
13
+ resolvedFiles.map((resolvedFile) =>
14
+ graph._addDependenciesFrom(resolver, resolvedFile)
15
+ )
16
+ );
15
17
 
16
18
  return graph;
17
19
  }
@@ -167,11 +169,13 @@ export class DependencyGraph implements taskTypes.DependencyGraph {
167
169
  this._resolvedFiles.set(file.sourceName, file);
168
170
  this._dependenciesPerFile.set(file.sourceName, dependencies);
169
171
 
170
- for (const imp of file.content.imports) {
171
- const dependency = await resolver.resolveImport(file, imp);
172
- dependencies.add(dependency);
172
+ await Promise.all(
173
+ file.content.imports.map(async (imp) => {
174
+ const dependency = await resolver.resolveImport(file, imp);
175
+ dependencies.add(dependency);
173
176
 
174
- await this._addDependenciesFrom(resolver, dependency);
175
- }
177
+ await this._addDependenciesFrom(resolver, dependency);
178
+ })
179
+ );
176
180
  }
177
181
  }