@nomicfoundation/hardhat-viem 3.0.0-next.24 → 3.0.0-next.26

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.
@@ -2,7 +2,7 @@ import type { TestClientMode } from "../types.js";
2
2
  import type { ChainType } from "hardhat/types/network";
3
3
  import type { EthereumProvider } from "hardhat/types/providers";
4
4
  import type { Chain as ViemChain } from "viem";
5
- export declare function getChain(provider: EthereumProvider, chainType: ChainType | string): Promise<ViemChain>;
5
+ export declare function getChain<ChainTypeT extends ChainType | string>(provider: EthereumProvider, chainType: ChainTypeT): Promise<ViemChain>;
6
6
  export declare function getChainId(provider: EthereumProvider): Promise<number>;
7
7
  export declare function isDevelopmentNetwork(provider: EthereumProvider): Promise<boolean>;
8
8
  export declare function isHardhatNetwork(provider: EthereumProvider): Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"chains.d.ts","sourceRoot":"","sources":["../../../src/internal/chains.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAsB/C,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,SAAS,GAAG,MAAM,GAC5B,OAAO,CAAC,SAAS,CAAC,CAsDpB;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAU5E;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,OAAO,CAAC,CAUlB;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,OAAO,CAAC,CAUlB;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,OAAO,CAAC,CAUlB;AAED,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,cAAc,CAAC,CAUzB"}
1
+ {"version":3,"file":"chains.d.ts","sourceRoot":"","sources":["../../../src/internal/chains.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAuB/C,wBAAsB,QAAQ,CAAC,UAAU,SAAS,SAAS,GAAG,MAAM,EAClE,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,UAAU,GACpB,OAAO,CAAC,SAAS,CAAC,CAyCpB;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAU5E;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,OAAO,CAAC,CAUlB;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,OAAO,CAAC,CAsBlB;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,OAAO,CAAC,CAUlB;AAED,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,cAAc,CAAC,CAUzB"}
@@ -1,4 +1,5 @@
1
1
  import { assertHardhatInvariant, HardhatError, } from "@nomicfoundation/hardhat-errors";
2
+ import { isObject } from "@nomicfoundation/hardhat-utils/lang";
2
3
  import { extractChain } from "viem";
3
4
  import * as chainsModule from "viem/chains";
4
5
  import { hardhat, anvil, optimism } from "viem/chains";
@@ -7,7 +8,7 @@ import { hardhat, anvil, optimism } from "viem/chains";
7
8
  const chains = Object.values(chainsModule);
8
9
  const chainCache = new WeakMap();
9
10
  const chainIdCache = new WeakMap();
10
- const isHardhatNetworkCache = new WeakMap();
11
+ const hardhatMetadataCache = new WeakMap();
11
12
  const isAnvilNetworkCache = new WeakMap();
12
13
  const HARDHAT_METADATA_METHOD = "hardhat_metadata";
13
14
  const ANVIL_NODE_INFO_METHOD = "anvil_nodeInfo";
@@ -23,21 +24,7 @@ export async function getChain(provider, chainType) {
23
24
  });
