hardhat 2.13.0-dev.2 → 2.13.0-dev.3

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 (292) hide show
  1. package/builtin-tasks/compile.js +16 -6
  2. package/builtin-tasks/compile.js.map +1 -1
  3. package/builtin-tasks/flatten.js +1 -1
  4. package/builtin-tasks/flatten.js.map +1 -1
  5. package/builtin-tasks/help.js +2 -4
  6. package/builtin-tasks/help.js.map +1 -1
  7. package/builtin-tasks/task-names.d.ts +1 -0
  8. package/builtin-tasks/task-names.d.ts.map +1 -1
  9. package/builtin-tasks/task-names.js +3 -2
  10. package/builtin-tasks/task-names.js.map +1 -1
  11. package/builtin-tasks/test.js +22 -1
  12. package/builtin-tasks/test.js.map +1 -1
  13. package/internal/cli/bootstrap.d.ts +1 -0
  14. package/internal/cli/bootstrap.js +12 -20
  15. package/internal/cli/bootstrap.js.map +1 -1
  16. package/internal/cli/cli.d.ts +0 -1
  17. package/internal/cli/cli.d.ts.map +1 -1
  18. package/internal/cli/cli.js +20 -29
  19. package/internal/cli/cli.js.map +1 -1
  20. package/internal/cli/project-creation.d.ts +1 -2
  21. package/internal/cli/project-creation.d.ts.map +1 -1
  22. package/internal/cli/project-creation.js +105 -36
  23. package/internal/cli/project-creation.js.map +1 -1
  24. package/internal/cli/prompt.d.ts +2 -2
  25. package/internal/cli/prompt.d.ts.map +1 -1
  26. package/internal/cli/prompt.js +1 -2
  27. package/internal/cli/prompt.js.map +1 -1
  28. package/internal/cli/types.d.ts +1 -0
  29. package/internal/cli/types.d.ts.map +1 -1
  30. package/internal/core/config/config-env.d.ts +5 -11
  31. package/internal/core/config/config-env.d.ts.map +1 -1
  32. package/internal/core/config/config-env.js +2 -13
  33. package/internal/core/config/config-env.js.map +1 -1
  34. package/internal/core/config/config-loading.d.ts +2 -1
  35. package/internal/core/config/config-loading.d.ts.map +1 -1
  36. package/internal/core/config/config-loading.js +25 -7
  37. package/internal/core/config/config-loading.js.map +1 -1
  38. package/internal/core/config/config-validation.d.ts +2 -0
  39. package/internal/core/config/config-validation.d.ts.map +1 -1
  40. package/internal/core/config/config-validation.js +18 -1
  41. package/internal/core/config/config-validation.js.map +1 -1
  42. package/internal/core/config/extenders.d.ts +4 -7
  43. package/internal/core/config/extenders.d.ts.map +1 -1
  44. package/internal/core/config/extenders.js +5 -12
  45. package/internal/core/config/extenders.js.map +1 -1
  46. package/internal/core/errors-list.d.ts +28 -7
  47. package/internal/core/errors-list.d.ts.map +1 -1
  48. package/internal/core/errors-list.js +33 -10
  49. package/internal/core/errors-list.js.map +1 -1
  50. package/internal/core/jsonrpc/types/input/blockTag.d.ts +3 -3
  51. package/internal/core/jsonrpc/types/input/blockTag.d.ts.map +1 -1
  52. package/internal/core/project-structure.d.ts.map +1 -1
  53. package/internal/core/project-structure.js +6 -0
  54. package/internal/core/project-structure.js.map +1 -1
  55. package/internal/core/providers/construction.d.ts.map +1 -1
  56. package/internal/core/providers/construction.js +25 -5
  57. package/internal/core/providers/construction.js.map +1 -1
  58. package/internal/core/providers/http.d.ts +2 -2
  59. package/internal/core/providers/http.d.ts.map +1 -1
  60. package/internal/core/providers/http.js +41 -19
  61. package/internal/core/providers/http.js.map +1 -1
  62. package/internal/core/runtime-environment.d.ts +4 -2
  63. package/internal/core/runtime-environment.d.ts.map +1 -1
  64. package/internal/core/runtime-environment.js +39 -47
  65. package/internal/core/runtime-environment.js.map +1 -1
  66. package/internal/core/tasks/dsl.d.ts +6 -6
  67. package/internal/core/tasks/dsl.d.ts.map +1 -1
  68. package/internal/core/tasks/dsl.js.map +1 -1
  69. package/internal/core/tasks/task-definitions.d.ts +2 -2
  70. package/internal/core/tasks/task-definitions.d.ts.map +1 -1
  71. package/internal/core/tasks/task-definitions.js.map +1 -1
  72. package/internal/hardhat-network/jsonrpc/handler.d.ts +1 -0
  73. package/internal/hardhat-network/jsonrpc/handler.d.ts.map +1 -1
  74. package/internal/hardhat-network/jsonrpc/handler.js +13 -18
  75. package/internal/hardhat-network/jsonrpc/handler.js.map +1 -1
  76. package/internal/hardhat-network/provider/RethnetState.d.ts +26 -0
  77. package/internal/hardhat-network/provider/RethnetState.d.ts.map +1 -0
  78. package/internal/hardhat-network/provider/RethnetState.js +84 -0
  79. package/internal/hardhat-network/provider/RethnetState.js.map +1 -0
  80. package/internal/hardhat-network/provider/modules/evm.d.ts +2 -1
  81. package/internal/hardhat-network/provider/modules/evm.d.ts.map +1 -1
  82. package/internal/hardhat-network/provider/modules/evm.js +10 -4
  83. package/internal/hardhat-network/provider/modules/evm.js.map +1 -1
  84. package/internal/hardhat-network/provider/node-types.d.ts +1 -1
  85. package/internal/hardhat-network/provider/node-types.d.ts.map +1 -1
  86. package/internal/hardhat-network/provider/node.d.ts +1 -0
  87. package/internal/hardhat-network/provider/node.d.ts.map +1 -1
  88. package/internal/hardhat-network/provider/node.js +6 -4
  89. package/internal/hardhat-network/provider/node.js.map +1 -1
  90. package/internal/hardhat-network/provider/provider.d.ts +25 -21
  91. package/internal/hardhat-network/provider/provider.d.ts.map +1 -1
  92. package/internal/hardhat-network/provider/provider.js +25 -42
  93. package/internal/hardhat-network/provider/provider.js.map +1 -1
  94. package/internal/hardhat-network/provider/return-data.js +2 -2
  95. package/internal/hardhat-network/provider/return-data.js.map +1 -1
  96. package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.d.ts.map +1 -1
  97. package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.js +4 -2
  98. package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.js.map +1 -1
  99. package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.d.ts.map +1 -1
  100. package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.js +4 -2
  101. package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.js.map +1 -1
  102. package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.d.ts.map +1 -1
  103. package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.js +4 -2
  104. package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.js.map +1 -1
  105. package/internal/hardhat-network/provider/utils/bloom.d.ts +32 -0
  106. package/internal/hardhat-network/provider/utils/bloom.d.ts.map +1 -0
  107. package/internal/hardhat-network/provider/utils/bloom.js +79 -0
  108. package/internal/hardhat-network/provider/utils/bloom.js.map +1 -0
  109. package/internal/hardhat-network/provider/utils/convertToRethnet.d.ts +12 -0
  110. package/internal/hardhat-network/provider/utils/convertToRethnet.d.ts.map +1 -0
  111. package/internal/hardhat-network/provider/utils/convertToRethnet.js +162 -0
  112. package/internal/hardhat-network/provider/utils/convertToRethnet.js.map +1 -0
  113. package/internal/hardhat-network/provider/utils/makeFakeSignature.d.ts +7 -0
  114. package/internal/hardhat-network/provider/utils/makeFakeSignature.d.ts.map +1 -0
  115. package/internal/hardhat-network/provider/utils/makeFakeSignature.js +31 -0
  116. package/internal/hardhat-network/provider/utils/makeFakeSignature.js.map +1 -0
  117. package/internal/hardhat-network/provider/utils/putGenesisBlock.d.ts +1 -1
  118. package/internal/hardhat-network/provider/utils/putGenesisBlock.d.ts.map +1 -1
  119. package/internal/hardhat-network/provider/utils/putGenesisBlock.js +2 -2
  120. package/internal/hardhat-network/provider/utils/putGenesisBlock.js.map +1 -1
  121. package/internal/hardhat-network/provider/vm/block-builder.d.ts +31 -0
  122. package/internal/hardhat-network/provider/vm/block-builder.d.ts.map +1 -0
  123. package/internal/hardhat-network/provider/vm/block-builder.js +151 -0
  124. package/internal/hardhat-network/provider/vm/block-builder.js.map +1 -0
  125. package/internal/hardhat-network/provider/vm/creation.d.ts +10 -0
  126. package/internal/hardhat-network/provider/vm/creation.d.ts.map +1 -0
  127. package/internal/hardhat-network/provider/vm/creation.js +29 -0
  128. package/internal/hardhat-network/provider/vm/creation.js.map +1 -0
  129. package/internal/hardhat-network/provider/vm/dual.d.ts +43 -0
  130. package/internal/hardhat-network/provider/vm/dual.d.ts.map +1 -0
  131. package/internal/hardhat-network/provider/vm/dual.js +488 -0
  132. package/internal/hardhat-network/provider/vm/dual.js.map +1 -0
  133. package/internal/hardhat-network/provider/vm/ethereumjs.d.ts +56 -0
  134. package/internal/hardhat-network/provider/vm/ethereumjs.d.ts.map +1 -0
  135. package/internal/hardhat-network/provider/vm/ethereumjs.js +416 -0
  136. package/internal/hardhat-network/provider/vm/ethereumjs.js.map +1 -0
  137. package/internal/hardhat-network/provider/vm/exit.d.ts +23 -0
  138. package/internal/hardhat-network/provider/vm/exit.d.ts.map +1 -0
  139. package/internal/hardhat-network/provider/vm/exit.js +130 -0
  140. package/internal/hardhat-network/provider/vm/exit.js.map +1 -0
  141. package/internal/hardhat-network/provider/vm/rethnet.d.ts +99 -0
  142. package/internal/hardhat-network/provider/vm/rethnet.d.ts.map +1 -0
  143. package/internal/hardhat-network/provider/vm/rethnet.js +284 -0
  144. package/internal/hardhat-network/provider/vm/rethnet.js.map +1 -0
  145. package/internal/hardhat-network/provider/vm/vm-adapter.d.ts +52 -0
  146. package/internal/hardhat-network/provider/vm/vm-adapter.d.ts.map +1 -0
  147. package/internal/hardhat-network/provider/vm/vm-adapter.js +3 -0
  148. package/internal/hardhat-network/provider/vm/vm-adapter.js.map +1 -0
  149. package/internal/hardhat-network/stack-traces/compiler-to-model.d.ts.map +1 -1
  150. package/internal/hardhat-network/stack-traces/compiler-to-model.js +37 -11
  151. package/internal/hardhat-network/stack-traces/compiler-to-model.js.map +1 -1
  152. package/internal/hardhat-network/stack-traces/consoleLogger.js.map +1 -1
  153. package/internal/hardhat-network/stack-traces/constants.d.ts +1 -1
  154. package/internal/hardhat-network/stack-traces/constants.js +1 -1
  155. package/internal/hardhat-network/stack-traces/debug.d.ts.map +1 -1
  156. package/internal/hardhat-network/stack-traces/debug.js +6 -2
  157. package/internal/hardhat-network/stack-traces/debug.js.map +1 -1
  158. package/internal/hardhat-network/stack-traces/error-inferrer.d.ts +1 -0
  159. package/internal/hardhat-network/stack-traces/error-inferrer.d.ts.map +1 -1
  160. package/internal/hardhat-network/stack-traces/error-inferrer.js +85 -55
  161. package/internal/hardhat-network/stack-traces/error-inferrer.js.map +1 -1
  162. package/internal/hardhat-network/stack-traces/model.d.ts +3 -1
  163. package/internal/hardhat-network/stack-traces/model.d.ts.map +1 -1
  164. package/internal/hardhat-network/stack-traces/model.js +9 -1
  165. package/internal/hardhat-network/stack-traces/model.js.map +1 -1
  166. package/internal/hardhat-network/stack-traces/solidity-errors.js +2 -2
  167. package/internal/hardhat-network/stack-traces/solidity-errors.js.map +1 -1
  168. package/internal/hardhat-network/stack-traces/solidity-stack-trace.d.ts +2 -2
  169. package/internal/hardhat-network/stack-traces/solidity-stack-trace.d.ts.map +1 -1
  170. package/internal/hardhat-network/stack-traces/solidityTracer.d.ts.map +1 -1
  171. package/internal/hardhat-network/stack-traces/solidityTracer.js +1 -0
  172. package/internal/hardhat-network/stack-traces/solidityTracer.js.map +1 -1
  173. package/internal/lib/hardhat-lib.d.ts.map +1 -1
  174. package/internal/lib/hardhat-lib.js +1 -4
  175. package/internal/lib/hardhat-lib.js.map +1 -1
  176. package/internal/solidity/compiler/downloader.js +2 -2
  177. package/internal/solidity/compiler/downloader.js.map +1 -1
  178. package/internal/solidity/compiler/index.js +1 -1
  179. package/internal/solidity/compiler/index.js.map +1 -1
  180. package/internal/solidity/resolver.d.ts +4 -3
  181. package/internal/solidity/resolver.d.ts.map +1 -1
  182. package/internal/solidity/resolver.js +18 -7
  183. package/internal/solidity/resolver.js.map +1 -1
  184. package/internal/util/abi-helpers.d.ts +1 -0
  185. package/internal/util/abi-helpers.d.ts.map +1 -1
  186. package/internal/util/abi-helpers.js +9 -0
  187. package/internal/util/abi-helpers.js.map +1 -1
  188. package/internal/util/download.d.ts.map +1 -1
  189. package/internal/util/download.js +12 -11
  190. package/internal/util/download.js.map +1 -1
  191. package/internal/util/packageInfo.d.ts +6 -1
  192. package/internal/util/packageInfo.d.ts.map +1 -1
  193. package/internal/util/packageInfo.js +14 -11
  194. package/internal/util/packageInfo.js.map +1 -1
  195. package/internal/util/proxy.d.ts +2 -0
  196. package/internal/util/proxy.d.ts.map +1 -0
  197. package/internal/util/proxy.js +19 -0
  198. package/internal/util/proxy.js.map +1 -0
  199. package/package.json +9 -10
  200. package/register.js +1 -4
  201. package/register.js.map +1 -1
  202. package/sample-projects/javascript/hardhat.config.js +1 -1
  203. package/sample-projects/javascript/scripts/deploy.js +2 -2
  204. package/sample-projects/javascript-esm/LICENSE.md +11 -0
  205. package/sample-projects/javascript-esm/README.md +13 -0
  206. package/sample-projects/javascript-esm/contracts/Lock.sol +34 -0
  207. package/sample-projects/javascript-esm/hardhat.config.cjs +6 -0
  208. package/sample-projects/javascript-esm/scripts/deploy.js +22 -0
  209. package/sample-projects/javascript-esm/test/Lock.js +123 -0
  210. package/sample-projects/typescript/hardhat.config.ts +1 -1
  211. package/sample-projects/typescript/scripts/deploy.ts +2 -2
  212. package/sample-projects/typescript/tsconfig.json +2 -1
  213. package/src/builtin-tasks/compile.ts +28 -7
  214. package/src/builtin-tasks/flatten.ts +4 -1
  215. package/src/builtin-tasks/help.ts +15 -16
  216. package/src/builtin-tasks/task-names.ts +2 -0
  217. package/src/builtin-tasks/test.ts +30 -2
  218. package/src/internal/artifacts.ts +947 -0
  219. package/src/internal/cli/bootstrap.ts +14 -36
  220. package/src/internal/cli/cli.ts +38 -43
  221. package/src/internal/cli/project-creation.ts +128 -47
  222. package/src/internal/cli/prompt.ts +2 -4
  223. package/src/internal/cli/types.ts +2 -0
  224. package/src/internal/core/config/config-env.ts +15 -27
  225. package/src/internal/core/config/config-loading.ts +35 -11
  226. package/src/internal/core/config/config-validation.ts +20 -0
  227. package/src/internal/core/config/extenders.ts +6 -15
  228. package/src/internal/core/errors-list.ts +36 -10
  229. package/src/internal/core/project-structure.ts +8 -0
  230. package/src/internal/core/providers/construction.ts +29 -24
  231. package/src/internal/core/providers/http.ts +38 -26
  232. package/src/internal/core/runtime-environment.ts +65 -60
  233. package/src/internal/core/tasks/dsl.ts +17 -17
  234. package/src/internal/core/tasks/task-definitions.ts +6 -2
  235. package/src/internal/hardhat-network/jsonrpc/handler.ts +31 -28
  236. package/src/internal/hardhat-network/provider/modules/evm.ts +15 -3
  237. package/src/internal/hardhat-network/provider/node-types.ts +1 -1
  238. package/src/internal/hardhat-network/provider/node.ts +5 -1
  239. package/src/internal/hardhat-network/provider/provider.ts +60 -49
  240. package/src/internal/hardhat-network/provider/return-data.ts +2 -2
  241. package/src/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.ts +5 -2
  242. package/src/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.ts +5 -2
  243. package/src/internal/hardhat-network/provider/transactions/FakeSenderTransaction.ts +5 -2
  244. package/src/internal/hardhat-network/provider/utils/makeFakeSignature.ts +46 -0
  245. package/src/internal/hardhat-network/provider/utils/putGenesisBlock.ts +2 -2
  246. package/src/internal/hardhat-network/stack-traces/compiler-to-model.ts +71 -9
  247. package/src/internal/hardhat-network/stack-traces/consoleLogger.ts +1 -1
  248. package/src/internal/hardhat-network/stack-traces/constants.ts +1 -1
  249. package/src/internal/hardhat-network/stack-traces/debug.ts +9 -2
  250. package/src/internal/hardhat-network/stack-traces/error-inferrer.ts +177 -89
  251. package/src/internal/hardhat-network/stack-traces/model.ts +11 -1
  252. package/src/internal/hardhat-network/stack-traces/solidity-errors.ts +2 -2
  253. package/src/internal/hardhat-network/stack-traces/solidity-stack-trace.ts +2 -2
  254. package/src/internal/hardhat-network/stack-traces/solidityTracer.ts +3 -0
  255. package/src/internal/lib/hardhat-lib.ts +1 -6
  256. package/src/internal/solidity/compiler/downloader.ts +2 -2
  257. package/src/internal/solidity/compiler/index.ts +1 -1
  258. package/src/internal/solidity/resolver.ts +28 -11
  259. package/src/internal/util/abi-helpers.ts +9 -0
  260. package/src/internal/util/download.ts +13 -15
  261. package/src/internal/util/packageInfo.ts +24 -10
  262. package/src/internal/util/proxy.ts +18 -0
  263. package/src/register.ts +1 -6
  264. package/src/types/artifacts.ts +14 -112
  265. package/src/types/config.ts +2 -0
  266. package/src/types/runtime.ts +16 -13
  267. package/types/artifacts.d.ts +10 -96
  268. package/types/artifacts.d.ts.map +1 -1
  269. package/types/config.d.ts +2 -0
  270. package/types/config.d.ts.map +1 -1
  271. package/types/runtime.d.ts +9 -10
  272. package/types/runtime.d.ts.map +1 -1
  273. package/internal/artifacts/caching.d.ts +0 -28
  274. package/internal/artifacts/caching.d.ts.map +0 -1
  275. package/internal/artifacts/caching.js +0 -178
  276. package/internal/artifacts/caching.js.map +0 -1
  277. package/internal/artifacts/index.d.ts +0 -45
  278. package/internal/artifacts/index.d.ts.map +0 -1
  279. package/internal/artifacts/index.js +0 -191
  280. package/internal/artifacts/index.js.map +0 -1
  281. package/internal/artifacts/mutable.d.ts +0 -29
  282. package/internal/artifacts/mutable.d.ts.map +0 -1
  283. package/internal/artifacts/mutable.js +0 -226
  284. package/internal/artifacts/mutable.js.map +0 -1
  285. package/internal/artifacts/readonly.d.ts +0 -94
  286. package/internal/artifacts/readonly.d.ts.map +0 -1
  287. package/internal/artifacts/readonly.js +0 -343
  288. package/internal/artifacts/readonly.js.map +0 -1
  289. package/src/internal/artifacts/caching.ts +0 -259
  290. package/src/internal/artifacts/index.ts +0 -302
  291. package/src/internal/artifacts/mutable.ts +0 -330
  292. package/src/internal/artifacts/readonly.ts +0 -470
