rocketh 0.5.2 → 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 CHANGED
@@ -1,5 +1,11 @@
1
1
  # rocketh
2
2
 
3
+ ## 0.5.3
4
+
5
+ ### Patch Changes
6
+
7
+ - add logging
8
+
3
9
  ## 0.5.2
4
10
 
5
11
  ### Patch Changes
@@ -130,6 +130,41 @@ function loadDeployments(deploymentsPath, subPath, onlyABIAndAddress, expectedCh
130
130
  return { deployments: deploymentsFound, chainId };
131
131
  }
132
132
 
133
+ // src/internal/logging.ts
134
+ import { logs } from "named-logs";
135
+ import { hookup, logs as Logging } from "named-logs-console";
136
+ import ora from "ora";
137
+ hookup();
138
+ function setLogLevel(level) {
139
+ Logging.level = level;
140
+ if (Logging.level > 0) {
141
+ Logging.enable();
142
+ } else {
143
+ Logging.disable();
144
+ }
145
+ }
146
+ var logger = logs("rocketh");
147
+ var voidSpinner = {
148
+ stop() {
149
+ return this;
150
+ },
151
+ succeed(msg) {
152
+ return this;
153
+ },
154
+ fail(msg) {
155
+ return this;
156
+ }
157
+ };
158
+ var lastSpin = ora("rocketh");
159
+ function spin(message) {
160
+ if (Logging.level > 0) {
161
+ lastSpin = lastSpin.start(message);
162
+ return lastSpin;
163
+ } else {
164
+ return voidSpinner;
165
+ }
166
+ }
167
+
133
168
  // src/environment/index.ts
134
169
  globalThis.extensions = [];
135
170
  function extendEnvironment(extension) {
@@ -141,6 +176,15 @@ function handleSignerProtocol(protocol, getSigner) {
141
176
  getSigner
142
177
  };
143
178
  }
