@@ -5,14 +5,20 @@ import type {
5
5
EdrNetworkChainConfig ,
6
6
EdrNetworkChainsConfig ,
7
7
EdrNetworkChainsUserConfig ,
8
+ EdrNetworkConfig ,
8
9
EdrNetworkForkingConfig ,
9
10
EdrNetworkForkingUserConfig ,
10
11
EdrNetworkMiningConfig ,
11
12
EdrNetworkMiningUserConfig ,
13
+ EdrNetworkUserConfig ,
12
14
GasConfig ,
13
15
GasUserConfig ,
14
16
HttpNetworkAccountsConfig ,
15
17
HttpNetworkAccountsUserConfig ,
18
+ HttpNetworkConfig ,
19
+ HttpNetworkUserConfig ,
20
+ NetworkConfig ,
21
+ NetworkUserConfig ,
16
22
} from "../../../types/config.js" ;
17
23
18
24
import path from "node:path" ;
@@ -21,14 +27,163 @@ import {
21
27
hexStringToBytes ,
22
28
normalizeHexString ,
23
29
} from "@ignored/hardhat-vnext-utils/hex" ;
30
+ import { isObject } from "micro-eth-signer/utils" ;
24
31
25
32
import { DEFAULT_HD_ACCOUNTS_CONFIG_PARAMS } from "./accounts/constants.js" ;
26
33
import {
27
34
DEFAULT_EDR_NETWORK_HD_ACCOUNTS_CONFIG_PARAMS ,
28
35
EDR_NETWORK_DEFAULT_COINBASE ,
29
36
} from "./edr/edr-provider.js" ;
30
37
import { HardforkName , LATEST_HARDFORK } from "./edr/types/hardfork.js" ;
31
- import { isHdAccountsUserConfig } from "./type-validation.js" ;
38
+ import { isHttpNetworkHdAccountsUserConfig } from "./type-validation.js" ;
39
+
40
+ export function resolveHttpNetwork (
41
+ networkConfig : HttpNetworkUserConfig ,
42
+ resolveConfigurationVariable : ConfigurationVariableResolver ,
43
+ ) : HttpNetworkConfig {
44
+ return {
45
+ type : "http" ,
46
+ accounts : resolveHttpNetworkAccounts (
47
+ networkConfig . accounts ,
48
+ resolveConfigurationVariable ,
49
+ ) ,
50
+ chainId : networkConfig . chainId ,
51
+ chainType : networkConfig . chainType ,
52
+ from : networkConfig . from ,
53
+ gas : resolveGasConfig ( networkConfig . gas ) ,
54
+ gasMultiplier : networkConfig . gasMultiplier ?? 1 ,
55
+ gasPrice : resolveGasConfig ( networkConfig . gasPrice ) ,
56
+ url : resolveConfigurationVariable ( networkConfig . url ) ,
57
+ timeout : networkConfig . timeout ?? 20_000 ,
58
+ httpHeaders : networkConfig . httpHeaders ?? { } ,
59
+ } ;
60
+ }
61
+
62
+ export function resolveEdrNetwork (
63
+ networkConfig : EdrNetworkUserConfig ,
64
+ cachePath : string ,
65
+ resolveConfigurationVariable : ConfigurationVariableResolver ,
66
+ ) : EdrNetworkConfig {
67
+ return {
68
+ type : "edr" ,
69
+ accounts : resolveEdrNetworkAccounts (
70
+ networkConfig . accounts ,
71
+ resolveConfigurationVariable ,
72
+ ) ,
73
+ chainId : networkConfig . chainId ?? 31337 ,
74
+ chainType : networkConfig . chainType ,
75
+ from : networkConfig . from ,
76
+ gas : resolveGasConfig ( networkConfig . gas ) ,
77
+ gasMultiplier : networkConfig . gasMultiplier ?? 1 ,
78
+ gasPrice : resolveGasConfig ( networkConfig . gasPrice ) ,
79
+
80
+ allowBlocksWithSameTimestamp :
81
+ networkConfig . allowBlocksWithSameTimestamp ?? false ,
82
+ allowUnlimitedContractSize :
83
+ networkConfig . allowUnlimitedContractSize ?? false ,
84
+ blockGasLimit : BigInt ( networkConfig . blockGasLimit ?? 30_000_000n ) ,
85
+ chains : resolveChains ( networkConfig . chains ) ,
86
+ coinbase : resolveCoinbase ( networkConfig . coinbase ) ,
87
+ enableRip7212 : networkConfig . enableRip7212 ?? false ,
88
+ enableTransientStorage : networkConfig . enableTransientStorage ?? false ,
89
+ forking : resolveForkingConfig (
90
+ networkConfig . forking ,
91
+ cachePath ,
92
+ resolveConfigurationVariable ,
93
+ ) ,
94
+ hardfork : resolveHardfork (
95
+ networkConfig . hardfork ,
96
+ networkConfig . enableTransientStorage ,
97
+ ) ,
98
+ initialBaseFeePerGas : resolveInitialBaseFeePerGas (
99
+ networkConfig . initialBaseFeePerGas ,
100
+ ) ,
101
+ initialDate : networkConfig . initialDate ?? new Date ( ) ,
102
+ loggingEnabled : networkConfig . loggingEnabled ?? false ,
103
+ minGasPrice : BigInt ( networkConfig . minGasPrice ?? 0 ) ,
104
+ mining : resolveMiningConfig ( networkConfig . mining ) ,
105
+ networkId : networkConfig . networkId ?? networkConfig . chainId ?? 31337 ,
106
+ throwOnCallFailures : networkConfig . throwOnCallFailures ?? true ,
107
+ throwOnTransactionFailures :
108
+ networkConfig . throwOnTransactionFailures ?? true ,
109
+ } ;
110
+ }
111
+
112
+ /**
113
+ * Resolves a NetworkUserConfig into a Partial<NetworkConfig> object.
114
+ * This function processes the network configuration override using the appropriate
115
+ * resolver (either HTTP or EDR) and ensures only the values explicitly specified
116
+ * in the override are included in the final result, preventing defaults from
117
+ * overwriting the user's configuration.
118
+ *
119
+ * @param networkUserConfigOverride The user's network configuration override.
120
+ * @param resolveConfigurationVariable A function to resolve configuration variables.
121
+ * @returns A Partial<NetworkConfig> containing the resolved values from the override.
122
+ */
123
+ export function resolveNetworkConfigOverride (
124
+ networkUserConfigOverride : NetworkUserConfig ,
125
+ resolveConfigurationVariable : ConfigurationVariableResolver ,
126
+ ) : Partial < NetworkConfig > {
127
+ let resolvedConfigOverride : NetworkConfig ;
128
+
129
+ if ( networkUserConfigOverride . type === "http" ) {
130
+ resolvedConfigOverride = resolveHttpNetwork (
131
+ networkUserConfigOverride ,
132
+ resolveConfigurationVariable ,
133
+ ) ;
134
+ } else {
135
+ resolvedConfigOverride = resolveEdrNetwork (
136
+ networkUserConfigOverride ,
137
+ "" ,
138
+ resolveConfigurationVariable ,
139
+ ) ;
140
+ }
141
+
142
+ /* Return only the resolved config of the values overridden by the user. This
143
+ ensures that only the overridden values are merged into the config and
144
+ indirectly removes cacheDir from the resolved forking config, as cacheDir
145
+ is not part of the NetworkUserConfig. */
146
+ return pickResolvedFromOverrides (
147
+ resolvedConfigOverride ,
148
+ networkUserConfigOverride ,
149
+ ) ;
150
+ }
151
+
152
+ function pickResolvedFromOverrides <
153
+ TResolved extends object ,
154
+ TOverride extends object ,
155
+ > ( resolvedConfig : TResolved , overrides : TOverride ) : Partial < TResolved > {
156
+ const result : Partial < TResolved > = { } ;
157
+
158
+ for ( const key of Object . keys ( overrides ) ) {
159
+ /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions
160
+ -- As TResolved and TOverride are objects share the same keys, we can
161
+ safely cast the key */
162
+ const resolvedKey = key as keyof TResolved ;
163
+ const resolvedValue = resolvedConfig [ resolvedKey ] ;
164
+ /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions
165
+ -- As TResolved and TOverride are objects share the same keys, we can
166
+ safely cast the key */
167
+ const overrideValue = overrides [ key as keyof TOverride ] ;
168
+
169
+ if ( ! ( isObject ( resolvedValue ) && isObject ( overrideValue ) ) ) {
170
+ result [ resolvedKey ] = resolvedValue ;
171
+ continue ;
172
+ }
173
+
174
+ /* Some properties in NetworkConfig, such as accounts, forking, and mining,
175
+ are objects themselves. To handle these, we process them recursively. */
176
+ /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions
177
+ -- The return type adheres to TResolved[keyof TResolved], but TS can't
178
+ infer it */
179
+ result [ resolvedKey ] = pickResolvedFromOverrides (
180
+ resolvedValue ,
181
+ overrideValue ,
182
+ ) as TResolved [ keyof TResolved ] ;
183
+ }
184
+
185
+ return result ;
186
+ }
32
187
33
188
export function resolveGasConfig ( value : GasUserConfig = "auto" ) : GasConfig {
34
189
return value === "auto" ? value : BigInt ( value ) ;
@@ -48,7 +203,7 @@ export function resolveHttpNetworkAccounts(
48
203
} ) ;
49
204
}
50
205
51
- if ( isHdAccountsUserConfig ( accounts ) ) {
206
+ if ( isHttpNetworkHdAccountsUserConfig ( accounts ) ) {
52
207
const { passphrase : defaultPassphrase , ...defaultHdAccountRest } =
53
208
DEFAULT_HD_ACCOUNTS_CONFIG_PARAMS ;
54
209
const { mnemonic, passphrase, ...hdAccountRest } = accounts ;
0 commit comments