rocketh 0.15.0-testing.0 → 0.15.0-testing.10

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 (57) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/dist/cli.js +1 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/environment/deployments.d.ts +1 -1
  5. package/dist/environment/deployments.d.ts.map +1 -1
  6. package/dist/environment/index.d.ts +2 -6
  7. package/dist/environment/index.d.ts.map +1 -1
  8. package/dist/environment/index.js +27 -51
  9. package/dist/environment/index.js.map +1 -1
  10. package/dist/environment/types.d.ts +33 -75
  11. package/dist/environment/types.d.ts.map +1 -1
  12. package/dist/environment/utils/artifacts.d.ts +1 -1
  13. package/dist/environment/utils/artifacts.d.ts.map +1 -1
  14. package/dist/environment/utils/chains.d.ts +3 -4
  15. package/dist/environment/utils/chains.d.ts.map +1 -1
  16. package/dist/environment/utils/chains.js +82 -16
  17. package/dist/environment/utils/chains.js.map +1 -1
  18. package/dist/executor/index.d.ts +13 -84
  19. package/dist/executor/index.d.ts.map +1 -1
  20. package/dist/executor/index.js +153 -214
  21. package/dist/executor/index.js.map +1 -1
  22. package/dist/executor/setup.test.d.ts +3 -3
  23. package/dist/executor/setup.test.d.ts.map +1 -1
  24. package/dist/executor/setup.test.js +1 -1
  25. package/dist/executor/setup.test.js.map +1 -1
  26. package/dist/executor/types.d.ts +92 -0
  27. package/dist/executor/types.d.ts.map +1 -1
  28. package/dist/index.d.ts +6 -6
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +6 -6
  31. package/dist/index.js.map +1 -1
  32. package/dist/types.d.ts +469 -0
  33. package/dist/types.d.ts.map +1 -0
  34. package/dist/types.js +2 -0
  35. package/dist/types.js.map +1 -0
  36. package/dist/utils/extensions.d.ts +1 -2
  37. package/dist/utils/extensions.d.ts.map +1 -1
  38. package/dist/utils/extensions.test.d.ts +2 -2
  39. package/dist/utils/extensions.test.d.ts.map +1 -1
  40. package/dist/utils/fs.d.ts +1 -1
  41. package/dist/utils/fs.d.ts.map +1 -1
  42. package/dist/utils/fs.js.map +1 -1
  43. package/package.json +3 -3
  44. package/src/cli.ts +3 -3
  45. package/src/environment/deployments.ts +1 -1
  46. package/src/environment/index.ts +33 -62
  47. package/src/environment/utils/artifacts.ts +1 -1
  48. package/src/environment/utils/chains.ts +110 -19
  49. package/src/executor/index.ts +204 -339
  50. package/src/executor/setup.test.ts +2 -2
  51. package/src/index.ts +14 -6
  52. package/src/types.ts +597 -0
  53. package/src/utils/extensions.test.ts +1 -1
  54. package/src/utils/extensions.ts +2 -2
  55. package/src/utils/fs.ts +1 -1
  56. package/src/environment/types.ts +0 -380
  57. package/src/executor/types.ts +0 -176
@@ -5,29 +5,27 @@ import prompts from 'prompts';
5
5
  import {tsImport as tsImport_} from 'tsx/esm/api';
6
6
  import {formatEther} from 'viem';
7
7
  import type {
8
- Config,
9
8
  Environment,
10
- JSONTypePlusBigInt,
11
- ResolvedConfig,
12
- TargetConfig,
9
+ ExecutionParams,
10
+ ResolvedExecutionParams,
13
11
  UnknownDeployments,
14
12
  UnresolvedNetworkSpecificData,
15
13
  UnresolvedUnknownNamedAccounts,
16
- } from '../environment/types.js';
17
- import {createEnvironment, SignerProtocolFunction} from '../environment/index.js';
18
- import {
19
- ChainInfo,
20
- DeployScriptFunction,
21
14
  DeployScriptModule,
22
15
  EnhancedDeployScriptFunction,
23
16
  EnhancedEnvironment,
24
- } from './types.js';
17
+ ResolvedUserConfig,
18
+ ConfigOverrides,
19
+ UserConfig,
20
+ ChainConfig,
21
+ } from '../types.js';
25
22
  import {withEnvironment} from '../utils/extensions.js';