179
+ function displayTransaction(transaction) {
180
+ if (transaction.type === "0x2") {
181
+ return `(maxFeePerGas: ${BigInt(transaction.maxFeePerGas).toString()}, maxPriorityFeePerGas: ${BigInt(
182
+ transaction.maxPriorityFeePerGas
183
+ ).toString()})`;
184
+ } else {
185
+ return `(gasPrice: ${BigInt(transaction.gasPrice).toString()})`;
186
+ }
187
+ }
144
188
  async function createEnvironment(config, providedContext) {
145
189
  const provider = "provider" in config ? config.provider : new JSONRPCHTTPProvider(config.nodeUrl);
146
190
  const transport = custom(provider);
@@ -305,12 +349,18 @@ async function createEnvironment(config, providedContext) {
305
349
  while (existingPendingDeployments.length > 0) {
306
350
  const pendingTransaction = existingPendingDeployments.shift();
307
351
  if (pendingTransaction) {
308
- console.log(
352
+ const spinner = spin(
309
353
  `recovering ${pendingTransaction.name} with transaction ${pendingTransaction.transaction.txHash}`
310
354
  );
311
- await waitForTransactionAndSave(pendingTransaction.name, pendingTransaction.transaction);
312
- console.log(`transaction ${pendingTransaction.transaction.txHash} complete`);
313
- fs3.writeFileSync(filepath, JSONToString(existingPendingDeployments, 2));
355
+ try {
356
+ await waitForTransactionAndSave(pendingTransaction.name, pendingTransaction.transaction);
357
+ console.log(`transaction ${pendingTransaction.transaction.txHash} complete`);
358
+ fs3.writeFileSync(filepath, JSONToString(existingPendingDeployments, 2));
359
+ spinner.succeed();
360
+ } catch (e) {
361
+ spinner.fail();
362
+ throw e;
363
+ }
314
364
  }
315
365
  }
316
366
  fs3.rmSync(filepath);
@@ -353,22 +403,46 @@ async function createEnvironment(config, providedContext) {
353
403
  fs3.mkdirSync(folderPath, { recursive: true });
354
404
  fs3.writeFileSync(`${folderPath}/deployments.ts`, `export default ${JSONToString(deployments, 2)} as const;`);
355
405
  }
356
- async function waitForTransactionAndSave(name, pendingDeployment) {
357
- const receipt = await viemClient.waitForTransactionReceipt({
358
- hash: pendingDeployment.txHash
359
- });
406
+ async function waitForTransactionAndSave(name, pendingDeployment, transaction) {
407
+ const spinner = spin(`tx ${pendingDeployment.txHash}${transaction ? ` ${displayTransaction(transaction)}` : ""}`);
408
+ let receipt;
409
+ try {
410
+ receipt = await viemClient.waitForTransactionReceipt({
411
+ hash: pendingDeployment.txHash
412
+ });
413
+ } catch (e) {
414
+ spinner.fail();
415
+ throw e;
416
+ }
417
+ if (!receipt) {
418
+ spinner.fail(`receipt for ${pendingDeployment.txHash} not found`);
419
+ } else {
420
+ spinner.succeed();
421
+ }
360
422
  if (!receipt.contractAddress) {
361
423
  throw new Error(`failed to deploy contract ${name}`);
362
424
  }
363
425
  const { abi, ...artifactObjectWithoutABI } = pendingDeployment.partialDeployment;
364
426
  if (!artifactObjectWithoutABI.nonce) {
365
- const transaction = await provider.request({
366
- method: "eth_getTransactionByHash",
367
- params: [pendingDeployment.txHash]
368
- });
369
- if (transaction) {
370
- artifactObjectWithoutABI.nonce = transaction.nonce;
371
- artifactObjectWithoutABI.txOrigin = transaction.from;
427
+ const spinner2 = spin(`fetching nonce for ${pendingDeployment.txHash}`);
428
+ let transaction2 = null;
429
+ try {
430
+ transaction2 = await provider.request({
431
+ method: "eth_getTransactionByHash",
432
+ params: [pendingDeployment.txHash]
433
+ });
434
+ } catch (e) {
435
+ spinner2.fail();
436
+ throw e;
437
+ }
438
+ if (!transaction2) {
439
+ spinner2.fail(`tx ${pendingDeployment.txHash} not found`);
440
+ } else {
441
+ spinner2.stop();
442
+ }
443
+ if (transaction2) {
444
+ artifactObjectWithoutABI.nonce = transaction2.nonce;
445
+ artifactObjectWithoutABI.txOrigin = transaction2.from;
372
446
  }
373
447
  }
374
448
  for (const key of Object.keys(artifactObjectWithoutABI)) {
@@ -392,17 +466,30 @@ async function createEnvironment(config, providedContext) {
392
466
  }
393
467
  async function saveWhilePending(name, pendingDeployment) {
394
468
  await saveTransaction(name, pendingDeployment);
395
- const transaction = await provider.request({
396
- method: "eth_getTransactionByHash",
397
- params: [pendingDeployment.txHash]
398
- });
469
+ let transaction = null;
470
+ const spinner = spin(`fetching tx from peers ${pendingDeployment.txHash}`);
471
+ try {
472
+ transaction = await provider.request({
473
+ method: "eth_getTransactionByHash",
474
+ params: [pendingDeployment.txHash]
475
+ });
476
+ } catch (e) {
477
+ spinner.fail();
478
+ throw e;
479
+ }
480
+ if (!transaction) {
481
+ spinner.fail(`tx ${pendingDeployment.txHash} not found`);
482
+ } else {
483
+ spinner.stop();
484
+ }
399
485
  const deployment = waitForTransactionAndSave(
400
486
  name,
401
487
  transaction ? {
402
488
  ...pendingDeployment,
403
489
  nonce: transaction.nonce,
404
490
  txOrigin: transaction.from
405
- } : pendingDeployment
491
+ } : pendingDeployment,
492
+ transaction
406
493
  );
407
494
  await deleteTransaction(pendingDeployment.txHash);
408
495
  return deployment;
@@ -454,16 +541,24 @@ function readConfig(options, extra) {
454
541
  if (extra?.ignoreMissingRPC) {
455
542
  nodeUrl = "";
456
543
  } else {
457
- console.error(`network "${options.network}" is not configured. Please add it to the rocketh.json file`);
458
- process.exit(1);
544
+ if (options.network === "localhost") {
545
+ nodeUrl = "http://127.0.0.1:8545";
546
+ } else {
547
+ logger.error(`network "${options.network}" is not configured. Please add it to the rocketh.json file`);
548
+ process.exit(1);
549
+ }
459
550
  }
460
551
  }
461
552
  } else {
462
553
  if (extra?.ignoreMissingRPC) {
463
554
  nodeUrl = "";
464
555
  } else {
465
- console.error(`network "${options.network}" is not configured. Please add it to the rocketh.json file`);
466
- process.exit(1);
556
+ if (options.network === "localhost") {
557
+ nodeUrl = "http://127.0.0.1:8545";
558
+ } else {
559
+ logger.error(`network "${options.network}" is not configured. Please add it to the rocketh.json file`);
560
+ process.exit(1);
561
+ }
467
562
  }
468
563
  }
469
564
  }
@@ -493,6 +588,7 @@ async function loadAndExecuteDeployments(config) {
493
588
  return executeDeployScripts(resolvedConfig);
494
589
  }
495
590
  async function executeDeployScripts(config) {
591
+ setLogLevel(typeof config.logLevel === "undefined" ? 0 : config.logLevel);
496
592
  let filepaths;
497
593
  filepaths = traverseMultipleDirectory([config.scripts]);
498
594
  filepaths = filepaths.filter((v) => !path4.basename(v).startsWith("_")).sort((a, b) => {
@@ -519,7 +615,7 @@ async function executeDeployScripts(config) {
519
615
  if (scriptModule.default) {
520
616
  scriptModule = scriptModule.default;
521
617
  if (scriptModule.default) {
522
- console.warn(`double default...`);
618
+ logger.warn(`double default...`);
523
619
  scriptModule = scriptModule.default;
524
620
  }
525
621
  }
@@ -529,7 +625,7 @@ async function executeDeployScripts(config) {
529
625
  }
530
626
  providedContext = scriptModule.providedContext;
531
627
  } catch (e) {
532
- console.error(`could not import ${filepath}`);
628
+ logger.error(`could not import ${filepath}`);
533
629
  throw e;
534
630
  }
535
631
  let scriptTags = scriptModule.tags;
@@ -609,21 +705,26 @@ async function executeDeployScripts(config) {
609
705
  }
610
706
  for (const deployScript of scriptsToRun.concat(scriptsToRunAtTheEnd)) {
611
707
  const filename = path4.basename(deployScript.filePath);
708
+ const relativeFilepath = path4.relative(".", deployScript.filePath);
612
709
  let skip = false;
613
710
  if (deployScript.func.skip) {
711
+ const spinner = spin(`Executing skipping function from ${filename}`);
614
712
  try {
615
713
  skip = await deployScript.func.skip(external);
714
+ spinner.succeed(skip ? `skipping ${filename}` : void 0);
616
715
  } catch (e) {
617
- console.error(`skip failed for ${deployScript.filePath}`);
716
+ spinner.fail();
618
717
  throw e;
619
718
  }
620
719
  }
621
720
  if (!skip) {
622
721
  let result;
722
+ const spinner = spin(`Executing ${filename}`);
623
723
  try {
624
724
  result = await deployScript.func(external);
725
+ spinner.succeed(`${filename} execution complete`);
625
726
  } catch (e) {
626
- console.error(`execution failed for ${deployScript.filePath}`);
727
+ spinner.fail();
627
728
  throw e;
628
729
  }
629
730
  if (result && typeof result === "boolean") {
@@ -645,4 +746,4 @@ export {
645
746
  loadAndExecuteDeployments,
646
747
  executeDeployScripts
647
748
  };
648
- //# sourceMappingURL=chunk-INGRKRCC.js.map
749
+ //# sourceMappingURL=chunk-DIR22FGH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/fs.ts","../src/executor/index.ts","../src/environment/index.ts","../src/utils/json.ts","../src/environment/deployments.ts","../src/internal/logging.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';\nimport {logger, setLogLevel, spin} from '../internal/logging';\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\tif (options.network === 'localhost') {\n\t\t\t\t\t\tnodeUrl = 'http://127.0.0.1:8545';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.error(`network \"${options.network}\" is not configured. Please add it to the rocketh.json file`);\n\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t}\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\tif (options.network === 'localhost') {\n\t\t\t\t\tnodeUrl = 'http://127.0.0.1:8545';\n\t\t\t\t} else {\n\t\t\t\t\tlogger.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}\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\tsetLogLevel(typeof config.logLevel === 'undefined' ? 0 : config.logLevel);\n\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\tlogger.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\tlogger.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\tconst relativeFilepath = path.relative('.', deployScript.filePath);\n\t\t// if (deployScript.func.id && this.db.migrations[deployScript.func.id]) {\n\t\t// \tlogger.info(`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\tconst spinner = spin(`Executing skipping function from ${filename}`);\n\t\t\ttry {\n\t\t\t\tskip = await deployScript.func.skip(external);\n\t\t\t\tspinner.succeed(skip ? `skipping ${filename}` : undefined);\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\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\tconst spinner = spin(`Executing ${filename}`);\n\t\t\ttry {\n\t\t\t\tresult = await deployScript.func(external);\n\t\t\t\tspinner.succeed(`${filename} execution complete`);\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\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 {Transaction, TransactionReceipt, 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, EIP1193Transaction} from 'eip-1193';\nimport {ProvidedContext} from '../executor/types';\nimport {spin} from '../internal/logging';\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\nfunction displayTransaction(transaction: EIP1193Transaction) {\n\tif (transaction.type === '0x2') {\n\t\treturn `(maxFeePerGas: ${BigInt(transaction.maxFeePerGas).toString()}, maxPriorityFeePerGas: ${BigInt(\n\t\t\ttransaction.maxPriorityFeePerGas\n\t\t).toString()})`;\n\t} else {\n\t\treturn `(gasPrice: ${BigInt(transaction.gasPrice).toString()})`;\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 (typeof accountForNetwork !== undefined) {\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\tconst spinner = spin(\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\ttry {\n\t\t\t\t\t\tawait waitForTransactionAndSave(pendingTransaction.name, pendingTransaction.transaction);\n\t\t\t\t\t\tconsole.log(`transaction ${pendingTransaction.transaction.txHash} complete`);\n\t\t\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingDeployments, 2));\n\t\t\t\t\t\tspinner.succeed();\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tspinner.fail();\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\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\ttransaction?: EIP1193Transaction | null\n\t): Promise<Deployment<TAbi>> {\n\t\tconst spinner = spin(`tx ${pendingDeployment.txHash}${transaction ? ` ${displayTransaction(transaction)}` : ''}`);\n\t\tlet receipt: TransactionReceipt;\n\t\ttry {\n\t\t\treceipt = await viemClient.waitForTransactionReceipt({\n\t\t\t\thash: pendingDeployment.txHash,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tspinner.fail();\n\t\t\tthrow e;\n\t\t}\n\t\tif (!receipt) {\n\t\t\tspinner.fail(`receipt for ${pendingDeployment.txHash} not found`);\n\t\t} else {\n\t\t\tspinner.succeed();\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 spinner = spin(`fetching nonce for ${pendingDeployment.txHash}`);\n\t\t\tlet transaction: EIP1193Transaction | null = null;\n\t\t\ttry {\n\t\t\t\ttransaction = await provider.request({\n\t\t\t\t\tmethod: 'eth_getTransactionByHash',\n\t\t\t\t\tparams: [pendingDeployment.txHash],\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\tif (!transaction) {\n\t\t\t\tspinner.fail(`tx ${pendingDeployment.txHash} not found`);\n\t\t\t} else {\n\t\t\t\tspinner.stop();\n\t\t\t}\n\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\tlet transaction: EIP1193Transaction | null = null;\n\t\tconst spinner = spin(`fetching tx from peers ${pendingDeployment.txHash}`);\n\t\ttry {\n\t\t\ttransaction = await provider.request({\n\t\t\t\tmethod: 'eth_getTransactionByHash',\n\t\t\t\tparams: [pendingDeployment.txHash],\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tspinner.fail();\n\t\t\tthrow e;\n\t\t}\n\t\tif (!transaction) {\n\t\t\tspinner.fail(`tx ${pendingDeployment.txHash} not found`);\n\t\t} else {\n\t\t\tspinner.stop();\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\ttransaction\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","import {logs} from 'named-logs';\n\nimport {hookup, logs as Logging} from 'named-logs-console';\nimport ora from 'ora';\nhookup();\n\nexport function setLogLevel(level: number) {\n\tLogging.level = level;\n\tif (Logging.level > 0) {\n\t\tLogging.enable();\n\t} else {\n\t\tLogging.disable();\n\t}\n}\n\nexport const logger = logs('rocketh');\n\ntype PartialOra = {\n\tstop(): PartialOra;\n\tsucceed(msg?: string): PartialOra;\n\tfail(msg?: string): PartialOra;\n};\nconst voidSpinner: PartialOra = {\n\tstop() {\n\t\treturn this;\n\t},\n\tsucceed(msg?: string) {\n\t\treturn this;\n\t},\n\tfail(msg?: string) {\n\t\treturn this;\n\t},\n};\n// export function spin(message: string): PartialOra {\n// \treturn Logging.level > 0 ? ora(message).start() : voidSpinner;\n// }\n\nlet lastSpin = ora('rocketh');\nexport function spin(message: string): PartialOra {\n\tif (Logging.level > 0) {\n\t\tlastSpin = lastSpin.start(message);\n\t\treturn lastSpin;\n\t} else {\n\t\treturn voidSpinner;\n\t}\n}\n"],"mappings":"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","names":["path","fs","fs","path","path","fs","path","fs","accounts","path","fs","spinner","transaction","fs","path"]}