rocketh 0.15.0-testing.1 → 0.15.0-testing.11

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 +154 -215
  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 +205 -340
  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,253 +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 targetProvided = options.target || (options as any).network; // fallback on network
243
- const fork = typeof targetProvided !== 'string';
244
- let targetName = 'memory';
245
- if (options.target) {
246
- if (typeof options.target === 'string') {
247
- targetName = options.target;
248
- } else if ('fork' in options.target) {
249
- targetName = options.target.fork;
250
- }
251
- }
252
-
253
- let chainInfo: ChainInfo;
254
-
255
- let chainId: number;
256
-
257
- if (configFile?.targets?.[targetName]) {
258
- chainId = configFile.targets[targetName].chainId;
259
- } else {
260
- const chainFound = getChainByName(targetName);
261
- if (chainFound) {
262
- chainInfo = chainFound;
263
- chainId = chainInfo.id;
264
- } else {
265
- if (options.provider) {
266
- const chainIdAsHex = await (options.provider as EIP1193ProviderWithoutEvents).request({method: 'eth_chainId'});
267
- chainId = Number(chainIdAsHex);
268
- } else {
269
- throw new Error(`target ${targetName} is unknown`);
270
- }
271
- }
272
- }
273
-
274
- const chainConfigFromChainId = configFile?.chains?.[chainId];
275
- const chainConfigFromChainName = configFile?.chains?.[targetName];
276
- if (chainConfigFromChainId && chainConfigFromChainName) {
277
- throw new Error(
278
- `conflicting config for chain, choose to configure via its chainId (${chainId}) or via its name ${targetName} but not both`
279
- );
280
- }
281
- const chainConfig = chainConfigFromChainId || chainConfigFromChainName;
282
-
283
- const targetConfig = configFile?.targets?.[targetName];
284
- const actualChainConfig = targetConfig?.overrides
285
- ? {
286
- ...chainConfig,
287
- ...targetConfig.overrides,
288
- properties: {
289
- ...chainConfig?.properties,
290
- ...targetConfig.overrides.properties,
291
- },
292
- }
293
- : chainConfig;
294
-
295
- const defaultTags: string[] = [];
296
-
297
- const chainFound = actualChainConfig?.info || getChain(chainId);
298
- if (chainFound) {
299
- chainInfo = chainFound;
300
- } else {
301
- throw new Error(`chain with id ${chainId} has no chainInfo associated with it`);
302
- }
303
- if (chainInfo.testnet) {
304
- defaultTags.push('testnet');
305
- }
306
-
307
- let targetTags: string[] = actualChainConfig?.tags || defaultTags;
308
-
309
- let networkScripts: string | string[] | undefined = targetConfig?.scripts;
310
-
311
- // no default for publicInfo
312
- const defaultPollingInterval = configFile?.defaultPollingInterval;
313
- const pollingInterval = actualChainConfig?.pollingInterval;
314
- const deterministicDeployment = actualChainConfig?.deterministicDeployment;
315
- const properties = actualChainConfig?.properties;
316
-
317
- let resolvedTargetConfig: TargetConfig;
318
-
319
- if (!options.provider) {
320
- let rpcURL = actualChainConfig?.rpcUrl;
321
- if (!rpcURL) {
322
- rpcURL = chainInfo.rpcUrls.default.http[0];
323
- }
324
-
325
- const fromEnv = process.env['ETH_NODE_URI_' + targetName];
326
- let nodeUrl: string;
327
- if (typeof fromEnv === 'string' && fromEnv) {
328
- nodeUrl = fromEnv;
329
- } else {
330
- if (rpcURL) {
331
- nodeUrl = rpcURL;
332
- } else if (options?.ignoreMissingRPC) {
333
- nodeUrl = '';
334
- } else if (options.target === 'localhost') {
335
- nodeUrl = 'http://127.0.0.1:8545';
336
- } else {
337
- console.error(`network "${options.target}" is not configured. Please add it to the rocketh.js/ts file`);
338
- process.exit(1);
339
- }
340
- }
341
-
342
- resolvedTargetConfig = {
343
- nodeUrl,
344
- name: targetName,
345
- tags: targetTags,
346
- fork,
347
- deterministicDeployment,
348
- scripts: networkScripts,
349
- chainInfo,
350
- pollingInterval,
351
- properties,
352
- };
353
- } else {
354
- resolvedTargetConfig = {
355
- provider: options.provider as EIP1193ProviderWithoutEvents,
356
- name: targetName,
357
- tags: targetTags,
358
- fork,
359
- deterministicDeployment,
360
- scripts: networkScripts,
361
- chainInfo,
362
- pollingInterval,
363
- properties,
364
- };
365
- }
366
-
367
- return {
368
- target: resolvedTargetConfig,
369
- deployments: options.deployments,
370
- saveDeployments: options.saveDeployments,
371
- scripts: options.scripts,
372
- data: configFile?.data,
373
- tags: typeof options.tags === 'undefined' ? undefined : options.tags.split(','),
374
- logLevel: options.logLevel,
375
- askBeforeProceeding: options.askBeforeProceeding,
376
- reportGasUse: options.reportGasUse,
377
- accounts: configFile?.accounts,
378
- signerProtocols: configFile?.signerProtocols,
379
- extra: options.extra,
380
- defaultPollingInterval,
381
- };
382
- }
383
-
384
143
  export async function readConfig<