26
23
  import {logger, setLogLevel, spin} from '../internal/logging.js';
27
24
  import {getRoughGasPriceEstimate} from '../utils/eth.js';
28
25
  import {traverseMultipleDirectory} from '../utils/fs.js';
29
- import {getChain, getChainByName} from '../environment/utils/chains.js';
26
+ import {getChainByName, getChainConfig} from '../environment/utils/chains.js';
30
27
  import {JSONRPCHTTPProvider} from 'eip-1193-jsonrpc-provider';
28
+ import {createEnvironment} from '../environment/index.js';
31
29
 
32
30
  // @ts-ignore
33
31
  const tsImport = (path: string, opts: any) => (typeof Bun !== 'undefined' ? import(path) : tsImport_(path, opts));
@@ -92,18 +90,21 @@ export function setup<
92
90
  return scriptModule;
93
91
  }
94
92
 
95
- async function loadAndExecuteDeploymentsWithExtensions<ArgumentsType = undefined>(
96
- options: ConfigOptions<Extra>,
93
+ async function loadAndExecuteDeploymentsWithExtensions<
94
+ Extra extends Record<string, unknown> = Record<string, unknown>,
95
+ ArgumentsType = undefined
96
+ >(
97
+ executionParams: ExecutionParams<Extra>,
97
98
  args?: ArgumentsType
98
99
  ): Promise<EnhancedEnvironment<NamedAccounts, Data, UnknownDeployments, Extensions>> {
99
- const env = await loadAndExecuteDeployments<NamedAccounts, Data, ArgumentsType, Extra>(options, args);
100
+ const env = await loadAndExecuteDeployments<NamedAccounts, Data, ArgumentsType, Extra>(executionParams, args);
100
101
  return enhanceEnvIfNeeded(env, extensions);
101
102
  }
102
103
 
103
104
  async function loadEnvironmentWithExtensions(
104
- options: ConfigOptions<Extra>
105
+ executionParams: ExecutionParams<Extra>
105
106
  ): Promise<EnhancedEnvironment<NamedAccounts, Data, UnknownDeployments, Extensions>> {
106
- const env = await loadEnvironment<NamedAccounts, Data, Extra>(options);
107
+ const env = await loadEnvironment<NamedAccounts, Data, Extra>(executionParams);
107
108
  return enhanceEnvIfNeeded(env, extensions);
108
109
  }
109
110
 
@@ -139,252 +140,10 @@ export function enhanceEnvIfNeeded<
139
140
  return enhancedEnv;
140
141
  }
141
142
 
