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.
- package/CHANGELOG.md +16 -1
- package/dist/environment/deployments.d.ts +1 -0
- package/dist/environment/deployments.d.ts.map +1 -1
- package/dist/environment/deployments.js +16 -6
- package/dist/environment/deployments.js.map +1 -1
- package/dist/environment/index.d.ts +3 -4
- package/dist/environment/index.d.ts.map +1 -1
- package/dist/environment/index.js +38 -12
- package/dist/environment/index.js.map +1 -1
- package/dist/environment/types.d.ts +12 -18
- package/dist/environment/types.d.ts.map +1 -1
- package/dist/executor/index.d.ts +29 -10
- package/dist/executor/index.d.ts.map +1 -1
- package/dist/executor/index.js +76 -66
- package/dist/executor/index.js.map +1 -1
- package/dist/executor/types.d.ts +5 -11
- package/dist/executor/types.d.ts.map +1 -1
- package/dist/internal/types.d.ts +1 -0
- package/dist/internal/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/environment/deployments.ts +28 -7
- package/src/environment/index.ts +44 -17
- package/src/environment/types.ts +25 -30
- package/src/executor/index.ts +119 -99
- package/src/executor/types.ts +3 -22
- package/src/internal/types.ts +1 -0
package/src/environment/types.ts
CHANGED
|
@@ -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 =
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
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
|
-
|
|
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
|
-
|
|
277
|
-
|
|
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:
|
|
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
|
|
296
|
+
name?: string;
|
|
302
297
|
transaction: {
|
|
303
298
|
hash: `0x${string}`;
|
|
304
299
|
nonce?: `0x${string}`;
|
package/src/executor/index.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
40
|
-
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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
|
|
163
|
-
|
|
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
|
|
167
|
-
|
|
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,
|
|
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
|
|
184
|
-
|
|
185
|
-
|
|
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
|
|
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<
|
|
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<
|
|
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
|
-
|
|
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<
|
|
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<
|
|
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<
|
|
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
|
-
|
|
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<
|
|
346
|
+
func: DeployScriptModule<NamedAccounts, ArgumentsType>;
|
|
310
347
|
filePath: string;
|
|
311
348
|
}> = [];
|
|
312
349
|
const scriptsToRunAtTheEnd: Array<{
|
|
313
|
-
func: DeployScriptModule<
|
|
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
|
-
|
|
383
|
-
|
|
384
|
-
|
|
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
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
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
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
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
|
}
|
package/src/executor/types.ts
CHANGED
|
@@ -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<
|
|
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<
|
|
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<
|
|
30
|
+
> = (env: Environment<NamedAccounts, Deployments>) => Promise<void>;
|