385
144
  NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
386
- Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData,
387
- Extra extends Record<string, unknown> = Record<string, unknown>
388
- >(options: ConfigOptions<Extra>): Promise<Config<NamedAccounts, Data>> {
145
+ Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData
146
+ >(): Promise<UserConfig> {
389
147
  type ConfigFile = UserConfig<NamedAccounts, Data>;
390
148
  let configFile: ConfigFile | undefined;
391
149
 
@@ -424,59 +182,110 @@ export async function readConfig<
424
182
  configFile = moduleLoaded.config;
425
183
  }
426
184
 
427
- return transformUserConfig(configFile, options);
185
+ return configFile || {};
428
186
  }
429
187
 
430
- export async function readAndResolveConfig<
188
+ export function resolveConfig<
431
189
  NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
432
- Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData,
433
- Extra extends Record<string, unknown> = Record<string, unknown>
434
- >(options: ConfigOptions<Extra>): Promise<ResolvedConfig<NamedAccounts, Data>> {
435
- 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;
436
214
  }
437
215
 
438
- export function resolveConfig<
216
+ export async function readAndResolveConfig<
439
217
  NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
440
218
  Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData
441
- >(config: Config<NamedAccounts, Data>): ResolvedConfig<NamedAccounts, Data> {
442
- const create2Info = {
443
- factory: '0x4e59b44847b379578588920ca78fbf26c0b4956c',
444
- deployer: '0x3fab184622dc19b6109349b94811493bf2a45362',
445
- funding: '10000000000000000',
446
- signedTx:
447
- '0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222',
448
- } as const;
449
- const create3Info = {
450
- factory: '0x000000000004d4f168daE7DB3C610F408eE22F57',
451
- salt: '0x5361109ca02853ca8e22046b7125306d9ec4ae4cdecc393c567b6be861df3db6',
452
- bytecode:
453
- '0x6080604052348015600f57600080fd5b506103ca8061001f6000396000f3fe6080604052600436106100295760003560e01c8063360d0fad1461002e5780639881d19514610077575b600080fd5b34801561003a57600080fd5b5061004e610049366004610228565b61008a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61004e61008536600461029c565b6100ee565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084901b166020820152603481018290526000906054016040516020818303038152906040528051906020012091506100e78261014c565b9392505050565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481018290526000906054016040516020818303038152906040528051906020012091506100e734848461015e565b600061015882306101ce565b92915050565b60006f67363d3d37363d34f03d5260086018f3600052816010806000f58061018e5763301164256000526004601cfd5b8060145261d69460005260016034536017601e20915060008085516020870188855af1823b026101c65763301164256000526004601cfd5b509392505050565b60006040518260005260ff600b53836020527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f6040526055600b20601452806040525061d694600052600160345350506017601e20919050565b6000806040838503121561023b57600080fd5b823573ffffffffffffffffffffffffffffffffffffffff8116811461025f57600080fd5b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080604083850312156102af57600080fd5b823567ffffffffffffffff8111156102c657600080fd5b8301601f810185136102d757600080fd5b803567ffffffffffffffff8111156102f1576102f161026d565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561035d5761035d61026d565b60405281815282820160200187101561037557600080fd5b816020840160208301376000602092820183015296940135945050505056fea264697066735822122059dcc5dc6453397d13ff28021e28472a80a45bbd97f3135f69bd2650773aeb0164736f6c634300081a0033',
454
- proxyBytecode: '0x67363d3d37363d34f03d5260086018f3',
455
- } as const;
456
-
457
- const defaultPollingInterval = config.defaultPollingInterval || 1;
458
- const networkPollingInterval = config.target.pollingInterval || defaultPollingInterval;
459
-
460
- let deterministicDeployment: {
461
- create2: Create2DeterministicDeploymentInfo;
462
- create3: Create3DeterministicDeploymentInfo;
463
- } = {
464
- create2: (() => {
465
- if (!config.target.deterministicDeployment) return create2Info;
466
- if (
467
- !('create3' in config.target.deterministicDeployment) &&
468
- !('create2' in config.target.deterministicDeployment)
469
- )
470
- return create2Info;
471
- return config.target.deterministicDeployment.create2 || create2Info;
472
- })(),
473
- create3:
474
- config.target.deterministicDeployment &&
475
- 'create3' in config.target.deterministicDeployment &&
476
- config.target.deterministicDeployment.create3
477
- ? config.target.deterministicDeployment.create3
478
- : create3Info,
479
- };
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
+ // TODO fork chainId resolution option to keep the network being used
268
+ let chainConfig: ChainConfig = getChainConfig(fork ? 31337 : chainId, config);
269
+
270
+ let chainInfo = chainConfig.info;
271
+ const targetConfig = config?.targets?.[targetName];
272
+ const actualChainConfig = targetConfig?.overrides
273
+ ? {
274
+ ...chainConfig,
275
+ ...targetConfig.overrides,
276
+ properties: {
277
+ ...chainConfig?.properties,
278
+ ...targetConfig.overrides.properties,
279
+ },
280
+ }
281
+ : chainConfig;
282
+
283
+ if (actualChainConfig?.properties) {
284
+ chainInfo = {...chainInfo, properties: actualChainConfig.properties};
285
+ }
286
+
287
+ // let targetTags: string[] = actualChainConfig.tags.concat(targetConfig?.tags); // TODO
288
+ const targetTags = actualChainConfig.tags;
480
289
 
481
290
  let scripts = ['deploy'];
482
291
  if (config.scripts) {
@@ -487,38 +296,66 @@ export function resolveConfig<
487
296
  }
488
297
  }