142
- export type NamedAccountExecuteFunction<
143
- NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
144
- Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData
145
- > = <ArgumentsType = undefined, Deployments extends UnknownDeployments = UnknownDeployments>(
146
- callback: DeployScriptFunction<NamedAccounts, Data, ArgumentsType, Deployments>,
147
- options: {tags?: string[]; dependencies?: string[]; id?: string}
148
- ) => DeployScriptModule<NamedAccounts, Data, ArgumentsType, Deployments>;
149
-
150
- export interface UntypedRequestArguments {
151
- readonly method: string;
152
- readonly params?: readonly unknown[] | object;
153
- }
154
- export type UntypedEIP1193Provider = {
155
- request(requestArguments: UntypedRequestArguments): Promise<unknown>;
156
- };
157
-
158
- export type ConfigOptions<Extra extends Record<string, unknown> = Record<string, unknown>> = {
159
- target?: string | {fork: string};
160
- deployments?: string;
161
- scripts?: string | string[];
162
- tags?: string;
163
- logLevel?: number;
164
- provider?: EIP1193ProviderWithoutEvents | EIP1193GenericRequestProvider | UntypedEIP1193Provider;
165
- ignoreMissingRPC?: boolean;
166
- saveDeployments?: boolean;
167
- askBeforeProceeding?: boolean;
168
- reportGasUse?: boolean;
169
- extra?: Extra;
170
- };
171
-
172
- export type Create2DeterministicDeploymentInfo = {
173
- factory: `0x${string}`;
174
- deployer: `0x${string}`;
175
- funding: string;
176
- signedTx: `0x${string}`;
177
- };
178
-
179
- export type Create3DeterministicDeploymentInfo = {
180
- salt?: `0x${string}`;
181
- factory: `0x${string}`;
182
- bytecode: `0x${string}`;
183
- proxyBytecode: `0x${string}`;
184
- };
185
-
186
- export type DeterministicDeploymentInfo =
187
- | Create2DeterministicDeploymentInfo
188
- | {
189
- create2?: Create2DeterministicDeploymentInfo;
190
- create3?: Create3DeterministicDeploymentInfo;
191
- };
192
-
193
- export type ChainUserConfig = {
194
- rpcUrl?: string;
195
- tags?: string[];
196
- deterministicDeployment?: DeterministicDeploymentInfo;
197
- info?: ChainInfo;
198
- pollingInterval?: number;
199
- properties?: Record<string, JSONTypePlusBigInt>;
200
- };
201
-
202
- export type DeploymentTargetConfig = {
203
- chainId: number;
204
- scripts?: string | string[];
205
- overrides: Omit<ChainUserConfig, 'info'>;
206
- };
207
-
208
- export type Chains = {
209
- [idOrName: number | string]: ChainUserConfig;
210
- };
211
- export type UserConfig<
212
- NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
213
- Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData
214
- > = {
215
- targets: {[name: string]: DeploymentTargetConfig};
216
- chains?: Chains;
217
- deployments?: string;
218
- scripts?: string | string[];
219
- accounts?: NamedAccounts;
220
- data?: Data;
221
- signerProtocols?: Record<string, SignerProtocolFunction>;
222
- defaultPollingInterval?: number;
223
- };
224
-
225
- export async function transformUserConfig<
226
- NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
227
- Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData,
228
- Extra extends Record<string, unknown> = Record<string, unknown>
229
- >(
230
- configFile: UserConfig<NamedAccounts, Data> | undefined,
231
- options: ConfigOptions<Extra>
232
- ): Promise<Config<NamedAccounts, Data>> {
233
- if (configFile) {
234
- if (!options.deployments && configFile.deployments) {
235
- options.deployments = configFile.deployments;
236
- }
237
- if (!options.scripts && configFile.scripts) {
238
- options.scripts = configFile.scripts;
239
- }
240
- }
241
-
242
- const fork = typeof options.target !== 'string';
243
- let targetName = 'memory';
244
- if (options.target) {
245
- if (typeof options.target === 'string') {
246
- targetName = options.target;
247
- } else if ('fork' in options.target) {
248
- targetName = options.target.fork;
249
- }
250
- }
251
-
252
- let chainInfo: ChainInfo;
253
-
254
- let chainId: number;
255
-
256
- if (configFile?.targets[targetName]) {
257
- chainId = configFile.targets[targetName].chainId;
258
- } else {
259
- const chainFound = getChainByName(targetName);
260
- if (chainFound) {
261
- chainInfo = chainFound;
262
- chainId = chainInfo.id;
263
- } else {
264
- if (options.provider) {
265
- const chainIdAsHex = await (options.provider as EIP1193ProviderWithoutEvents).request({method: 'eth_chainId'});
266
- chainId = Number(chainIdAsHex);
267
- } else {
268
- throw new Error(`target ${targetName} is unknown`);
269
- }
270
- }
271
- }
272
-
273
- const chainFound = getChain(chainId);
274
- if (chainFound) {
275
- chainInfo = chainFound;
276
- } else {
277
- throw new Error(`target ${targetName} has no chain associated with it`);
278
- }
279
-
280
- const chainConfigFromChainId = configFile?.chains?.[chainId];
281
- const chainConfigFromChainName = configFile?.chains?.[targetName];
282
- if (chainConfigFromChainId && chainConfigFromChainName) {
283
- throw new Error(
284
- `conflicting config for chain, choose to configure via its chainId (${chainId}) or via its name ${targetName} but not both`
285
- );
286
- }
287
- const chainConfig = chainConfigFromChainId || chainConfigFromChainName;
288
-
289
- const targetConfig = configFile?.targets?.[targetName];
290
- const actualChainConfig = targetConfig?.overrides
291
- ? {
292
- ...chainConfig,
293
- ...targetConfig.overrides,
294
- properties: {
295
- ...chainConfig?.properties,
296
- ...targetConfig.overrides.properties,
297
- },
298
- }
299
- : chainConfig;
300
-
301
- const defaultTags: string[] = [];
302
- if (chainInfo.testnet) {
303
- defaultTags.push('testnet');
304
- }
305
-
306
- let targetTags: string[] = actualChainConfig?.tags || defaultTags;
307
-
308
- let networkScripts: string | string[] | undefined = targetConfig?.scripts;
309
-
310
- // no default for publicInfo
311
- const defaultPollingInterval = configFile?.defaultPollingInterval;
312
- const pollingInterval = actualChainConfig?.pollingInterval;
313
- const deterministicDeployment = actualChainConfig?.deterministicDeployment;
314
- const properties = actualChainConfig?.properties;
315
-
316
- let resolvedTargetConfig: TargetConfig;
317
-
318
- if (!options.provider) {
319
- let rpcURL = actualChainConfig?.rpcUrl;
320
- if (!rpcURL) {
321
- rpcURL = chainInfo.rpcUrls.default.http[0];
322
- }
323
-
324
- const fromEnv = process.env['ETH_NODE_URI_' + targetName];
325
- let nodeUrl: string;
326
- if (typeof fromEnv === 'string' && fromEnv) {
327
- nodeUrl = fromEnv;
328
- } else {
329
- if (rpcURL) {
330
- nodeUrl = rpcURL;
331
- } else if (options?.ignoreMissingRPC) {
332
- nodeUrl = '';
333
- } else if (options.target === 'localhost') {
334
- nodeUrl = 'http://127.0.0.1:8545';
335
- } else {
336
- console.error(`network "${options.target}" is not configured. Please add it to the rocketh.js/ts file`);
337
- process.exit(1);
338
- }
339
- }
340
-
341
- resolvedTargetConfig = {
342
- nodeUrl,
343
- name: targetName,
344
- tags: targetTags,
345
- fork,
346
- deterministicDeployment,
347
- scripts: networkScripts,
348
- chainInfo,
349
- pollingInterval,
350
- properties,
351
- };
352
- } else {
353
- resolvedTargetConfig = {
354
- provider: options.provider as EIP1193ProviderWithoutEvents,
355
- name: targetName,
356
- tags: targetTags,
357
- fork,
358
- deterministicDeployment,
359
- scripts: networkScripts,
360
- chainInfo,
361
- pollingInterval,
362
- properties,
363
- };
364
- }
365
-
366
- return {
367
- target: resolvedTargetConfig,
368
- deployments: options.deployments,
369
- saveDeployments: options.saveDeployments,
370
- scripts: options.scripts,
371
- data: configFile?.data,
372
- tags: typeof options.tags === 'undefined' ? undefined : options.tags.split(','),
373
- logLevel: options.logLevel,
374
- askBeforeProceeding: options.askBeforeProceeding,
375
- reportGasUse: options.reportGasUse,
376
- accounts: configFile?.accounts,
377
- signerProtocols: configFile?.signerProtocols,
378
- extra: options.extra,
379
- defaultPollingInterval,
380
- };
381
- }
382
-
383
143
  export async function readConfig<
