rocketh 0.11.1 → 0.11.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.
@@ -128,6 +128,7 @@ export type Deployment<TAbi extends Abi> = {
128
128
  readonly bytecode: EIP1193DATA;
129
129
  readonly argsData: EIP1193DATA;
130
130
  readonly metadata: string;
131
+ readonly numDeployments?: number;
131
132
  readonly libraries?: Libraries;
132
133
  readonly linkedData?: any; // TODO
133
134
  readonly deployedBytecode?: EIP1193DATA;
@@ -197,19 +198,6 @@ export type ResolvedNamedSigners<T extends UnknownNamedAccounts> = {
197
198
 
198
199
  export type UnknownDeploymentsAcrossNetworks = Record<string, UnknownDeployments>;
199
200
 
200
- export type Context<
201
- Artifacts extends UnknownArtifacts = UnknownArtifacts,
202
- NamedAccounts extends UnknownNamedAccounts = UnknownNamedAccounts
203
- > = {
204
- network: {
205
- name: string;
206
- tags: {[tag: string]: boolean};
207
- saveDeployments: boolean;
208
- };
209
- accounts: NamedAccounts;
210
- artifacts: Artifacts;
211
- };
212
-
213
201
  type NetworkConfigBase = {
214
202
  name: string;
215
203
  tags: string[];
@@ -225,7 +213,7 @@ type NetworkConfigForEIP1193Provider = NetworkConfigBase & {
225
213
 
226
214
  export type NetworkConfig = NetworkConfigForJSONRPC | NetworkConfigForEIP1193Provider;
227
215
 
228
- export type Config = {
216
+ export type Config<AccountsType extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts> = {
229
217
  network: NetworkConfig;
230
218
  networkTags?: string[];
231
219
  scripts?: string;
@@ -239,24 +227,26 @@ export type Config = {
239
227
  logLevel?: number;
240
228
  // TODO
241
229
  gasPricing?: {};
230
+ accounts?: AccountsType;
242
231
  };
243
232
 
244
- export type ResolvedConfig = Config & {
245
- deployments: string;
246
- scripts: string;
247
- tags: string[];
248
- network: {
249
- name: string;
233
+ export type ResolvedConfig<AccountsType extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts> =
234
+ Config & {
235
+ deployments: string;
236
+ scripts: string;
250
237
  tags: string[];
251
- fork?: boolean;
238
+ network: {
239
+ name: string;
240
+ tags: string[];
241
+ fork?: boolean;
242
+ };
243
+ saveDeployments?: boolean;
244
+ askBeforeProceeding?: boolean;
245
+ reportGasUse?: boolean;
246
+ accounts: AccountsType;
252
247
  };
253
- saveDeployments?: boolean;
254
- askBeforeProceeding?: boolean;
255
- reportGasUse?: boolean;
256
- };
257
248
 
258
249
  export interface Environment<
259
- Artifacts extends UnknownArtifacts = UnknownArtifacts,
260
250
  NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
261
251
  Deployments extends UnknownDeployments = UnknownDeployments
262
252
  > {
@@ -273,8 +263,11 @@ export interface Environment<
273
263
  unnamedAccounts: EIP1193Account[];
274
264
  // unnamedSigners: {type: 'remote'; signer: EIP1193ProviderWithoutEvents}[];
275
265
  addressSigners: {[name: `0x${string}`]: Signer};
276
- artifacts: Artifacts;
277
- save<TAbi extends Abi = Abi>(name: string, deployment: Deployment<TAbi>): Promise<Deployment<TAbi>>;
266
+ save<TAbi extends Abi = Abi>(
267
+ name: string,
268
+ deployment: Deployment<TAbi>,
269
+ options?: {doNotCountAsNewDeployment?: boolean}
270
+ ): Promise<Deployment<TAbi>>;
278
271
  savePendingDeployment<TAbi extends Abi = Abi>(pendingDeployment: PendingDeployment<TAbi>): Promise<Deployment<TAbi>>;
279
272
  savePendingExecution(pendingExecution: PendingExecution): Promise<EIP1193TransactionReceipt>;
280
273
  get<TAbi extends Abi>(name: string): Deployment<TAbi>;
@@ -283,12 +276,14 @@ export interface Environment<
283
276
  fromAddressToNamedABIOrNull<TAbi extends Abi>(address: Address): {mergedABI: TAbi; names: string[]} | null;
284
277
  showMessage(message: string): void;
285
278
  showProgress(message?: string): ProgressIndicator;
279
+
280
+ hasMigrationBeenDone(id: string): boolean;
286
281
  }
287
282
 
288
283
  export type DeploymentConstruction<TAbi extends Abi> = Omit<
289
284
  DeployContractParameters<TAbi>,
290
285
  'bytecode' | 'account' | 'abi' | 'chain'
291
- > & {account: string | EIP1193Account; artifact: string | Artifact<TAbi>};
286
+ > & {account: string | EIP1193Account; artifact: Artifact<TAbi>};
292
287
 
293
288
  export type PartialDeployment<TAbi extends Abi = Abi> = Artifact<TAbi> & {
294
289
  argsData: EIP1193DATA;
@@ -298,7 +293,7 @@ export type PartialDeployment<TAbi extends Abi = Abi> = Artifact<TAbi> & {
298
293
 
299
294
  export type PendingDeployment<TAbi extends Abi = Abi> = {
300
295
  type: 'deployment';
301
- name: string;
296
+ name?: string;
302
297
  transaction: {
303
298
  hash: `0x${string}`;
304
299
  nonce?: `0x${string}`;
@@ -11,7 +11,7 @@ import type {
11
11
  UnresolvedUnknownNamedAccounts,
12
12
  } from '../environment/types.js';
13
13
  import {createEnvironment} from '../environment/index.js';
14
- import {DeployScriptFunction, DeployScriptModule, ProvidedContext} from './types.js';
14
+ import {DeployScriptFunction, DeployScriptModule} from './types.js';
15
15
  import {logger, setLogLevel, spin} from '../internal/logging.js';
16
16
  import {EIP1193GenericRequestProvider, EIP1193ProviderWithoutEvents} from 'eip-1193';
17
17
  import {getRoughGasPriceEstimate} from '../utils/eth.js';
@@ -20,26 +20,31 @@ import {formatEther} from 'viem';
20
20
  import {tsImport} from 'tsx/esm/api';
21
21
 
22
22
  export function execute<
23
- Artifacts extends UnknownArtifacts = UnknownArtifacts,
24
23
  NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
25
24
  ArgumentsType = undefined,
26
25
  Deployments extends UnknownDeployments = UnknownDeployments
27
26
  >(
28
- context: ProvidedContext<Artifacts, NamedAccounts>,
29
- callback: DeployScriptFunction<Artifacts, ResolvedNamedAccounts<NamedAccounts>, ArgumentsType, Deployments>,
30
- options: {tags?: string[]; dependencies?: string[]}
31
- ): DeployScriptModule<Artifacts, NamedAccounts, ArgumentsType, Deployments> {
32
- const scriptModule = (
33
- env: Environment<Artifacts, ResolvedNamedAccounts<NamedAccounts>, Deployments>,
27
+ callback: DeployScriptFunction<ResolvedNamedAccounts<NamedAccounts>, ArgumentsType, Deployments>,
28
+ options: {tags?: string[]; dependencies?: string[]; id?: string}
29
+ ): DeployScriptModule<NamedAccounts, ArgumentsType, Deployments> {
30
+ const scriptModule: DeployScriptModule<NamedAccounts, ArgumentsType, Deployments> = (
31
+ env: Environment<ResolvedNamedAccounts<NamedAccounts>, Deployments>,
34
32
  args?: ArgumentsType
35
33
  ) => callback(env, args);
36
- scriptModule.providedContext = context;
37
34
  scriptModule.tags = options.tags;
38
35
  scriptModule.dependencies = options.dependencies;
39
- // TODO id + skip
40
- return scriptModule as unknown as DeployScriptModule<Artifacts, NamedAccounts, ArgumentsType, Deployments>;
36
+ scriptModule.id = options.id;
37
+ // TODO runAtTheEnd ?
38
+ return scriptModule;
41
39
  }
42
40
 
41
+ export type NamedAccountExecuteFunction<
42
+ NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts
43
+ > = <ArgumentsType = undefined, Deployments extends UnknownDeployments = UnknownDeployments>(
44
+ callback: DeployScriptFunction<ResolvedNamedAccounts<NamedAccounts>, ArgumentsType, Deployments>,
45
+ options: {tags?: string[]; dependencies?: string[]; id?: string}
46
+ ) => DeployScriptModule<NamedAccounts, ArgumentsType, Deployments>;
47
+
43
48
  export interface UntypedRequestArguments {
44
49
  readonly method: string;
45
50
  readonly params?: readonly unknown[] | object;
@@ -61,14 +66,58 @@ export type ConfigOptions = {
61
66
  reportGasUse?: boolean;
62
67
  };
63
68
 
64
- export function readConfig(options: ConfigOptions): Config {
65
- type Networks = {[name: string]: {rpcUrl?: string; tags?: string[]}};
66
- type ConfigFile = {networks: Networks; deployments?: string; scripts?: string};
69
+ type Networks = {[name: string]: {rpcUrl?: string; tags?: string[]}};
70
+ export type UserConfig<NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts> = {
71
+ networks?: Networks;
72
+ deployments?: string;
73
+ scripts?: string;
74
+ accounts?: NamedAccounts;
75
+ };
76
+
77
+ export async function readConfig<NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts>(
78
+ options: ConfigOptions
79
+ ): Promise<Config<NamedAccounts>> {
80
+ type ConfigFile = UserConfig<NamedAccounts>;
67
81
  let configFile: ConfigFile | undefined;
68
- try {
69
- const configString = fs.readFileSync('./rocketh.json', 'utf-8');
70
- configFile = JSON.parse(configString);
71
- } catch {}
82
+
83
+ // TODO more sophisticated config file finding mechanism (look up parents, etc..)
84
+ const tsFilePath = path.join(process.cwd(), 'rocketh.ts');
85
+ const jsFilePath = path.join(process.cwd(), 'rocketh.js');
86
+ const jsonFilePath = path.join(process.cwd(), 'rocketh.json');
87
+
88
+ const tsVersionExists = fs.existsSync(tsFilePath);
89
+ const jsVersionExists = fs.existsSync(jsFilePath);
90
+ const jsonVersionExists = fs.existsSync(jsonFilePath);
91
+ const existingConfigs = [tsVersionExists, jsVersionExists, jsonVersionExists].filter(Boolean).length;
92
+
93
+ // console.log({tsFilePath, tsVersionExists, existingConfigs});
94
+
95
+ // Throw error if multiple config files exist
96
+ if (existingConfigs > 1) {
97
+ throw new Error(
98
+ 'Multiple configuration files found. Please use only one of: rocketh.ts, rocketh.js, or rocketh.json'
99
+ );
100
+ }
101
+ if (tsVersionExists) {
102
+ const moduleLoaded = await tsImport(tsFilePath, import.meta.url);
103
+ configFile = moduleLoaded.config;
104
+ // console.log({tsVersionExists: configFile});
105
+ // if ((configFile as any).default) {
106
+ // configFile = (configFile as any).default as ConfigFile;
107
+ // if ((configFile as any).default) {
108
+ // logger.warn(`double default...`);
109
+ // configFile = (configFile as any).default as ConfigFile;
110
+ // }
111
+ // }
112
+ } else if (jsVersionExists) {
113
+ const moduleLoaded = await tsImport(jsFilePath, import.meta.url);
114
+ configFile = moduleLoaded.config;
115
+ } else if (jsonVersionExists) {
116
+ try {
117
+ const configString = fs.readFileSync(jsonFilePath, 'utf-8');
118
+ configFile = JSON.parse(configString);
119
+ } catch {}
120
+ }
72
121
 
73
122
  if (configFile) {
74
123
  if (!options.deployments && configFile.deployments) {
@@ -139,6 +188,7 @@ export function readConfig(options: ConfigOptions): Config {
139
188
  logLevel: options.logLevel,
140
189
  askBeforeProceeding: options.askBeforeProceeding,
141
190
  reportGasUse: options.reportGasUse,
191
+ accounts: configFile?.accounts,
142
192
  };
143
193
  } else {
144
194
  return {
@@ -155,63 +205,59 @@ export function readConfig(options: ConfigOptions): Config {
155
205
  logLevel: options.logLevel,
156
206
  askBeforeProceeding: options.askBeforeProceeding,
157
207
  reportGasUse: options.reportGasUse,
208
+ accounts: configFile?.accounts,
158
209
  };
159
210
  }
160
211
  }
161
212
 
162
- export function readAndResolveConfig(options: ConfigOptions): ResolvedConfig {
163
- return resolveConfig(readConfig(options));
213
+ export async function readAndResolveConfig<
214
+ NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts
215
+ >(options: ConfigOptions): Promise<ResolvedConfig<NamedAccounts>> {
216
+ return resolveConfig<NamedAccounts>(await readConfig<NamedAccounts>(options));
164
217
  }
165
218
 
166
- export function resolveConfig(config: Config): ResolvedConfig {
167
- const resolvedConfig: ResolvedConfig = {
219
+ export function resolveConfig<NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts>(
220
+ config: Config<NamedAccounts>
221
+ ): ResolvedConfig<NamedAccounts> {
222
+ const resolvedConfig: ResolvedConfig<NamedAccounts> = {
168
223
  ...config,
169
- network: config.network, // TODO default to || {name: 'memory'....}
224
+ network: config.network,
170
225
  deployments: config.deployments || 'deployments',
171
226
  scripts: config.scripts || 'deploy',
172
227
  tags: config.tags || [],
173
228
  networkTags: config.networkTags || [],
174
229
  saveDeployments: config.saveDeployments,
230
+ accounts: config.accounts || ({} as NamedAccounts),
175
231
  };
176
232
  return resolvedConfig;
177
233
  }
178
234
 
179
235
  export async function loadEnvironment<
180
- Artifacts extends UnknownArtifacts = UnknownArtifacts,
181
236
  NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts
182
- >(
183
- options: ConfigOptions,
184
- context: ProvidedContext<Artifacts, NamedAccounts>
185
- ): Promise<Environment<Artifacts, NamedAccounts, UnknownDeployments>> {
186
- const resolvedConfig = readAndResolveConfig(options);
187
- const {external, internal} = await createEnvironment(resolvedConfig, context);
237
+ >(options: ConfigOptions): Promise<Environment<NamedAccounts, UnknownDeployments>> {
238
+ const resolvedConfig = await readAndResolveConfig<NamedAccounts>(options);
239
+ // console.log(JSON.stringify(resolvedConfig, null, 2));
240
+ const {external, internal} = await createEnvironment(resolvedConfig);
188
241
  return external;
189
242
  }
190
243
 
191
244
  export async function loadAndExecuteDeployments<
192
- Artifacts extends UnknownArtifacts = UnknownArtifacts,
193
245
  NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
194
246
  ArgumentsType = undefined
195
- >(
196
- options: ConfigOptions,
197
- context?: ProvidedContext<Artifacts, NamedAccounts>,
198
- args?: ArgumentsType
199
- ): Promise<Environment<Artifacts, NamedAccounts, UnknownDeployments>> {
200
- const resolvedConfig = readAndResolveConfig(options);
247
+ >(options: ConfigOptions, args?: ArgumentsType): Promise<Environment<NamedAccounts, UnknownDeployments>> {
248
+ const resolvedConfig = await readAndResolveConfig<NamedAccounts>(options);
201
249
  // console.log(JSON.stringify(options, null, 2));
202
250
  // console.log(JSON.stringify(resolvedConfig, null, 2));
203
- return executeDeployScripts<Artifacts, NamedAccounts, ArgumentsType>(resolvedConfig, context, args);
251
+ return executeDeployScripts<NamedAccounts, ArgumentsType>(resolvedConfig, args);
204
252
  }
205
253
 
206
254
  export async function executeDeployScripts<
207
- Artifacts extends UnknownArtifacts = UnknownArtifacts,
208
255
  NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
209
256
  ArgumentsType = undefined
210
257
  >(
211
- config: ResolvedConfig,
212
- context?: ProvidedContext<Artifacts, NamedAccounts>,
258
+ config: ResolvedConfig<NamedAccounts>,
213
259
  args?: ArgumentsType
214
- ): Promise<Environment<Artifacts, NamedAccounts, UnknownDeployments>> {
260
+ ): Promise<Environment<NamedAccounts, UnknownDeployments>> {
215
261
  setLogLevel(typeof config.logLevel === 'undefined' ? 0 : config.logLevel);
216
262
 
217
263
  let filepaths;
@@ -228,33 +274,28 @@ export async function executeDeployScripts<
228
274
  return 0;
229
275
  });
230
276
 
231
- let providedContext: ProvidedContext<Artifacts, NamedAccounts> | undefined = context;
232
- const providedFromArguments = !!providedContext;
233
-
234
- const scriptModuleByFilePath: {[filename: string]: DeployScriptModule<Artifacts, NamedAccounts, ArgumentsType>} = {};
277
+ const scriptModuleByFilePath: {[filename: string]: DeployScriptModule<NamedAccounts, ArgumentsType>} = {};
235
278
  const scriptPathBags: {[tag: string]: string[]} = {};
236
279
  const scriptFilePaths: string[] = [];
237
280
 
238
281
  for (const filepath of filepaths) {
239
282
  const scriptFilePath = path.resolve(filepath);
240
- let scriptModule: DeployScriptModule<Artifacts, NamedAccounts, ArgumentsType>;
283
+ let scriptModule: DeployScriptModule<NamedAccounts, ArgumentsType>;
241
284
  try {
242
285
  scriptModule = await tsImport(scriptFilePath, import.meta.url);
243
286
 
287
+ // console.log({
288
+ // scriptFilePath,
289
+ // scriptModule,
290
+ // });
244
291
  if ((scriptModule as any).default) {
245
- scriptModule = (scriptModule as any).default as DeployScriptModule<Artifacts, NamedAccounts, ArgumentsType>;
292
+ scriptModule = (scriptModule as any).default as DeployScriptModule<NamedAccounts, ArgumentsType>;
246
293
  if ((scriptModule as any).default) {
247
294
  logger.warn(`double default...`);
248
- scriptModule = (scriptModule as any).default as DeployScriptModule<Artifacts, NamedAccounts, ArgumentsType>;
295
+ scriptModule = (scriptModule as any).default as DeployScriptModule<NamedAccounts, ArgumentsType>;
249
296
  }
250
297
  }
251
298
  scriptModuleByFilePath[scriptFilePath] = scriptModule;
252
- if (!providedFromArguments) {
253
- if (providedContext && providedContext !== scriptModule.providedContext) {
254
- throw new Error(`context between 2 scripts is different, please share the same across them`);
255
- }
256
- providedContext = scriptModule.providedContext as ProvidedContext<Artifacts, NamedAccounts>;
257
- }
258
299
  } catch (e) {
259
300
  logger.error(`could not import ${filepath}`);
260
301
  throw e;
@@ -296,21 +337,17 @@ export async function executeDeployScripts<
296
337
  }
297
338
  }
298
339
 
299
- if (!providedContext) {
300
- throw new Error(`no context loaded`);
301
- }
302
-
303
- const {internal, external} = await createEnvironment(config, providedContext);
340
+ const {internal, external} = await createEnvironment(config);
304
341
 
305
342
  await internal.recoverTransactionsIfAny();
306
343
 
307
344
  const scriptsRegisteredToRun: {[filename: string]: boolean} = {};
308
345
  const scriptsToRun: Array<{
309
- func: DeployScriptModule<Artifacts, NamedAccounts, ArgumentsType>;
346
+ func: DeployScriptModule<NamedAccounts, ArgumentsType>;
310
347
  filePath: string;
311
348
  }> = [];
312
349
  const scriptsToRunAtTheEnd: Array<{
313
- func: DeployScriptModule<Artifacts, NamedAccounts, ArgumentsType>;
350
+ func: DeployScriptModule<NamedAccounts, ArgumentsType>;
314
351
  filePath: string;
315
352
  }> = [];
316
353
  function recurseDependencies(scriptFilePath: string) {
@@ -379,22 +416,22 @@ Do you want to proceed (note that gas price can change for each tx)`,
379
416
  for (const deployScript of scriptsToRun.concat(scriptsToRunAtTheEnd)) {
380
417
  const filename = path.basename(deployScript.filePath);
381
418
  const relativeFilepath = path.relative('.', deployScript.filePath);
382
- // if (deployScript.func.id && this.db.migrations[deployScript.func.id]) {
383
- // logger.info(`skipping ${filename} as migrations already executed and complete`);
384
- // continue;
385
- // }
419
+ if (deployScript.func.id && external.hasMigrationBeenDone(deployScript.func.id)) {
420
+ logger.info(`skipping ${filename} as migrations already executed and complete`);
421
+ continue;
422
+ }
386
423
  let skip = false;
387
424
  const spinner = spin(`- Executing ${filename}`);
388
- if (deployScript.func.skip) {
389
- const spinner = spin(` - skip?()`);
390
- try {
391
- skip = await deployScript.func.skip(external, args);
392
- spinner.succeed(skip ? `skipping ${filename}` : undefined);
393
- } catch (e) {
394
- spinner.fail();
395
- throw e;
396
- }
397
- }
425
+ // if (deployScript.func.skip) {
426
+ // const spinner = spin(` - skip?()`);
427
+ // try {
428
+ // skip = await deployScript.func.skip(external, args);
429
+ // spinner.succeed(skip ? `skipping ${filename}` : undefined);
430
+ // } catch (e) {
431
+ // spinner.fail();
432
+ // throw e;
433
+ // }
434
+ // }
398
435
  if (!skip) {
399
436
  let result;
400
437
 
@@ -406,29 +443,12 @@ Do you want to proceed (note that gas price can change for each tx)`,
406
443
  throw e;
407
444
  }
408
445
  if (result && typeof result === 'boolean') {
409
- // if (!deployScript.func.id) {
410
- // throw new Error(
411
- // `${deployScript.filePath} return true to not be executed again, but does not provide an id. the script function needs to have the field "id" to be set`
412
- // );
413
- // }
414
- // this.db.migrations[deployScript.func.id] = Math.floor(Date.now() / 1000);
415
-
416
- const deploymentFolderPath = config.deployments;
417
-
418
- // TODO refactor to extract this whole path and folder existence stuff
419
- // const toSave = this.db.writeDeploymentsToFiles && this.network.saveDeployments;
420
- // if (toSave) {
421
- // try {
422
- // fs.mkdirSync(this.deploymentsPath);
423
- // } catch (e) {}
424
- // try {
425
- // fs.mkdirSync(path.join(this.deploymentsPath, deploymentFolderPath));
426
- // } catch (e) {}
427
- // fs.writeFileSync(
428
- // path.join(this.deploymentsPath, deploymentFolderPath, '.migrations.json'),
429
- // JSON.stringify(this.db.migrations, null, ' ')
430
- // );
431
- // }
446
+ if (!deployScript.func.id) {
447
+ throw new Error(
448
+ `${deployScript.filePath} return true to not be executed again, but does not provide an id. the script function needs to have the field "id" to be set`
449
+ );
450
+ }
451
+ internal.recordMigration(deployScript.func.id);
432
452
  }
433
453
  }
434
454
  }
@@ -1,49 +1,30 @@
1
1
  import type {
2
2
  Environment,
3
3
  ResolvedNamedAccounts,
4
- UnknownArtifacts,
5
4
  UnknownDeployments,
6
5
  UnknownNamedAccounts,
7
6
  UnresolvedUnknownNamedAccounts,
8
7
  } from '../environment/types.js';
9
8
 
10
9
  export type DeployScriptFunction<
11
- Artifacts extends UnknownArtifacts = UnknownArtifacts,
12
10
  NamedAccounts extends UnknownNamedAccounts = UnknownNamedAccounts,
13
11
  ArgumentsTypes = undefined,
14
12
  Deployments extends UnknownDeployments = UnknownDeployments
15
- > = (env: Environment<Artifacts, NamedAccounts, Deployments>, args?: ArgumentsTypes) => Promise<void | boolean>;
13
+ > = (env: Environment<NamedAccounts, Deployments>, args?: ArgumentsTypes) => Promise<void | boolean>;
16
14
 
17
15
  export interface DeployScriptModule<
18
- Artifacts extends UnknownArtifacts = UnknownArtifacts,
19
16
  NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
20
17
  ArgumentsTypes = undefined,
21
18
  Deployments extends UnknownDeployments = UnknownDeployments
22
19
  > {
23
- (env: Environment<Artifacts, ResolvedNamedAccounts<NamedAccounts>, Deployments>, args?: ArgumentsTypes): Promise<
24
- void | boolean
25
- >;
26
- providedContext: ProvidedContext<Artifacts, NamedAccounts>;
27
- skip?: (
28
- env: Environment<Artifacts, ResolvedNamedAccounts<NamedAccounts>, Deployments>,
29
- args?: ArgumentsTypes
30
- ) => Promise<boolean>;
20
+ (env: Environment<ResolvedNamedAccounts<NamedAccounts>, Deployments>, args?: ArgumentsTypes): Promise<void | boolean>;
31
21
  tags?: string[];
32
22
  dependencies?: string[];
33
23
  runAtTheEnd?: boolean;
34
24
  id?: string;
35
25
  }
36
26
 
37
- export type ProvidedContext<
38
- Artifacts extends UnknownArtifacts = UnknownArtifacts,
39
- NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts
40
- > = {
41
- accounts?: NamedAccounts;
42
- artifacts: Artifacts;
43
- };
44
-
45
27
  export type ScriptCallback<
46
- Artifacts extends UnknownArtifacts = UnknownArtifacts,
47
28
  NamedAccounts extends UnknownNamedAccounts = UnknownNamedAccounts,
48
29
  Deployments extends UnknownDeployments = UnknownDeployments
49
- > = (env: Environment<Artifacts, NamedAccounts, Deployments>) => Promise<void>;
30
+ > = (env: Environment<NamedAccounts, Deployments>) => Promise<void>;
@@ -1,4 +1,5 @@
1
1
  export type InternalEnvironment = {
2
2
  exportDeploymentsAsTypes(): Promise<void>;
3
3
  recoverTransactionsIfAny(): Promise<void>;
4
+ recordMigration(id: string): void;
4
5
  };