489
298
 
490
- if (config.target.scripts) {
491
- if (typeof config.target.scripts === 'string') {
492
- scripts = [config.target.scripts];
299
+ if (targetConfig?.scripts) {
300
+ if (typeof targetConfig.scripts === 'string') {
301
+ scripts = [targetConfig.scripts];
493
302
  } else {
494
- scripts = config.target.scripts;
303
+ scripts = targetConfig.scripts;
495
304
  }
496
305
  }
497
- const resolvedConfig: ResolvedConfig<NamedAccounts, Data> = {
498
- ...config,
499
- target: {...config.target, deterministicDeployment, pollingInterval: networkPollingInterval},
500
- deployments: config.deployments || 'deployments',
306
+
307
+ const provider =
308
+ executionParameters.provider || (new JSONRPCHTTPProvider(actualChainConfig.rpcUrl) as EIP1193ProviderWithoutEvents);
309
+
310
+ let saveDeployments = executionParameters.saveDeployments;
311
+
312
+ if (saveDeployments === undefined) {
313
+ if (!executionParameters.provider) {
314
+ saveDeployments = true;
315
+ } else {
316
+ if (targetName === 'memory' || targetName === 'hardhat' || targetName === 'default') {
317
+ // networkTags['memory'] = true;
318
+ saveDeployments = false;
319
+ } else {
320
+ saveDeployments = true;
321
+ }
322
+ }
323
+ }
324
+
325
+ return {
326
+ askBeforeProceeding: executionParameters.askBeforeProceeding || false,
327
+ chain: chainInfo,
328
+ logLevel: executionParameters.logLevel || 0, // TODO
329
+ pollingInterval: actualChainConfig.pollingInterval,
330
+ reportGasUse: executionParameters.reportGasUse || false,
331
+ saveDeployments,
332
+ tags: executionParameters.tags || [],
333
+ target: {
334
+ name: targetName,
335
+ tags: targetTags,
336
+ fork,
337
+ deterministicDeployment: actualChainConfig.deterministicDeployment,
338
+ },
339
+ extra: executionParameters.extra,
340
+ provider,
501
341
  scripts,
502
- tags: config.tags || [],
503
- targetTags: config.targetTags || [],
504
- saveDeployments: config.saveDeployments,
505
- accounts: config.accounts || ({} as NamedAccounts),
506
- data: config.data || ({} as Data),
507
- signerProtocols: config.signerProtocols || {},
508
- extra: config.extra || {},
509
- defaultPollingInterval,
510
342
  };
511
- return resolvedConfig;
512
343
  }
513
344
 
514
345
  export async function loadEnvironment<
515
346
  NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
516
347
  Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData,
517
348
  Extra extends Record<string, unknown> = Record<string, unknown>
518
- >(options: ConfigOptions<Extra>): Promise<Environment<NamedAccounts, Data, UnknownDeployments>> {
519
- const resolvedConfig = await readAndResolveConfig<NamedAccounts, Data>(options);
349
+ >(executionParams: ExecutionParams<Extra>): Promise<Environment<NamedAccounts, Data, UnknownDeployments>> {
350
+ const userConfig = await readAndResolveConfig<NamedAccounts, Data>(executionParams.config);
351
+ const {name: targetName, fork} = getTargetName(executionParams);
352
+ const chainId = await getChainIdForTarget(userConfig, targetName, executionParams.provider);
353
+ const resolvedExecutionParams = resolveExecutionParams(userConfig, executionParams, chainId);
520
354
  // console.log(JSON.stringify(resolvedConfig, null, 2));
521
- const {external, internal} = await createEnvironment(resolvedConfig);
355
+ const {external, internal} = await createEnvironment<NamedAccounts, Data, UnknownDeployments>(
356
+ userConfig,
357
+ resolvedExecutionParams
358
+ );
522
359
  return external;
523
360
  }
524
361
 
@@ -527,11 +364,35 @@ export async function loadAndExecuteDeployments<
527
364
  Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData,
528
365
  ArgumentsType = undefined,
529
366
  Extra extends Record<string, unknown> = Record<string, unknown>
530
- >(options: ConfigOptions<Extra>, args?: ArgumentsType): Promise<Environment<NamedAccounts, Data, UnknownDeployments>> {
531
- const resolvedConfig = await readAndResolveConfig<NamedAccounts, Data>(options);
367
+ >(
368
+ executionParams: ExecutionParams<Extra>,
369
+ args?: ArgumentsType
370
+ ): Promise<Environment<NamedAccounts, Data, UnknownDeployments>> {
371
+ const userConfig = await readAndResolveConfig<NamedAccounts, Data>(executionParams.config);
372
+ const {name: targetName, fork} = getTargetName(executionParams);
373
+ const chainId = await getChainIdForTarget(userConfig, targetName, executionParams.provider);
374
+ const resolvedExecutionParams = resolveExecutionParams(userConfig, executionParams, chainId);
532
375
  // console.log(JSON.stringify(options, null, 2));
533
376
  // console.log(JSON.stringify(resolvedConfig, null, 2));
534
- return executeDeployScripts<NamedAccounts, Data, ArgumentsType>(resolvedConfig, args);
377
+ return executeDeployScripts<NamedAccounts, Data, ArgumentsType>(userConfig, resolvedExecutionParams, args);
378
+ }
379
+
380
+ export async function executeDeployScriptsDirectly<
381
+ NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
382
+ Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData,
383
+ ArgumentsType = undefined,
384
+ Extra extends Record<string, unknown> = Record<string, unknown>
385
+ >(
386
+ userConfig: UserConfig,
387
+ executionParams?: ExecutionParams<Extra>,
388
+ args?: ArgumentsType
389
+ ): Promise<Environment<NamedAccounts, Data, UnknownDeployments>> {
390
+ executionParams = executionParams || {};
391
+ const resolveduserConfig = resolveConfig<NamedAccounts, Data>(userConfig);
392
+ const {name: targetName, fork} = getTargetName(executionParams);
393
+ const chainId = await getChainIdForTarget(resolveduserConfig, targetName, executionParams.provider);
394
+ const resolvedExecutionParams = resolveExecutionParams(resolveduserConfig, executionParams, chainId);
395
+ return executeDeployScripts<NamedAccounts, Data, ArgumentsType>(resolveduserConfig, resolvedExecutionParams, args);
535
396
  }
536
397
 
537
398
  export async function executeDeployScripts<
@@ -539,13 +400,14 @@ export async function executeDeployScripts<
539
400
  Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData,
540
401
  ArgumentsType = undefined
541
402
  >(
542
- config: ResolvedConfig<NamedAccounts, Data>,
403
+ userConfig: ResolvedUserConfig<NamedAccounts, Data>,
404
+ resolvedExecutionParams: ResolvedExecutionParams,
543
405
  args?: ArgumentsType
544
406
  ): Promise<Environment<NamedAccounts, Data, UnknownDeployments>> {
545
- setLogLevel(typeof config.logLevel === 'undefined' ? 0 : config.logLevel);
407
+ setLogLevel(typeof resolvedExecutionParams.logLevel === 'undefined' ? 0 : resolvedExecutionParams.logLevel);
546
408
 
547
409
  let filepaths;
548
- filepaths = traverseMultipleDirectory(config.scripts);
410
+ filepaths = traverseMultipleDirectory(resolvedExecutionParams.scripts);
549
411
  filepaths = filepaths
550
412
  .filter((v) => !path.basename(v).startsWith('_'))
551
413
  .sort((a: string, b: string) => {
@@ -600,10 +462,10 @@ export async function executeDeployScripts<
600
462
  }
601
463
  }
602
464
 
603
- if (config.tags !== undefined && config.tags.length > 0) {
465
+ if (resolvedExecutionParams.tags !== undefined && resolvedExecutionParams.tags.length > 0) {
604
466
  let found = false;
605
467
  if (scriptTags !== undefined) {
606
- for (const tagToFind of config.tags) {
468
+ for (const tagToFind of resolvedExecutionParams.tags) {
607
469
  for (const tag of scriptTags) {
608
470
  if (tag === tagToFind) {
609
471
  scriptFilePaths.push(scriptFilePath);
@@ -621,7 +483,10 @@ export async function executeDeployScripts<
621
483
  }
622
484
  }
623
485
 
624
- const {internal, external} = await createEnvironment(config);
486
+ const {internal, external} = await createEnvironment<NamedAccounts, Data, UnknownDeployments>(
487
+ userConfig,
488
+ resolvedExecutionParams
489
+ );
625
490
 
626
491
  await internal.recoverTransactionsIfAny();
627
492
 
@@ -668,10 +533,10 @@ export async function executeDeployScripts<
668
533
  recurseDependencies(scriptFilePath);
669
534
  }
670
535
 
671
- if (config.askBeforeProceeding) {
536
+ if (resolvedExecutionParams.askBeforeProceeding) {
672
537
  console.log(
673
- `Network: ${external.network.name} \n \t Chain: ${external.network.chain.name} \n \t Tags: ${Object.keys(
674
- external.network.tags
538
+ `Network: ${external.name} \n \t Chain: ${external.network.chain.name} \n \t Tags: ${Object.keys(
539
+ external.tags
675
540
  ).join(',')}`
676
541
  );
677
542
  const gasPriceEstimate = await getRoughGasPriceEstimate(external.network.provider);
@@ -737,7 +602,7 @@ Do you want to proceed (note that gas price can change for each tx)`,
737
602
  }
738
603
  }
739
604
 
740
- if (config.reportGasUse) {
605
+ if (resolvedExecutionParams.reportGasUse) {
741
606
  const provider = external.network.provider;
742
607
  const transactionHashes = provider.transactionHashes;
743
608
 
@@ -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;