rocketh 0.10.0 → 0.10.2

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/dist/index.cjs CHANGED
@@ -404,6 +404,31 @@ function mergeArtifacts(list) {
404
404
  };
405
405
  }
406
406
 
407
+ // src/environment/providers/BaseProvider.ts
408
+ var BaseProvider = class {
409
+ constructor(provider) {
410
+ this.provider = provider;
411
+ }
412
+ request(args) {
413
+ return this._request(args);
414
+ }
415
+ };
416
+
417
+ // src/environment/providers/TransactionHashTracker.ts
418
+ var TransactionHashTracker = class extends BaseProvider {
419
+ constructor(provider) {
420
+ super(provider);
421
+ this.transactionHashes = [];
422
+ }
423
+ async _request(args) {
424
+ const response = await this.provider.request(args);
425
+ if (args.method === "eth_sendRawTransaction" || args.method === "eth_sendTransaction") {
426
+ this.transactionHashes.push(response);
427
+ }
428
+ return response;
429
+ }
430
+ };
431
+
407
432
  // src/environment/index.ts
408
433
  globalThis.extensions = [];
409
434
  function extendEnvironment(extension) {
@@ -430,7 +455,8 @@ function displayTransaction(transaction) {
430
455
  }
431
456
  }
432
457
  async function createEnvironment(config, providedContext) {
433
- const provider = "provider" in config.network ? config.network.provider : new import_eip_1193_jsonrpc_provider.JSONRPCHTTPProvider(config.network.nodeUrl);
458
+ const rawProvider = "provider" in config.network ? config.network.provider : new import_eip_1193_jsonrpc_provider.JSONRPCHTTPProvider(config.network.nodeUrl);
459
+ const provider = new TransactionHashTracker(rawProvider);
434
460
  const transport = (0, import_viem.custom)(provider);
435
461
  const viemClient = (0, import_viem.createPublicClient)({ transport });
436
462
  const chainId = (await viemClient.getChainId()).toString();
@@ -910,7 +936,72 @@ async function createEnvironment(config, providedContext) {
910
936
  };
911
937
  }
912
938
 
939
+ // src/utils/eth.ts
940
+ function avg(arr) {
941
+ const sum = arr.reduce((a, v) => a + v);
942
+ return sum / BigInt(arr.length);
943
+ }
944
+ async function getGasPriceEstimate(provider, options) {
945
+ const defaultOptions = {
946
+ blockCount: 20,
947
+ newestBlock: "pending",
948
+ rewardPercentiles: [10, 50, 80]
949
+ };
950
+ const optionsResolved = options ? { ...defaultOptions, ...options } : defaultOptions;
951
+ const historicalBlocks = optionsResolved.blockCount;
952
+ const rawFeeHistory = await provider.request({
953
+ method: "eth_feeHistory",
954
+ params: [`0x${historicalBlocks.toString(16)}`, optionsResolved.newestBlock, optionsResolved.rewardPercentiles]
955
+ });
956
+ let blockNum = Number(rawFeeHistory.oldestBlock);
957
+ const lastBlock = blockNum + rawFeeHistory.reward.length;
958
+ let index = 0;
959
+ const blocksHistory = [];
960
+ while (blockNum < lastBlock) {
961
+ blocksHistory.push({
962
+ number: blockNum,
963
+ baseFeePerGas: BigInt(rawFeeHistory.baseFeePerGas[index]),
964
+ gasUsedRatio: Number(rawFeeHistory.gasUsedRatio[index]),
965
+ priorityFeePerGas: rawFeeHistory.reward[index].map((x) => BigInt(x))
966
+ });
967
+ blockNum += 1;
968
+ index += 1;
969
+ }
970
+ const percentilePriorityFeeAverages = [];
971
+ for (let i = 0; i < optionsResolved.rewardPercentiles.length; i++) {
972
+ percentilePriorityFeeAverages.push(avg(blocksHistory.map((b) => b.priorityFeePerGas[i])));
973
+ }
974
+ const baseFeePerGas = BigInt(rawFeeHistory.baseFeePerGas[rawFeeHistory.baseFeePerGas.length - 1]);
975
+ const result = [];
976
+ for (let i = 0; i < optionsResolved.rewardPercentiles.length; i++) {
977
+ result.push({
978
+ maxFeePerGas: percentilePriorityFeeAverages[i] + baseFeePerGas,
979
+ maxPriorityFeePerGas: percentilePriorityFeeAverages[i]
980
+ });
981
+ }
982
+ return result;
983
+ }
984
+ async function getRoughGasPriceEstimate(provider, options) {
985
+ const defaultOptions = {
986
+ blockCount: 20,
987
+ newestBlock: "pending",
988
+ rewardPercentiles: [10, 50, 80]
989
+ };
990
+ const optionsResolved = options ? { ...defaultOptions, ...options } : defaultOptions;
991
+ if (optionsResolved.rewardPercentiles.length !== 3) {
992
+ throw new Error(`rough gas estimate require 3 percentile, it defaults to [10,50,80]`);
993
+ }
994
+ const result = await getGasPriceEstimate(provider, optionsResolved);
995
+ return {
996
+ slow: result[0],
997
+ average: result[1],
998
+ fast: result[2]
999
+ };
1000
+ }
1001
+
913
1002
  // src/executor/index.ts
1003
+ var import_prompts = __toESM(require("prompts"), 1);
1004
+ var import_viem2 = require("viem");
914
1005
  if (!process.env["ROCKETH_SKIP_ESBUILD"]) {
915
1006
  require("esbuild-register/dist/node").register();
916
1007
  }
@@ -992,7 +1083,9 @@ function readConfig(options) {
992
1083
  saveDeployments: options.saveDeployments,
993
1084
  scripts: options.scripts,
994
1085
  tags: typeof options.tags === "undefined" ? void 0 : options.tags.split(","),
995
- logLevel: options.logLevel
1086
+ logLevel: options.logLevel,
1087
+ askBeforeProceeding: options.askBeforeProceeding,
1088
+ reportGasUse: options.reportGasUse
996
1089
  };
997
1090
  } else {
998
1091
  return {
@@ -1006,7 +1099,9 @@ function readConfig(options) {
1006
1099
  saveDeployments: options.saveDeployments,
1007
1100
  scripts: options.scripts,
1008
1101
  tags: typeof options.tags === "undefined" ? void 0 : options.tags.split(","),
1009
- logLevel: options.logLevel
1102
+ logLevel: options.logLevel,
1103
+ askBeforeProceeding: options.askBeforeProceeding,
1104
+ reportGasUse: options.reportGasUse
1010
1105
  };
1011
1106
  }
1012
1107
  }
@@ -1151,6 +1246,28 @@ async function executeDeployScripts(config, args) {
1151
1246
  for (const scriptFilePath of scriptFilePaths) {
1152
1247
  recurseDependencies(scriptFilePath);
1153
1248
  }
1249
+ if (config.askBeforeProceeding) {
1250
+ const gasPriceEstimate = await getRoughGasPriceEstimate(external.network.provider);
1251
+ const prompt = await (0, import_prompts.default)({
1252
+ type: "confirm",
1253
+ name: "proceed",
1254
+ message: `gas price is currently in this range:
1255
+ slow: ${(0, import_viem2.formatEther)(gasPriceEstimate.slow.maxFeePerGas)} (priority: ${(0, import_viem2.formatEther)(
1256
+ gasPriceEstimate.slow.maxPriorityFeePerGas
1257
+ )})
1258
+ average: ${(0, import_viem2.formatEther)(gasPriceEstimate.average.maxFeePerGas)} (priority: ${(0, import_viem2.formatEther)(
1259
+ gasPriceEstimate.average.maxPriorityFeePerGas
1260
+ )})
1261
+ fast: ${(0, import_viem2.formatEther)(gasPriceEstimate.fast.maxFeePerGas)} (priority: ${(0, import_viem2.formatEther)(
1262
+ gasPriceEstimate.fast.maxPriorityFeePerGas
1263
+ )})
1264
+
1265
+ Do you want to proceed (note that gas price can change for each tx)`
1266
+ });
1267
+ if (!prompt.proceed) {
1268
+ process.exit();
1269
+ }
1270
+ }
1154
1271
  for (const deployScript of scriptsToRun.concat(scriptsToRunAtTheEnd)) {
1155
1272
  const filename = import_node_path4.default.basename(deployScript.filePath);
1156
1273
  const relativeFilepath = import_node_path4.default.relative(".", deployScript.filePath);
@@ -1181,6 +1298,19 @@ async function executeDeployScripts(config, args) {
1181
1298
  }
1182
1299
  }
1183
1300
  }
1301
+ if (config.reportGasUse) {
1302
+ const provider = external.network.provider;
1303
+ const transactionHashes = provider.transactionHashes;
1304
+ let totalGasUsed = 0;
1305
+ for (const hash of transactionHashes) {
1306
+ const transactionReceipt = await provider.request({ method: "eth_getTransactionReceipt", params: [hash] });
1307
+ if (transactionReceipt) {
1308
+ const gasUsed = Number(transactionReceipt.gasUsed);
1309
+ totalGasUsed += gasUsed;
1310
+ }
1311
+ }
1312
+ console.log({ totalGasUsed });
1313
+ }
1184
1314
  return external;
1185
1315
  }