24
25
  if ((await isDevelopmentNetwork(provider)) || chain === undefined) {
25
26
  if (await isHardhatNetwork(provider)) {
26
- // TODO: We should improve how we handle the chains for the different chain
27
- // types, as this is both a hardhat and an optimism chain.
28
- //
29
- // We are currently creating our chain based off optimism's, but that's
30
- // not always the correct behavior, as the user may be connecting to
31
- // a different chain.
32
- if (chainType === "optimism") {
33
- chain = { ...optimism, id: chainId };
34
- }
35
- else {
36
- chain = {
37
- ...hardhat,
38
- id: chainId,
39
- };
40
- }
27
+ chain = createHardhatChain(provider, chainId, chainType);
41
28
  }
42
29
  else if (await isAnvilNetwork(provider)) {
43
30
  chain = {
@@ -78,13 +65,22 @@ export async function isDevelopmentNetwork(provider) {
78
65
  return false;
79
66
  }
80
67
  export async function isHardhatNetwork(provider) {
81
- const cachedIsHardhat = isHardhatNetworkCache.get(provider);
82
- if (cachedIsHardhat !== undefined) {
83
- return cachedIsHardhat;
68
+ const cachedHardhatMetadata = hardhatMetadataCache.get(provider);
69
+ if (cachedHardhatMetadata !== undefined) {
70
+ return true;
71
+ }
72
+ try {
73
+ const hardhatMetadata = await provider.request({
74
+ method: HARDHAT_METADATA_METHOD,
75
+ });
76
+ assertHardhatInvariant(isHardhatMetadata(hardhatMetadata), "Expected valid hardhat metadata response");
77
+ hardhatMetadataCache.set(provider, hardhatMetadata);
78
+ return true;
79
+ }
80
+ catch {
81
+ hardhatMetadataCache.delete(provider);
82
+ return false;
84
83
  }
85
- const isHardhat = await isMethodSupported(provider, HARDHAT_METADATA_METHOD);
86
- isHardhatNetworkCache.set(provider, isHardhat);
87
- return isHardhat;
88
84
  }
89
85
  export async function isAnvilNetwork(provider) {
90
86
  const cachedIsAnvil = isAnvilNetworkCache.get(provider);
@@ -113,4 +109,38 @@ async function isMethodSupported(provider, method) {
113
109
  return false;
114
110
  }
115
111
  }
112
+ function createHardhatChain(provider, chainId, chainType) {
113
+ const hardhatMetadata = hardhatMetadataCache.get(provider);
114
+ assertHardhatInvariant(hardhatMetadata !== undefined, "Expected hardhat metadata to be available");
115
+ if (hardhatMetadata.forkedNetwork?.chainId !== undefined) {
116
+ const forkedChain = extractChain({
117
+ chains,
118
+ id: hardhatMetadata.forkedNetwork.chainId,
119
+ });
120
+ if (forkedChain !== undefined) {
121
+ return {
122
+ ...forkedChain,
123
+ ...hardhat,
124
+ id: chainId,
125
+ };
126
+ }
127
+ }
128
+ const chain = {
129
+ ...hardhat,
130
+ id: chainId,
131
+ };
132
+ if (chainType === "optimism") {
133
+ // we add the optimism contracts to enable viem's L2 actions
134
+ chain.contracts = {
135
+ ...optimism.contracts,
136
+ };
137
+ }
138
+ return chain;
139
+ }
140
+ function isHardhatMetadata(value) {
141
+ return (isObject(value) &&
142
+ (value.forkedNetwork === undefined ||
143
+ (isObject(value.forkedNetwork) &&
144
+ typeof value.forkedNetwork.chainId === "number")));
145
+ }
116
146
  //# sourceMappingURL=chains.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chains.js","sourceRoot":"","sources":["../../../src/internal/chains.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chains.js","sourceRoot":"","sources":["../../../src/internal/chains.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nomicfoundation/hardhat-viem",
3
- "version": "3.0.0-next.24",
3
+ "version": "3.0.0-next.26",
4
4
  "description": "Hardhat plugin for viem",
5
5
  "homepage": "https://github.com/nomicfoundation/hardhat/tree/v-next/v-next/hardhat-viem",
6
6
  "repository": {
@@ -31,7 +31,7 @@
31
31
  "README.md"
32
32
  ],
33
33
  "devDependencies": {
34
- "@nomicfoundation/hardhat-node-test-reporter": "^3.0.0-next.24",
34
+ "@nomicfoundation/hardhat-node-test-reporter": "^3.0.0-next.26",
35
35
  "@types/node": "^20.14.9",
36
36
  "c8": "^9.1.0",
37
37
  "eslint": "9.25.1",
@@ -41,14 +41,14 @@
41
41
  "tsx": "^4.19.3",
42
42
  "typescript": "~5.8.0",
43
43
  "viem": "^2.30.0",
44
- "@nomicfoundation/hardhat-test-utils": "^3.0.0-next.24"
44
+ "@nomicfoundation/hardhat-test-utils": "^3.0.0-next.26"
45
45
  },
46
46
  "dependencies": {
47
- "@nomicfoundation/hardhat-errors": "^3.0.0-next.24",
48
- "@nomicfoundation/hardhat-utils": "^3.0.0-next.24"
47
+ "@nomicfoundation/hardhat-errors": "^3.0.0-next.26",
48
+ "@nomicfoundation/hardhat-utils": "^3.0.0-next.26"
49
49
  },
50
50
  "peerDependencies": {
51
- "hardhat": "^3.0.0-next.24",
51
+ "hardhat": "^3.0.0-next.26",
52
52
  "viem": "^2.30.0"
53
53
  },
54
54
  "scripts": {
@@ -7,6 +7,7 @@ import {
7
7
  assertHardhatInvariant,
8
8
  HardhatError,
9
9
  } from "@nomicfoundation/hardhat-errors";
10
+ import { isObject } from "@nomicfoundation/hardhat-utils/lang";
10
11
  import { extractChain } from "viem";
11
12
  import * as chainsModule from "viem/chains";
12
13
  import { hardhat, anvil, optimism } from "viem/chains";
@@ -17,15 +18,15 @@ const chains = Object.values(chainsModule) as ViemChain[];
17
18
 
18
19
  const chainCache = new WeakMap<EthereumProvider, ViemChain>();
19
20
  const chainIdCache = new WeakMap<EthereumProvider, number>();
20
- const isHardhatNetworkCache = new WeakMap<EthereumProvider, boolean>();
21
+ const hardhatMetadataCache = new WeakMap<EthereumProvider, HardhatMetadata>();
21
22
  const isAnvilNetworkCache = new WeakMap<EthereumProvider, boolean>();
22
23
 
23
24
  const HARDHAT_METADATA_METHOD = "hardhat_metadata";
24
25
  const ANVIL_NODE_INFO_METHOD = "anvil_nodeInfo";
25
26
 
26
- export async function getChain(
27
+ export async function getChain<ChainTypeT extends ChainType | string>(
27
28
  provider: EthereumProvider,
28
- chainType: ChainType | string,
29
+ chainType: ChainTypeT,
29
30
  ): Promise<ViemChain> {
30
31
  const cachedChain = chainCache.get(provider);
31
32
  if (cachedChain !== undefined) {
@@ -41,20 +42,7 @@ export async function getChain(
41
42
 
42
43
  if ((await isDevelopmentNetwork(provider)) || chain === undefined) {
43
44
  if (await isHardhatNetwork(provider)) {
44
- // TODO: We should improve how we handle the chains for the different chain
45
- // types, as this is both a hardhat and an optimism chain.
46
- //
47
- // We are currently creating our chain based off optimism's, but that's
48
- // not always the correct behavior, as the user may be connecting to
49
- // a different chain.
50
- if (chainType === "optimism") {
51
- chain = { ...optimism, id: chainId };
52
- } else {
53
- chain = {
54
- ...hardhat,
55
- id: chainId,
56
- };
57
- }
45
+ chain = createHardhatChain(provider, chainId, chainType);
58
46
  } else if (await isAnvilNetwork(provider)) {
59
47
  chain = {
60
48
  ...anvil,
@@ -111,15 +99,27 @@ export async function isDevelopmentNetwork(
111
99
  export async function isHardhatNetwork(
112
100
  provider: EthereumProvider,
113
101
  ): Promise<boolean> {
114
- const cachedIsHardhat = isHardhatNetworkCache.get(provider);
115
- if (cachedIsHardhat !== undefined) {
116
- return cachedIsHardhat;
102
+ const cachedHardhatMetadata = hardhatMetadataCache.get(provider);
103
+ if (cachedHardhatMetadata !== undefined) {
104
+ return true;
117
105
  }
118
106
 
119
- const isHardhat = await isMethodSupported(provider, HARDHAT_METADATA_METHOD);
120
- isHardhatNetworkCache.set(provider, isHardhat);
107
+ try {
108
+ const hardhatMetadata = await provider.request({
109
+ method: HARDHAT_METADATA_METHOD,
110
+ });
111
+
112
+ assertHardhatInvariant(
113
+ isHardhatMetadata(hardhatMetadata),
114
+ "Expected valid hardhat metadata response",
115
+ );
121
116
 
122
- return isHardhat;
117
+ hardhatMetadataCache.set(provider, hardhatMetadata);
118
+ return true;
119
+ } catch {
120
+ hardhatMetadataCache.delete(provider);
121
+ return false;
122
+ }
123
123
  }
124
124
 
125
125
  export async function isAnvilNetwork(
@@ -158,3 +158,59 @@ async function isMethodSupported(provider: EthereumProvider, method: string) {
158
158
  return false;
159
159
  }
160
160
  }
161
+
162
+ function createHardhatChain<ChainTypeT extends ChainType | string>(
163
+ provider: EthereumProvider,
164
+ chainId: number,
165
+ chainType: ChainTypeT,
166
+ ): ViemChain {
167
+ const hardhatMetadata = hardhatMetadataCache.get(provider);
168
+ assertHardhatInvariant(
169
+ hardhatMetadata !== undefined,
170
+ "Expected hardhat metadata to be available",
171
+ );
172
+
173
+ if (hardhatMetadata.forkedNetwork?.chainId !== undefined) {
174
+ const forkedChain = extractChain({
175
+ chains,
176
+ id: hardhatMetadata.forkedNetwork.chainId,
177
+ });
178
+
179
+ if (forkedChain !== undefined) {
180
+ return {
181
+ ...forkedChain,
182
+ ...hardhat,
183
+ id: chainId,
184
+ };
185
+ }
186
+ }
187
+
188
+ const chain: ViemChain = {
189
+ ...hardhat,
190
+ id: chainId,
191
+ };
192
+
193
+ if (chainType === "optimism") {
194
+ // we add the optimism contracts to enable viem's L2 actions
195
+ chain.contracts = {
196
+ ...optimism.contracts,
197
+ };
198
+ }
199
+
200
+ return chain;
201
+ }
202
+
203
+ interface HardhatMetadata {
204
+ forkedNetwork?: {
205
+ chainId: number;
206
+ };
207
+ }
208
+
209
+ function isHardhatMetadata(value: unknown): value is HardhatMetadata {
210
+ return (
211
+ isObject(value) &&
212
+ (value.forkedNetwork === undefined ||
213
+ (isObject(value.forkedNetwork) &&
214
+ typeof value.forkedNetwork.chainId === "number"))
215
+ );
216
+ }