rocketh 0.5.7 → 0.5.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # rocketh
2
2
 
3
+ ## 0.5.9
4
+
5
+ ### Patch Changes
6
+
7
+ - remove some log as we can't use ora
8
+
9
+ ## 0.5.8
10
+
11
+ ### Patch Changes
12
+
13
+ - remove ora
14
+
3
15
  ## 0.5.7
4
16
 
5
17
  ### Patch Changes
@@ -133,7 +133,6 @@ function loadDeployments(deploymentsPath, subPath, onlyABIAndAddress, expectedCh
133
133
  // src/internal/logging.ts
134
134
  import { logs } from "named-logs";
135
135
  import { hookup, logs as Logging } from "named-logs-console";
136
- import ora from "ora-cjs";
137
136
  hookup();
138
137
  function setLogLevel(level) {
139
138
  Logging.level = level;
@@ -145,17 +144,25 @@ function setLogLevel(level) {
145
144
  }
146
145
  var logger = logs("rocketh");
147
146
  var voidSpinner = {
147
+ start(msg) {
148
+ if (msg) {
149
+ console.log(msg);
150
+ }
151
+ return this;
152
+ },
148
153
  stop() {
149
154
  return this;
150
155
  },
151
156
  succeed(msg) {
157
+ console.log(msg);
152
158
  return this;
153
159
  },
154
160
  fail(msg) {
161
+ console.error(msg);
155
162
  return this;
156
163
  }
157
164
  };
158
- var lastSpin = ora("rocketh");
165
+ var lastSpin = voidSpinner;
159
166
  function spin(message) {
160
167
  if (Logging.level > 0) {
161
168
  lastSpin = lastSpin.start(message);
@@ -424,7 +431,7 @@ async function createEnvironment(config, providedContext) {
424
431
  }
425
432
  const { abi, ...artifactObjectWithoutABI } = pendingDeployment.partialDeployment;
426
433
  if (!artifactObjectWithoutABI.nonce) {
427
- const spinner2 = spin(`fetching nonce for ${pendingDeployment.txHash}`);
434
+ const spinner2 = spin();
428
435
  let transaction2 = null;
429
436
  try {
430
437
  transaction2 = await provider.request({
@@ -467,7 +474,7 @@ async function createEnvironment(config, providedContext) {
467
474
  async function saveWhilePending(name, pendingDeployment) {
468
475
  await saveTransaction(name, pendingDeployment);
469
476
  let transaction = null;
470
- const spinner = spin(`fetching tx from peers ${pendingDeployment.txHash}`);
477
+ const spinner = spin();
471
478
  try {
472
479
  transaction = await provider.request({
473
480
  method: "eth_getTransactionByHash",
@@ -746,4 +753,4 @@ export {
746
753
  loadAndExecuteDeployments,
747
754
  executeDeployScripts
748
755
  };
749
- //# sourceMappingURL=chunk-OMYXSYJQ.js.map
756
+ //# sourceMappingURL=chunk-OUY6QCZ4.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/fs.ts","../src/executor/index.ts","../src/environment/index.ts","../src/utils/json.ts","../src/environment/deployments.ts","../src/internal/logging.ts"],"sourcesContent":["// taken from https://github.com/vitejs/vite/blob/63524bac878e8d3771d34ad7ad2e10cd16870ff4/packages/vite/src/node/utils.ts#L371-L400\nimport fs from 'node:fs';\nimport path from 'node:path';\n\ninterface LookupFileOptions {\n\tpathOnly?: boolean;\n\trootDir?: string;\n\tpredicate?: (file: string) => boolean;\n}\n\nexport function lookupFile(dir: string, formats: string[], options?: LookupFileOptions): string | undefined {\n\tfor (const format of formats) {\n\t\tconst fullPath = path.join(dir, format);\n\t\tif (fs.existsSync(fullPath) && fs.statSync(fullPath).isFile()) {\n\t\t\tconst result = options?.pathOnly ? fullPath : fs.readFileSync(fullPath, 'utf-8');\n\t\t\tif (!options?.predicate || options.predicate(result)) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t}\n\tconst parentDir = path.dirname(dir);\n\tif (parentDir !== dir && (!options?.rootDir || parentDir.startsWith(options?.rootDir))) {\n\t\treturn lookupFile(parentDir, formats, options);\n\t}\n}\n\nexport function traverseMultipleDirectory(dirs: string[]): string[] {\n\tconst filepaths = [];\n\tfor (const dir of dirs) {\n\t\tlet filesStats = traverse(dir);\n\t\tfilesStats = filesStats.filter((v) => !v.directory);\n\t\tfor (const filestat of filesStats) {\n\t\t\tfilepaths.push(path.join(dir, filestat.relativePath));\n\t\t}\n\t}\n\treturn filepaths;\n}\n\nexport const traverse = function (\n\tdir: string,\n\tresult: any[] = [],\n\ttopDir?: string,\n\tfilter?: (name: string, stats: any) => boolean // TODO any is Stats\n): Array<{\n\tname: string;\n\tpath: string;\n\trelativePath: string;\n\tmtimeMs: number;\n\tdirectory: boolean;\n}> {\n\tfs.readdirSync(dir).forEach((name) => {\n\t\tconst fPath = path.resolve(dir, name);\n\t\tconst stats = fs.statSync(fPath);\n\t\tif ((!filter && !name.startsWith('.')) || (filter && filter(name, stats))) {\n\t\t\tconst fileStats = {\n\t\t\t\tname,\n\t\t\t\tpath: fPath,\n\t\t\t\trelativePath: path.relative(topDir || dir, fPath),\n\t\t\t\tmtimeMs: stats.mtimeMs,\n\t\t\t\tdirectory: stats.isDirectory(),\n\t\t\t};\n\t\t\tif (fileStats.directory) {\n\t\t\t\tresult.push(fileStats);\n\t\t\t\treturn traverse(fPath, result, topDir || dir, filter);\n\t\t\t}\n\t\t\tresult.push(fileStats);\n\t\t}\n\t});\n\treturn result;\n};\n","import {traverseMultipleDirectory} from '../utils/fs';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport type {\n\tConfig,\n\tEnvironment,\n\tResolvedConfig,\n\tResolvedNamedAccounts,\n\tUnknownArtifacts,\n\tUnknownDeployments,\n\tUnresolvedUnknownNamedAccounts,\n} from '../environment/types';\nimport {createEnvironment} from '../environment';\nimport {DeployScriptFunction, DeployScriptModule, ProvidedContext} from './types';\nimport {logger, setLogLevel, spin} from '../internal/logging';\n\nrequire('esbuild-register/dist/node').register();\n\nexport function execute<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(\n\tcontext: ProvidedContext<Artifacts, NamedAccounts>,\n\tcallback: DeployScriptFunction<Artifacts, ResolvedNamedAccounts<NamedAccounts>, Deployments>,\n\toptions: {tags?: string[]; dependencies?: string[]}\n): DeployScriptModule<Artifacts, NamedAccounts, Deployments> {\n\tconst scriptModule = (env: Environment<Artifacts, ResolvedNamedAccounts<NamedAccounts>, Deployments>) =>\n\t\tcallback(env);\n\tscriptModule.providedContext = context;\n\tscriptModule.tags = options.tags;\n\tscriptModule.dependencies = options.dependencies;\n\t// TODO id + skip\n\treturn scriptModule as unknown as DeployScriptModule<Artifacts, NamedAccounts, Deployments>;\n}\n\nexport type ConfigOptions = {network: string; deployments?: string; scripts?: string; tags?: string};\n\nexport function readConfig(options: ConfigOptions, extra?: {ignoreMissingRPC?: boolean}): Config {\n\ttype Networks = {[name: string]: {rpcUrl: string}};\n\ttype ConfigFile = {networks: Networks};\n\tlet configFile: ConfigFile | undefined;\n\ttry {\n\t\tconst configString = fs.readFileSync('./rocketh.json', 'utf-8');\n\t\tconfigFile = JSON.parse(configString);\n\t} catch {}\n\n\tlet nodeUrl: string;\n\tconst fromEnv = process.env['ETH_NODE_URI_' + options.network];\n\tif (typeof fromEnv === 'string') {\n\t\tnodeUrl = fromEnv;\n\t} else {\n\t\tif (configFile) {\n\t\t\tconst network = configFile.networks && configFile.networks[options.network];\n\t\t\tif (network) {\n\t\t\t\tnodeUrl = network.rpcUrl;\n\t\t\t} else {\n\t\t\t\tif (extra?.ignoreMissingRPC) {\n\t\t\t\t\tnodeUrl = '';\n\t\t\t\t} else {\n\t\t\t\t\tif (options.network === 'localhost') {\n\t\t\t\t\t\tnodeUrl = 'http://127.0.0.1:8545';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.error(`network \"${options.network}\" is not configured. Please add it to the rocketh.json file`);\n\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (extra?.ignoreMissingRPC) {\n\t\t\t\tnodeUrl = '';\n\t\t\t} else {\n\t\t\t\tif (options.network === 'localhost') {\n\t\t\t\t\tnodeUrl = 'http://127.0.0.1:8545';\n\t\t\t\t} else {\n\t\t\t\t\tlogger.error(`network \"${options.network}\" is not configured. Please add it to the rocketh.json file`);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tnodeUrl,\n\t\tnetworkName: options.network,\n\t\tdeployments: options.deployments,\n\t\tscripts: options.scripts,\n\t\ttags: typeof options.tags === 'undefined' ? undefined : options.tags.split(','),\n\t};\n}\n\nexport function readAndResolveConfig(options: ConfigOptions, extra?: {ignoreMissingRPC?: boolean}): ResolvedConfig {\n\treturn resolveConfig(readConfig(options, extra));\n}\n\nexport function resolveConfig(config: Config): ResolvedConfig {\n\tconst resolvedConfig: ResolvedConfig = {\n\t\t...config,\n\t\tnetworkName: config.networkName || 'memory',\n\t\tdeployments: config.deployments || 'deployments',\n\t\tscripts: config.scripts || 'deploy',\n\t\ttags: config.tags || [],\n\t};\n\treturn resolvedConfig;\n}\n\nexport async function loadAndExecuteDeployments<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(config: Config) {\n\tconst resolvedConfig = resolveConfig(config);\n\n\treturn executeDeployScripts<Artifacts, NamedAccounts, Deployments>(resolvedConfig);\n\n\t// TODO\n\t// await this.export(options);\n}\n\nexport async function executeDeployScripts<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(config: ResolvedConfig): Promise<Deployments> {\n\tsetLogLevel(typeof config.logLevel === 'undefined' ? 0 : config.logLevel);\n\n\tlet filepaths;\n\tfilepaths = traverseMultipleDirectory([config.scripts]);\n\tfilepaths = filepaths\n\t\t.filter((v) => !path.basename(v).startsWith('_'))\n\t\t.sort((a: string, b: string) => {\n\t\t\tif (a < b) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (a > b) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\treturn 0;\n\t\t});\n\n\tlet providedContext: ProvidedContext<Artifacts, NamedAccounts> | undefined;\n\n\tconst scriptModuleByFilePath: {[filename: string]: DeployScriptModule} = {};\n\tconst scriptPathBags: {[tag: string]: string[]} = {};\n\tconst scriptFilePaths: string[] = [];\n\n\tfor (const filepath of filepaths) {\n\t\tconst scriptFilePath = path.resolve(filepath);\n\t\tlet scriptModule: DeployScriptModule;\n\t\ttry {\n\t\t\tif (require.cache) {\n\t\t\t\tdelete require.cache[scriptFilePath]; // ensure we reload it every time, so changes are taken in consideration\n\t\t\t}\n\t\t\tscriptModule = require(scriptFilePath);\n\n\t\t\tif ((scriptModule as any).default) {\n\t\t\t\tscriptModule = (scriptModule as any).default as DeployScriptModule;\n\t\t\t\tif ((scriptModule as any).default) {\n\t\t\t\t\tlogger.warn(`double default...`);\n\t\t\t\t\tscriptModule = (scriptModule as any).default as DeployScriptModule;\n\t\t\t\t}\n\t\t\t}\n\t\t\tscriptModuleByFilePath[scriptFilePath] = scriptModule;\n\t\t\tif (providedContext && providedContext !== scriptModule.providedContext) {\n\t\t\t\tthrow new Error(`context between 2 scripts is different, please share the same across them`);\n\t\t\t}\n\t\t\tprovidedContext = scriptModule.providedContext as ProvidedContext<Artifacts, NamedAccounts>;\n\t\t} catch (e) {\n\t\t\tlogger.error(`could not import ${filepath}`);\n\t\t\tthrow e;\n\t\t}\n\n\t\tlet scriptTags = scriptModule.tags;\n\t\tif (scriptTags !== undefined) {\n\t\t\tif (typeof scriptTags === 'string') {\n\t\t\t\tscriptTags = [scriptTags];\n\t\t\t}\n\t\t\tfor (const tag of scriptTags) {\n\t\t\t\tif (tag.indexOf(',') >= 0) {\n\t\t\t\t\tthrow new Error('Tag cannot contains commas');\n\t\t\t\t}\n\t\t\t\tconst bag = scriptPathBags[tag] || [];\n\t\t\t\tscriptPathBags[tag] = bag;\n\t\t\t\tbag.push(scriptFilePath);\n\t\t\t}\n\t\t}\n\n\t\tif (config.tags !== undefined && config.tags.length > 0) {\n\t\t\tlet found = false;\n\t\t\tif (scriptTags !== undefined) {\n\t\t\t\tfor (const tagToFind of config.tags) {\n\t\t\t\t\tfor (const tag of scriptTags) {\n\t\t\t\t\t\tif (tag === tagToFind) {\n\t\t\t\t\t\t\tscriptFilePaths.push(scriptFilePath);\n\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (found) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tscriptFilePaths.push(scriptFilePath);\n\t\t}\n\t}\n\n\tif (!providedContext) {\n\t\tthrow new Error(`no context loaded`);\n\t}\n\n\tconst {internal, external} = await createEnvironment(config, providedContext);\n\n\tawait internal.recoverTransactionsIfAny();\n\n\tconst scriptsRegisteredToRun: {[filename: string]: boolean} = {};\n\tconst scriptsToRun: Array<{\n\t\tfunc: DeployScriptModule;\n\t\tfilePath: string;\n\t}> = [];\n\tconst scriptsToRunAtTheEnd: Array<{\n\t\tfunc: DeployScriptModule;\n\t\tfilePath: string;\n\t}> = [];\n\tfunction recurseDependencies(scriptFilePath: string) {\n\t\tif (scriptsRegisteredToRun[scriptFilePath]) {\n\t\t\treturn;\n\t\t}\n\t\tconst scriptModule = scriptModuleByFilePath[scriptFilePath];\n\t\tif (scriptModule.dependencies) {\n\t\t\tfor (const dependency of scriptModule.dependencies) {\n\t\t\t\tconst scriptFilePathsToAdd = scriptPathBags[dependency];\n\t\t\t\tif (scriptFilePathsToAdd) {\n\t\t\t\t\tfor (const scriptFilenameToAdd of scriptFilePathsToAdd) {\n\t\t\t\t\t\trecurseDependencies(scriptFilenameToAdd);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!scriptsRegisteredToRun[scriptFilePath]) {\n\t\t\tif (scriptModule.runAtTheEnd) {\n\t\t\t\tscriptsToRunAtTheEnd.push({\n\t\t\t\t\tfilePath: scriptFilePath,\n\t\t\t\t\tfunc: scriptModule,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tscriptsToRun.push({\n\t\t\t\t\tfilePath: scriptFilePath,\n\t\t\t\t\tfunc: scriptModule,\n\t\t\t\t});\n\t\t\t}\n\t\t\tscriptsRegisteredToRun[scriptFilePath] = true;\n\t\t}\n\t}\n\tfor (const scriptFilePath of scriptFilePaths) {\n\t\trecurseDependencies(scriptFilePath);\n\t}\n\n\tfor (const deployScript of scriptsToRun.concat(scriptsToRunAtTheEnd)) {\n\t\tconst filename = path.basename(deployScript.filePath);\n\t\tconst relativeFilepath = path.relative('.', deployScript.filePath);\n\t\t// if (deployScript.func.id && this.db.migrations[deployScript.func.id]) {\n\t\t// \tlogger.info(`skipping ${filename} as migrations already executed and complete`);\n\t\t// \tcontinue;\n\t\t// }\n\t\tlet skip = false;\n\t\tif (deployScript.func.skip) {\n\t\t\tconst spinner = spin(`Executing skipping function from ${filename}`);\n\t\t\ttry {\n\t\t\t\tskip = await deployScript.func.skip(external);\n\t\t\t\tspinner.succeed(skip ? `skipping ${filename}` : undefined);\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\t\tif (!skip) {\n\t\t\tlet result;\n\t\t\tconst spinner = spin(`Executing ${filename}`);\n\t\t\ttry {\n\t\t\t\tresult = await deployScript.func(external);\n\t\t\t\tspinner.succeed(`${filename} execution complete`);\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\tif (result && typeof result === 'boolean') {\n\t\t\t\t// if (!deployScript.func.id) {\n\t\t\t\t// \tthrow new Error(\n\t\t\t\t// \t\t`${deployScript.filePath} return true to not be executed again, but does not provide an id. the script function needs to have the field \"id\" to be set`\n\t\t\t\t// \t);\n\t\t\t\t// }\n\t\t\t\t// this.db.migrations[deployScript.func.id] = Math.floor(Date.now() / 1000);\n\n\t\t\t\tconst deploymentFolderPath = config.deployments;\n\n\t\t\t\t// TODO refactor to extract this whole path and folder existence stuff\n\t\t\t\t// const toSave = this.db.writeDeploymentsToFiles && this.network.saveDeployments;\n\t\t\t\t// if (toSave) {\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tfs.mkdirSync(this.deploymentsPath);\n\t\t\t\t// \t} catch (e) {}\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tfs.mkdirSync(path.join(this.deploymentsPath, deploymentFolderPath));\n\t\t\t\t// \t} catch (e) {}\n\t\t\t\t// \tfs.writeFileSync(\n\t\t\t\t// \t\tpath.join(this.deploymentsPath, deploymentFolderPath, '.migrations.json'),\n\t\t\t\t// \t\tJSON.stringify(this.db.migrations, null, ' ')\n\t\t\t\t// \t);\n\t\t\t\t// }\n\t\t\t}\n\t\t}\n\t}\n\n\treturn external.deployments as Deployments;\n}\n","import fs from 'node:fs';\n\nimport {Transaction, TransactionReceipt, createPublicClient, custom} from 'viem';\nimport {\n\tAccountType,\n\tDeployment,\n\tEnvironment,\n\tNamedSigner,\n\tPendingDeployment,\n\tResolvedAccount,\n\tResolvedConfig,\n\tResolvedNamedAccounts,\n\tResolvedNamedSigners,\n\tUnknownArtifacts,\n\tUnknownDeployments,\n\tUnresolvedUnknownNamedAccounts,\n} from './types';\nimport {JSONRPCHTTPProvider} from 'eip-1193-json-provider';\nimport {Abi} from 'abitype';\nimport {InternalEnvironment} from '../internal/types';\nimport path from 'node:path';\nimport {JSONToString, stringToJSON} from '../utils/json';\nimport {loadDeployments} from './deployments';\nimport {EIP1193Account, EIP1193ProviderWithoutEvents, EIP1193Transaction} from 'eip-1193';\nimport {ProvidedContext} from '../executor/types';\nimport {spin} from '../internal/logging';\n\nexport type EnvironmentExtenstion = (env: Environment) => Environment;\n//we store this globally so this is not lost\n(globalThis as any).extensions = [];\nexport function extendEnvironment(extension: EnvironmentExtenstion): void {\n\t(globalThis as any).extensions.push(extension);\n}\n\nexport type SignerProtocolFunction = (protocolString: string) => Promise<NamedSigner>;\nexport type SignerProtocol = {\n\tgetSigner: SignerProtocolFunction;\n};\n\n//we store this globally so this is not lost\n(globalThis as any).signerProtocols = {};\nexport function handleSignerProtocol(protocol: string, getSigner: SignerProtocolFunction): void {\n\t(globalThis as any).signerProtocols[protocol] = {\n\t\tgetSigner,\n\t};\n}\n\nfunction displayTransaction(transaction: EIP1193Transaction) {\n\tif (transaction.type === '0x2') {\n\t\treturn `(maxFeePerGas: ${BigInt(transaction.maxFeePerGas).toString()}, maxPriorityFeePerGas: ${BigInt(\n\t\t\ttransaction.maxPriorityFeePerGas\n\t\t).toString()})`;\n\t} else {\n\t\treturn `(gasPrice: ${BigInt(transaction.gasPrice).toString()})`;\n\t}\n}\n\nexport async function createEnvironment<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(\n\tconfig: ResolvedConfig,\n\tprovidedContext: ProvidedContext<Artifacts, NamedAccounts>\n): Promise<{internal: InternalEnvironment; external: Environment}> {\n\tconst provider =\n\t\t'provider' in config ? config.provider : (new JSONRPCHTTPProvider(config.nodeUrl) as EIP1193ProviderWithoutEvents);\n\n\tconst transport = custom(provider);\n\tconst viemClient = createPublicClient({transport});\n\n\tconst chainId = (await viemClient.getChainId()).toString();\n\n\tlet networkName: string;\n\tlet saveDeployments: boolean;\n\tlet tags: {[tag: string]: boolean} = {};\n\tif ('nodeUrl' in config) {\n\t\tnetworkName = config.networkName;\n\t\tsaveDeployments = true;\n\t} else {\n\t\tif (config.networkName) {\n\t\t\tnetworkName = config.networkName;\n\t\t} else {\n\t\t\tnetworkName = 'memory';\n\t\t}\n\t\tif (networkName === 'memory' || networkName === 'hardhat') {\n\t\t\ttags['memory'] = true;\n\t\t\tsaveDeployments = false;\n\t\t} else {\n\t\t\tsaveDeployments = true;\n\t\t}\n\t}\n\n\tconst resolvedAccounts: {[name: string]: ResolvedAccount} = {};\n\n\tconst accountCache: {[name: string]: ResolvedAccount} = {};\n\tasync function getAccount(\n\t\tname: string,\n\t\taccounts: UnresolvedUnknownNamedAccounts,\n\t\taccountDef: AccountType\n\t): Promise<ResolvedAccount | undefined> {\n\t\tif (accountCache[name]) {\n\t\t\treturn accountCache[name];\n\t\t}\n\t\tlet account: ResolvedAccount | undefined;\n\t\tif (typeof accountDef === 'number') {\n\t\t\tconst accounts = await provider.request({method: 'eth_accounts'});\n\t\t\tconst accountPerIndex = accounts[accountDef];\n\t\t\tif (accountPerIndex) {\n\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\ttype: 'remote',\n\t\t\t\t\taddress: accountPerIndex,\n\t\t\t\t\tsigner: provider,\n\t\t\t\t};\n\t\t\t}\n\t\t} else if (typeof accountDef === 'string') {\n\t\t\tif (accountDef.startsWith('0x')) {\n\t\t\t\tif (accountDef.length === 66) {\n\t\t\t\t\tconst privateKeyProtocol: SignerProtocol = (globalThis as any).signerProtocols['privateKey'];\n\t\t\t\t\tif (privateKeyProtocol) {\n\t\t\t\t\t\tconst namedSigner = await privateKeyProtocol.getSigner(`privateKey:${accountDef}`);\n\t\t\t\t\t\tconst [address] = await namedSigner.signer.request({method: 'eth_accounts'});\n\t\t\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\t\t\t...namedSigner,\n\t\t\t\t\t\t\taddress,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\t\ttype: 'remote',\n\t\t\t\t\t\taddress: accountDef as `0x${string}`,\n\t\t\t\t\t\tsigner: provider,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (accountDef.indexOf(':') > 0) {\n\t\t\t\t\tconst [protocolID, extra] = accountDef.split(':');\n\t\t\t\t\tconst protocol: SignerProtocol = (globalThis as any).signerProtocols[protocolID];\n\t\t\t\t\tif (!protocol) {\n\t\t\t\t\t\tthrow new Error(`protocol: ${protocol} is not supported`);\n\t\t\t\t\t}\n\t\t\t\t\tconst namedSigner = await protocol.getSigner(accountDef);\n\t\t\t\t\tconst [address] = await namedSigner.signer.request({method: 'eth_accounts'});\n\t\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\t\t...namedSigner,\n\t\t\t\t\t\taddress,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tconst accountFetched = await getAccount(name, accounts, accounts[accountDef]);\n\t\t\t\t\tif (accountFetched) {\n\t\t\t\t\t\taccountCache[name] = account = accountFetched;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst accountForNetwork = accountDef[networkName] || accountDef[chainId] || accountDef['default'];\n\t\t\tif (typeof accountForNetwork !== undefined) {\n\t\t\t\tconst accountFetched = await getAccount(name, accounts, accountForNetwork);\n\t\t\t\tif (accountFetched) {\n\t\t\t\t\taccountCache[name] = account = accountFetched;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn account;\n\t}\n\n\tif (providedContext.accounts) {\n\t\tconst accountNames = Object.keys(providedContext.accounts);\n\t\tfor (const accountName of accountNames) {\n\t\t\tlet account = await getAccount(accountName, providedContext.accounts, providedContext.accounts[accountName]);\n\t\t\t(resolvedAccounts as any)[accountName] = account;\n\t\t}\n\t}\n\n\tconst context = {\n\t\taccounts: resolvedAccounts,\n\t\tartifacts: providedContext.artifacts as Artifacts,\n\t\tnetwork: {\n\t\t\tname: networkName,\n\t\t\tsaveDeployments,\n\t\t\ttags,\n\t\t},\n\t};\n\n\tconst {deployments} = loadDeployments(config.deployments, context.network.name, false, chainId);\n\n\tconst namedAccounts: {[name: string]: EIP1193Account} = {};\n\tconst namedSigners: {[name: string]: NamedSigner} = {};\n\tconst addressSigners: {[name: `0x${string}`]: NamedSigner} = {};\n\n\tfor (const entry of Object.entries(resolvedAccounts)) {\n\t\tconst name = entry[0];\n\t\tconst {address, ...namedSigner} = entry[1];\n\t\tnamedAccounts[name] = address;\n\t\taddressSigners[address] = namedSigner;\n\t\tnamedSigners[name] = namedSigner;\n\t}\n\n\tconst perliminaryEnvironment = {\n\t\tconfig,\n\t\tdeployments: deployments as Deployments,\n\t\taccounts: namedAccounts as ResolvedNamedAccounts<NamedAccounts>,\n\t\tsigners: namedSigners as ResolvedNamedSigners<ResolvedNamedAccounts<NamedAccounts>>,\n\t\taddressSigners: addressSigners,\n\t\tartifacts: context.artifacts,\n\t\tnetwork: {\n\t\t\tchainId,\n\t\t\tname: context.network.name,\n\t\t\ttags: context.network.tags,\n\t\t\tprovider,\n\t\t},\n\t};\n\n\tfunction ensureDeploymentFolder(): string {\n\t\tconst folderPath = path.join(config.deployments, context.network.name);\n\t\tfs.mkdirSync(folderPath, {recursive: true});\n\t\tconst chainIdFilepath = path.join(folderPath, '.chainId');\n\t\tif (!fs.existsSync(chainIdFilepath)) {\n\t\t\tfs.writeFileSync(chainIdFilepath, chainId);\n\t\t}\n\t\treturn folderPath;\n\t}\n\n\t// const signer = {\n\t// \tasync sendTransaction(\n\t// \t\tprovider: EIP1193ProviderWithoutEvents,\n\t// \t\taccount: {\n\t// \t\t\taddresss: EIP1193Account;\n\t// \t\t\tconfig: unknown;\n\t// \t\t},\n\t// \t\ttransaction: EIP1193TransactionEIP1193DATA\n\t// \t): Promise<EIP1193DATA> {\n\t// \t\treturn '0x';\n\t// \t},\n\t// };\n\n\t// async function sendTransaction(transaction: EIP1193TransactionEIP1193DATA): Promise<EIP1193DATA> {\n\t// \treturn '0x';\n\t// }\n\n\tfunction get<TAbi extends Abi>(name: string): Deployment<TAbi> | undefined {\n\t\treturn deployments[name] as Deployment<TAbi> | undefined;\n\t}\n\n\tasync function save<TAbi extends Abi>(name: string, deployment: Deployment<TAbi>): Promise<Deployment<TAbi>> {\n\t\tdeployments[name] = deployment;\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst folderPath = ensureDeploymentFolder();\n\t\t\tfs.writeFileSync(`${folderPath}/${name}.json`, JSONToString(deployment, 2));\n\t\t}\n\t\treturn deployment;\n\t}\n\n\tasync function recoverTransactionsIfAny<TAbi extends Abi = Abi>(): Promise<void> {\n\t\tconst filepath = path.join(config.deployments, context.network.name, '.pending_transactions.json');\n\t\tlet existingPendingDeployments: {name: string; transaction: PendingDeployment<TAbi>}[];\n\t\ttry {\n\t\t\texistingPendingDeployments = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t} catch {\n\t\t\texistingPendingDeployments = [];\n\t\t}\n\t\tif (existingPendingDeployments.length > 0) {\n\t\t\twhile (existingPendingDeployments.length > 0) {\n\t\t\t\tconst pendingTransaction = existingPendingDeployments.shift();\n\t\t\t\tif (pendingTransaction) {\n\t\t\t\t\tconst spinner = spin(\n\t\t\t\t\t\t`recovering ${pendingTransaction.name} with transaction ${pendingTransaction.transaction.txHash}`\n\t\t\t\t\t);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait waitForTransactionAndSave(pendingTransaction.name, pendingTransaction.transaction);\n\t\t\t\t\t\tconsole.log(`transaction ${pendingTransaction.transaction.txHash} complete`);\n\t\t\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingDeployments, 2));\n\t\t\t\t\t\tspinner.succeed();\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tspinner.fail();\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tfs.rmSync(filepath);\n\t\t}\n\t}\n\n\tasync function saveTransaction<TAbi extends Abi = Abi>(name: string, transaction: PendingDeployment<TAbi>) {\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst folderPath = ensureDeploymentFolder();\n\t\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\t\tlet existingPendingDeployments: {name: string; transaction: PendingDeployment<TAbi>}[];\n\t\t\ttry {\n\t\t\t\texistingPendingDeployments = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendingDeployments = [];\n\t\t\t}\n\t\t\texistingPendingDeployments.push({name, transaction});\n\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingDeployments, 2));\n\t\t}\n\t\treturn deployments;\n\t}\n\n\tasync function deleteTransaction<TAbi extends Abi = Abi>(hash: string) {\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst filepath = path.join(config.deployments, context.network.name, '.pending_transactions.json');\n\t\t\tlet existingPendingDeployments: {name: string; transaction: PendingDeployment<TAbi>}[];\n\t\t\ttry {\n\t\t\t\texistingPendingDeployments = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendingDeployments = [];\n\t\t\t}\n\t\t\texistingPendingDeployments = existingPendingDeployments.filter((v) => v.transaction.txHash !== hash);\n\t\t\tif (existingPendingDeployments.length === 0) {\n\t\t\t\tfs.rmSync(filepath);\n\t\t\t} else {\n\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingDeployments, 2));\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function exportDeploymentsAsTypes() {\n\t\tconst folderPath = './generated';\n\t\tfs.mkdirSync(folderPath, {recursive: true});\n\t\tfs.writeFileSync(`${folderPath}/deployments.ts`, `export default ${JSONToString(deployments, 2)} as const;`);\n\t}\n\n\tasync function waitForTransactionAndSave<TAbi extends Abi = Abi>(\n\t\tname: string,\n\t\tpendingDeployment: PendingDeployment<TAbi>,\n\t\ttransaction?: EIP1193Transaction | null\n\t): Promise<Deployment<TAbi>> {\n\t\tconst spinner = spin(`tx ${pendingDeployment.txHash}${transaction ? ` ${displayTransaction(transaction)}` : ''}`);\n\t\tlet receipt: TransactionReceipt;\n\t\ttry {\n\t\t\treceipt = await viemClient.waitForTransactionReceipt({\n\t\t\t\thash: pendingDeployment.txHash,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tspinner.fail();\n\t\t\tthrow e;\n\t\t}\n\t\tif (!receipt) {\n\t\t\tspinner.fail(`receipt for ${pendingDeployment.txHash} not found`);\n\t\t} else {\n\t\t\tspinner.succeed();\n\t\t}\n\n\t\tif (!receipt.contractAddress) {\n\t\t\tthrow new Error(`failed to deploy contract ${name}`);\n\t\t}\n\t\tconst {abi, ...artifactObjectWithoutABI} = pendingDeployment.partialDeployment;\n\n\t\tif (!artifactObjectWithoutABI.nonce) {\n\t\t\tconst spinner = spin(`fetching nonce for ${pendingDeployment.txHash}`);\n\t\t\tlet transaction: EIP1193Transaction | null = null;\n\t\t\ttry {\n\t\t\t\ttransaction = await provider.request({\n\t\t\t\t\tmethod: 'eth_getTransactionByHash',\n\t\t\t\t\tparams: [pendingDeployment.txHash],\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\tif (!transaction) {\n\t\t\t\tspinner.fail(`tx ${pendingDeployment.txHash} not found`);\n\t\t\t} else {\n\t\t\t\tspinner.stop();\n\t\t\t}\n\n\t\t\tif (transaction) {\n\t\t\t\tartifactObjectWithoutABI.nonce = transaction.nonce;\n\t\t\t\tartifactObjectWithoutABI.txOrigin = transaction.from;\n\t\t\t}\n\t\t}\n\n\t\t// TODO options\n\t\tfor (const key of Object.keys(artifactObjectWithoutABI)) {\n\t\t\tif (key.startsWith('_')) {\n\t\t\t\tdelete (artifactObjectWithoutABI as any)[key];\n\t\t\t}\n\t\t\tif (key === 'evm') {\n\t\t\t\tconst {gasEstimates} = artifactObjectWithoutABI.evm;\n\t\t\t\tartifactObjectWithoutABI.evm = {\n\t\t\t\t\tgasEstimates,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst deployment = {\n\t\t\taddress: receipt.contractAddress,\n\t\t\ttxHash: pendingDeployment.txHash,\n\t\t\tabi,\n\t\t\t...artifactObjectWithoutABI,\n\t\t};\n\t\treturn save(name, deployment);\n\t}\n\n\tasync function saveWhilePending<TAbi extends Abi = Abi>(name: string, pendingDeployment: PendingDeployment<TAbi>) {\n\t\tawait saveTransaction<TAbi>(name, pendingDeployment);\n\t\tlet transaction: EIP1193Transaction | null = null;\n\t\tconst spinner = spin(`fetching tx from peers ${pendingDeployment.txHash}`);\n\t\ttry {\n\t\t\ttransaction = await provider.request({\n\t\t\t\tmethod: 'eth_getTransactionByHash',\n\t\t\t\tparams: [pendingDeployment.txHash],\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tspinner.fail();\n\t\t\tthrow e;\n\t\t}\n\t\tif (!transaction) {\n\t\t\tspinner.fail(`tx ${pendingDeployment.txHash} not found`);\n\t\t} else {\n\t\t\tspinner.stop();\n\t\t}\n\n\t\tconst deployment = waitForTransactionAndSave<TAbi>(\n\t\t\tname,\n\t\t\ttransaction\n\t\t\t\t? {\n\t\t\t\t\t\t...pendingDeployment,\n\t\t\t\t\t\tnonce: transaction.nonce,\n\t\t\t\t\t\ttxOrigin: transaction.from,\n\t\t\t\t }\n\t\t\t\t: pendingDeployment,\n\t\t\ttransaction\n\t\t);\n\t\tawait deleteTransaction(pendingDeployment.txHash);\n\t\treturn deployment;\n\t}\n\n\tlet env: Environment<Artifacts, NamedAccounts, Deployments> = {\n\t\t...perliminaryEnvironment,\n\t\tsave,\n\t\tsaveWhilePending,\n\t\tget,\n\t};\n\tfor (const extension of (globalThis as any).extensions) {\n\t\tenv = extension(env);\n\t}\n\n\treturn {\n\t\texternal: env,\n\t\tinternal: {\n\t\t\texportDeploymentsAsTypes,\n\t\t\trecoverTransactionsIfAny,\n\t\t},\n\t};\n}\n","// TODO share with db-utils\nexport function bnReplacer(k: string, v: any): any {\n\tif (typeof v === 'bigint') {\n\t\treturn v.toString() + 'n';\n\t}\n\treturn v;\n}\n\nexport function bnReviver(k: string, v: any): any {\n\tif (\n\t\ttypeof v === 'string' &&\n\t\t(v.startsWith('-') ? !isNaN(parseInt(v.charAt(1))) : !isNaN(parseInt(v.charAt(0)))) &&\n\t\tv.charAt(v.length - 1) === 'n'\n\t) {\n\t\treturn BigInt(v.slice(0, -1));\n\t}\n\treturn v;\n}\n\nexport function JSONToString<T = unknown>(json: unknown, space?: string | number) {\n\treturn JSON.stringify(json, bnReplacer, space);\n}\n\nexport function stringToJSON<T = unknown>(str: string): T {\n\treturn JSON.parse(str, bnReviver);\n}\n","import path from 'node:path';\nimport fs from 'node:fs';\nimport {traverse} from '../utils/fs';\nimport {UnknownDeployments} from './types';\n\nexport function loadDeployments(\n\tdeploymentsPath: string,\n\tsubPath: string,\n\tonlyABIAndAddress?: boolean,\n\texpectedChainId?: string\n): {deployments: UnknownDeployments; chainId?: string} {\n\tconst deploymentsFound: UnknownDeployments = {};\n\tconst deployPath = path.join(deploymentsPath, subPath);\n\n\tlet filesStats;\n\ttry {\n\t\tfilesStats = traverse(deployPath, undefined, undefined, (name) => !name.startsWith('.') && name !== 'solcInputs');\n\t} catch (e) {\n\t\t// console.log('no folder at ' + deployPath);\n\t\treturn {deployments: {}};\n\t}\n\tlet chainId: string;\n\tif (filesStats.length > 0) {\n\t\tconst chainIdFilepath = path.join(deployPath, '.chainId');\n\t\tif (fs.existsSync(chainIdFilepath)) {\n\t\t\tchainId = fs.readFileSync(chainIdFilepath).toString().trim();\n\t\t} else {\n\t\t\tthrow new Error(`A .chainId' file is expected to be present in the deployment folder for network ${subPath}`);\n\t\t}\n\n\t\tif (expectedChainId) {\n\t\t\tif (expectedChainId !== chainId) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Loading deployment in folder '${deployPath}' (with chainId: ${chainId}) for a different chainId (${expectedChainId})`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} else {\n\t\treturn {deployments: {}};\n\t}\n\tlet fileNames = filesStats.map((a) => a.relativePath);\n\tfileNames = fileNames.sort((a, b) => {\n\t\tif (a < b) {\n\t\t\treturn -1;\n\t\t}\n\t\tif (a > b) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t});\n\n\tfor (const fileName of fileNames) {\n\t\tif (fileName.substring(fileName.length - 5) === '.json') {\n\t\t\tconst deploymentFileName = path.join(deployPath, fileName);\n\t\t\tlet deployment = JSON.parse(fs.readFileSync(deploymentFileName).toString());\n\t\t\t// truffleChainId argument:\n\t\t\t// if (!deployment.address && deployment.networks) {\n\t\t\t// \tif (truffleChainId && deployment.networks[truffleChainId]) {\n\t\t\t// \t\t// TRUFFLE support\n\t\t\t// \t\tconst truffleDeployment = deployment as any; // TruffleDeployment;\n\t\t\t// \t\tdeployment.address = truffleDeployment.networks[truffleChainId].address;\n\t\t\t// \t\tdeployment.transactionHash = truffleDeployment.networks[truffleChainId].transactionHash;\n\t\t\t// \t}\n\t\t\t// }\n\t\t\tif (onlyABIAndAddress) {\n\t\t\t\tdeployment = {\n\t\t\t\t\taddress: deployment.address,\n\t\t\t\t\tabi: deployment.abi,\n\t\t\t\t\tlinkedData: deployment.linkedData,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst name = fileName.slice(0, fileName.length - 5);\n\t\t\t// console.log('fetching ' + deploymentFileName + ' for ' + name);\n\n\t\t\tdeploymentsFound[name] = deployment;\n\t\t}\n\t}\n\treturn {deployments: deploymentsFound, chainId};\n}\n","import {logs} from 'named-logs';\n\nimport {hookup, logs as Logging} from 'named-logs-console';\nimport ora from 'ora-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\ntype PartialOra = {\n\tstop(): PartialOra;\n\tsucceed(msg?: string): PartialOra;\n\tfail(msg?: string): PartialOra;\n};\nconst voidSpinner: PartialOra = {\n\tstop() {\n\t\treturn this;\n\t},\n\tsucceed(msg?: string) {\n\t\treturn this;\n\t},\n\tfail(msg?: string) {\n\t\treturn this;\n\t},\n};\n// export function spin(message: string): PartialOra {\n// \treturn Logging.level > 0 ? ora(message).start() : voidSpinner;\n// }\n\nlet lastSpin = ora('rocketh');\nexport function spin(message: string): PartialOra {\n\tif (Logging.level > 0) {\n\t\tlastSpin = lastSpin.start(message);\n\t\treturn lastSpin;\n\t} else {\n\t\treturn voidSpinner;\n\t}\n}\n"],"mappings":"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","names":["path","fs","fs","path","path","fs","path","fs","accounts","path","fs","spinner","transaction","fs","path"]}
1
+ {"version":3,"sources":["../src/utils/fs.ts","../src/executor/index.ts","../src/environment/index.ts","../src/utils/json.ts","../src/environment/deployments.ts","../src/internal/logging.ts"],"sourcesContent":["// taken from https://github.com/vitejs/vite/blob/63524bac878e8d3771d34ad7ad2e10cd16870ff4/packages/vite/src/node/utils.ts#L371-L400\nimport fs from 'node:fs';\nimport path from 'node:path';\n\ninterface LookupFileOptions {\n\tpathOnly?: boolean;\n\trootDir?: string;\n\tpredicate?: (file: string) => boolean;\n}\n\nexport function lookupFile(dir: string, formats: string[], options?: LookupFileOptions): string | undefined {\n\tfor (const format of formats) {\n\t\tconst fullPath = path.join(dir, format);\n\t\tif (fs.existsSync(fullPath) && fs.statSync(fullPath).isFile()) {\n\t\t\tconst result = options?.pathOnly ? fullPath : fs.readFileSync(fullPath, 'utf-8');\n\t\t\tif (!options?.predicate || options.predicate(result)) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t}\n\tconst parentDir = path.dirname(dir);\n\tif (parentDir !== dir && (!options?.rootDir || parentDir.startsWith(options?.rootDir))) {\n\t\treturn lookupFile(parentDir, formats, options);\n\t}\n}\n\nexport function traverseMultipleDirectory(dirs: string[]): string[] {\n\tconst filepaths = [];\n\tfor (const dir of dirs) {\n\t\tlet filesStats = traverse(dir);\n\t\tfilesStats = filesStats.filter((v) => !v.directory);\n\t\tfor (const filestat of filesStats) {\n\t\t\tfilepaths.push(path.join(dir, filestat.relativePath));\n\t\t}\n\t}\n\treturn filepaths;\n}\n\nexport const traverse = function (\n\tdir: string,\n\tresult: any[] = [],\n\ttopDir?: string,\n\tfilter?: (name: string, stats: any) => boolean // TODO any is Stats\n): Array<{\n\tname: string;\n\tpath: string;\n\trelativePath: string;\n\tmtimeMs: number;\n\tdirectory: boolean;\n}> {\n\tfs.readdirSync(dir).forEach((name) => {\n\t\tconst fPath = path.resolve(dir, name);\n\t\tconst stats = fs.statSync(fPath);\n\t\tif ((!filter && !name.startsWith('.')) || (filter && filter(name, stats))) {\n\t\t\tconst fileStats = {\n\t\t\t\tname,\n\t\t\t\tpath: fPath,\n\t\t\t\trelativePath: path.relative(topDir || dir, fPath),\n\t\t\t\tmtimeMs: stats.mtimeMs,\n\t\t\t\tdirectory: stats.isDirectory(),\n\t\t\t};\n\t\t\tif (fileStats.directory) {\n\t\t\t\tresult.push(fileStats);\n\t\t\t\treturn traverse(fPath, result, topDir || dir, filter);\n\t\t\t}\n\t\t\tresult.push(fileStats);\n\t\t}\n\t});\n\treturn result;\n};\n","import {traverseMultipleDirectory} from '../utils/fs';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport type {\n\tConfig,\n\tEnvironment,\n\tResolvedConfig,\n\tResolvedNamedAccounts,\n\tUnknownArtifacts,\n\tUnknownDeployments,\n\tUnresolvedUnknownNamedAccounts,\n} from '../environment/types';\nimport {createEnvironment} from '../environment';\nimport {DeployScriptFunction, DeployScriptModule, ProvidedContext} from './types';\nimport {logger, setLogLevel, spin} from '../internal/logging';\n\nrequire('esbuild-register/dist/node').register();\n\nexport function execute<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(\n\tcontext: ProvidedContext<Artifacts, NamedAccounts>,\n\tcallback: DeployScriptFunction<Artifacts, ResolvedNamedAccounts<NamedAccounts>, Deployments>,\n\toptions: {tags?: string[]; dependencies?: string[]}\n): DeployScriptModule<Artifacts, NamedAccounts, Deployments> {\n\tconst scriptModule = (env: Environment<Artifacts, ResolvedNamedAccounts<NamedAccounts>, Deployments>) =>\n\t\tcallback(env);\n\tscriptModule.providedContext = context;\n\tscriptModule.tags = options.tags;\n\tscriptModule.dependencies = options.dependencies;\n\t// TODO id + skip\n\treturn scriptModule as unknown as DeployScriptModule<Artifacts, NamedAccounts, Deployments>;\n}\n\nexport type ConfigOptions = {network: string; deployments?: string; scripts?: string; tags?: string};\n\nexport function readConfig(options: ConfigOptions, extra?: {ignoreMissingRPC?: boolean}): Config {\n\ttype Networks = {[name: string]: {rpcUrl: string}};\n\ttype ConfigFile = {networks: Networks};\n\tlet configFile: ConfigFile | undefined;\n\ttry {\n\t\tconst configString = fs.readFileSync('./rocketh.json', 'utf-8');\n\t\tconfigFile = JSON.parse(configString);\n\t} catch {}\n\n\tlet nodeUrl: string;\n\tconst fromEnv = process.env['ETH_NODE_URI_' + options.network];\n\tif (typeof fromEnv === 'string') {\n\t\tnodeUrl = fromEnv;\n\t} else {\n\t\tif (configFile) {\n\t\t\tconst network = configFile.networks && configFile.networks[options.network];\n\t\t\tif (network) {\n\t\t\t\tnodeUrl = network.rpcUrl;\n\t\t\t} else {\n\t\t\t\tif (extra?.ignoreMissingRPC) {\n\t\t\t\t\tnodeUrl = '';\n\t\t\t\t} else {\n\t\t\t\t\tif (options.network === 'localhost') {\n\t\t\t\t\t\tnodeUrl = 'http://127.0.0.1:8545';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.error(`network \"${options.network}\" is not configured. Please add it to the rocketh.json file`);\n\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (extra?.ignoreMissingRPC) {\n\t\t\t\tnodeUrl = '';\n\t\t\t} else {\n\t\t\t\tif (options.network === 'localhost') {\n\t\t\t\t\tnodeUrl = 'http://127.0.0.1:8545';\n\t\t\t\t} else {\n\t\t\t\t\tlogger.error(`network \"${options.network}\" is not configured. Please add it to the rocketh.json file`);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tnodeUrl,\n\t\tnetworkName: options.network,\n\t\tdeployments: options.deployments,\n\t\tscripts: options.scripts,\n\t\ttags: typeof options.tags === 'undefined' ? undefined : options.tags.split(','),\n\t};\n}\n\nexport function readAndResolveConfig(options: ConfigOptions, extra?: {ignoreMissingRPC?: boolean}): ResolvedConfig {\n\treturn resolveConfig(readConfig(options, extra));\n}\n\nexport function resolveConfig(config: Config): ResolvedConfig {\n\tconst resolvedConfig: ResolvedConfig = {\n\t\t...config,\n\t\tnetworkName: config.networkName || 'memory',\n\t\tdeployments: config.deployments || 'deployments',\n\t\tscripts: config.scripts || 'deploy',\n\t\ttags: config.tags || [],\n\t};\n\treturn resolvedConfig;\n}\n\nexport async function loadAndExecuteDeployments<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(config: Config) {\n\tconst resolvedConfig = resolveConfig(config);\n\n\treturn executeDeployScripts<Artifacts, NamedAccounts, Deployments>(resolvedConfig);\n\n\t// TODO\n\t// await this.export(options);\n}\n\nexport async function executeDeployScripts<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(config: ResolvedConfig): Promise<Deployments> {\n\tsetLogLevel(typeof config.logLevel === 'undefined' ? 0 : config.logLevel);\n\n\tlet filepaths;\n\tfilepaths = traverseMultipleDirectory([config.scripts]);\n\tfilepaths = filepaths\n\t\t.filter((v) => !path.basename(v).startsWith('_'))\n\t\t.sort((a: string, b: string) => {\n\t\t\tif (a < b) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (a > b) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\treturn 0;\n\t\t});\n\n\tlet providedContext: ProvidedContext<Artifacts, NamedAccounts> | undefined;\n\n\tconst scriptModuleByFilePath: {[filename: string]: DeployScriptModule} = {};\n\tconst scriptPathBags: {[tag: string]: string[]} = {};\n\tconst scriptFilePaths: string[] = [];\n\n\tfor (const filepath of filepaths) {\n\t\tconst scriptFilePath = path.resolve(filepath);\n\t\tlet scriptModule: DeployScriptModule;\n\t\ttry {\n\t\t\tif (require.cache) {\n\t\t\t\tdelete require.cache[scriptFilePath]; // ensure we reload it every time, so changes are taken in consideration\n\t\t\t}\n\t\t\tscriptModule = require(scriptFilePath);\n\n\t\t\tif ((scriptModule as any).default) {\n\t\t\t\tscriptModule = (scriptModule as any).default as DeployScriptModule;\n\t\t\t\tif ((scriptModule as any).default) {\n\t\t\t\t\tlogger.warn(`double default...`);\n\t\t\t\t\tscriptModule = (scriptModule as any).default as DeployScriptModule;\n\t\t\t\t}\n\t\t\t}\n\t\t\tscriptModuleByFilePath[scriptFilePath] = scriptModule;\n\t\t\tif (providedContext && providedContext !== scriptModule.providedContext) {\n\t\t\t\tthrow new Error(`context between 2 scripts is different, please share the same across them`);\n\t\t\t}\n\t\t\tprovidedContext = scriptModule.providedContext as ProvidedContext<Artifacts, NamedAccounts>;\n\t\t} catch (e) {\n\t\t\tlogger.error(`could not import ${filepath}`);\n\t\t\tthrow e;\n\t\t}\n\n\t\tlet scriptTags = scriptModule.tags;\n\t\tif (scriptTags !== undefined) {\n\t\t\tif (typeof scriptTags === 'string') {\n\t\t\t\tscriptTags = [scriptTags];\n\t\t\t}\n\t\t\tfor (const tag of scriptTags) {\n\t\t\t\tif (tag.indexOf(',') >= 0) {\n\t\t\t\t\tthrow new Error('Tag cannot contains commas');\n\t\t\t\t}\n\t\t\t\tconst bag = scriptPathBags[tag] || [];\n\t\t\t\tscriptPathBags[tag] = bag;\n\t\t\t\tbag.push(scriptFilePath);\n\t\t\t}\n\t\t}\n\n\t\tif (config.tags !== undefined && config.tags.length > 0) {\n\t\t\tlet found = false;\n\t\t\tif (scriptTags !== undefined) {\n\t\t\t\tfor (const tagToFind of config.tags) {\n\t\t\t\t\tfor (const tag of scriptTags) {\n\t\t\t\t\t\tif (tag === tagToFind) {\n\t\t\t\t\t\t\tscriptFilePaths.push(scriptFilePath);\n\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (found) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tscriptFilePaths.push(scriptFilePath);\n\t\t}\n\t}\n\n\tif (!providedContext) {\n\t\tthrow new Error(`no context loaded`);\n\t}\n\n\tconst {internal, external} = await createEnvironment(config, providedContext);\n\n\tawait internal.recoverTransactionsIfAny();\n\n\tconst scriptsRegisteredToRun: {[filename: string]: boolean} = {};\n\tconst scriptsToRun: Array<{\n\t\tfunc: DeployScriptModule;\n\t\tfilePath: string;\n\t}> = [];\n\tconst scriptsToRunAtTheEnd: Array<{\n\t\tfunc: DeployScriptModule;\n\t\tfilePath: string;\n\t}> = [];\n\tfunction recurseDependencies(scriptFilePath: string) {\n\t\tif (scriptsRegisteredToRun[scriptFilePath]) {\n\t\t\treturn;\n\t\t}\n\t\tconst scriptModule = scriptModuleByFilePath[scriptFilePath];\n\t\tif (scriptModule.dependencies) {\n\t\t\tfor (const dependency of scriptModule.dependencies) {\n\t\t\t\tconst scriptFilePathsToAdd = scriptPathBags[dependency];\n\t\t\t\tif (scriptFilePathsToAdd) {\n\t\t\t\t\tfor (const scriptFilenameToAdd of scriptFilePathsToAdd) {\n\t\t\t\t\t\trecurseDependencies(scriptFilenameToAdd);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!scriptsRegisteredToRun[scriptFilePath]) {\n\t\t\tif (scriptModule.runAtTheEnd) {\n\t\t\t\tscriptsToRunAtTheEnd.push({\n\t\t\t\t\tfilePath: scriptFilePath,\n\t\t\t\t\tfunc: scriptModule,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tscriptsToRun.push({\n\t\t\t\t\tfilePath: scriptFilePath,\n\t\t\t\t\tfunc: scriptModule,\n\t\t\t\t});\n\t\t\t}\n\t\t\tscriptsRegisteredToRun[scriptFilePath] = true;\n\t\t}\n\t}\n\tfor (const scriptFilePath of scriptFilePaths) {\n\t\trecurseDependencies(scriptFilePath);\n\t}\n\n\tfor (const deployScript of scriptsToRun.concat(scriptsToRunAtTheEnd)) {\n\t\tconst filename = path.basename(deployScript.filePath);\n\t\tconst relativeFilepath = path.relative('.', deployScript.filePath);\n\t\t// if (deployScript.func.id && this.db.migrations[deployScript.func.id]) {\n\t\t// \tlogger.info(`skipping ${filename} as migrations already executed and complete`);\n\t\t// \tcontinue;\n\t\t// }\n\t\tlet skip = false;\n\t\tif (deployScript.func.skip) {\n\t\t\tconst spinner = spin(`Executing skipping function from ${filename}`);\n\t\t\ttry {\n\t\t\t\tskip = await deployScript.func.skip(external);\n\t\t\t\tspinner.succeed(skip ? `skipping ${filename}` : undefined);\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\t\tif (!skip) {\n\t\t\tlet result;\n\t\t\tconst spinner = spin(`Executing ${filename}`);\n\t\t\ttry {\n\t\t\t\tresult = await deployScript.func(external);\n\t\t\t\tspinner.succeed(`${filename} execution complete`);\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\tif (result && typeof result === 'boolean') {\n\t\t\t\t// if (!deployScript.func.id) {\n\t\t\t\t// \tthrow new Error(\n\t\t\t\t// \t\t`${deployScript.filePath} return true to not be executed again, but does not provide an id. the script function needs to have the field \"id\" to be set`\n\t\t\t\t// \t);\n\t\t\t\t// }\n\t\t\t\t// this.db.migrations[deployScript.func.id] = Math.floor(Date.now() / 1000);\n\n\t\t\t\tconst deploymentFolderPath = config.deployments;\n\n\t\t\t\t// TODO refactor to extract this whole path and folder existence stuff\n\t\t\t\t// const toSave = this.db.writeDeploymentsToFiles && this.network.saveDeployments;\n\t\t\t\t// if (toSave) {\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tfs.mkdirSync(this.deploymentsPath);\n\t\t\t\t// \t} catch (e) {}\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tfs.mkdirSync(path.join(this.deploymentsPath, deploymentFolderPath));\n\t\t\t\t// \t} catch (e) {}\n\t\t\t\t// \tfs.writeFileSync(\n\t\t\t\t// \t\tpath.join(this.deploymentsPath, deploymentFolderPath, '.migrations.json'),\n\t\t\t\t// \t\tJSON.stringify(this.db.migrations, null, ' ')\n\t\t\t\t// \t);\n\t\t\t\t// }\n\t\t\t}\n\t\t}\n\t}\n\n\treturn external.deployments as Deployments;\n}\n","import fs from 'node:fs';\n\nimport {Transaction, TransactionReceipt, createPublicClient, custom} from 'viem';\nimport {\n\tAccountType,\n\tDeployment,\n\tEnvironment,\n\tNamedSigner,\n\tPendingDeployment,\n\tResolvedAccount,\n\tResolvedConfig,\n\tResolvedNamedAccounts,\n\tResolvedNamedSigners,\n\tUnknownArtifacts,\n\tUnknownDeployments,\n\tUnresolvedUnknownNamedAccounts,\n} from './types';\nimport {JSONRPCHTTPProvider} from 'eip-1193-json-provider';\nimport {Abi} from 'abitype';\nimport {InternalEnvironment} from '../internal/types';\nimport path from 'node:path';\nimport {JSONToString, stringToJSON} from '../utils/json';\nimport {loadDeployments} from './deployments';\nimport {EIP1193Account, EIP1193ProviderWithoutEvents, EIP1193Transaction} from 'eip-1193';\nimport {ProvidedContext} from '../executor/types';\nimport {spin} from '../internal/logging';\n\nexport type EnvironmentExtenstion = (env: Environment) => Environment;\n//we store this globally so this is not lost\n(globalThis as any).extensions = [];\nexport function extendEnvironment(extension: EnvironmentExtenstion): void {\n\t(globalThis as any).extensions.push(extension);\n}\n\nexport type SignerProtocolFunction = (protocolString: string) => Promise<NamedSigner>;\nexport type SignerProtocol = {\n\tgetSigner: SignerProtocolFunction;\n};\n\n//we store this globally so this is not lost\n(globalThis as any).signerProtocols = {};\nexport function handleSignerProtocol(protocol: string, getSigner: SignerProtocolFunction): void {\n\t(globalThis as any).signerProtocols[protocol] = {\n\t\tgetSigner,\n\t};\n}\n\nfunction displayTransaction(transaction: EIP1193Transaction) {\n\tif (transaction.type === '0x2') {\n\t\treturn `(maxFeePerGas: ${BigInt(transaction.maxFeePerGas).toString()}, maxPriorityFeePerGas: ${BigInt(\n\t\t\ttransaction.maxPriorityFeePerGas\n\t\t).toString()})`;\n\t} else {\n\t\treturn `(gasPrice: ${BigInt(transaction.gasPrice).toString()})`;\n\t}\n}\n\nexport async function createEnvironment<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(\n\tconfig: ResolvedConfig,\n\tprovidedContext: ProvidedContext<Artifacts, NamedAccounts>\n): Promise<{internal: InternalEnvironment; external: Environment}> {\n\tconst provider =\n\t\t'provider' in config ? config.provider : (new JSONRPCHTTPProvider(config.nodeUrl) as EIP1193ProviderWithoutEvents);\n\n\tconst transport = custom(provider);\n\tconst viemClient = createPublicClient({transport});\n\n\tconst chainId = (await viemClient.getChainId()).toString();\n\n\tlet networkName: string;\n\tlet saveDeployments: boolean;\n\tlet tags: {[tag: string]: boolean} = {};\n\tif ('nodeUrl' in config) {\n\t\tnetworkName = config.networkName;\n\t\tsaveDeployments = true;\n\t} else {\n\t\tif (config.networkName) {\n\t\t\tnetworkName = config.networkName;\n\t\t} else {\n\t\t\tnetworkName = 'memory';\n\t\t}\n\t\tif (networkName === 'memory' || networkName === 'hardhat') {\n\t\t\ttags['memory'] = true;\n\t\t\tsaveDeployments = false;\n\t\t} else {\n\t\t\tsaveDeployments = true;\n\t\t}\n\t}\n\n\tconst resolvedAccounts: {[name: string]: ResolvedAccount} = {};\n\n\tconst accountCache: {[name: string]: ResolvedAccount} = {};\n\tasync function getAccount(\n\t\tname: string,\n\t\taccounts: UnresolvedUnknownNamedAccounts,\n\t\taccountDef: AccountType\n\t): Promise<ResolvedAccount | undefined> {\n\t\tif (accountCache[name]) {\n\t\t\treturn accountCache[name];\n\t\t}\n\t\tlet account: ResolvedAccount | undefined;\n\t\tif (typeof accountDef === 'number') {\n\t\t\tconst accounts = await provider.request({method: 'eth_accounts'});\n\t\t\tconst accountPerIndex = accounts[accountDef];\n\t\t\tif (accountPerIndex) {\n\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\ttype: 'remote',\n\t\t\t\t\taddress: accountPerIndex,\n\t\t\t\t\tsigner: provider,\n\t\t\t\t};\n\t\t\t}\n\t\t} else if (typeof accountDef === 'string') {\n\t\t\tif (accountDef.startsWith('0x')) {\n\t\t\t\tif (accountDef.length === 66) {\n\t\t\t\t\tconst privateKeyProtocol: SignerProtocol = (globalThis as any).signerProtocols['privateKey'];\n\t\t\t\t\tif (privateKeyProtocol) {\n\t\t\t\t\t\tconst namedSigner = await privateKeyProtocol.getSigner(`privateKey:${accountDef}`);\n\t\t\t\t\t\tconst [address] = await namedSigner.signer.request({method: 'eth_accounts'});\n\t\t\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\t\t\t...namedSigner,\n\t\t\t\t\t\t\taddress,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\t\ttype: 'remote',\n\t\t\t\t\t\taddress: accountDef as `0x${string}`,\n\t\t\t\t\t\tsigner: provider,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (accountDef.indexOf(':') > 0) {\n\t\t\t\t\tconst [protocolID, extra] = accountDef.split(':');\n\t\t\t\t\tconst protocol: SignerProtocol = (globalThis as any).signerProtocols[protocolID];\n\t\t\t\t\tif (!protocol) {\n\t\t\t\t\t\tthrow new Error(`protocol: ${protocol} is not supported`);\n\t\t\t\t\t}\n\t\t\t\t\tconst namedSigner = await protocol.getSigner(accountDef);\n\t\t\t\t\tconst [address] = await namedSigner.signer.request({method: 'eth_accounts'});\n\t\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\t\t...namedSigner,\n\t\t\t\t\t\taddress,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tconst accountFetched = await getAccount(name, accounts, accounts[accountDef]);\n\t\t\t\t\tif (accountFetched) {\n\t\t\t\t\t\taccountCache[name] = account = accountFetched;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst accountForNetwork = accountDef[networkName] || accountDef[chainId] || accountDef['default'];\n\t\t\tif (typeof accountForNetwork !== undefined) {\n\t\t\t\tconst accountFetched = await getAccount(name, accounts, accountForNetwork);\n\t\t\t\tif (accountFetched) {\n\t\t\t\t\taccountCache[name] = account = accountFetched;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn account;\n\t}\n\n\tif (providedContext.accounts) {\n\t\tconst accountNames = Object.keys(providedContext.accounts);\n\t\tfor (const accountName of accountNames) {\n\t\t\tlet account = await getAccount(accountName, providedContext.accounts, providedContext.accounts[accountName]);\n\t\t\t(resolvedAccounts as any)[accountName] = account;\n\t\t}\n\t}\n\n\tconst context = {\n\t\taccounts: resolvedAccounts,\n\t\tartifacts: providedContext.artifacts as Artifacts,\n\t\tnetwork: {\n\t\t\tname: networkName,\n\t\t\tsaveDeployments,\n\t\t\ttags,\n\t\t},\n\t};\n\n\tconst {deployments} = loadDeployments(config.deployments, context.network.name, false, chainId);\n\n\tconst namedAccounts: {[name: string]: EIP1193Account} = {};\n\tconst namedSigners: {[name: string]: NamedSigner} = {};\n\tconst addressSigners: {[name: `0x${string}`]: NamedSigner} = {};\n\n\tfor (const entry of Object.entries(resolvedAccounts)) {\n\t\tconst name = entry[0];\n\t\tconst {address, ...namedSigner} = entry[1];\n\t\tnamedAccounts[name] = address;\n\t\taddressSigners[address] = namedSigner;\n\t\tnamedSigners[name] = namedSigner;\n\t}\n\n\tconst perliminaryEnvironment = {\n\t\tconfig,\n\t\tdeployments: deployments as Deployments,\n\t\taccounts: namedAccounts as ResolvedNamedAccounts<NamedAccounts>,\n\t\tsigners: namedSigners as ResolvedNamedSigners<ResolvedNamedAccounts<NamedAccounts>>,\n\t\taddressSigners: addressSigners,\n\t\tartifacts: context.artifacts,\n\t\tnetwork: {\n\t\t\tchainId,\n\t\t\tname: context.network.name,\n\t\t\ttags: context.network.tags,\n\t\t\tprovider,\n\t\t},\n\t};\n\n\tfunction ensureDeploymentFolder(): string {\n\t\tconst folderPath = path.join(config.deployments, context.network.name);\n\t\tfs.mkdirSync(folderPath, {recursive: true});\n\t\tconst chainIdFilepath = path.join(folderPath, '.chainId');\n\t\tif (!fs.existsSync(chainIdFilepath)) {\n\t\t\tfs.writeFileSync(chainIdFilepath, chainId);\n\t\t}\n\t\treturn folderPath;\n\t}\n\n\t// const signer = {\n\t// \tasync sendTransaction(\n\t// \t\tprovider: EIP1193ProviderWithoutEvents,\n\t// \t\taccount: {\n\t// \t\t\taddresss: EIP1193Account;\n\t// \t\t\tconfig: unknown;\n\t// \t\t},\n\t// \t\ttransaction: EIP1193TransactionEIP1193DATA\n\t// \t): Promise<EIP1193DATA> {\n\t// \t\treturn '0x';\n\t// \t},\n\t// };\n\n\t// async function sendTransaction(transaction: EIP1193TransactionEIP1193DATA): Promise<EIP1193DATA> {\n\t// \treturn '0x';\n\t// }\n\n\tfunction get<TAbi extends Abi>(name: string): Deployment<TAbi> | undefined {\n\t\treturn deployments[name] as Deployment<TAbi> | undefined;\n\t}\n\n\tasync function save<TAbi extends Abi>(name: string, deployment: Deployment<TAbi>): Promise<Deployment<TAbi>> {\n\t\tdeployments[name] = deployment;\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst folderPath = ensureDeploymentFolder();\n\t\t\tfs.writeFileSync(`${folderPath}/${name}.json`, JSONToString(deployment, 2));\n\t\t}\n\t\treturn deployment;\n\t}\n\n\tasync function recoverTransactionsIfAny<TAbi extends Abi = Abi>(): Promise<void> {\n\t\tconst filepath = path.join(config.deployments, context.network.name, '.pending_transactions.json');\n\t\tlet existingPendingDeployments: {name: string; transaction: PendingDeployment<TAbi>}[];\n\t\ttry {\n\t\t\texistingPendingDeployments = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t} catch {\n\t\t\texistingPendingDeployments = [];\n\t\t}\n\t\tif (existingPendingDeployments.length > 0) {\n\t\t\twhile (existingPendingDeployments.length > 0) {\n\t\t\t\tconst pendingTransaction = existingPendingDeployments.shift();\n\t\t\t\tif (pendingTransaction) {\n\t\t\t\t\tconst spinner = spin(\n\t\t\t\t\t\t`recovering ${pendingTransaction.name} with transaction ${pendingTransaction.transaction.txHash}`\n\t\t\t\t\t);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait waitForTransactionAndSave(pendingTransaction.name, pendingTransaction.transaction);\n\t\t\t\t\t\tconsole.log(`transaction ${pendingTransaction.transaction.txHash} complete`);\n\t\t\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingDeployments, 2));\n\t\t\t\t\t\tspinner.succeed();\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tspinner.fail();\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tfs.rmSync(filepath);\n\t\t}\n\t}\n\n\tasync function saveTransaction<TAbi extends Abi = Abi>(name: string, transaction: PendingDeployment<TAbi>) {\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst folderPath = ensureDeploymentFolder();\n\t\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\t\tlet existingPendingDeployments: {name: string; transaction: PendingDeployment<TAbi>}[];\n\t\t\ttry {\n\t\t\t\texistingPendingDeployments = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendingDeployments = [];\n\t\t\t}\n\t\t\texistingPendingDeployments.push({name, transaction});\n\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingDeployments, 2));\n\t\t}\n\t\treturn deployments;\n\t}\n\n\tasync function deleteTransaction<TAbi extends Abi = Abi>(hash: string) {\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst filepath = path.join(config.deployments, context.network.name, '.pending_transactions.json');\n\t\t\tlet existingPendingDeployments: {name: string; transaction: PendingDeployment<TAbi>}[];\n\t\t\ttry {\n\t\t\t\texistingPendingDeployments = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendingDeployments = [];\n\t\t\t}\n\t\t\texistingPendingDeployments = existingPendingDeployments.filter((v) => v.transaction.txHash !== hash);\n\t\t\tif (existingPendingDeployments.length === 0) {\n\t\t\t\tfs.rmSync(filepath);\n\t\t\t} else {\n\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingDeployments, 2));\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function exportDeploymentsAsTypes() {\n\t\tconst folderPath = './generated';\n\t\tfs.mkdirSync(folderPath, {recursive: true});\n\t\tfs.writeFileSync(`${folderPath}/deployments.ts`, `export default ${JSONToString(deployments, 2)} as const;`);\n\t}\n\n\tasync function waitForTransactionAndSave<TAbi extends Abi = Abi>(\n\t\tname: string,\n\t\tpendingDeployment: PendingDeployment<TAbi>,\n\t\ttransaction?: EIP1193Transaction | null\n\t): Promise<Deployment<TAbi>> {\n\t\tconst spinner = spin(`tx ${pendingDeployment.txHash}${transaction ? ` ${displayTransaction(transaction)}` : ''}`);\n\t\tlet receipt: TransactionReceipt;\n\t\ttry {\n\t\t\treceipt = await viemClient.waitForTransactionReceipt({\n\t\t\t\thash: pendingDeployment.txHash,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tspinner.fail();\n\t\t\tthrow e;\n\t\t}\n\t\tif (!receipt) {\n\t\t\tspinner.fail(`receipt for ${pendingDeployment.txHash} not found`);\n\t\t} else {\n\t\t\tspinner.succeed();\n\t\t}\n\n\t\tif (!receipt.contractAddress) {\n\t\t\tthrow new Error(`failed to deploy contract ${name}`);\n\t\t}\n\t\tconst {abi, ...artifactObjectWithoutABI} = pendingDeployment.partialDeployment;\n\n\t\tif (!artifactObjectWithoutABI.nonce) {\n\t\t\tconst spinner = spin(); // 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.txHash],\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\tif (!transaction) {\n\t\t\t\tspinner.fail(`tx ${pendingDeployment.txHash} not found`);\n\t\t\t} else {\n\t\t\t\tspinner.stop();\n\t\t\t}\n\n\t\t\tif (transaction) {\n\t\t\t\tartifactObjectWithoutABI.nonce = transaction.nonce;\n\t\t\t\tartifactObjectWithoutABI.txOrigin = transaction.from;\n\t\t\t}\n\t\t}\n\n\t\t// TODO options\n\t\tfor (const key of Object.keys(artifactObjectWithoutABI)) {\n\t\t\tif (key.startsWith('_')) {\n\t\t\t\tdelete (artifactObjectWithoutABI as any)[key];\n\t\t\t}\n\t\t\tif (key === 'evm') {\n\t\t\t\tconst {gasEstimates} = artifactObjectWithoutABI.evm;\n\t\t\t\tartifactObjectWithoutABI.evm = {\n\t\t\t\t\tgasEstimates,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst deployment = {\n\t\t\taddress: receipt.contractAddress,\n\t\t\ttxHash: pendingDeployment.txHash,\n\t\t\tabi,\n\t\t\t...artifactObjectWithoutABI,\n\t\t};\n\t\treturn save(name, deployment);\n\t}\n\n\tasync function saveWhilePending<TAbi extends Abi = Abi>(name: string, pendingDeployment: PendingDeployment<TAbi>) {\n\t\tawait saveTransaction<TAbi>(name, pendingDeployment);\n\t\tlet transaction: EIP1193Transaction | null = null;\n\t\tconst spinner = spin(); // 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.txHash],\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tspinner.fail();\n\t\t\tthrow e;\n\t\t}\n\t\tif (!transaction) {\n\t\t\tspinner.fail(`tx ${pendingDeployment.txHash} not found`);\n\t\t} else {\n\t\t\tspinner.stop();\n\t\t}\n\n\t\tconst deployment = waitForTransactionAndSave<TAbi>(\n\t\t\tname,\n\t\t\ttransaction\n\t\t\t\t? {\n\t\t\t\t\t\t...pendingDeployment,\n\t\t\t\t\t\tnonce: transaction.nonce,\n\t\t\t\t\t\ttxOrigin: transaction.from,\n\t\t\t\t }\n\t\t\t\t: pendingDeployment,\n\t\t\ttransaction\n\t\t);\n\t\tawait deleteTransaction(pendingDeployment.txHash);\n\t\treturn deployment;\n\t}\n\n\tlet env: Environment<Artifacts, NamedAccounts, Deployments> = {\n\t\t...perliminaryEnvironment,\n\t\tsave,\n\t\tsaveWhilePending,\n\t\tget,\n\t};\n\tfor (const extension of (globalThis as any).extensions) {\n\t\tenv = extension(env);\n\t}\n\n\treturn {\n\t\texternal: env,\n\t\tinternal: {\n\t\t\texportDeploymentsAsTypes,\n\t\t\trecoverTransactionsIfAny,\n\t\t},\n\t};\n}\n","// TODO share with db-utils\nexport function bnReplacer(k: string, v: any): any {\n\tif (typeof v === 'bigint') {\n\t\treturn v.toString() + 'n';\n\t}\n\treturn v;\n}\n\nexport function bnReviver(k: string, v: any): any {\n\tif (\n\t\ttypeof v === 'string' &&\n\t\t(v.startsWith('-') ? !isNaN(parseInt(v.charAt(1))) : !isNaN(parseInt(v.charAt(0)))) &&\n\t\tv.charAt(v.length - 1) === 'n'\n\t) {\n\t\treturn BigInt(v.slice(0, -1));\n\t}\n\treturn v;\n}\n\nexport function JSONToString<T = unknown>(json: unknown, space?: string | number) {\n\treturn JSON.stringify(json, bnReplacer, space);\n}\n\nexport function stringToJSON<T = unknown>(str: string): T {\n\treturn JSON.parse(str, bnReviver);\n}\n","import path from 'node:path';\nimport fs from 'node:fs';\nimport {traverse} from '../utils/fs';\nimport {UnknownDeployments} from './types';\n\nexport function loadDeployments(\n\tdeploymentsPath: string,\n\tsubPath: string,\n\tonlyABIAndAddress?: boolean,\n\texpectedChainId?: string\n): {deployments: UnknownDeployments; chainId?: string} {\n\tconst deploymentsFound: UnknownDeployments = {};\n\tconst deployPath = path.join(deploymentsPath, subPath);\n\n\tlet filesStats;\n\ttry {\n\t\tfilesStats = traverse(deployPath, undefined, undefined, (name) => !name.startsWith('.') && name !== 'solcInputs');\n\t} catch (e) {\n\t\t// console.log('no folder at ' + deployPath);\n\t\treturn {deployments: {}};\n\t}\n\tlet chainId: string;\n\tif (filesStats.length > 0) {\n\t\tconst chainIdFilepath = path.join(deployPath, '.chainId');\n\t\tif (fs.existsSync(chainIdFilepath)) {\n\t\t\tchainId = fs.readFileSync(chainIdFilepath).toString().trim();\n\t\t} else {\n\t\t\tthrow new Error(`A .chainId' file is expected to be present in the deployment folder for network ${subPath}`);\n\t\t}\n\n\t\tif (expectedChainId) {\n\t\t\tif (expectedChainId !== chainId) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Loading deployment in folder '${deployPath}' (with chainId: ${chainId}) for a different chainId (${expectedChainId})`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} else {\n\t\treturn {deployments: {}};\n\t}\n\tlet fileNames = filesStats.map((a) => a.relativePath);\n\tfileNames = fileNames.sort((a, b) => {\n\t\tif (a < b) {\n\t\t\treturn -1;\n\t\t}\n\t\tif (a > b) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t});\n\n\tfor (const fileName of fileNames) {\n\t\tif (fileName.substring(fileName.length - 5) === '.json') {\n\t\t\tconst deploymentFileName = path.join(deployPath, fileName);\n\t\t\tlet deployment = JSON.parse(fs.readFileSync(deploymentFileName).toString());\n\t\t\t// truffleChainId argument:\n\t\t\t// if (!deployment.address && deployment.networks) {\n\t\t\t// \tif (truffleChainId && deployment.networks[truffleChainId]) {\n\t\t\t// \t\t// TRUFFLE support\n\t\t\t// \t\tconst truffleDeployment = deployment as any; // TruffleDeployment;\n\t\t\t// \t\tdeployment.address = truffleDeployment.networks[truffleChainId].address;\n\t\t\t// \t\tdeployment.transactionHash = truffleDeployment.networks[truffleChainId].transactionHash;\n\t\t\t// \t}\n\t\t\t// }\n\t\t\tif (onlyABIAndAddress) {\n\t\t\t\tdeployment = {\n\t\t\t\t\taddress: deployment.address,\n\t\t\t\t\tabi: deployment.abi,\n\t\t\t\t\tlinkedData: deployment.linkedData,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst name = fileName.slice(0, fileName.length - 5);\n\t\t\t// console.log('fetching ' + deploymentFileName + ' for ' + name);\n\n\t\t\tdeploymentsFound[name] = deployment;\n\t\t}\n\t}\n\treturn {deployments: deploymentsFound, chainId};\n}\n","import {logs} from 'named-logs';\n\nimport {hookup, logs as Logging} from 'named-logs-console';\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\ntype PartialOra = {\n\tstart(msg?: string): PartialOra;\n\tstop(): PartialOra;\n\tsucceed(msg?: string): PartialOra;\n\tfail(msg?: string): PartialOra;\n};\nconst voidSpinner: PartialOra = {\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\tconsole.log(msg);\n\t\treturn this;\n\t},\n\tfail(msg?: string) {\n\t\tconsole.error(msg);\n\t\treturn this;\n\t},\n};\n// export function spin(message: string): PartialOra {\n// \treturn Logging.level > 0 ? ora(message).start() : voidSpinner;\n// }\n\n// let lastSpin = ora('rocketh');\nlet lastSpin = voidSpinner;\nexport function spin(message?: string): PartialOra {\n\tif (Logging.level > 0) {\n\t\tlastSpin = lastSpin.start(message);\n\t\treturn lastSpin;\n\t} else {\n\t\treturn voidSpinner;\n\t}\n}\n"],"mappings":"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","names":["path","fs","fs","path","path","fs","path","fs","accounts","path","fs","spinner","transaction","fs","path"]}
package/dist/cli.cjs CHANGED
@@ -153,7 +153,6 @@ function loadDeployments(deploymentsPath, subPath, onlyABIAndAddress, expectedCh
153
153
  // src/internal/logging.ts
154
154
  var import_named_logs = require("named-logs");
155
155
  var import_named_logs_console = require("named-logs-console");
156
- var import_ora_cjs = __toESM(require("ora-cjs"), 1);
157
156
  (0, import_named_logs_console.hookup)();
158
157
  function setLogLevel(level) {
159
158
  import_named_logs_console.logs.level = level;
@@ -165,17 +164,25 @@ function setLogLevel(level) {
165
164
  }
166
165
  var logger = (0, import_named_logs.logs)("rocketh");
167
166
  var voidSpinner = {
167
+ start(msg) {
168
+ if (msg) {
169
+ console.log(msg);
170
+ }
171
+ return this;
172
+ },
168
173
  stop() {
169
174
  return this;
170
175
  },
171
176
  succeed(msg) {
177
+ console.log(msg);
172
178
  return this;
173
179
  },
174
180
  fail(msg) {
181
+ console.error(msg);
175
182
  return this;
176
183
  }
177
184
  };
178
- var lastSpin = (0, import_ora_cjs.default)("rocketh");
185
+ var lastSpin = voidSpinner;
179
186
  function spin(message) {
180
187
  if (import_named_logs_console.logs.level > 0) {
181
188
  lastSpin = lastSpin.start(message);
@@ -436,7 +443,7 @@ async function createEnvironment(config2, providedContext) {
436
443
  }
437
444
  const { abi, ...artifactObjectWithoutABI } = pendingDeployment.partialDeployment;
438
445
  if (!artifactObjectWithoutABI.nonce) {
439
- const spinner2 = spin(`fetching nonce for ${pendingDeployment.txHash}`);
446
+ const spinner2 = spin();
440
447
  let transaction2 = null;
441
448
  try {
442
449
  transaction2 = await provider.request({
@@ -479,7 +486,7 @@ async function createEnvironment(config2, providedContext) {
479
486
  async function saveWhilePending(name, pendingDeployment) {
480
487
  await saveTransaction(name, pendingDeployment);
481
488
  let transaction = null;
482
- const spinner = spin(`fetching tx from peers ${pendingDeployment.txHash}`);
489
+ const spinner = spin();
483
490
  try {
484
491
  transaction = await provider.request({
485
492
  method: "eth_getTransactionByHash",
@@ -743,7 +750,7 @@ var import_commander = require("commander");
743
750
  // package.json
744
751
  var package_default = {
745
752
  name: "rocketh",
746
- version: "0.5.7",
753
+ version: "0.5.8",
747
754
  description: "deploy smart contract on ethereum-compatible networks",
748
755
  publishConfig: {
749
756
  access: "public"
@@ -775,7 +782,6 @@ var package_default = {
775
782
  ldenv: "^0.3.5",
776
783
  "named-logs": "^0.2.2",
777
784
  "named-logs-console": "^0.2.3",
778
- "ora-cjs": "^0.0.2",
779
785
  viem: "^0.3.50"
780
786
  },
781
787
  scripts: {
package/dist/cli.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.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","../package.json"],"sourcesContent":["#! /usr/bin/env node\nimport {loadEnv} from 'ldenv';\nimport {loadAndExecuteDeployments, readConfig} from '.';\nimport {Command} from 'commander';\nimport pkg from '../package.json';\n\nloadEnv();\n\nconst commandName = pkg.name;\nconst program = new Command();\nprogram\n\t.name(commandName)\n\t.version(pkg.version)\n\t.usage(`${commandName}`)\n\t.description('execute deploy scripts and store the deployments')\n\t.option('-s, --scripts <value>', 'path the folder containing the deploy scripts to execute')\n\t.option('-t, --tags <value>', 'comma separated list of tags to execute')\n\t.option('-d, --deployments <value>', 'folder where deployments are saved')\n\t.requiredOption('-n, --network <value>', 'network context to use')\n\t.parse(process.argv);\n\nconst options = program.opts();\nconst config = readConfig(options as any);\n\nloadAndExecuteDeployments({...config, logLevel: 1});\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';\n\nrequire('esbuild-register/dist/node').register();\n\nexport function execute<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(\n\tcontext: ProvidedContext<Artifacts, NamedAccounts>,\n\tcallback: DeployScriptFunction<Artifacts, ResolvedNamedAccounts<NamedAccounts>, Deployments>,\n\toptions: {tags?: string[]; dependencies?: string[]}\n): DeployScriptModule<Artifacts, NamedAccounts, Deployments> {\n\tconst scriptModule = (env: Environment<Artifacts, ResolvedNamedAccounts<NamedAccounts>, Deployments>) =>\n\t\tcallback(env);\n\tscriptModule.providedContext = context;\n\tscriptModule.tags = options.tags;\n\tscriptModule.dependencies = options.dependencies;\n\t// TODO id + skip\n\treturn scriptModule as unknown as DeployScriptModule<Artifacts, NamedAccounts, Deployments>;\n}\n\nexport type ConfigOptions = {network: string; deployments?: string; scripts?: string; tags?: string};\n\nexport function readConfig(options: ConfigOptions, extra?: {ignoreMissingRPC?: boolean}): Config {\n\ttype Networks = {[name: string]: {rpcUrl: string}};\n\ttype ConfigFile = {networks: Networks};\n\tlet configFile: ConfigFile | undefined;\n\ttry {\n\t\tconst configString = fs.readFileSync('./rocketh.json', 'utf-8');\n\t\tconfigFile = JSON.parse(configString);\n\t} catch {}\n\n\tlet nodeUrl: string;\n\tconst fromEnv = process.env['ETH_NODE_URI_' + options.network];\n\tif (typeof fromEnv === 'string') {\n\t\tnodeUrl = fromEnv;\n\t} else {\n\t\tif (configFile) {\n\t\t\tconst network = configFile.networks && configFile.networks[options.network];\n\t\t\tif (network) {\n\t\t\t\tnodeUrl = network.rpcUrl;\n\t\t\t} else {\n\t\t\t\tif (extra?.ignoreMissingRPC) {\n\t\t\t\t\tnodeUrl = '';\n\t\t\t\t} else {\n\t\t\t\t\tif (options.network === 'localhost') {\n\t\t\t\t\t\tnodeUrl = 'http://127.0.0.1:8545';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.error(`network \"${options.network}\" is not configured. Please add it to the rocketh.json file`);\n\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (extra?.ignoreMissingRPC) {\n\t\t\t\tnodeUrl = '';\n\t\t\t} else {\n\t\t\t\tif (options.network === 'localhost') {\n\t\t\t\t\tnodeUrl = 'http://127.0.0.1:8545';\n\t\t\t\t} else {\n\t\t\t\t\tlogger.error(`network \"${options.network}\" is not configured. Please add it to the rocketh.json file`);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tnodeUrl,\n\t\tnetworkName: options.network,\n\t\tdeployments: options.deployments,\n\t\tscripts: options.scripts,\n\t\ttags: typeof options.tags === 'undefined' ? undefined : options.tags.split(','),\n\t};\n}\n\nexport function readAndResolveConfig(options: ConfigOptions, extra?: {ignoreMissingRPC?: boolean}): ResolvedConfig {\n\treturn resolveConfig(readConfig(options, extra));\n}\n\nexport function resolveConfig(config: Config): ResolvedConfig {\n\tconst resolvedConfig: ResolvedConfig = {\n\t\t...config,\n\t\tnetworkName: config.networkName || 'memory',\n\t\tdeployments: config.deployments || 'deployments',\n\t\tscripts: config.scripts || 'deploy',\n\t\ttags: config.tags || [],\n\t};\n\treturn resolvedConfig;\n}\n\nexport async function loadAndExecuteDeployments<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(config: Config) {\n\tconst resolvedConfig = resolveConfig(config);\n\n\treturn executeDeployScripts<Artifacts, NamedAccounts, Deployments>(resolvedConfig);\n\n\t// TODO\n\t// await this.export(options);\n}\n\nexport async function executeDeployScripts<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(config: ResolvedConfig): Promise<Deployments> {\n\tsetLogLevel(typeof config.logLevel === 'undefined' ? 0 : config.logLevel);\n\n\tlet filepaths;\n\tfilepaths = traverseMultipleDirectory([config.scripts]);\n\tfilepaths = filepaths\n\t\t.filter((v) => !path.basename(v).startsWith('_'))\n\t\t.sort((a: string, b: string) => {\n\t\t\tif (a < b) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (a > b) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\treturn 0;\n\t\t});\n\n\tlet providedContext: ProvidedContext<Artifacts, NamedAccounts> | undefined;\n\n\tconst scriptModuleByFilePath: {[filename: string]: DeployScriptModule} = {};\n\tconst scriptPathBags: {[tag: string]: string[]} = {};\n\tconst scriptFilePaths: string[] = [];\n\n\tfor (const filepath of filepaths) {\n\t\tconst scriptFilePath = path.resolve(filepath);\n\t\tlet scriptModule: DeployScriptModule;\n\t\ttry {\n\t\t\tif (require.cache) {\n\t\t\t\tdelete require.cache[scriptFilePath]; // ensure we reload it every time, so changes are taken in consideration\n\t\t\t}\n\t\t\tscriptModule = require(scriptFilePath);\n\n\t\t\tif ((scriptModule as any).default) {\n\t\t\t\tscriptModule = (scriptModule as any).default as DeployScriptModule;\n\t\t\t\tif ((scriptModule as any).default) {\n\t\t\t\t\tlogger.warn(`double default...`);\n\t\t\t\t\tscriptModule = (scriptModule as any).default as DeployScriptModule;\n\t\t\t\t}\n\t\t\t}\n\t\t\tscriptModuleByFilePath[scriptFilePath] = scriptModule;\n\t\t\tif (providedContext && providedContext !== scriptModule.providedContext) {\n\t\t\t\tthrow new Error(`context between 2 scripts is different, please share the same across them`);\n\t\t\t}\n\t\t\tprovidedContext = scriptModule.providedContext as ProvidedContext<Artifacts, NamedAccounts>;\n\t\t} catch (e) {\n\t\t\tlogger.error(`could not import ${filepath}`);\n\t\t\tthrow e;\n\t\t}\n\n\t\tlet scriptTags = scriptModule.tags;\n\t\tif (scriptTags !== undefined) {\n\t\t\tif (typeof scriptTags === 'string') {\n\t\t\t\tscriptTags = [scriptTags];\n\t\t\t}\n\t\t\tfor (const tag of scriptTags) {\n\t\t\t\tif (tag.indexOf(',') >= 0) {\n\t\t\t\t\tthrow new Error('Tag cannot contains commas');\n\t\t\t\t}\n\t\t\t\tconst bag = scriptPathBags[tag] || [];\n\t\t\t\tscriptPathBags[tag] = bag;\n\t\t\t\tbag.push(scriptFilePath);\n\t\t\t}\n\t\t}\n\n\t\tif (config.tags !== undefined && config.tags.length > 0) {\n\t\t\tlet found = false;\n\t\t\tif (scriptTags !== undefined) {\n\t\t\t\tfor (const tagToFind of config.tags) {\n\t\t\t\t\tfor (const tag of scriptTags) {\n\t\t\t\t\t\tif (tag === tagToFind) {\n\t\t\t\t\t\t\tscriptFilePaths.push(scriptFilePath);\n\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (found) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tscriptFilePaths.push(scriptFilePath);\n\t\t}\n\t}\n\n\tif (!providedContext) {\n\t\tthrow new Error(`no context loaded`);\n\t}\n\n\tconst {internal, external} = await createEnvironment(config, providedContext);\n\n\tawait internal.recoverTransactionsIfAny();\n\n\tconst scriptsRegisteredToRun: {[filename: string]: boolean} = {};\n\tconst scriptsToRun: Array<{\n\t\tfunc: DeployScriptModule;\n\t\tfilePath: string;\n\t}> = [];\n\tconst scriptsToRunAtTheEnd: Array<{\n\t\tfunc: DeployScriptModule;\n\t\tfilePath: string;\n\t}> = [];\n\tfunction recurseDependencies(scriptFilePath: string) {\n\t\tif (scriptsRegisteredToRun[scriptFilePath]) {\n\t\t\treturn;\n\t\t}\n\t\tconst scriptModule = scriptModuleByFilePath[scriptFilePath];\n\t\tif (scriptModule.dependencies) {\n\t\t\tfor (const dependency of scriptModule.dependencies) {\n\t\t\t\tconst scriptFilePathsToAdd = scriptPathBags[dependency];\n\t\t\t\tif (scriptFilePathsToAdd) {\n\t\t\t\t\tfor (const scriptFilenameToAdd of scriptFilePathsToAdd) {\n\t\t\t\t\t\trecurseDependencies(scriptFilenameToAdd);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!scriptsRegisteredToRun[scriptFilePath]) {\n\t\t\tif (scriptModule.runAtTheEnd) {\n\t\t\t\tscriptsToRunAtTheEnd.push({\n\t\t\t\t\tfilePath: scriptFilePath,\n\t\t\t\t\tfunc: scriptModule,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tscriptsToRun.push({\n\t\t\t\t\tfilePath: scriptFilePath,\n\t\t\t\t\tfunc: scriptModule,\n\t\t\t\t});\n\t\t\t}\n\t\t\tscriptsRegisteredToRun[scriptFilePath] = true;\n\t\t}\n\t}\n\tfor (const scriptFilePath of scriptFilePaths) {\n\t\trecurseDependencies(scriptFilePath);\n\t}\n\n\tfor (const deployScript of scriptsToRun.concat(scriptsToRunAtTheEnd)) {\n\t\tconst filename = path.basename(deployScript.filePath);\n\t\tconst relativeFilepath = path.relative('.', deployScript.filePath);\n\t\t// if (deployScript.func.id && this.db.migrations[deployScript.func.id]) {\n\t\t// \tlogger.info(`skipping ${filename} as migrations already executed and complete`);\n\t\t// \tcontinue;\n\t\t// }\n\t\tlet skip = false;\n\t\tif (deployScript.func.skip) {\n\t\t\tconst spinner = spin(`Executing skipping function from ${filename}`);\n\t\t\ttry {\n\t\t\t\tskip = await deployScript.func.skip(external);\n\t\t\t\tspinner.succeed(skip ? `skipping ${filename}` : undefined);\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\t\tif (!skip) {\n\t\t\tlet result;\n\t\t\tconst spinner = spin(`Executing ${filename}`);\n\t\t\ttry {\n\t\t\t\tresult = await deployScript.func(external);\n\t\t\t\tspinner.succeed(`${filename} execution complete`);\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\tif (result && typeof result === 'boolean') {\n\t\t\t\t// if (!deployScript.func.id) {\n\t\t\t\t// \tthrow new Error(\n\t\t\t\t// \t\t`${deployScript.filePath} return true to not be executed again, but does not provide an id. the script function needs to have the field \"id\" to be set`\n\t\t\t\t// \t);\n\t\t\t\t// }\n\t\t\t\t// this.db.migrations[deployScript.func.id] = Math.floor(Date.now() / 1000);\n\n\t\t\t\tconst deploymentFolderPath = config.deployments;\n\n\t\t\t\t// TODO refactor to extract this whole path and folder existence stuff\n\t\t\t\t// const toSave = this.db.writeDeploymentsToFiles && this.network.saveDeployments;\n\t\t\t\t// if (toSave) {\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tfs.mkdirSync(this.deploymentsPath);\n\t\t\t\t// \t} catch (e) {}\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tfs.mkdirSync(path.join(this.deploymentsPath, deploymentFolderPath));\n\t\t\t\t// \t} catch (e) {}\n\t\t\t\t// \tfs.writeFileSync(\n\t\t\t\t// \t\tpath.join(this.deploymentsPath, deploymentFolderPath, '.migrations.json'),\n\t\t\t\t// \t\tJSON.stringify(this.db.migrations, null, ' ')\n\t\t\t\t// \t);\n\t\t\t\t// }\n\t\t\t}\n\t\t}\n\t}\n\n\treturn external.deployments as Deployments;\n}\n","import fs from 'node:fs';\n\nimport {Transaction, TransactionReceipt, createPublicClient, custom} from 'viem';\nimport {\n\tAccountType,\n\tDeployment,\n\tEnvironment,\n\tNamedSigner,\n\tPendingDeployment,\n\tResolvedAccount,\n\tResolvedConfig,\n\tResolvedNamedAccounts,\n\tResolvedNamedSigners,\n\tUnknownArtifacts,\n\tUnknownDeployments,\n\tUnresolvedUnknownNamedAccounts,\n} from './types';\nimport {JSONRPCHTTPProvider} from 'eip-1193-json-provider';\nimport {Abi} from 'abitype';\nimport {InternalEnvironment} from '../internal/types';\nimport path from 'node:path';\nimport {JSONToString, stringToJSON} from '../utils/json';\nimport {loadDeployments} from './deployments';\nimport {EIP1193Account, EIP1193ProviderWithoutEvents, EIP1193Transaction} from 'eip-1193';\nimport {ProvidedContext} from '../executor/types';\nimport {spin} from '../internal/logging';\n\nexport type EnvironmentExtenstion = (env: Environment) => Environment;\n//we store this globally so this is not lost\n(globalThis as any).extensions = [];\nexport function extendEnvironment(extension: EnvironmentExtenstion): void {\n\t(globalThis as any).extensions.push(extension);\n}\n\nexport type SignerProtocolFunction = (protocolString: string) => Promise<NamedSigner>;\nexport type SignerProtocol = {\n\tgetSigner: SignerProtocolFunction;\n};\n\n//we store this globally so this is not lost\n(globalThis as any).signerProtocols = {};\nexport function handleSignerProtocol(protocol: string, getSigner: SignerProtocolFunction): void {\n\t(globalThis as any).signerProtocols[protocol] = {\n\t\tgetSigner,\n\t};\n}\n\nfunction displayTransaction(transaction: EIP1193Transaction) {\n\tif (transaction.type === '0x2') {\n\t\treturn `(maxFeePerGas: ${BigInt(transaction.maxFeePerGas).toString()}, maxPriorityFeePerGas: ${BigInt(\n\t\t\ttransaction.maxPriorityFeePerGas\n\t\t).toString()})`;\n\t} else {\n\t\treturn `(gasPrice: ${BigInt(transaction.gasPrice).toString()})`;\n\t}\n}\n\nexport async function createEnvironment<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(\n\tconfig: ResolvedConfig,\n\tprovidedContext: ProvidedContext<Artifacts, NamedAccounts>\n): Promise<{internal: InternalEnvironment; external: Environment}> {\n\tconst provider =\n\t\t'provider' in config ? config.provider : (new JSONRPCHTTPProvider(config.nodeUrl) as EIP1193ProviderWithoutEvents);\n\n\tconst transport = custom(provider);\n\tconst viemClient = createPublicClient({transport});\n\n\tconst chainId = (await viemClient.getChainId()).toString();\n\n\tlet networkName: string;\n\tlet saveDeployments: boolean;\n\tlet tags: {[tag: string]: boolean} = {};\n\tif ('nodeUrl' in config) {\n\t\tnetworkName = config.networkName;\n\t\tsaveDeployments = true;\n\t} else {\n\t\tif (config.networkName) {\n\t\t\tnetworkName = config.networkName;\n\t\t} else {\n\t\t\tnetworkName = 'memory';\n\t\t}\n\t\tif (networkName === 'memory' || networkName === 'hardhat') {\n\t\t\ttags['memory'] = true;\n\t\t\tsaveDeployments = false;\n\t\t} else {\n\t\t\tsaveDeployments = true;\n\t\t}\n\t}\n\n\tconst resolvedAccounts: {[name: string]: ResolvedAccount} = {};\n\n\tconst accountCache: {[name: string]: ResolvedAccount} = {};\n\tasync function getAccount(\n\t\tname: string,\n\t\taccounts: UnresolvedUnknownNamedAccounts,\n\t\taccountDef: AccountType\n\t): Promise<ResolvedAccount | undefined> {\n\t\tif (accountCache[name]) {\n\t\t\treturn accountCache[name];\n\t\t}\n\t\tlet account: ResolvedAccount | undefined;\n\t\tif (typeof accountDef === 'number') {\n\t\t\tconst accounts = await provider.request({method: 'eth_accounts'});\n\t\t\tconst accountPerIndex = accounts[accountDef];\n\t\t\tif (accountPerIndex) {\n\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\ttype: 'remote',\n\t\t\t\t\taddress: accountPerIndex,\n\t\t\t\t\tsigner: provider,\n\t\t\t\t};\n\t\t\t}\n\t\t} else if (typeof accountDef === 'string') {\n\t\t\tif (accountDef.startsWith('0x')) {\n\t\t\t\tif (accountDef.length === 66) {\n\t\t\t\t\tconst privateKeyProtocol: SignerProtocol = (globalThis as any).signerProtocols['privateKey'];\n\t\t\t\t\tif (privateKeyProtocol) {\n\t\t\t\t\t\tconst namedSigner = await privateKeyProtocol.getSigner(`privateKey:${accountDef}`);\n\t\t\t\t\t\tconst [address] = await namedSigner.signer.request({method: 'eth_accounts'});\n\t\t\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\t\t\t...namedSigner,\n\t\t\t\t\t\t\taddress,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\t\ttype: 'remote',\n\t\t\t\t\t\taddress: accountDef as `0x${string}`,\n\t\t\t\t\t\tsigner: provider,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (accountDef.indexOf(':') > 0) {\n\t\t\t\t\tconst [protocolID, extra] = accountDef.split(':');\n\t\t\t\t\tconst protocol: SignerProtocol = (globalThis as any).signerProtocols[protocolID];\n\t\t\t\t\tif (!protocol) {\n\t\t\t\t\t\tthrow new Error(`protocol: ${protocol} is not supported`);\n\t\t\t\t\t}\n\t\t\t\t\tconst namedSigner = await protocol.getSigner(accountDef);\n\t\t\t\t\tconst [address] = await namedSigner.signer.request({method: 'eth_accounts'});\n\t\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\t\t...namedSigner,\n\t\t\t\t\t\taddress,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tconst accountFetched = await getAccount(name, accounts, accounts[accountDef]);\n\t\t\t\t\tif (accountFetched) {\n\t\t\t\t\t\taccountCache[name] = account = accountFetched;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst accountForNetwork = accountDef[networkName] || accountDef[chainId] || accountDef['default'];\n\t\t\tif (typeof accountForNetwork !== undefined) {\n\t\t\t\tconst accountFetched = await getAccount(name, accounts, accountForNetwork);\n\t\t\t\tif (accountFetched) {\n\t\t\t\t\taccountCache[name] = account = accountFetched;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn account;\n\t}\n\n\tif (providedContext.accounts) {\n\t\tconst accountNames = Object.keys(providedContext.accounts);\n\t\tfor (const accountName of accountNames) {\n\t\t\tlet account = await getAccount(accountName, providedContext.accounts, providedContext.accounts[accountName]);\n\t\t\t(resolvedAccounts as any)[accountName] = account;\n\t\t}\n\t}\n\n\tconst context = {\n\t\taccounts: resolvedAccounts,\n\t\tartifacts: providedContext.artifacts as Artifacts,\n\t\tnetwork: {\n\t\t\tname: networkName,\n\t\t\tsaveDeployments,\n\t\t\ttags,\n\t\t},\n\t};\n\n\tconst {deployments} = loadDeployments(config.deployments, context.network.name, false, chainId);\n\n\tconst namedAccounts: {[name: string]: EIP1193Account} = {};\n\tconst namedSigners: {[name: string]: NamedSigner} = {};\n\tconst addressSigners: {[name: `0x${string}`]: NamedSigner} = {};\n\n\tfor (const entry of Object.entries(resolvedAccounts)) {\n\t\tconst name = entry[0];\n\t\tconst {address, ...namedSigner} = entry[1];\n\t\tnamedAccounts[name] = address;\n\t\taddressSigners[address] = namedSigner;\n\t\tnamedSigners[name] = namedSigner;\n\t}\n\n\tconst perliminaryEnvironment = {\n\t\tconfig,\n\t\tdeployments: deployments as Deployments,\n\t\taccounts: namedAccounts as ResolvedNamedAccounts<NamedAccounts>,\n\t\tsigners: namedSigners as ResolvedNamedSigners<ResolvedNamedAccounts<NamedAccounts>>,\n\t\taddressSigners: addressSigners,\n\t\tartifacts: context.artifacts,\n\t\tnetwork: {\n\t\t\tchainId,\n\t\t\tname: context.network.name,\n\t\t\ttags: context.network.tags,\n\t\t\tprovider,\n\t\t},\n\t};\n\n\tfunction ensureDeploymentFolder(): string {\n\t\tconst folderPath = path.join(config.deployments, context.network.name);\n\t\tfs.mkdirSync(folderPath, {recursive: true});\n\t\tconst chainIdFilepath = path.join(folderPath, '.chainId');\n\t\tif (!fs.existsSync(chainIdFilepath)) {\n\t\t\tfs.writeFileSync(chainIdFilepath, chainId);\n\t\t}\n\t\treturn folderPath;\n\t}\n\n\t// const signer = {\n\t// \tasync sendTransaction(\n\t// \t\tprovider: EIP1193ProviderWithoutEvents,\n\t// \t\taccount: {\n\t// \t\t\taddresss: EIP1193Account;\n\t// \t\t\tconfig: unknown;\n\t// \t\t},\n\t// \t\ttransaction: EIP1193TransactionEIP1193DATA\n\t// \t): Promise<EIP1193DATA> {\n\t// \t\treturn '0x';\n\t// \t},\n\t// };\n\n\t// async function sendTransaction(transaction: EIP1193TransactionEIP1193DATA): Promise<EIP1193DATA> {\n\t// \treturn '0x';\n\t// }\n\n\tfunction get<TAbi extends Abi>(name: string): Deployment<TAbi> | undefined {\n\t\treturn deployments[name] as Deployment<TAbi> | undefined;\n\t}\n\n\tasync function save<TAbi extends Abi>(name: string, deployment: Deployment<TAbi>): Promise<Deployment<TAbi>> {\n\t\tdeployments[name] = deployment;\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst folderPath = ensureDeploymentFolder();\n\t\t\tfs.writeFileSync(`${folderPath}/${name}.json`, JSONToString(deployment, 2));\n\t\t}\n\t\treturn deployment;\n\t}\n\n\tasync function recoverTransactionsIfAny<TAbi extends Abi = Abi>(): Promise<void> {\n\t\tconst filepath = path.join(config.deployments, context.network.name, '.pending_transactions.json');\n\t\tlet existingPendingDeployments: {name: string; transaction: PendingDeployment<TAbi>}[];\n\t\ttry {\n\t\t\texistingPendingDeployments = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t} catch {\n\t\t\texistingPendingDeployments = [];\n\t\t}\n\t\tif (existingPendingDeployments.length > 0) {\n\t\t\twhile (existingPendingDeployments.length > 0) {\n\t\t\t\tconst pendingTransaction = existingPendingDeployments.shift();\n\t\t\t\tif (pendingTransaction) {\n\t\t\t\t\tconst spinner = spin(\n\t\t\t\t\t\t`recovering ${pendingTransaction.name} with transaction ${pendingTransaction.transaction.txHash}`\n\t\t\t\t\t);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait waitForTransactionAndSave(pendingTransaction.name, pendingTransaction.transaction);\n\t\t\t\t\t\tconsole.log(`transaction ${pendingTransaction.transaction.txHash} complete`);\n\t\t\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingDeployments, 2));\n\t\t\t\t\t\tspinner.succeed();\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tspinner.fail();\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tfs.rmSync(filepath);\n\t\t}\n\t}\n\n\tasync function saveTransaction<TAbi extends Abi = Abi>(name: string, transaction: PendingDeployment<TAbi>) {\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst folderPath = ensureDeploymentFolder();\n\t\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\t\tlet existingPendingDeployments: {name: string; transaction: PendingDeployment<TAbi>}[];\n\t\t\ttry {\n\t\t\t\texistingPendingDeployments = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendingDeployments = [];\n\t\t\t}\n\t\t\texistingPendingDeployments.push({name, transaction});\n\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingDeployments, 2));\n\t\t}\n\t\treturn deployments;\n\t}\n\n\tasync function deleteTransaction<TAbi extends Abi = Abi>(hash: string) {\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst filepath = path.join(config.deployments, context.network.name, '.pending_transactions.json');\n\t\t\tlet existingPendingDeployments: {name: string; transaction: PendingDeployment<TAbi>}[];\n\t\t\ttry {\n\t\t\t\texistingPendingDeployments = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendingDeployments = [];\n\t\t\t}\n\t\t\texistingPendingDeployments = existingPendingDeployments.filter((v) => v.transaction.txHash !== hash);\n\t\t\tif (existingPendingDeployments.length === 0) {\n\t\t\t\tfs.rmSync(filepath);\n\t\t\t} else {\n\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingDeployments, 2));\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function exportDeploymentsAsTypes() {\n\t\tconst folderPath = './generated';\n\t\tfs.mkdirSync(folderPath, {recursive: true});\n\t\tfs.writeFileSync(`${folderPath}/deployments.ts`, `export default ${JSONToString(deployments, 2)} as const;`);\n\t}\n\n\tasync function waitForTransactionAndSave<TAbi extends Abi = Abi>(\n\t\tname: string,\n\t\tpendingDeployment: PendingDeployment<TAbi>,\n\t\ttransaction?: EIP1193Transaction | null\n\t): Promise<Deployment<TAbi>> {\n\t\tconst spinner = spin(`tx ${pendingDeployment.txHash}${transaction ? ` ${displayTransaction(transaction)}` : ''}`);\n\t\tlet receipt: TransactionReceipt;\n\t\ttry {\n\t\t\treceipt = await viemClient.waitForTransactionReceipt({\n\t\t\t\thash: pendingDeployment.txHash,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tspinner.fail();\n\t\t\tthrow e;\n\t\t}\n\t\tif (!receipt) {\n\t\t\tspinner.fail(`receipt for ${pendingDeployment.txHash} not found`);\n\t\t} else {\n\t\t\tspinner.succeed();\n\t\t}\n\n\t\tif (!receipt.contractAddress) {\n\t\t\tthrow new Error(`failed to deploy contract ${name}`);\n\t\t}\n\t\tconst {abi, ...artifactObjectWithoutABI} = pendingDeployment.partialDeployment;\n\n\t\tif (!artifactObjectWithoutABI.nonce) {\n\t\t\tconst spinner = spin(`fetching nonce for ${pendingDeployment.txHash}`);\n\t\t\tlet transaction: EIP1193Transaction | null = null;\n\t\t\ttry {\n\t\t\t\ttransaction = await provider.request({\n\t\t\t\t\tmethod: 'eth_getTransactionByHash',\n\t\t\t\t\tparams: [pendingDeployment.txHash],\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\tif (!transaction) {\n\t\t\t\tspinner.fail(`tx ${pendingDeployment.txHash} not found`);\n\t\t\t} else {\n\t\t\t\tspinner.stop();\n\t\t\t}\n\n\t\t\tif (transaction) {\n\t\t\t\tartifactObjectWithoutABI.nonce = transaction.nonce;\n\t\t\t\tartifactObjectWithoutABI.txOrigin = transaction.from;\n\t\t\t}\n\t\t}\n\n\t\t// TODO options\n\t\tfor (const key of Object.keys(artifactObjectWithoutABI)) {\n\t\t\tif (key.startsWith('_')) {\n\t\t\t\tdelete (artifactObjectWithoutABI as any)[key];\n\t\t\t}\n\t\t\tif (key === 'evm') {\n\t\t\t\tconst {gasEstimates} = artifactObjectWithoutABI.evm;\n\t\t\t\tartifactObjectWithoutABI.evm = {\n\t\t\t\t\tgasEstimates,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst deployment = {\n\t\t\taddress: receipt.contractAddress,\n\t\t\ttxHash: pendingDeployment.txHash,\n\t\t\tabi,\n\t\t\t...artifactObjectWithoutABI,\n\t\t};\n\t\treturn save(name, deployment);\n\t}\n\n\tasync function saveWhilePending<TAbi extends Abi = Abi>(name: string, pendingDeployment: PendingDeployment<TAbi>) {\n\t\tawait saveTransaction<TAbi>(name, pendingDeployment);\n\t\tlet transaction: EIP1193Transaction | null = null;\n\t\tconst spinner = spin(`fetching tx from peers ${pendingDeployment.txHash}`);\n\t\ttry {\n\t\t\ttransaction = await provider.request({\n\t\t\t\tmethod: 'eth_getTransactionByHash',\n\t\t\t\tparams: [pendingDeployment.txHash],\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tspinner.fail();\n\t\t\tthrow e;\n\t\t}\n\t\tif (!transaction) {\n\t\t\tspinner.fail(`tx ${pendingDeployment.txHash} not found`);\n\t\t} else {\n\t\t\tspinner.stop();\n\t\t}\n\n\t\tconst deployment = waitForTransactionAndSave<TAbi>(\n\t\t\tname,\n\t\t\ttransaction\n\t\t\t\t? {\n\t\t\t\t\t\t...pendingDeployment,\n\t\t\t\t\t\tnonce: transaction.nonce,\n\t\t\t\t\t\ttxOrigin: transaction.from,\n\t\t\t\t }\n\t\t\t\t: pendingDeployment,\n\t\t\ttransaction\n\t\t);\n\t\tawait deleteTransaction(pendingDeployment.txHash);\n\t\treturn deployment;\n\t}\n\n\tlet env: Environment<Artifacts, NamedAccounts, Deployments> = {\n\t\t...perliminaryEnvironment,\n\t\tsave,\n\t\tsaveWhilePending,\n\t\tget,\n\t};\n\tfor (const extension of (globalThis as any).extensions) {\n\t\tenv = extension(env);\n\t}\n\n\treturn {\n\t\texternal: env,\n\t\tinternal: {\n\t\t\texportDeploymentsAsTypes,\n\t\t\trecoverTransactionsIfAny,\n\t\t},\n\t};\n}\n","// TODO share with db-utils\nexport function bnReplacer(k: string, v: any): any {\n\tif (typeof v === 'bigint') {\n\t\treturn v.toString() + 'n';\n\t}\n\treturn v;\n}\n\nexport function bnReviver(k: string, v: any): any {\n\tif (\n\t\ttypeof v === 'string' &&\n\t\t(v.startsWith('-') ? !isNaN(parseInt(v.charAt(1))) : !isNaN(parseInt(v.charAt(0)))) &&\n\t\tv.charAt(v.length - 1) === 'n'\n\t) {\n\t\treturn BigInt(v.slice(0, -1));\n\t}\n\treturn v;\n}\n\nexport function JSONToString<T = unknown>(json: unknown, space?: string | number) {\n\treturn JSON.stringify(json, bnReplacer, space);\n}\n\nexport function stringToJSON<T = unknown>(str: string): T {\n\treturn JSON.parse(str, bnReviver);\n}\n","import path from 'node:path';\nimport fs from 'node:fs';\nimport {traverse} from '../utils/fs';\nimport {UnknownDeployments} from './types';\n\nexport function loadDeployments(\n\tdeploymentsPath: string,\n\tsubPath: string,\n\tonlyABIAndAddress?: boolean,\n\texpectedChainId?: string\n): {deployments: UnknownDeployments; chainId?: string} {\n\tconst deploymentsFound: UnknownDeployments = {};\n\tconst deployPath = path.join(deploymentsPath, subPath);\n\n\tlet filesStats;\n\ttry {\n\t\tfilesStats = traverse(deployPath, undefined, undefined, (name) => !name.startsWith('.') && name !== 'solcInputs');\n\t} catch (e) {\n\t\t// console.log('no folder at ' + deployPath);\n\t\treturn {deployments: {}};\n\t}\n\tlet chainId: string;\n\tif (filesStats.length > 0) {\n\t\tconst chainIdFilepath = path.join(deployPath, '.chainId');\n\t\tif (fs.existsSync(chainIdFilepath)) {\n\t\t\tchainId = fs.readFileSync(chainIdFilepath).toString().trim();\n\t\t} else {\n\t\t\tthrow new Error(`A .chainId' file is expected to be present in the deployment folder for network ${subPath}`);\n\t\t}\n\n\t\tif (expectedChainId) {\n\t\t\tif (expectedChainId !== chainId) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Loading deployment in folder '${deployPath}' (with chainId: ${chainId}) for a different chainId (${expectedChainId})`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} else {\n\t\treturn {deployments: {}};\n\t}\n\tlet fileNames = filesStats.map((a) => a.relativePath);\n\tfileNames = fileNames.sort((a, b) => {\n\t\tif (a < b) {\n\t\t\treturn -1;\n\t\t}\n\t\tif (a > b) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t});\n\n\tfor (const fileName of fileNames) {\n\t\tif (fileName.substring(fileName.length - 5) === '.json') {\n\t\t\tconst deploymentFileName = path.join(deployPath, fileName);\n\t\t\tlet deployment = JSON.parse(fs.readFileSync(deploymentFileName).toString());\n\t\t\t// truffleChainId argument:\n\t\t\t// if (!deployment.address && deployment.networks) {\n\t\t\t// \tif (truffleChainId && deployment.networks[truffleChainId]) {\n\t\t\t// \t\t// TRUFFLE support\n\t\t\t// \t\tconst truffleDeployment = deployment as any; // TruffleDeployment;\n\t\t\t// \t\tdeployment.address = truffleDeployment.networks[truffleChainId].address;\n\t\t\t// \t\tdeployment.transactionHash = truffleDeployment.networks[truffleChainId].transactionHash;\n\t\t\t// \t}\n\t\t\t// }\n\t\t\tif (onlyABIAndAddress) {\n\t\t\t\tdeployment = {\n\t\t\t\t\taddress: deployment.address,\n\t\t\t\t\tabi: deployment.abi,\n\t\t\t\t\tlinkedData: deployment.linkedData,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst name = fileName.slice(0, fileName.length - 5);\n\t\t\t// console.log('fetching ' + deploymentFileName + ' for ' + name);\n\n\t\t\tdeploymentsFound[name] = deployment;\n\t\t}\n\t}\n\treturn {deployments: deploymentsFound, chainId};\n}\n","import {logs} from 'named-logs';\n\nimport {hookup, logs as Logging} from 'named-logs-console';\nimport ora from 'ora-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\ntype PartialOra = {\n\tstop(): PartialOra;\n\tsucceed(msg?: string): PartialOra;\n\tfail(msg?: string): PartialOra;\n};\nconst voidSpinner: PartialOra = {\n\tstop() {\n\t\treturn this;\n\t},\n\tsucceed(msg?: string) {\n\t\treturn this;\n\t},\n\tfail(msg?: string) {\n\t\treturn this;\n\t},\n};\n// export function spin(message: string): PartialOra {\n// \treturn Logging.level > 0 ? ora(message).start() : voidSpinner;\n// }\n\nlet lastSpin = ora('rocketh');\nexport function spin(message: string): PartialOra {\n\tif (Logging.level > 0) {\n\t\tlastSpin = lastSpin.start(message);\n\t\treturn lastSpin;\n\t} else {\n\t\treturn voidSpinner;\n\t}\n}\n","{\n\t\"name\": \"rocketh\",\n\t\"version\": \"0.5.7\",\n\t\"description\": \"deploy smart contract on ethereum-compatible networks\",\n\t\"publishConfig\": {\n\t\t\"access\": \"public\"\n\t},\n\t\"type\": \"module\",\n\t\"main\": \"dist/index.cjs\",\n\t\"module\": \"dist/index.js\",\n\t\"types\": \"dist/index.d.ts\",\n\t\"bin\": {\n\t\t\"rocketh\": \"dist/cli.cjs\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@types/figlet\": \"^1.5.5\",\n\t\t\"@types/node\": \"^18.15.5\",\n\t\t\"abitype\": \"^0.7.1\",\n\t\t\"eip-1193\": \"^0.4.7\",\n\t\t\"ipfs-gateway-emulator\": \"4.2.1-ipfs.2\",\n\t\t\"rimraf\": \"^4.4.1\",\n\t\t\"tsup\": \"^6.7.0\",\n\t\t\"typedoc\": \"^0.23.28\",\n\t\t\"typescript\": \"^5.0.4\"\n\t},\n\t\"dependencies\": {\n\t\t\"commander\": \"^10.0.0\",\n\t\t\"eip-1193-json-provider\": \"^0.1.5\",\n\t\t\"esbuild\": \"^0.17.12\",\n\t\t\"esbuild-register\": \"^3.4.2\",\n\t\t\"figlet\": \"^1.5.2\",\n\t\t\"ldenv\": \"^0.3.5\",\n\t\t\"named-logs\": \"^0.2.2\",\n\t\t\"named-logs-console\": \"^0.2.3\",\n\t\t\"ora-cjs\": \"^0.0.2\",\n\t\t\"viem\": \"^0.3.50\"\n\t},\n\t\"scripts\": {\n\t\t\"build\": \"rimraf dist && tsup --entry src/index.ts --entry src/cli.ts --dts --format esm,cjs\",\n\t\t\"dev\": \"rimraf dist && tsup --entry src/index.ts --entry src/cli.ts --dts --format esm,cjs --watch\",\n\t\t\"dev-no-reset\": \"tsup --entry src/index.ts --entry src/cli.ts --dts --format esm,cjs --watch\",\n\t\t\"gen-docs\": \"typedoc --out docs src\",\n\t\t\"serve-docs\": \"ipfs-emulator --only -d docs -p 8080\"\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","ora","config","accounts","path","fs","spinner","transaction","options","fs","config","path"]}
1
+ {"version":3,"sources":["../src/cli.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","../package.json"],"sourcesContent":["#! /usr/bin/env node\nimport {loadEnv} from 'ldenv';\nimport {loadAndExecuteDeployments, readConfig} from '.';\nimport {Command} from 'commander';\nimport pkg from '../package.json';\n\nloadEnv();\n\nconst commandName = pkg.name;\nconst program = new Command();\nprogram\n\t.name(commandName)\n\t.version(pkg.version)\n\t.usage(`${commandName}`)\n\t.description('execute deploy scripts and store the deployments')\n\t.option('-s, --scripts <value>', 'path the folder containing the deploy scripts to execute')\n\t.option('-t, --tags <value>', 'comma separated list of tags to execute')\n\t.option('-d, --deployments <value>', 'folder where deployments are saved')\n\t.requiredOption('-n, --network <value>', 'network context to use')\n\t.parse(process.argv);\n\nconst options = program.opts();\nconst config = readConfig(options as any);\n\nloadAndExecuteDeployments({...config, logLevel: 1});\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';\n\nrequire('esbuild-register/dist/node').register();\n\nexport function execute<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(\n\tcontext: ProvidedContext<Artifacts, NamedAccounts>,\n\tcallback: DeployScriptFunction<Artifacts, ResolvedNamedAccounts<NamedAccounts>, Deployments>,\n\toptions: {tags?: string[]; dependencies?: string[]}\n): DeployScriptModule<Artifacts, NamedAccounts, Deployments> {\n\tconst scriptModule = (env: Environment<Artifacts, ResolvedNamedAccounts<NamedAccounts>, Deployments>) =>\n\t\tcallback(env);\n\tscriptModule.providedContext = context;\n\tscriptModule.tags = options.tags;\n\tscriptModule.dependencies = options.dependencies;\n\t// TODO id + skip\n\treturn scriptModule as unknown as DeployScriptModule<Artifacts, NamedAccounts, Deployments>;\n}\n\nexport type ConfigOptions = {network: string; deployments?: string; scripts?: string; tags?: string};\n\nexport function readConfig(options: ConfigOptions, extra?: {ignoreMissingRPC?: boolean}): Config {\n\ttype Networks = {[name: string]: {rpcUrl: string}};\n\ttype ConfigFile = {networks: Networks};\n\tlet configFile: ConfigFile | undefined;\n\ttry {\n\t\tconst configString = fs.readFileSync('./rocketh.json', 'utf-8');\n\t\tconfigFile = JSON.parse(configString);\n\t} catch {}\n\n\tlet nodeUrl: string;\n\tconst fromEnv = process.env['ETH_NODE_URI_' + options.network];\n\tif (typeof fromEnv === 'string') {\n\t\tnodeUrl = fromEnv;\n\t} else {\n\t\tif (configFile) {\n\t\t\tconst network = configFile.networks && configFile.networks[options.network];\n\t\t\tif (network) {\n\t\t\t\tnodeUrl = network.rpcUrl;\n\t\t\t} else {\n\t\t\t\tif (extra?.ignoreMissingRPC) {\n\t\t\t\t\tnodeUrl = '';\n\t\t\t\t} else {\n\t\t\t\t\tif (options.network === 'localhost') {\n\t\t\t\t\t\tnodeUrl = 'http://127.0.0.1:8545';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.error(`network \"${options.network}\" is not configured. Please add it to the rocketh.json file`);\n\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (extra?.ignoreMissingRPC) {\n\t\t\t\tnodeUrl = '';\n\t\t\t} else {\n\t\t\t\tif (options.network === 'localhost') {\n\t\t\t\t\tnodeUrl = 'http://127.0.0.1:8545';\n\t\t\t\t} else {\n\t\t\t\t\tlogger.error(`network \"${options.network}\" is not configured. Please add it to the rocketh.json file`);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tnodeUrl,\n\t\tnetworkName: options.network,\n\t\tdeployments: options.deployments,\n\t\tscripts: options.scripts,\n\t\ttags: typeof options.tags === 'undefined' ? undefined : options.tags.split(','),\n\t};\n}\n\nexport function readAndResolveConfig(options: ConfigOptions, extra?: {ignoreMissingRPC?: boolean}): ResolvedConfig {\n\treturn resolveConfig(readConfig(options, extra));\n}\n\nexport function resolveConfig(config: Config): ResolvedConfig {\n\tconst resolvedConfig: ResolvedConfig = {\n\t\t...config,\n\t\tnetworkName: config.networkName || 'memory',\n\t\tdeployments: config.deployments || 'deployments',\n\t\tscripts: config.scripts || 'deploy',\n\t\ttags: config.tags || [],\n\t};\n\treturn resolvedConfig;\n}\n\nexport async function loadAndExecuteDeployments<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(config: Config) {\n\tconst resolvedConfig = resolveConfig(config);\n\n\treturn executeDeployScripts<Artifacts, NamedAccounts, Deployments>(resolvedConfig);\n\n\t// TODO\n\t// await this.export(options);\n}\n\nexport async function executeDeployScripts<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(config: ResolvedConfig): Promise<Deployments> {\n\tsetLogLevel(typeof config.logLevel === 'undefined' ? 0 : config.logLevel);\n\n\tlet filepaths;\n\tfilepaths = traverseMultipleDirectory([config.scripts]);\n\tfilepaths = filepaths\n\t\t.filter((v) => !path.basename(v).startsWith('_'))\n\t\t.sort((a: string, b: string) => {\n\t\t\tif (a < b) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (a > b) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\treturn 0;\n\t\t});\n\n\tlet providedContext: ProvidedContext<Artifacts, NamedAccounts> | undefined;\n\n\tconst scriptModuleByFilePath: {[filename: string]: DeployScriptModule} = {};\n\tconst scriptPathBags: {[tag: string]: string[]} = {};\n\tconst scriptFilePaths: string[] = [];\n\n\tfor (const filepath of filepaths) {\n\t\tconst scriptFilePath = path.resolve(filepath);\n\t\tlet scriptModule: DeployScriptModule;\n\t\ttry {\n\t\t\tif (require.cache) {\n\t\t\t\tdelete require.cache[scriptFilePath]; // ensure we reload it every time, so changes are taken in consideration\n\t\t\t}\n\t\t\tscriptModule = require(scriptFilePath);\n\n\t\t\tif ((scriptModule as any).default) {\n\t\t\t\tscriptModule = (scriptModule as any).default as DeployScriptModule;\n\t\t\t\tif ((scriptModule as any).default) {\n\t\t\t\t\tlogger.warn(`double default...`);\n\t\t\t\t\tscriptModule = (scriptModule as any).default as DeployScriptModule;\n\t\t\t\t}\n\t\t\t}\n\t\t\tscriptModuleByFilePath[scriptFilePath] = scriptModule;\n\t\t\tif (providedContext && providedContext !== scriptModule.providedContext) {\n\t\t\t\tthrow new Error(`context between 2 scripts is different, please share the same across them`);\n\t\t\t}\n\t\t\tprovidedContext = scriptModule.providedContext as ProvidedContext<Artifacts, NamedAccounts>;\n\t\t} catch (e) {\n\t\t\tlogger.error(`could not import ${filepath}`);\n\t\t\tthrow e;\n\t\t}\n\n\t\tlet scriptTags = scriptModule.tags;\n\t\tif (scriptTags !== undefined) {\n\t\t\tif (typeof scriptTags === 'string') {\n\t\t\t\tscriptTags = [scriptTags];\n\t\t\t}\n\t\t\tfor (const tag of scriptTags) {\n\t\t\t\tif (tag.indexOf(',') >= 0) {\n\t\t\t\t\tthrow new Error('Tag cannot contains commas');\n\t\t\t\t}\n\t\t\t\tconst bag = scriptPathBags[tag] || [];\n\t\t\t\tscriptPathBags[tag] = bag;\n\t\t\t\tbag.push(scriptFilePath);\n\t\t\t}\n\t\t}\n\n\t\tif (config.tags !== undefined && config.tags.length > 0) {\n\t\t\tlet found = false;\n\t\t\tif (scriptTags !== undefined) {\n\t\t\t\tfor (const tagToFind of config.tags) {\n\t\t\t\t\tfor (const tag of scriptTags) {\n\t\t\t\t\t\tif (tag === tagToFind) {\n\t\t\t\t\t\t\tscriptFilePaths.push(scriptFilePath);\n\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (found) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tscriptFilePaths.push(scriptFilePath);\n\t\t}\n\t}\n\n\tif (!providedContext) {\n\t\tthrow new Error(`no context loaded`);\n\t}\n\n\tconst {internal, external} = await createEnvironment(config, providedContext);\n\n\tawait internal.recoverTransactionsIfAny();\n\n\tconst scriptsRegisteredToRun: {[filename: string]: boolean} = {};\n\tconst scriptsToRun: Array<{\n\t\tfunc: DeployScriptModule;\n\t\tfilePath: string;\n\t}> = [];\n\tconst scriptsToRunAtTheEnd: Array<{\n\t\tfunc: DeployScriptModule;\n\t\tfilePath: string;\n\t}> = [];\n\tfunction recurseDependencies(scriptFilePath: string) {\n\t\tif (scriptsRegisteredToRun[scriptFilePath]) {\n\t\t\treturn;\n\t\t}\n\t\tconst scriptModule = scriptModuleByFilePath[scriptFilePath];\n\t\tif (scriptModule.dependencies) {\n\t\t\tfor (const dependency of scriptModule.dependencies) {\n\t\t\t\tconst scriptFilePathsToAdd = scriptPathBags[dependency];\n\t\t\t\tif (scriptFilePathsToAdd) {\n\t\t\t\t\tfor (const scriptFilenameToAdd of scriptFilePathsToAdd) {\n\t\t\t\t\t\trecurseDependencies(scriptFilenameToAdd);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!scriptsRegisteredToRun[scriptFilePath]) {\n\t\t\tif (scriptModule.runAtTheEnd) {\n\t\t\t\tscriptsToRunAtTheEnd.push({\n\t\t\t\t\tfilePath: scriptFilePath,\n\t\t\t\t\tfunc: scriptModule,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tscriptsToRun.push({\n\t\t\t\t\tfilePath: scriptFilePath,\n\t\t\t\t\tfunc: scriptModule,\n\t\t\t\t});\n\t\t\t}\n\t\t\tscriptsRegisteredToRun[scriptFilePath] = true;\n\t\t}\n\t}\n\tfor (const scriptFilePath of scriptFilePaths) {\n\t\trecurseDependencies(scriptFilePath);\n\t}\n\n\tfor (const deployScript of scriptsToRun.concat(scriptsToRunAtTheEnd)) {\n\t\tconst filename = path.basename(deployScript.filePath);\n\t\tconst relativeFilepath = path.relative('.', deployScript.filePath);\n\t\t// if (deployScript.func.id && this.db.migrations[deployScript.func.id]) {\n\t\t// \tlogger.info(`skipping ${filename} as migrations already executed and complete`);\n\t\t// \tcontinue;\n\t\t// }\n\t\tlet skip = false;\n\t\tif (deployScript.func.skip) {\n\t\t\tconst spinner = spin(`Executing skipping function from ${filename}`);\n\t\t\ttry {\n\t\t\t\tskip = await deployScript.func.skip(external);\n\t\t\t\tspinner.succeed(skip ? `skipping ${filename}` : undefined);\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\t\tif (!skip) {\n\t\t\tlet result;\n\t\t\tconst spinner = spin(`Executing ${filename}`);\n\t\t\ttry {\n\t\t\t\tresult = await deployScript.func(external);\n\t\t\t\tspinner.succeed(`${filename} execution complete`);\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\tif (result && typeof result === 'boolean') {\n\t\t\t\t// if (!deployScript.func.id) {\n\t\t\t\t// \tthrow new Error(\n\t\t\t\t// \t\t`${deployScript.filePath} return true to not be executed again, but does not provide an id. the script function needs to have the field \"id\" to be set`\n\t\t\t\t// \t);\n\t\t\t\t// }\n\t\t\t\t// this.db.migrations[deployScript.func.id] = Math.floor(Date.now() / 1000);\n\n\t\t\t\tconst deploymentFolderPath = config.deployments;\n\n\t\t\t\t// TODO refactor to extract this whole path and folder existence stuff\n\t\t\t\t// const toSave = this.db.writeDeploymentsToFiles && this.network.saveDeployments;\n\t\t\t\t// if (toSave) {\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tfs.mkdirSync(this.deploymentsPath);\n\t\t\t\t// \t} catch (e) {}\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tfs.mkdirSync(path.join(this.deploymentsPath, deploymentFolderPath));\n\t\t\t\t// \t} catch (e) {}\n\t\t\t\t// \tfs.writeFileSync(\n\t\t\t\t// \t\tpath.join(this.deploymentsPath, deploymentFolderPath, '.migrations.json'),\n\t\t\t\t// \t\tJSON.stringify(this.db.migrations, null, ' ')\n\t\t\t\t// \t);\n\t\t\t\t// }\n\t\t\t}\n\t\t}\n\t}\n\n\treturn external.deployments as Deployments;\n}\n","import fs from 'node:fs';\n\nimport {Transaction, TransactionReceipt, createPublicClient, custom} from 'viem';\nimport {\n\tAccountType,\n\tDeployment,\n\tEnvironment,\n\tNamedSigner,\n\tPendingDeployment,\n\tResolvedAccount,\n\tResolvedConfig,\n\tResolvedNamedAccounts,\n\tResolvedNamedSigners,\n\tUnknownArtifacts,\n\tUnknownDeployments,\n\tUnresolvedUnknownNamedAccounts,\n} from './types';\nimport {JSONRPCHTTPProvider} from 'eip-1193-json-provider';\nimport {Abi} from 'abitype';\nimport {InternalEnvironment} from '../internal/types';\nimport path from 'node:path';\nimport {JSONToString, stringToJSON} from '../utils/json';\nimport {loadDeployments} from './deployments';\nimport {EIP1193Account, EIP1193ProviderWithoutEvents, EIP1193Transaction} from 'eip-1193';\nimport {ProvidedContext} from '../executor/types';\nimport {spin} from '../internal/logging';\n\nexport type EnvironmentExtenstion = (env: Environment) => Environment;\n//we store this globally so this is not lost\n(globalThis as any).extensions = [];\nexport function extendEnvironment(extension: EnvironmentExtenstion): void {\n\t(globalThis as any).extensions.push(extension);\n}\n\nexport type SignerProtocolFunction = (protocolString: string) => Promise<NamedSigner>;\nexport type SignerProtocol = {\n\tgetSigner: SignerProtocolFunction;\n};\n\n//we store this globally so this is not lost\n(globalThis as any).signerProtocols = {};\nexport function handleSignerProtocol(protocol: string, getSigner: SignerProtocolFunction): void {\n\t(globalThis as any).signerProtocols[protocol] = {\n\t\tgetSigner,\n\t};\n}\n\nfunction displayTransaction(transaction: EIP1193Transaction) {\n\tif (transaction.type === '0x2') {\n\t\treturn `(maxFeePerGas: ${BigInt(transaction.maxFeePerGas).toString()}, maxPriorityFeePerGas: ${BigInt(\n\t\t\ttransaction.maxPriorityFeePerGas\n\t\t).toString()})`;\n\t} else {\n\t\treturn `(gasPrice: ${BigInt(transaction.gasPrice).toString()})`;\n\t}\n}\n\nexport async function createEnvironment<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(\n\tconfig: ResolvedConfig,\n\tprovidedContext: ProvidedContext<Artifacts, NamedAccounts>\n): Promise<{internal: InternalEnvironment; external: Environment}> {\n\tconst provider =\n\t\t'provider' in config ? config.provider : (new JSONRPCHTTPProvider(config.nodeUrl) as EIP1193ProviderWithoutEvents);\n\n\tconst transport = custom(provider);\n\tconst viemClient = createPublicClient({transport});\n\n\tconst chainId = (await viemClient.getChainId()).toString();\n\n\tlet networkName: string;\n\tlet saveDeployments: boolean;\n\tlet tags: {[tag: string]: boolean} = {};\n\tif ('nodeUrl' in config) {\n\t\tnetworkName = config.networkName;\n\t\tsaveDeployments = true;\n\t} else {\n\t\tif (config.networkName) {\n\t\t\tnetworkName = config.networkName;\n\t\t} else {\n\t\t\tnetworkName = 'memory';\n\t\t}\n\t\tif (networkName === 'memory' || networkName === 'hardhat') {\n\t\t\ttags['memory'] = true;\n\t\t\tsaveDeployments = false;\n\t\t} else {\n\t\t\tsaveDeployments = true;\n\t\t}\n\t}\n\n\tconst resolvedAccounts: {[name: string]: ResolvedAccount} = {};\n\n\tconst accountCache: {[name: string]: ResolvedAccount} = {};\n\tasync function getAccount(\n\t\tname: string,\n\t\taccounts: UnresolvedUnknownNamedAccounts,\n\t\taccountDef: AccountType\n\t): Promise<ResolvedAccount | undefined> {\n\t\tif (accountCache[name]) {\n\t\t\treturn accountCache[name];\n\t\t}\n\t\tlet account: ResolvedAccount | undefined;\n\t\tif (typeof accountDef === 'number') {\n\t\t\tconst accounts = await provider.request({method: 'eth_accounts'});\n\t\t\tconst accountPerIndex = accounts[accountDef];\n\t\t\tif (accountPerIndex) {\n\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\ttype: 'remote',\n\t\t\t\t\taddress: accountPerIndex,\n\t\t\t\t\tsigner: provider,\n\t\t\t\t};\n\t\t\t}\n\t\t} else if (typeof accountDef === 'string') {\n\t\t\tif (accountDef.startsWith('0x')) {\n\t\t\t\tif (accountDef.length === 66) {\n\t\t\t\t\tconst privateKeyProtocol: SignerProtocol = (globalThis as any).signerProtocols['privateKey'];\n\t\t\t\t\tif (privateKeyProtocol) {\n\t\t\t\t\t\tconst namedSigner = await privateKeyProtocol.getSigner(`privateKey:${accountDef}`);\n\t\t\t\t\t\tconst [address] = await namedSigner.signer.request({method: 'eth_accounts'});\n\t\t\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\t\t\t...namedSigner,\n\t\t\t\t\t\t\taddress,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\t\ttype: 'remote',\n\t\t\t\t\t\taddress: accountDef as `0x${string}`,\n\t\t\t\t\t\tsigner: provider,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (accountDef.indexOf(':') > 0) {\n\t\t\t\t\tconst [protocolID, extra] = accountDef.split(':');\n\t\t\t\t\tconst protocol: SignerProtocol = (globalThis as any).signerProtocols[protocolID];\n\t\t\t\t\tif (!protocol) {\n\t\t\t\t\t\tthrow new Error(`protocol: ${protocol} is not supported`);\n\t\t\t\t\t}\n\t\t\t\t\tconst namedSigner = await protocol.getSigner(accountDef);\n\t\t\t\t\tconst [address] = await namedSigner.signer.request({method: 'eth_accounts'});\n\t\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\t\t...namedSigner,\n\t\t\t\t\t\taddress,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tconst accountFetched = await getAccount(name, accounts, accounts[accountDef]);\n\t\t\t\t\tif (accountFetched) {\n\t\t\t\t\t\taccountCache[name] = account = accountFetched;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst accountForNetwork = accountDef[networkName] || accountDef[chainId] || accountDef['default'];\n\t\t\tif (typeof accountForNetwork !== undefined) {\n\t\t\t\tconst accountFetched = await getAccount(name, accounts, accountForNetwork);\n\t\t\t\tif (accountFetched) {\n\t\t\t\t\taccountCache[name] = account = accountFetched;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn account;\n\t}\n\n\tif (providedContext.accounts) {\n\t\tconst accountNames = Object.keys(providedContext.accounts);\n\t\tfor (const accountName of accountNames) {\n\t\t\tlet account = await getAccount(accountName, providedContext.accounts, providedContext.accounts[accountName]);\n\t\t\t(resolvedAccounts as any)[accountName] = account;\n\t\t}\n\t}\n\n\tconst context = {\n\t\taccounts: resolvedAccounts,\n\t\tartifacts: providedContext.artifacts as Artifacts,\n\t\tnetwork: {\n\t\t\tname: networkName,\n\t\t\tsaveDeployments,\n\t\t\ttags,\n\t\t},\n\t};\n\n\tconst {deployments} = loadDeployments(config.deployments, context.network.name, false, chainId);\n\n\tconst namedAccounts: {[name: string]: EIP1193Account} = {};\n\tconst namedSigners: {[name: string]: NamedSigner} = {};\n\tconst addressSigners: {[name: `0x${string}`]: NamedSigner} = {};\n\n\tfor (const entry of Object.entries(resolvedAccounts)) {\n\t\tconst name = entry[0];\n\t\tconst {address, ...namedSigner} = entry[1];\n\t\tnamedAccounts[name] = address;\n\t\taddressSigners[address] = namedSigner;\n\t\tnamedSigners[name] = namedSigner;\n\t}\n\n\tconst perliminaryEnvironment = {\n\t\tconfig,\n\t\tdeployments: deployments as Deployments,\n\t\taccounts: namedAccounts as ResolvedNamedAccounts<NamedAccounts>,\n\t\tsigners: namedSigners as ResolvedNamedSigners<ResolvedNamedAccounts<NamedAccounts>>,\n\t\taddressSigners: addressSigners,\n\t\tartifacts: context.artifacts,\n\t\tnetwork: {\n\t\t\tchainId,\n\t\t\tname: context.network.name,\n\t\t\ttags: context.network.tags,\n\t\t\tprovider,\n\t\t},\n\t};\n\n\tfunction ensureDeploymentFolder(): string {\n\t\tconst folderPath = path.join(config.deployments, context.network.name);\n\t\tfs.mkdirSync(folderPath, {recursive: true});\n\t\tconst chainIdFilepath = path.join(folderPath, '.chainId');\n\t\tif (!fs.existsSync(chainIdFilepath)) {\n\t\t\tfs.writeFileSync(chainIdFilepath, chainId);\n\t\t}\n\t\treturn folderPath;\n\t}\n\n\t// const signer = {\n\t// \tasync sendTransaction(\n\t// \t\tprovider: EIP1193ProviderWithoutEvents,\n\t// \t\taccount: {\n\t// \t\t\taddresss: EIP1193Account;\n\t// \t\t\tconfig: unknown;\n\t// \t\t},\n\t// \t\ttransaction: EIP1193TransactionEIP1193DATA\n\t// \t): Promise<EIP1193DATA> {\n\t// \t\treturn '0x';\n\t// \t},\n\t// };\n\n\t// async function sendTransaction(transaction: EIP1193TransactionEIP1193DATA): Promise<EIP1193DATA> {\n\t// \treturn '0x';\n\t// }\n\n\tfunction get<TAbi extends Abi>(name: string): Deployment<TAbi> | undefined {\n\t\treturn deployments[name] as Deployment<TAbi> | undefined;\n\t}\n\n\tasync function save<TAbi extends Abi>(name: string, deployment: Deployment<TAbi>): Promise<Deployment<TAbi>> {\n\t\tdeployments[name] = deployment;\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst folderPath = ensureDeploymentFolder();\n\t\t\tfs.writeFileSync(`${folderPath}/${name}.json`, JSONToString(deployment, 2));\n\t\t}\n\t\treturn deployment;\n\t}\n\n\tasync function recoverTransactionsIfAny<TAbi extends Abi = Abi>(): Promise<void> {\n\t\tconst filepath = path.join(config.deployments, context.network.name, '.pending_transactions.json');\n\t\tlet existingPendingDeployments: {name: string; transaction: PendingDeployment<TAbi>}[];\n\t\ttry {\n\t\t\texistingPendingDeployments = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t} catch {\n\t\t\texistingPendingDeployments = [];\n\t\t}\n\t\tif (existingPendingDeployments.length > 0) {\n\t\t\twhile (existingPendingDeployments.length > 0) {\n\t\t\t\tconst pendingTransaction = existingPendingDeployments.shift();\n\t\t\t\tif (pendingTransaction) {\n\t\t\t\t\tconst spinner = spin(\n\t\t\t\t\t\t`recovering ${pendingTransaction.name} with transaction ${pendingTransaction.transaction.txHash}`\n\t\t\t\t\t);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait waitForTransactionAndSave(pendingTransaction.name, pendingTransaction.transaction);\n\t\t\t\t\t\tconsole.log(`transaction ${pendingTransaction.transaction.txHash} complete`);\n\t\t\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingDeployments, 2));\n\t\t\t\t\t\tspinner.succeed();\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tspinner.fail();\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tfs.rmSync(filepath);\n\t\t}\n\t}\n\n\tasync function saveTransaction<TAbi extends Abi = Abi>(name: string, transaction: PendingDeployment<TAbi>) {\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst folderPath = ensureDeploymentFolder();\n\t\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\t\tlet existingPendingDeployments: {name: string; transaction: PendingDeployment<TAbi>}[];\n\t\t\ttry {\n\t\t\t\texistingPendingDeployments = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendingDeployments = [];\n\t\t\t}\n\t\t\texistingPendingDeployments.push({name, transaction});\n\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingDeployments, 2));\n\t\t}\n\t\treturn deployments;\n\t}\n\n\tasync function deleteTransaction<TAbi extends Abi = Abi>(hash: string) {\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst filepath = path.join(config.deployments, context.network.name, '.pending_transactions.json');\n\t\t\tlet existingPendingDeployments: {name: string; transaction: PendingDeployment<TAbi>}[];\n\t\t\ttry {\n\t\t\t\texistingPendingDeployments = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendingDeployments = [];\n\t\t\t}\n\t\t\texistingPendingDeployments = existingPendingDeployments.filter((v) => v.transaction.txHash !== hash);\n\t\t\tif (existingPendingDeployments.length === 0) {\n\t\t\t\tfs.rmSync(filepath);\n\t\t\t} else {\n\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingDeployments, 2));\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function exportDeploymentsAsTypes() {\n\t\tconst folderPath = './generated';\n\t\tfs.mkdirSync(folderPath, {recursive: true});\n\t\tfs.writeFileSync(`${folderPath}/deployments.ts`, `export default ${JSONToString(deployments, 2)} as const;`);\n\t}\n\n\tasync function waitForTransactionAndSave<TAbi extends Abi = Abi>(\n\t\tname: string,\n\t\tpendingDeployment: PendingDeployment<TAbi>,\n\t\ttransaction?: EIP1193Transaction | null\n\t): Promise<Deployment<TAbi>> {\n\t\tconst spinner = spin(`tx ${pendingDeployment.txHash}${transaction ? ` ${displayTransaction(transaction)}` : ''}`);\n\t\tlet receipt: TransactionReceipt;\n\t\ttry {\n\t\t\treceipt = await viemClient.waitForTransactionReceipt({\n\t\t\t\thash: pendingDeployment.txHash,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tspinner.fail();\n\t\t\tthrow e;\n\t\t}\n\t\tif (!receipt) {\n\t\t\tspinner.fail(`receipt for ${pendingDeployment.txHash} not found`);\n\t\t} else {\n\t\t\tspinner.succeed();\n\t\t}\n\n\t\tif (!receipt.contractAddress) {\n\t\t\tthrow new Error(`failed to deploy contract ${name}`);\n\t\t}\n\t\tconst {abi, ...artifactObjectWithoutABI} = pendingDeployment.partialDeployment;\n\n\t\tif (!artifactObjectWithoutABI.nonce) {\n\t\t\tconst spinner = spin(); // 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.txHash],\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\tif (!transaction) {\n\t\t\t\tspinner.fail(`tx ${pendingDeployment.txHash} not found`);\n\t\t\t} else {\n\t\t\t\tspinner.stop();\n\t\t\t}\n\n\t\t\tif (transaction) {\n\t\t\t\tartifactObjectWithoutABI.nonce = transaction.nonce;\n\t\t\t\tartifactObjectWithoutABI.txOrigin = transaction.from;\n\t\t\t}\n\t\t}\n\n\t\t// TODO options\n\t\tfor (const key of Object.keys(artifactObjectWithoutABI)) {\n\t\t\tif (key.startsWith('_')) {\n\t\t\t\tdelete (artifactObjectWithoutABI as any)[key];\n\t\t\t}\n\t\t\tif (key === 'evm') {\n\t\t\t\tconst {gasEstimates} = artifactObjectWithoutABI.evm;\n\t\t\t\tartifactObjectWithoutABI.evm = {\n\t\t\t\t\tgasEstimates,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst deployment = {\n\t\t\taddress: receipt.contractAddress,\n\t\t\ttxHash: pendingDeployment.txHash,\n\t\t\tabi,\n\t\t\t...artifactObjectWithoutABI,\n\t\t};\n\t\treturn save(name, deployment);\n\t}\n\n\tasync function saveWhilePending<TAbi extends Abi = Abi>(name: string, pendingDeployment: PendingDeployment<TAbi>) {\n\t\tawait saveTransaction<TAbi>(name, pendingDeployment);\n\t\tlet transaction: EIP1193Transaction | null = null;\n\t\tconst spinner = spin(); // 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.txHash],\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tspinner.fail();\n\t\t\tthrow e;\n\t\t}\n\t\tif (!transaction) {\n\t\t\tspinner.fail(`tx ${pendingDeployment.txHash} not found`);\n\t\t} else {\n\t\t\tspinner.stop();\n\t\t}\n\n\t\tconst deployment = waitForTransactionAndSave<TAbi>(\n\t\t\tname,\n\t\t\ttransaction\n\t\t\t\t? {\n\t\t\t\t\t\t...pendingDeployment,\n\t\t\t\t\t\tnonce: transaction.nonce,\n\t\t\t\t\t\ttxOrigin: transaction.from,\n\t\t\t\t }\n\t\t\t\t: pendingDeployment,\n\t\t\ttransaction\n\t\t);\n\t\tawait deleteTransaction(pendingDeployment.txHash);\n\t\treturn deployment;\n\t}\n\n\tlet env: Environment<Artifacts, NamedAccounts, Deployments> = {\n\t\t...perliminaryEnvironment,\n\t\tsave,\n\t\tsaveWhilePending,\n\t\tget,\n\t};\n\tfor (const extension of (globalThis as any).extensions) {\n\t\tenv = extension(env);\n\t}\n\n\treturn {\n\t\texternal: env,\n\t\tinternal: {\n\t\t\texportDeploymentsAsTypes,\n\t\t\trecoverTransactionsIfAny,\n\t\t},\n\t};\n}\n","// TODO share with db-utils\nexport function bnReplacer(k: string, v: any): any {\n\tif (typeof v === 'bigint') {\n\t\treturn v.toString() + 'n';\n\t}\n\treturn v;\n}\n\nexport function bnReviver(k: string, v: any): any {\n\tif (\n\t\ttypeof v === 'string' &&\n\t\t(v.startsWith('-') ? !isNaN(parseInt(v.charAt(1))) : !isNaN(parseInt(v.charAt(0)))) &&\n\t\tv.charAt(v.length - 1) === 'n'\n\t) {\n\t\treturn BigInt(v.slice(0, -1));\n\t}\n\treturn v;\n}\n\nexport function JSONToString<T = unknown>(json: unknown, space?: string | number) {\n\treturn JSON.stringify(json, bnReplacer, space);\n}\n\nexport function stringToJSON<T = unknown>(str: string): T {\n\treturn JSON.parse(str, bnReviver);\n}\n","import path from 'node:path';\nimport fs from 'node:fs';\nimport {traverse} from '../utils/fs';\nimport {UnknownDeployments} from './types';\n\nexport function loadDeployments(\n\tdeploymentsPath: string,\n\tsubPath: string,\n\tonlyABIAndAddress?: boolean,\n\texpectedChainId?: string\n): {deployments: UnknownDeployments; chainId?: string} {\n\tconst deploymentsFound: UnknownDeployments = {};\n\tconst deployPath = path.join(deploymentsPath, subPath);\n\n\tlet filesStats;\n\ttry {\n\t\tfilesStats = traverse(deployPath, undefined, undefined, (name) => !name.startsWith('.') && name !== 'solcInputs');\n\t} catch (e) {\n\t\t// console.log('no folder at ' + deployPath);\n\t\treturn {deployments: {}};\n\t}\n\tlet chainId: string;\n\tif (filesStats.length > 0) {\n\t\tconst chainIdFilepath = path.join(deployPath, '.chainId');\n\t\tif (fs.existsSync(chainIdFilepath)) {\n\t\t\tchainId = fs.readFileSync(chainIdFilepath).toString().trim();\n\t\t} else {\n\t\t\tthrow new Error(`A .chainId' file is expected to be present in the deployment folder for network ${subPath}`);\n\t\t}\n\n\t\tif (expectedChainId) {\n\t\t\tif (expectedChainId !== chainId) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Loading deployment in folder '${deployPath}' (with chainId: ${chainId}) for a different chainId (${expectedChainId})`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} else {\n\t\treturn {deployments: {}};\n\t}\n\tlet fileNames = filesStats.map((a) => a.relativePath);\n\tfileNames = fileNames.sort((a, b) => {\n\t\tif (a < b) {\n\t\t\treturn -1;\n\t\t}\n\t\tif (a > b) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t});\n\n\tfor (const fileName of fileNames) {\n\t\tif (fileName.substring(fileName.length - 5) === '.json') {\n\t\t\tconst deploymentFileName = path.join(deployPath, fileName);\n\t\t\tlet deployment = JSON.parse(fs.readFileSync(deploymentFileName).toString());\n\t\t\t// truffleChainId argument:\n\t\t\t// if (!deployment.address && deployment.networks) {\n\t\t\t// \tif (truffleChainId && deployment.networks[truffleChainId]) {\n\t\t\t// \t\t// TRUFFLE support\n\t\t\t// \t\tconst truffleDeployment = deployment as any; // TruffleDeployment;\n\t\t\t// \t\tdeployment.address = truffleDeployment.networks[truffleChainId].address;\n\t\t\t// \t\tdeployment.transactionHash = truffleDeployment.networks[truffleChainId].transactionHash;\n\t\t\t// \t}\n\t\t\t// }\n\t\t\tif (onlyABIAndAddress) {\n\t\t\t\tdeployment = {\n\t\t\t\t\taddress: deployment.address,\n\t\t\t\t\tabi: deployment.abi,\n\t\t\t\t\tlinkedData: deployment.linkedData,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst name = fileName.slice(0, fileName.length - 5);\n\t\t\t// console.log('fetching ' + deploymentFileName + ' for ' + name);\n\n\t\t\tdeploymentsFound[name] = deployment;\n\t\t}\n\t}\n\treturn {deployments: deploymentsFound, chainId};\n}\n","import {logs} from 'named-logs';\n\nimport {hookup, logs as Logging} from 'named-logs-console';\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\ntype PartialOra = {\n\tstart(msg?: string): PartialOra;\n\tstop(): PartialOra;\n\tsucceed(msg?: string): PartialOra;\n\tfail(msg?: string): PartialOra;\n};\nconst voidSpinner: PartialOra = {\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\tconsole.log(msg);\n\t\treturn this;\n\t},\n\tfail(msg?: string) {\n\t\tconsole.error(msg);\n\t\treturn this;\n\t},\n};\n// export function spin(message: string): PartialOra {\n// \treturn Logging.level > 0 ? ora(message).start() : voidSpinner;\n// }\n\n// let lastSpin = ora('rocketh');\nlet lastSpin = voidSpinner;\nexport function spin(message?: string): PartialOra {\n\tif (Logging.level > 0) {\n\t\tlastSpin = lastSpin.start(message);\n\t\treturn lastSpin;\n\t} else {\n\t\treturn voidSpinner;\n\t}\n}\n","{\n\t\"name\": \"rocketh\",\n\t\"version\": \"0.5.8\",\n\t\"description\": \"deploy smart contract on ethereum-compatible networks\",\n\t\"publishConfig\": {\n\t\t\"access\": \"public\"\n\t},\n\t\"type\": \"module\",\n\t\"main\": \"dist/index.cjs\",\n\t\"module\": \"dist/index.js\",\n\t\"types\": \"dist/index.d.ts\",\n\t\"bin\": {\n\t\t\"rocketh\": \"dist/cli.cjs\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@types/figlet\": \"^1.5.5\",\n\t\t\"@types/node\": \"^18.15.5\",\n\t\t\"abitype\": \"^0.7.1\",\n\t\t\"eip-1193\": \"^0.4.7\",\n\t\t\"ipfs-gateway-emulator\": \"4.2.1-ipfs.2\",\n\t\t\"rimraf\": \"^4.4.1\",\n\t\t\"tsup\": \"^6.7.0\",\n\t\t\"typedoc\": \"^0.23.28\",\n\t\t\"typescript\": \"^5.0.4\"\n\t},\n\t\"dependencies\": {\n\t\t\"commander\": \"^10.0.0\",\n\t\t\"eip-1193-json-provider\": \"^0.1.5\",\n\t\t\"esbuild\": \"^0.17.12\",\n\t\t\"esbuild-register\": \"^3.4.2\",\n\t\t\"figlet\": \"^1.5.2\",\n\t\t\"ldenv\": \"^0.3.5\",\n\t\t\"named-logs\": \"^0.2.2\",\n\t\t\"named-logs-console\": \"^0.2.3\",\n\t\t\"viem\": \"^0.3.50\"\n\t},\n\t\"scripts\": {\n\t\t\"build\": \"rimraf dist && tsup --entry src/index.ts --entry src/cli.ts --dts --format esm,cjs\",\n\t\t\"dev\": \"rimraf dist && tsup --entry src/index.ts --entry src/cli.ts --dts --format esm,cjs --watch\",\n\t\t\"dev-no-reset\": \"tsup --entry src/index.ts --entry src/cli.ts --dts --format esm,cjs --watch\",\n\t\t\"gen-docs\": \"typedoc --out docs src\",\n\t\t\"serve-docs\": \"ipfs-emulator --only -d docs -p 8080\"\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","config","accounts","path","fs","spinner","transaction","options","fs","config","path"]}
package/dist/cli.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  loadAndExecuteDeployments,
4
4
  readConfig
5
- } from "./chunk-OMYXSYJQ.js";
5
+ } from "./chunk-OUY6QCZ4.js";
6
6
 
7
7
  // src/cli.ts
8
8
  import { loadEnv } from "ldenv";
@@ -11,7 +11,7 @@ import { Command } from "commander";
11
11
  // package.json
12
12
  var package_default = {
13
13
  name: "rocketh",
14
- version: "0.5.7",
14
+ version: "0.5.8",
15
15
  description: "deploy smart contract on ethereum-compatible networks",
16
16
  publishConfig: {
17
17
  access: "public"
@@ -43,7 +43,6 @@ var package_default = {
43
43
  ldenv: "^0.3.5",
44
44
  "named-logs": "^0.2.2",
45
45
  "named-logs-console": "^0.2.3",
46
- "ora-cjs": "^0.0.2",
47
46
  viem: "^0.3.50"
48
47
  },
49
48
  scripts: {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../package.json"],"sourcesContent":["#! /usr/bin/env node\nimport {loadEnv} from 'ldenv';\nimport {loadAndExecuteDeployments, readConfig} from '.';\nimport {Command} from 'commander';\nimport pkg from '../package.json';\n\nloadEnv();\n\nconst commandName = pkg.name;\nconst program = new Command();\nprogram\n\t.name(commandName)\n\t.version(pkg.version)\n\t.usage(`${commandName}`)\n\t.description('execute deploy scripts and store the deployments')\n\t.option('-s, --scripts <value>', 'path the folder containing the deploy scripts to execute')\n\t.option('-t, --tags <value>', 'comma separated list of tags to execute')\n\t.option('-d, --deployments <value>', 'folder where deployments are saved')\n\t.requiredOption('-n, --network <value>', 'network context to use')\n\t.parse(process.argv);\n\nconst options = program.opts();\nconst config = readConfig(options as any);\n\nloadAndExecuteDeployments({...config, logLevel: 1});\n","{\n\t\"name\": \"rocketh\",\n\t\"version\": \"0.5.7\",\n\t\"description\": \"deploy smart contract on ethereum-compatible networks\",\n\t\"publishConfig\": {\n\t\t\"access\": \"public\"\n\t},\n\t\"type\": \"module\",\n\t\"main\": \"dist/index.cjs\",\n\t\"module\": \"dist/index.js\",\n\t\"types\": \"dist/index.d.ts\",\n\t\"bin\": {\n\t\t\"rocketh\": \"dist/cli.cjs\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@types/figlet\": \"^1.5.5\",\n\t\t\"@types/node\": \"^18.15.5\",\n\t\t\"abitype\": \"^0.7.1\",\n\t\t\"eip-1193\": \"^0.4.7\",\n\t\t\"ipfs-gateway-emulator\": \"4.2.1-ipfs.2\",\n\t\t\"rimraf\": \"^4.4.1\",\n\t\t\"tsup\": \"^6.7.0\",\n\t\t\"typedoc\": \"^0.23.28\",\n\t\t\"typescript\": \"^5.0.4\"\n\t},\n\t\"dependencies\": {\n\t\t\"commander\": \"^10.0.0\",\n\t\t\"eip-1193-json-provider\": \"^0.1.5\",\n\t\t\"esbuild\": \"^0.17.12\",\n\t\t\"esbuild-register\": \"^3.4.2\",\n\t\t\"figlet\": \"^1.5.2\",\n\t\t\"ldenv\": \"^0.3.5\",\n\t\t\"named-logs\": \"^0.2.2\",\n\t\t\"named-logs-console\": \"^0.2.3\",\n\t\t\"ora-cjs\": \"^0.0.2\",\n\t\t\"viem\": \"^0.3.50\"\n\t},\n\t\"scripts\": {\n\t\t\"build\": \"rimraf dist && tsup --entry src/index.ts --entry src/cli.ts --dts --format esm,cjs\",\n\t\t\"dev\": \"rimraf dist && tsup --entry src/index.ts --entry src/cli.ts --dts --format esm,cjs --watch\",\n\t\t\"dev-no-reset\": \"tsup --entry src/index.ts --entry src/cli.ts --dts --format esm,cjs --watch\",\n\t\t\"gen-docs\": \"typedoc --out docs src\",\n\t\t\"serve-docs\": \"ipfs-emulator --only -d docs -p 8080\"\n\t}\n}\n"],"mappings":";;;;;;;AACA,SAAQ,eAAc;AAEtB,SAAQ,eAAc;;;ACHtB;AAAA,EACC,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,aAAe;AAAA,EACf,eAAiB;AAAA,IAChB,QAAU;AAAA,EACX;AAAA,EACA,MAAQ;AAAA,EACR,MAAQ;AAAA,EACR,QAAU;AAAA,EACV,OAAS;AAAA,EACT,KAAO;AAAA,IACN,SAAW;AAAA,EACZ;AAAA,EACA,iBAAmB;AAAA,IAClB,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,SAAW;AAAA,IACX,YAAY;AAAA,IACZ,yBAAyB;AAAA,IACzB,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,YAAc;AAAA,EACf;AAAA,EACA,cAAgB;AAAA,IACf,WAAa;AAAA,IACb,0BAA0B;AAAA,IAC1B,SAAW;AAAA,IACX,oBAAoB;AAAA,IACpB,QAAU;AAAA,IACV,OAAS;AAAA,IACT,cAAc;AAAA,IACd,sBAAsB;AAAA,IACtB,WAAW;AAAA,IACX,MAAQ;AAAA,EACT;AAAA,EACA,SAAW;AAAA,IACV,OAAS;AAAA,IACT,KAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,cAAc;AAAA,EACf;AACD;;;ADtCA,QAAQ;AAER,IAAM,cAAc,gBAAI;AACxB,IAAM,UAAU,IAAI,QAAQ;AAC5B,QACE,KAAK,WAAW,EAChB,QAAQ,gBAAI,OAAO,EACnB,MAAM,GAAG,aAAa,EACtB,YAAY,kDAAkD,EAC9D,OAAO,yBAAyB,0DAA0D,EAC1F,OAAO,sBAAsB,yCAAyC,EACtE,OAAO,6BAA6B,oCAAoC,EACxE,eAAe,yBAAyB,wBAAwB,EAChE,MAAM,QAAQ,IAAI;AAEpB,IAAM,UAAU,QAAQ,KAAK;AAC7B,IAAM,SAAS,WAAW,OAAc;AAExC,0BAA0B,EAAC,GAAG,QAAQ,UAAU,EAAC,CAAC;","names":[]}
1
+ {"version":3,"sources":["../src/cli.ts","../package.json"],"sourcesContent":["#! /usr/bin/env node\nimport {loadEnv} from 'ldenv';\nimport {loadAndExecuteDeployments, readConfig} from '.';\nimport {Command} from 'commander';\nimport pkg from '../package.json';\n\nloadEnv();\n\nconst commandName = pkg.name;\nconst program = new Command();\nprogram\n\t.name(commandName)\n\t.version(pkg.version)\n\t.usage(`${commandName}`)\n\t.description('execute deploy scripts and store the deployments')\n\t.option('-s, --scripts <value>', 'path the folder containing the deploy scripts to execute')\n\t.option('-t, --tags <value>', 'comma separated list of tags to execute')\n\t.option('-d, --deployments <value>', 'folder where deployments are saved')\n\t.requiredOption('-n, --network <value>', 'network context to use')\n\t.parse(process.argv);\n\nconst options = program.opts();\nconst config = readConfig(options as any);\n\nloadAndExecuteDeployments({...config, logLevel: 1});\n","{\n\t\"name\": \"rocketh\",\n\t\"version\": \"0.5.8\",\n\t\"description\": \"deploy smart contract on ethereum-compatible networks\",\n\t\"publishConfig\": {\n\t\t\"access\": \"public\"\n\t},\n\t\"type\": \"module\",\n\t\"main\": \"dist/index.cjs\",\n\t\"module\": \"dist/index.js\",\n\t\"types\": \"dist/index.d.ts\",\n\t\"bin\": {\n\t\t\"rocketh\": \"dist/cli.cjs\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@types/figlet\": \"^1.5.5\",\n\t\t\"@types/node\": \"^18.15.5\",\n\t\t\"abitype\": \"^0.7.1\",\n\t\t\"eip-1193\": \"^0.4.7\",\n\t\t\"ipfs-gateway-emulator\": \"4.2.1-ipfs.2\",\n\t\t\"rimraf\": \"^4.4.1\",\n\t\t\"tsup\": \"^6.7.0\",\n\t\t\"typedoc\": \"^0.23.28\",\n\t\t\"typescript\": \"^5.0.4\"\n\t},\n\t\"dependencies\": {\n\t\t\"commander\": \"^10.0.0\",\n\t\t\"eip-1193-json-provider\": \"^0.1.5\",\n\t\t\"esbuild\": \"^0.17.12\",\n\t\t\"esbuild-register\": \"^3.4.2\",\n\t\t\"figlet\": \"^1.5.2\",\n\t\t\"ldenv\": \"^0.3.5\",\n\t\t\"named-logs\": \"^0.2.2\",\n\t\t\"named-logs-console\": \"^0.2.3\",\n\t\t\"viem\": \"^0.3.50\"\n\t},\n\t\"scripts\": {\n\t\t\"build\": \"rimraf dist && tsup --entry src/index.ts --entry src/cli.ts --dts --format esm,cjs\",\n\t\t\"dev\": \"rimraf dist && tsup --entry src/index.ts --entry src/cli.ts --dts --format esm,cjs --watch\",\n\t\t\"dev-no-reset\": \"tsup --entry src/index.ts --entry src/cli.ts --dts --format esm,cjs --watch\",\n\t\t\"gen-docs\": \"typedoc --out docs src\",\n\t\t\"serve-docs\": \"ipfs-emulator --only -d docs -p 8080\"\n\t}\n}\n"],"mappings":";;;;;;;AACA,SAAQ,eAAc;AAEtB,SAAQ,eAAc;;;ACHtB;AAAA,EACC,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,aAAe;AAAA,EACf,eAAiB;AAAA,IAChB,QAAU;AAAA,EACX;AAAA,EACA,MAAQ;AAAA,EACR,MAAQ;AAAA,EACR,QAAU;AAAA,EACV,OAAS;AAAA,EACT,KAAO;AAAA,IACN,SAAW;AAAA,EACZ;AAAA,EACA,iBAAmB;AAAA,IAClB,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,SAAW;AAAA,IACX,YAAY;AAAA,IACZ,yBAAyB;AAAA,IACzB,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,YAAc;AAAA,EACf;AAAA,EACA,cAAgB;AAAA,IACf,WAAa;AAAA,IACb,0BAA0B;AAAA,IAC1B,SAAW;AAAA,IACX,oBAAoB;AAAA,IACpB,QAAU;AAAA,IACV,OAAS;AAAA,IACT,cAAc;AAAA,IACd,sBAAsB;AAAA,IACtB,MAAQ;AAAA,EACT;AAAA,EACA,SAAW;AAAA,IACV,OAAS;AAAA,IACT,KAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,cAAc;AAAA,EACf;AACD;;;ADrCA,QAAQ;AAER,IAAM,cAAc,gBAAI;AACxB,IAAM,UAAU,IAAI,QAAQ;AAC5B,QACE,KAAK,WAAW,EAChB,QAAQ,gBAAI,OAAO,EACnB,MAAM,GAAG,aAAa,EACtB,YAAY,kDAAkD,EAC9D,OAAO,yBAAyB,0DAA0D,EAC1F,OAAO,sBAAsB,yCAAyC,EACtE,OAAO,6BAA6B,oCAAoC,EACxE,eAAe,yBAAyB,wBAAwB,EAChE,MAAM,QAAQ,IAAI;AAEpB,IAAM,UAAU,QAAQ,KAAK;AAC7B,IAAM,SAAS,WAAW,OAAc;AAExC,0BAA0B,EAAC,GAAG,QAAQ,UAAU,EAAC,CAAC;","names":[]}
package/dist/index.cjs CHANGED
@@ -169,7 +169,6 @@ function loadDeployments(deploymentsPath, subPath, onlyABIAndAddress, expectedCh
169
169
  // src/internal/logging.ts
170
170
  var import_named_logs = require("named-logs");
171
171
  var import_named_logs_console = require("named-logs-console");
172
- var import_ora_cjs = __toESM(require("ora-cjs"), 1);
173
172
  (0, import_named_logs_console.hookup)();
174
173
  function setLogLevel(level) {
175
174
  import_named_logs_console.logs.level = level;
@@ -181,17 +180,25 @@ function setLogLevel(level) {
181
180
  }
182
181
  var logger = (0, import_named_logs.logs)("rocketh");
183
182
  var voidSpinner = {
183
+ start(msg) {
184
+ if (msg) {
185
+ console.log(msg);
186
+ }
187
+ return this;
188
+ },
184
189
  stop() {
185
190
  return this;
186
191
  },
187
192
  succeed(msg) {
193
+ console.log(msg);
188
194
  return this;
189
195
  },
190
196
  fail(msg) {
197
+ console.error(msg);
191
198
  return this;
192
199
  }
193
200
  };
194
- var lastSpin = (0, import_ora_cjs.default)("rocketh");
201
+ var lastSpin = voidSpinner;
195
202
  function spin(message) {
196
203
  if (import_named_logs_console.logs.level > 0) {
197
204
  lastSpin = lastSpin.start(message);
@@ -460,7 +467,7 @@ async function createEnvironment(config, providedContext) {
460
467
  }
461
468
  const { abi, ...artifactObjectWithoutABI } = pendingDeployment.partialDeployment;
462
469
  if (!artifactObjectWithoutABI.nonce) {
463
- const spinner2 = spin(`fetching nonce for ${pendingDeployment.txHash}`);
470
+ const spinner2 = spin();
464
471
  let transaction2 = null;
465
472
  try {
466
473
  transaction2 = await provider.request({
@@ -503,7 +510,7 @@ async function createEnvironment(config, providedContext) {
503
510
  async function saveWhilePending(name, pendingDeployment) {
504
511
  await saveTransaction(name, pendingDeployment);
505
512
  let transaction = null;
506
- const spinner = spin(`fetching tx from peers ${pendingDeployment.txHash}`);
513
+ const spinner = spin();
507
514
  try {
508
515
  transaction = await provider.request({
509
516
  method: "eth_getTransactionByHash",
@@ -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"],"sourcesContent":["export * from './executor';\nexport * from './executor/types';\nexport * from './environment/types';\nexport {extendEnvironment, handleSignerProtocol} from './environment';\nexport {loadDeployments} from './environment/deployments';\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';\n\nrequire('esbuild-register/dist/node').register();\n\nexport function execute<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(\n\tcontext: ProvidedContext<Artifacts, NamedAccounts>,\n\tcallback: DeployScriptFunction<Artifacts, ResolvedNamedAccounts<NamedAccounts>, Deployments>,\n\toptions: {tags?: string[]; dependencies?: string[]}\n): DeployScriptModule<Artifacts, NamedAccounts, Deployments> {\n\tconst scriptModule = (env: Environment<Artifacts, ResolvedNamedAccounts<NamedAccounts>, Deployments>) =>\n\t\tcallback(env);\n\tscriptModule.providedContext = context;\n\tscriptModule.tags = options.tags;\n\tscriptModule.dependencies = options.dependencies;\n\t// TODO id + skip\n\treturn scriptModule as unknown as DeployScriptModule<Artifacts, NamedAccounts, Deployments>;\n}\n\nexport type ConfigOptions = {network: string; deployments?: string; scripts?: string; tags?: string};\n\nexport function readConfig(options: ConfigOptions, extra?: {ignoreMissingRPC?: boolean}): Config {\n\ttype Networks = {[name: string]: {rpcUrl: string}};\n\ttype ConfigFile = {networks: Networks};\n\tlet configFile: ConfigFile | undefined;\n\ttry {\n\t\tconst configString = fs.readFileSync('./rocketh.json', 'utf-8');\n\t\tconfigFile = JSON.parse(configString);\n\t} catch {}\n\n\tlet nodeUrl: string;\n\tconst fromEnv = process.env['ETH_NODE_URI_' + options.network];\n\tif (typeof fromEnv === 'string') {\n\t\tnodeUrl = fromEnv;\n\t} else {\n\t\tif (configFile) {\n\t\t\tconst network = configFile.networks && configFile.networks[options.network];\n\t\t\tif (network) {\n\t\t\t\tnodeUrl = network.rpcUrl;\n\t\t\t} else {\n\t\t\t\tif (extra?.ignoreMissingRPC) {\n\t\t\t\t\tnodeUrl = '';\n\t\t\t\t} else {\n\t\t\t\t\tif (options.network === 'localhost') {\n\t\t\t\t\t\tnodeUrl = 'http://127.0.0.1:8545';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.error(`network \"${options.network}\" is not configured. Please add it to the rocketh.json file`);\n\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (extra?.ignoreMissingRPC) {\n\t\t\t\tnodeUrl = '';\n\t\t\t} else {\n\t\t\t\tif (options.network === 'localhost') {\n\t\t\t\t\tnodeUrl = 'http://127.0.0.1:8545';\n\t\t\t\t} else {\n\t\t\t\t\tlogger.error(`network \"${options.network}\" is not configured. Please add it to the rocketh.json file`);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tnodeUrl,\n\t\tnetworkName: options.network,\n\t\tdeployments: options.deployments,\n\t\tscripts: options.scripts,\n\t\ttags: typeof options.tags === 'undefined' ? undefined : options.tags.split(','),\n\t};\n}\n\nexport function readAndResolveConfig(options: ConfigOptions, extra?: {ignoreMissingRPC?: boolean}): ResolvedConfig {\n\treturn resolveConfig(readConfig(options, extra));\n}\n\nexport function resolveConfig(config: Config): ResolvedConfig {\n\tconst resolvedConfig: ResolvedConfig = {\n\t\t...config,\n\t\tnetworkName: config.networkName || 'memory',\n\t\tdeployments: config.deployments || 'deployments',\n\t\tscripts: config.scripts || 'deploy',\n\t\ttags: config.tags || [],\n\t};\n\treturn resolvedConfig;\n}\n\nexport async function loadAndExecuteDeployments<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(config: Config) {\n\tconst resolvedConfig = resolveConfig(config);\n\n\treturn executeDeployScripts<Artifacts, NamedAccounts, Deployments>(resolvedConfig);\n\n\t// TODO\n\t// await this.export(options);\n}\n\nexport async function executeDeployScripts<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(config: ResolvedConfig): Promise<Deployments> {\n\tsetLogLevel(typeof config.logLevel === 'undefined' ? 0 : config.logLevel);\n\n\tlet filepaths;\n\tfilepaths = traverseMultipleDirectory([config.scripts]);\n\tfilepaths = filepaths\n\t\t.filter((v) => !path.basename(v).startsWith('_'))\n\t\t.sort((a: string, b: string) => {\n\t\t\tif (a < b) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (a > b) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\treturn 0;\n\t\t});\n\n\tlet providedContext: ProvidedContext<Artifacts, NamedAccounts> | undefined;\n\n\tconst scriptModuleByFilePath: {[filename: string]: DeployScriptModule} = {};\n\tconst scriptPathBags: {[tag: string]: string[]} = {};\n\tconst scriptFilePaths: string[] = [];\n\n\tfor (const filepath of filepaths) {\n\t\tconst scriptFilePath = path.resolve(filepath);\n\t\tlet scriptModule: DeployScriptModule;\n\t\ttry {\n\t\t\tif (require.cache) {\n\t\t\t\tdelete require.cache[scriptFilePath]; // ensure we reload it every time, so changes are taken in consideration\n\t\t\t}\n\t\t\tscriptModule = require(scriptFilePath);\n\n\t\t\tif ((scriptModule as any).default) {\n\t\t\t\tscriptModule = (scriptModule as any).default as DeployScriptModule;\n\t\t\t\tif ((scriptModule as any).default) {\n\t\t\t\t\tlogger.warn(`double default...`);\n\t\t\t\t\tscriptModule = (scriptModule as any).default as DeployScriptModule;\n\t\t\t\t}\n\t\t\t}\n\t\t\tscriptModuleByFilePath[scriptFilePath] = scriptModule;\n\t\t\tif (providedContext && providedContext !== scriptModule.providedContext) {\n\t\t\t\tthrow new Error(`context between 2 scripts is different, please share the same across them`);\n\t\t\t}\n\t\t\tprovidedContext = scriptModule.providedContext as ProvidedContext<Artifacts, NamedAccounts>;\n\t\t} catch (e) {\n\t\t\tlogger.error(`could not import ${filepath}`);\n\t\t\tthrow e;\n\t\t}\n\n\t\tlet scriptTags = scriptModule.tags;\n\t\tif (scriptTags !== undefined) {\n\t\t\tif (typeof scriptTags === 'string') {\n\t\t\t\tscriptTags = [scriptTags];\n\t\t\t}\n\t\t\tfor (const tag of scriptTags) {\n\t\t\t\tif (tag.indexOf(',') >= 0) {\n\t\t\t\t\tthrow new Error('Tag cannot contains commas');\n\t\t\t\t}\n\t\t\t\tconst bag = scriptPathBags[tag] || [];\n\t\t\t\tscriptPathBags[tag] = bag;\n\t\t\t\tbag.push(scriptFilePath);\n\t\t\t}\n\t\t}\n\n\t\tif (config.tags !== undefined && config.tags.length > 0) {\n\t\t\tlet found = false;\n\t\t\tif (scriptTags !== undefined) {\n\t\t\t\tfor (const tagToFind of config.tags) {\n\t\t\t\t\tfor (const tag of scriptTags) {\n\t\t\t\t\t\tif (tag === tagToFind) {\n\t\t\t\t\t\t\tscriptFilePaths.push(scriptFilePath);\n\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (found) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tscriptFilePaths.push(scriptFilePath);\n\t\t}\n\t}\n\n\tif (!providedContext) {\n\t\tthrow new Error(`no context loaded`);\n\t}\n\n\tconst {internal, external} = await createEnvironment(config, providedContext);\n\n\tawait internal.recoverTransactionsIfAny();\n\n\tconst scriptsRegisteredToRun: {[filename: string]: boolean} = {};\n\tconst scriptsToRun: Array<{\n\t\tfunc: DeployScriptModule;\n\t\tfilePath: string;\n\t}> = [];\n\tconst scriptsToRunAtTheEnd: Array<{\n\t\tfunc: DeployScriptModule;\n\t\tfilePath: string;\n\t}> = [];\n\tfunction recurseDependencies(scriptFilePath: string) {\n\t\tif (scriptsRegisteredToRun[scriptFilePath]) {\n\t\t\treturn;\n\t\t}\n\t\tconst scriptModule = scriptModuleByFilePath[scriptFilePath];\n\t\tif (scriptModule.dependencies) {\n\t\t\tfor (const dependency of scriptModule.dependencies) {\n\t\t\t\tconst scriptFilePathsToAdd = scriptPathBags[dependency];\n\t\t\t\tif (scriptFilePathsToAdd) {\n\t\t\t\t\tfor (const scriptFilenameToAdd of scriptFilePathsToAdd) {\n\t\t\t\t\t\trecurseDependencies(scriptFilenameToAdd);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!scriptsRegisteredToRun[scriptFilePath]) {\n\t\t\tif (scriptModule.runAtTheEnd) {\n\t\t\t\tscriptsToRunAtTheEnd.push({\n\t\t\t\t\tfilePath: scriptFilePath,\n\t\t\t\t\tfunc: scriptModule,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tscriptsToRun.push({\n\t\t\t\t\tfilePath: scriptFilePath,\n\t\t\t\t\tfunc: scriptModule,\n\t\t\t\t});\n\t\t\t}\n\t\t\tscriptsRegisteredToRun[scriptFilePath] = true;\n\t\t}\n\t}\n\tfor (const scriptFilePath of scriptFilePaths) {\n\t\trecurseDependencies(scriptFilePath);\n\t}\n\n\tfor (const deployScript of scriptsToRun.concat(scriptsToRunAtTheEnd)) {\n\t\tconst filename = path.basename(deployScript.filePath);\n\t\tconst relativeFilepath = path.relative('.', deployScript.filePath);\n\t\t// if (deployScript.func.id && this.db.migrations[deployScript.func.id]) {\n\t\t// \tlogger.info(`skipping ${filename} as migrations already executed and complete`);\n\t\t// \tcontinue;\n\t\t// }\n\t\tlet skip = false;\n\t\tif (deployScript.func.skip) {\n\t\t\tconst spinner = spin(`Executing skipping function from ${filename}`);\n\t\t\ttry {\n\t\t\t\tskip = await deployScript.func.skip(external);\n\t\t\t\tspinner.succeed(skip ? `skipping ${filename}` : undefined);\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\t\tif (!skip) {\n\t\t\tlet result;\n\t\t\tconst spinner = spin(`Executing ${filename}`);\n\t\t\ttry {\n\t\t\t\tresult = await deployScript.func(external);\n\t\t\t\tspinner.succeed(`${filename} execution complete`);\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\tif (result && typeof result === 'boolean') {\n\t\t\t\t// if (!deployScript.func.id) {\n\t\t\t\t// \tthrow new Error(\n\t\t\t\t// \t\t`${deployScript.filePath} return true to not be executed again, but does not provide an id. the script function needs to have the field \"id\" to be set`\n\t\t\t\t// \t);\n\t\t\t\t// }\n\t\t\t\t// this.db.migrations[deployScript.func.id] = Math.floor(Date.now() / 1000);\n\n\t\t\t\tconst deploymentFolderPath = config.deployments;\n\n\t\t\t\t// TODO refactor to extract this whole path and folder existence stuff\n\t\t\t\t// const toSave = this.db.writeDeploymentsToFiles && this.network.saveDeployments;\n\t\t\t\t// if (toSave) {\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tfs.mkdirSync(this.deploymentsPath);\n\t\t\t\t// \t} catch (e) {}\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tfs.mkdirSync(path.join(this.deploymentsPath, deploymentFolderPath));\n\t\t\t\t// \t} catch (e) {}\n\t\t\t\t// \tfs.writeFileSync(\n\t\t\t\t// \t\tpath.join(this.deploymentsPath, deploymentFolderPath, '.migrations.json'),\n\t\t\t\t// \t\tJSON.stringify(this.db.migrations, null, ' ')\n\t\t\t\t// \t);\n\t\t\t\t// }\n\t\t\t}\n\t\t}\n\t}\n\n\treturn external.deployments as Deployments;\n}\n","import fs from 'node:fs';\n\nimport {Transaction, TransactionReceipt, createPublicClient, custom} from 'viem';\nimport {\n\tAccountType,\n\tDeployment,\n\tEnvironment,\n\tNamedSigner,\n\tPendingDeployment,\n\tResolvedAccount,\n\tResolvedConfig,\n\tResolvedNamedAccounts,\n\tResolvedNamedSigners,\n\tUnknownArtifacts,\n\tUnknownDeployments,\n\tUnresolvedUnknownNamedAccounts,\n} from './types';\nimport {JSONRPCHTTPProvider} from 'eip-1193-json-provider';\nimport {Abi} from 'abitype';\nimport {InternalEnvironment} from '../internal/types';\nimport path from 'node:path';\nimport {JSONToString, stringToJSON} from '../utils/json';\nimport {loadDeployments} from './deployments';\nimport {EIP1193Account, EIP1193ProviderWithoutEvents, EIP1193Transaction} from 'eip-1193';\nimport {ProvidedContext} from '../executor/types';\nimport {spin} from '../internal/logging';\n\nexport type EnvironmentExtenstion = (env: Environment) => Environment;\n//we store this globally so this is not lost\n(globalThis as any).extensions = [];\nexport function extendEnvironment(extension: EnvironmentExtenstion): void {\n\t(globalThis as any).extensions.push(extension);\n}\n\nexport type SignerProtocolFunction = (protocolString: string) => Promise<NamedSigner>;\nexport type SignerProtocol = {\n\tgetSigner: SignerProtocolFunction;\n};\n\n//we store this globally so this is not lost\n(globalThis as any).signerProtocols = {};\nexport function handleSignerProtocol(protocol: string, getSigner: SignerProtocolFunction): void {\n\t(globalThis as any).signerProtocols[protocol] = {\n\t\tgetSigner,\n\t};\n}\n\nfunction displayTransaction(transaction: EIP1193Transaction) {\n\tif (transaction.type === '0x2') {\n\t\treturn `(maxFeePerGas: ${BigInt(transaction.maxFeePerGas).toString()}, maxPriorityFeePerGas: ${BigInt(\n\t\t\ttransaction.maxPriorityFeePerGas\n\t\t).toString()})`;\n\t} else {\n\t\treturn `(gasPrice: ${BigInt(transaction.gasPrice).toString()})`;\n\t}\n}\n\nexport async function createEnvironment<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(\n\tconfig: ResolvedConfig,\n\tprovidedContext: ProvidedContext<Artifacts, NamedAccounts>\n): Promise<{internal: InternalEnvironment; external: Environment}> {\n\tconst provider =\n\t\t'provider' in config ? config.provider : (new JSONRPCHTTPProvider(config.nodeUrl) as EIP1193ProviderWithoutEvents);\n\n\tconst transport = custom(provider);\n\tconst viemClient = createPublicClient({transport});\n\n\tconst chainId = (await viemClient.getChainId()).toString();\n\n\tlet networkName: string;\n\tlet saveDeployments: boolean;\n\tlet tags: {[tag: string]: boolean} = {};\n\tif ('nodeUrl' in config) {\n\t\tnetworkName = config.networkName;\n\t\tsaveDeployments = true;\n\t} else {\n\t\tif (config.networkName) {\n\t\t\tnetworkName = config.networkName;\n\t\t} else {\n\t\t\tnetworkName = 'memory';\n\t\t}\n\t\tif (networkName === 'memory' || networkName === 'hardhat') {\n\t\t\ttags['memory'] = true;\n\t\t\tsaveDeployments = false;\n\t\t} else {\n\t\t\tsaveDeployments = true;\n\t\t}\n\t}\n\n\tconst resolvedAccounts: {[name: string]: ResolvedAccount} = {};\n\n\tconst accountCache: {[name: string]: ResolvedAccount} = {};\n\tasync function getAccount(\n\t\tname: string,\n\t\taccounts: UnresolvedUnknownNamedAccounts,\n\t\taccountDef: AccountType\n\t): Promise<ResolvedAccount | undefined> {\n\t\tif (accountCache[name]) {\n\t\t\treturn accountCache[name];\n\t\t}\n\t\tlet account: ResolvedAccount | undefined;\n\t\tif (typeof accountDef === 'number') {\n\t\t\tconst accounts = await provider.request({method: 'eth_accounts'});\n\t\t\tconst accountPerIndex = accounts[accountDef];\n\t\t\tif (accountPerIndex) {\n\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\ttype: 'remote',\n\t\t\t\t\taddress: accountPerIndex,\n\t\t\t\t\tsigner: provider,\n\t\t\t\t};\n\t\t\t}\n\t\t} else if (typeof accountDef === 'string') {\n\t\t\tif (accountDef.startsWith('0x')) {\n\t\t\t\tif (accountDef.length === 66) {\n\t\t\t\t\tconst privateKeyProtocol: SignerProtocol = (globalThis as any).signerProtocols['privateKey'];\n\t\t\t\t\tif (privateKeyProtocol) {\n\t\t\t\t\t\tconst namedSigner = await privateKeyProtocol.getSigner(`privateKey:${accountDef}`);\n\t\t\t\t\t\tconst [address] = await namedSigner.signer.request({method: 'eth_accounts'});\n\t\t\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\t\t\t...namedSigner,\n\t\t\t\t\t\t\taddress,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\t\ttype: 'remote',\n\t\t\t\t\t\taddress: accountDef as `0x${string}`,\n\t\t\t\t\t\tsigner: provider,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (accountDef.indexOf(':') > 0) {\n\t\t\t\t\tconst [protocolID, extra] = accountDef.split(':');\n\t\t\t\t\tconst protocol: SignerProtocol = (globalThis as any).signerProtocols[protocolID];\n\t\t\t\t\tif (!protocol) {\n\t\t\t\t\t\tthrow new Error(`protocol: ${protocol} is not supported`);\n\t\t\t\t\t}\n\t\t\t\t\tconst namedSigner = await protocol.getSigner(accountDef);\n\t\t\t\t\tconst [address] = await namedSigner.signer.request({method: 'eth_accounts'});\n\t\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\t\t...namedSigner,\n\t\t\t\t\t\taddress,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tconst accountFetched = await getAccount(name, accounts, accounts[accountDef]);\n\t\t\t\t\tif (accountFetched) {\n\t\t\t\t\t\taccountCache[name] = account = accountFetched;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst accountForNetwork = accountDef[networkName] || accountDef[chainId] || accountDef['default'];\n\t\t\tif (typeof accountForNetwork !== undefined) {\n\t\t\t\tconst accountFetched = await getAccount(name, accounts, accountForNetwork);\n\t\t\t\tif (accountFetched) {\n\t\t\t\t\taccountCache[name] = account = accountFetched;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn account;\n\t}\n\n\tif (providedContext.accounts) {\n\t\tconst accountNames = Object.keys(providedContext.accounts);\n\t\tfor (const accountName of accountNames) {\n\t\t\tlet account = await getAccount(accountName, providedContext.accounts, providedContext.accounts[accountName]);\n\t\t\t(resolvedAccounts as any)[accountName] = account;\n\t\t}\n\t}\n\n\tconst context = {\n\t\taccounts: resolvedAccounts,\n\t\tartifacts: providedContext.artifacts as Artifacts,\n\t\tnetwork: {\n\t\t\tname: networkName,\n\t\t\tsaveDeployments,\n\t\t\ttags,\n\t\t},\n\t};\n\n\tconst {deployments} = loadDeployments(config.deployments, context.network.name, false, chainId);\n\n\tconst namedAccounts: {[name: string]: EIP1193Account} = {};\n\tconst namedSigners: {[name: string]: NamedSigner} = {};\n\tconst addressSigners: {[name: `0x${string}`]: NamedSigner} = {};\n\n\tfor (const entry of Object.entries(resolvedAccounts)) {\n\t\tconst name = entry[0];\n\t\tconst {address, ...namedSigner} = entry[1];\n\t\tnamedAccounts[name] = address;\n\t\taddressSigners[address] = namedSigner;\n\t\tnamedSigners[name] = namedSigner;\n\t}\n\n\tconst perliminaryEnvironment = {\n\t\tconfig,\n\t\tdeployments: deployments as Deployments,\n\t\taccounts: namedAccounts as ResolvedNamedAccounts<NamedAccounts>,\n\t\tsigners: namedSigners as ResolvedNamedSigners<ResolvedNamedAccounts<NamedAccounts>>,\n\t\taddressSigners: addressSigners,\n\t\tartifacts: context.artifacts,\n\t\tnetwork: {\n\t\t\tchainId,\n\t\t\tname: context.network.name,\n\t\t\ttags: context.network.tags,\n\t\t\tprovider,\n\t\t},\n\t};\n\n\tfunction ensureDeploymentFolder(): string {\n\t\tconst folderPath = path.join(config.deployments, context.network.name);\n\t\tfs.mkdirSync(folderPath, {recursive: true});\n\t\tconst chainIdFilepath = path.join(folderPath, '.chainId');\n\t\tif (!fs.existsSync(chainIdFilepath)) {\n\t\t\tfs.writeFileSync(chainIdFilepath, chainId);\n\t\t}\n\t\treturn folderPath;\n\t}\n\n\t// const signer = {\n\t// \tasync sendTransaction(\n\t// \t\tprovider: EIP1193ProviderWithoutEvents,\n\t// \t\taccount: {\n\t// \t\t\taddresss: EIP1193Account;\n\t// \t\t\tconfig: unknown;\n\t// \t\t},\n\t// \t\ttransaction: EIP1193TransactionEIP1193DATA\n\t// \t): Promise<EIP1193DATA> {\n\t// \t\treturn '0x';\n\t// \t},\n\t// };\n\n\t// async function sendTransaction(transaction: EIP1193TransactionEIP1193DATA): Promise<EIP1193DATA> {\n\t// \treturn '0x';\n\t// }\n\n\tfunction get<TAbi extends Abi>(name: string): Deployment<TAbi> | undefined {\n\t\treturn deployments[name] as Deployment<TAbi> | undefined;\n\t}\n\n\tasync function save<TAbi extends Abi>(name: string, deployment: Deployment<TAbi>): Promise<Deployment<TAbi>> {\n\t\tdeployments[name] = deployment;\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst folderPath = ensureDeploymentFolder();\n\t\t\tfs.writeFileSync(`${folderPath}/${name}.json`, JSONToString(deployment, 2));\n\t\t}\n\t\treturn deployment;\n\t}\n\n\tasync function recoverTransactionsIfAny<TAbi extends Abi = Abi>(): Promise<void> {\n\t\tconst filepath = path.join(config.deployments, context.network.name, '.pending_transactions.json');\n\t\tlet existingPendingDeployments: {name: string; transaction: PendingDeployment<TAbi>}[];\n\t\ttry {\n\t\t\texistingPendingDeployments = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t} catch {\n\t\t\texistingPendingDeployments = [];\n\t\t}\n\t\tif (existingPendingDeployments.length > 0) {\n\t\t\twhile (existingPendingDeployments.length > 0) {\n\t\t\t\tconst pendingTransaction = existingPendingDeployments.shift();\n\t\t\t\tif (pendingTransaction) {\n\t\t\t\t\tconst spinner = spin(\n\t\t\t\t\t\t`recovering ${pendingTransaction.name} with transaction ${pendingTransaction.transaction.txHash}`\n\t\t\t\t\t);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait waitForTransactionAndSave(pendingTransaction.name, pendingTransaction.transaction);\n\t\t\t\t\t\tconsole.log(`transaction ${pendingTransaction.transaction.txHash} complete`);\n\t\t\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingDeployments, 2));\n\t\t\t\t\t\tspinner.succeed();\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tspinner.fail();\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tfs.rmSync(filepath);\n\t\t}\n\t}\n\n\tasync function saveTransaction<TAbi extends Abi = Abi>(name: string, transaction: PendingDeployment<TAbi>) {\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst folderPath = ensureDeploymentFolder();\n\t\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\t\tlet existingPendingDeployments: {name: string; transaction: PendingDeployment<TAbi>}[];\n\t\t\ttry {\n\t\t\t\texistingPendingDeployments = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendingDeployments = [];\n\t\t\t}\n\t\t\texistingPendingDeployments.push({name, transaction});\n\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingDeployments, 2));\n\t\t}\n\t\treturn deployments;\n\t}\n\n\tasync function deleteTransaction<TAbi extends Abi = Abi>(hash: string) {\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst filepath = path.join(config.deployments, context.network.name, '.pending_transactions.json');\n\t\t\tlet existingPendingDeployments: {name: string; transaction: PendingDeployment<TAbi>}[];\n\t\t\ttry {\n\t\t\t\texistingPendingDeployments = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendingDeployments = [];\n\t\t\t}\n\t\t\texistingPendingDeployments = existingPendingDeployments.filter((v) => v.transaction.txHash !== hash);\n\t\t\tif (existingPendingDeployments.length === 0) {\n\t\t\t\tfs.rmSync(filepath);\n\t\t\t} else {\n\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingDeployments, 2));\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function exportDeploymentsAsTypes() {\n\t\tconst folderPath = './generated';\n\t\tfs.mkdirSync(folderPath, {recursive: true});\n\t\tfs.writeFileSync(`${folderPath}/deployments.ts`, `export default ${JSONToString(deployments, 2)} as const;`);\n\t}\n\n\tasync function waitForTransactionAndSave<TAbi extends Abi = Abi>(\n\t\tname: string,\n\t\tpendingDeployment: PendingDeployment<TAbi>,\n\t\ttransaction?: EIP1193Transaction | null\n\t): Promise<Deployment<TAbi>> {\n\t\tconst spinner = spin(`tx ${pendingDeployment.txHash}${transaction ? ` ${displayTransaction(transaction)}` : ''}`);\n\t\tlet receipt: TransactionReceipt;\n\t\ttry {\n\t\t\treceipt = await viemClient.waitForTransactionReceipt({\n\t\t\t\thash: pendingDeployment.txHash,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tspinner.fail();\n\t\t\tthrow e;\n\t\t}\n\t\tif (!receipt) {\n\t\t\tspinner.fail(`receipt for ${pendingDeployment.txHash} not found`);\n\t\t} else {\n\t\t\tspinner.succeed();\n\t\t}\n\n\t\tif (!receipt.contractAddress) {\n\t\t\tthrow new Error(`failed to deploy contract ${name}`);\n\t\t}\n\t\tconst {abi, ...artifactObjectWithoutABI} = pendingDeployment.partialDeployment;\n\n\t\tif (!artifactObjectWithoutABI.nonce) {\n\t\t\tconst spinner = spin(`fetching nonce for ${pendingDeployment.txHash}`);\n\t\t\tlet transaction: EIP1193Transaction | null = null;\n\t\t\ttry {\n\t\t\t\ttransaction = await provider.request({\n\t\t\t\t\tmethod: 'eth_getTransactionByHash',\n\t\t\t\t\tparams: [pendingDeployment.txHash],\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\tif (!transaction) {\n\t\t\t\tspinner.fail(`tx ${pendingDeployment.txHash} not found`);\n\t\t\t} else {\n\t\t\t\tspinner.stop();\n\t\t\t}\n\n\t\t\tif (transaction) {\n\t\t\t\tartifactObjectWithoutABI.nonce = transaction.nonce;\n\t\t\t\tartifactObjectWithoutABI.txOrigin = transaction.from;\n\t\t\t}\n\t\t}\n\n\t\t// TODO options\n\t\tfor (const key of Object.keys(artifactObjectWithoutABI)) {\n\t\t\tif (key.startsWith('_')) {\n\t\t\t\tdelete (artifactObjectWithoutABI as any)[key];\n\t\t\t}\n\t\t\tif (key === 'evm') {\n\t\t\t\tconst {gasEstimates} = artifactObjectWithoutABI.evm;\n\t\t\t\tartifactObjectWithoutABI.evm = {\n\t\t\t\t\tgasEstimates,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst deployment = {\n\t\t\taddress: receipt.contractAddress,\n\t\t\ttxHash: pendingDeployment.txHash,\n\t\t\tabi,\n\t\t\t...artifactObjectWithoutABI,\n\t\t};\n\t\treturn save(name, deployment);\n\t}\n\n\tasync function saveWhilePending<TAbi extends Abi = Abi>(name: string, pendingDeployment: PendingDeployment<TAbi>) {\n\t\tawait saveTransaction<TAbi>(name, pendingDeployment);\n\t\tlet transaction: EIP1193Transaction | null = null;\n\t\tconst spinner = spin(`fetching tx from peers ${pendingDeployment.txHash}`);\n\t\ttry {\n\t\t\ttransaction = await provider.request({\n\t\t\t\tmethod: 'eth_getTransactionByHash',\n\t\t\t\tparams: [pendingDeployment.txHash],\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tspinner.fail();\n\t\t\tthrow e;\n\t\t}\n\t\tif (!transaction) {\n\t\t\tspinner.fail(`tx ${pendingDeployment.txHash} not found`);\n\t\t} else {\n\t\t\tspinner.stop();\n\t\t}\n\n\t\tconst deployment = waitForTransactionAndSave<TAbi>(\n\t\t\tname,\n\t\t\ttransaction\n\t\t\t\t? {\n\t\t\t\t\t\t...pendingDeployment,\n\t\t\t\t\t\tnonce: transaction.nonce,\n\t\t\t\t\t\ttxOrigin: transaction.from,\n\t\t\t\t }\n\t\t\t\t: pendingDeployment,\n\t\t\ttransaction\n\t\t);\n\t\tawait deleteTransaction(pendingDeployment.txHash);\n\t\treturn deployment;\n\t}\n\n\tlet env: Environment<Artifacts, NamedAccounts, Deployments> = {\n\t\t...perliminaryEnvironment,\n\t\tsave,\n\t\tsaveWhilePending,\n\t\tget,\n\t};\n\tfor (const extension of (globalThis as any).extensions) {\n\t\tenv = extension(env);\n\t}\n\n\treturn {\n\t\texternal: env,\n\t\tinternal: {\n\t\t\texportDeploymentsAsTypes,\n\t\t\trecoverTransactionsIfAny,\n\t\t},\n\t};\n}\n","// TODO share with db-utils\nexport function bnReplacer(k: string, v: any): any {\n\tif (typeof v === 'bigint') {\n\t\treturn v.toString() + 'n';\n\t}\n\treturn v;\n}\n\nexport function bnReviver(k: string, v: any): any {\n\tif (\n\t\ttypeof v === 'string' &&\n\t\t(v.startsWith('-') ? !isNaN(parseInt(v.charAt(1))) : !isNaN(parseInt(v.charAt(0)))) &&\n\t\tv.charAt(v.length - 1) === 'n'\n\t) {\n\t\treturn BigInt(v.slice(0, -1));\n\t}\n\treturn v;\n}\n\nexport function JSONToString<T = unknown>(json: unknown, space?: string | number) {\n\treturn JSON.stringify(json, bnReplacer, space);\n}\n\nexport function stringToJSON<T = unknown>(str: string): T {\n\treturn JSON.parse(str, bnReviver);\n}\n","import path from 'node:path';\nimport fs from 'node:fs';\nimport {traverse} from '../utils/fs';\nimport {UnknownDeployments} from './types';\n\nexport function loadDeployments(\n\tdeploymentsPath: string,\n\tsubPath: string,\n\tonlyABIAndAddress?: boolean,\n\texpectedChainId?: string\n): {deployments: UnknownDeployments; chainId?: string} {\n\tconst deploymentsFound: UnknownDeployments = {};\n\tconst deployPath = path.join(deploymentsPath, subPath);\n\n\tlet filesStats;\n\ttry {\n\t\tfilesStats = traverse(deployPath, undefined, undefined, (name) => !name.startsWith('.') && name !== 'solcInputs');\n\t} catch (e) {\n\t\t// console.log('no folder at ' + deployPath);\n\t\treturn {deployments: {}};\n\t}\n\tlet chainId: string;\n\tif (filesStats.length > 0) {\n\t\tconst chainIdFilepath = path.join(deployPath, '.chainId');\n\t\tif (fs.existsSync(chainIdFilepath)) {\n\t\t\tchainId = fs.readFileSync(chainIdFilepath).toString().trim();\n\t\t} else {\n\t\t\tthrow new Error(`A .chainId' file is expected to be present in the deployment folder for network ${subPath}`);\n\t\t}\n\n\t\tif (expectedChainId) {\n\t\t\tif (expectedChainId !== chainId) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Loading deployment in folder '${deployPath}' (with chainId: ${chainId}) for a different chainId (${expectedChainId})`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} else {\n\t\treturn {deployments: {}};\n\t}\n\tlet fileNames = filesStats.map((a) => a.relativePath);\n\tfileNames = fileNames.sort((a, b) => {\n\t\tif (a < b) {\n\t\t\treturn -1;\n\t\t}\n\t\tif (a > b) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t});\n\n\tfor (const fileName of fileNames) {\n\t\tif (fileName.substring(fileName.length - 5) === '.json') {\n\t\t\tconst deploymentFileName = path.join(deployPath, fileName);\n\t\t\tlet deployment = JSON.parse(fs.readFileSync(deploymentFileName).toString());\n\t\t\t// truffleChainId argument:\n\t\t\t// if (!deployment.address && deployment.networks) {\n\t\t\t// \tif (truffleChainId && deployment.networks[truffleChainId]) {\n\t\t\t// \t\t// TRUFFLE support\n\t\t\t// \t\tconst truffleDeployment = deployment as any; // TruffleDeployment;\n\t\t\t// \t\tdeployment.address = truffleDeployment.networks[truffleChainId].address;\n\t\t\t// \t\tdeployment.transactionHash = truffleDeployment.networks[truffleChainId].transactionHash;\n\t\t\t// \t}\n\t\t\t// }\n\t\t\tif (onlyABIAndAddress) {\n\t\t\t\tdeployment = {\n\t\t\t\t\taddress: deployment.address,\n\t\t\t\t\tabi: deployment.abi,\n\t\t\t\t\tlinkedData: deployment.linkedData,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst name = fileName.slice(0, fileName.length - 5);\n\t\t\t// console.log('fetching ' + deploymentFileName + ' for ' + name);\n\n\t\t\tdeploymentsFound[name] = deployment;\n\t\t}\n\t}\n\treturn {deployments: deploymentsFound, chainId};\n}\n","import {logs} from 'named-logs';\n\nimport {hookup, logs as Logging} from 'named-logs-console';\nimport ora from 'ora-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\ntype PartialOra = {\n\tstop(): PartialOra;\n\tsucceed(msg?: string): PartialOra;\n\tfail(msg?: string): PartialOra;\n};\nconst voidSpinner: PartialOra = {\n\tstop() {\n\t\treturn this;\n\t},\n\tsucceed(msg?: string) {\n\t\treturn this;\n\t},\n\tfail(msg?: string) {\n\t\treturn this;\n\t},\n};\n// export function spin(message: string): PartialOra {\n// \treturn Logging.level > 0 ? ora(message).start() : voidSpinner;\n// }\n\nlet lastSpin = ora('rocketh');\nexport function spin(message: string): PartialOra {\n\tif (Logging.level > 0) {\n\t\tlastSpin = lastSpin.start(message);\n\t\treturn lastSpin;\n\t} else {\n\t\treturn voidSpinner;\n\t}\n}\n"],"mappings":"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","names":["path","fs","import_node_path","import_node_fs","import_node_fs","import_node_path","import_node_path","import_node_fs","path","fs","Logging","ora","accounts","path","fs","spinner","transaction","fs","path"]}
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"],"sourcesContent":["export * from './executor';\nexport * from './executor/types';\nexport * from './environment/types';\nexport {extendEnvironment, handleSignerProtocol} from './environment';\nexport {loadDeployments} from './environment/deployments';\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';\n\nrequire('esbuild-register/dist/node').register();\n\nexport function execute<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(\n\tcontext: ProvidedContext<Artifacts, NamedAccounts>,\n\tcallback: DeployScriptFunction<Artifacts, ResolvedNamedAccounts<NamedAccounts>, Deployments>,\n\toptions: {tags?: string[]; dependencies?: string[]}\n): DeployScriptModule<Artifacts, NamedAccounts, Deployments> {\n\tconst scriptModule = (env: Environment<Artifacts, ResolvedNamedAccounts<NamedAccounts>, Deployments>) =>\n\t\tcallback(env);\n\tscriptModule.providedContext = context;\n\tscriptModule.tags = options.tags;\n\tscriptModule.dependencies = options.dependencies;\n\t// TODO id + skip\n\treturn scriptModule as unknown as DeployScriptModule<Artifacts, NamedAccounts, Deployments>;\n}\n\nexport type ConfigOptions = {network: string; deployments?: string; scripts?: string; tags?: string};\n\nexport function readConfig(options: ConfigOptions, extra?: {ignoreMissingRPC?: boolean}): Config {\n\ttype Networks = {[name: string]: {rpcUrl: string}};\n\ttype ConfigFile = {networks: Networks};\n\tlet configFile: ConfigFile | undefined;\n\ttry {\n\t\tconst configString = fs.readFileSync('./rocketh.json', 'utf-8');\n\t\tconfigFile = JSON.parse(configString);\n\t} catch {}\n\n\tlet nodeUrl: string;\n\tconst fromEnv = process.env['ETH_NODE_URI_' + options.network];\n\tif (typeof fromEnv === 'string') {\n\t\tnodeUrl = fromEnv;\n\t} else {\n\t\tif (configFile) {\n\t\t\tconst network = configFile.networks && configFile.networks[options.network];\n\t\t\tif (network) {\n\t\t\t\tnodeUrl = network.rpcUrl;\n\t\t\t} else {\n\t\t\t\tif (extra?.ignoreMissingRPC) {\n\t\t\t\t\tnodeUrl = '';\n\t\t\t\t} else {\n\t\t\t\t\tif (options.network === 'localhost') {\n\t\t\t\t\t\tnodeUrl = 'http://127.0.0.1:8545';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.error(`network \"${options.network}\" is not configured. Please add it to the rocketh.json file`);\n\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (extra?.ignoreMissingRPC) {\n\t\t\t\tnodeUrl = '';\n\t\t\t} else {\n\t\t\t\tif (options.network === 'localhost') {\n\t\t\t\t\tnodeUrl = 'http://127.0.0.1:8545';\n\t\t\t\t} else {\n\t\t\t\t\tlogger.error(`network \"${options.network}\" is not configured. Please add it to the rocketh.json file`);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tnodeUrl,\n\t\tnetworkName: options.network,\n\t\tdeployments: options.deployments,\n\t\tscripts: options.scripts,\n\t\ttags: typeof options.tags === 'undefined' ? undefined : options.tags.split(','),\n\t};\n}\n\nexport function readAndResolveConfig(options: ConfigOptions, extra?: {ignoreMissingRPC?: boolean}): ResolvedConfig {\n\treturn resolveConfig(readConfig(options, extra));\n}\n\nexport function resolveConfig(config: Config): ResolvedConfig {\n\tconst resolvedConfig: ResolvedConfig = {\n\t\t...config,\n\t\tnetworkName: config.networkName || 'memory',\n\t\tdeployments: config.deployments || 'deployments',\n\t\tscripts: config.scripts || 'deploy',\n\t\ttags: config.tags || [],\n\t};\n\treturn resolvedConfig;\n}\n\nexport async function loadAndExecuteDeployments<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(config: Config) {\n\tconst resolvedConfig = resolveConfig(config);\n\n\treturn executeDeployScripts<Artifacts, NamedAccounts, Deployments>(resolvedConfig);\n\n\t// TODO\n\t// await this.export(options);\n}\n\nexport async function executeDeployScripts<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(config: ResolvedConfig): Promise<Deployments> {\n\tsetLogLevel(typeof config.logLevel === 'undefined' ? 0 : config.logLevel);\n\n\tlet filepaths;\n\tfilepaths = traverseMultipleDirectory([config.scripts]);\n\tfilepaths = filepaths\n\t\t.filter((v) => !path.basename(v).startsWith('_'))\n\t\t.sort((a: string, b: string) => {\n\t\t\tif (a < b) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (a > b) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\treturn 0;\n\t\t});\n\n\tlet providedContext: ProvidedContext<Artifacts, NamedAccounts> | undefined;\n\n\tconst scriptModuleByFilePath: {[filename: string]: DeployScriptModule} = {};\n\tconst scriptPathBags: {[tag: string]: string[]} = {};\n\tconst scriptFilePaths: string[] = [];\n\n\tfor (const filepath of filepaths) {\n\t\tconst scriptFilePath = path.resolve(filepath);\n\t\tlet scriptModule: DeployScriptModule;\n\t\ttry {\n\t\t\tif (require.cache) {\n\t\t\t\tdelete require.cache[scriptFilePath]; // ensure we reload it every time, so changes are taken in consideration\n\t\t\t}\n\t\t\tscriptModule = require(scriptFilePath);\n\n\t\t\tif ((scriptModule as any).default) {\n\t\t\t\tscriptModule = (scriptModule as any).default as DeployScriptModule;\n\t\t\t\tif ((scriptModule as any).default) {\n\t\t\t\t\tlogger.warn(`double default...`);\n\t\t\t\t\tscriptModule = (scriptModule as any).default as DeployScriptModule;\n\t\t\t\t}\n\t\t\t}\n\t\t\tscriptModuleByFilePath[scriptFilePath] = scriptModule;\n\t\t\tif (providedContext && providedContext !== scriptModule.providedContext) {\n\t\t\t\tthrow new Error(`context between 2 scripts is different, please share the same across them`);\n\t\t\t}\n\t\t\tprovidedContext = scriptModule.providedContext as ProvidedContext<Artifacts, NamedAccounts>;\n\t\t} catch (e) {\n\t\t\tlogger.error(`could not import ${filepath}`);\n\t\t\tthrow e;\n\t\t}\n\n\t\tlet scriptTags = scriptModule.tags;\n\t\tif (scriptTags !== undefined) {\n\t\t\tif (typeof scriptTags === 'string') {\n\t\t\t\tscriptTags = [scriptTags];\n\t\t\t}\n\t\t\tfor (const tag of scriptTags) {\n\t\t\t\tif (tag.indexOf(',') >= 0) {\n\t\t\t\t\tthrow new Error('Tag cannot contains commas');\n\t\t\t\t}\n\t\t\t\tconst bag = scriptPathBags[tag] || [];\n\t\t\t\tscriptPathBags[tag] = bag;\n\t\t\t\tbag.push(scriptFilePath);\n\t\t\t}\n\t\t}\n\n\t\tif (config.tags !== undefined && config.tags.length > 0) {\n\t\t\tlet found = false;\n\t\t\tif (scriptTags !== undefined) {\n\t\t\t\tfor (const tagToFind of config.tags) {\n\t\t\t\t\tfor (const tag of scriptTags) {\n\t\t\t\t\t\tif (tag === tagToFind) {\n\t\t\t\t\t\t\tscriptFilePaths.push(scriptFilePath);\n\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (found) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tscriptFilePaths.push(scriptFilePath);\n\t\t}\n\t}\n\n\tif (!providedContext) {\n\t\tthrow new Error(`no context loaded`);\n\t}\n\n\tconst {internal, external} = await createEnvironment(config, providedContext);\n\n\tawait internal.recoverTransactionsIfAny();\n\n\tconst scriptsRegisteredToRun: {[filename: string]: boolean} = {};\n\tconst scriptsToRun: Array<{\n\t\tfunc: DeployScriptModule;\n\t\tfilePath: string;\n\t}> = [];\n\tconst scriptsToRunAtTheEnd: Array<{\n\t\tfunc: DeployScriptModule;\n\t\tfilePath: string;\n\t}> = [];\n\tfunction recurseDependencies(scriptFilePath: string) {\n\t\tif (scriptsRegisteredToRun[scriptFilePath]) {\n\t\t\treturn;\n\t\t}\n\t\tconst scriptModule = scriptModuleByFilePath[scriptFilePath];\n\t\tif (scriptModule.dependencies) {\n\t\t\tfor (const dependency of scriptModule.dependencies) {\n\t\t\t\tconst scriptFilePathsToAdd = scriptPathBags[dependency];\n\t\t\t\tif (scriptFilePathsToAdd) {\n\t\t\t\t\tfor (const scriptFilenameToAdd of scriptFilePathsToAdd) {\n\t\t\t\t\t\trecurseDependencies(scriptFilenameToAdd);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!scriptsRegisteredToRun[scriptFilePath]) {\n\t\t\tif (scriptModule.runAtTheEnd) {\n\t\t\t\tscriptsToRunAtTheEnd.push({\n\t\t\t\t\tfilePath: scriptFilePath,\n\t\t\t\t\tfunc: scriptModule,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tscriptsToRun.push({\n\t\t\t\t\tfilePath: scriptFilePath,\n\t\t\t\t\tfunc: scriptModule,\n\t\t\t\t});\n\t\t\t}\n\t\t\tscriptsRegisteredToRun[scriptFilePath] = true;\n\t\t}\n\t}\n\tfor (const scriptFilePath of scriptFilePaths) {\n\t\trecurseDependencies(scriptFilePath);\n\t}\n\n\tfor (const deployScript of scriptsToRun.concat(scriptsToRunAtTheEnd)) {\n\t\tconst filename = path.basename(deployScript.filePath);\n\t\tconst relativeFilepath = path.relative('.', deployScript.filePath);\n\t\t// if (deployScript.func.id && this.db.migrations[deployScript.func.id]) {\n\t\t// \tlogger.info(`skipping ${filename} as migrations already executed and complete`);\n\t\t// \tcontinue;\n\t\t// }\n\t\tlet skip = false;\n\t\tif (deployScript.func.skip) {\n\t\t\tconst spinner = spin(`Executing skipping function from ${filename}`);\n\t\t\ttry {\n\t\t\t\tskip = await deployScript.func.skip(external);\n\t\t\t\tspinner.succeed(skip ? `skipping ${filename}` : undefined);\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\t\tif (!skip) {\n\t\t\tlet result;\n\t\t\tconst spinner = spin(`Executing ${filename}`);\n\t\t\ttry {\n\t\t\t\tresult = await deployScript.func(external);\n\t\t\t\tspinner.succeed(`${filename} execution complete`);\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\tif (result && typeof result === 'boolean') {\n\t\t\t\t// if (!deployScript.func.id) {\n\t\t\t\t// \tthrow new Error(\n\t\t\t\t// \t\t`${deployScript.filePath} return true to not be executed again, but does not provide an id. the script function needs to have the field \"id\" to be set`\n\t\t\t\t// \t);\n\t\t\t\t// }\n\t\t\t\t// this.db.migrations[deployScript.func.id] = Math.floor(Date.now() / 1000);\n\n\t\t\t\tconst deploymentFolderPath = config.deployments;\n\n\t\t\t\t// TODO refactor to extract this whole path and folder existence stuff\n\t\t\t\t// const toSave = this.db.writeDeploymentsToFiles && this.network.saveDeployments;\n\t\t\t\t// if (toSave) {\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tfs.mkdirSync(this.deploymentsPath);\n\t\t\t\t// \t} catch (e) {}\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tfs.mkdirSync(path.join(this.deploymentsPath, deploymentFolderPath));\n\t\t\t\t// \t} catch (e) {}\n\t\t\t\t// \tfs.writeFileSync(\n\t\t\t\t// \t\tpath.join(this.deploymentsPath, deploymentFolderPath, '.migrations.json'),\n\t\t\t\t// \t\tJSON.stringify(this.db.migrations, null, ' ')\n\t\t\t\t// \t);\n\t\t\t\t// }\n\t\t\t}\n\t\t}\n\t}\n\n\treturn external.deployments as Deployments;\n}\n","import fs from 'node:fs';\n\nimport {Transaction, TransactionReceipt, createPublicClient, custom} from 'viem';\nimport {\n\tAccountType,\n\tDeployment,\n\tEnvironment,\n\tNamedSigner,\n\tPendingDeployment,\n\tResolvedAccount,\n\tResolvedConfig,\n\tResolvedNamedAccounts,\n\tResolvedNamedSigners,\n\tUnknownArtifacts,\n\tUnknownDeployments,\n\tUnresolvedUnknownNamedAccounts,\n} from './types';\nimport {JSONRPCHTTPProvider} from 'eip-1193-json-provider';\nimport {Abi} from 'abitype';\nimport {InternalEnvironment} from '../internal/types';\nimport path from 'node:path';\nimport {JSONToString, stringToJSON} from '../utils/json';\nimport {loadDeployments} from './deployments';\nimport {EIP1193Account, EIP1193ProviderWithoutEvents, EIP1193Transaction} from 'eip-1193';\nimport {ProvidedContext} from '../executor/types';\nimport {spin} from '../internal/logging';\n\nexport type EnvironmentExtenstion = (env: Environment) => Environment;\n//we store this globally so this is not lost\n(globalThis as any).extensions = [];\nexport function extendEnvironment(extension: EnvironmentExtenstion): void {\n\t(globalThis as any).extensions.push(extension);\n}\n\nexport type SignerProtocolFunction = (protocolString: string) => Promise<NamedSigner>;\nexport type SignerProtocol = {\n\tgetSigner: SignerProtocolFunction;\n};\n\n//we store this globally so this is not lost\n(globalThis as any).signerProtocols = {};\nexport function handleSignerProtocol(protocol: string, getSigner: SignerProtocolFunction): void {\n\t(globalThis as any).signerProtocols[protocol] = {\n\t\tgetSigner,\n\t};\n}\n\nfunction displayTransaction(transaction: EIP1193Transaction) {\n\tif (transaction.type === '0x2') {\n\t\treturn `(maxFeePerGas: ${BigInt(transaction.maxFeePerGas).toString()}, maxPriorityFeePerGas: ${BigInt(\n\t\t\ttransaction.maxPriorityFeePerGas\n\t\t).toString()})`;\n\t} else {\n\t\treturn `(gasPrice: ${BigInt(transaction.gasPrice).toString()})`;\n\t}\n}\n\nexport async function createEnvironment<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(\n\tconfig: ResolvedConfig,\n\tprovidedContext: ProvidedContext<Artifacts, NamedAccounts>\n): Promise<{internal: InternalEnvironment; external: Environment}> {\n\tconst provider =\n\t\t'provider' in config ? config.provider : (new JSONRPCHTTPProvider(config.nodeUrl) as EIP1193ProviderWithoutEvents);\n\n\tconst transport = custom(provider);\n\tconst viemClient = createPublicClient({transport});\n\n\tconst chainId = (await viemClient.getChainId()).toString();\n\n\tlet networkName: string;\n\tlet saveDeployments: boolean;\n\tlet tags: {[tag: string]: boolean} = {};\n\tif ('nodeUrl' in config) {\n\t\tnetworkName = config.networkName;\n\t\tsaveDeployments = true;\n\t} else {\n\t\tif (config.networkName) {\n\t\t\tnetworkName = config.networkName;\n\t\t} else {\n\t\t\tnetworkName = 'memory';\n\t\t}\n\t\tif (networkName === 'memory' || networkName === 'hardhat') {\n\t\t\ttags['memory'] = true;\n\t\t\tsaveDeployments = false;\n\t\t} else {\n\t\t\tsaveDeployments = true;\n\t\t}\n\t}\n\n\tconst resolvedAccounts: {[name: string]: ResolvedAccount} = {};\n\n\tconst accountCache: {[name: string]: ResolvedAccount} = {};\n\tasync function getAccount(\n\t\tname: string,\n\t\taccounts: UnresolvedUnknownNamedAccounts,\n\t\taccountDef: AccountType\n\t): Promise<ResolvedAccount | undefined> {\n\t\tif (accountCache[name]) {\n\t\t\treturn accountCache[name];\n\t\t}\n\t\tlet account: ResolvedAccount | undefined;\n\t\tif (typeof accountDef === 'number') {\n\t\t\tconst accounts = await provider.request({method: 'eth_accounts'});\n\t\t\tconst accountPerIndex = accounts[accountDef];\n\t\t\tif (accountPerIndex) {\n\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\ttype: 'remote',\n\t\t\t\t\taddress: accountPerIndex,\n\t\t\t\t\tsigner: provider,\n\t\t\t\t};\n\t\t\t}\n\t\t} else if (typeof accountDef === 'string') {\n\t\t\tif (accountDef.startsWith('0x')) {\n\t\t\t\tif (accountDef.length === 66) {\n\t\t\t\t\tconst privateKeyProtocol: SignerProtocol = (globalThis as any).signerProtocols['privateKey'];\n\t\t\t\t\tif (privateKeyProtocol) {\n\t\t\t\t\t\tconst namedSigner = await privateKeyProtocol.getSigner(`privateKey:${accountDef}`);\n\t\t\t\t\t\tconst [address] = await namedSigner.signer.request({method: 'eth_accounts'});\n\t\t\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\t\t\t...namedSigner,\n\t\t\t\t\t\t\taddress,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\t\ttype: 'remote',\n\t\t\t\t\t\taddress: accountDef as `0x${string}`,\n\t\t\t\t\t\tsigner: provider,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (accountDef.indexOf(':') > 0) {\n\t\t\t\t\tconst [protocolID, extra] = accountDef.split(':');\n\t\t\t\t\tconst protocol: SignerProtocol = (globalThis as any).signerProtocols[protocolID];\n\t\t\t\t\tif (!protocol) {\n\t\t\t\t\t\tthrow new Error(`protocol: ${protocol} is not supported`);\n\t\t\t\t\t}\n\t\t\t\t\tconst namedSigner = await protocol.getSigner(accountDef);\n\t\t\t\t\tconst [address] = await namedSigner.signer.request({method: 'eth_accounts'});\n\t\t\t\t\taccountCache[name] = account = {\n\t\t\t\t\t\t...namedSigner,\n\t\t\t\t\t\taddress,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tconst accountFetched = await getAccount(name, accounts, accounts[accountDef]);\n\t\t\t\t\tif (accountFetched) {\n\t\t\t\t\t\taccountCache[name] = account = accountFetched;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst accountForNetwork = accountDef[networkName] || accountDef[chainId] || accountDef['default'];\n\t\t\tif (typeof accountForNetwork !== undefined) {\n\t\t\t\tconst accountFetched = await getAccount(name, accounts, accountForNetwork);\n\t\t\t\tif (accountFetched) {\n\t\t\t\t\taccountCache[name] = account = accountFetched;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn account;\n\t}\n\n\tif (providedContext.accounts) {\n\t\tconst accountNames = Object.keys(providedContext.accounts);\n\t\tfor (const accountName of accountNames) {\n\t\t\tlet account = await getAccount(accountName, providedContext.accounts, providedContext.accounts[accountName]);\n\t\t\t(resolvedAccounts as any)[accountName] = account;\n\t\t}\n\t}\n\n\tconst context = {\n\t\taccounts: resolvedAccounts,\n\t\tartifacts: providedContext.artifacts as Artifacts,\n\t\tnetwork: {\n\t\t\tname: networkName,\n\t\t\tsaveDeployments,\n\t\t\ttags,\n\t\t},\n\t};\n\n\tconst {deployments} = loadDeployments(config.deployments, context.network.name, false, chainId);\n\n\tconst namedAccounts: {[name: string]: EIP1193Account} = {};\n\tconst namedSigners: {[name: string]: NamedSigner} = {};\n\tconst addressSigners: {[name: `0x${string}`]: NamedSigner} = {};\n\n\tfor (const entry of Object.entries(resolvedAccounts)) {\n\t\tconst name = entry[0];\n\t\tconst {address, ...namedSigner} = entry[1];\n\t\tnamedAccounts[name] = address;\n\t\taddressSigners[address] = namedSigner;\n\t\tnamedSigners[name] = namedSigner;\n\t}\n\n\tconst perliminaryEnvironment = {\n\t\tconfig,\n\t\tdeployments: deployments as Deployments,\n\t\taccounts: namedAccounts as ResolvedNamedAccounts<NamedAccounts>,\n\t\tsigners: namedSigners as ResolvedNamedSigners<ResolvedNamedAccounts<NamedAccounts>>,\n\t\taddressSigners: addressSigners,\n\t\tartifacts: context.artifacts,\n\t\tnetwork: {\n\t\t\tchainId,\n\t\t\tname: context.network.name,\n\t\t\ttags: context.network.tags,\n\t\t\tprovider,\n\t\t},\n\t};\n\n\tfunction ensureDeploymentFolder(): string {\n\t\tconst folderPath = path.join(config.deployments, context.network.name);\n\t\tfs.mkdirSync(folderPath, {recursive: true});\n\t\tconst chainIdFilepath = path.join(folderPath, '.chainId');\n\t\tif (!fs.existsSync(chainIdFilepath)) {\n\t\t\tfs.writeFileSync(chainIdFilepath, chainId);\n\t\t}\n\t\treturn folderPath;\n\t}\n\n\t// const signer = {\n\t// \tasync sendTransaction(\n\t// \t\tprovider: EIP1193ProviderWithoutEvents,\n\t// \t\taccount: {\n\t// \t\t\taddresss: EIP1193Account;\n\t// \t\t\tconfig: unknown;\n\t// \t\t},\n\t// \t\ttransaction: EIP1193TransactionEIP1193DATA\n\t// \t): Promise<EIP1193DATA> {\n\t// \t\treturn '0x';\n\t// \t},\n\t// };\n\n\t// async function sendTransaction(transaction: EIP1193TransactionEIP1193DATA): Promise<EIP1193DATA> {\n\t// \treturn '0x';\n\t// }\n\n\tfunction get<TAbi extends Abi>(name: string): Deployment<TAbi> | undefined {\n\t\treturn deployments[name] as Deployment<TAbi> | undefined;\n\t}\n\n\tasync function save<TAbi extends Abi>(name: string, deployment: Deployment<TAbi>): Promise<Deployment<TAbi>> {\n\t\tdeployments[name] = deployment;\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst folderPath = ensureDeploymentFolder();\n\t\t\tfs.writeFileSync(`${folderPath}/${name}.json`, JSONToString(deployment, 2));\n\t\t}\n\t\treturn deployment;\n\t}\n\n\tasync function recoverTransactionsIfAny<TAbi extends Abi = Abi>(): Promise<void> {\n\t\tconst filepath = path.join(config.deployments, context.network.name, '.pending_transactions.json');\n\t\tlet existingPendingDeployments: {name: string; transaction: PendingDeployment<TAbi>}[];\n\t\ttry {\n\t\t\texistingPendingDeployments = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t} catch {\n\t\t\texistingPendingDeployments = [];\n\t\t}\n\t\tif (existingPendingDeployments.length > 0) {\n\t\t\twhile (existingPendingDeployments.length > 0) {\n\t\t\t\tconst pendingTransaction = existingPendingDeployments.shift();\n\t\t\t\tif (pendingTransaction) {\n\t\t\t\t\tconst spinner = spin(\n\t\t\t\t\t\t`recovering ${pendingTransaction.name} with transaction ${pendingTransaction.transaction.txHash}`\n\t\t\t\t\t);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait waitForTransactionAndSave(pendingTransaction.name, pendingTransaction.transaction);\n\t\t\t\t\t\tconsole.log(`transaction ${pendingTransaction.transaction.txHash} complete`);\n\t\t\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingDeployments, 2));\n\t\t\t\t\t\tspinner.succeed();\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tspinner.fail();\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tfs.rmSync(filepath);\n\t\t}\n\t}\n\n\tasync function saveTransaction<TAbi extends Abi = Abi>(name: string, transaction: PendingDeployment<TAbi>) {\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst folderPath = ensureDeploymentFolder();\n\t\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\t\tlet existingPendingDeployments: {name: string; transaction: PendingDeployment<TAbi>}[];\n\t\t\ttry {\n\t\t\t\texistingPendingDeployments = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendingDeployments = [];\n\t\t\t}\n\t\t\texistingPendingDeployments.push({name, transaction});\n\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingDeployments, 2));\n\t\t}\n\t\treturn deployments;\n\t}\n\n\tasync function deleteTransaction<TAbi extends Abi = Abi>(hash: string) {\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst filepath = path.join(config.deployments, context.network.name, '.pending_transactions.json');\n\t\t\tlet existingPendingDeployments: {name: string; transaction: PendingDeployment<TAbi>}[];\n\t\t\ttry {\n\t\t\t\texistingPendingDeployments = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendingDeployments = [];\n\t\t\t}\n\t\t\texistingPendingDeployments = existingPendingDeployments.filter((v) => v.transaction.txHash !== hash);\n\t\t\tif (existingPendingDeployments.length === 0) {\n\t\t\t\tfs.rmSync(filepath);\n\t\t\t} else {\n\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingDeployments, 2));\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function exportDeploymentsAsTypes() {\n\t\tconst folderPath = './generated';\n\t\tfs.mkdirSync(folderPath, {recursive: true});\n\t\tfs.writeFileSync(`${folderPath}/deployments.ts`, `export default ${JSONToString(deployments, 2)} as const;`);\n\t}\n\n\tasync function waitForTransactionAndSave<TAbi extends Abi = Abi>(\n\t\tname: string,\n\t\tpendingDeployment: PendingDeployment<TAbi>,\n\t\ttransaction?: EIP1193Transaction | null\n\t): Promise<Deployment<TAbi>> {\n\t\tconst spinner = spin(`tx ${pendingDeployment.txHash}${transaction ? ` ${displayTransaction(transaction)}` : ''}`);\n\t\tlet receipt: TransactionReceipt;\n\t\ttry {\n\t\t\treceipt = await viemClient.waitForTransactionReceipt({\n\t\t\t\thash: pendingDeployment.txHash,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tspinner.fail();\n\t\t\tthrow e;\n\t\t}\n\t\tif (!receipt) {\n\t\t\tspinner.fail(`receipt for ${pendingDeployment.txHash} not found`);\n\t\t} else {\n\t\t\tspinner.succeed();\n\t\t}\n\n\t\tif (!receipt.contractAddress) {\n\t\t\tthrow new Error(`failed to deploy contract ${name}`);\n\t\t}\n\t\tconst {abi, ...artifactObjectWithoutABI} = pendingDeployment.partialDeployment;\n\n\t\tif (!artifactObjectWithoutABI.nonce) {\n\t\t\tconst spinner = spin(); // 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.txHash],\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\tif (!transaction) {\n\t\t\t\tspinner.fail(`tx ${pendingDeployment.txHash} not found`);\n\t\t\t} else {\n\t\t\t\tspinner.stop();\n\t\t\t}\n\n\t\t\tif (transaction) {\n\t\t\t\tartifactObjectWithoutABI.nonce = transaction.nonce;\n\t\t\t\tartifactObjectWithoutABI.txOrigin = transaction.from;\n\t\t\t}\n\t\t}\n\n\t\t// TODO options\n\t\tfor (const key of Object.keys(artifactObjectWithoutABI)) {\n\t\t\tif (key.startsWith('_')) {\n\t\t\t\tdelete (artifactObjectWithoutABI as any)[key];\n\t\t\t}\n\t\t\tif (key === 'evm') {\n\t\t\t\tconst {gasEstimates} = artifactObjectWithoutABI.evm;\n\t\t\t\tartifactObjectWithoutABI.evm = {\n\t\t\t\t\tgasEstimates,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst deployment = {\n\t\t\taddress: receipt.contractAddress,\n\t\t\ttxHash: pendingDeployment.txHash,\n\t\t\tabi,\n\t\t\t...artifactObjectWithoutABI,\n\t\t};\n\t\treturn save(name, deployment);\n\t}\n\n\tasync function saveWhilePending<TAbi extends Abi = Abi>(name: string, pendingDeployment: PendingDeployment<TAbi>) {\n\t\tawait saveTransaction<TAbi>(name, pendingDeployment);\n\t\tlet transaction: EIP1193Transaction | null = null;\n\t\tconst spinner = spin(); // 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.txHash],\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tspinner.fail();\n\t\t\tthrow e;\n\t\t}\n\t\tif (!transaction) {\n\t\t\tspinner.fail(`tx ${pendingDeployment.txHash} not found`);\n\t\t} else {\n\t\t\tspinner.stop();\n\t\t}\n\n\t\tconst deployment = waitForTransactionAndSave<TAbi>(\n\t\t\tname,\n\t\t\ttransaction\n\t\t\t\t? {\n\t\t\t\t\t\t...pendingDeployment,\n\t\t\t\t\t\tnonce: transaction.nonce,\n\t\t\t\t\t\ttxOrigin: transaction.from,\n\t\t\t\t }\n\t\t\t\t: pendingDeployment,\n\t\t\ttransaction\n\t\t);\n\t\tawait deleteTransaction(pendingDeployment.txHash);\n\t\treturn deployment;\n\t}\n\n\tlet env: Environment<Artifacts, NamedAccounts, Deployments> = {\n\t\t...perliminaryEnvironment,\n\t\tsave,\n\t\tsaveWhilePending,\n\t\tget,\n\t};\n\tfor (const extension of (globalThis as any).extensions) {\n\t\tenv = extension(env);\n\t}\n\n\treturn {\n\t\texternal: env,\n\t\tinternal: {\n\t\t\texportDeploymentsAsTypes,\n\t\t\trecoverTransactionsIfAny,\n\t\t},\n\t};\n}\n","// TODO share with db-utils\nexport function bnReplacer(k: string, v: any): any {\n\tif (typeof v === 'bigint') {\n\t\treturn v.toString() + 'n';\n\t}\n\treturn v;\n}\n\nexport function bnReviver(k: string, v: any): any {\n\tif (\n\t\ttypeof v === 'string' &&\n\t\t(v.startsWith('-') ? !isNaN(parseInt(v.charAt(1))) : !isNaN(parseInt(v.charAt(0)))) &&\n\t\tv.charAt(v.length - 1) === 'n'\n\t) {\n\t\treturn BigInt(v.slice(0, -1));\n\t}\n\treturn v;\n}\n\nexport function JSONToString<T = unknown>(json: unknown, space?: string | number) {\n\treturn JSON.stringify(json, bnReplacer, space);\n}\n\nexport function stringToJSON<T = unknown>(str: string): T {\n\treturn JSON.parse(str, bnReviver);\n}\n","import path from 'node:path';\nimport fs from 'node:fs';\nimport {traverse} from '../utils/fs';\nimport {UnknownDeployments} from './types';\n\nexport function loadDeployments(\n\tdeploymentsPath: string,\n\tsubPath: string,\n\tonlyABIAndAddress?: boolean,\n\texpectedChainId?: string\n): {deployments: UnknownDeployments; chainId?: string} {\n\tconst deploymentsFound: UnknownDeployments = {};\n\tconst deployPath = path.join(deploymentsPath, subPath);\n\n\tlet filesStats;\n\ttry {\n\t\tfilesStats = traverse(deployPath, undefined, undefined, (name) => !name.startsWith('.') && name !== 'solcInputs');\n\t} catch (e) {\n\t\t// console.log('no folder at ' + deployPath);\n\t\treturn {deployments: {}};\n\t}\n\tlet chainId: string;\n\tif (filesStats.length > 0) {\n\t\tconst chainIdFilepath = path.join(deployPath, '.chainId');\n\t\tif (fs.existsSync(chainIdFilepath)) {\n\t\t\tchainId = fs.readFileSync(chainIdFilepath).toString().trim();\n\t\t} else {\n\t\t\tthrow new Error(`A .chainId' file is expected to be present in the deployment folder for network ${subPath}`);\n\t\t}\n\n\t\tif (expectedChainId) {\n\t\t\tif (expectedChainId !== chainId) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Loading deployment in folder '${deployPath}' (with chainId: ${chainId}) for a different chainId (${expectedChainId})`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} else {\n\t\treturn {deployments: {}};\n\t}\n\tlet fileNames = filesStats.map((a) => a.relativePath);\n\tfileNames = fileNames.sort((a, b) => {\n\t\tif (a < b) {\n\t\t\treturn -1;\n\t\t}\n\t\tif (a > b) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t});\n\n\tfor (const fileName of fileNames) {\n\t\tif (fileName.substring(fileName.length - 5) === '.json') {\n\t\t\tconst deploymentFileName = path.join(deployPath, fileName);\n\t\t\tlet deployment = JSON.parse(fs.readFileSync(deploymentFileName).toString());\n\t\t\t// truffleChainId argument:\n\t\t\t// if (!deployment.address && deployment.networks) {\n\t\t\t// \tif (truffleChainId && deployment.networks[truffleChainId]) {\n\t\t\t// \t\t// TRUFFLE support\n\t\t\t// \t\tconst truffleDeployment = deployment as any; // TruffleDeployment;\n\t\t\t// \t\tdeployment.address = truffleDeployment.networks[truffleChainId].address;\n\t\t\t// \t\tdeployment.transactionHash = truffleDeployment.networks[truffleChainId].transactionHash;\n\t\t\t// \t}\n\t\t\t// }\n\t\t\tif (onlyABIAndAddress) {\n\t\t\t\tdeployment = {\n\t\t\t\t\taddress: deployment.address,\n\t\t\t\t\tabi: deployment.abi,\n\t\t\t\t\tlinkedData: deployment.linkedData,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst name = fileName.slice(0, fileName.length - 5);\n\t\t\t// console.log('fetching ' + deploymentFileName + ' for ' + name);\n\n\t\t\tdeploymentsFound[name] = deployment;\n\t\t}\n\t}\n\treturn {deployments: deploymentsFound, chainId};\n}\n","import {logs} from 'named-logs';\n\nimport {hookup, logs as Logging} from 'named-logs-console';\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\ntype PartialOra = {\n\tstart(msg?: string): PartialOra;\n\tstop(): PartialOra;\n\tsucceed(msg?: string): PartialOra;\n\tfail(msg?: string): PartialOra;\n};\nconst voidSpinner: PartialOra = {\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\tconsole.log(msg);\n\t\treturn this;\n\t},\n\tfail(msg?: string) {\n\t\tconsole.error(msg);\n\t\treturn this;\n\t},\n};\n// export function spin(message: string): PartialOra {\n// \treturn Logging.level > 0 ? ora(message).start() : voidSpinner;\n// }\n\n// let lastSpin = ora('rocketh');\nlet lastSpin = voidSpinner;\nexport function spin(message?: string): PartialOra {\n\tif (Logging.level > 0) {\n\t\tlastSpin = lastSpin.start(message);\n\t\treturn lastSpin;\n\t} else {\n\t\treturn voidSpinner;\n\t}\n}\n"],"mappings":"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","names":["path","fs","import_node_path","import_node_fs","import_node_fs","import_node_path","import_node_path","import_node_fs","path","fs","Logging","accounts","path","fs","spinner","transaction","fs","path"]}
package/dist/index.js CHANGED
@@ -8,7 +8,7 @@ import {
8
8
  readAndResolveConfig,
9
9
  readConfig,
10
10
  resolveConfig
11
- } from "./chunk-OMYXSYJQ.js";
11
+ } from "./chunk-OUY6QCZ4.js";
12
12
  export {
13
13
  execute,
14
14
  executeDeployScripts,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rocketh",
3
- "version": "0.5.7",
3
+ "version": "0.5.9",
4
4
  "description": "deploy smart contract on ethereum-compatible networks",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -32,7 +32,6 @@
32
32
  "ldenv": "^0.3.5",
33
33
  "named-logs": "^0.2.2",
34
34
  "named-logs-console": "^0.2.3",
35
- "ora-cjs": "^0.0.2",
36
35
  "viem": "^0.3.50"
37
36
  },
38
37
  "scripts": {
@@ -349,7 +349,7 @@ export async function createEnvironment<
349
349
  const {abi, ...artifactObjectWithoutABI} = pendingDeployment.partialDeployment;
350
350
 
351
351
  if (!artifactObjectWithoutABI.nonce) {
352
- const spinner = spin(`fetching nonce for ${pendingDeployment.txHash}`);
352
+ const spinner = spin(); // TODO spin(`fetching nonce for ${pendingDeployment.txHash}`);
353
353
  let transaction: EIP1193Transaction | null = null;
354
354
  try {
355
355
  transaction = await provider.request({
@@ -397,7 +397,7 @@ export async function createEnvironment<
397
397
  async function saveWhilePending<TAbi extends Abi = Abi>(name: string, pendingDeployment: PendingDeployment<TAbi>) {
398
398
  await saveTransaction<TAbi>(name, pendingDeployment);
399
399
  let transaction: EIP1193Transaction | null = null;
400
- const spinner = spin(`fetching tx from peers ${pendingDeployment.txHash}`);
400
+ const spinner = spin(); // TODO spin(`fetching tx from peers ${pendingDeployment.txHash}`);
401
401
  try {
402
402
  transaction = await provider.request({
403
403
  method: 'eth_getTransactionByHash',
@@ -1,7 +1,7 @@
1
1
  import {logs} from 'named-logs';
2
2
 
3
3
  import {hookup, logs as Logging} from 'named-logs-console';
4
- import ora from 'ora-cjs';
4
+ // import ora from 'ora-cjs';
5
5
  hookup();
6
6
 
7
7
  export function setLogLevel(level: number) {
@@ -16,18 +16,27 @@ export function setLogLevel(level: number) {
16
16
  export const logger = logs('rocketh');
17
17
 
18
18
  type PartialOra = {
19
+ start(msg?: string): PartialOra;
19
20
  stop(): PartialOra;
20
21
  succeed(msg?: string): PartialOra;
21
22
  fail(msg?: string): PartialOra;
22
23
  };
23
24
  const voidSpinner: PartialOra = {
25
+ start(msg?: string) {
26
+ if (msg) {
27
+ console.log(msg);
28
+ }
29
+ return this;
30
+ },
24
31
  stop() {
25
32
  return this;
26
33
  },
27
34
  succeed(msg?: string) {
35
+ console.log(msg);
28
36
  return this;
29
37
  },
30
38
  fail(msg?: string) {
39
+ console.error(msg);
31
40
  return this;
32
41
  },
33
42
  };
@@ -35,8 +44,9 @@ const voidSpinner: PartialOra = {
35
44
  // return Logging.level > 0 ? ora(message).start() : voidSpinner;
36
45
  // }
37
46
 
38
- let lastSpin = ora('rocketh');
39
- export function spin(message: string): PartialOra {
47
+ // let lastSpin = ora('rocketh');
48
+ let lastSpin = voidSpinner;
49
+ export function spin(message?: string): PartialOra {
40
50
  if (Logging.level > 0) {
41
51
  lastSpin = lastSpin.start(message);
42
52
  return lastSpin;