384
144
  NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
385
- Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData,
386
- Extra extends Record<string, unknown> = Record<string, unknown>
387
- >(options: ConfigOptions<Extra>): Promise<Config<NamedAccounts, Data>> {
145
+ Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData
146
+ >(): Promise<UserConfig> {
388
147
  type ConfigFile = UserConfig<NamedAccounts, Data>;
389
148
  let configFile: ConfigFile | undefined;
390
149
 
@@ -423,59 +182,109 @@ export async function readConfig<
423
182
  configFile = moduleLoaded.config;
424
183
  }
425
184
 
426
- return transformUserConfig(configFile, options);
185
+ return configFile || {};
427
186
  }
428
187
 
429
- export async function readAndResolveConfig<
188
+ export function resolveConfig<
430
189
  NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
431
- Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData,
432
- Extra extends Record<string, unknown> = Record<string, unknown>
433
- >(options: ConfigOptions<Extra>): Promise<ResolvedConfig<NamedAccounts, Data>> {
434
- return resolveConfig<NamedAccounts, Data>(await readConfig<NamedAccounts, Data>(options));
190
+ Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData
191
+ >(configFile: UserConfig, overrides?: ConfigOverrides): ResolvedUserConfig<NamedAccounts, Data> {
192
+ const config = {
193
+ deployments: 'deployments',
194
+ defaultPollingInterval: 1,
195
+ ...configFile,
196
+ scripts: configFile?.scripts
197
+ ? typeof configFile.scripts === 'string'
198
+ ? [configFile.scripts]
199
+ : configFile.scripts.length == 0
200
+ ? ['deploy']
201
+ : configFile.scripts
202
+ : ['deploy'],
203
+ };
204
+
205
+ if (overrides) {
206
+ for (const key of Object.keys(overrides)) {
207
+ if ((overrides as any)[key] !== undefined) {
208
+ (config as any)[key] = (overrides as any)[key];
209
+ }
210
+ }
211
+ }
212
+
213
+ return config;
435
214
  }
436
215
 
437
- export function resolveConfig<
216
+ export async function readAndResolveConfig<
438
217
  NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
439
218
  Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData
440
- >(config: Config<NamedAccounts, Data>): ResolvedConfig<NamedAccounts, Data> {
441
- const create2Info = {
442
- factory: '0x4e59b44847b379578588920ca78fbf26c0b4956c',
443
- deployer: '0x3fab184622dc19b6109349b94811493bf2a45362',
444
- funding: '10000000000000000',
445
- signedTx:
446
- '0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222',
447
- } as const;
448
- const create3Info = {
449
- factory: '0x000000000004d4f168daE7DB3C610F408eE22F57',
450
- salt: '0x5361109ca02853ca8e22046b7125306d9ec4ae4cdecc393c567b6be861df3db6',
451
- bytecode:
452
- '0x6080604052348015600f57600080fd5b506103ca8061001f6000396000f3fe6080604052600436106100295760003560e01c8063360d0fad1461002e5780639881d19514610077575b600080fd5b34801561003a57600080fd5b5061004e610049366004610228565b61008a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61004e61008536600461029c565b6100ee565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084901b166020820152603481018290526000906054016040516020818303038152906040528051906020012091506100e78261014c565b9392505050565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481018290526000906054016040516020818303038152906040528051906020012091506100e734848461015e565b600061015882306101ce565b92915050565b60006f67363d3d37363d34f03d5260086018f3600052816010806000f58061018e5763301164256000526004601cfd5b8060145261d69460005260016034536017601e20915060008085516020870188855af1823b026101c65763301164256000526004601cfd5b509392505050565b60006040518260005260ff600b53836020527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f6040526055600b20601452806040525061d694600052600160345350506017601e20919050565b6000806040838503121561023b57600080fd5b823573ffffffffffffffffffffffffffffffffffffffff8116811461025f57600080fd5b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080604083850312156102af57600080fd5b823567ffffffffffffffff8111156102c657600080fd5b8301601f810185136102d757600080fd5b803567ffffffffffffffff8111156102f1576102f161026d565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561035d5761035d61026d565b60405281815282820160200187101561037557600080fd5b816020840160208301376000602092820183015296940135945050505056fea264697066735822122059dcc5dc6453397d13ff28021e28472a80a45bbd97f3135f69bd2650773aeb0164736f6c634300081a0033',
453
- proxyBytecode: '0x67363d3d37363d34f03d5260086018f3',
454
- } as const;
455
-
456
- const defaultPollingInterval = config.defaultPollingInterval || 1;
457
- const networkPollingInterval = config.target.pollingInterval || defaultPollingInterval;
458
-
459
- let deterministicDeployment: {
460
- create2: Create2DeterministicDeploymentInfo;
461
- create3: Create3DeterministicDeploymentInfo;
462
- } = {
463
- create2: (() => {
464
- if (!config.target.deterministicDeployment) return create2Info;
465
- if (
466
- !('create3' in config.target.deterministicDeployment) &&
467
- !('create2' in config.target.deterministicDeployment)
468
- )
469
- return create2Info;
470
- return config.target.deterministicDeployment.create2 || create2Info;
471
- })(),
472
- create3:
473
- config.target.deterministicDeployment &&
474
- 'create3' in config.target.deterministicDeployment &&
475
- config.target.deterministicDeployment.create3
476
- ? config.target.deterministicDeployment.create3
477
- : create3Info,
478
- };
219
+ >(overrides?: ConfigOverrides): Promise<ResolvedUserConfig<NamedAccounts, Data>> {
220
+ const configFile = await readConfig();
221
+ return resolveConfig(configFile, overrides);
222
+ }
223
+
224
+ export async function getChainIdForTarget(
225
+ config: ResolvedUserConfig,
226
+ targetName: string,
227
+ provider?: EIP1193ProviderWithoutEvents
228
+ ) {
229
+ if (config?.targets?.[targetName]?.chainId) {
230
+ return config.targets[targetName].chainId;
231
+ } else {
232
+ const chainFound = getChainByName(targetName);
233
+ if (chainFound) {
234
+ return chainFound.id;
235
+ } else {
236
+ if (provider) {
237
+ const chainIdAsHex = await provider.request({method: 'eth_chainId'});
238
+ return Number(chainIdAsHex);
239
+ } else {
240
+ throw new Error(`target ${targetName} chain id cannot be found, specify it in the rocketh config`);
241
+ }
242
+ }
243
+ }
244
+ }
245
+
246
+ function getTargetName(executionParams: ExecutionParams): {name: string; fork: boolean} {
247
+ const targetProvided = executionParams.target || (executionParams as any).network;
248
+ let targetName = 'memory';
249
+ if (targetProvided) {
250
+ if (typeof targetProvided === 'string') {
251
+ targetName = targetProvided;
252
+ } else if ('fork' in targetProvided) {
253
+ targetName = targetProvided.fork;
254
+ }
255
+ }
256
+ const fork = typeof targetProvided !== 'string';
257
+ return {name: targetName, fork};
258
+ }
259
+
260
+ export function resolveExecutionParams<Extra extends Record<string, unknown> = Record<string, unknown>>(
261
+ config: ResolvedUserConfig,
262
+ executionParameters: ExecutionParams<Extra>,
263
+ chainId: number
264
+ ): ResolvedExecutionParams<Extra> {
265
+ const {name: targetName, fork} = getTargetName(executionParameters);
266
+
267
+ let chainConfig: ChainConfig = getChainConfig(chainId, config);
268
+
269
+ let chainInfo = chainConfig.info;
270
+ const targetConfig = config?.targets?.[targetName];
271
+ const actualChainConfig = targetConfig?.overrides
272
+ ? {
273
+ ...chainConfig,
274
+ ...targetConfig.overrides,
275
+ properties: {
276
+ ...chainConfig?.properties,
277
+ ...targetConfig.overrides.properties,
278
+ },
279
+ }
280
+ : chainConfig;
281
+
282
+ if (actualChainConfig?.properties) {
283
+ chainInfo = {...chainInfo, properties: actualChainConfig.properties};
284
+ }
285
+
286
+ // let targetTags: string[] = actualChainConfig.tags.concat(targetConfig?.tags); // TODO
287
+ const targetTags = actualChainConfig.tags;
479
288
 
480
289
  let scripts = ['deploy'];
481
290
  if (config.scripts) {
@@ -486,38 +295,66 @@ export function resolveConfig<
486
295
  }
487
296
  }
488
297
 
489
- if (config.target.scripts) {
490
- if (typeof config.target.scripts === 'string') {
491
- scripts = [config.target.scripts];
298
+ if (targetConfig?.scripts) {
299
+ if (typeof targetConfig.scripts === 'string') {
300
+ scripts = [targetConfig.scripts];
492
301
  } else {
493
- scripts = config.target.scripts;
302
+ scripts = targetConfig.scripts;
303
+ }
304
+ }
305
+
306
+ const provider =
307
+ executionParameters.provider || (new JSONRPCHTTPProvider(actualChainConfig.rpcUrl) as EIP1193ProviderWithoutEvents);
308
+
309
+ let saveDeployments = executionParameters.saveDeployments;
310
+
311
+ if (saveDeployments === undefined) {
312
+ if (!executionParameters.provider) {
313
+ saveDeployments = true;
314
+ } else {
315
+ if (targetName === 'memory' || targetName === 'hardhat' || targetName === 'default') {
316
+ // networkTags['memory'] = true;
317
+ saveDeployments = false;
318
+ } else {
319
+ saveDeployments = true;
320
+ }
494
321
  }
495
322
  }
496
- const resolvedConfig: ResolvedConfig<NamedAccounts, Data> = {
497
- ...config,
498
- target: {...config.target, deterministicDeployment, pollingInterval: networkPollingInterval},
499
- deployments: config.deployments || 'deployments',
323
+
324
+ return {
325
+ askBeforeProceeding: executionParameters.askBeforeProceeding || false,
326
+ chain: chainInfo,
327
+ logLevel: executionParameters.logLevel || 0, // TODO
328
+ pollingInterval: actualChainConfig.pollingInterval,
329
+ reportGasUse: executionParameters.reportGasUse || false,
330
+ saveDeployments,
331
+ tags: executionParameters.tags || [],
332
+ target: {
333
+ name: targetName,
334
+ tags: targetTags,
335
+ fork,
336
+ deterministicDeployment: actualChainConfig.deterministicDeployment,
337
+ },
338
+ extra: executionParameters.extra,
339
+ provider,
500
340
  scripts,
501
- tags: config.tags || [],
502
- targetTags: config.targetTags || [],
503
- saveDeployments: config.saveDeployments,
504
- accounts: config.accounts || ({} as NamedAccounts),
505
- data: config.data || ({} as Data),
506
- signerProtocols: config.signerProtocols || {},
507
- extra: config.extra || {},
508
- defaultPollingInterval,
509
341
  };
510
- return resolvedConfig;
511
342
  }
512
343
 
513
344
  export async function loadEnvironment<
514
345
  NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
515
346
  Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData,
516
347
  Extra extends Record<string, unknown> = Record<string, unknown>
517
- >(options: ConfigOptions<Extra>): Promise<Environment<NamedAccounts, Data, UnknownDeployments>> {
518
- const resolvedConfig = await readAndResolveConfig<NamedAccounts, Data>(options);
348
+ >(executionParams: ExecutionParams<Extra>): Promise<Environment<NamedAccounts, Data, UnknownDeployments>> {
349
+ const userConfig = await readAndResolveConfig<NamedAccounts, Data>(executionParams.config);
350
+ const {name: targetName, fork} = getTargetName(executionParams);
351
+ const chainId = await getChainIdForTarget(userConfig, targetName, executionParams.provider);
352
+ const resolvedExecutionParams = resolveExecutionParams(userConfig, executionParams, chainId);
519
353
  // console.log(JSON.stringify(resolvedConfig, null, 2));
520
- const {external, internal} = await createEnvironment(resolvedConfig);
354
+ const {external, internal} = await createEnvironment<NamedAccounts, Data, UnknownDeployments>(
355
+ userConfig,
356
+ resolvedExecutionParams
357
+ );
521
358
  return external;
522
359
  }
523
360
 
@@ -526,11 +363,35 @@ export async function loadAndExecuteDeployments<
526
363
  Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData,
527
364
  ArgumentsType = undefined,
528
365
  Extra extends Record<string, unknown> = Record<string, unknown>
529
- >(options: ConfigOptions<Extra>, args?: ArgumentsType): Promise<Environment<NamedAccounts, Data, UnknownDeployments>> {
530
- const resolvedConfig = await readAndResolveConfig<NamedAccounts, Data>(options);
366
+ >(
367
+ executionParams: ExecutionParams<Extra>,
368
+ args?: ArgumentsType
369
+ ): Promise<Environment<NamedAccounts, Data, UnknownDeployments>> {
370
+ const userConfig = await readAndResolveConfig<NamedAccounts, Data>(executionParams.config);
371
+ const {name: targetName, fork} = getTargetName(executionParams);
372
+ const chainId = await getChainIdForTarget(userConfig, targetName, executionParams.provider);
373
+ const resolvedExecutionParams = resolveExecutionParams(userConfig, executionParams, chainId);
531
374
  // console.log(JSON.stringify(options, null, 2));
532
375
  // console.log(JSON.stringify(resolvedConfig, null, 2));
533
- return executeDeployScripts<NamedAccounts, Data, ArgumentsType>(resolvedConfig, args);
376
+ return executeDeployScripts<NamedAccounts, Data, ArgumentsType>(userConfig, resolvedExecutionParams, args);
377
+ }
378
+
379
+ export async function executeDeployScriptsDirectly<
380
+ NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
381
+ Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData,
382
+ ArgumentsType = undefined,
383
+ Extra extends Record<string, unknown> = Record<string, unknown>
384
+ >(
385
+ userConfig: UserConfig,
386
+ executionParams?: ExecutionParams<Extra>,
387
+ args?: ArgumentsType
388
+ ): Promise<Environment<NamedAccounts, Data, UnknownDeployments>> {
389
+ executionParams = executionParams || {};
390
+ const resolveduserConfig = resolveConfig<NamedAccounts, Data>(userConfig);
391
+ const {name: targetName, fork} = getTargetName(executionParams);
392
+ const chainId = await getChainIdForTarget(resolveduserConfig, targetName, executionParams.provider);
393
+ const resolvedExecutionParams = resolveExecutionParams(resolveduserConfig, executionParams, chainId);
394
+ return executeDeployScripts<NamedAccounts, Data, ArgumentsType>(resolveduserConfig, resolvedExecutionParams, args);
534
395
  }
535
396
 
536
397
  export async function executeDeployScripts<
@@ -538,13 +399,14 @@ export async function executeDeployScripts<
538
399
  Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData,
539
400
  ArgumentsType = undefined
540
401
  >(
541
- config: ResolvedConfig<NamedAccounts, Data>,
402
+ userConfig: ResolvedUserConfig<NamedAccounts, Data>,
403
+ resolvedExecutionParams: ResolvedExecutionParams,
542
404
  args?: ArgumentsType
543
405
  ): Promise<Environment<NamedAccounts, Data, UnknownDeployments>> {
544
- setLogLevel(typeof config.logLevel === 'undefined' ? 0 : config.logLevel);
406
+ setLogLevel(typeof resolvedExecutionParams.logLevel === 'undefined' ? 0 : resolvedExecutionParams.logLevel);
545
407
 
546
408
  let filepaths;
547
- filepaths = traverseMultipleDirectory(config.scripts);
409
+ filepaths = traverseMultipleDirectory(resolvedExecutionParams.scripts);
548
410
  filepaths = filepaths
549
411
  .filter((v) => !path.basename(v).startsWith('_'))
550
412
  .sort((a: string, b: string) => {
@@ -599,10 +461,10 @@ export async function executeDeployScripts<
599
461
  }
600
462
  }
601
463
 
602
- if (config.tags !== undefined && config.tags.length > 0) {
464
+ if (resolvedExecutionParams.tags !== undefined && resolvedExecutionParams.tags.length > 0) {
603
465
  let found = false;
604
466
  if (scriptTags !== undefined) {
605
- for (const tagToFind of config.tags) {
467
+ for (const tagToFind of resolvedExecutionParams.tags) {
606
468
  for (const tag of scriptTags) {
607
469
  if (tag === tagToFind) {
608
470
  scriptFilePaths.push(scriptFilePath);
@@ -620,7 +482,10 @@ export async function executeDeployScripts<
620
482
  }
621
483
  }
622
484
 
623
- const {internal, external} = await createEnvironment(config);
485
+ const {internal, external} = await createEnvironment<NamedAccounts, Data, UnknownDeployments>(
486
+ userConfig,
487
+ resolvedExecutionParams
488
+ );
624
489
 
625
490
  await internal.recoverTransactionsIfAny();
626
491
 
@@ -667,10 +532,10 @@ export async function executeDeployScripts<
667
532
  recurseDependencies(scriptFilePath);
668
533
  }
669
534
 
670
- if (config.askBeforeProceeding) {
535
+ if (resolvedExecutionParams.askBeforeProceeding) {
671
536
  console.log(
672
- `Network: ${external.network.name} \n \t Chain: ${external.network.chain.name} \n \t Tags: ${Object.keys(
673
- external.network.tags
537
+ `Network: ${external.name} \n \t Chain: ${external.network.chain.name} \n \t Tags: ${Object.keys(
538
+ external.tags
674
539
  ).join(',')}`
675
540
  );
676
541
  const gasPriceEstimate = await getRoughGasPriceEstimate(external.network.provider);
@@ -736,7 +601,7 @@ Do you want to proceed (note that gas price can change for each tx)`,
736
601
  }
737
602
  }
738
603
 
739
- if (config.reportGasUse) {
604
+ if (resolvedExecutionParams.reportGasUse) {
740
605
  const provider = external.network.provider;
741
606
  const transactionHashes = provider.transactionHashes;
742
607
 
@@ -1,4 +1,4 @@
1
- import type {Environment} from '../environment/types.js';
1
+ import type {Environment} from '../types.js';
2
2
  import {setup} from './index.js';
3
3
 
4
4
  // Mock environment for testing
@@ -134,7 +134,7 @@ export const exampleUsage = () => {
134
134
  await env.verifyOnEtherscan(tokenAddress, ['MyToken', 'MTK']);
135
135
 
136
136
  // Original environment is still fully accessible
137
- console.log(`Deployed on network: ${env.network.name}`);
137
+ console.log(`Deployed on target: ${env.name}`);
138
138
  const deployment = env.get('MyToken');
139
139
 
140
140
  return true;