1186
1316
  // Annotate the CommonJS export names for ESM import in node:
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils/fs.ts","../src/executor/index.ts","../src/environment/index.ts","../src/utils/json.ts","../src/environment/deployments.ts","../src/internal/logging.ts","../src/environment/utils/chains.ts","../src/environment/utils/artifacts.ts"],"sourcesContent":["export * from './executor';\nexport * from './executor/types';\nexport * from './environment/types';\nexport {extendEnvironment, handleSignerProtocol} from './environment';\nexport {loadDeployments} from './environment/deployments';\nexport * from './environment/utils/artifacts';\nexport * from './environment/utils/chains';\n","// 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';\nimport {EIP1193GenericRequestProvider, EIP1193ProviderWithoutEvents} from 'eip-1193';\n\nif (!process.env['ROCKETH_SKIP_ESBUILD']) {\n\trequire('esbuild-register/dist/node').register();\n}\n\nexport function execute<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tArgumentsType = undefined,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(\n\tcontext: ProvidedContext<Artifacts, NamedAccounts>,\n\tcallback: DeployScriptFunction<Artifacts, ResolvedNamedAccounts<NamedAccounts>, ArgumentsType, Deployments>,\n\toptions: {tags?: string[]; dependencies?: string[]}\n): DeployScriptModule<Artifacts, NamedAccounts, ArgumentsType, Deployments> {\n\tconst scriptModule = (\n\t\tenv: Environment<Artifacts, ResolvedNamedAccounts<NamedAccounts>, Deployments>,\n\t\targs?: ArgumentsType\n\t) => callback(env, args);\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, ArgumentsType, Deployments>;\n}\n\nexport type ConfigOptions = {\n\tnetwork?: string | {fork: string};\n\tdeployments?: string;\n\tscripts?: string;\n\ttags?: string;\n\tlogLevel?: number;\n\tprovider?: EIP1193ProviderWithoutEvents | EIP1193GenericRequestProvider;\n\tignoreMissingRPC?: boolean;\n\tsaveDeployments?: boolean;\n};\n\nexport function readConfig(options: ConfigOptions): Config {\n\ttype Networks = {[name: string]: {rpcUrl?: string; tags?: string[]}};\n\ttype ConfigFile = {networks: Networks; deployments?: string; scripts?: string};\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\tif (configFile) {\n\t\tif (!options.deployments && configFile.deployments) {\n\t\t\toptions.deployments = configFile.deployments;\n\t\t}\n\t\tif (!options.scripts && configFile.scripts) {\n\t\t\toptions.scripts = configFile.scripts;\n\t\t}\n\t}\n\n\tconst fromEnv = process.env['ETH_NODE_URI_' + options.network];\n\tconst fork = typeof options.network !== 'string';\n\tlet networkName = 'memory';\n\tif (options.network) {\n\t\tif (typeof options.network === 'string') {\n\t\t\tnetworkName = options.network;\n\t\t} else if ('fork' in options.network) {\n\t\t\tnetworkName = options.network.fork;\n\t\t}\n\t}\n\n\tlet networkTags: string[] = (configFile?.networks && configFile?.networks[networkName]?.tags) || [];\n\tif (!options.provider) {\n\t\tlet nodeUrl: string;\n\t\tif (typeof fromEnv === 'string') {\n\t\t\tnodeUrl = fromEnv;\n\t\t} else {\n\t\t\tif (configFile) {\n\t\t\t\tconst network = configFile.networks && configFile.networks[networkName];\n\t\t\t\tif (network && network.rpcUrl) {\n\t\t\t\t\tnodeUrl = network.rpcUrl;\n\t\t\t\t} else {\n\t\t\t\t\tif (options?.ignoreMissingRPC) {\n\t\t\t\t\t\tnodeUrl = '';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (options.network === 'localhost') {\n\t\t\t\t\t\t\tnodeUrl = 'http://127.0.0.1:8545';\n\t\t\t\t\t\t} else {\n\t\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\t\tprocess.exit(1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (options?.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}\n\t\treturn {\n\t\t\tnetwork: {\n\t\t\t\tnodeUrl,\n\t\t\t\tname: networkName,\n\t\t\t\ttags: networkTags,\n\t\t\t\tfork,\n\t\t\t},\n\t\t\tdeployments: options.deployments,\n\t\t\tsaveDeployments: options.saveDeployments,\n\t\t\tscripts: options.scripts,\n\t\t\ttags: typeof options.tags === 'undefined' ? undefined : options.tags.split(','),\n\t\t\tlogLevel: options.logLevel,\n\t\t};\n\t} else {\n\t\treturn {\n\t\t\tnetwork: {\n\t\t\t\tprovider: options.provider as EIP1193ProviderWithoutEvents,\n\t\t\t\tname: networkName,\n\t\t\t\ttags: networkTags,\n\t\t\t\tfork,\n\t\t\t},\n\t\t\tdeployments: options.deployments,\n\t\t\tsaveDeployments: options.saveDeployments,\n\t\t\tscripts: options.scripts,\n\t\t\ttags: typeof options.tags === 'undefined' ? undefined : options.tags.split(','),\n\t\t\tlogLevel: options.logLevel,\n\t\t};\n\t}\n}\n\nexport function readAndResolveConfig(options: ConfigOptions): ResolvedConfig {\n\treturn resolveConfig(readConfig(options));\n}\n\nexport function resolveConfig(config: Config): ResolvedConfig {\n\tconst resolvedConfig: ResolvedConfig = {\n\t\t...config,\n\t\tnetwork: config.network, // TODO default to || {name: 'memory'....}\n\t\tdeployments: config.deployments || 'deployments',\n\t\tscripts: config.scripts || 'deploy',\n\t\ttags: config.tags || [],\n\t\tnetworkTags: config.networkTags || [],\n\t\tsaveDeployments: config.saveDeployments,\n\t};\n\treturn resolvedConfig;\n}\n\nexport async function loadEnvironment<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts\n>(options: ConfigOptions, context: ProvidedContext<Artifacts, NamedAccounts>): Promise<Environment> {\n\tconst resolvedConfig = readAndResolveConfig(options);\n\tconst {external, internal} = await createEnvironment(resolvedConfig, context);\n\treturn external;\n}\n\nexport async function loadAndExecuteDeployments<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tArgumentsType = undefined,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(options: ConfigOptions, args?: ArgumentsType): Promise<Environment> {\n\tconst resolvedConfig = readAndResolveConfig(options);\n\t// console.log(JSON.stringify(options, null, 2));\n\t// console.log(JSON.stringify(resolvedConfig, null, 2));\n\treturn executeDeployScripts<Artifacts, NamedAccounts, ArgumentsType, Deployments>(resolvedConfig, args);\n}\n\nexport async function executeDeployScripts<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tArgumentsType = undefined,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(config: ResolvedConfig, args?: ArgumentsType): Promise<Environment> {\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<Artifacts, NamedAccounts, ArgumentsType>} = {};\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<Artifacts, NamedAccounts, ArgumentsType>;\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<Artifacts, NamedAccounts, ArgumentsType>;\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<Artifacts, NamedAccounts, ArgumentsType>;\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<Artifacts, NamedAccounts, ArgumentsType>;\n\t\tfilePath: string;\n\t}> = [];\n\tconst scriptsToRunAtTheEnd: Array<{\n\t\tfunc: DeployScriptModule<Artifacts, NamedAccounts, ArgumentsType>;\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\tconst spinner = spin(`- Executing ${filename}`);\n\t\tif (deployScript.func.skip) {\n\t\t\tconst spinner = spin(` - skip?()`);\n\t\t\ttry {\n\t\t\t\tskip = await deployScript.func.skip(external, args);\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\n\t\t\ttry {\n\t\t\t\tresult = await deployScript.func(external, args);\n\t\t\t\tspinner.succeed(`\\n`);\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;\n}\n","import fs from 'node:fs';\n\nimport {TransactionReceipt, createPublicClient, custom} from 'viem';\n\nimport {\n\tAccountType,\n\tArtifact,\n\tDeployment,\n\tEnvironment,\n\tNamedSigner,\n\tPendingDeployment,\n\tPendingTransaction,\n\tResolvedAccount,\n\tResolvedConfig,\n\tResolvedNamedAccounts,\n\tResolvedNamedSigners,\n\tUnknownArtifacts,\n\tUnknownDeployments,\n\tUnresolvedUnknownNamedAccounts,\n} from './types';\nimport {JSONRPCHTTPProvider} from 'eip-1193-jsonrpc-provider';\nimport {Abi, Address} from 'abitype';\nimport {InternalEnvironment} from '../internal/types';\nimport path from 'node:path';\nimport {JSONToString, stringToJSON} from '../utils/json';\nimport {loadDeployments} from './deployments';\nimport {\n\tEIP1193Account,\n\tEIP1193DATA,\n\tEIP1193ProviderWithoutEvents,\n\tEIP1193QUANTITY,\n\tEIP1193Transaction,\n\tEIP1193TransactionReceipt,\n} from 'eip-1193';\nimport {ProvidedContext} from '../executor/types';\nimport {ProgressIndicator, log, spin} from '../internal/logging';\nimport {PendingExecution} from './types';\nimport {getChain} from './utils/chains';\nimport {mergeArtifacts} from './utils/artifacts';\n\ntype ReceiptResult = {receipt: EIP1193TransactionReceipt; latestBlockNumber: EIP1193QUANTITY};\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 wait(numSeconds: number): Promise<void> {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(resolve, numSeconds * 1000);\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<Artifacts, NamedAccounts, Deployments>}> {\n\tconst provider =\n\t\t'provider' in config.network\n\t\t\t? config.network.provider\n\t\t\t: (new JSONRPCHTTPProvider(config.network.nodeUrl) as EIP1193ProviderWithoutEvents);\n\n\tconst transport = custom(provider);\n\tconst viemClient = createPublicClient({transport});\n\n\tconst chainId = (await viemClient.getChainId()).toString();\n\tlet genesisHash: `0x${string}` | undefined;\n\ttry {\n\t\tgenesisHash = (await viemClient.getBlock({blockTag: 'earliest'})).hash;\n\t} catch (err) {\n\t\tconsole.error(`failed to get genesis hash`);\n\t}\n\n\tlet networkName: string;\n\tlet saveDeployments: boolean;\n\tlet networkTags: {[tag: string]: boolean} = {};\n\tfor (const networkTag of config.network.tags) {\n\t\tnetworkTags[networkTag] = true;\n\t}\n\n\tif ('nodeUrl' in config) {\n\t\tnetworkName = config.network.name;\n\t\tsaveDeployments = true;\n\t} else {\n\t\tif (config.network.name) {\n\t\t\tnetworkName = config.network.name;\n\t\t} else {\n\t\t\tnetworkName = 'memory';\n\t\t}\n\t\tif (networkName === 'memory' || networkName === 'hardhat') {\n\t\t\tnetworkTags['memory'] = true;\n\t\t\tsaveDeployments = false;\n\t\t} else {\n\t\t\tsaveDeployments = true;\n\t\t}\n\t}\n\n\tif (config.saveDeployments !== undefined) {\n\t\tsaveDeployments = config.saveDeployments;\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\tfork: config.network.fork,\n\t\t\tsaveDeployments,\n\t\t\ttags: networkTags,\n\t\t},\n\t};\n\n\t// console.log(`context`, JSON.stringify(context.network, null, 2));\n\n\tconst {deployments} = loadDeployments(\n\t\tconfig.deployments,\n\t\tcontext.network.name,\n\t\tfalse,\n\t\tcontext.network.fork\n\t\t\t? undefined\n\t\t\t: {\n\t\t\t\t\tchainId,\n\t\t\t\t\tgenesisHash,\n\t\t\t\t\tdeleteDeploymentsIfDifferentGenesisHash: true,\n\t\t\t }\n\t);\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\tchain: getChain(chainId),\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\t// const chainIdFilepath = path.join(folderPath, '.chainId');\n\t\t// if (!fs.existsSync(chainIdFilepath)) {\n\t\t// \tfs.writeFileSync(chainIdFilepath, chainId);\n\t\t// }\n\t\tconst chainFilepath = path.join(folderPath, '.chain');\n\t\tif (!fs.existsSync(chainFilepath)) {\n\t\t\tfs.writeFileSync(chainFilepath, JSON.stringify({chainId, genesisHash}));\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> {\n\t\tconst deployment = deployments[name] as Deployment<TAbi>;\n\t\tif (!deployment) {\n\t\t\tthrow new Error(`no deployment named \"${name}\" found.`);\n\t\t}\n\t\treturn deployment;\n\t}\n\n\tfunction getOrNull<TAbi extends Abi>(name: string): Deployment<TAbi> | null {\n\t\treturn (deployments[name] || null) as Deployment<TAbi> | null;\n\t}\n\n\tfunction fromAddressToNamedABIOrNull<TAbi extends Abi>(address: Address): {mergedABI: TAbi; names: string[]} | null {\n\t\tlet list: {name: string; artifact: Artifact<Abi>}[] = [];\n\t\tfor (const name of Object.keys(deployments)) {\n\t\t\tconst deployment = deployments[name];\n\t\t\tif (deployment.address.toLowerCase() == address.toLowerCase()) {\n\t\t\t\tlist.push({name, artifact: deployment});\n\t\t\t}\n\t\t}\n\t\tif (list.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst {mergedABI} = mergeArtifacts(list);\n\t\treturn {\n\t\t\tmergedABI: mergedABI as unknown as TAbi,\n\t\t\tnames: list.map((v) => v.name),\n\t\t};\n\t}\n\n\tfunction fromAddressToNamedABI<TAbi extends Abi>(address: Address): {mergedABI: TAbi; names: string[]} {\n\t\tconst n = fromAddressToNamedABIOrNull<TAbi>(address);\n\t\tif (!n) {\n\t\t\tthrow new Error(`could not find artifact for address ${address}`);\n\t\t}\n\t\treturn n;\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\tif (!context.network.saveDeployments) {\n\t\t\treturn;\n\t\t}\n\t\tconst folderPath = ensureDeploymentFolder();\n\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\tlet existingPendingTansactions: PendingTransaction[];\n\t\ttry {\n\t\t\texistingPendingTansactions = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t} catch {\n\t\t\texistingPendingTansactions = [];\n\t\t}\n\t\tif (existingPendingTansactions.length > 0) {\n\t\t\twhile (existingPendingTansactions.length > 0) {\n\t\t\t\tconst pendingTransaction = existingPendingTansactions.shift();\n\t\t\t\tif (pendingTransaction) {\n\t\t\t\t\tif (pendingTransaction.type === 'deployment') {\n\t\t\t\t\t\tconst spinner = spin(\n\t\t\t\t\t\t\t`recovering ${pendingTransaction.name} with transaction ${pendingTransaction.transaction.hash}`\n\t\t\t\t\t\t);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait waitForDeploymentTransactionAndSave(pendingTransaction);\n\t\t\t\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingTansactions, 2));\n\t\t\t\t\t\t\tspinner.succeed();\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tspinner.fail();\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst spinner = spin(`recovering execution's transaction ${pendingTransaction.transaction.hash}`);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait waitForTransaction(pendingTransaction.transaction.hash);\n\t\t\t\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingTansactions, 2));\n\t\t\t\t\t\t\tspinner.succeed();\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tspinner.fail();\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t}\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 savePendingTransaction(pendingTransaction: PendingTransaction) {\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 existingPendinTransactions: PendingTransaction[];\n\t\t\ttry {\n\t\t\t\texistingPendinTransactions = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendinTransactions = [];\n\t\t\t}\n\t\t\texistingPendinTransactions.push(pendingTransaction);\n\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendinTransactions, 2));\n\t\t}\n\t\treturn deployments;\n\t}\n\n\tasync function waitForTransactionReceipt(params: {\n\t\thash: EIP1193DATA;\n\t\t// confirmations?: number; // TODO\n\t\tpollingInterval?: number;\n\t\t// timeout?: number; // TODO\n\t}): Promise<ReceiptResult> {\n\t\t// const {hash, confirmations, pollingInterval, timeout} = {confirmations: 1, pollingInterval: 1, ...params};\n\t\tconst {hash, pollingInterval} = {pollingInterval: 1, ...params};\n\n\t\tlet latestBlockNumber = await provider.request({\n\t\t\tmethod: 'eth_blockNumber',\n\t\t});\n\n\t\tlet receipt = await provider.request({\n\t\t\tmethod: 'eth_getTransactionReceipt',\n\t\t\tparams: [hash],\n\t\t});\n\t\tif (!receipt || !receipt.blockHash) {\n\t\t\tawait wait(pollingInterval);\n\t\t\treturn waitForTransactionReceipt(params);\n\t\t}\n\t\treturn {receipt, latestBlockNumber};\n\t}\n\n\tasync function deleteTransaction<TAbi extends Abi = Abi>(hash: string) {\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 existingPendinTransactions: PendingTransaction[];\n\t\t\ttry {\n\t\t\t\texistingPendinTransactions = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendinTransactions = [];\n\t\t\t}\n\t\t\texistingPendinTransactions = existingPendinTransactions.filter((v) => v.transaction.hash !== hash);\n\t\t\tif (existingPendinTransactions.length === 0) {\n\t\t\t\tfs.rmSync(filepath);\n\t\t\t} else {\n\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendinTransactions, 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 waitForTransaction(\n\t\thash: `0x${string}`,\n\t\tinfo?: {message?: string; transaction?: EIP1193Transaction | null}\n\t): Promise<ReceiptResult> {\n\t\tconst spinner = spin(\n\t\t\tinfo?.message\n\t\t\t\t? info.message\n\t\t\t\t: ` - Broadcasting tx:\\n ${hash}${\n\t\t\t\t\t\tinfo?.transaction ? `\\n ${displayTransaction(info?.transaction)}` : ''\n\t\t\t\t }`\n\t\t);\n\t\tlet receiptResult: {receipt: EIP1193TransactionReceipt; latestBlockNumber: EIP1193QUANTITY};\n\t\ttry {\n\t\t\treceiptResult = await waitForTransactionReceipt({\n\t\t\t\thash,\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 (!receiptResult) {\n\t\t\tthrow new Error(`receipt for ${hash} not found`);\n\t\t} else {\n\t\t\tspinner.succeed();\n\t\t}\n\t\treturn receiptResult;\n\t}\n\n\tasync function waitForDeploymentTransactionAndSave<TAbi extends Abi = Abi>(\n\t\tpendingDeployment: PendingDeployment<TAbi>,\n\t\ttransaction?: EIP1193Transaction | null\n\t): Promise<Deployment<TAbi>> {\n\t\tconst message = ` - Deploying ${pendingDeployment.name} with tx:\\n ${pendingDeployment.transaction.hash}${\n\t\t\ttransaction ? `\\n ${displayTransaction(transaction)}` : ''\n\t\t}`;\n\t\tconst {receipt, latestBlockNumber} = await waitForTransaction(pendingDeployment.transaction.hash, {\n\t\t\tmessage,\n\t\t\ttransaction,\n\t\t});\n\n\t\t// TODO we could make pendingDeployment.expectedAddress a spec for fetching address from event too\n\t\tconst contractAddress = pendingDeployment.expectedAddress || receipt.contractAddress;\n\t\tif (!contractAddress) {\n\t\t\tconsole.error(receipt);\n\t\t\tthrow new Error(`no contract address found for ${pendingDeployment.name}`);\n\t\t}\n\n\t\tshowMessage(` => ${contractAddress}`);\n\n\t\tconst {abi, ...artifactObjectWithoutABI} = pendingDeployment.partialDeployment;\n\n\t\tif (!pendingDeployment.transaction.hash) {\n\t\t\tconst spinner = spin(); // TODO 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.transaction.hash],\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.transaction.hash} 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\tpendingDeployment.transaction = {\n\t\t\t\t\tnonce: transaction.nonce,\n\t\t\t\t\thash: transaction.hash,\n\t\t\t\t\torigin: transaction.from,\n\t\t\t\t};\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\tif (artifactObjectWithoutABI.evm) {\n\t\t\t\t\tif ('gasEstimates' in artifactObjectWithoutABI['evm']) {\n\t\t\t\t\t\tconst {gasEstimates} = artifactObjectWithoutABI.evm;\n\t\t\t\t\t\tartifactObjectWithoutABI.evm = {\n\t\t\t\t\t\t\tgasEstimates,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst latestBlockNumberAsNumber = parseInt(latestBlockNumber.slice(2), 16);\n\t\tconst receiptBlockNumber = parseInt(receipt.blockNumber.slice(2), 16);\n\t\tconst confirmations = Math.max(0, latestBlockNumberAsNumber - receiptBlockNumber);\n\n\t\tconst deployment = {\n\t\t\taddress: contractAddress,\n\t\t\tabi,\n\t\t\t...artifactObjectWithoutABI,\n\t\t\ttransaction: pendingDeployment.transaction,\n\t\t\treceipt: {\n\t\t\t\tconfirmations,\n\t\t\t\tblockHash: receipt.blockHash,\n\t\t\t\tblockNumber: receipt.blockNumber,\n\t\t\t\ttransactionIndex: receipt.transactionIndex,\n\t\t\t},\n\t\t};\n\t\treturn save(pendingDeployment.name, deployment);\n\t}\n\n\tasync function savePendingExecution(pendingExecution: PendingExecution) {\n\t\tawait savePendingTransaction(pendingExecution);\n\t\tlet transaction: EIP1193Transaction | null = null;\n\t\tconst spinner = spin(); // TODO 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: [pendingExecution.transaction.hash],\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 ${pendingExecution.transaction.hash} not found`);\n\t\t} else {\n\t\t\tspinner.stop();\n\t\t}\n\n\t\tif (transaction) {\n\t\t\tpendingExecution.transaction.nonce = transaction.nonce;\n\t\t\tpendingExecution.transaction.origin = transaction.from;\n\t\t}\n\n\t\tconst {receipt} = await waitForTransaction(pendingExecution.transaction.hash, {transaction});\n\t\tawait deleteTransaction(pendingExecution.transaction.hash);\n\t\treturn receipt;\n\t}\n\n\tasync function savePendingDeployment<TAbi extends Abi = Abi>(pendingDeployment: PendingDeployment<TAbi>) {\n\t\tawait savePendingTransaction(pendingDeployment);\n\t\tlet transaction: EIP1193Transaction | null = null;\n\t\tconst spinner = spin(); // TODO 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.transaction.hash],\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tconsole.error(`failed to fetch tx ${pendingDeployment.transaction.hash}. Can't know its status`);\n\t\t\tspinner.fail();\n\t\t\tthrow e;\n\t\t}\n\t\tif (!transaction) {\n\t\t\tspinner.fail(`tx ${pendingDeployment.transaction.hash} not found`);\n\t\t} else {\n\t\t\tspinner.stop();\n\t\t}\n\n\t\tif (transaction) {\n\t\t\t// we update the tx data with the one we get from the network\n\t\t\tpendingDeployment = {\n\t\t\t\t...pendingDeployment,\n\t\t\t\ttransaction: {hash: transaction.hash, nonce: transaction.nonce, origin: transaction.from},\n\t\t\t};\n\t\t}\n\n\t\tconst deployment = await waitForDeploymentTransactionAndSave<TAbi>(pendingDeployment, transaction);\n\t\tawait deleteTransaction(pendingDeployment.transaction.hash);\n\t\treturn deployment;\n\t}\n\n\tfunction showMessage(message: string) {\n\t\tlog(message);\n\t}\n\n\tfunction showProgress(message?: string): ProgressIndicator {\n\t\treturn spin(message);\n\t}\n\n\tlet env: Environment<Artifacts, NamedAccounts, Deployments> = {\n\t\t...perliminaryEnvironment,\n\t\tsave,\n\t\tsavePendingDeployment,\n\t\tsavePendingExecution,\n\t\tget,\n\t\tgetOrNull,\n\t\tfromAddressToNamedABI,\n\t\tfromAddressToNamedABIOrNull,\n\t\tshowMessage,\n\t\tshowProgress,\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\tnetworkName: string,\n\tonlyABIAndAddress?: boolean,\n\texpectedChain?: {chainId: string; genesisHash?: `0x${string}`; deleteDeploymentsIfDifferentGenesisHash?: boolean}\n): {deployments: UnknownDeployments; chainId?: string; genesisHash?: `0x${string}`} {\n\tconst deploymentsFound: UnknownDeployments = {};\n\tconst deployPath = path.join(deploymentsPath, networkName);\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\tlet genesisHash: `0x${string}` | undefined;\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, 'utf-8').trim();\n\t\t} else {\n\t\t\tconst chainFilepath = path.join(deployPath, '.chain');\n\t\t\tif (fs.existsSync(chainFilepath)) {\n\t\t\t\tconst chainSTR = fs.readFileSync(chainFilepath, 'utf-8');\n\t\t\t\tconst chainData = JSON.parse(chainSTR);\n\t\t\t\tchainId = chainData.chainId;\n\t\t\t\tgenesisHash = chainData.genesisHash;\n\t\t\t} else {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`A '.chain' or '.chainId' file is expected to be present in the deployment folder for network ${networkName}`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (expectedChain) {\n\t\t\tif (expectedChain.chainId !== 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 (${expectedChain.chainId})`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (expectedChain.genesisHash && expectedChain.genesisHash !== genesisHash) {\n\t\t\t\tif (expectedChain.deleteDeploymentsIfDifferentGenesisHash) {\n\t\t\t\t\t// we delete the old folder\n\n\t\t\t\t\tfs.rmSync(deployPath, {recursive: true, force: true});\n\t\t\t\t\treturn {deployments: {}};\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Loading deployment in folder '${deployPath}' (with genesisHash: ${genesisHash}) for a different genesisHash (${expectedChain.genesisHash})`\n\t\t\t\t\t);\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, genesisHash};\n}\n","import {logs} from 'named-logs';\n\nimport {hookup, factory as Logging} from 'named-logs-console';\n// import ora from 'ora-cjs';\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\nexport type ProgressIndicator = {\n\tstart(msg?: string): ProgressIndicator;\n\tstop(): ProgressIndicator;\n\tsucceed(msg?: string): ProgressIndicator;\n\tfail(msg?: string): ProgressIndicator;\n};\nconst loggerProgressIndicator: ProgressIndicator = {\n\tstart(msg?: string) {\n\t\tif (msg) {\n\t\t\tconsole.log(msg);\n\t\t}\n\t\treturn this;\n\t},\n\tstop() {\n\t\treturn this;\n\t},\n\tsucceed(msg?: string) {\n\t\tif (msg) {\n\t\t\tconsole.log(msg);\n\t\t}\n\t\treturn this;\n\t},\n\tfail(msg?: string) {\n\t\tif (msg) {\n\t\t\tconsole.error(msg);\n\t\t}\n\t\treturn this;\n\t},\n};\nconst voidProgressIndicator: ProgressIndicator = {\n\tstart() {\n\t\treturn this;\n\t},\n\tstop() {\n\t\treturn this;\n\t},\n\tsucceed() {\n\t\treturn this;\n\t},\n\tfail() {\n\t\treturn this;\n\t},\n};\n// export function spin(message: string): PartialOra {\n// \treturn Logging.level > 0 ? ora(message).start() : voidProgressIndicator;\n// }\n\n// let lastSpin = ora('rocketh');\nlet lastSpin = loggerProgressIndicator;\nexport function spin(message?: string): ProgressIndicator {\n\tif (Logging.level > 0) {\n\t\tlastSpin = lastSpin.start(message);\n\t\treturn lastSpin;\n\t} else {\n\t\treturn voidProgressIndicator;\n\t}\n}\n\nexport function log(message: string) {\n\tif (Logging.level > 0) {\n\t\tconsole.log(message);\n\t}\n}\n","import type {Chain} from 'viem/chains';\nimport chains from 'viem/chains';\n\nexport const chainById: {[chainId: string]: Chain} = {};\nconst allChains = (chains as any).default || chains;\nfor (const key of Object.keys(allChains)) {\n\tconst chain = (allChains as any)[key] as Chain;\n\tchainById[chain.id.toString()] = chain;\n}\n\nexport function getChain(id: string): Chain {\n\tconst chain = chainById[id];\n\tif (!chain) {\n\t\treturn {\n\t\t\tid: parseInt(id),\n\t\t\tname: 'unkwown',\n\t\t\t// TODO\n\t\t\tnativeCurrency: {\n\t\t\t\tname: 'Unknown Currency',\n\t\t\t\tsymbol: 'UNKNOWN',\n\t\t\t\tdecimals: 18,\n\t\t\t},\n\t\t\trpcUrls: {\n\t\t\t\tdefault: {\n\t\t\t\t\thttp: [],\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\treturn chain;\n}\n","import {Abi} from 'abitype';\nimport {Artifact, DevDoc, UserDoc} from '../types';\nimport {FunctionFragment} from 'ethers';\n\ntype CreateMutable<Type> = {\n\t-readonly [Property in keyof Type]: Type[Property];\n};\n\ntype ArrayElement<ArrayType extends readonly unknown[]> = ArrayType extends readonly (infer ElementType)[]\n\t? ElementType\n\t: never;\n\n// from https://gist.github.com/egardner/efd34f270cc33db67c0246e837689cb9\nfunction deepEqual(obj1: any, obj2: any): boolean {\n\t// Private\n\tfunction isObject(obj: any) {\n\t\tif (typeof obj === 'object' && obj != null) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tif (obj1 === obj2) {\n\t\treturn true;\n\t} else if (isObject(obj1) && isObject(obj2)) {\n\t\tif (Object.keys(obj1).length !== Object.keys(obj2).length) {\n\t\t\treturn false;\n\t\t}\n\t\tfor (var prop in obj1) {\n\t\t\tif (!deepEqual(obj1[prop], obj2[prop])) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nfunction mergeDoc(values: any, mergedDevDocs: any, field: string) {\n\tif (values[field]) {\n\t\tconst mergedEventDocs = (mergedDevDocs[field] = mergedDevDocs[field] || {});\n\t\tfor (const signature of Object.keys(values[field])) {\n\t\t\tif (mergedEventDocs[signature] && !deepEqual(mergedEventDocs[signature], values[field][signature])) {\n\t\t\t\tthrow new Error(`Doc ${field} conflict: \"${signature}\" `);\n\t\t\t}\n\t\t\tmergedEventDocs[signature] = values[field][signature];\n\t\t}\n\t}\n}\n\nexport function mergeArtifacts(list: {name: string; artifact: Artifact<Abi>}[]) {\n\tconst mergedABI: CreateMutable<Abi> = [];\n\tconst added: Map<string, ArrayElement<Abi>> = new Map();\n\tconst mergedDevDocs: CreateMutable<DevDoc> = {kind: 'dev', version: 1, methods: {}};\n\tconst mergedUserDocs: CreateMutable<UserDoc> = {kind: 'user', version: 1, methods: {}};\n\tconst sigJSMap: Map<`0x${string}`, {index: number; routeName: string; functionName: string}> = new Map();\n\n\tfor (let i = 0; i < list.length; i++) {\n\t\tconst listElem = list[i];\n\t\tfor (const element of listElem.artifact.abi) {\n\t\t\tif (element.type === 'function') {\n\t\t\t\t// const selector = getFunctionSelector(element);\n\t\t\t\tconst selector = FunctionFragment.from(element).selector as `0x${string}`;\n\t\t\t\tif (sigJSMap.has(selector)) {\n\t\t\t\t\tconst existing = sigJSMap.get(selector);\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`ABI conflict: ${existing!.routeName} has function \"${existing!.functionName}\" which conflict with ${\n\t\t\t\t\t\t\tlistElem.name\n\t\t\t\t\t\t}'s \"${element.name}\" (selector: \"${selector}\") `\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tsigJSMap.set(selector, {index: i, routeName: listElem.name, functionName: element.name});\n\n\t\t\t\tconst exists = added.has(element.name);\n\t\t\t\tif (exists) {\n\t\t\t\t\t// TODO check if same\n\t\t\t\t} else {\n\t\t\t\t\tadded.set(element.name, element);\n\t\t\t\t\tmergedABI.push(element);\n\t\t\t\t}\n\t\t\t} else if (element.type === 'constructor') {\n\t\t\t\t// we skip it\n\t\t\t} else if (element.type === 'error') {\n\t\t\t\tconst exists = added.has(element.name);\n\t\t\t\tif (exists) {\n\t\t\t\t\t// TODO check if same\n\t\t\t\t} else {\n\t\t\t\t\tadded.set(element.name, element);\n\t\t\t\t\tmergedABI.push(element);\n\t\t\t\t}\n\t\t\t} else if (element.type === 'event') {\n\t\t\t\tconst exists = added.has(element.name);\n\t\t\t\tif (exists) {\n\t\t\t\t\t// TODO check if same\n\t\t\t\t} else {\n\t\t\t\t\tadded.set(element.name, element);\n\t\t\t\t\tmergedABI.push(element);\n\t\t\t\t}\n\t\t\t} else if (element.type === 'fallback') {\n\t\t\t} else if (element.type === 'receive') {\n\t\t\t} else {\n\t\t\t\t// if ('name' in element) {\n\t\t\t\t// \tconst exists = added.has(element.name);\n\t\t\t\t// \tif (exists) {\n\t\t\t\t// \t\t// TODO check if same\n\t\t\t\t// \t} else {\n\t\t\t\t// \t\tadded.set(element.name, element);\n\t\t\t\t// \t\tmergedABI.push(element);\n\t\t\t\t// \t}\n\t\t\t\t// }\n\t\t\t}\n\t\t}\n\t\tconst devdoc = listElem.artifact.devdoc;\n\t\tif (devdoc) {\n\t\t\tmergeDoc(devdoc, mergedDevDocs, 'events');\n\t\t\tmergeDoc(devdoc, mergedDevDocs, 'errors');\n\t\t\tmergeDoc(devdoc, mergedDevDocs, 'methods');\n\t\t\tif (devdoc.author) {\n\t\t\t\tif (mergedDevDocs.author && mergedDevDocs.author != devdoc.author) {\n\t\t\t\t\tthrow new Error(`DevDoc author conflict `);\n\t\t\t\t}\n\t\t\t\tmergedDevDocs.author = devdoc.author;\n\t\t\t\tif (mergedDevDocs.title && mergedDevDocs.title != devdoc.title) {\n\t\t\t\t\tthrow new Error(`DevDoc title conflict `);\n\t\t\t\t}\n\t\t\t\tmergedDevDocs.title = devdoc.title;\n\t\t\t}\n\t\t}\n\n\t\tconst userdoc = listElem.artifact.userdoc;\n\t\tif (userdoc) {\n\t\t\tmergeDoc(userdoc, mergedUserDocs, 'events');\n\t\t\tmergeDoc(userdoc, mergedUserDocs, 'errors');\n\t\t\tmergeDoc(userdoc, mergedUserDocs, 'methods');\n\t\t\tif (userdoc.notice) {\n\t\t\t\tif (mergedUserDocs.notice && mergedUserDocs.notice != userdoc.notice) {\n\t\t\t\t\tthrow new Error(`UserDoc notice conflict `);\n\t\t\t\t}\n\t\t\t\tmergedUserDocs.notice = userdoc.notice;\n\t\t\t}\n\t\t}\n\t}\n\treturn {\n\t\tmergedABI,\n\t\tadded,\n\t\tmergedDevDocs,\n\t\tmergedUserDocs,\n\t\tsigJSMap,\n\t};\n}\n"],"mappings":"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","names":["path","fs","import_node_path","import_node_fs","import_node_fs","import_node_path","import_node_path","import_node_fs","path","fs","Logging","chains","accounts","path","fs","transaction","fs","path","spinner"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils/fs.ts","../src/executor/index.ts","../src/environment/index.ts","../src/utils/json.ts","../src/environment/deployments.ts","../src/internal/logging.ts","../src/environment/utils/chains.ts","../src/environment/utils/artifacts.ts","../src/environment/providers/BaseProvider.ts","../src/environment/providers/TransactionHashTracker.ts","../src/utils/eth.ts"],"sourcesContent":["export * from './executor';\nexport * from './executor/types';\nexport * from './environment/types';\nexport {extendEnvironment, handleSignerProtocol} from './environment';\nexport {loadDeployments} from './environment/deployments';\nexport * from './environment/utils/artifacts';\nexport * from './environment/utils/chains';\n","// 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';\nimport {EIP1193GenericRequestProvider, EIP1193ProviderWithoutEvents} from 'eip-1193';\nimport {getRoughGasPriceEstimate} from '../utils/eth';\nimport prompts from 'prompts';\nimport {formatEther} from 'viem';\n\nif (!process.env['ROCKETH_SKIP_ESBUILD']) {\n\trequire('esbuild-register/dist/node').register();\n}\n\nexport function execute<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tArgumentsType = undefined,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(\n\tcontext: ProvidedContext<Artifacts, NamedAccounts>,\n\tcallback: DeployScriptFunction<Artifacts, ResolvedNamedAccounts<NamedAccounts>, ArgumentsType, Deployments>,\n\toptions: {tags?: string[]; dependencies?: string[]}\n): DeployScriptModule<Artifacts, NamedAccounts, ArgumentsType, Deployments> {\n\tconst scriptModule = (\n\t\tenv: Environment<Artifacts, ResolvedNamedAccounts<NamedAccounts>, Deployments>,\n\t\targs?: ArgumentsType\n\t) => callback(env, args);\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, ArgumentsType, Deployments>;\n}\n\nexport type ConfigOptions = {\n\tnetwork?: string | {fork: string};\n\tdeployments?: string;\n\tscripts?: string;\n\ttags?: string;\n\tlogLevel?: number;\n\tprovider?: EIP1193ProviderWithoutEvents | EIP1193GenericRequestProvider;\n\tignoreMissingRPC?: boolean;\n\tsaveDeployments?: boolean;\n\taskBeforeProceeding?: boolean;\n\treportGasUse?: boolean;\n};\n\nexport function readConfig(options: ConfigOptions): Config {\n\ttype Networks = {[name: string]: {rpcUrl?: string; tags?: string[]}};\n\ttype ConfigFile = {networks: Networks; deployments?: string; scripts?: string};\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\tif (configFile) {\n\t\tif (!options.deployments && configFile.deployments) {\n\t\t\toptions.deployments = configFile.deployments;\n\t\t}\n\t\tif (!options.scripts && configFile.scripts) {\n\t\t\toptions.scripts = configFile.scripts;\n\t\t}\n\t}\n\n\tconst fromEnv = process.env['ETH_NODE_URI_' + options.network];\n\tconst fork = typeof options.network !== 'string';\n\tlet networkName = 'memory';\n\tif (options.network) {\n\t\tif (typeof options.network === 'string') {\n\t\t\tnetworkName = options.network;\n\t\t} else if ('fork' in options.network) {\n\t\t\tnetworkName = options.network.fork;\n\t\t}\n\t}\n\n\tlet networkTags: string[] = (configFile?.networks && configFile?.networks[networkName]?.tags) || [];\n\tif (!options.provider) {\n\t\tlet nodeUrl: string;\n\t\tif (typeof fromEnv === 'string') {\n\t\t\tnodeUrl = fromEnv;\n\t\t} else {\n\t\t\tif (configFile) {\n\t\t\t\tconst network = configFile.networks && configFile.networks[networkName];\n\t\t\t\tif (network && network.rpcUrl) {\n\t\t\t\t\tnodeUrl = network.rpcUrl;\n\t\t\t\t} else {\n\t\t\t\t\tif (options?.ignoreMissingRPC) {\n\t\t\t\t\t\tnodeUrl = '';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (options.network === 'localhost') {\n\t\t\t\t\t\t\tnodeUrl = 'http://127.0.0.1:8545';\n\t\t\t\t\t\t} else {\n\t\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\t\tprocess.exit(1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (options?.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}\n\t\treturn {\n\t\t\tnetwork: {\n\t\t\t\tnodeUrl,\n\t\t\t\tname: networkName,\n\t\t\t\ttags: networkTags,\n\t\t\t\tfork,\n\t\t\t},\n\t\t\tdeployments: options.deployments,\n\t\t\tsaveDeployments: options.saveDeployments,\n\t\t\tscripts: options.scripts,\n\t\t\ttags: typeof options.tags === 'undefined' ? undefined : options.tags.split(','),\n\t\t\tlogLevel: options.logLevel,\n\t\t\taskBeforeProceeding: options.askBeforeProceeding,\n\t\t\treportGasUse: options.reportGasUse,\n\t\t};\n\t} else {\n\t\treturn {\n\t\t\tnetwork: {\n\t\t\t\tprovider: options.provider as EIP1193ProviderWithoutEvents,\n\t\t\t\tname: networkName,\n\t\t\t\ttags: networkTags,\n\t\t\t\tfork,\n\t\t\t},\n\t\t\tdeployments: options.deployments,\n\t\t\tsaveDeployments: options.saveDeployments,\n\t\t\tscripts: options.scripts,\n\t\t\ttags: typeof options.tags === 'undefined' ? undefined : options.tags.split(','),\n\t\t\tlogLevel: options.logLevel,\n\t\t\taskBeforeProceeding: options.askBeforeProceeding,\n\t\t\treportGasUse: options.reportGasUse,\n\t\t};\n\t}\n}\n\nexport function readAndResolveConfig(options: ConfigOptions): ResolvedConfig {\n\treturn resolveConfig(readConfig(options));\n}\n\nexport function resolveConfig(config: Config): ResolvedConfig {\n\tconst resolvedConfig: ResolvedConfig = {\n\t\t...config,\n\t\tnetwork: config.network, // TODO default to || {name: 'memory'....}\n\t\tdeployments: config.deployments || 'deployments',\n\t\tscripts: config.scripts || 'deploy',\n\t\ttags: config.tags || [],\n\t\tnetworkTags: config.networkTags || [],\n\t\tsaveDeployments: config.saveDeployments,\n\t};\n\treturn resolvedConfig;\n}\n\nexport async function loadEnvironment<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts\n>(options: ConfigOptions, context: ProvidedContext<Artifacts, NamedAccounts>): Promise<Environment> {\n\tconst resolvedConfig = readAndResolveConfig(options);\n\tconst {external, internal} = await createEnvironment(resolvedConfig, context);\n\treturn external;\n}\n\nexport async function loadAndExecuteDeployments<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tArgumentsType = undefined,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(options: ConfigOptions, args?: ArgumentsType): Promise<Environment> {\n\tconst resolvedConfig = readAndResolveConfig(options);\n\t// console.log(JSON.stringify(options, null, 2));\n\t// console.log(JSON.stringify(resolvedConfig, null, 2));\n\treturn executeDeployScripts<Artifacts, NamedAccounts, ArgumentsType, Deployments>(resolvedConfig, args);\n}\n\nexport async function executeDeployScripts<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tArgumentsType = undefined,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(config: ResolvedConfig, args?: ArgumentsType): Promise<Environment> {\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<Artifacts, NamedAccounts, ArgumentsType>} = {};\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<Artifacts, NamedAccounts, ArgumentsType>;\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<Artifacts, NamedAccounts, ArgumentsType>;\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<Artifacts, NamedAccounts, ArgumentsType>;\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<Artifacts, NamedAccounts, ArgumentsType>;\n\t\tfilePath: string;\n\t}> = [];\n\tconst scriptsToRunAtTheEnd: Array<{\n\t\tfunc: DeployScriptModule<Artifacts, NamedAccounts, ArgumentsType>;\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\tif (config.askBeforeProceeding) {\n\t\tconst gasPriceEstimate = await getRoughGasPriceEstimate(external.network.provider);\n\t\tconst prompt = await prompts({\n\t\t\ttype: 'confirm',\n\t\t\tname: 'proceed',\n\t\t\tmessage: `gas price is currently in this range:\nslow: ${formatEther(gasPriceEstimate.slow.maxFeePerGas)} (priority: ${formatEther(\n\t\t\t\tgasPriceEstimate.slow.maxPriorityFeePerGas\n\t\t\t)})\naverage: ${formatEther(gasPriceEstimate.average.maxFeePerGas)} (priority: ${formatEther(\n\t\t\t\tgasPriceEstimate.average.maxPriorityFeePerGas\n\t\t\t)})\nfast: ${formatEther(gasPriceEstimate.fast.maxFeePerGas)} (priority: ${formatEther(\n\t\t\t\tgasPriceEstimate.fast.maxPriorityFeePerGas\n\t\t\t)})\n \nDo you want to proceed (note that gas price can change for each tx)`,\n\t\t});\n\n\t\tif (!prompt.proceed) {\n\t\t\tprocess.exit();\n\t\t}\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\tconst spinner = spin(`- Executing ${filename}`);\n\t\tif (deployScript.func.skip) {\n\t\t\tconst spinner = spin(` - skip?()`);\n\t\t\ttry {\n\t\t\t\tskip = await deployScript.func.skip(external, args);\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\n\t\t\ttry {\n\t\t\t\tresult = await deployScript.func(external, args);\n\t\t\t\tspinner.succeed(`\\n`);\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\tif (config.reportGasUse) {\n\t\tconst provider = external.network.provider;\n\t\tconst transactionHashes = provider.transactionHashes;\n\n\t\tlet totalGasUsed = 0;\n\t\tfor (const hash of transactionHashes) {\n\t\t\tconst transactionReceipt = await provider.request({method: 'eth_getTransactionReceipt', params: [hash]});\n\t\t\tif (transactionReceipt) {\n\t\t\t\tconst gasUsed = Number(transactionReceipt.gasUsed);\n\t\t\t\ttotalGasUsed += gasUsed;\n\t\t\t}\n\t\t}\n\n\t\tconsole.log({totalGasUsed});\n\t}\n\n\treturn external;\n}\n","import fs from 'node:fs';\n\nimport {TransactionReceipt, createPublicClient, custom} from 'viem';\n\nimport {\n\tAccountType,\n\tArtifact,\n\tDeployment,\n\tEnvironment,\n\tNamedSigner,\n\tPendingDeployment,\n\tPendingTransaction,\n\tResolvedAccount,\n\tResolvedConfig,\n\tResolvedNamedAccounts,\n\tResolvedNamedSigners,\n\tUnknownArtifacts,\n\tUnknownDeployments,\n\tUnresolvedUnknownNamedAccounts,\n} from './types';\nimport {JSONRPCHTTPProvider} from 'eip-1193-jsonrpc-provider';\nimport {Abi, Address} from 'abitype';\nimport {InternalEnvironment} from '../internal/types';\nimport path from 'node:path';\nimport {JSONToString, stringToJSON} from '../utils/json';\nimport {loadDeployments} from './deployments';\nimport {\n\tEIP1193Account,\n\tEIP1193DATA,\n\tEIP1193ProviderWithoutEvents,\n\tEIP1193QUANTITY,\n\tEIP1193Transaction,\n\tEIP1193TransactionReceipt,\n} from 'eip-1193';\nimport {ProvidedContext} from '../executor/types';\nimport {ProgressIndicator, log, spin} from '../internal/logging';\nimport {PendingExecution} from './types';\nimport {getChain} from './utils/chains';\nimport {mergeArtifacts} from './utils/artifacts';\nimport {TransactionHashTracker} from './providers/TransactionHashTracker';\n\ntype ReceiptResult = {receipt: EIP1193TransactionReceipt; latestBlockNumber: EIP1193QUANTITY};\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 wait(numSeconds: number): Promise<void> {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(resolve, numSeconds * 1000);\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<Artifacts, NamedAccounts, Deployments>}> {\n\tconst rawProvider =\n\t\t'provider' in config.network\n\t\t\t? config.network.provider\n\t\t\t: (new JSONRPCHTTPProvider(config.network.nodeUrl) as EIP1193ProviderWithoutEvents);\n\n\tconst provider = new TransactionHashTracker(rawProvider);\n\n\tconst transport = custom(provider);\n\tconst viemClient = createPublicClient({transport});\n\n\tconst chainId = (await viemClient.getChainId()).toString();\n\tlet genesisHash: `0x${string}` | undefined;\n\ttry {\n\t\tgenesisHash = (await viemClient.getBlock({blockTag: 'earliest'})).hash;\n\t} catch (err) {\n\t\tconsole.error(`failed to get genesis hash`);\n\t}\n\n\tlet networkName: string;\n\tlet saveDeployments: boolean;\n\tlet networkTags: {[tag: string]: boolean} = {};\n\tfor (const networkTag of config.network.tags) {\n\t\tnetworkTags[networkTag] = true;\n\t}\n\n\tif ('nodeUrl' in config) {\n\t\tnetworkName = config.network.name;\n\t\tsaveDeployments = true;\n\t} else {\n\t\tif (config.network.name) {\n\t\t\tnetworkName = config.network.name;\n\t\t} else {\n\t\t\tnetworkName = 'memory';\n\t\t}\n\t\tif (networkName === 'memory' || networkName === 'hardhat') {\n\t\t\tnetworkTags['memory'] = true;\n\t\t\tsaveDeployments = false;\n\t\t} else {\n\t\t\tsaveDeployments = true;\n\t\t}\n\t}\n\n\tif (config.saveDeployments !== undefined) {\n\t\tsaveDeployments = config.saveDeployments;\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\tfork: config.network.fork,\n\t\t\tsaveDeployments,\n\t\t\ttags: networkTags,\n\t\t},\n\t};\n\n\t// console.log(`context`, JSON.stringify(context.network, null, 2));\n\n\tconst {deployments} = loadDeployments(\n\t\tconfig.deployments,\n\t\tcontext.network.name,\n\t\tfalse,\n\t\tcontext.network.fork\n\t\t\t? undefined\n\t\t\t: {\n\t\t\t\t\tchainId,\n\t\t\t\t\tgenesisHash,\n\t\t\t\t\tdeleteDeploymentsIfDifferentGenesisHash: true,\n\t\t\t }\n\t);\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\tchain: getChain(chainId),\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\t// const chainIdFilepath = path.join(folderPath, '.chainId');\n\t\t// if (!fs.existsSync(chainIdFilepath)) {\n\t\t// \tfs.writeFileSync(chainIdFilepath, chainId);\n\t\t// }\n\t\tconst chainFilepath = path.join(folderPath, '.chain');\n\t\tif (!fs.existsSync(chainFilepath)) {\n\t\t\tfs.writeFileSync(chainFilepath, JSON.stringify({chainId, genesisHash}));\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> {\n\t\tconst deployment = deployments[name] as Deployment<TAbi>;\n\t\tif (!deployment) {\n\t\t\tthrow new Error(`no deployment named \"${name}\" found.`);\n\t\t}\n\t\treturn deployment;\n\t}\n\n\tfunction getOrNull<TAbi extends Abi>(name: string): Deployment<TAbi> | null {\n\t\treturn (deployments[name] || null) as Deployment<TAbi> | null;\n\t}\n\n\tfunction fromAddressToNamedABIOrNull<TAbi extends Abi>(address: Address): {mergedABI: TAbi; names: string[]} | null {\n\t\tlet list: {name: string; artifact: Artifact<Abi>}[] = [];\n\t\tfor (const name of Object.keys(deployments)) {\n\t\t\tconst deployment = deployments[name];\n\t\t\tif (deployment.address.toLowerCase() == address.toLowerCase()) {\n\t\t\t\tlist.push({name, artifact: deployment});\n\t\t\t}\n\t\t}\n\t\tif (list.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst {mergedABI} = mergeArtifacts(list);\n\t\treturn {\n\t\t\tmergedABI: mergedABI as unknown as TAbi,\n\t\t\tnames: list.map((v) => v.name),\n\t\t};\n\t}\n\n\tfunction fromAddressToNamedABI<TAbi extends Abi>(address: Address): {mergedABI: TAbi; names: string[]} {\n\t\tconst n = fromAddressToNamedABIOrNull<TAbi>(address);\n\t\tif (!n) {\n\t\t\tthrow new Error(`could not find artifact for address ${address}`);\n\t\t}\n\t\treturn n;\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\tif (!context.network.saveDeployments) {\n\t\t\treturn;\n\t\t}\n\t\tconst folderPath = ensureDeploymentFolder();\n\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\tlet existingPendingTansactions: PendingTransaction[];\n\t\ttry {\n\t\t\texistingPendingTansactions = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t} catch {\n\t\t\texistingPendingTansactions = [];\n\t\t}\n\t\tif (existingPendingTansactions.length > 0) {\n\t\t\twhile (existingPendingTansactions.length > 0) {\n\t\t\t\tconst pendingTransaction = existingPendingTansactions.shift();\n\t\t\t\tif (pendingTransaction) {\n\t\t\t\t\tif (pendingTransaction.type === 'deployment') {\n\t\t\t\t\t\tconst spinner = spin(\n\t\t\t\t\t\t\t`recovering ${pendingTransaction.name} with transaction ${pendingTransaction.transaction.hash}`\n\t\t\t\t\t\t);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait waitForDeploymentTransactionAndSave(pendingTransaction);\n\t\t\t\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingTansactions, 2));\n\t\t\t\t\t\t\tspinner.succeed();\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tspinner.fail();\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst spinner = spin(`recovering execution's transaction ${pendingTransaction.transaction.hash}`);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait waitForTransaction(pendingTransaction.transaction.hash);\n\t\t\t\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingTansactions, 2));\n\t\t\t\t\t\t\tspinner.succeed();\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tspinner.fail();\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t}\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 savePendingTransaction(pendingTransaction: PendingTransaction) {\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 existingPendinTransactions: PendingTransaction[];\n\t\t\ttry {\n\t\t\t\texistingPendinTransactions = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendinTransactions = [];\n\t\t\t}\n\t\t\texistingPendinTransactions.push(pendingTransaction);\n\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendinTransactions, 2));\n\t\t}\n\t\treturn deployments;\n\t}\n\n\tasync function waitForTransactionReceipt(params: {\n\t\thash: EIP1193DATA;\n\t\t// confirmations?: number; // TODO\n\t\tpollingInterval?: number;\n\t\t// timeout?: number; // TODO\n\t}): Promise<ReceiptResult> {\n\t\t// const {hash, confirmations, pollingInterval, timeout} = {confirmations: 1, pollingInterval: 1, ...params};\n\t\tconst {hash, pollingInterval} = {pollingInterval: 1, ...params};\n\n\t\tlet latestBlockNumber = await provider.request({\n\t\t\tmethod: 'eth_blockNumber',\n\t\t});\n\n\t\tlet receipt = await provider.request({\n\t\t\tmethod: 'eth_getTransactionReceipt',\n\t\t\tparams: [hash],\n\t\t});\n\t\tif (!receipt || !receipt.blockHash) {\n\t\t\tawait wait(pollingInterval);\n\t\t\treturn waitForTransactionReceipt(params);\n\t\t}\n\t\treturn {receipt, latestBlockNumber};\n\t}\n\n\tasync function deleteTransaction<TAbi extends Abi = Abi>(hash: string) {\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 existingPendinTransactions: PendingTransaction[];\n\t\t\ttry {\n\t\t\t\texistingPendinTransactions = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendinTransactions = [];\n\t\t\t}\n\t\t\texistingPendinTransactions = existingPendinTransactions.filter((v) => v.transaction.hash !== hash);\n\t\t\tif (existingPendinTransactions.length === 0) {\n\t\t\t\tfs.rmSync(filepath);\n\t\t\t} else {\n\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendinTransactions, 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 waitForTransaction(\n\t\thash: `0x${string}`,\n\t\tinfo?: {message?: string; transaction?: EIP1193Transaction | null}\n\t): Promise<ReceiptResult> {\n\t\tconst spinner = spin(\n\t\t\tinfo?.message\n\t\t\t\t? info.message\n\t\t\t\t: ` - Broadcasting tx:\\n ${hash}${\n\t\t\t\t\t\tinfo?.transaction ? `\\n ${displayTransaction(info?.transaction)}` : ''\n\t\t\t\t }`\n\t\t);\n\t\tlet receiptResult: {receipt: EIP1193TransactionReceipt; latestBlockNumber: EIP1193QUANTITY};\n\t\ttry {\n\t\t\treceiptResult = await waitForTransactionReceipt({\n\t\t\t\thash,\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 (!receiptResult) {\n\t\t\tthrow new Error(`receipt for ${hash} not found`);\n\t\t} else {\n\t\t\tspinner.succeed();\n\t\t}\n\t\treturn receiptResult;\n\t}\n\n\tasync function waitForDeploymentTransactionAndSave<TAbi extends Abi = Abi>(\n\t\tpendingDeployment: PendingDeployment<TAbi>,\n\t\ttransaction?: EIP1193Transaction | null\n\t): Promise<Deployment<TAbi>> {\n\t\tconst message = ` - Deploying ${pendingDeployment.name} with tx:\\n ${pendingDeployment.transaction.hash}${\n\t\t\ttransaction ? `\\n ${displayTransaction(transaction)}` : ''\n\t\t}`;\n\t\tconst {receipt, latestBlockNumber} = await waitForTransaction(pendingDeployment.transaction.hash, {\n\t\t\tmessage,\n\t\t\ttransaction,\n\t\t});\n\n\t\t// TODO we could make pendingDeployment.expectedAddress a spec for fetching address from event too\n\t\tconst contractAddress = pendingDeployment.expectedAddress || receipt.contractAddress;\n\t\tif (!contractAddress) {\n\t\t\tconsole.error(receipt);\n\t\t\tthrow new Error(`no contract address found for ${pendingDeployment.name}`);\n\t\t}\n\n\t\tshowMessage(` => ${contractAddress}`);\n\n\t\tconst {abi, ...artifactObjectWithoutABI} = pendingDeployment.partialDeployment;\n\n\t\tif (!pendingDeployment.transaction.hash) {\n\t\t\tconst spinner = spin(); // TODO 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.transaction.hash],\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.transaction.hash} 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\tpendingDeployment.transaction = {\n\t\t\t\t\tnonce: transaction.nonce,\n\t\t\t\t\thash: transaction.hash,\n\t\t\t\t\torigin: transaction.from,\n\t\t\t\t};\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\tif (artifactObjectWithoutABI.evm) {\n\t\t\t\t\tif ('gasEstimates' in artifactObjectWithoutABI['evm']) {\n\t\t\t\t\t\tconst {gasEstimates} = artifactObjectWithoutABI.evm;\n\t\t\t\t\t\tartifactObjectWithoutABI.evm = {\n\t\t\t\t\t\t\tgasEstimates,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst latestBlockNumberAsNumber = parseInt(latestBlockNumber.slice(2), 16);\n\t\tconst receiptBlockNumber = parseInt(receipt.blockNumber.slice(2), 16);\n\t\tconst confirmations = Math.max(0, latestBlockNumberAsNumber - receiptBlockNumber);\n\n\t\tconst deployment = {\n\t\t\taddress: contractAddress,\n\t\t\tabi,\n\t\t\t...artifactObjectWithoutABI,\n\t\t\ttransaction: pendingDeployment.transaction,\n\t\t\treceipt: {\n\t\t\t\tconfirmations,\n\t\t\t\tblockHash: receipt.blockHash,\n\t\t\t\tblockNumber: receipt.blockNumber,\n\t\t\t\ttransactionIndex: receipt.transactionIndex,\n\t\t\t},\n\t\t};\n\t\treturn save(pendingDeployment.name, deployment);\n\t}\n\n\tasync function savePendingExecution(pendingExecution: PendingExecution) {\n\t\tawait savePendingTransaction(pendingExecution);\n\t\tlet transaction: EIP1193Transaction | null = null;\n\t\tconst spinner = spin(); // TODO 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: [pendingExecution.transaction.hash],\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 ${pendingExecution.transaction.hash} not found`);\n\t\t} else {\n\t\t\tspinner.stop();\n\t\t}\n\n\t\tif (transaction) {\n\t\t\tpendingExecution.transaction.nonce = transaction.nonce;\n\t\t\tpendingExecution.transaction.origin = transaction.from;\n\t\t}\n\n\t\tconst {receipt} = await waitForTransaction(pendingExecution.transaction.hash, {transaction});\n\t\tawait deleteTransaction(pendingExecution.transaction.hash);\n\t\treturn receipt;\n\t}\n\n\tasync function savePendingDeployment<TAbi extends Abi = Abi>(pendingDeployment: PendingDeployment<TAbi>) {\n\t\tawait savePendingTransaction(pendingDeployment);\n\t\tlet transaction: EIP1193Transaction | null = null;\n\t\tconst spinner = spin(); // TODO 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.transaction.hash],\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tconsole.error(`failed to fetch tx ${pendingDeployment.transaction.hash}. Can't know its status`);\n\t\t\tspinner.fail();\n\t\t\tthrow e;\n\t\t}\n\t\tif (!transaction) {\n\t\t\tspinner.fail(`tx ${pendingDeployment.transaction.hash} not found`);\n\t\t} else {\n\t\t\tspinner.stop();\n\t\t}\n\n\t\tif (transaction) {\n\t\t\t// we update the tx data with the one we get from the network\n\t\t\tpendingDeployment = {\n\t\t\t\t...pendingDeployment,\n\t\t\t\ttransaction: {hash: transaction.hash, nonce: transaction.nonce, origin: transaction.from},\n\t\t\t};\n\t\t}\n\n\t\tconst deployment = await waitForDeploymentTransactionAndSave<TAbi>(pendingDeployment, transaction);\n\t\tawait deleteTransaction(pendingDeployment.transaction.hash);\n\t\treturn deployment;\n\t}\n\n\tfunction showMessage(message: string) {\n\t\tlog(message);\n\t}\n\n\tfunction showProgress(message?: string): ProgressIndicator {\n\t\treturn spin(message);\n\t}\n\n\tlet env: Environment<Artifacts, NamedAccounts, Deployments> = {\n\t\t...perliminaryEnvironment,\n\t\tsave,\n\t\tsavePendingDeployment,\n\t\tsavePendingExecution,\n\t\tget,\n\t\tgetOrNull,\n\t\tfromAddressToNamedABI,\n\t\tfromAddressToNamedABIOrNull,\n\t\tshowMessage,\n\t\tshowProgress,\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\tnetworkName: string,\n\tonlyABIAndAddress?: boolean,\n\texpectedChain?: {chainId: string; genesisHash?: `0x${string}`; deleteDeploymentsIfDifferentGenesisHash?: boolean}\n): {deployments: UnknownDeployments; chainId?: string; genesisHash?: `0x${string}`} {\n\tconst deploymentsFound: UnknownDeployments = {};\n\tconst deployPath = path.join(deploymentsPath, networkName);\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\tlet genesisHash: `0x${string}` | undefined;\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, 'utf-8').trim();\n\t\t} else {\n\t\t\tconst chainFilepath = path.join(deployPath, '.chain');\n\t\t\tif (fs.existsSync(chainFilepath)) {\n\t\t\t\tconst chainSTR = fs.readFileSync(chainFilepath, 'utf-8');\n\t\t\t\tconst chainData = JSON.parse(chainSTR);\n\t\t\t\tchainId = chainData.chainId;\n\t\t\t\tgenesisHash = chainData.genesisHash;\n\t\t\t} else {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`A '.chain' or '.chainId' file is expected to be present in the deployment folder for network ${networkName}`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (expectedChain) {\n\t\t\tif (expectedChain.chainId !== 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 (${expectedChain.chainId})`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (expectedChain.genesisHash && expectedChain.genesisHash !== genesisHash) {\n\t\t\t\tif (expectedChain.deleteDeploymentsIfDifferentGenesisHash) {\n\t\t\t\t\t// we delete the old folder\n\n\t\t\t\t\tfs.rmSync(deployPath, {recursive: true, force: true});\n\t\t\t\t\treturn {deployments: {}};\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Loading deployment in folder '${deployPath}' (with genesisHash: ${genesisHash}) for a different genesisHash (${expectedChain.genesisHash})`\n\t\t\t\t\t);\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, genesisHash};\n}\n","import {logs} from 'named-logs';\n\nimport {hookup, factory as Logging} from 'named-logs-console';\n// import ora from 'ora-cjs';\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\nexport type ProgressIndicator = {\n\tstart(msg?: string): ProgressIndicator;\n\tstop(): ProgressIndicator;\n\tsucceed(msg?: string): ProgressIndicator;\n\tfail(msg?: string): ProgressIndicator;\n};\nconst loggerProgressIndicator: ProgressIndicator = {\n\tstart(msg?: string) {\n\t\tif (msg) {\n\t\t\tconsole.log(msg);\n\t\t}\n\t\treturn this;\n\t},\n\tstop() {\n\t\treturn this;\n\t},\n\tsucceed(msg?: string) {\n\t\tif (msg) {\n\t\t\tconsole.log(msg);\n\t\t}\n\t\treturn this;\n\t},\n\tfail(msg?: string) {\n\t\tif (msg) {\n\t\t\tconsole.error(msg);\n\t\t}\n\t\treturn this;\n\t},\n};\nconst voidProgressIndicator: ProgressIndicator = {\n\tstart() {\n\t\treturn this;\n\t},\n\tstop() {\n\t\treturn this;\n\t},\n\tsucceed() {\n\t\treturn this;\n\t},\n\tfail() {\n\t\treturn this;\n\t},\n};\n// export function spin(message: string): PartialOra {\n// \treturn Logging.level > 0 ? ora(message).start() : voidProgressIndicator;\n// }\n\n// let lastSpin = ora('rocketh');\nlet lastSpin = loggerProgressIndicator;\nexport function spin(message?: string): ProgressIndicator {\n\tif (Logging.level > 0) {\n\t\tlastSpin = lastSpin.start(message);\n\t\treturn lastSpin;\n\t} else {\n\t\treturn voidProgressIndicator;\n\t}\n}\n\nexport function log(message: string) {\n\tif (Logging.level > 0) {\n\t\tconsole.log(message);\n\t}\n}\n","import type {Chain} from 'viem/chains';\nimport chains from 'viem/chains';\n\nexport const chainById: {[chainId: string]: Chain} = {};\nconst allChains = (chains as any).default || chains;\nfor (const key of Object.keys(allChains)) {\n\tconst chain = (allChains as any)[key] as Chain;\n\tchainById[chain.id.toString()] = chain;\n}\n\nexport function getChain(id: string): Chain {\n\tconst chain = chainById[id];\n\tif (!chain) {\n\t\treturn {\n\t\t\tid: parseInt(id),\n\t\t\tname: 'unkwown',\n\t\t\t// TODO\n\t\t\tnativeCurrency: {\n\t\t\t\tname: 'Unknown Currency',\n\t\t\t\tsymbol: 'UNKNOWN',\n\t\t\t\tdecimals: 18,\n\t\t\t},\n\t\t\trpcUrls: {\n\t\t\t\tdefault: {\n\t\t\t\t\thttp: [],\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\treturn chain;\n}\n","import {Abi} from 'abitype';\nimport {Artifact, DevDoc, UserDoc} from '../types';\nimport {FunctionFragment} from 'ethers';\n\ntype CreateMutable<Type> = {\n\t-readonly [Property in keyof Type]: Type[Property];\n};\n\ntype ArrayElement<ArrayType extends readonly unknown[]> = ArrayType extends readonly (infer ElementType)[]\n\t? ElementType\n\t: never;\n\n// from https://gist.github.com/egardner/efd34f270cc33db67c0246e837689cb9\nfunction deepEqual(obj1: any, obj2: any): boolean {\n\t// Private\n\tfunction isObject(obj: any) {\n\t\tif (typeof obj === 'object' && obj != null) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tif (obj1 === obj2) {\n\t\treturn true;\n\t} else if (isObject(obj1) && isObject(obj2)) {\n\t\tif (Object.keys(obj1).length !== Object.keys(obj2).length) {\n\t\t\treturn false;\n\t\t}\n\t\tfor (var prop in obj1) {\n\t\t\tif (!deepEqual(obj1[prop], obj2[prop])) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nfunction mergeDoc(values: any, mergedDevDocs: any, field: string) {\n\tif (values[field]) {\n\t\tconst mergedEventDocs = (mergedDevDocs[field] = mergedDevDocs[field] || {});\n\t\tfor (const signature of Object.keys(values[field])) {\n\t\t\tif (mergedEventDocs[signature] && !deepEqual(mergedEventDocs[signature], values[field][signature])) {\n\t\t\t\tthrow new Error(`Doc ${field} conflict: \"${signature}\" `);\n\t\t\t}\n\t\t\tmergedEventDocs[signature] = values[field][signature];\n\t\t}\n\t}\n}\n\nexport function mergeArtifacts(list: {name: string; artifact: Artifact<Abi>}[]) {\n\tconst mergedABI: CreateMutable<Abi> = [];\n\tconst added: Map<string, ArrayElement<Abi>> = new Map();\n\tconst mergedDevDocs: CreateMutable<DevDoc> = {kind: 'dev', version: 1, methods: {}};\n\tconst mergedUserDocs: CreateMutable<UserDoc> = {kind: 'user', version: 1, methods: {}};\n\tconst sigJSMap: Map<`0x${string}`, {index: number; routeName: string; functionName: string}> = new Map();\n\n\tfor (let i = 0; i < list.length; i++) {\n\t\tconst listElem = list[i];\n\t\tfor (const element of listElem.artifact.abi) {\n\t\t\tif (element.type === 'function') {\n\t\t\t\t// const selector = getFunctionSelector(element);\n\t\t\t\tconst selector = FunctionFragment.from(element).selector as `0x${string}`;\n\t\t\t\tif (sigJSMap.has(selector)) {\n\t\t\t\t\tconst existing = sigJSMap.get(selector);\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`ABI conflict: ${existing!.routeName} has function \"${existing!.functionName}\" which conflict with ${\n\t\t\t\t\t\t\tlistElem.name\n\t\t\t\t\t\t}'s \"${element.name}\" (selector: \"${selector}\") `\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tsigJSMap.set(selector, {index: i, routeName: listElem.name, functionName: element.name});\n\n\t\t\t\tconst exists = added.has(element.name);\n\t\t\t\tif (exists) {\n\t\t\t\t\t// TODO check if same\n\t\t\t\t} else {\n\t\t\t\t\tadded.set(element.name, element);\n\t\t\t\t\tmergedABI.push(element);\n\t\t\t\t}\n\t\t\t} else if (element.type === 'constructor') {\n\t\t\t\t// we skip it\n\t\t\t} else if (element.type === 'error') {\n\t\t\t\tconst exists = added.has(element.name);\n\t\t\t\tif (exists) {\n\t\t\t\t\t// TODO check if same\n\t\t\t\t} else {\n\t\t\t\t\tadded.set(element.name, element);\n\t\t\t\t\tmergedABI.push(element);\n\t\t\t\t}\n\t\t\t} else if (element.type === 'event') {\n\t\t\t\tconst exists = added.has(element.name);\n\t\t\t\tif (exists) {\n\t\t\t\t\t// TODO check if same\n\t\t\t\t} else {\n\t\t\t\t\tadded.set(element.name, element);\n\t\t\t\t\tmergedABI.push(element);\n\t\t\t\t}\n\t\t\t} else if (element.type === 'fallback') {\n\t\t\t} else if (element.type === 'receive') {\n\t\t\t} else {\n\t\t\t\t// if ('name' in element) {\n\t\t\t\t// \tconst exists = added.has(element.name);\n\t\t\t\t// \tif (exists) {\n\t\t\t\t// \t\t// TODO check if same\n\t\t\t\t// \t} else {\n\t\t\t\t// \t\tadded.set(element.name, element);\n\t\t\t\t// \t\tmergedABI.push(element);\n\t\t\t\t// \t}\n\t\t\t\t// }\n\t\t\t}\n\t\t}\n\t\tconst devdoc = listElem.artifact.devdoc;\n\t\tif (devdoc) {\n\t\t\tmergeDoc(devdoc, mergedDevDocs, 'events');\n\t\t\tmergeDoc(devdoc, mergedDevDocs, 'errors');\n\t\t\tmergeDoc(devdoc, mergedDevDocs, 'methods');\n\t\t\tif (devdoc.author) {\n\t\t\t\tif (mergedDevDocs.author && mergedDevDocs.author != devdoc.author) {\n\t\t\t\t\tthrow new Error(`DevDoc author conflict `);\n\t\t\t\t}\n\t\t\t\tmergedDevDocs.author = devdoc.author;\n\t\t\t\tif (mergedDevDocs.title && mergedDevDocs.title != devdoc.title) {\n\t\t\t\t\tthrow new Error(`DevDoc title conflict `);\n\t\t\t\t}\n\t\t\t\tmergedDevDocs.title = devdoc.title;\n\t\t\t}\n\t\t}\n\n\t\tconst userdoc = listElem.artifact.userdoc;\n\t\tif (userdoc) {\n\t\t\tmergeDoc(userdoc, mergedUserDocs, 'events');\n\t\t\tmergeDoc(userdoc, mergedUserDocs, 'errors');\n\t\t\tmergeDoc(userdoc, mergedUserDocs, 'methods');\n\t\t\tif (userdoc.notice) {\n\t\t\t\tif (mergedUserDocs.notice && mergedUserDocs.notice != userdoc.notice) {\n\t\t\t\t\tthrow new Error(`UserDoc notice conflict `);\n\t\t\t\t}\n\t\t\t\tmergedUserDocs.notice = userdoc.notice;\n\t\t\t}\n\t\t}\n\t}\n\treturn {\n\t\tmergedABI,\n\t\tadded,\n\t\tmergedDevDocs,\n\t\tmergedUserDocs,\n\t\tsigJSMap,\n\t};\n}\n","import {\n\tEIP1193Accounts,\n\tEIP1193AccountsRequest,\n\tEIP1193AddChainError,\n\tEIP1193Block,\n\tEIP1193BlockNumberRequest,\n\tEIP1193BlockWithTransactions,\n\tEIP1193CallRequest,\n\tEIP1193ChainIdRequest,\n\tEIP1193CoinbaseRequest,\n\tEIP1193EstimateGasRequest,\n\tEIP1193GasPriceRequest,\n\tEIP1193GenericRequest,\n\tEIP1193GenericRequestProvider,\n\tEIP1193GetBalanceRequest,\n\tEIP1193GetBlockByHashRequest,\n\tEIP1193GetBlockByNumberRequest,\n\tEIP1193GetCodeRequest,\n\tEIP1193GetLogsRequest,\n\tEIP1193GetStorageAtRequest,\n\tEIP1193GetTransactionByBlockHashAndIndexRequest,\n\tEIP1193GetTransactionByBlockNumberAndIndexRequest,\n\tEIP1193GetTransactionByHashRequest,\n\tEIP1193GetTransactionCountByHashRequest,\n\tEIP1193GetTransactionCountByNumberRequest,\n\tEIP1193GetTransactionCountRequest,\n\tEIP1193GetTransactionReceiptRequest,\n\tEIP1193GetUncleByBlockHashAndIndexRequest,\n\tEIP1193GetUncleByBlockNumberAndIndexRequest,\n\tEIP1193GetUncleCountByBlockHashRequest,\n\tEIP1193GetUncleCountByBlockNumberRequest,\n\tEIP1193LegacySignRequest,\n\tEIP1193Log,\n\tEIP1193NetListeningRequest,\n\tEIP1193NetPeerCountRequest,\n\tEIP1193NetVersionRequest,\n\tEIP1193PTypedSignRequest,\n\tEIP1193PTypedSignv4Request,\n\tEIP1193PersonalSignRequest,\n\tEIP1193ProtocolVersionRequest,\n\tEIP1193ProviderWithoutEvents,\n\tEIP1193RequestAccountsRequest,\n\tEIP1193SendRawTransactionRequest,\n\tEIP1193SendTransactionRequest,\n\tEIP1193SignTransactionRequest,\n\tEIP1193SubscribeRequest,\n\tEIP1193SwitchChainError,\n\tEIP1193SyncingRequest,\n\tEIP1193SyncingStatus,\n\tEIP1193Transaction,\n\tEIP1193TransactionReceipt,\n\tEIP1193UnsubscribeRequest,\n\tEIP1193Web3ClientVersionRequest,\n\tEIP1193Web3SHARequest,\n\tERIP1193AddChainRequest,\n\tERIP1193SwitchChainRequest,\n} from 'eip-1193';\n\nexport abstract class BaseProvider implements EIP1193ProviderWithoutEvents {\n\tconstructor(protected provider: EIP1193GenericRequestProvider) {}\n\trequest(args: EIP1193Web3ClientVersionRequest): Promise<string>;\n\trequest(args: EIP1193Web3SHARequest): Promise<`0x${string}`>;\n\trequest(args: EIP1193NetVersionRequest): Promise<`0x${string}`>;\n\trequest(args: EIP1193NetListeningRequest): Promise<boolean>;\n\trequest(args: EIP1193NetPeerCountRequest): Promise<`0x${string}`>;\n\trequest(args: EIP1193ProtocolVersionRequest): Promise<string>;\n\trequest(args: EIP1193SyncingRequest): Promise<false | EIP1193SyncingStatus>;\n\trequest(args: EIP1193CoinbaseRequest): Promise<`0x${string}`>;\n\trequest(args: EIP1193GasPriceRequest): Promise<`0x${string}`>;\n\trequest(args: EIP1193AccountsRequest): Promise<EIP1193Accounts>;\n\trequest(args: EIP1193BlockNumberRequest): Promise<`0x${string}`>;\n\trequest(args: EIP1193GetBalanceRequest): Promise<`0x${string}`>;\n\trequest(args: EIP1193GetStorageAtRequest): Promise<`0x${string}`>;\n\trequest(args: EIP1193GetTransactionCountRequest): Promise<`0x${string}`>;\n\trequest(args: EIP1193GetTransactionCountByHashRequest): Promise<`0x${string}`>;\n\trequest(args: EIP1193GetTransactionCountByNumberRequest): Promise<`0x${string}`>;\n\trequest(args: EIP1193GetUncleCountByBlockHashRequest): Promise<`0x${string}`>;\n\trequest(args: EIP1193GetUncleCountByBlockNumberRequest): Promise<`0x${string}`>;\n\trequest(args: EIP1193GetCodeRequest): Promise<`0x${string}`>;\n\trequest(args: EIP1193LegacySignRequest): Promise<`0x${string}`>;\n\trequest(args: EIP1193SignTransactionRequest): Promise<`0x${string}`>;\n\trequest(args: EIP1193SendTransactionRequest): Promise<`0x${string}`>;\n\trequest(args: EIP1193SendRawTransactionRequest): Promise<`0x${string}`>;\n\trequest(args: EIP1193CallRequest): Promise<`0x${string}`>;\n\trequest(args: EIP1193EstimateGasRequest): Promise<`0x${string}`>;\n\trequest(args: EIP1193GetBlockByHashRequest<false>): Promise<EIP1193Block | null>;\n\trequest(args: EIP1193GetBlockByHashRequest<true>): Promise<EIP1193BlockWithTransactions | null>;\n\trequest(args: EIP1193GetBlockByNumberRequest<false>): Promise<EIP1193Block | null>;\n\trequest(args: EIP1193GetBlockByNumberRequest<true>): Promise<EIP1193BlockWithTransactions | null>;\n\trequest(args: EIP1193GetTransactionByHashRequest): Promise<EIP1193Transaction | null>;\n\trequest(args: EIP1193GetTransactionByBlockHashAndIndexRequest): Promise<EIP1193Transaction | null>;\n\trequest(args: EIP1193GetTransactionByBlockNumberAndIndexRequest): Promise<EIP1193Transaction | null>;\n\trequest(args: EIP1193GetTransactionReceiptRequest): Promise<EIP1193TransactionReceipt | null>;\n\trequest(args: EIP1193GetUncleByBlockHashAndIndexRequest): Promise<EIP1193Block | null>;\n\trequest(args: EIP1193GetUncleByBlockNumberAndIndexRequest): Promise<EIP1193Block | null>;\n\trequest(args: EIP1193GetLogsRequest): Promise<EIP1193Log[]>;\n\trequest(args: EIP1193PersonalSignRequest): Promise<`0x${string}`>;\n\trequest(args: EIP1193PTypedSignv4Request): Promise<`0x${string}`>;\n\trequest(args: EIP1193PTypedSignRequest): Promise<`0x${string}`>;\n\trequest(args: EIP1193ChainIdRequest): Promise<`0x${string}`>;\n\trequest(args: EIP1193RequestAccountsRequest): Promise<EIP1193Accounts>;\n\trequest(args: ERIP1193SwitchChainRequest): Promise<EIP1193SwitchChainError | null>;\n\trequest(args: ERIP1193AddChainRequest): Promise<EIP1193AddChainError | null>;\n\trequest(args: EIP1193SubscribeRequest): Promise<string>;\n\trequest(args: EIP1193UnsubscribeRequest): Promise<boolean>;\n\trequest<T = unknown, V extends EIP1193GenericRequest = EIP1193GenericRequest>(args: V): Promise<T>;\n\trequest<T = unknown, V extends EIP1193GenericRequest = EIP1193GenericRequest>(args: V): Promise<T> {\n\t\treturn this._request(args);\n\t}\n\n\tprotected abstract _request<T = unknown, V extends EIP1193GenericRequest = EIP1193GenericRequest>(\n\t\targs: V\n\t): Promise<T>;\n}\n","import {EIP1193GenericRequest, EIP1193GenericRequestProvider} from 'eip-1193';\nimport {BaseProvider} from './BaseProvider';\n\nexport class TransactionHashTracker extends BaseProvider {\n\tpublic transactionHashes: `0x${string}`[] = [];\n\n\tconstructor(provider: EIP1193GenericRequestProvider) {\n\t\tsuper(provider);\n\t}\n\n\tprotected async _request<T = unknown, V extends EIP1193GenericRequest = EIP1193GenericRequest>(args: V): Promise<T> {\n\t\tconst response = await this.provider.request<T>(args);\n\t\tif (args.method === 'eth_sendRawTransaction' || args.method === 'eth_sendTransaction') {\n\t\t\tthis.transactionHashes.push(response as `0x${string}`);\n\t\t}\n\t\treturn response;\n\t}\n}\n","import {EIP1193BlockTag, EIP1193ProviderWithoutEvents} from 'eip-1193';\n\nfunction avg(arr: bigint[]) {\n\tconst sum = arr.reduce((a: bigint, v: bigint) => a + v);\n\treturn sum / BigInt(arr.length);\n}\n\ntype EIP1193FeeHistory = {\n\toldestBlock: string;\n\treward: `0x${string}`[][];\n\tbaseFeePerGas: string[];\n\tgasUsedRatio: string[];\n};\n\nexport type EstimateGasPriceOptions = {\n\tblockCount: number;\n\tnewestBlock: EIP1193BlockTag;\n\trewardPercentiles: number[];\n};\n\nexport type RoughEstimateGasPriceOptions = {\n\tblockCount: number;\n\tnewestBlock: EIP1193BlockTag;\n\trewardPercentiles: [number, number, number];\n};\n\nexport type GasPrice = {maxFeePerGas: bigint; maxPriorityFeePerGas: bigint};\nexport type EstimateGasPriceResult = GasPrice[];\nexport type RoughEstimateGasPriceResult = {slow: GasPrice; average: GasPrice; fast: GasPrice};\n\nexport async function getGasPriceEstimate(\n\tprovider: EIP1193ProviderWithoutEvents,\n\toptions?: Partial<EstimateGasPriceOptions>\n): Promise<EstimateGasPriceResult> {\n\tconst defaultOptions: EstimateGasPriceOptions = {\n\t\tblockCount: 20,\n\t\tnewestBlock: 'pending',\n\t\trewardPercentiles: [10, 50, 80],\n\t};\n\tconst optionsResolved = options ? {...defaultOptions, ...options} : defaultOptions;\n\n\tconst historicalBlocks = optionsResolved.blockCount;\n\n\tconst rawFeeHistory = await provider.request<EIP1193FeeHistory>({\n\t\tmethod: 'eth_feeHistory',\n\t\tparams: [`0x${historicalBlocks.toString(16)}`, optionsResolved.newestBlock, optionsResolved.rewardPercentiles],\n\t});\n\n\tlet blockNum = Number(rawFeeHistory.oldestBlock);\n\tconst lastBlock = blockNum + rawFeeHistory.reward.length;\n\tlet index = 0;\n\tconst blocksHistory: {number: number; baseFeePerGas: bigint; gasUsedRatio: number; priorityFeePerGas: bigint[]}[] =\n\t\t[];\n\twhile (blockNum < lastBlock) {\n\t\tblocksHistory.push({\n\t\t\tnumber: blockNum,\n\t\t\tbaseFeePerGas: BigInt(rawFeeHistory.baseFeePerGas[index]),\n\t\t\tgasUsedRatio: Number(rawFeeHistory.gasUsedRatio[index]),\n\t\t\tpriorityFeePerGas: rawFeeHistory.reward[index].map((x) => BigInt(x)),\n\t\t});\n\t\tblockNum += 1;\n\t\tindex += 1;\n\t}\n\n\tconst percentilePriorityFeeAverages: bigint[] = [];\n\tfor (let i = 0; i < optionsResolved.rewardPercentiles.length; i++) {\n\t\tpercentilePriorityFeeAverages.push(avg(blocksHistory.map((b) => b.priorityFeePerGas[i])));\n\t}\n\n\tconst baseFeePerGas = BigInt(rawFeeHistory.baseFeePerGas[rawFeeHistory.baseFeePerGas.length - 1]);\n\n\tconst result: EstimateGasPriceResult = [];\n\tfor (let i = 0; i < optionsResolved.rewardPercentiles.length; i++) {\n\t\tresult.push({\n\t\t\tmaxFeePerGas: percentilePriorityFeeAverages[i] + baseFeePerGas,\n\t\t\tmaxPriorityFeePerGas: percentilePriorityFeeAverages[i],\n\t\t});\n\t}\n\treturn result;\n}\n\nexport async function getRoughGasPriceEstimate(\n\tprovider: EIP1193ProviderWithoutEvents,\n\toptions?: Partial<RoughEstimateGasPriceOptions>\n): Promise<RoughEstimateGasPriceResult> {\n\tconst defaultOptions: EstimateGasPriceOptions = {\n\t\tblockCount: 20,\n\t\tnewestBlock: 'pending',\n\t\trewardPercentiles: [10, 50, 80],\n\t};\n\tconst optionsResolved = options ? {...defaultOptions, ...options} : defaultOptions;\n\n\tif (optionsResolved.rewardPercentiles.length !== 3) {\n\t\tthrow new Error(`rough gas estimate require 3 percentile, it defaults to [10,50,80]`);\n\t}\n\n\tconst result = await getGasPriceEstimate(provider, optionsResolved);\n\treturn {\n\t\tslow: result[0],\n\t\taverage: result[1],\n\t\tfast: result[2],\n\t};\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,qBAAe;AACf,uBAAiB;AAwBV,SAAS,0BAA0B,MAA0B;AACnE,QAAM,YAAY,CAAC;AACnB,aAAW,OAAO,MAAM;AACvB,QAAI,aAAa,SAAS,GAAG;AAC7B,iBAAa,WAAW,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS;AAClD,eAAW,YAAY,YAAY;AAClC,gBAAU,KAAK,iBAAAA,QAAK,KAAK,KAAK,SAAS,YAAY,CAAC;AAAA,IACrD;AAAA,EACD;AACA,SAAO;AACR;AAEO,IAAM,WAAW,SACvB,KACA,SAAgB,CAAC,GACjB,QACA,QAOE;AACF,iBAAAC,QAAG,YAAY,GAAG,EAAE,QAAQ,CAAC,SAAS;AACrC,UAAM,QAAQ,iBAAAD,QAAK,QAAQ,KAAK,IAAI;AACpC,UAAM,QAAQ,eAAAC,QAAG,SAAS,KAAK;AAC/B,QAAK,CAAC,UAAU,CAAC,KAAK,WAAW,GAAG,KAAO,UAAU,OAAO,MAAM,KAAK,GAAI;AAC1E,YAAM,YAAY;AAAA,QACjB;AAAA,QACA,MAAM;AAAA,QACN,cAAc,iBAAAD,QAAK,SAAS,UAAU,KAAK,KAAK;AAAA,QAChD,SAAS,MAAM;AAAA,QACf,WAAW,MAAM,YAAY;AAAA,MAC9B;AACA,UAAI,UAAU,WAAW;AACxB,eAAO,KAAK,SAAS;AACrB,eAAO,SAAS,OAAO,QAAQ,UAAU,KAAK,MAAM;AAAA,MACrD;AACA,aAAO,KAAK,SAAS;AAAA,IACtB;AAAA,EACD,CAAC;AACD,SAAO;AACR;;;ACpEA,IAAAE,oBAAiB;AACjB,IAAAC,kBAAe;;;ACFf,IAAAC,kBAAe;AAEf,kBAA6D;AAkB7D,uCAAkC;AAGlC,IAAAC,oBAAiB;;;ACtBV,SAAS,WAAW,GAAW,GAAa;AAClD,MAAI,OAAO,MAAM,UAAU;AAC1B,WAAO,EAAE,SAAS,IAAI;AAAA,EACvB;AACA,SAAO;AACR;AAEO,SAAS,UAAU,GAAW,GAAa;AACjD,MACC,OAAO,MAAM,aACZ,EAAE,WAAW,GAAG,IAAI,CAAC,MAAM,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,MACjF,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,KAC1B;AACD,WAAO,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,EAC7B;AACA,SAAO;AACR;AAEO,SAAS,aAA0B,MAAe,OAAyB;AACjF,SAAO,KAAK,UAAU,MAAM,YAAY,KAAK;AAC9C;AAEO,SAAS,aAA0B,KAAgB;AACzD,SAAO,KAAK,MAAM,KAAK,SAAS;AACjC;;;ACzBA,IAAAC,oBAAiB;AACjB,IAAAC,kBAAe;AAIR,SAAS,gBACf,iBACA,aACA,mBACA,eACmF;AACnF,QAAM,mBAAuC,CAAC;AAC9C,QAAM,aAAa,kBAAAC,QAAK,KAAK,iBAAiB,WAAW;AAEzD,MAAI;AACJ,MAAI;AACH,iBAAa,SAAS,YAAY,QAAW,QAAW,CAAC,SAAS,CAAC,KAAK,WAAW,GAAG,KAAK,SAAS,YAAY;AAAA,EACjH,SAAS,GAAG;AAEX,WAAO,EAAC,aAAa,CAAC,EAAC;AAAA,EACxB;AACA,MAAI;AACJ,MAAI;AACJ,MAAI,WAAW,SAAS,GAAG;AAC1B,UAAM,kBAAkB,kBAAAA,QAAK,KAAK,YAAY,UAAU;AACxD,QAAI,gBAAAC,QAAG,WAAW,eAAe,GAAG;AACnC,gBAAU,gBAAAA,QAAG,aAAa,iBAAiB,OAAO,EAAE,KAAK;AAAA,IAC1D,OAAO;AACN,YAAM,gBAAgB,kBAAAD,QAAK,KAAK,YAAY,QAAQ;AACpD,UAAI,gBAAAC,QAAG,WAAW,aAAa,GAAG;AACjC,cAAM,WAAW,gBAAAA,QAAG,aAAa,eAAe,OAAO;AACvD,cAAM,YAAY,KAAK,MAAM,QAAQ;AACrC,kBAAU,UAAU;AACpB,sBAAc,UAAU;AAAA,MACzB,OAAO;AACN,cAAM,IAAI;AAAA,UACT,gGAAgG,WAAW;AAAA,QAC5G;AAAA,MACD;AAAA,IACD;AAEA,QAAI,eAAe;AAClB,UAAI,cAAc,YAAY,SAAS;AACtC,cAAM,IAAI;AAAA,UACT,iCAAiC,UAAU,oBAAoB,OAAO,8BAA8B,cAAc,OAAO;AAAA,QAC1H;AAAA,MACD;AAEA,UAAI,cAAc,eAAe,cAAc,gBAAgB,aAAa;AAC3E,YAAI,cAAc,yCAAyC;AAG1D,0BAAAA,QAAG,OAAO,YAAY,EAAC,WAAW,MAAM,OAAO,KAAI,CAAC;AACpD,iBAAO,EAAC,aAAa,CAAC,EAAC;AAAA,QACxB,OAAO;AACN,gBAAM,IAAI;AAAA,YACT,iCAAiC,UAAU,wBAAwB,WAAW,kCAAkC,cAAc,WAAW;AAAA,UAC1I;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD,OAAO;AACN,WAAO,EAAC,aAAa,CAAC,EAAC;AAAA,EACxB;AACA,MAAI,YAAY,WAAW,IAAI,CAAC,MAAM,EAAE,YAAY;AACpD,cAAY,UAAU,KAAK,CAAC,GAAG,MAAM;AACpC,QAAI,IAAI,GAAG;AACV,aAAO;AAAA,IACR;AACA,QAAI,IAAI,GAAG;AACV,aAAO;AAAA,IACR;AACA,WAAO;AAAA,EACR,CAAC;AAED,aAAW,YAAY,WAAW;AACjC,QAAI,SAAS,UAAU,SAAS,SAAS,CAAC,MAAM,SAAS;AACxD,YAAM,qBAAqB,kBAAAD,QAAK,KAAK,YAAY,QAAQ;AACzD,UAAI,aAAa,KAAK,MAAM,gBAAAC,QAAG,aAAa,kBAAkB,EAAE,SAAS,CAAC;AAU1E,UAAI,mBAAmB;AACtB,qBAAa;AAAA,UACZ,SAAS,WAAW;AAAA,UACpB,KAAK,WAAW;AAAA,UAChB,YAAY,WAAW;AAAA,QACxB;AAAA,MACD;AACA,YAAM,OAAO,SAAS,MAAM,GAAG,SAAS,SAAS,CAAC;AAGlD,uBAAiB,IAAI,IAAI;AAAA,IAC1B;AAAA,EACD;AACA,SAAO,EAAC,aAAa,kBAAkB,SAAS,YAAW;AAC5D;;;ACtGA,wBAAmB;AAEnB,gCAAyC;AAAA,IAEzC,kCAAO;AAEA,SAAS,YAAY,OAAe;AAC1C,4BAAAC,QAAQ,QAAQ;AAChB,MAAI,0BAAAA,QAAQ,QAAQ,GAAG;AACtB,8BAAAA,QAAQ,OAAO;AAAA,EAChB,OAAO;AACN,8BAAAA,QAAQ,QAAQ;AAAA,EACjB;AACD;AAEO,IAAM,aAAS,wBAAK,SAAS;AAQpC,IAAM,0BAA6C;AAAA,EAClD,MAAM,KAAc;AACnB,QAAI,KAAK;AACR,cAAQ,IAAI,GAAG;AAAA,IAChB;AACA,WAAO;AAAA,EACR;AAAA,EACA,OAAO;AACN,WAAO;AAAA,EACR;AAAA,EACA,QAAQ,KAAc;AACrB,QAAI,KAAK;AACR,cAAQ,IAAI,GAAG;AAAA,IAChB;AACA,WAAO;AAAA,EACR;AAAA,EACA,KAAK,KAAc;AAClB,QAAI,KAAK;AACR,cAAQ,MAAM,GAAG;AAAA,IAClB;AACA,WAAO;AAAA,EACR;AACD;AACA,IAAM,wBAA2C;AAAA,EAChD,QAAQ;AACP,WAAO;AAAA,EACR;AAAA,EACA,OAAO;AACN,WAAO;AAAA,EACR;AAAA,EACA,UAAU;AACT,WAAO;AAAA,EACR;AAAA,EACA,OAAO;AACN,WAAO;AAAA,EACR;AACD;AAMA,IAAI,WAAW;AACR,SAAS,KAAK,SAAqC;AACzD,MAAI,0BAAAA,QAAQ,QAAQ,GAAG;AACtB,eAAW,SAAS,MAAM,OAAO;AACjC,WAAO;AAAA,EACR,OAAO;AACN,WAAO;AAAA,EACR;AACD;AAEO,SAAS,IAAI,SAAiB;AACpC,MAAI,0BAAAA,QAAQ,QAAQ,GAAG;AACtB,YAAQ,IAAI,OAAO;AAAA,EACpB;AACD;;;AC9EA,oBAAmB;AAEZ,IAAM,YAAwC,CAAC;AACtD,IAAM,YAAa,cAAAC,QAAe,WAAW,cAAAA;AAC7C,WAAW,OAAO,OAAO,KAAK,SAAS,GAAG;AACzC,QAAM,QAAS,UAAkB,GAAG;AACpC,YAAU,MAAM,GAAG,SAAS,CAAC,IAAI;AAClC;AAEO,SAAS,SAAS,IAAmB;AAC3C,QAAM,QAAQ,UAAU,EAAE;AAC1B,MAAI,CAAC,OAAO;AACX,WAAO;AAAA,MACN,IAAI,SAAS,EAAE;AAAA,MACf,MAAM;AAAA;AAAA,MAEN,gBAAgB;AAAA,QACf,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,UAAU;AAAA,MACX;AAAA,MACA,SAAS;AAAA,QACR,SAAS;AAAA,UACR,MAAM,CAAC;AAAA,QACR;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACA,SAAO;AACR;;;AC5BA,oBAA+B;AAW/B,SAAS,UAAU,MAAW,MAAoB;AAEjD,WAAS,SAAS,KAAU;AAC3B,QAAI,OAAO,QAAQ,YAAY,OAAO,MAAM;AAC3C,aAAO;AAAA,IACR,OAAO;AACN,aAAO;AAAA,IACR;AAAA,EACD;AAEA,MAAI,SAAS,MAAM;AAClB,WAAO;AAAA,EACR,WAAW,SAAS,IAAI,KAAK,SAAS,IAAI,GAAG;AAC5C,QAAI,OAAO,KAAK,IAAI,EAAE,WAAW,OAAO,KAAK,IAAI,EAAE,QAAQ;AAC1D,aAAO;AAAA,IACR;AACA,aAAS,QAAQ,MAAM;AACtB,UAAI,CAAC,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,GAAG;AACvC,eAAO;AAAA,MACR;AAAA,IACD;AACA,WAAO;AAAA,EACR;AACA,SAAO;AACR;AAEA,SAAS,SAAS,QAAa,eAAoB,OAAe;AACjE,MAAI,OAAO,KAAK,GAAG;AAClB,UAAM,kBAAmB,cAAc,KAAK,IAAI,cAAc,KAAK,KAAK,CAAC;AACzE,eAAW,aAAa,OAAO,KAAK,OAAO,KAAK,CAAC,GAAG;AACnD,UAAI,gBAAgB,SAAS,KAAK,CAAC,UAAU,gBAAgB,SAAS,GAAG,OAAO,KAAK,EAAE,SAAS,CAAC,GAAG;AACnG,cAAM,IAAI,MAAM,OAAO,KAAK,eAAe,SAAS,IAAI;AAAA,MACzD;AACA,sBAAgB,SAAS,IAAI,OAAO,KAAK,EAAE,SAAS;AAAA,IACrD;AAAA,EACD;AACD;AAEO,SAAS,eAAe,MAAiD;AAC/E,QAAM,YAAgC,CAAC;AACvC,QAAM,QAAwC,oBAAI,IAAI;AACtD,QAAM,gBAAuC,EAAC,MAAM,OAAO,SAAS,GAAG,SAAS,CAAC,EAAC;AAClF,QAAM,iBAAyC,EAAC,MAAM,QAAQ,SAAS,GAAG,SAAS,CAAC,EAAC;AACrF,QAAM,WAAyF,oBAAI,IAAI;AAEvG,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACrC,UAAM,WAAW,KAAK,CAAC;AACvB,eAAW,WAAW,SAAS,SAAS,KAAK;AAC5C,UAAI,QAAQ,SAAS,YAAY;AAEhC,cAAM,WAAW,+BAAiB,KAAK,OAAO,EAAE;AAChD,YAAI,SAAS,IAAI,QAAQ,GAAG;AAC3B,gBAAM,WAAW,SAAS,IAAI,QAAQ;AACtC,gBAAM,IAAI;AAAA,YACT,iBAAiB,SAAU,SAAS,kBAAkB,SAAU,YAAY,yBAC3E,SAAS,IACV,OAAO,QAAQ,IAAI,iBAAiB,QAAQ;AAAA,UAC7C;AAAA,QACD;AACA,iBAAS,IAAI,UAAU,EAAC,OAAO,GAAG,WAAW,SAAS,MAAM,cAAc,QAAQ,KAAI,CAAC;AAEvF,cAAM,SAAS,MAAM,IAAI,QAAQ,IAAI;AACrC,YAAI,QAAQ;AAAA,QAEZ,OAAO;AACN,gBAAM,IAAI,QAAQ,MAAM,OAAO;AAC/B,oBAAU,KAAK,OAAO;AAAA,QACvB;AAAA,MACD,WAAW,QAAQ,SAAS,eAAe;AAAA,MAE3C,WAAW,QAAQ,SAAS,SAAS;AACpC,cAAM,SAAS,MAAM,IAAI,QAAQ,IAAI;AACrC,YAAI,QAAQ;AAAA,QAEZ,OAAO;AACN,gBAAM,IAAI,QAAQ,MAAM,OAAO;AAC/B,oBAAU,KAAK,OAAO;AAAA,QACvB;AAAA,MACD,WAAW,QAAQ,SAAS,SAAS;AACpC,cAAM,SAAS,MAAM,IAAI,QAAQ,IAAI;AACrC,YAAI,QAAQ;AAAA,QAEZ,OAAO;AACN,gBAAM,IAAI,QAAQ,MAAM,OAAO;AAC/B,oBAAU,KAAK,OAAO;AAAA,QACvB;AAAA,MACD,WAAW,QAAQ,SAAS,YAAY;AAAA,MACxC,WAAW,QAAQ,SAAS,WAAW;AAAA,MACvC,OAAO;AAAA,MAUP;AAAA,IACD;AACA,UAAM,SAAS,SAAS,SAAS;AACjC,QAAI,QAAQ;AACX,eAAS,QAAQ,eAAe,QAAQ;AACxC,eAAS,QAAQ,eAAe,QAAQ;AACxC,eAAS,QAAQ,eAAe,SAAS;AACzC,UAAI,OAAO,QAAQ;AAClB,YAAI,cAAc,UAAU,cAAc,UAAU,OAAO,QAAQ;AAClE,gBAAM,IAAI,MAAM,yBAAyB;AAAA,QAC1C;AACA,sBAAc,SAAS,OAAO;AAC9B,YAAI,cAAc,SAAS,cAAc,SAAS,OAAO,OAAO;AAC/D,gBAAM,IAAI,MAAM,wBAAwB;AAAA,QACzC;AACA,sBAAc,QAAQ,OAAO;AAAA,MAC9B;AAAA,IACD;AAEA,UAAM,UAAU,SAAS,SAAS;AAClC,QAAI,SAAS;AACZ,eAAS,SAAS,gBAAgB,QAAQ;AAC1C,eAAS,SAAS,gBAAgB,QAAQ;AAC1C,eAAS,SAAS,gBAAgB,SAAS;AAC3C,UAAI,QAAQ,QAAQ;AACnB,YAAI,eAAe,UAAU,eAAe,UAAU,QAAQ,QAAQ;AACrE,gBAAM,IAAI,MAAM,0BAA0B;AAAA,QAC3C;AACA,uBAAe,SAAS,QAAQ;AAAA,MACjC;AAAA,IACD;AAAA,EACD;AACA,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;;;AC5FO,IAAe,eAAf,MAAoE;AAAA,EAC1E,YAAsB,UAAyC;AAAzC;AAAA,EAA0C;AAAA,EA+ChE,QAA8E,MAAqB;AAClG,WAAO,KAAK,SAAS,IAAI;AAAA,EAC1B;AAKD;;;AC9GO,IAAM,yBAAN,cAAqC,aAAa;AAAA,EAGxD,YAAY,UAAyC;AACpD,UAAM,QAAQ;AAHf,SAAO,oBAAqC,CAAC;AAAA,EAI7C;AAAA,EAEA,MAAgB,SAA+E,MAAqB;AACnH,UAAM,WAAW,MAAM,KAAK,SAAS,QAAW,IAAI;AACpD,QAAI,KAAK,WAAW,4BAA4B,KAAK,WAAW,uBAAuB;AACtF,WAAK,kBAAkB,KAAK,QAAyB;AAAA,IACtD;AACA,WAAO;AAAA,EACR;AACD;;;AP4BC,WAAmB,aAAa,CAAC;AAC3B,SAAS,kBAAkB,WAAwC;AACzE,EAAC,WAAmB,WAAW,KAAK,SAAS;AAC9C;AAQC,WAAmB,kBAAkB,CAAC;AAChC,SAAS,qBAAqB,UAAkB,WAAyC;AAC/F,EAAC,WAAmB,gBAAgB,QAAQ,IAAI;AAAA,IAC/C;AAAA,EACD;AACD;AAEA,SAAS,KAAK,YAAmC;AAChD,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC/B,eAAW,SAAS,aAAa,GAAI;AAAA,EACtC,CAAC;AACF;AAEA,SAAS,mBAAmB,aAAiC;AAC5D,MAAI,YAAY,SAAS,OAAO;AAC/B,WAAO,kBAAkB,OAAO,YAAY,YAAY,EAAE,SAAS,CAAC,2BAA2B;AAAA,MAC9F,YAAY;AAAA,IACb,EAAE,SAAS,CAAC;AAAA,EACb,OAAO;AACN,WAAO,cAAc,OAAO,YAAY,QAAQ,EAAE,SAAS,CAAC;AAAA,EAC7D;AACD;AAEA,eAAsB,kBAKrB,QACA,iBACyG;AACzG,QAAM,cACL,cAAc,OAAO,UAClB,OAAO,QAAQ,WACd,IAAI,qDAAoB,OAAO,QAAQ,OAAO;AAEnD,QAAM,WAAW,IAAI,uBAAuB,WAAW;AAEvD,QAAM,gBAAY,oBAAO,QAAQ;AACjC,QAAM,iBAAa,gCAAmB,EAAC,UAAS,CAAC;AAEjD,QAAM,WAAW,MAAM,WAAW,WAAW,GAAG,SAAS;AACzD,MAAI;AACJ,MAAI;AACH,mBAAe,MAAM,WAAW,SAAS,EAAC,UAAU,WAAU,CAAC,GAAG;AAAA,EACnE,SAAS,KAAK;AACb,YAAQ,MAAM,4BAA4B;AAAA,EAC3C;AAEA,MAAI;AACJ,MAAI;AACJ,MAAI,cAAwC,CAAC;AAC7C,aAAW,cAAc,OAAO,QAAQ,MAAM;AAC7C,gBAAY,UAAU,IAAI;AAAA,EAC3B;AAEA,MAAI,aAAa,QAAQ;AACxB,kBAAc,OAAO,QAAQ;AAC7B,sBAAkB;AAAA,EACnB,OAAO;AACN,QAAI,OAAO,QAAQ,MAAM;AACxB,oBAAc,OAAO,QAAQ;AAAA,IAC9B,OAAO;AACN,oBAAc;AAAA,IACf;AACA,QAAI,gBAAgB,YAAY,gBAAgB,WAAW;AAC1D,kBAAY,QAAQ,IAAI;AACxB,wBAAkB;AAAA,IACnB,OAAO;AACN,wBAAkB;AAAA,IACnB;AAAA,EACD;AAEA,MAAI,OAAO,oBAAoB,QAAW;AACzC,sBAAkB,OAAO;AAAA,EAC1B;AAEA,QAAM,mBAAsD,CAAC;AAE7D,QAAM,eAAkD,CAAC;AACzD,iBAAe,WACd,MACA,UACA,YACuC;AACvC,QAAI,aAAa,IAAI,GAAG;AACvB,aAAO,aAAa,IAAI;AAAA,IACzB;AACA,QAAI;AACJ,QAAI,OAAO,eAAe,UAAU;AACnC,YAAMC,YAAW,MAAM,SAAS,QAAQ,EAAC,QAAQ,eAAc,CAAC;AAChE,YAAM,kBAAkBA,UAAS,UAAU;AAC3C,UAAI,iBAAiB;AACpB,qBAAa,IAAI,IAAI,UAAU;AAAA,UAC9B,MAAM;AAAA,UACN,SAAS;AAAA,UACT,QAAQ;AAAA,QACT;AAAA,MACD;AAAA,IACD,WAAW,OAAO,eAAe,UAAU;AAC1C,UAAI,WAAW,WAAW,IAAI,GAAG;AAChC,YAAI,WAAW,WAAW,IAAI;AAC7B,gBAAM,qBAAsC,WAAmB,gBAAgB,YAAY;AAC3F,cAAI,oBAAoB;AACvB,kBAAM,cAAc,MAAM,mBAAmB,UAAU,cAAc,UAAU,EAAE;AACjF,kBAAM,CAAC,OAAO,IAAI,MAAM,YAAY,OAAO,QAAQ,EAAC,QAAQ,eAAc,CAAC;AAC3E,yBAAa,IAAI,IAAI,UAAU;AAAA,cAC9B,GAAG;AAAA,cACH;AAAA,YACD;AAAA,UACD;AAAA,QACD,OAAO;AACN,uBAAa,IAAI,IAAI,UAAU;AAAA,YAC9B,MAAM;AAAA,YACN,SAAS;AAAA,YACT,QAAQ;AAAA,UACT;AAAA,QACD;AAAA,MACD,OAAO;AACN,YAAI,WAAW,QAAQ,GAAG,IAAI,GAAG;AAChC,gBAAM,CAAC,YAAY,KAAK,IAAI,WAAW,MAAM,GAAG;AAChD,gBAAM,WAA4B,WAAmB,gBAAgB,UAAU;AAC/E,cAAI,CAAC,UAAU;AACd,kBAAM,IAAI,MAAM,aAAa,QAAQ,mBAAmB;AAAA,UACzD;AACA,gBAAM,cAAc,MAAM,SAAS,UAAU,UAAU;AACvD,gBAAM,CAAC,OAAO,IAAI,MAAM,YAAY,OAAO,QAAQ,EAAC,QAAQ,eAAc,CAAC;AAC3E,uBAAa,IAAI,IAAI,UAAU;AAAA,YAC9B,GAAG;AAAA,YACH;AAAA,UACD;AAAA,QACD,OAAO;AACN,gBAAM,iBAAiB,MAAM,WAAW,MAAM,UAAU,SAAS,UAAU,CAAC;AAC5E,cAAI,gBAAgB;AACnB,yBAAa,IAAI,IAAI,UAAU;AAAA,UAChC;AAAA,QACD;AAAA,MACD;AAAA,IACD,OAAO;AACN,YAAM,oBAAoB,WAAW,WAAW,KAAK,WAAW,OAAO,KAAK,WAAW,SAAS;AAChG,UAAI,OAAO,sBAAsB,QAAW;AAC3C,cAAM,iBAAiB,MAAM,WAAW,MAAM,UAAU,iBAAiB;AACzE,YAAI,gBAAgB;AACnB,uBAAa,IAAI,IAAI,UAAU;AAAA,QAChC;AAAA,MACD;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAEA,MAAI,gBAAgB,UAAU;AAC7B,UAAM,eAAe,OAAO,KAAK,gBAAgB,QAAQ;AACzD,eAAW,eAAe,cAAc;AACvC,UAAI,UAAU,MAAM,WAAW,aAAa,gBAAgB,UAAU,gBAAgB,SAAS,WAAW,CAAC;AAC3G,MAAC,iBAAyB,WAAW,IAAI;AAAA,IAC1C;AAAA,EACD;AAEA,QAAM,UAAU;AAAA,IACf,UAAU;AAAA,IACV,WAAW,gBAAgB;AAAA,IAC3B,SAAS;AAAA,MACR,MAAM;AAAA,MACN,MAAM,OAAO,QAAQ;AAAA,MACrB;AAAA,MACA,MAAM;AAAA,IACP;AAAA,EACD;AAIA,QAAM,EAAC,YAAW,IAAI;AAAA,IACrB,OAAO;AAAA,IACP,QAAQ,QAAQ;AAAA,IAChB;AAAA,IACA,QAAQ,QAAQ,OACb,SACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,yCAAyC;AAAA,IACzC;AAAA,EACJ;AAEA,QAAM,gBAAkD,CAAC;AACzD,QAAM,eAA8C,CAAC;AACrD,QAAM,iBAAuD,CAAC;AAE9D,aAAW,SAAS,OAAO,QAAQ,gBAAgB,GAAG;AACrD,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,EAAC,SAAS,GAAG,YAAW,IAAI,MAAM,CAAC;AACzC,kBAAc,IAAI,IAAI;AACtB,mBAAe,OAAO,IAAI;AAC1B,iBAAa,IAAI,IAAI;AAAA,EACtB;AAEA,QAAM,yBAAyB;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,SAAS;AAAA,IACT;AAAA,IACA,WAAW,QAAQ;AAAA,IACnB,SAAS;AAAA,MACR,OAAO,SAAS,OAAO;AAAA,MACvB,MAAM,QAAQ,QAAQ;AAAA,MACtB,MAAM,QAAQ,QAAQ;AAAA,MACtB;AAAA,IACD;AAAA,EACD;AAEA,WAAS,yBAAiC;AACzC,UAAM,aAAa,kBAAAC,QAAK,KAAK,OAAO,aAAa,QAAQ,QAAQ,IAAI;AACrE,oBAAAC,QAAG,UAAU,YAAY,EAAC,WAAW,KAAI,CAAC;AAK1C,UAAM,gBAAgB,kBAAAD,QAAK,KAAK,YAAY,QAAQ;AACpD,QAAI,CAAC,gBAAAC,QAAG,WAAW,aAAa,GAAG;AAClC,sBAAAA,QAAG,cAAc,eAAe,KAAK,UAAU,EAAC,SAAS,YAAW,CAAC,CAAC;AAAA,IACvE;AACA,WAAO;AAAA,EACR;AAmBA,WAAS,IAAsB,MAAgC;AAC9D,UAAM,aAAa,YAAY,IAAI;AACnC,QAAI,CAAC,YAAY;AAChB,YAAM,IAAI,MAAM,wBAAwB,IAAI,UAAU;AAAA,IACvD;AACA,WAAO;AAAA,EACR;AAEA,WAAS,UAA4B,MAAuC;AAC3E,WAAQ,YAAY,IAAI,KAAK;AAAA,EAC9B;AAEA,WAAS,4BAA8C,SAA6D;AACnH,QAAI,OAAkD,CAAC;AACvD,eAAW,QAAQ,OAAO,KAAK,WAAW,GAAG;AAC5C,YAAM,aAAa,YAAY,IAAI;AACnC,UAAI,WAAW,QAAQ,YAAY,KAAK,QAAQ,YAAY,GAAG;AAC9D,aAAK,KAAK,EAAC,MAAM,UAAU,WAAU,CAAC;AAAA,MACvC;AAAA,IACD;AACA,QAAI,KAAK,WAAW,GAAG;AACtB,aAAO;AAAA,IACR;AAEA,UAAM,EAAC,UAAS,IAAI,eAAe,IAAI;AACvC,WAAO;AAAA,MACN;AAAA,MACA,OAAO,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IAC9B;AAAA,EACD;AAEA,WAAS,sBAAwC,SAAsD;AACtG,UAAM,IAAI,4BAAkC,OAAO;AACnD,QAAI,CAAC,GAAG;AACP,YAAM,IAAI,MAAM,uCAAuC,OAAO,EAAE;AAAA,IACjE;AACA,WAAO;AAAA,EACR;AAEA,iBAAe,KAAuB,MAAc,YAAyD;AAC5G,gBAAY,IAAI,IAAI;AACpB,QAAI,QAAQ,QAAQ,iBAAiB;AACpC,YAAM,aAAa,uBAAuB;AAC1C,sBAAAA,QAAG,cAAc,GAAG,UAAU,IAAI,IAAI,SAAS,aAAa,YAAY,CAAC,CAAC;AAAA,IAC3E;AACA,WAAO;AAAA,EACR;AAEA,iBAAe,2BAAkE;AAChF,QAAI,CAAC,QAAQ,QAAQ,iBAAiB;AACrC;AAAA,IACD;AACA,UAAM,aAAa,uBAAuB;AAC1C,UAAM,WAAW,kBAAAD,QAAK,KAAK,YAAY,4BAA4B;AACnE,QAAI;AACJ,QAAI;AACH,mCAA6B,aAAa,gBAAAC,QAAG,aAAa,UAAU,OAAO,CAAC;AAAA,IAC7E,QAAQ;AACP,mCAA6B,CAAC;AAAA,IAC/B;AACA,QAAI,2BAA2B,SAAS,GAAG;AAC1C,aAAO,2BAA2B,SAAS,GAAG;AAC7C,cAAM,qBAAqB,2BAA2B,MAAM;AAC5D,YAAI,oBAAoB;AACvB,cAAI,mBAAmB,SAAS,cAAc;AAC7C,kBAAM,UAAU;AAAA,cACf,cAAc,mBAAmB,IAAI,qBAAqB,mBAAmB,YAAY,IAAI;AAAA,YAC9F;AACA,gBAAI;AACH,oBAAM,oCAAoC,kBAAkB;AAC5D,8BAAAA,QAAG,cAAc,UAAU,aAAa,4BAA4B,CAAC,CAAC;AACtE,sBAAQ,QAAQ;AAAA,YACjB,SAAS,GAAG;AACX,sBAAQ,KAAK;AACb,oBAAM;AAAA,YACP;AAAA,UACD,OAAO;AACN,kBAAM,UAAU,KAAK,sCAAsC,mBAAmB,YAAY,IAAI,EAAE;AAChG,gBAAI;AACH,oBAAM,mBAAmB,mBAAmB,YAAY,IAAI;AAC5D,8BAAAA,QAAG,cAAc,UAAU,aAAa,4BAA4B,CAAC,CAAC;AACtE,sBAAQ,QAAQ;AAAA,YACjB,SAAS,GAAG;AACX,sBAAQ,KAAK;AACb,oBAAM;AAAA,YACP;AAAA,UACD;AAAA,QACD;AAAA,MACD;AACA,sBAAAA,QAAG,OAAO,QAAQ;AAAA,IACnB;AAAA,EACD;AAEA,iBAAe,uBAAuB,oBAAwC;AAC7E,QAAI,QAAQ,QAAQ,iBAAiB;AACpC,YAAM,aAAa,uBAAuB;AAC1C,YAAM,WAAW,kBAAAD,QAAK,KAAK,YAAY,4BAA4B;AACnE,UAAI;AACJ,UAAI;AACH,qCAA6B,aAAa,gBAAAC,QAAG,aAAa,UAAU,OAAO,CAAC;AAAA,MAC7E,QAAQ;AACP,qCAA6B,CAAC;AAAA,MAC/B;AACA,iCAA2B,KAAK,kBAAkB;AAClD,sBAAAA,QAAG,cAAc,UAAU,aAAa,4BAA4B,CAAC,CAAC;AAAA,IACvE;AACA,WAAO;AAAA,EACR;AAEA,iBAAe,0BAA0B,QAKd;AAE1B,UAAM,EAAC,MAAM,gBAAe,IAAI,EAAC,iBAAiB,GAAG,GAAG,OAAM;AAE9D,QAAI,oBAAoB,MAAM,SAAS,QAAQ;AAAA,MAC9C,QAAQ;AAAA,IACT,CAAC;AAED,QAAI,UAAU,MAAM,SAAS,QAAQ;AAAA,MACpC,QAAQ;AAAA,MACR,QAAQ,CAAC,IAAI;AAAA,IACd,CAAC;AACD,QAAI,CAAC,WAAW,CAAC,QAAQ,WAAW;AACnC,YAAM,KAAK,eAAe;AAC1B,aAAO,0BAA0B,MAAM;AAAA,IACxC;AACA,WAAO,EAAC,SAAS,kBAAiB;AAAA,EACnC;AAEA,iBAAe,kBAA0C,MAAc;AACtE,QAAI,QAAQ,QAAQ,iBAAiB;AACpC,YAAM,aAAa,uBAAuB;AAC1C,YAAM,WAAW,kBAAAD,QAAK,KAAK,YAAY,4BAA4B;AACnE,UAAI;AACJ,UAAI;AACH,qCAA6B,aAAa,gBAAAC,QAAG,aAAa,UAAU,OAAO,CAAC;AAAA,MAC7E,QAAQ;AACP,qCAA6B,CAAC;AAAA,MAC/B;AACA,mCAA6B,2BAA2B,OAAO,CAAC,MAAM,EAAE,YAAY,SAAS,IAAI;AACjG,UAAI,2BAA2B,WAAW,GAAG;AAC5C,wBAAAA,QAAG,OAAO,QAAQ;AAAA,MACnB,OAAO;AACN,wBAAAA,QAAG,cAAc,UAAU,aAAa,4BAA4B,CAAC,CAAC;AAAA,MACvE;AAAA,IACD;AAAA,EACD;AAEA,iBAAe,2BAA2B;AACzC,UAAM,aAAa;AACnB,oBAAAA,QAAG,UAAU,YAAY,EAAC,WAAW,KAAI,CAAC;AAC1C,oBAAAA,QAAG,cAAc,GAAG,UAAU,mBAAmB,kBAAkB,aAAa,aAAa,CAAC,CAAC,YAAY;AAAA,EAC5G;AAEA,iBAAe,mBACd,MACA,MACyB;AACzB,UAAM,UAAU;AAAA,MACf,MAAM,UACH,KAAK,UACL;AAAA,QAA+B,IAAI,GACnC,MAAM,cAAc;AAAA,QAAW,mBAAmB,MAAM,WAAW,CAAC,KAAK,EACzE;AAAA,IACJ;AACA,QAAI;AACJ,QAAI;AACH,sBAAgB,MAAM,0BAA0B;AAAA,QAC/C;AAAA,MACD,CAAC;AAAA,IACF,SAAS,GAAG;AACX,cAAQ,KAAK;AACb,YAAM;AAAA,IACP;AACA,QAAI,CAAC,eAAe;AACnB,YAAM,IAAI,MAAM,eAAe,IAAI,YAAY;AAAA,IAChD,OAAO;AACN,cAAQ,QAAQ;AAAA,IACjB;AACA,WAAO;AAAA,EACR;AAEA,iBAAe,oCACd,mBACA,aAC4B;AAC5B,UAAM,UAAU,iBAAiB,kBAAkB,IAAI;AAAA,QAAoB,kBAAkB,YAAY,IAAI,GAC5G,cAAc;AAAA,QAAW,mBAAmB,WAAW,CAAC,KAAK,EAC9D;AACA,UAAM,EAAC,SAAS,kBAAiB,IAAI,MAAM,mBAAmB,kBAAkB,YAAY,MAAM;AAAA,MACjG;AAAA,MACA;AAAA,IACD,CAAC;AAGD,UAAM,kBAAkB,kBAAkB,mBAAmB,QAAQ;AACrE,QAAI,CAAC,iBAAiB;AACrB,cAAQ,MAAM,OAAO;AACrB,YAAM,IAAI,MAAM,iCAAiC,kBAAkB,IAAI,EAAE;AAAA,IAC1E;AAEA,gBAAY,UAAU,eAAe,EAAE;AAEvC,UAAM,EAAC,KAAK,GAAG,yBAAwB,IAAI,kBAAkB;AAE7D,QAAI,CAAC,kBAAkB,YAAY,MAAM;AACxC,YAAM,UAAU,KAAK;AACrB,UAAIC,eAAyC;AAC7C,UAAI;AACH,QAAAA,eAAc,MAAM,SAAS,QAAQ;AAAA,UACpC,QAAQ;AAAA,UACR,QAAQ,CAAC,kBAAkB,YAAY,IAAI;AAAA,QAC5C,CAAC;AAAA,MACF,SAAS,GAAG;AACX,gBAAQ,KAAK;AACb,cAAM;AAAA,MACP;AACA,UAAI,CAACA,cAAa;AACjB,gBAAQ,KAAK,MAAM,kBAAkB,YAAY,IAAI,YAAY;AAAA,MAClE,OAAO;AACN,gBAAQ,KAAK;AAAA,MACd;AAEA,UAAIA,cAAa;AAChB,0BAAkB,cAAc;AAAA,UAC/B,OAAOA,aAAY;AAAA,UACnB,MAAMA,aAAY;AAAA,UAClB,QAAQA,aAAY;AAAA,QACrB;AAAA,MACD;AAAA,IACD;AAGA,eAAW,OAAO,OAAO,KAAK,wBAAwB,GAAG;AACxD,UAAI,IAAI,WAAW,GAAG,GAAG;AACxB,eAAQ,yBAAiC,GAAG;AAAA,MAC7C;AACA,UAAI,QAAQ,OAAO;AAClB,YAAI,yBAAyB,KAAK;AACjC,cAAI,kBAAkB,yBAAyB,KAAK,GAAG;AACtD,kBAAM,EAAC,aAAY,IAAI,yBAAyB;AAChD,qCAAyB,MAAM;AAAA,cAC9B;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAEA,UAAM,4BAA4B,SAAS,kBAAkB,MAAM,CAAC,GAAG,EAAE;AACzE,UAAM,qBAAqB,SAAS,QAAQ,YAAY,MAAM,CAAC,GAAG,EAAE;AACpE,UAAM,gBAAgB,KAAK,IAAI,GAAG,4BAA4B,kBAAkB;AAEhF,UAAM,aAAa;AAAA,MAClB,SAAS;AAAA,MACT;AAAA,MACA,GAAG;AAAA,MACH,aAAa,kBAAkB;AAAA,MAC/B,SAAS;AAAA,QACR;AAAA,QACA,WAAW,QAAQ;AAAA,QACnB,aAAa,QAAQ;AAAA,QACrB,kBAAkB,QAAQ;AAAA,MAC3B;AAAA,IACD;AACA,WAAO,KAAK,kBAAkB,MAAM,UAAU;AAAA,EAC/C;AAEA,iBAAe,qBAAqB,kBAAoC;AACvE,UAAM,uBAAuB,gBAAgB;AAC7C,QAAI,cAAyC;AAC7C,UAAM,UAAU,KAAK;AACrB,QAAI;AACH,oBAAc,MAAM,SAAS,QAAQ;AAAA,QACpC,QAAQ;AAAA,QACR,QAAQ,CAAC,iBAAiB,YAAY,IAAI;AAAA,MAC3C,CAAC;AAAA,IACF,SAAS,GAAG;AACX,cAAQ,KAAK;AACb,YAAM;AAAA,IACP;AACA,QAAI,CAAC,aAAa;AACjB,cAAQ,KAAK,MAAM,iBAAiB,YAAY,IAAI,YAAY;AAAA,IACjE,OAAO;AACN,cAAQ,KAAK;AAAA,IACd;AAEA,QAAI,aAAa;AAChB,uBAAiB,YAAY,QAAQ,YAAY;AACjD,uBAAiB,YAAY,SAAS,YAAY;AAAA,IACnD;AAEA,UAAM,EAAC,QAAO,IAAI,MAAM,mBAAmB,iBAAiB,YAAY,MAAM,EAAC,YAAW,CAAC;AAC3F,UAAM,kBAAkB,iBAAiB,YAAY,IAAI;AACzD,WAAO;AAAA,EACR;AAEA,iBAAe,sBAA8C,mBAA4C;AACxG,UAAM,uBAAuB,iBAAiB;AAC9C,QAAI,cAAyC;AAC7C,UAAM,UAAU,KAAK;AACrB,QAAI;AACH,oBAAc,MAAM,SAAS,QAAQ;AAAA,QACpC,QAAQ;AAAA,QACR,QAAQ,CAAC,kBAAkB,YAAY,IAAI;AAAA,MAC5C,CAAC;AAAA,IACF,SAAS,GAAG;AACX,cAAQ,MAAM,sBAAsB,kBAAkB,YAAY,IAAI,yBAAyB;AAC/F,cAAQ,KAAK;AACb,YAAM;AAAA,IACP;AACA,QAAI,CAAC,aAAa;AACjB,cAAQ,KAAK,MAAM,kBAAkB,YAAY,IAAI,YAAY;AAAA,IAClE,OAAO;AACN,cAAQ,KAAK;AAAA,IACd;AAEA,QAAI,aAAa;AAEhB,0BAAoB;AAAA,QACnB,GAAG;AAAA,QACH,aAAa,EAAC,MAAM,YAAY,MAAM,OAAO,YAAY,OAAO,QAAQ,YAAY,KAAI;AAAA,MACzF;AAAA,IACD;AAEA,UAAM,aAAa,MAAM,oCAA0C,mBAAmB,WAAW;AACjG,UAAM,kBAAkB,kBAAkB,YAAY,IAAI;AAC1D,WAAO;AAAA,EACR;AAEA,WAAS,YAAY,SAAiB;AACrC,QAAI,OAAO;AAAA,EACZ;AAEA,WAAS,aAAa,SAAqC;AAC1D,WAAO,KAAK,OAAO;AAAA,EACpB;AAEA,MAAI,MAA0D;AAAA,IAC7D,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACA,aAAW,aAAc,WAAmB,YAAY;AACvD,UAAM,UAAU,GAAG;AAAA,EACpB;AAEA,SAAO;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,MACT;AAAA,MACA;AAAA,IACD;AAAA,EACD;AACD;;;AQtpBA,SAAS,IAAI,KAAe;AAC3B,QAAM,MAAM,IAAI,OAAO,CAAC,GAAW,MAAc,IAAI,CAAC;AACtD,SAAO,MAAM,OAAO,IAAI,MAAM;AAC/B;AAyBA,eAAsB,oBACrB,UACA,SACkC;AAClC,QAAM,iBAA0C;AAAA,IAC/C,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,mBAAmB,CAAC,IAAI,IAAI,EAAE;AAAA,EAC/B;AACA,QAAM,kBAAkB,UAAU,EAAC,GAAG,gBAAgB,GAAG,QAAO,IAAI;AAEpE,QAAM,mBAAmB,gBAAgB;AAEzC,QAAM,gBAAgB,MAAM,SAAS,QAA2B;AAAA,IAC/D,QAAQ;AAAA,IACR,QAAQ,CAAC,KAAK,iBAAiB,SAAS,EAAE,CAAC,IAAI,gBAAgB,aAAa,gBAAgB,iBAAiB;AAAA,EAC9G,CAAC;AAED,MAAI,WAAW,OAAO,cAAc,WAAW;AAC/C,QAAM,YAAY,WAAW,cAAc,OAAO;AAClD,MAAI,QAAQ;AACZ,QAAM,gBACL,CAAC;AACF,SAAO,WAAW,WAAW;AAC5B,kBAAc,KAAK;AAAA,MAClB,QAAQ;AAAA,MACR,eAAe,OAAO,cAAc,cAAc,KAAK,CAAC;AAAA,MACxD,cAAc,OAAO,cAAc,aAAa,KAAK,CAAC;AAAA,MACtD,mBAAmB,cAAc,OAAO,KAAK,EAAE,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC;AAAA,IACpE,CAAC;AACD,gBAAY;AACZ,aAAS;AAAA,EACV;AAEA,QAAM,gCAA0C,CAAC;AACjD,WAAS,IAAI,GAAG,IAAI,gBAAgB,kBAAkB,QAAQ,KAAK;AAClE,kCAA8B,KAAK,IAAI,cAAc,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;AAAA,EACzF;AAEA,QAAM,gBAAgB,OAAO,cAAc,cAAc,cAAc,cAAc,SAAS,CAAC,CAAC;AAEhG,QAAM,SAAiC,CAAC;AACxC,WAAS,IAAI,GAAG,IAAI,gBAAgB,kBAAkB,QAAQ,KAAK;AAClE,WAAO,KAAK;AAAA,MACX,cAAc,8BAA8B,CAAC,IAAI;AAAA,MACjD,sBAAsB,8BAA8B,CAAC;AAAA,IACtD,CAAC;AAAA,EACF;AACA,SAAO;AACR;AAEA,eAAsB,yBACrB,UACA,SACuC;AACvC,QAAM,iBAA0C;AAAA,IAC/C,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,mBAAmB,CAAC,IAAI,IAAI,EAAE;AAAA,EAC/B;AACA,QAAM,kBAAkB,UAAU,EAAC,GAAG,gBAAgB,GAAG,QAAO,IAAI;AAEpE,MAAI,gBAAgB,kBAAkB,WAAW,GAAG;AACnD,UAAM,IAAI,MAAM,oEAAoE;AAAA,EACrF;AAEA,QAAM,SAAS,MAAM,oBAAoB,UAAU,eAAe;AAClE,SAAO;AAAA,IACN,MAAM,OAAO,CAAC;AAAA,IACd,SAAS,OAAO,CAAC;AAAA,IACjB,MAAM,OAAO,CAAC;AAAA,EACf;AACD;;;ATrFA,qBAAoB;AACpB,IAAAC,eAA0B;AAE1B,IAAI,CAAC,QAAQ,IAAI,sBAAsB,GAAG;AACzC,UAAQ,4BAA4B,EAAE,SAAS;AAChD;AAEO,SAAS,QAMf,SACA,UACA,SAC2E;AAC3E,QAAM,eAAe,CACpB,KACA,SACI,SAAS,KAAK,IAAI;AACvB,eAAa,kBAAkB;AAC/B,eAAa,OAAO,QAAQ;AAC5B,eAAa,eAAe,QAAQ;AAEpC,SAAO;AACR;AAeO,SAAS,WAAW,SAAgC;AAG1D,MAAI;AACJ,MAAI;AACH,UAAM,eAAe,gBAAAC,QAAG,aAAa,kBAAkB,OAAO;AAC9D,iBAAa,KAAK,MAAM,YAAY;AAAA,EACrC,QAAQ;AAAA,EAAC;AAET,MAAI,YAAY;AACf,QAAI,CAAC,QAAQ,eAAe,WAAW,aAAa;AACnD,cAAQ,cAAc,WAAW;AAAA,IAClC;AACA,QAAI,CAAC,QAAQ,WAAW,WAAW,SAAS;AAC3C,cAAQ,UAAU,WAAW;AAAA,IAC9B;AAAA,EACD;AAEA,QAAM,UAAU,QAAQ,IAAI,kBAAkB,QAAQ,OAAO;AAC7D,QAAM,OAAO,OAAO,QAAQ,YAAY;AACxC,MAAI,cAAc;AAClB,MAAI,QAAQ,SAAS;AACpB,QAAI,OAAO,QAAQ,YAAY,UAAU;AACxC,oBAAc,QAAQ;AAAA,IACvB,WAAW,UAAU,QAAQ,SAAS;AACrC,oBAAc,QAAQ,QAAQ;AAAA,IAC/B;AAAA,EACD;AAEA,MAAI,cAAyB,YAAY,YAAY,YAAY,SAAS,WAAW,GAAG,QAAS,CAAC;AAClG,MAAI,CAAC,QAAQ,UAAU;AACtB,QAAI;AACJ,QAAI,OAAO,YAAY,UAAU;AAChC,gBAAU;AAAA,IACX,OAAO;AACN,UAAI,YAAY;AACf,cAAM,UAAU,WAAW,YAAY,WAAW,SAAS,WAAW;AACtE,YAAI,WAAW,QAAQ,QAAQ;AAC9B,oBAAU,QAAQ;AAAA,QACnB,OAAO;AACN,cAAI,SAAS,kBAAkB;AAC9B,sBAAU;AAAA,UACX,OAAO;AACN,gBAAI,QAAQ,YAAY,aAAa;AACpC,wBAAU;AAAA,YACX,OAAO;AACN,qBAAO,MAAM,YAAY,QAAQ,OAAO,6DAA6D;AACrG,sBAAQ,KAAK,CAAC;AAAA,YACf;AAAA,UACD;AAAA,QACD;AAAA,MACD,OAAO;AACN,YAAI,SAAS,kBAAkB;AAC9B,oBAAU;AAAA,QACX,OAAO;AACN,cAAI,QAAQ,YAAY,aAAa;AACpC,sBAAU;AAAA,UACX,OAAO;AACN,mBAAO,MAAM,YAAY,QAAQ,OAAO,6DAA6D;AACrG,oBAAQ,KAAK,CAAC;AAAA,UACf;AAAA,QACD;AAAA,MACD;AAAA,IACD;AACA,WAAO;AAAA,MACN,SAAS;AAAA,QACR;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,MACD;AAAA,MACA,aAAa,QAAQ;AAAA,MACrB,iBAAiB,QAAQ;AAAA,MACzB,SAAS,QAAQ;AAAA,MACjB,MAAM,OAAO,QAAQ,SAAS,cAAc,SAAY,QAAQ,KAAK,MAAM,GAAG;AAAA,MAC9E,UAAU,QAAQ;AAAA,MAClB,qBAAqB,QAAQ;AAAA,MAC7B,cAAc,QAAQ;AAAA,IACvB;AAAA,EACD,OAAO;AACN,WAAO;AAAA,MACN,SAAS;AAAA,QACR,UAAU,QAAQ;AAAA,QAClB,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,MACD;AAAA,MACA,aAAa,QAAQ;AAAA,MACrB,iBAAiB,QAAQ;AAAA,MACzB,SAAS,QAAQ;AAAA,MACjB,MAAM,OAAO,QAAQ,SAAS,cAAc,SAAY,QAAQ,KAAK,MAAM,GAAG;AAAA,MAC9E,UAAU,QAAQ;AAAA,MAClB,qBAAqB,QAAQ;AAAA,MAC7B,cAAc,QAAQ;AAAA,IACvB;AAAA,EACD;AACD;AAEO,SAAS,qBAAqB,SAAwC;AAC5E,SAAO,cAAc,WAAW,OAAO,CAAC;AACzC;AAEO,SAAS,cAAc,QAAgC;AAC7D,QAAM,iBAAiC;AAAA,IACtC,GAAG;AAAA,IACH,SAAS,OAAO;AAAA;AAAA,IAChB,aAAa,OAAO,eAAe;AAAA,IACnC,SAAS,OAAO,WAAW;AAAA,IAC3B,MAAM,OAAO,QAAQ,CAAC;AAAA,IACtB,aAAa,OAAO,eAAe,CAAC;AAAA,IACpC,iBAAiB,OAAO;AAAA,EACzB;AACA,SAAO;AACR;AAEA,eAAsB,gBAGpB,SAAwB,SAA0E;AACnG,QAAM,iBAAiB,qBAAqB,OAAO;AACnD,QAAM,EAAC,UAAU,SAAQ,IAAI,MAAM,kBAAkB,gBAAgB,OAAO;AAC5E,SAAO;AACR;AAEA,eAAsB,0BAKpB,SAAwB,MAA4C;AACrE,QAAM,iBAAiB,qBAAqB,OAAO;AAGnD,SAAO,qBAA2E,gBAAgB,IAAI;AACvG;AAEA,eAAsB,qBAKpB,QAAwB,MAA4C;AACrE,cAAY,OAAO,OAAO,aAAa,cAAc,IAAI,OAAO,QAAQ;AAExE,MAAI;AACJ,cAAY,0BAA0B,CAAC,OAAO,OAAO,CAAC;AACtD,cAAY,UACV,OAAO,CAAC,MAAM,CAAC,kBAAAC,QAAK,SAAS,CAAC,EAAE,WAAW,GAAG,CAAC,EAC/C,KAAK,CAAC,GAAW,MAAc;AAC/B,QAAI,IAAI,GAAG;AACV,aAAO;AAAA,IACR;AACA,QAAI,IAAI,GAAG;AACV,aAAO;AAAA,IACR;AACA,WAAO;AAAA,EACR,CAAC;AAEF,MAAI;AAEJ,QAAM,yBAA4G,CAAC;AACnH,QAAM,iBAA4C,CAAC;AACnD,QAAM,kBAA4B,CAAC;AAEnC,aAAW,YAAY,WAAW;AACjC,UAAM,iBAAiB,kBAAAA,QAAK,QAAQ,QAAQ;AAC5C,QAAI;AACJ,QAAI;AACH,UAAI,QAAQ,OAAO;AAClB,eAAO,QAAQ,MAAM,cAAc;AAAA,MACpC;AACA,qBAAe,QAAQ,cAAc;AAErC,UAAK,aAAqB,SAAS;AAClC,uBAAgB,aAAqB;AACrC,YAAK,aAAqB,SAAS;AAClC,iBAAO,KAAK,mBAAmB;AAC/B,yBAAgB,aAAqB;AAAA,QACtC;AAAA,MACD;AACA,6BAAuB,cAAc,IAAI;AACzC,UAAI,mBAAmB,oBAAoB,aAAa,iBAAiB;AACxE,cAAM,IAAI,MAAM,2EAA2E;AAAA,MAC5F;AACA,wBAAkB,aAAa;AAAA,IAChC,SAAS,GAAG;AACX,aAAO,MAAM,oBAAoB,QAAQ,EAAE;AAC3C,YAAM;AAAA,IACP;AAEA,QAAI,aAAa,aAAa;AAC9B,QAAI,eAAe,QAAW;AAC7B,UAAI,OAAO,eAAe,UAAU;AACnC,qBAAa,CAAC,UAAU;AAAA,MACzB;AACA,iBAAW,OAAO,YAAY;AAC7B,YAAI,IAAI,QAAQ,GAAG,KAAK,GAAG;AAC1B,gBAAM,IAAI,MAAM,4BAA4B;AAAA,QAC7C;AACA,cAAM,MAAM,eAAe,GAAG,KAAK,CAAC;AACpC,uBAAe,GAAG,IAAI;AACtB,YAAI,KAAK,cAAc;AAAA,MACxB;AAAA,IACD;AAEA,QAAI,OAAO,SAAS,UAAa,OAAO,KAAK,SAAS,GAAG;AACxD,UAAI,QAAQ;AACZ,UAAI,eAAe,QAAW;AAC7B,mBAAW,aAAa,OAAO,MAAM;AACpC,qBAAW,OAAO,YAAY;AAC7B,gBAAI,QAAQ,WAAW;AACtB,8BAAgB,KAAK,cAAc;AACnC,sBAAQ;AACR;AAAA,YACD;AAAA,UACD;AACA,cAAI,OAAO;AACV;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD,OAAO;AACN,sBAAgB,KAAK,cAAc;AAAA,IACpC;AAAA,EACD;AAEA,MAAI,CAAC,iBAAiB;AACrB,UAAM,IAAI,MAAM,mBAAmB;AAAA,EACpC;AAEA,QAAM,EAAC,UAAU,SAAQ,IAAI,MAAM,kBAAkB,QAAQ,eAAe;AAE5E,QAAM,SAAS,yBAAyB;AAExC,QAAM,yBAAwD,CAAC;AAC/D,QAAM,eAGD,CAAC;AACN,QAAM,uBAGD,CAAC;AACN,WAAS,oBAAoB,gBAAwB;AACpD,QAAI,uBAAuB,cAAc,GAAG;AAC3C;AAAA,IACD;AACA,UAAM,eAAe,uBAAuB,cAAc;AAC1D,QAAI,aAAa,cAAc;AAC9B,iBAAW,cAAc,aAAa,cAAc;AACnD,cAAM,uBAAuB,eAAe,UAAU;AACtD,YAAI,sBAAsB;AACzB,qBAAW,uBAAuB,sBAAsB;AACvD,gCAAoB,mBAAmB;AAAA,UACxC;AAAA,QACD;AAAA,MACD;AAAA,IACD;AACA,QAAI,CAAC,uBAAuB,cAAc,GAAG;AAC5C,UAAI,aAAa,aAAa;AAC7B,6BAAqB,KAAK;AAAA,UACzB,UAAU;AAAA,UACV,MAAM;AAAA,QACP,CAAC;AAAA,MACF,OAAO;AACN,qBAAa,KAAK;AAAA,UACjB,UAAU;AAAA,UACV,MAAM;AAAA,QACP,CAAC;AAAA,MACF;AACA,6BAAuB,cAAc,IAAI;AAAA,IAC1C;AAAA,EACD;AACA,aAAW,kBAAkB,iBAAiB;AAC7C,wBAAoB,cAAc;AAAA,EACnC;AAEA,MAAI,OAAO,qBAAqB;AAC/B,UAAM,mBAAmB,MAAM,yBAAyB,SAAS,QAAQ,QAAQ;AACjF,UAAM,SAAS,UAAM,eAAAC,SAAQ;AAAA,MAC5B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,YACJ,0BAAY,iBAAiB,KAAK,YAAY,CAAC,mBAAe;AAAA,QAClE,iBAAiB,KAAK;AAAA,MACvB,CAAC;AAAA,eACO,0BAAY,iBAAiB,QAAQ,YAAY,CAAC,mBAAe;AAAA,QACxE,iBAAiB,QAAQ;AAAA,MAC1B,CAAC;AAAA,YACI,0BAAY,iBAAiB,KAAK,YAAY,CAAC,mBAAe;AAAA,QAClE,iBAAiB,KAAK;AAAA,MACvB,CAAC;AAAA;AAAA;AAAA,IAGF,CAAC;AAED,QAAI,CAAC,OAAO,SAAS;AACpB,cAAQ,KAAK;AAAA,IACd;AAAA,EACD;AAEA,aAAW,gBAAgB,aAAa,OAAO,oBAAoB,GAAG;AACrE,UAAM,WAAW,kBAAAD,QAAK,SAAS,aAAa,QAAQ;AACpD,UAAM,mBAAmB,kBAAAA,QAAK,SAAS,KAAK,aAAa,QAAQ;AAKjE,QAAI,OAAO;AACX,UAAM,UAAU,KAAK,eAAe,QAAQ,EAAE;AAC9C,QAAI,aAAa,KAAK,MAAM;AAC3B,YAAME,WAAU,KAAK,aAAa;AAClC,UAAI;AACH,eAAO,MAAM,aAAa,KAAK,KAAK,UAAU,IAAI;AAClD,QAAAA,SAAQ,QAAQ,OAAO,YAAY,QAAQ,KAAK,MAAS;AAAA,MAC1D,SAAS,GAAG;AACX,QAAAA,SAAQ,KAAK;AACb,cAAM;AAAA,MACP;AAAA,IACD;AACA,QAAI,CAAC,MAAM;AACV,UAAI;AAEJ,UAAI;AACH,iBAAS,MAAM,aAAa,KAAK,UAAU,IAAI;AAC/C,gBAAQ,QAAQ;AAAA,CAAI;AAAA,MACrB,SAAS,GAAG;AACX,gBAAQ,KAAK;AACb,cAAM;AAAA,MACP;AACA,UAAI,UAAU,OAAO,WAAW,WAAW;AAQ1C,cAAM,uBAAuB,OAAO;AAAA,MAgBrC;AAAA,IACD;AAAA,EACD;AAEA,MAAI,OAAO,cAAc;AACxB,UAAM,WAAW,SAAS,QAAQ;AAClC,UAAM,oBAAoB,SAAS;AAEnC,QAAI,eAAe;AACnB,eAAW,QAAQ,mBAAmB;AACrC,YAAM,qBAAqB,MAAM,SAAS,QAAQ,EAAC,QAAQ,6BAA6B,QAAQ,CAAC,IAAI,EAAC,CAAC;AACvG,UAAI,oBAAoB;AACvB,cAAM,UAAU,OAAO,mBAAmB,OAAO;AACjD,wBAAgB;AAAA,MACjB;AAAA,IACD;AAEA,YAAQ,IAAI,EAAC,aAAY,CAAC;AAAA,EAC3B;AAEA,SAAO;AACR;","names":["path","fs","import_node_path","import_node_fs","import_node_fs","import_node_path","import_node_path","import_node_fs","path","fs","Logging","chains","accounts","path","fs","transaction","import_viem","fs","path","prompts","spinner"]}