rocketh 0.5.1 → 0.5.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 +12 -0
- package/dist/{chunk-KWY4QLNL.js → chunk-DIR22FGH.js} +131 -30
- package/dist/chunk-DIR22FGH.js.map +1 -0
- package/dist/cli.cjs +138 -37
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +9 -9
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +130 -29
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -1
- package/package.json +6 -2
- package/src/cli.ts +3 -15
- package/src/environment/index.ts +76 -20
- package/src/environment/types.ts +3 -0
- package/src/executor/index.ts +25 -10
- package/src/internal/logging.ts +46 -0
- package/dist/chunk-KWY4QLNL.js.map +0 -1
package/src/environment/index.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
|
|
3
|
-
import {createPublicClient, custom} from 'viem';
|
|
3
|
+
import {Transaction, TransactionReceipt, createPublicClient, custom} from 'viem';
|
|
4
4
|
import {
|
|
5
5
|
AccountType,
|
|
6
6
|
Deployment,
|
|
@@ -21,8 +21,9 @@ import {InternalEnvironment} from '../internal/types';
|
|
|
21
21
|
import path from 'node:path';
|
|
22
22
|
import {JSONToString, stringToJSON} from '../utils/json';
|
|
23
23
|
import {loadDeployments} from './deployments';
|
|
24
|
-
import {EIP1193Account, EIP1193ProviderWithoutEvents} from 'eip-1193';
|
|
24
|
+
import {EIP1193Account, EIP1193ProviderWithoutEvents, EIP1193Transaction} from 'eip-1193';
|
|
25
25
|
import {ProvidedContext} from '../executor/types';
|
|
26
|
+
import {spin} from '../internal/logging';
|
|
26
27
|
|
|
27
28
|
export type EnvironmentExtenstion = (env: Environment) => Environment;
|
|
28
29
|
//we store this globally so this is not lost
|
|
@@ -44,6 +45,16 @@ export function handleSignerProtocol(protocol: string, getSigner: SignerProtocol
|
|
|
44
45
|
};
|
|
45
46
|
}
|
|
46
47
|
|
|
48
|
+
function displayTransaction(transaction: EIP1193Transaction) {
|
|
49
|
+
if (transaction.type === '0x2') {
|
|
50
|
+
return `(maxFeePerGas: ${BigInt(transaction.maxFeePerGas).toString()}, maxPriorityFeePerGas: ${BigInt(
|
|
51
|
+
transaction.maxPriorityFeePerGas
|
|
52
|
+
).toString()})`;
|
|
53
|
+
} else {
|
|
54
|
+
return `(gasPrice: ${BigInt(transaction.gasPrice).toString()})`;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
47
58
|
export async function createEnvironment<
|
|
48
59
|
Artifacts extends UnknownArtifacts = UnknownArtifacts,
|
|
49
60
|
NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
|
|
@@ -143,7 +154,7 @@ export async function createEnvironment<
|
|
|
143
154
|
}
|
|
144
155
|
} else {
|
|
145
156
|
const accountForNetwork = accountDef[networkName] || accountDef[chainId] || accountDef['default'];
|
|
146
|
-
if (accountForNetwork) {
|
|
157
|
+
if (typeof accountForNetwork !== undefined) {
|
|
147
158
|
const accountFetched = await getAccount(name, accounts, accountForNetwork);
|
|
148
159
|
if (accountFetched) {
|
|
149
160
|
accountCache[name] = account = accountFetched;
|
|
@@ -253,12 +264,18 @@ export async function createEnvironment<
|
|
|
253
264
|
while (existingPendingDeployments.length > 0) {
|
|
254
265
|
const pendingTransaction = existingPendingDeployments.shift();
|
|
255
266
|
if (pendingTransaction) {
|
|
256
|
-
|
|
267
|
+
const spinner = spin(
|
|
257
268
|
`recovering ${pendingTransaction.name} with transaction ${pendingTransaction.transaction.txHash}`
|
|
258
269
|
);
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
270
|
+
try {
|
|
271
|
+
await waitForTransactionAndSave(pendingTransaction.name, pendingTransaction.transaction);
|
|
272
|
+
console.log(`transaction ${pendingTransaction.transaction.txHash} complete`);
|
|
273
|
+
fs.writeFileSync(filepath, JSONToString(existingPendingDeployments, 2));
|
|
274
|
+
spinner.succeed();
|
|
275
|
+
} catch (e) {
|
|
276
|
+
spinner.fail();
|
|
277
|
+
throw e;
|
|
278
|
+
}
|
|
262
279
|
}
|
|
263
280
|
}
|
|
264
281
|
fs.rmSync(filepath);
|
|
@@ -307,11 +324,24 @@ export async function createEnvironment<
|
|
|
307
324
|
|
|
308
325
|
async function waitForTransactionAndSave<TAbi extends Abi = Abi>(
|
|
309
326
|
name: string,
|
|
310
|
-
pendingDeployment: PendingDeployment<TAbi
|
|
327
|
+
pendingDeployment: PendingDeployment<TAbi>,
|
|
328
|
+
transaction?: EIP1193Transaction | null
|
|
311
329
|
): Promise<Deployment<TAbi>> {
|
|
312
|
-
const
|
|
313
|
-
|
|
314
|
-
|
|
330
|
+
const spinner = spin(`tx ${pendingDeployment.txHash}${transaction ? ` ${displayTransaction(transaction)}` : ''}`);
|
|
331
|
+
let receipt: TransactionReceipt;
|
|
332
|
+
try {
|
|
333
|
+
receipt = await viemClient.waitForTransactionReceipt({
|
|
334
|
+
hash: pendingDeployment.txHash,
|
|
335
|
+
});
|
|
336
|
+
} catch (e) {
|
|
337
|
+
spinner.fail();
|
|
338
|
+
throw e;
|
|
339
|
+
}
|
|
340
|
+
if (!receipt) {
|
|
341
|
+
spinner.fail(`receipt for ${pendingDeployment.txHash} not found`);
|
|
342
|
+
} else {
|
|
343
|
+
spinner.succeed();
|
|
344
|
+
}
|
|
315
345
|
|
|
316
346
|
if (!receipt.contractAddress) {
|
|
317
347
|
throw new Error(`failed to deploy contract ${name}`);
|
|
@@ -319,10 +349,23 @@ export async function createEnvironment<
|
|
|
319
349
|
const {abi, ...artifactObjectWithoutABI} = pendingDeployment.partialDeployment;
|
|
320
350
|
|
|
321
351
|
if (!artifactObjectWithoutABI.nonce) {
|
|
322
|
-
const
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
352
|
+
const spinner = spin(`fetching nonce for ${pendingDeployment.txHash}`);
|
|
353
|
+
let transaction: EIP1193Transaction | null = null;
|
|
354
|
+
try {
|
|
355
|
+
transaction = await provider.request({
|
|
356
|
+
method: 'eth_getTransactionByHash',
|
|
357
|
+
params: [pendingDeployment.txHash],
|
|
358
|
+
});
|
|
359
|
+
} catch (e) {
|
|
360
|
+
spinner.fail();
|
|
361
|
+
throw e;
|
|
362
|
+
}
|
|
363
|
+
if (!transaction) {
|
|
364
|
+
spinner.fail(`tx ${pendingDeployment.txHash} not found`);
|
|
365
|
+
} else {
|
|
366
|
+
spinner.stop();
|
|
367
|
+
}
|
|
368
|
+
|
|
326
369
|
if (transaction) {
|
|
327
370
|
artifactObjectWithoutABI.nonce = transaction.nonce;
|
|
328
371
|
artifactObjectWithoutABI.txOrigin = transaction.from;
|
|
@@ -353,10 +396,22 @@ export async function createEnvironment<
|
|
|
353
396
|
|
|
354
397
|
async function saveWhilePending<TAbi extends Abi = Abi>(name: string, pendingDeployment: PendingDeployment<TAbi>) {
|
|
355
398
|
await saveTransaction<TAbi>(name, pendingDeployment);
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
399
|
+
let transaction: EIP1193Transaction | null = null;
|
|
400
|
+
const spinner = spin(`fetching tx from peers ${pendingDeployment.txHash}`);
|
|
401
|
+
try {
|
|
402
|
+
transaction = await provider.request({
|
|
403
|
+
method: 'eth_getTransactionByHash',
|
|
404
|
+
params: [pendingDeployment.txHash],
|
|
405
|
+
});
|
|
406
|
+
} catch (e) {
|
|
407
|
+
spinner.fail();
|
|
408
|
+
throw e;
|
|
409
|
+
}
|
|
410
|
+
if (!transaction) {
|
|
411
|
+
spinner.fail(`tx ${pendingDeployment.txHash} not found`);
|
|
412
|
+
} else {
|
|
413
|
+
spinner.stop();
|
|
414
|
+
}
|
|
360
415
|
|
|
361
416
|
const deployment = waitForTransactionAndSave<TAbi>(
|
|
362
417
|
name,
|
|
@@ -366,7 +421,8 @@ export async function createEnvironment<
|
|
|
366
421
|
nonce: transaction.nonce,
|
|
367
422
|
txOrigin: transaction.from,
|
|
368
423
|
}
|
|
369
|
-
: pendingDeployment
|
|
424
|
+
: pendingDeployment,
|
|
425
|
+
transaction
|
|
370
426
|
);
|
|
371
427
|
await deleteTransaction(pendingDeployment.txHash);
|
|
372
428
|
return deployment;
|
package/src/environment/types.ts
CHANGED
package/src/executor/index.ts
CHANGED
|
@@ -12,6 +12,7 @@ import type {
|
|
|
12
12
|
} from '../environment/types';
|
|
13
13
|
import {createEnvironment} from '../environment';
|
|
14
14
|
import {DeployScriptFunction, DeployScriptModule, ProvidedContext} from './types';
|
|
15
|
+
import {logger, setLogLevel, spin} from '../internal/logging';
|
|
15
16
|
|
|
16
17
|
require('esbuild-register/dist/node').register();
|
|
17
18
|
|
|
@@ -57,16 +58,24 @@ export function readConfig(options: ConfigOptions, extra?: {ignoreMissingRPC?: b
|
|
|
57
58
|
if (extra?.ignoreMissingRPC) {
|
|
58
59
|
nodeUrl = '';
|
|
59
60
|
} else {
|
|
60
|
-
|
|
61
|
-
|
|
61
|
+
if (options.network === 'localhost') {
|
|
62
|
+
nodeUrl = 'http://127.0.0.1:8545';
|
|
63
|
+
} else {
|
|
64
|
+
logger.error(`network "${options.network}" is not configured. Please add it to the rocketh.json file`);
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
62
67
|
}
|
|
63
68
|
}
|
|
64
69
|
} else {
|
|
65
70
|
if (extra?.ignoreMissingRPC) {
|
|
66
71
|
nodeUrl = '';
|
|
67
72
|
} else {
|
|
68
|
-
|
|
69
|
-
|
|
73
|
+
if (options.network === 'localhost') {
|
|
74
|
+
nodeUrl = 'http://127.0.0.1:8545';
|
|
75
|
+
} else {
|
|
76
|
+
logger.error(`network "${options.network}" is not configured. Please add it to the rocketh.json file`);
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
70
79
|
}
|
|
71
80
|
}
|
|
72
81
|
}
|
|
@@ -113,6 +122,8 @@ export async function executeDeployScripts<
|
|
|
113
122
|
NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
|
|
114
123
|
Deployments extends UnknownDeployments = UnknownDeployments
|
|
115
124
|
>(config: ResolvedConfig): Promise<Deployments> {
|
|
125
|
+
setLogLevel(typeof config.logLevel === 'undefined' ? 0 : config.logLevel);
|
|
126
|
+
|
|
116
127
|
let filepaths;
|
|
117
128
|
filepaths = traverseMultipleDirectory([config.scripts]);
|
|
118
129
|
filepaths = filepaths
|
|
@@ -145,7 +156,7 @@ export async function executeDeployScripts<
|
|
|
145
156
|
if ((scriptModule as any).default) {
|
|
146
157
|
scriptModule = (scriptModule as any).default as DeployScriptModule;
|
|
147
158
|
if ((scriptModule as any).default) {
|
|
148
|
-
|
|
159
|
+
logger.warn(`double default...`);
|
|
149
160
|
scriptModule = (scriptModule as any).default as DeployScriptModule;
|
|
150
161
|
}
|
|
151
162
|
}
|
|
@@ -155,7 +166,7 @@ export async function executeDeployScripts<
|
|
|
155
166
|
}
|
|
156
167
|
providedContext = scriptModule.providedContext as ProvidedContext<Artifacts, NamedAccounts>;
|
|
157
168
|
} catch (e) {
|
|
158
|
-
|
|
169
|
+
logger.error(`could not import ${filepath}`);
|
|
159
170
|
throw e;
|
|
160
171
|
}
|
|
161
172
|
|
|
@@ -248,26 +259,30 @@ export async function executeDeployScripts<
|
|
|
248
259
|
|
|
249
260
|
for (const deployScript of scriptsToRun.concat(scriptsToRunAtTheEnd)) {
|
|
250
261
|
const filename = path.basename(deployScript.filePath);
|
|
262
|
+
const relativeFilepath = path.relative('.', deployScript.filePath);
|
|
251
263
|
// if (deployScript.func.id && this.db.migrations[deployScript.func.id]) {
|
|
252
|
-
//
|
|
264
|
+
// logger.info(`skipping ${filename} as migrations already executed and complete`);
|
|
253
265
|
// continue;
|
|
254
266
|
// }
|
|
255
267
|
let skip = false;
|
|
256
268
|
if (deployScript.func.skip) {
|
|
269
|
+
const spinner = spin(`Executing skipping function from ${filename}`);
|
|
257
270
|
try {
|
|
258
271
|
skip = await deployScript.func.skip(external);
|
|
272
|
+
spinner.succeed(skip ? `skipping ${filename}` : undefined);
|
|
259
273
|
} catch (e) {
|
|
260
|
-
|
|
274
|
+
spinner.fail();
|
|
261
275
|
throw e;
|
|
262
276
|
}
|
|
263
277
|
}
|
|
264
278
|
if (!skip) {
|
|
265
279
|
let result;
|
|
280
|
+
const spinner = spin(`Executing ${filename}`);
|
|
266
281
|
try {
|
|
267
|
-
// console.log(`Executing...`);
|
|
268
282
|
result = await deployScript.func(external);
|
|
283
|
+
spinner.succeed(`${filename} execution complete`);
|
|
269
284
|
} catch (e) {
|
|
270
|
-
|
|
285
|
+
spinner.fail();
|
|
271
286
|
throw e;
|
|
272
287
|
}
|
|
273
288
|
if (result && typeof result === 'boolean') {
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import {logs} from 'named-logs';
|
|
2
|
+
|
|
3
|
+
import {hookup, logs as Logging} from 'named-logs-console';
|
|
4
|
+
import ora from 'ora';
|
|
5
|
+
hookup();
|
|
6
|
+
|
|
7
|
+
export function setLogLevel(level: number) {
|
|
8
|
+
Logging.level = level;
|
|
9
|
+
if (Logging.level > 0) {
|
|
10
|
+
Logging.enable();
|
|
11
|
+
} else {
|
|
12
|
+
Logging.disable();
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const logger = logs('rocketh');
|
|
17
|
+
|
|
18
|
+
type PartialOra = {
|
|
19
|
+
stop(): PartialOra;
|
|
20
|
+
succeed(msg?: string): PartialOra;
|
|
21
|
+
fail(msg?: string): PartialOra;
|
|
22
|
+
};
|
|
23
|
+
const voidSpinner: PartialOra = {
|
|
24
|
+
stop() {
|
|
25
|
+
return this;
|
|
26
|
+
},
|
|
27
|
+
succeed(msg?: string) {
|
|
28
|
+
return this;
|
|
29
|
+
},
|
|
30
|
+
fail(msg?: string) {
|
|
31
|
+
return this;
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
// export function spin(message: string): PartialOra {
|
|
35
|
+
// return Logging.level > 0 ? ora(message).start() : voidSpinner;
|
|
36
|
+
// }
|
|
37
|
+
|
|
38
|
+
let lastSpin = ora('rocketh');
|
|
39
|
+
export function spin(message: string): PartialOra {
|
|
40
|
+
if (Logging.level > 0) {
|
|
41
|
+
lastSpin = lastSpin.start(message);
|
|
42
|
+
return lastSpin;
|
|
43
|
+
} else {
|
|
44
|
+
return voidSpinner;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/fs.ts","../src/executor/index.ts","../src/environment/index.ts","../src/utils/json.ts","../src/environment/deployments.ts"],"sourcesContent":["// taken from https://github.com/vitejs/vite/blob/63524bac878e8d3771d34ad7ad2e10cd16870ff4/packages/vite/src/node/utils.ts#L371-L400\nimport fs from 'node:fs';\nimport path from 'node:path';\n\ninterface LookupFileOptions {\n\tpathOnly?: boolean;\n\trootDir?: string;\n\tpredicate?: (file: string) => boolean;\n}\n\nexport function lookupFile(dir: string, formats: string[], options?: LookupFileOptions): string | undefined {\n\tfor (const format of formats) {\n\t\tconst fullPath = path.join(dir, format);\n\t\tif (fs.existsSync(fullPath) && fs.statSync(fullPath).isFile()) {\n\t\t\tconst result = options?.pathOnly ? fullPath : fs.readFileSync(fullPath, 'utf-8');\n\t\t\tif (!options?.predicate || options.predicate(result)) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t}\n\tconst parentDir = path.dirname(dir);\n\tif (parentDir !== dir && (!options?.rootDir || parentDir.startsWith(options?.rootDir))) {\n\t\treturn lookupFile(parentDir, formats, options);\n\t}\n}\n\nexport function traverseMultipleDirectory(dirs: string[]): string[] {\n\tconst filepaths = [];\n\tfor (const dir of dirs) {\n\t\tlet filesStats = traverse(dir);\n\t\tfilesStats = filesStats.filter((v) => !v.directory);\n\t\tfor (const filestat of filesStats) {\n\t\t\tfilepaths.push(path.join(dir, filestat.relativePath));\n\t\t}\n\t}\n\treturn filepaths;\n}\n\nexport const traverse = function (\n\tdir: string,\n\tresult: any[] = [],\n\ttopDir?: string,\n\tfilter?: (name: string, stats: any) => boolean // TODO any is Stats\n): Array<{\n\tname: string;\n\tpath: string;\n\trelativePath: string;\n\tmtimeMs: number;\n\tdirectory: boolean;\n}> {\n\tfs.readdirSync(dir).forEach((name) => {\n\t\tconst fPath = path.resolve(dir, name);\n\t\tconst stats = fs.statSync(fPath);\n\t\tif ((!filter && !name.startsWith('.')) || (filter && filter(name, stats))) {\n\t\t\tconst fileStats = {\n\t\t\t\tname,\n\t\t\t\tpath: fPath,\n\t\t\t\trelativePath: path.relative(topDir || dir, fPath),\n\t\t\t\tmtimeMs: stats.mtimeMs,\n\t\t\t\tdirectory: stats.isDirectory(),\n\t\t\t};\n\t\t\tif (fileStats.directory) {\n\t\t\t\tresult.push(fileStats);\n\t\t\t\treturn traverse(fPath, result, topDir || dir, filter);\n\t\t\t}\n\t\t\tresult.push(fileStats);\n\t\t}\n\t});\n\treturn result;\n};\n","import {traverseMultipleDirectory} from '../utils/fs';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport type {\n\tConfig,\n\tEnvironment,\n\tResolvedConfig,\n\tResolvedNamedAccounts,\n\tUnknownArtifacts,\n\tUnknownDeployments,\n\tUnresolvedUnknownNamedAccounts,\n} from '../environment/types';\nimport {createEnvironment} from '../environment';\nimport {DeployScriptFunction, DeployScriptModule, ProvidedContext} from './types';\n\nrequire('esbuild-register/dist/node').register();\n\nexport function execute<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(\n\tcontext: ProvidedContext<Artifacts, NamedAccounts>,\n\tcallback: DeployScriptFunction<Artifacts, ResolvedNamedAccounts<NamedAccounts>, Deployments>,\n\toptions: {tags?: string[]; dependencies?: string[]}\n): DeployScriptModule<Artifacts, NamedAccounts, Deployments> {\n\tconst scriptModule = (env: Environment<Artifacts, ResolvedNamedAccounts<NamedAccounts>, Deployments>) =>\n\t\tcallback(env);\n\tscriptModule.providedContext = context;\n\tscriptModule.tags = options.tags;\n\tscriptModule.dependencies = options.dependencies;\n\t// TODO id + skip\n\treturn scriptModule as unknown as DeployScriptModule<Artifacts, NamedAccounts, Deployments>;\n}\n\nexport type ConfigOptions = {network: string; deployments?: string; scripts?: string; tags?: string};\n\nexport function readConfig(options: ConfigOptions, extra?: {ignoreMissingRPC?: boolean}): Config {\n\ttype Networks = {[name: string]: {rpcUrl: string}};\n\ttype ConfigFile = {networks: Networks};\n\tlet configFile: ConfigFile | undefined;\n\ttry {\n\t\tconst configString = fs.readFileSync('./rocketh.json', 'utf-8');\n\t\tconfigFile = JSON.parse(configString);\n\t} catch {}\n\n\tlet nodeUrl: string;\n\tconst fromEnv = process.env['ETH_NODE_URI_' + options.network];\n\tif (typeof fromEnv === 'string') {\n\t\tnodeUrl = fromEnv;\n\t} else {\n\t\tif (configFile) {\n\t\t\tconst network = configFile.networks && configFile.networks[options.network];\n\t\t\tif (network) {\n\t\t\t\tnodeUrl = network.rpcUrl;\n\t\t\t} else {\n\t\t\t\tif (extra?.ignoreMissingRPC) {\n\t\t\t\t\tnodeUrl = '';\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(`network \"${options.network}\" is not configured. Please add it to the rocketh.json file`);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (extra?.ignoreMissingRPC) {\n\t\t\t\tnodeUrl = '';\n\t\t\t} else {\n\t\t\t\tconsole.error(`network \"${options.network}\" is not configured. Please add it to the rocketh.json file`);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tnodeUrl,\n\t\tnetworkName: options.network,\n\t\tdeployments: options.deployments,\n\t\tscripts: options.scripts,\n\t\ttags: typeof options.tags === 'undefined' ? undefined : options.tags.split(','),\n\t};\n}\n\nexport function readAndResolveConfig(options: ConfigOptions, extra?: {ignoreMissingRPC?: boolean}): ResolvedConfig {\n\treturn resolveConfig(readConfig(options, extra));\n}\n\nexport function resolveConfig(config: Config): ResolvedConfig {\n\tconst resolvedConfig: ResolvedConfig = {\n\t\t...config,\n\t\tnetworkName: config.networkName || 'memory',\n\t\tdeployments: config.deployments || 'deployments',\n\t\tscripts: config.scripts || 'deploy',\n\t\ttags: config.tags || [],\n\t};\n\treturn resolvedConfig;\n}\n\nexport async function loadAndExecuteDeployments<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(config: Config) {\n\tconst resolvedConfig = resolveConfig(config);\n\n\treturn executeDeployScripts<Artifacts, NamedAccounts, Deployments>(resolvedConfig);\n\n\t// TODO\n\t// await this.export(options);\n}\n\nexport async function executeDeployScripts<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(config: ResolvedConfig): Promise<Deployments> {\n\tlet filepaths;\n\tfilepaths = traverseMultipleDirectory([config.scripts]);\n\tfilepaths = filepaths\n\t\t.filter((v) => !path.basename(v).startsWith('_'))\n\t\t.sort((a: string, b: string) => {\n\t\t\tif (a < b) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (a > b) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\treturn 0;\n\t\t});\n\n\tlet providedContext: ProvidedContext<Artifacts, NamedAccounts> | undefined;\n\n\tconst scriptModuleByFilePath: {[filename: string]: DeployScriptModule} = {};\n\tconst scriptPathBags: {[tag: string]: string[]} = {};\n\tconst scriptFilePaths: string[] = [];\n\n\tfor (const filepath of filepaths) {\n\t\tconst scriptFilePath = path.resolve(filepath);\n\t\tlet scriptModule: DeployScriptModule;\n\t\ttry {\n\t\t\tif (require.cache) {\n\t\t\t\tdelete require.cache[scriptFilePath]; // ensure we reload it every time, so changes are taken in consideration\n\t\t\t}\n\t\t\tscriptModule = require(scriptFilePath);\n\n\t\t\tif ((scriptModule as any).default) {\n\t\t\t\tscriptModule = (scriptModule as any).default as DeployScriptModule;\n\t\t\t\tif ((scriptModule as any).default) {\n\t\t\t\t\tconsole.warn(`double default...`);\n\t\t\t\t\tscriptModule = (scriptModule as any).default as DeployScriptModule;\n\t\t\t\t}\n\t\t\t}\n\t\t\tscriptModuleByFilePath[scriptFilePath] = scriptModule;\n\t\t\tif (providedContext && providedContext !== scriptModule.providedContext) {\n\t\t\t\tthrow new Error(`context between 2 scripts is different, please share the same across them`);\n\t\t\t}\n\t\t\tprovidedContext = scriptModule.providedContext as ProvidedContext<Artifacts, NamedAccounts>;\n\t\t} catch (e) {\n\t\t\tconsole.error(`could not import ${filepath}`);\n\t\t\tthrow e;\n\t\t}\n\n\t\tlet scriptTags = scriptModule.tags;\n\t\tif (scriptTags !== undefined) {\n\t\t\tif (typeof scriptTags === 'string') {\n\t\t\t\tscriptTags = [scriptTags];\n\t\t\t}\n\t\t\tfor (const tag of scriptTags) {\n\t\t\t\tif (tag.indexOf(',') >= 0) {\n\t\t\t\t\tthrow new Error('Tag cannot contains commas');\n\t\t\t\t}\n\t\t\t\tconst bag = scriptPathBags[tag] || [];\n\t\t\t\tscriptPathBags[tag] = bag;\n\t\t\t\tbag.push(scriptFilePath);\n\t\t\t}\n\t\t}\n\n\t\tif (config.tags !== undefined && config.tags.length > 0) {\n\t\t\tlet found = false;\n\t\t\tif (scriptTags !== undefined) {\n\t\t\t\tfor (const tagToFind of config.tags) {\n\t\t\t\t\tfor (const tag of scriptTags) {\n\t\t\t\t\t\tif (tag === tagToFind) {\n\t\t\t\t\t\t\tscriptFilePaths.push(scriptFilePath);\n\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (found) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tscriptFilePaths.push(scriptFilePath);\n\t\t}\n\t}\n\n\tif (!providedContext) {\n\t\tthrow new Error(`no context loaded`);\n\t}\n\n\tconst {internal, external} = await createEnvironment(config, providedContext);\n\n\tawait internal.recoverTransactionsIfAny();\n\n\tconst scriptsRegisteredToRun: {[filename: string]: boolean} = {};\n\tconst scriptsToRun: Array<{\n\t\tfunc: DeployScriptModule;\n\t\tfilePath: string;\n\t}> = [];\n\tconst scriptsToRunAtTheEnd: Array<{\n\t\tfunc: DeployScriptModule;\n\t\tfilePath: string;\n\t}> = [];\n\tfunction recurseDependencies(scriptFilePath: string) {\n\t\tif (scriptsRegisteredToRun[scriptFilePath]) {\n\t\t\treturn;\n\t\t}\n\t\tconst scriptModule = scriptModuleByFilePath[scriptFilePath];\n\t\tif (scriptModule.dependencies) {\n\t\t\tfor (const dependency of scriptModule.dependencies) {\n\t\t\t\tconst scriptFilePathsToAdd = scriptPathBags[dependency];\n\t\t\t\tif (scriptFilePathsToAdd) {\n\t\t\t\t\tfor (const scriptFilenameToAdd of scriptFilePathsToAdd) {\n\t\t\t\t\t\trecurseDependencies(scriptFilenameToAdd);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!scriptsRegisteredToRun[scriptFilePath]) {\n\t\t\tif (scriptModule.runAtTheEnd) {\n\t\t\t\tscriptsToRunAtTheEnd.push({\n\t\t\t\t\tfilePath: scriptFilePath,\n\t\t\t\t\tfunc: scriptModule,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tscriptsToRun.push({\n\t\t\t\t\tfilePath: scriptFilePath,\n\t\t\t\t\tfunc: scriptModule,\n\t\t\t\t});\n\t\t\t}\n\t\t\tscriptsRegisteredToRun[scriptFilePath] = true;\n\t\t}\n\t}\n\tfor (const scriptFilePath of scriptFilePaths) {\n\t\trecurseDependencies(scriptFilePath);\n\t}\n\n\tfor (const deployScript of scriptsToRun.concat(scriptsToRunAtTheEnd)) {\n\t\tconst filename = path.basename(deployScript.filePath);\n\t\t// if (deployScript.func.id && this.db.migrations[deployScript.func.id]) {\n\t\t// \tlog(`skipping ${filename} as migrations already executed and complete`);\n\t\t// \tcontinue;\n\t\t// }\n\t\tlet skip = false;\n\t\tif (deployScript.func.skip) {\n\t\t\ttry {\n\t\t\t\tskip = await deployScript.func.skip(external);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(`skip failed for ${deployScript.filePath}`);\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\t\tif (!skip) {\n\t\t\tlet result;\n\t\t\ttry {\n\t\t\t\t// console.log(`Executing...`);\n\t\t\t\tresult = await deployScript.func(external);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(`execution failed for ${deployScript.filePath}`);\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\tif (result && typeof result === 'boolean') {\n\t\t\t\t// if (!deployScript.func.id) {\n\t\t\t\t// \tthrow new Error(\n\t\t\t\t// \t\t`${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`\n\t\t\t\t// \t);\n\t\t\t\t// }\n\t\t\t\t// this.db.migrations[deployScript.func.id] = Math.floor(Date.now() / 1000);\n\n\t\t\t\tconst deploymentFolderPath = config.deployments;\n\n\t\t\t\t// TODO refactor to extract this whole path and folder existence stuff\n\t\t\t\t// const toSave = this.db.writeDeploymentsToFiles && this.network.saveDeployments;\n\t\t\t\t// if (toSave) {\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tfs.mkdirSync(this.deploymentsPath);\n\t\t\t\t// \t} catch (e) {}\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tfs.mkdirSync(path.join(this.deploymentsPath, deploymentFolderPath));\n\t\t\t\t// \t} catch (e) {}\n\t\t\t\t// \tfs.writeFileSync(\n\t\t\t\t// \t\tpath.join(this.deploymentsPath, deploymentFolderPath, '.migrations.json'),\n\t\t\t\t// \t\tJSON.stringify(this.db.migrations, null, ' ')\n\t\t\t\t// \t);\n\t\t\t\t// }\n\t\t\t}\n\t\t}\n\t}\n\n\treturn external.deployments as Deployments;\n}\n","import fs from 'node:fs';\n\nimport {createPublicClient, custom} from 'viem';\nimport {\n\tAccountType,\n\tDeployment,\n\tEnvironment,\n\tNamedSigner,\n\tPendingDeployment,\n\tResolvedAccount,\n\tResolvedConfig,\n\tResolvedNamedAccounts,\n\tResolvedNamedSigners,\n\tUnknownArtifacts,\n\tUnknownDeployments,\n\tUnresolvedUnknownNamedAccounts,\n} from './types';\nimport {JSONRPCHTTPProvider} from 'eip-1193-json-provider';\nimport {Abi} from 'abitype';\nimport {InternalEnvironment} from '../internal/types';\nimport path from 'node:path';\nimport {JSONToString, stringToJSON} from '../utils/json';\nimport {loadDeployments} from './deployments';\nimport {EIP1193Account, EIP1193ProviderWithoutEvents} from 'eip-1193';\nimport {ProvidedContext} from '../executor/types';\n\nexport type EnvironmentExtenstion = (env: Environment) => Environment;\n//we store this globally so this is not lost\n(globalThis as any).extensions = [];\nexport function extendEnvironment(extension: EnvironmentExtenstion): void {\n\t(globalThis as any).extensions.push(extension);\n}\n\nexport type SignerProtocolFunction = (protocolString: string) => Promise<NamedSigner>;\nexport type SignerProtocol = {\n\tgetSigner: SignerProtocolFunction;\n};\n\n//we store this globally so this is not lost\n(globalThis as any).signerProtocols = {};\nexport function handleSignerProtocol(protocol: string, getSigner: SignerProtocolFunction): void {\n\t(globalThis as any).signerProtocols[protocol] = {\n\t\tgetSigner,\n\t};\n}\n\nexport async function createEnvironment<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(\n\tconfig: ResolvedConfig,\n\tprovidedContext: ProvidedContext<Artifacts, NamedAccounts>\n): Promise<{internal: InternalEnvironment; external: Environment}> {\n\tconst provider =\n\t\t'provider' in config ? config.provider : (new JSONRPCHTTPProvider(config.nodeUrl) as EIP1193ProviderWithoutEvents);\n\n\tconst transport = custom(provider);\n\tconst viemClient = createPublicClient({transport});\n\n\tconst chainId = (await viemClient.getChainId()).toString();\n\n\tlet networkName: string;\n\tlet saveDeployments: boolean;\n\tlet tags: {[tag: string]: boolean} = {};\n\tif ('nodeUrl' in config) {\n\t\tnetworkName = config.networkName;\n\t\tsaveDeployments = true;\n\t} else {\n\t\tif (config.networkName) {\n\t\t\tnetworkName = config.networkName;\n\t\t} else {\n\t\t\tnetworkName = 'memory';\n\t\t}\n\t\tif (networkName === 'memory' || networkName === 'hardhat') {\n\t\t\ttags['memory'] = true;\n\t\t\tsaveDeployments = false;\n\t\t} else {\n\t\t\tsaveDeployments = true;\n\t\t}\n\t}\n\n\tconst resolvedAccounts: {[name: string]: ResolvedAccount} = {};\n\n\tconst accountCache: {[name: string]: ResolvedAccount} = {};\n\tasync function getAccount(\n\t\tname: string,\n\t\taccounts: UnresolvedUnknownNamedAccounts,\n\t\taccountDef: AccountType\n\t): Promise<ResolvedAccount | undefined> {\n\t\tif (accountCache[name]) {\n\t\t\treturn accountCache[name];\n\t\t}\n\t\tlet account: ResolvedAccount | undefined;\n\t\tif (typeof accountDef === 'number') {\n\t\t\tconst accounts = await provider.request({method: 'eth_accounts'});\n\t\t\tconst accountPerIndex = accounts[accountDef];\n\t\t\tif (accountPerIndex) {\n\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\ttype: 'remote',\n\t\t\t\t\taddress: accountPerIndex,\n\t\t\t\t\tsigner: provider,\n\t\t\t\t};\n\t\t\t}\n\t\t} else if (typeof accountDef === 'string') {\n\t\t\tif (accountDef.startsWith('0x')) {\n\t\t\t\tif (accountDef.length === 66) {\n\t\t\t\t\tconst privateKeyProtocol: SignerProtocol = (globalThis as any).signerProtocols['privateKey'];\n\t\t\t\t\tif (privateKeyProtocol) {\n\t\t\t\t\t\tconst namedSigner = await privateKeyProtocol.getSigner(`privateKey:${accountDef}`);\n\t\t\t\t\t\tconst [address] = await namedSigner.signer.request({method: 'eth_accounts'});\n\t\t\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\t\t\t...namedSigner,\n\t\t\t\t\t\t\taddress,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\t\ttype: 'remote',\n\t\t\t\t\t\taddress: accountDef as `0x${string}`,\n\t\t\t\t\t\tsigner: provider,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (accountDef.indexOf(':') > 0) {\n\t\t\t\t\tconst [protocolID, extra] = accountDef.split(':');\n\t\t\t\t\tconst protocol: SignerProtocol = (globalThis as any).signerProtocols[protocolID];\n\t\t\t\t\tif (!protocol) {\n\t\t\t\t\t\tthrow new Error(`protocol: ${protocol} is not supported`);\n\t\t\t\t\t}\n\t\t\t\t\tconst namedSigner = await protocol.getSigner(accountDef);\n\t\t\t\t\tconst [address] = await namedSigner.signer.request({method: 'eth_accounts'});\n\t\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\t\t...namedSigner,\n\t\t\t\t\t\taddress,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tconst accountFetched = await getAccount(name, accounts, accounts[accountDef]);\n\t\t\t\t\tif (accountFetched) {\n\t\t\t\t\t\taccountCache[name] = account = accountFetched;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst accountForNetwork = accountDef[networkName] || accountDef[chainId] || accountDef['default'];\n\t\t\tif (accountForNetwork) {\n\t\t\t\tconst accountFetched = await getAccount(name, accounts, accountForNetwork);\n\t\t\t\tif (accountFetched) {\n\t\t\t\t\taccountCache[name] = account = accountFetched;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn account;\n\t}\n\n\tif (providedContext.accounts) {\n\t\tconst accountNames = Object.keys(providedContext.accounts);\n\t\tfor (const accountName of accountNames) {\n\t\t\tlet account = await getAccount(accountName, providedContext.accounts, providedContext.accounts[accountName]);\n\t\t\t(resolvedAccounts as any)[accountName] = account;\n\t\t}\n\t}\n\n\tconst context = {\n\t\taccounts: resolvedAccounts,\n\t\tartifacts: providedContext.artifacts as Artifacts,\n\t\tnetwork: {\n\t\t\tname: networkName,\n\t\t\tsaveDeployments,\n\t\t\ttags,\n\t\t},\n\t};\n\n\tconst {deployments} = loadDeployments(config.deployments, context.network.name, false, chainId);\n\n\tconst namedAccounts: {[name: string]: EIP1193Account} = {};\n\tconst namedSigners: {[name: string]: NamedSigner} = {};\n\tconst addressSigners: {[name: `0x${string}`]: NamedSigner} = {};\n\n\tfor (const entry of Object.entries(resolvedAccounts)) {\n\t\tconst name = entry[0];\n\t\tconst {address, ...namedSigner} = entry[1];\n\t\tnamedAccounts[name] = address;\n\t\taddressSigners[address] = namedSigner;\n\t\tnamedSigners[name] = namedSigner;\n\t}\n\n\tconst perliminaryEnvironment = {\n\t\tconfig,\n\t\tdeployments: deployments as Deployments,\n\t\taccounts: namedAccounts as ResolvedNamedAccounts<NamedAccounts>,\n\t\tsigners: namedSigners as ResolvedNamedSigners<ResolvedNamedAccounts<NamedAccounts>>,\n\t\taddressSigners: addressSigners,\n\t\tartifacts: context.artifacts,\n\t\tnetwork: {\n\t\t\tchainId,\n\t\t\tname: context.network.name,\n\t\t\ttags: context.network.tags,\n\t\t\tprovider,\n\t\t},\n\t};\n\n\tfunction ensureDeploymentFolder(): string {\n\t\tconst folderPath = path.join(config.deployments, context.network.name);\n\t\tfs.mkdirSync(folderPath, {recursive: true});\n\t\tconst chainIdFilepath = path.join(folderPath, '.chainId');\n\t\tif (!fs.existsSync(chainIdFilepath)) {\n\t\t\tfs.writeFileSync(chainIdFilepath, chainId);\n\t\t}\n\t\treturn folderPath;\n\t}\n\n\t// const signer = {\n\t// \tasync sendTransaction(\n\t// \t\tprovider: EIP1193ProviderWithoutEvents,\n\t// \t\taccount: {\n\t// \t\t\taddresss: EIP1193Account;\n\t// \t\t\tconfig: unknown;\n\t// \t\t},\n\t// \t\ttransaction: EIP1193TransactionEIP1193DATA\n\t// \t): Promise<EIP1193DATA> {\n\t// \t\treturn '0x';\n\t// \t},\n\t// };\n\n\t// async function sendTransaction(transaction: EIP1193TransactionEIP1193DATA): Promise<EIP1193DATA> {\n\t// \treturn '0x';\n\t// }\n\n\tfunction get<TAbi extends Abi>(name: string): Deployment<TAbi> | undefined {\n\t\treturn deployments[name] as Deployment<TAbi> | undefined;\n\t}\n\n\tasync function save<TAbi extends Abi>(name: string, deployment: Deployment<TAbi>): Promise<Deployment<TAbi>> {\n\t\tdeployments[name] = deployment;\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst folderPath = ensureDeploymentFolder();\n\t\t\tfs.writeFileSync(`${folderPath}/${name}.json`, JSONToString(deployment, 2));\n\t\t}\n\t\treturn deployment;\n\t}\n\n\tasync function recoverTransactionsIfAny<TAbi extends Abi = Abi>(): Promise<void> {\n\t\tconst filepath = path.join(config.deployments, context.network.name, '.pending_transactions.json');\n\t\tlet existingPendingDeployments: {name: string; transaction: PendingDeployment<TAbi>}[];\n\t\ttry {\n\t\t\texistingPendingDeployments = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t} catch {\n\t\t\texistingPendingDeployments = [];\n\t\t}\n\t\tif (existingPendingDeployments.length > 0) {\n\t\t\twhile (existingPendingDeployments.length > 0) {\n\t\t\t\tconst pendingTransaction = existingPendingDeployments.shift();\n\t\t\t\tif (pendingTransaction) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`recovering ${pendingTransaction.name} with transaction ${pendingTransaction.transaction.txHash}`\n\t\t\t\t\t);\n\t\t\t\t\tawait waitForTransactionAndSave(pendingTransaction.name, pendingTransaction.transaction);\n\t\t\t\t\tconsole.log(`transaction ${pendingTransaction.transaction.txHash} complete`);\n\t\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingDeployments, 2));\n\t\t\t\t}\n\t\t\t}\n\t\t\tfs.rmSync(filepath);\n\t\t}\n\t}\n\n\tasync function saveTransaction<TAbi extends Abi = Abi>(name: string, transaction: PendingDeployment<TAbi>) {\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst folderPath = ensureDeploymentFolder();\n\t\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\t\tlet existingPendingDeployments: {name: string; transaction: PendingDeployment<TAbi>}[];\n\t\t\ttry {\n\t\t\t\texistingPendingDeployments = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendingDeployments = [];\n\t\t\t}\n\t\t\texistingPendingDeployments.push({name, transaction});\n\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingDeployments, 2));\n\t\t}\n\t\treturn deployments;\n\t}\n\n\tasync function deleteTransaction<TAbi extends Abi = Abi>(hash: string) {\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst filepath = path.join(config.deployments, context.network.name, '.pending_transactions.json');\n\t\t\tlet existingPendingDeployments: {name: string; transaction: PendingDeployment<TAbi>}[];\n\t\t\ttry {\n\t\t\t\texistingPendingDeployments = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendingDeployments = [];\n\t\t\t}\n\t\t\texistingPendingDeployments = existingPendingDeployments.filter((v) => v.transaction.txHash !== hash);\n\t\t\tif (existingPendingDeployments.length === 0) {\n\t\t\t\tfs.rmSync(filepath);\n\t\t\t} else {\n\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingDeployments, 2));\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function exportDeploymentsAsTypes() {\n\t\tconst folderPath = './generated';\n\t\tfs.mkdirSync(folderPath, {recursive: true});\n\t\tfs.writeFileSync(`${folderPath}/deployments.ts`, `export default ${JSONToString(deployments, 2)} as const;`);\n\t}\n\n\tasync function waitForTransactionAndSave<TAbi extends Abi = Abi>(\n\t\tname: string,\n\t\tpendingDeployment: PendingDeployment<TAbi>\n\t): Promise<Deployment<TAbi>> {\n\t\tconst receipt = await viemClient.waitForTransactionReceipt({\n\t\t\thash: pendingDeployment.txHash,\n\t\t});\n\n\t\tif (!receipt.contractAddress) {\n\t\t\tthrow new Error(`failed to deploy contract ${name}`);\n\t\t}\n\t\tconst {abi, ...artifactObjectWithoutABI} = pendingDeployment.partialDeployment;\n\n\t\tif (!artifactObjectWithoutABI.nonce) {\n\t\t\tconst transaction = await provider.request({\n\t\t\t\tmethod: 'eth_getTransactionByHash',\n\t\t\t\tparams: [pendingDeployment.txHash],\n\t\t\t});\n\t\t\tif (transaction) {\n\t\t\t\tartifactObjectWithoutABI.nonce = transaction.nonce;\n\t\t\t\tartifactObjectWithoutABI.txOrigin = transaction.from;\n\t\t\t}\n\t\t}\n\n\t\t// TODO options\n\t\tfor (const key of Object.keys(artifactObjectWithoutABI)) {\n\t\t\tif (key.startsWith('_')) {\n\t\t\t\tdelete (artifactObjectWithoutABI as any)[key];\n\t\t\t}\n\t\t\tif (key === 'evm') {\n\t\t\t\tconst {gasEstimates} = artifactObjectWithoutABI.evm;\n\t\t\t\tartifactObjectWithoutABI.evm = {\n\t\t\t\t\tgasEstimates,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst deployment = {\n\t\t\taddress: receipt.contractAddress,\n\t\t\ttxHash: pendingDeployment.txHash,\n\t\t\tabi,\n\t\t\t...artifactObjectWithoutABI,\n\t\t};\n\t\treturn save(name, deployment);\n\t}\n\n\tasync function saveWhilePending<TAbi extends Abi = Abi>(name: string, pendingDeployment: PendingDeployment<TAbi>) {\n\t\tawait saveTransaction<TAbi>(name, pendingDeployment);\n\t\tconst transaction = await provider.request({\n\t\t\tmethod: 'eth_getTransactionByHash',\n\t\t\tparams: [pendingDeployment.txHash],\n\t\t});\n\n\t\tconst deployment = waitForTransactionAndSave<TAbi>(\n\t\t\tname,\n\t\t\ttransaction\n\t\t\t\t? {\n\t\t\t\t\t\t...pendingDeployment,\n\t\t\t\t\t\tnonce: transaction.nonce,\n\t\t\t\t\t\ttxOrigin: transaction.from,\n\t\t\t\t }\n\t\t\t\t: pendingDeployment\n\t\t);\n\t\tawait deleteTransaction(pendingDeployment.txHash);\n\t\treturn deployment;\n\t}\n\n\tlet env: Environment<Artifacts, NamedAccounts, Deployments> = {\n\t\t...perliminaryEnvironment,\n\t\tsave,\n\t\tsaveWhilePending,\n\t\tget,\n\t};\n\tfor (const extension of (globalThis as any).extensions) {\n\t\tenv = extension(env);\n\t}\n\n\treturn {\n\t\texternal: env,\n\t\tinternal: {\n\t\t\texportDeploymentsAsTypes,\n\t\t\trecoverTransactionsIfAny,\n\t\t},\n\t};\n}\n","// TODO share with db-utils\nexport function bnReplacer(k: string, v: any): any {\n\tif (typeof v === 'bigint') {\n\t\treturn v.toString() + 'n';\n\t}\n\treturn v;\n}\n\nexport function bnReviver(k: string, v: any): any {\n\tif (\n\t\ttypeof v === 'string' &&\n\t\t(v.startsWith('-') ? !isNaN(parseInt(v.charAt(1))) : !isNaN(parseInt(v.charAt(0)))) &&\n\t\tv.charAt(v.length - 1) === 'n'\n\t) {\n\t\treturn BigInt(v.slice(0, -1));\n\t}\n\treturn v;\n}\n\nexport function JSONToString<T = unknown>(json: unknown, space?: string | number) {\n\treturn JSON.stringify(json, bnReplacer, space);\n}\n\nexport function stringToJSON<T = unknown>(str: string): T {\n\treturn JSON.parse(str, bnReviver);\n}\n","import path from 'node:path';\nimport fs from 'node:fs';\nimport {traverse} from '../utils/fs';\nimport {UnknownDeployments} from './types';\n\nexport function loadDeployments(\n\tdeploymentsPath: string,\n\tsubPath: string,\n\tonlyABIAndAddress?: boolean,\n\texpectedChainId?: string\n): {deployments: UnknownDeployments; chainId?: string} {\n\tconst deploymentsFound: UnknownDeployments = {};\n\tconst deployPath = path.join(deploymentsPath, subPath);\n\n\tlet filesStats;\n\ttry {\n\t\tfilesStats = traverse(deployPath, undefined, undefined, (name) => !name.startsWith('.') && name !== 'solcInputs');\n\t} catch (e) {\n\t\t// console.log('no folder at ' + deployPath);\n\t\treturn {deployments: {}};\n\t}\n\tlet chainId: string;\n\tif (filesStats.length > 0) {\n\t\tconst chainIdFilepath = path.join(deployPath, '.chainId');\n\t\tif (fs.existsSync(chainIdFilepath)) {\n\t\t\tchainId = fs.readFileSync(chainIdFilepath).toString().trim();\n\t\t} else {\n\t\t\tthrow new Error(`A .chainId' file is expected to be present in the deployment folder for network ${subPath}`);\n\t\t}\n\n\t\tif (expectedChainId) {\n\t\t\tif (expectedChainId !== chainId) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Loading deployment in folder '${deployPath}' (with chainId: ${chainId}) for a different chainId (${expectedChainId})`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} else {\n\t\treturn {deployments: {}};\n\t}\n\tlet fileNames = filesStats.map((a) => a.relativePath);\n\tfileNames = fileNames.sort((a, b) => {\n\t\tif (a < b) {\n\t\t\treturn -1;\n\t\t}\n\t\tif (a > b) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t});\n\n\tfor (const fileName of fileNames) {\n\t\tif (fileName.substring(fileName.length - 5) === '.json') {\n\t\t\tconst deploymentFileName = path.join(deployPath, fileName);\n\t\t\tlet deployment = JSON.parse(fs.readFileSync(deploymentFileName).toString());\n\t\t\t// truffleChainId argument:\n\t\t\t// if (!deployment.address && deployment.networks) {\n\t\t\t// \tif (truffleChainId && deployment.networks[truffleChainId]) {\n\t\t\t// \t\t// TRUFFLE support\n\t\t\t// \t\tconst truffleDeployment = deployment as any; // TruffleDeployment;\n\t\t\t// \t\tdeployment.address = truffleDeployment.networks[truffleChainId].address;\n\t\t\t// \t\tdeployment.transactionHash = truffleDeployment.networks[truffleChainId].transactionHash;\n\t\t\t// \t}\n\t\t\t// }\n\t\t\tif (onlyABIAndAddress) {\n\t\t\t\tdeployment = {\n\t\t\t\t\taddress: deployment.address,\n\t\t\t\t\tabi: deployment.abi,\n\t\t\t\t\tlinkedData: deployment.linkedData,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst name = fileName.slice(0, fileName.length - 5);\n\t\t\t// console.log('fetching ' + deploymentFileName + ' for ' + name);\n\n\t\t\tdeploymentsFound[name] = deployment;\n\t\t}\n\t}\n\treturn {deployments: deploymentsFound, chainId};\n}\n"],"mappings":"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","names":["path","fs","fs","path","path","fs","path","fs","accounts","path","fs","fs","path"]}
|