@@ -1,302 +0,0 @@
1
- import * as os from "os";
2
- import path from "path";
3
-
4
- import {
5
- Artifact,
6
- Artifacts as IArtifacts,
7
- ArtifactsSource,
8
- BuildInfo,
9
- CompilerInput,
10
- CompilerOutput,
11
- } from "../../types";
12
- import { parseFullyQualifiedName } from "../../utils/contract-names";
13
-
14
- import { ARTIFACT_FORMAT_VERSION } from "../constants";
15
- import { HardhatError } from "../core/errors";
16
- import { ERRORS } from "../core/errors-list";
17
-
18
- import { CachingSource } from "./caching";
19
-
20
- export class Artifacts implements IArtifacts {
21
- private readonly _hardhatSource: CachingSource;
22
-
23
- constructor(
24
- private readonly _artifactsPath: string,
25
- private readonly _extensionSources: ArtifactsSource[] = []
26
- ) {
27
- this._hardhatSource = new CachingSource(this._artifactsPath);
28
- }
29
-
30
- public async readArtifact(
31
- contractNameOrFullyQualifiedName: string
32
- ): Promise<Artifact> {
33
- let artifact: Artifact | undefined = await this._hardhatSource.readArtifact(
34
- contractNameOrFullyQualifiedName
35
- );
36
-
37
- if (artifact === undefined) {
38
- const artifacts: Array<Artifact | undefined> = await Promise.all(
39
- this._extensionSources.map((source) =>
40
- source.readArtifact(contractNameOrFullyQualifiedName)
41
- )
42
- );
43
-
44
- artifact = artifacts.find((_artifact) => _artifact !== undefined);
45
- }
46
-
47
- if (artifact === undefined) {
48
- this._throwNotFound(contractNameOrFullyQualifiedName);
49
- }
50
-
51
- return artifact;
52
- }
53
-
54
- public readArtifactSync(contractNameOrFullyQualifiedName: string): Artifact {
55
- let artifact: Artifact | undefined = this._hardhatSource.readArtifactSync(
56
- contractNameOrFullyQualifiedName
57
- );
58
-
59
- if (artifact === undefined) {
60
- for (const source of this._extensionSources) {
61
- artifact = source.readArtifactSync(contractNameOrFullyQualifiedName);
62
- if (artifact !== undefined) {
63
- break;
64
- }
65
- }
66
- }
67
-
68
- if (artifact === undefined) {
69
- this._throwNotFound(contractNameOrFullyQualifiedName);
70
- }
71
-
72
- return artifact;
73
- }
74
-
75
- public async artifactExists(
76
- contractNameOrFullyQualifiedName: string
77
- ): Promise<boolean> {
78
- const existencesPerSource = await Promise.all(
79
- [this._hardhatSource, ...this._extensionSources].map((source) =>
80
- source.artifactExists(contractNameOrFullyQualifiedName)
81
- )
82
- );
83
- return existencesPerSource.includes(true);
84
- }
85
-
86
- public async getAllFullyQualifiedNames(): Promise<string[]> {
87
- return (
88
- await Promise.all(
89
- [this._hardhatSource, ...this._extensionSources].map((s) =>
90
- s.getAllFullyQualifiedNames()
91
- )
92
- )
93
- ).flat();
94
- }
95
-
96
- public async getBuildInfo(
97
- fullyQualifiedName: string
98
- ): Promise<BuildInfo | undefined> {
99
- let buildInfo = await this._hardhatSource.getBuildInfo(fullyQualifiedName);
100
-
101
- if (buildInfo === undefined) {
102
- const buildInfos: Array<BuildInfo | undefined> = await Promise.all(
103
- this._extensionSources.map((source) =>
104
- source.getBuildInfo(fullyQualifiedName)
105
- )
106
- );
107
- buildInfo = buildInfos.find((info) => info !== undefined);
108
- }
109
-
110
- return buildInfo;
111
- }
112
-
113
- public getBuildInfoSync(fullyQualifiedName: string): BuildInfo | undefined {
114
- let buildInfo = this._hardhatSource.getBuildInfoSync(fullyQualifiedName);
115
-
116
- if (buildInfo === undefined) {
117
- const buildInfos: Array<BuildInfo | undefined> =
118
- this._extensionSources.map((source) =>
119
- source.getBuildInfoSync(fullyQualifiedName)
120
- );
121
-
122
- buildInfo = buildInfos.find((info) => info !== undefined);
123
- }
124
-
125
- return buildInfo;
126
- }
127
-
128
- public async getArtifactPaths(): Promise<string[]> {
129
- return (
130
- await Promise.all(
131
- [this._hardhatSource, ...this._extensionSources].map((s) =>
132
- s.getArtifactPaths()
133
- )
134
- )
135
- ).flat();
136
- }
137
-
138
- public async getDebugFilePaths(): Promise<string[]> {
139
- return (
140
- await Promise.all(
141
- [this._hardhatSource, ...this._extensionSources].map((s) =>
142
- s.getDebugFilePaths()
143
- )
144
- )
145
- ).flat();
146
- }
147
-
148
- public async getBuildInfoPaths(): Promise<string[]> {
149
- return (
150
- await Promise.all(
151
- [this._hardhatSource, ...this._extensionSources].map((s) =>
152
- s.getBuildInfoPaths()
153
- )
154
- )
155
- ).flat();
156
- }
157
-
158
- public clearCache(): void {
159
- for (const source of [this._hardhatSource, ...this._extensionSources]) {
160
- source.clearCache();
161
- }
162
- }
163
-
164
- public disableCache(): void {
165
- for (const source of [this._hardhatSource, ...this._extensionSources]) {
166
- source.disableCache();
167
- }
168
- }
169
-
170
- public saveArtifactAndDebugFile(
171
- artifact: Artifact,
172
- pathToBuildInfo?: string
173
- ): Promise<void> {
174
- return this._hardhatSource.saveArtifactAndDebugFile(
175
- artifact,
176
- pathToBuildInfo
177
- );
178
- }
179
-
180
- public saveBuildInfo(
181
- solcVersion: string,
182
- solcLongVersion: string,
183
- input: CompilerInput,
184
- output: CompilerOutput
185
- ): Promise<string> {
186
- return this._hardhatSource.saveBuildInfo(
187
- solcVersion,
188
- solcLongVersion,
189
- input,
190
- output
191
- );
192
- }
193
-
194
- public formArtifactPathFromFullyQualifiedName(
195
- fullyQualifiedName: string
196
- ): string {
197
- return this._hardhatSource.formArtifactPathFromFullyQualifiedName(
198
- fullyQualifiedName
199
- );
200
- }
201
-
202
- public addValidArtifacts(
203
- validArtifacts: Array<{ sourceName: string; artifacts: string[] }>
204
- ) {
205
- this._hardhatSource.addValidArtifacts(validArtifacts);
206
- }
207
-
208
- public async removeObsoleteArtifacts() {
209
- return this._hardhatSource.removeObsoleteArtifacts();
210
- }
211
-
212
- private _throwNotFound(contractNameOrFullyQualifiedName: string): never {
213
- const suggestions = this._hardhatSource.getSuggestions(
214
- contractNameOrFullyQualifiedName
215
- );
216
-
217
- const uniqueSuggestions = [...new Set(suggestions)].sort();
218
-
219
- const suggestion = this._formatSuggestions(
220
- uniqueSuggestions,
221
- contractNameOrFullyQualifiedName
222
- );
223
-
224
- throw new HardhatError(ERRORS.ARTIFACTS.NOT_FOUND, {
225
- contractName: contractNameOrFullyQualifiedName,
226
- suggestion,
227
- });
228
- }
229
-
230
- private _formatSuggestions(names: string[], contractName: string): string {
231
- switch (names.length) {
232
- case 0:
233
- return "";
234
- case 1:
235
- return `Did you mean "${names[0]}"?`;
236
- default:
237
- return `We found some that were similar:
238
-
239
- ${names.map((n) => ` * ${n}`).join(os.EOL)}
240
-
241
- Please replace "${contractName}" for the correct contract name wherever you are trying to read its artifact.
242
- `;
243
- }
244
- }
245
-
246
- /**
247
- * DO NOT DELETE OR CHANGE
248
- *
249
- * use this.formArtifactPathFromFullyQualifiedName instead
250
- * @deprecated until typechain migrates to public version
251
- * @see https://github.com/dethcrypto/TypeChain/issues/544
252
- */
253
- private _getArtifactPathFromFullyQualifiedName(
254
- fullyQualifiedName: string
255
- ): string {
256
- const { sourceName, contractName } =
257
- parseFullyQualifiedName(fullyQualifiedName);
258
-
259
- return path.join(this._artifactsPath, sourceName, `${contractName}.json`);
260
- }
261
- }
262
-
263
- /**
264
- * Retrieves an artifact for the given `contractName` from the compilation output.
265
- *
266
- * @param sourceName The contract's source name.
267
- * @param contractName the contract's name.
268
- * @param contractOutput the contract's compilation output as emitted by `solc`.
269
- */
270
- export function getArtifactFromContractOutput(
271
- sourceName: string,
272
- contractName: string,
273
- contractOutput: any
274
- ): Artifact {
275
- const evmBytecode = contractOutput.evm?.bytecode;
276
- let bytecode: string = evmBytecode?.object ?? "";
277
-
278
- if (bytecode.slice(0, 2).toLowerCase() !== "0x") {
279
- bytecode = `0x${bytecode}`;
280
- }
281
-
282
- const evmDeployedBytecode = contractOutput.evm?.deployedBytecode;
283
- let deployedBytecode: string = evmDeployedBytecode?.object ?? "";
284
-
285
- if (deployedBytecode.slice(0, 2).toLowerCase() !== "0x") {
286
- deployedBytecode = `0x${deployedBytecode}`;
287
- }
288
-
289
- const linkReferences = evmBytecode?.linkReferences ?? {};
290
- const deployedLinkReferences = evmDeployedBytecode?.linkReferences ?? {};
291
-
292
- return {
293
- _format: ARTIFACT_FORMAT_VERSION,
294
- contractName,
295
- sourceName,
296
- abi: contractOutput.abi,
297
- bytecode,
298
- deployedBytecode,
299
- linkReferences,
300
- deployedLinkReferences,
301
- };
302
- }
@@ -1,330 +0,0 @@
1
- import debug from "debug";
2
- import * as path from "path";
3
- import fsPromises from "fs/promises";
4
-
5
- import fsExtra from "fs-extra";
6
-
7
- import { getFullyQualifiedName } from "../../utils/contract-names";
8
- import { createNonCryptographicHashBasedIdentifier } from "../util/hash";
9
- import {
10
- Artifact,
11
- BuildInfo,
12
- CompilerInput,
13
- CompilerOutput,
14
- DebugFile,
15
- } from "../../types";
16
- import {
17
- BUILD_INFO_DIR_NAME,
18
- BUILD_INFO_FORMAT_VERSION,
19
- DEBUG_FILE_FORMAT_VERSION,
20
- } from "../constants";
21
- import { ReadOnlySource } from "./readonly";
22
-
23
- const log = debug("hardhat:core:artifacts");
24
-
25
- export class MutableSource extends ReadOnlySource {
26
- private _validArtifacts: Array<{ sourceName: string; artifacts: string[] }>;
27
-
28
- constructor(artifactsPath: string) {
29
- super(artifactsPath);
30
- this._validArtifacts = [];
31
- }
32
-
33
- public addValidArtifacts(
34
- validArtifacts: Array<{ sourceName: string; artifacts: string[] }>
35
- ) {
36
- this._validArtifacts.push(...validArtifacts);
37
- }
38
-
39
- /**
40
- * Remove all artifacts that don't correspond to the current solidity files
41
- */
42
- public async removeObsoleteArtifacts() {
43
- const validArtifactPaths = await Promise.all(
44
- this._validArtifacts.flatMap(({ sourceName, artifacts }) =>
45
- artifacts.map((artifactName) =>
46
- this._getArtifactPath(getFullyQualifiedName(sourceName, artifactName))
47
- )
48
- )
49
- );
50
-
51
- const validArtifactPathsWithoutUndefined = validArtifactPaths.filter(
52
- (artifactPath): artifactPath is string => artifactPath !== undefined
53
- );
54
-
55
- const validArtifactsPathsSet = new Set<string>(
56
- validArtifactPathsWithoutUndefined
57
- );
58
-
59
- for (const { sourceName, artifacts } of this._validArtifacts) {
60
- for (const artifactName of artifacts) {
61
- validArtifactsPathsSet.add(
62
- this.formArtifactPathFromFullyQualifiedName(
63
- getFullyQualifiedName(sourceName, artifactName)
64
- )
65
- );
66
- }
67
- }
68
-
69
- const existingArtifactsPaths = await this.getArtifactPaths();
70
-
71
- await Promise.all(
72
- existingArtifactsPaths
73
- .filter((artifactPath) => !validArtifactsPathsSet.has(artifactPath))
74
- .map((artifactPath) => this._removeArtifactFiles(artifactPath))
75
- );
76
-
77
- await this._removeObsoleteBuildInfos();
78
- }
79
-
80
- public async saveArtifactAndDebugFile(
81
- artifact: Artifact,
82
- pathToBuildInfo?: string
83
- ) {
84
- // artifact
85
- const fullyQualifiedName = getFullyQualifiedName(
86
- artifact.sourceName,
87
- artifact.contractName
88
- );
89
-
90
- const artifactPath =
91
- this.formArtifactPathFromFullyQualifiedName(fullyQualifiedName);
92
-
93
- await fsExtra.ensureDir(path.dirname(artifactPath));
94
-
95
- await Promise.all([
96
- fsExtra.writeJSON(artifactPath, artifact, {
97
- spaces: 2,
98
- }),
99
- (async () => {
100
- if (pathToBuildInfo === undefined) {
101
- return;
102
- }
103
-
104
- // save debug file
105
- const debugFilePath = this._getDebugFilePath(artifactPath);
106
- const debugFile = this._createDebugFile(artifactPath, pathToBuildInfo);
107
-
108
- await fsExtra.writeJSON(debugFilePath, debugFile, {
109
- spaces: 2,
110
- });
111
- })(),
112
- ]);
113
- }
114
-
115
- public async saveBuildInfo(
116
- solcVersion: string,
117
- solcLongVersion: string,
118
- input: CompilerInput,
119
- output: CompilerOutput
120
- ): Promise<string> {
121
- const buildInfoDir = path.join(this._artifactsPath, BUILD_INFO_DIR_NAME);
122
- await fsExtra.ensureDir(buildInfoDir);
123
-
124
- const buildInfoName = MutableSource._getBuildInfoName(
125
- solcVersion,
126
- solcLongVersion,
127
- input
128
- );
129
-
130
- const buildInfo = MutableSource._createBuildInfo(
131
- buildInfoName,
132
- solcVersion,
133
- solcLongVersion,
134
- input,
135
- output
136
- );
137
-
138
- const buildInfoPath = path.join(buildInfoDir, `${buildInfoName}.json`);
139
-
140
- // JSON.stringify of the entire build info can be really slow
141
- // in larger projects, so we stringify per part and incrementally create
142
- // the JSON in the file.
143
- //
144
- // We split this code into different curly-brace-enclosed scopes so that
145
- // partial JSON strings get out of scope sooner and hence can be reclaimed
146
- // by the GC if needed.
147
- const file = await fsPromises.open(buildInfoPath, "w");
148
- try {
149
- {
150
- const withoutOutput = JSON.stringify({
151
- ...buildInfo,
152
- output: undefined,
153
- });
154
-
155
- // We write the JSON (without output) except the last }
156
- await file.write(withoutOutput.slice(0, -1));
157
- }
158
-
159
- {
160
- const outputWithoutSourcesAndContracts = JSON.stringify({
161
- ...buildInfo.output,
162
- sources: undefined,
163
- contracts: undefined,
164
- });
165
-
166
- // We start writing the output
167
- await file.write(',"output":');
168
-
169
- // Write the output object except for the last }
170
- await file.write(outputWithoutSourcesAndContracts.slice(0, -1));
171
-
172
- // If there were other field apart from sources and contracts we need
173
- // a comma
174
- if (outputWithoutSourcesAndContracts.length > 2) {
175
- await file.write(",");
176
- }
177
- }
178
-
179
- // Writing the sources
180
- await file.write('"sources":{');
181
-
182
- let isFirst = true;
183
- for (const [name, value] of Object.entries(
184
- buildInfo.output.sources ?? {}
185
- )) {
186
- if (isFirst) {
187
- isFirst = false;
188
- } else {
189
- await file.write(",");
190
- }
191
-
192
- await file.write(`${JSON.stringify(name)}:${JSON.stringify(value)}`);
193
- }
194
-
195
- // Close sources object
196
- await file.write("}");
197
-
198
- // Writing the contracts
199
- await file.write(',"contracts":{');
200
-
201
- isFirst = true;
202
- for (const [name, value] of Object.entries(
203
- buildInfo.output.contracts ?? {}
204
- )) {
205
- if (isFirst) {
206
- isFirst = false;
207
- } else {
208
- await file.write(",");
209
- }
210
-
211
- await file.write(`${JSON.stringify(name)}:${JSON.stringify(value)}`);
212
- }
213
-
214
- // close contracts object
215
- await file.write("}");
216
- // close output object
217
- await file.write("}");
218
- // close build info object
219
- await file.write("}");
220
- } finally {
221
- await file.close();
222
- }
223
-
224
- return buildInfoPath;
225
- }
226
-
227
- private static _createBuildInfo(
228
- id: string,
229
- solcVersion: string,
230
- solcLongVersion: string,
231
- input: CompilerInput,
232
- output: CompilerOutput
233
- ): BuildInfo {
234
- return {
235
- id,
236
- _format: BUILD_INFO_FORMAT_VERSION,
237
- solcVersion,
238
- solcLongVersion,
239
- input,
240
- output,
241
- };
242
- }
243
-
244
- private _createDebugFile(artifactPath: string, pathToBuildInfo: string) {
245
- const relativePathToBuildInfo = path.relative(
246
- path.dirname(artifactPath),
247
- pathToBuildInfo
248
- );
249
-
250
- const debugFile: DebugFile = {
251
- _format: DEBUG_FILE_FORMAT_VERSION,
252
- buildInfo: relativePathToBuildInfo,
253
- };
254
-
255
- return debugFile;
256
- }
257
-
258
- private static _getBuildInfoName(
259
- solcVersion: string,
260
- solcLongVersion: string,
261
- input: CompilerInput
262
- ): string {
263
- const json = JSON.stringify({
264
- _format: BUILD_INFO_FORMAT_VERSION,
265
- solcVersion,
266
- solcLongVersion,
267
- input,
268
- });
269
-
270
- return createNonCryptographicHashBasedIdentifier(
271
- Buffer.from(json)
272
- ).toString("hex");
273
- }
274
-
275
- /**
276
- * Remove the artifact file, its debug file and, if it exists, its build
277
- * info file.
278
- */
279
- private async _removeArtifactFiles(artifactPath: string) {
280
- await fsExtra.remove(artifactPath);
281
-
282
- const debugFilePath = this._getDebugFilePath(artifactPath);
283
- const buildInfoPath = await ReadOnlySource._getBuildInfoFromDebugFile(
284
- debugFilePath
285
- );
286
-
287
- await fsExtra.remove(debugFilePath);
288
-
289
- if (buildInfoPath !== undefined) {
290
- await fsExtra.remove(buildInfoPath);
291
- }
292
- }
293
-
294
- /**
295
- * Remove all build infos that aren't used by any debug file
296
- */
297
- private async _removeObsoleteBuildInfos() {
298
- const debugFiles = await this.getDebugFilePaths();
299
-
300
- const buildInfos = await Promise.all(
301
- debugFiles.map(async (debugFile) => {
302
- const buildInfoFile = await ReadOnlySource._getBuildInfoFromDebugFile(
303
- debugFile
304
- );
305
- if (buildInfoFile !== undefined) {
306
- return path.resolve(path.dirname(debugFile), buildInfoFile);
307
- } else {
308
- return undefined;
309
- }
310
- })
311
- );
312
-
313
- const filteredBuildInfos: string[] = buildInfos.filter(
314
- (bf): bf is string => typeof bf === "string"
315
- );
316
-
317
- const validBuildInfos = new Set<string>(filteredBuildInfos);
318
-
319
- const buildInfoFiles = await this.getBuildInfoPaths();
320
-
321
- await Promise.all(
322
- buildInfoFiles
323
- .filter((buildInfoFile) => !validBuildInfos.has(buildInfoFile))
324
- .map(async (buildInfoFile) => {
325
- log(`Removing buildInfo '${buildInfoFile}'`);
326
- await fsExtra.unlink(buildInfoFile);
327
- })
328
- );
329
- }
330
- }