rocketh 0.5.16 → 0.5.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # rocketh
2
2
 
3
+ ## 0.5.17
4
+
5
+ ### Patch Changes
6
+
7
+ - skip tx recovery when saveDeployments=false
8
+
3
9
  ## 0.5.16
4
10
 
5
11
  ### Patch Changes
@@ -354,6 +354,9 @@ async function createEnvironment(config, providedContext) {
354
354
  return deployment;
355
355
  }
356
356
  async function recoverTransactionsIfAny() {
357
+ if (!context.network.saveDeployments) {
358
+ return;
359
+ }
357
360
  const folderPath = ensureDeploymentFolder();
358
361
  const filepath = path3.join(folderPath, ".pending_transactions.json");
359
362
  let existingPendingTansactions;
@@ -819,4 +822,4 @@ export {
819
822
  loadAndExecuteDeployments,
820
823
  executeDeployScripts
821
824
  };
822
- //# sourceMappingURL=chunk-NV3PV2YD.js.map
825
+ //# sourceMappingURL=chunk-2P2ZLJOB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/fs.ts","../src/executor/index.ts","../src/environment/index.ts","../src/utils/json.ts","../src/environment/deployments.ts","../src/internal/logging.ts"],"sourcesContent":["// taken from https://github.com/vitejs/vite/blob/63524bac878e8d3771d34ad7ad2e10cd16870ff4/packages/vite/src/node/utils.ts#L371-L400\nimport fs from 'node:fs';\nimport path from 'node:path';\n\ninterface LookupFileOptions {\n\tpathOnly?: boolean;\n\trootDir?: string;\n\tpredicate?: (file: string) => boolean;\n}\n\nexport function lookupFile(dir: string, formats: string[], options?: LookupFileOptions): string | undefined {\n\tfor (const format of formats) {\n\t\tconst fullPath = path.join(dir, format);\n\t\tif (fs.existsSync(fullPath) && fs.statSync(fullPath).isFile()) {\n\t\t\tconst result = options?.pathOnly ? fullPath : fs.readFileSync(fullPath, 'utf-8');\n\t\t\tif (!options?.predicate || options.predicate(result)) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t}\n\tconst parentDir = path.dirname(dir);\n\tif (parentDir !== dir && (!options?.rootDir || parentDir.startsWith(options?.rootDir))) {\n\t\treturn lookupFile(parentDir, formats, options);\n\t}\n}\n\nexport function traverseMultipleDirectory(dirs: string[]): string[] {\n\tconst filepaths = [];\n\tfor (const dir of dirs) {\n\t\tlet filesStats = traverse(dir);\n\t\tfilesStats = filesStats.filter((v) => !v.directory);\n\t\tfor (const filestat of filesStats) {\n\t\t\tfilepaths.push(path.join(dir, filestat.relativePath));\n\t\t}\n\t}\n\treturn filepaths;\n}\n\nexport const traverse = function (\n\tdir: string,\n\tresult: any[] = [],\n\ttopDir?: string,\n\tfilter?: (name: string, stats: any) => boolean // TODO any is Stats\n): Array<{\n\tname: string;\n\tpath: string;\n\trelativePath: string;\n\tmtimeMs: number;\n\tdirectory: boolean;\n}> {\n\tfs.readdirSync(dir).forEach((name) => {\n\t\tconst fPath = path.resolve(dir, name);\n\t\tconst stats = fs.statSync(fPath);\n\t\tif ((!filter && !name.startsWith('.')) || (filter && filter(name, stats))) {\n\t\t\tconst fileStats = {\n\t\t\t\tname,\n\t\t\t\tpath: fPath,\n\t\t\t\trelativePath: path.relative(topDir || dir, fPath),\n\t\t\t\tmtimeMs: stats.mtimeMs,\n\t\t\t\tdirectory: stats.isDirectory(),\n\t\t\t};\n\t\t\tif (fileStats.directory) {\n\t\t\t\tresult.push(fileStats);\n\t\t\t\treturn traverse(fPath, result, topDir || dir, filter);\n\t\t\t}\n\t\t\tresult.push(fileStats);\n\t\t}\n\t});\n\treturn result;\n};\n","import {traverseMultipleDirectory} from '../utils/fs';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport type {\n\tConfig,\n\tEnvironment,\n\tResolvedConfig,\n\tResolvedNamedAccounts,\n\tUnknownArtifacts,\n\tUnknownDeployments,\n\tUnresolvedUnknownNamedAccounts,\n} from '../environment/types';\nimport {createEnvironment} from '../environment';\nimport {DeployScriptFunction, DeployScriptModule, ProvidedContext} from './types';\nimport {logger, setLogLevel, spin} from '../internal/logging';\n\nrequire('esbuild-register/dist/node').register();\n\nexport function execute<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(\n\tcontext: ProvidedContext<Artifacts, NamedAccounts>,\n\tcallback: DeployScriptFunction<Artifacts, ResolvedNamedAccounts<NamedAccounts>, Deployments>,\n\toptions: {tags?: string[]; dependencies?: string[]}\n): DeployScriptModule<Artifacts, NamedAccounts, Deployments> {\n\tconst scriptModule = (env: Environment<Artifacts, ResolvedNamedAccounts<NamedAccounts>, Deployments>) =>\n\t\tcallback(env);\n\tscriptModule.providedContext = context;\n\tscriptModule.tags = options.tags;\n\tscriptModule.dependencies = options.dependencies;\n\t// TODO id + skip\n\treturn scriptModule as unknown as DeployScriptModule<Artifacts, NamedAccounts, Deployments>;\n}\n\nexport type ConfigOptions = {network: string; deployments?: string; scripts?: string; tags?: string};\n\nexport function readConfig(options: ConfigOptions, extra?: {ignoreMissingRPC?: boolean}): Config {\n\ttype Networks = {[name: string]: {rpcUrl: string}};\n\ttype ConfigFile = {networks: Networks};\n\tlet configFile: ConfigFile | undefined;\n\ttry {\n\t\tconst configString = fs.readFileSync('./rocketh.json', 'utf-8');\n\t\tconfigFile = JSON.parse(configString);\n\t} catch {}\n\n\tlet nodeUrl: string;\n\tconst fromEnv = process.env['ETH_NODE_URI_' + options.network];\n\tif (typeof fromEnv === 'string') {\n\t\tnodeUrl = fromEnv;\n\t} else {\n\t\tif (configFile) {\n\t\t\tconst network = configFile.networks && configFile.networks[options.network];\n\t\t\tif (network) {\n\t\t\t\tnodeUrl = network.rpcUrl;\n\t\t\t} else {\n\t\t\t\tif (extra?.ignoreMissingRPC) {\n\t\t\t\t\tnodeUrl = '';\n\t\t\t\t} else {\n\t\t\t\t\tif (options.network === 'localhost') {\n\t\t\t\t\t\tnodeUrl = 'http://127.0.0.1:8545';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.error(`network \"${options.network}\" is not configured. Please add it to the rocketh.json file`);\n\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (extra?.ignoreMissingRPC) {\n\t\t\t\tnodeUrl = '';\n\t\t\t} else {\n\t\t\t\tif (options.network === 'localhost') {\n\t\t\t\t\tnodeUrl = 'http://127.0.0.1:8545';\n\t\t\t\t} else {\n\t\t\t\t\tlogger.error(`network \"${options.network}\" is not configured. Please add it to the rocketh.json file`);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tnodeUrl,\n\t\tnetworkName: options.network,\n\t\tdeployments: options.deployments,\n\t\tscripts: options.scripts,\n\t\ttags: typeof options.tags === 'undefined' ? undefined : options.tags.split(','),\n\t};\n}\n\nexport function readAndResolveConfig(options: ConfigOptions, extra?: {ignoreMissingRPC?: boolean}): ResolvedConfig {\n\treturn resolveConfig(readConfig(options, extra));\n}\n\nexport function resolveConfig(config: Config): ResolvedConfig {\n\tconst resolvedConfig: ResolvedConfig = {\n\t\t...config,\n\t\tnetworkName: config.networkName || 'memory',\n\t\tdeployments: config.deployments || 'deployments',\n\t\tscripts: config.scripts || 'deploy',\n\t\ttags: config.tags || [],\n\t};\n\treturn resolvedConfig;\n}\n\nexport async function loadAndExecuteDeployments<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(config: Config): Promise<Environment> {\n\tconst resolvedConfig = resolveConfig(config);\n\treturn executeDeployScripts<Artifacts, NamedAccounts, Deployments>(resolvedConfig);\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<Environment> {\n\tsetLogLevel(typeof config.logLevel === 'undefined' ? 0 : config.logLevel);\n\n\tlet filepaths;\n\tfilepaths = traverseMultipleDirectory([config.scripts]);\n\tfilepaths = filepaths\n\t\t.filter((v) => !path.basename(v).startsWith('_'))\n\t\t.sort((a: string, b: string) => {\n\t\t\tif (a < b) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (a > b) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\treturn 0;\n\t\t});\n\n\tlet providedContext: ProvidedContext<Artifacts, NamedAccounts> | undefined;\n\n\tconst scriptModuleByFilePath: {[filename: string]: DeployScriptModule} = {};\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\tconst spinner = spin(`- Executing ${filename}`);\n\t\tif (deployScript.func.skip) {\n\t\t\tconst spinner = spin(` - skip?()`);\n\t\t\ttry {\n\t\t\t\tskip = await deployScript.func.skip(external);\n\t\t\t\tspinner.succeed(skip ? `skipping ${filename}` : undefined);\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\t\tif (!skip) {\n\t\t\tlet result;\n\n\t\t\ttry {\n\t\t\t\tresult = await deployScript.func(external);\n\t\t\t\tspinner.succeed(`\\n`);\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\tif (result && typeof result === 'boolean') {\n\t\t\t\t// if (!deployScript.func.id) {\n\t\t\t\t// \tthrow new Error(\n\t\t\t\t// \t\t`${deployScript.filePath} return true to not be executed again, but does not provide an id. the script function needs to have the field \"id\" to be set`\n\t\t\t\t// \t);\n\t\t\t\t// }\n\t\t\t\t// this.db.migrations[deployScript.func.id] = Math.floor(Date.now() / 1000);\n\n\t\t\t\tconst deploymentFolderPath = config.deployments;\n\n\t\t\t\t// TODO refactor to extract this whole path and folder existence stuff\n\t\t\t\t// const toSave = this.db.writeDeploymentsToFiles && this.network.saveDeployments;\n\t\t\t\t// if (toSave) {\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tfs.mkdirSync(this.deploymentsPath);\n\t\t\t\t// \t} catch (e) {}\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tfs.mkdirSync(path.join(this.deploymentsPath, deploymentFolderPath));\n\t\t\t\t// \t} catch (e) {}\n\t\t\t\t// \tfs.writeFileSync(\n\t\t\t\t// \t\tpath.join(this.deploymentsPath, deploymentFolderPath, '.migrations.json'),\n\t\t\t\t// \t\tJSON.stringify(this.db.migrations, null, ' ')\n\t\t\t\t// \t);\n\t\t\t\t// }\n\t\t\t}\n\t\t}\n\t}\n\n\treturn external;\n}\n","import fs from 'node:fs';\n\nimport {TransactionReceipt, createPublicClient, custom} from 'viem';\nimport {\n\tAccountType,\n\tDeployment,\n\tEnvironment,\n\tNamedSigner,\n\tPendingDeployment,\n\tPendingTransaction,\n\tResolvedAccount,\n\tResolvedConfig,\n\tResolvedNamedAccounts,\n\tResolvedNamedSigners,\n\tUnknownArtifacts,\n\tUnknownDeployments,\n\tUnresolvedUnknownNamedAccounts,\n} from './types';\nimport {JSONRPCHTTPProvider} from 'eip-1193-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 {\n\tEIP1193Account,\n\tEIP1193DATA,\n\tEIP1193ProviderWithoutEvents,\n\tEIP1193Transaction,\n\tEIP1193TransactionReceipt,\n} from 'eip-1193';\nimport {ProvidedContext} from '../executor/types';\nimport {spin} from '../internal/logging';\nimport {PendingExecution} from './types';\n\nexport type EnvironmentExtenstion = (env: Environment) => Environment;\n//we store this globally so this is not lost\n(globalThis as any).extensions = [];\nexport function extendEnvironment(extension: EnvironmentExtenstion): void {\n\t(globalThis as any).extensions.push(extension);\n}\n\nexport type SignerProtocolFunction = (protocolString: string) => Promise<NamedSigner>;\nexport type SignerProtocol = {\n\tgetSigner: SignerProtocolFunction;\n};\n\n//we store this globally so this is not lost\n(globalThis as any).signerProtocols = {};\nexport function handleSignerProtocol(protocol: string, getSigner: SignerProtocolFunction): void {\n\t(globalThis as any).signerProtocols[protocol] = {\n\t\tgetSigner,\n\t};\n}\n\nfunction wait(numSeconds: number): Promise<void> {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(resolve, numSeconds * 1000);\n\t});\n}\n\nfunction displayTransaction(transaction: EIP1193Transaction) {\n\tif (transaction.type === '0x2') {\n\t\treturn `(maxFeePerGas: ${BigInt(transaction.maxFeePerGas).toString()}, maxPriorityFeePerGas: ${BigInt(\n\t\t\ttransaction.maxPriorityFeePerGas\n\t\t).toString()})`;\n\t} else {\n\t\treturn `(gasPrice: ${BigInt(transaction.gasPrice).toString()})`;\n\t}\n}\n\nexport async function createEnvironment<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(\n\tconfig: ResolvedConfig,\n\tprovidedContext: ProvidedContext<Artifacts, NamedAccounts>\n): Promise<{internal: InternalEnvironment; external: Environment}> {\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\tif (!context.network.saveDeployments) {\n\t\t\treturn;\n\t\t}\n\t\tconst folderPath = ensureDeploymentFolder();\n\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\tlet existingPendingTansactions: PendingTransaction[];\n\t\ttry {\n\t\t\texistingPendingTansactions = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t} catch {\n\t\t\texistingPendingTansactions = [];\n\t\t}\n\t\tif (existingPendingTansactions.length > 0) {\n\t\t\twhile (existingPendingTansactions.length > 0) {\n\t\t\t\tconst pendingTransaction = existingPendingTansactions.shift();\n\t\t\t\tif (pendingTransaction) {\n\t\t\t\t\tif (pendingTransaction.type === 'deployment') {\n\t\t\t\t\t\tconst spinner = spin(`recovering ${pendingTransaction.name} with transaction ${pendingTransaction.txHash}`);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait waitForDeploymentTransactionAndSave(pendingTransaction);\n\t\t\t\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingTansactions, 2));\n\t\t\t\t\t\t\tspinner.succeed();\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tspinner.fail();\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst spinner = spin(`recovering execution's transaction ${pendingTransaction.txHash}`);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait waitForTransaction(pendingTransaction.txHash);\n\t\t\t\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingTansactions, 2));\n\t\t\t\t\t\t\tspinner.succeed();\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tspinner.fail();\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tfs.rmSync(filepath);\n\t\t}\n\t}\n\n\tasync function savePendingTransaction(pendingTransaction: PendingTransaction) {\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst folderPath = ensureDeploymentFolder();\n\t\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\t\tlet existingPendinTransactions: PendingTransaction[];\n\t\t\ttry {\n\t\t\t\texistingPendinTransactions = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendinTransactions = [];\n\t\t\t}\n\t\t\texistingPendinTransactions.push(pendingTransaction);\n\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendinTransactions, 2));\n\t\t}\n\t\treturn deployments;\n\t}\n\n\tasync function waitForTransactionReceipt(params: {\n\t\thash: EIP1193DATA;\n\t\t// confirmations?: number; // TODO\n\t\tpollingInterval?: number;\n\t\t// timeout?: number; // TODO\n\t}): Promise<EIP1193TransactionReceipt> {\n\t\t// const {hash, confirmations, pollingInterval, timeout} = {confirmations: 1, pollingInterval: 1, ...params};\n\t\tconst {hash, pollingInterval} = {pollingInterval: 1, ...params};\n\n\t\tlet receipt = await provider.request({\n\t\t\tmethod: 'eth_getTransactionReceipt',\n\t\t\tparams: [hash],\n\t\t});\n\t\tif (!receipt || !receipt.blockHash) {\n\t\t\tawait wait(pollingInterval);\n\t\t\treturn waitForTransactionReceipt(params);\n\t\t}\n\t\treturn receipt;\n\t}\n\n\tasync function deleteTransaction<TAbi extends Abi = Abi>(hash: string) {\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst folderPath = ensureDeploymentFolder();\n\t\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\t\tlet existingPendinTransactions: PendingTransaction[];\n\t\t\ttry {\n\t\t\t\texistingPendinTransactions = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendinTransactions = [];\n\t\t\t}\n\t\t\texistingPendinTransactions = existingPendinTransactions.filter((v) => v.txHash !== hash);\n\t\t\tif (existingPendinTransactions.length === 0) {\n\t\t\t\tfs.rmSync(filepath);\n\t\t\t} else {\n\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendinTransactions, 2));\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function exportDeploymentsAsTypes() {\n\t\tconst folderPath = './generated';\n\t\tfs.mkdirSync(folderPath, {recursive: true});\n\t\tfs.writeFileSync(`${folderPath}/deployments.ts`, `export default ${JSONToString(deployments, 2)} as const;`);\n\t}\n\n\tasync function waitForTransaction(\n\t\thash: `0x${string}`,\n\t\tinfo?: {message?: string; transaction?: EIP1193Transaction | null}\n\t): Promise<EIP1193TransactionReceipt> {\n\t\tconst spinner = spin(\n\t\t\tinfo?.message\n\t\t\t\t? info.message\n\t\t\t\t: ` - Broadcasting tx:\\n ${hash}${\n\t\t\t\t\t\tinfo?.transaction ? `\\n ${displayTransaction(info?.transaction)}` : ''\n\t\t\t\t }`\n\t\t);\n\t\tlet receipt: EIP1193TransactionReceipt;\n\t\ttry {\n\t\t\treceipt = await waitForTransactionReceipt({\n\t\t\t\thash,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tspinner.fail();\n\t\t\tthrow e;\n\t\t}\n\t\tif (!receipt) {\n\t\t\tthrow new Error(`receipt for ${hash} not found`);\n\t\t} else {\n\t\t\tspinner.succeed();\n\t\t}\n\t\treturn receipt;\n\t}\n\n\tasync function waitForDeploymentTransactionAndSave<TAbi extends Abi = Abi>(\n\t\tpendingDeployment: PendingDeployment<TAbi>,\n\t\ttransaction?: EIP1193Transaction | null\n\t): Promise<Deployment<TAbi>> {\n\t\tconst message = ` - Deploying ${pendingDeployment.name} with tx:\\n ${pendingDeployment.txHash}${\n\t\t\ttransaction ? `\\n ${displayTransaction(transaction)}` : ''\n\t\t}`;\n\t\tconst receipt = await waitForTransaction(pendingDeployment.txHash, {message, transaction});\n\n\t\tif (!receipt.contractAddress) {\n\t\t\tthrow new Error(`failed to deploy contract ${pendingDeployment.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(pendingDeployment.name, deployment);\n\t}\n\n\tasync function savePendingExecution(pendingExecution: PendingExecution) {\n\t\tawait savePendingTransaction(pendingExecution);\n\t\tlet transaction: EIP1193Transaction | null = null;\n\t\tconst spinner = spin(); // TODO spin(`fetching tx from peers ${pendingDeployment.txHash}`);\n\t\ttry {\n\t\t\ttransaction = await provider.request({\n\t\t\t\tmethod: 'eth_getTransactionByHash',\n\t\t\t\tparams: [pendingExecution.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 ${pendingExecution.txHash} not found`);\n\t\t} else {\n\t\t\tspinner.stop();\n\t\t}\n\n\t\tif (transaction) {\n\t\t\tpendingExecution.nonce = transaction.nonce;\n\t\t\tpendingExecution.txOrigin = transaction.from;\n\t\t}\n\n\t\tconst receipt = await waitForTransaction(pendingExecution.txHash, {transaction});\n\t\tawait deleteTransaction(pendingExecution.txHash);\n\t\treturn receipt;\n\t}\n\n\tasync function savePendingDeployment<TAbi extends Abi = Abi>(pendingDeployment: PendingDeployment<TAbi>) {\n\t\tawait savePendingTransaction(pendingDeployment);\n\t\tlet transaction: EIP1193Transaction | null = null;\n\t\tconst spinner = spin(); // TODO spin(`fetching tx from peers ${pendingDeployment.txHash}`);\n\t\ttry {\n\t\t\ttransaction = await provider.request({\n\t\t\t\tmethod: 'eth_getTransactionByHash',\n\t\t\t\tparams: [pendingDeployment.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\tif (transaction) {\n\t\t\t// we update the tx data with the one we get from the network\n\t\t\tpendingDeployment = {...pendingDeployment, nonce: transaction.nonce, txOrigin: transaction.from};\n\t\t}\n\n\t\tconst deployment = await waitForDeploymentTransactionAndSave<TAbi>(pendingDeployment, transaction);\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\tsavePendingDeployment,\n\t\tsavePendingExecution,\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\tif (msg) {\n\t\t\tconsole.log(msg);\n\t\t}\n\t\treturn this;\n\t},\n\tfail(msg?: string) {\n\t\tif (msg) {\n\t\t\tconsole.error(msg);\n\t\t}\n\t\treturn this;\n\t},\n};\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","transaction","fs","path","spinner"]}
package/dist/cli.cjs CHANGED
@@ -366,6 +366,9 @@ async function createEnvironment(config2, providedContext) {
366
366
  return deployment;
367
367
  }
368
368
  async function recoverTransactionsIfAny() {
369
+ if (!context.network.saveDeployments) {
370
+ return;
371
+ }
369
372
  const folderPath = ensureDeploymentFolder();
370
373
  const filepath = import_node_path3.default.join(folderPath, ".pending_transactions.json");
371
374
  let existingPendingTansactions;
@@ -816,7 +819,7 @@ var import_commander = require("commander");
816
819
  // package.json
817
820
  var package_default = {
818
821
  name: "rocketh",
819
- version: "0.5.15",
822
+ version: "0.5.17",
820
823
  description: "deploy smart contract on ethereum-compatible networks",
821
824
  publishConfig: {
822
825
  access: "public"
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): Promise<Environment> {\n\tconst resolvedConfig = resolveConfig(config);\n\treturn executeDeployScripts<Artifacts, NamedAccounts, Deployments>(resolvedConfig);\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<Environment> {\n\tsetLogLevel(typeof config.logLevel === 'undefined' ? 0 : config.logLevel);\n\n\tlet filepaths;\n\tfilepaths = traverseMultipleDirectory([config.scripts]);\n\tfilepaths = filepaths\n\t\t.filter((v) => !path.basename(v).startsWith('_'))\n\t\t.sort((a: string, b: string) => {\n\t\t\tif (a < b) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (a > b) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\treturn 0;\n\t\t});\n\n\tlet providedContext: ProvidedContext<Artifacts, NamedAccounts> | undefined;\n\n\tconst scriptModuleByFilePath: {[filename: string]: DeployScriptModule} = {};\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\tconst spinner = spin(`- Executing ${filename}`);\n\t\tif (deployScript.func.skip) {\n\t\t\tconst spinner = spin(` - skip?()`);\n\t\t\ttry {\n\t\t\t\tskip = await deployScript.func.skip(external);\n\t\t\t\tspinner.succeed(skip ? `skipping ${filename}` : undefined);\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\t\tif (!skip) {\n\t\t\tlet result;\n\n\t\t\ttry {\n\t\t\t\tresult = await deployScript.func(external);\n\t\t\t\tspinner.succeed(`\\n`);\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\tif (result && typeof result === 'boolean') {\n\t\t\t\t// if (!deployScript.func.id) {\n\t\t\t\t// \tthrow new Error(\n\t\t\t\t// \t\t`${deployScript.filePath} return true to not be executed again, but does not provide an id. the script function needs to have the field \"id\" to be set`\n\t\t\t\t// \t);\n\t\t\t\t// }\n\t\t\t\t// this.db.migrations[deployScript.func.id] = Math.floor(Date.now() / 1000);\n\n\t\t\t\tconst deploymentFolderPath = config.deployments;\n\n\t\t\t\t// TODO refactor to extract this whole path and folder existence stuff\n\t\t\t\t// const toSave = this.db.writeDeploymentsToFiles && this.network.saveDeployments;\n\t\t\t\t// if (toSave) {\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tfs.mkdirSync(this.deploymentsPath);\n\t\t\t\t// \t} catch (e) {}\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tfs.mkdirSync(path.join(this.deploymentsPath, deploymentFolderPath));\n\t\t\t\t// \t} catch (e) {}\n\t\t\t\t// \tfs.writeFileSync(\n\t\t\t\t// \t\tpath.join(this.deploymentsPath, deploymentFolderPath, '.migrations.json'),\n\t\t\t\t// \t\tJSON.stringify(this.db.migrations, null, ' ')\n\t\t\t\t// \t);\n\t\t\t\t// }\n\t\t\t}\n\t\t}\n\t}\n\n\treturn external;\n}\n","import fs from 'node:fs';\n\nimport {TransactionReceipt, createPublicClient, custom} from 'viem';\nimport {\n\tAccountType,\n\tDeployment,\n\tEnvironment,\n\tNamedSigner,\n\tPendingDeployment,\n\tPendingTransaction,\n\tResolvedAccount,\n\tResolvedConfig,\n\tResolvedNamedAccounts,\n\tResolvedNamedSigners,\n\tUnknownArtifacts,\n\tUnknownDeployments,\n\tUnresolvedUnknownNamedAccounts,\n} from './types';\nimport {JSONRPCHTTPProvider} from 'eip-1193-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 {\n\tEIP1193Account,\n\tEIP1193DATA,\n\tEIP1193ProviderWithoutEvents,\n\tEIP1193Transaction,\n\tEIP1193TransactionReceipt,\n} from 'eip-1193';\nimport {ProvidedContext} from '../executor/types';\nimport {spin} from '../internal/logging';\nimport {PendingExecution} from './types';\n\nexport type EnvironmentExtenstion = (env: Environment) => Environment;\n//we store this globally so this is not lost\n(globalThis as any).extensions = [];\nexport function extendEnvironment(extension: EnvironmentExtenstion): void {\n\t(globalThis as any).extensions.push(extension);\n}\n\nexport type SignerProtocolFunction = (protocolString: string) => Promise<NamedSigner>;\nexport type SignerProtocol = {\n\tgetSigner: SignerProtocolFunction;\n};\n\n//we store this globally so this is not lost\n(globalThis as any).signerProtocols = {};\nexport function handleSignerProtocol(protocol: string, getSigner: SignerProtocolFunction): void {\n\t(globalThis as any).signerProtocols[protocol] = {\n\t\tgetSigner,\n\t};\n}\n\nfunction wait(numSeconds: number): Promise<void> {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(resolve, numSeconds * 1000);\n\t});\n}\n\nfunction displayTransaction(transaction: EIP1193Transaction) {\n\tif (transaction.type === '0x2') {\n\t\treturn `(maxFeePerGas: ${BigInt(transaction.maxFeePerGas).toString()}, maxPriorityFeePerGas: ${BigInt(\n\t\t\ttransaction.maxPriorityFeePerGas\n\t\t).toString()})`;\n\t} else {\n\t\treturn `(gasPrice: ${BigInt(transaction.gasPrice).toString()})`;\n\t}\n}\n\nexport async function createEnvironment<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(\n\tconfig: ResolvedConfig,\n\tprovidedContext: ProvidedContext<Artifacts, NamedAccounts>\n): Promise<{internal: InternalEnvironment; external: Environment}> {\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 folderPath = ensureDeploymentFolder();\n\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\tlet existingPendingTansactions: PendingTransaction[];\n\t\ttry {\n\t\t\texistingPendingTansactions = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t} catch {\n\t\t\texistingPendingTansactions = [];\n\t\t}\n\t\tif (existingPendingTansactions.length > 0) {\n\t\t\twhile (existingPendingTansactions.length > 0) {\n\t\t\t\tconst pendingTransaction = existingPendingTansactions.shift();\n\t\t\t\tif (pendingTransaction) {\n\t\t\t\t\tif (pendingTransaction.type === 'deployment') {\n\t\t\t\t\t\tconst spinner = spin(`recovering ${pendingTransaction.name} with transaction ${pendingTransaction.txHash}`);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait waitForDeploymentTransactionAndSave(pendingTransaction);\n\t\t\t\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingTansactions, 2));\n\t\t\t\t\t\t\tspinner.succeed();\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tspinner.fail();\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst spinner = spin(`recovering execution's transaction ${pendingTransaction.txHash}`);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait waitForTransaction(pendingTransaction.txHash);\n\t\t\t\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingTansactions, 2));\n\t\t\t\t\t\t\tspinner.succeed();\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tspinner.fail();\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tfs.rmSync(filepath);\n\t\t}\n\t}\n\n\tasync function savePendingTransaction(pendingTransaction: PendingTransaction) {\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst folderPath = ensureDeploymentFolder();\n\t\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\t\tlet existingPendinTransactions: PendingTransaction[];\n\t\t\ttry {\n\t\t\t\texistingPendinTransactions = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendinTransactions = [];\n\t\t\t}\n\t\t\texistingPendinTransactions.push(pendingTransaction);\n\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendinTransactions, 2));\n\t\t}\n\t\treturn deployments;\n\t}\n\n\tasync function waitForTransactionReceipt(params: {\n\t\thash: EIP1193DATA;\n\t\t// confirmations?: number; // TODO\n\t\tpollingInterval?: number;\n\t\t// timeout?: number; // TODO\n\t}): Promise<EIP1193TransactionReceipt> {\n\t\t// const {hash, confirmations, pollingInterval, timeout} = {confirmations: 1, pollingInterval: 1, ...params};\n\t\tconst {hash, pollingInterval} = {pollingInterval: 1, ...params};\n\n\t\tlet receipt = await provider.request({\n\t\t\tmethod: 'eth_getTransactionReceipt',\n\t\t\tparams: [hash],\n\t\t});\n\t\tif (!receipt || !receipt.blockHash) {\n\t\t\tawait wait(pollingInterval);\n\t\t\treturn waitForTransactionReceipt(params);\n\t\t}\n\t\treturn receipt;\n\t}\n\n\tasync function deleteTransaction<TAbi extends Abi = Abi>(hash: string) {\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst folderPath = ensureDeploymentFolder();\n\t\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\t\tlet existingPendinTransactions: PendingTransaction[];\n\t\t\ttry {\n\t\t\t\texistingPendinTransactions = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendinTransactions = [];\n\t\t\t}\n\t\t\texistingPendinTransactions = existingPendinTransactions.filter((v) => v.txHash !== hash);\n\t\t\tif (existingPendinTransactions.length === 0) {\n\t\t\t\tfs.rmSync(filepath);\n\t\t\t} else {\n\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendinTransactions, 2));\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function exportDeploymentsAsTypes() {\n\t\tconst folderPath = './generated';\n\t\tfs.mkdirSync(folderPath, {recursive: true});\n\t\tfs.writeFileSync(`${folderPath}/deployments.ts`, `export default ${JSONToString(deployments, 2)} as const;`);\n\t}\n\n\tasync function waitForTransaction(\n\t\thash: `0x${string}`,\n\t\tinfo?: {message?: string; transaction?: EIP1193Transaction | null}\n\t): Promise<EIP1193TransactionReceipt> {\n\t\tconst spinner = spin(\n\t\t\tinfo?.message\n\t\t\t\t? info.message\n\t\t\t\t: ` - Broadcasting tx:\\n ${hash}${\n\t\t\t\t\t\tinfo?.transaction ? `\\n ${displayTransaction(info?.transaction)}` : ''\n\t\t\t\t }`\n\t\t);\n\t\tlet receipt: EIP1193TransactionReceipt;\n\t\ttry {\n\t\t\treceipt = await waitForTransactionReceipt({\n\t\t\t\thash,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tspinner.fail();\n\t\t\tthrow e;\n\t\t}\n\t\tif (!receipt) {\n\t\t\tthrow new Error(`receipt for ${hash} not found`);\n\t\t} else {\n\t\t\tspinner.succeed();\n\t\t}\n\t\treturn receipt;\n\t}\n\n\tasync function waitForDeploymentTransactionAndSave<TAbi extends Abi = Abi>(\n\t\tpendingDeployment: PendingDeployment<TAbi>,\n\t\ttransaction?: EIP1193Transaction | null\n\t): Promise<Deployment<TAbi>> {\n\t\tconst message = ` - Deploying ${pendingDeployment.name} with tx:\\n ${pendingDeployment.txHash}${\n\t\t\ttransaction ? `\\n ${displayTransaction(transaction)}` : ''\n\t\t}`;\n\t\tconst receipt = await waitForTransaction(pendingDeployment.txHash, {message, transaction});\n\n\t\tif (!receipt.contractAddress) {\n\t\t\tthrow new Error(`failed to deploy contract ${pendingDeployment.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(pendingDeployment.name, deployment);\n\t}\n\n\tasync function savePendingExecution(pendingExecution: PendingExecution) {\n\t\tawait savePendingTransaction(pendingExecution);\n\t\tlet transaction: EIP1193Transaction | null = null;\n\t\tconst spinner = spin(); // TODO spin(`fetching tx from peers ${pendingDeployment.txHash}`);\n\t\ttry {\n\t\t\ttransaction = await provider.request({\n\t\t\t\tmethod: 'eth_getTransactionByHash',\n\t\t\t\tparams: [pendingExecution.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 ${pendingExecution.txHash} not found`);\n\t\t} else {\n\t\t\tspinner.stop();\n\t\t}\n\n\t\tif (transaction) {\n\t\t\tpendingExecution.nonce = transaction.nonce;\n\t\t\tpendingExecution.txOrigin = transaction.from;\n\t\t}\n\n\t\tconst receipt = await waitForTransaction(pendingExecution.txHash, {transaction});\n\t\tawait deleteTransaction(pendingExecution.txHash);\n\t\treturn receipt;\n\t}\n\n\tasync function savePendingDeployment<TAbi extends Abi = Abi>(pendingDeployment: PendingDeployment<TAbi>) {\n\t\tawait savePendingTransaction(pendingDeployment);\n\t\tlet transaction: EIP1193Transaction | null = null;\n\t\tconst spinner = spin(); // TODO spin(`fetching tx from peers ${pendingDeployment.txHash}`);\n\t\ttry {\n\t\t\ttransaction = await provider.request({\n\t\t\t\tmethod: 'eth_getTransactionByHash',\n\t\t\t\tparams: [pendingDeployment.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\tif (transaction) {\n\t\t\t// we update the tx data with the one we get from the network\n\t\t\tpendingDeployment = {...pendingDeployment, nonce: transaction.nonce, txOrigin: transaction.from};\n\t\t}\n\n\t\tconst deployment = await waitForDeploymentTransactionAndSave<TAbi>(pendingDeployment, transaction);\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\tsavePendingDeployment,\n\t\tsavePendingExecution,\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\tif (msg) {\n\t\t\tconsole.log(msg);\n\t\t}\n\t\treturn this;\n\t},\n\tfail(msg?: string) {\n\t\tif (msg) {\n\t\t\tconsole.error(msg);\n\t\t}\n\t\treturn this;\n\t},\n};\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.15\",\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","transaction","options","fs","config","path","spinner"]}
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): Promise<Environment> {\n\tconst resolvedConfig = resolveConfig(config);\n\treturn executeDeployScripts<Artifacts, NamedAccounts, Deployments>(resolvedConfig);\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<Environment> {\n\tsetLogLevel(typeof config.logLevel === 'undefined' ? 0 : config.logLevel);\n\n\tlet filepaths;\n\tfilepaths = traverseMultipleDirectory([config.scripts]);\n\tfilepaths = filepaths\n\t\t.filter((v) => !path.basename(v).startsWith('_'))\n\t\t.sort((a: string, b: string) => {\n\t\t\tif (a < b) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (a > b) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\treturn 0;\n\t\t});\n\n\tlet providedContext: ProvidedContext<Artifacts, NamedAccounts> | undefined;\n\n\tconst scriptModuleByFilePath: {[filename: string]: DeployScriptModule} = {};\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\tconst spinner = spin(`- Executing ${filename}`);\n\t\tif (deployScript.func.skip) {\n\t\t\tconst spinner = spin(` - skip?()`);\n\t\t\ttry {\n\t\t\t\tskip = await deployScript.func.skip(external);\n\t\t\t\tspinner.succeed(skip ? `skipping ${filename}` : undefined);\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\t\tif (!skip) {\n\t\t\tlet result;\n\n\t\t\ttry {\n\t\t\t\tresult = await deployScript.func(external);\n\t\t\t\tspinner.succeed(`\\n`);\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\tif (result && typeof result === 'boolean') {\n\t\t\t\t// if (!deployScript.func.id) {\n\t\t\t\t// \tthrow new Error(\n\t\t\t\t// \t\t`${deployScript.filePath} return true to not be executed again, but does not provide an id. the script function needs to have the field \"id\" to be set`\n\t\t\t\t// \t);\n\t\t\t\t// }\n\t\t\t\t// this.db.migrations[deployScript.func.id] = Math.floor(Date.now() / 1000);\n\n\t\t\t\tconst deploymentFolderPath = config.deployments;\n\n\t\t\t\t// TODO refactor to extract this whole path and folder existence stuff\n\t\t\t\t// const toSave = this.db.writeDeploymentsToFiles && this.network.saveDeployments;\n\t\t\t\t// if (toSave) {\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tfs.mkdirSync(this.deploymentsPath);\n\t\t\t\t// \t} catch (e) {}\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tfs.mkdirSync(path.join(this.deploymentsPath, deploymentFolderPath));\n\t\t\t\t// \t} catch (e) {}\n\t\t\t\t// \tfs.writeFileSync(\n\t\t\t\t// \t\tpath.join(this.deploymentsPath, deploymentFolderPath, '.migrations.json'),\n\t\t\t\t// \t\tJSON.stringify(this.db.migrations, null, ' ')\n\t\t\t\t// \t);\n\t\t\t\t// }\n\t\t\t}\n\t\t}\n\t}\n\n\treturn external;\n}\n","import fs from 'node:fs';\n\nimport {TransactionReceipt, createPublicClient, custom} from 'viem';\nimport {\n\tAccountType,\n\tDeployment,\n\tEnvironment,\n\tNamedSigner,\n\tPendingDeployment,\n\tPendingTransaction,\n\tResolvedAccount,\n\tResolvedConfig,\n\tResolvedNamedAccounts,\n\tResolvedNamedSigners,\n\tUnknownArtifacts,\n\tUnknownDeployments,\n\tUnresolvedUnknownNamedAccounts,\n} from './types';\nimport {JSONRPCHTTPProvider} from 'eip-1193-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 {\n\tEIP1193Account,\n\tEIP1193DATA,\n\tEIP1193ProviderWithoutEvents,\n\tEIP1193Transaction,\n\tEIP1193TransactionReceipt,\n} from 'eip-1193';\nimport {ProvidedContext} from '../executor/types';\nimport {spin} from '../internal/logging';\nimport {PendingExecution} from './types';\n\nexport type EnvironmentExtenstion = (env: Environment) => Environment;\n//we store this globally so this is not lost\n(globalThis as any).extensions = [];\nexport function extendEnvironment(extension: EnvironmentExtenstion): void {\n\t(globalThis as any).extensions.push(extension);\n}\n\nexport type SignerProtocolFunction = (protocolString: string) => Promise<NamedSigner>;\nexport type SignerProtocol = {\n\tgetSigner: SignerProtocolFunction;\n};\n\n//we store this globally so this is not lost\n(globalThis as any).signerProtocols = {};\nexport function handleSignerProtocol(protocol: string, getSigner: SignerProtocolFunction): void {\n\t(globalThis as any).signerProtocols[protocol] = {\n\t\tgetSigner,\n\t};\n}\n\nfunction wait(numSeconds: number): Promise<void> {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(resolve, numSeconds * 1000);\n\t});\n}\n\nfunction displayTransaction(transaction: EIP1193Transaction) {\n\tif (transaction.type === '0x2') {\n\t\treturn `(maxFeePerGas: ${BigInt(transaction.maxFeePerGas).toString()}, maxPriorityFeePerGas: ${BigInt(\n\t\t\ttransaction.maxPriorityFeePerGas\n\t\t).toString()})`;\n\t} else {\n\t\treturn `(gasPrice: ${BigInt(transaction.gasPrice).toString()})`;\n\t}\n}\n\nexport async function createEnvironment<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(\n\tconfig: ResolvedConfig,\n\tprovidedContext: ProvidedContext<Artifacts, NamedAccounts>\n): Promise<{internal: InternalEnvironment; external: Environment}> {\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\tif (!context.network.saveDeployments) {\n\t\t\treturn;\n\t\t}\n\t\tconst folderPath = ensureDeploymentFolder();\n\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\tlet existingPendingTansactions: PendingTransaction[];\n\t\ttry {\n\t\t\texistingPendingTansactions = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t} catch {\n\t\t\texistingPendingTansactions = [];\n\t\t}\n\t\tif (existingPendingTansactions.length > 0) {\n\t\t\twhile (existingPendingTansactions.length > 0) {\n\t\t\t\tconst pendingTransaction = existingPendingTansactions.shift();\n\t\t\t\tif (pendingTransaction) {\n\t\t\t\t\tif (pendingTransaction.type === 'deployment') {\n\t\t\t\t\t\tconst spinner = spin(`recovering ${pendingTransaction.name} with transaction ${pendingTransaction.txHash}`);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait waitForDeploymentTransactionAndSave(pendingTransaction);\n\t\t\t\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingTansactions, 2));\n\t\t\t\t\t\t\tspinner.succeed();\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tspinner.fail();\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst spinner = spin(`recovering execution's transaction ${pendingTransaction.txHash}`);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait waitForTransaction(pendingTransaction.txHash);\n\t\t\t\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingTansactions, 2));\n\t\t\t\t\t\t\tspinner.succeed();\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tspinner.fail();\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tfs.rmSync(filepath);\n\t\t}\n\t}\n\n\tasync function savePendingTransaction(pendingTransaction: PendingTransaction) {\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst folderPath = ensureDeploymentFolder();\n\t\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\t\tlet existingPendinTransactions: PendingTransaction[];\n\t\t\ttry {\n\t\t\t\texistingPendinTransactions = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendinTransactions = [];\n\t\t\t}\n\t\t\texistingPendinTransactions.push(pendingTransaction);\n\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendinTransactions, 2));\n\t\t}\n\t\treturn deployments;\n\t}\n\n\tasync function waitForTransactionReceipt(params: {\n\t\thash: EIP1193DATA;\n\t\t// confirmations?: number; // TODO\n\t\tpollingInterval?: number;\n\t\t// timeout?: number; // TODO\n\t}): Promise<EIP1193TransactionReceipt> {\n\t\t// const {hash, confirmations, pollingInterval, timeout} = {confirmations: 1, pollingInterval: 1, ...params};\n\t\tconst {hash, pollingInterval} = {pollingInterval: 1, ...params};\n\n\t\tlet receipt = await provider.request({\n\t\t\tmethod: 'eth_getTransactionReceipt',\n\t\t\tparams: [hash],\n\t\t});\n\t\tif (!receipt || !receipt.blockHash) {\n\t\t\tawait wait(pollingInterval);\n\t\t\treturn waitForTransactionReceipt(params);\n\t\t}\n\t\treturn receipt;\n\t}\n\n\tasync function deleteTransaction<TAbi extends Abi = Abi>(hash: string) {\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst folderPath = ensureDeploymentFolder();\n\t\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\t\tlet existingPendinTransactions: PendingTransaction[];\n\t\t\ttry {\n\t\t\t\texistingPendinTransactions = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendinTransactions = [];\n\t\t\t}\n\t\t\texistingPendinTransactions = existingPendinTransactions.filter((v) => v.txHash !== hash);\n\t\t\tif (existingPendinTransactions.length === 0) {\n\t\t\t\tfs.rmSync(filepath);\n\t\t\t} else {\n\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendinTransactions, 2));\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function exportDeploymentsAsTypes() {\n\t\tconst folderPath = './generated';\n\t\tfs.mkdirSync(folderPath, {recursive: true});\n\t\tfs.writeFileSync(`${folderPath}/deployments.ts`, `export default ${JSONToString(deployments, 2)} as const;`);\n\t}\n\n\tasync function waitForTransaction(\n\t\thash: `0x${string}`,\n\t\tinfo?: {message?: string; transaction?: EIP1193Transaction | null}\n\t): Promise<EIP1193TransactionReceipt> {\n\t\tconst spinner = spin(\n\t\t\tinfo?.message\n\t\t\t\t? info.message\n\t\t\t\t: ` - Broadcasting tx:\\n ${hash}${\n\t\t\t\t\t\tinfo?.transaction ? `\\n ${displayTransaction(info?.transaction)}` : ''\n\t\t\t\t }`\n\t\t);\n\t\tlet receipt: EIP1193TransactionReceipt;\n\t\ttry {\n\t\t\treceipt = await waitForTransactionReceipt({\n\t\t\t\thash,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tspinner.fail();\n\t\t\tthrow e;\n\t\t}\n\t\tif (!receipt) {\n\t\t\tthrow new Error(`receipt for ${hash} not found`);\n\t\t} else {\n\t\t\tspinner.succeed();\n\t\t}\n\t\treturn receipt;\n\t}\n\n\tasync function waitForDeploymentTransactionAndSave<TAbi extends Abi = Abi>(\n\t\tpendingDeployment: PendingDeployment<TAbi>,\n\t\ttransaction?: EIP1193Transaction | null\n\t): Promise<Deployment<TAbi>> {\n\t\tconst message = ` - Deploying ${pendingDeployment.name} with tx:\\n ${pendingDeployment.txHash}${\n\t\t\ttransaction ? `\\n ${displayTransaction(transaction)}` : ''\n\t\t}`;\n\t\tconst receipt = await waitForTransaction(pendingDeployment.txHash, {message, transaction});\n\n\t\tif (!receipt.contractAddress) {\n\t\t\tthrow new Error(`failed to deploy contract ${pendingDeployment.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(pendingDeployment.name, deployment);\n\t}\n\n\tasync function savePendingExecution(pendingExecution: PendingExecution) {\n\t\tawait savePendingTransaction(pendingExecution);\n\t\tlet transaction: EIP1193Transaction | null = null;\n\t\tconst spinner = spin(); // TODO spin(`fetching tx from peers ${pendingDeployment.txHash}`);\n\t\ttry {\n\t\t\ttransaction = await provider.request({\n\t\t\t\tmethod: 'eth_getTransactionByHash',\n\t\t\t\tparams: [pendingExecution.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 ${pendingExecution.txHash} not found`);\n\t\t} else {\n\t\t\tspinner.stop();\n\t\t}\n\n\t\tif (transaction) {\n\t\t\tpendingExecution.nonce = transaction.nonce;\n\t\t\tpendingExecution.txOrigin = transaction.from;\n\t\t}\n\n\t\tconst receipt = await waitForTransaction(pendingExecution.txHash, {transaction});\n\t\tawait deleteTransaction(pendingExecution.txHash);\n\t\treturn receipt;\n\t}\n\n\tasync function savePendingDeployment<TAbi extends Abi = Abi>(pendingDeployment: PendingDeployment<TAbi>) {\n\t\tawait savePendingTransaction(pendingDeployment);\n\t\tlet transaction: EIP1193Transaction | null = null;\n\t\tconst spinner = spin(); // TODO spin(`fetching tx from peers ${pendingDeployment.txHash}`);\n\t\ttry {\n\t\t\ttransaction = await provider.request({\n\t\t\t\tmethod: 'eth_getTransactionByHash',\n\t\t\t\tparams: [pendingDeployment.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\tif (transaction) {\n\t\t\t// we update the tx data with the one we get from the network\n\t\t\tpendingDeployment = {...pendingDeployment, nonce: transaction.nonce, txOrigin: transaction.from};\n\t\t}\n\n\t\tconst deployment = await waitForDeploymentTransactionAndSave<TAbi>(pendingDeployment, transaction);\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\tsavePendingDeployment,\n\t\tsavePendingExecution,\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\tif (msg) {\n\t\t\tconsole.log(msg);\n\t\t}\n\t\treturn this;\n\t},\n\tfail(msg?: string) {\n\t\tif (msg) {\n\t\t\tconsole.error(msg);\n\t\t}\n\t\treturn this;\n\t},\n};\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.17\",\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","transaction","options","fs","config","path","spinner"]}
package/dist/cli.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  loadAndExecuteDeployments,
4
4
  readConfig
5
- } from "./chunk-NV3PV2YD.js";
5
+ } from "./chunk-2P2ZLJOB.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.15",
14
+ version: "0.5.17",
15
15
  description: "deploy smart contract on ethereum-compatible networks",
16
16
  publishConfig: {
17
17
  access: "public"
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.15\",\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":[]}
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.17\",\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
@@ -390,6 +390,9 @@ async function createEnvironment(config, providedContext) {
390
390
  return deployment;
391
391
  }
392
392
  async function recoverTransactionsIfAny() {
393
+ if (!context.network.saveDeployments) {
394
+ return;
395
+ }
393
396
  const folderPath = ensureDeploymentFolder();
394
397
  const filepath = import_node_path3.default.join(folderPath, ".pending_transactions.json");
395
398
  let existingPendingTansactions;
@@ -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): Promise<Environment> {\n\tconst resolvedConfig = resolveConfig(config);\n\treturn executeDeployScripts<Artifacts, NamedAccounts, Deployments>(resolvedConfig);\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<Environment> {\n\tsetLogLevel(typeof config.logLevel === 'undefined' ? 0 : config.logLevel);\n\n\tlet filepaths;\n\tfilepaths = traverseMultipleDirectory([config.scripts]);\n\tfilepaths = filepaths\n\t\t.filter((v) => !path.basename(v).startsWith('_'))\n\t\t.sort((a: string, b: string) => {\n\t\t\tif (a < b) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (a > b) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\treturn 0;\n\t\t});\n\n\tlet providedContext: ProvidedContext<Artifacts, NamedAccounts> | undefined;\n\n\tconst scriptModuleByFilePath: {[filename: string]: DeployScriptModule} = {};\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\tconst spinner = spin(`- Executing ${filename}`);\n\t\tif (deployScript.func.skip) {\n\t\t\tconst spinner = spin(` - skip?()`);\n\t\t\ttry {\n\t\t\t\tskip = await deployScript.func.skip(external);\n\t\t\t\tspinner.succeed(skip ? `skipping ${filename}` : undefined);\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\t\tif (!skip) {\n\t\t\tlet result;\n\n\t\t\ttry {\n\t\t\t\tresult = await deployScript.func(external);\n\t\t\t\tspinner.succeed(`\\n`);\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\tif (result && typeof result === 'boolean') {\n\t\t\t\t// if (!deployScript.func.id) {\n\t\t\t\t// \tthrow new Error(\n\t\t\t\t// \t\t`${deployScript.filePath} return true to not be executed again, but does not provide an id. the script function needs to have the field \"id\" to be set`\n\t\t\t\t// \t);\n\t\t\t\t// }\n\t\t\t\t// this.db.migrations[deployScript.func.id] = Math.floor(Date.now() / 1000);\n\n\t\t\t\tconst deploymentFolderPath = config.deployments;\n\n\t\t\t\t// TODO refactor to extract this whole path and folder existence stuff\n\t\t\t\t// const toSave = this.db.writeDeploymentsToFiles && this.network.saveDeployments;\n\t\t\t\t// if (toSave) {\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tfs.mkdirSync(this.deploymentsPath);\n\t\t\t\t// \t} catch (e) {}\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tfs.mkdirSync(path.join(this.deploymentsPath, deploymentFolderPath));\n\t\t\t\t// \t} catch (e) {}\n\t\t\t\t// \tfs.writeFileSync(\n\t\t\t\t// \t\tpath.join(this.deploymentsPath, deploymentFolderPath, '.migrations.json'),\n\t\t\t\t// \t\tJSON.stringify(this.db.migrations, null, ' ')\n\t\t\t\t// \t);\n\t\t\t\t// }\n\t\t\t}\n\t\t}\n\t}\n\n\treturn external;\n}\n","import fs from 'node:fs';\n\nimport {TransactionReceipt, createPublicClient, custom} from 'viem';\nimport {\n\tAccountType,\n\tDeployment,\n\tEnvironment,\n\tNamedSigner,\n\tPendingDeployment,\n\tPendingTransaction,\n\tResolvedAccount,\n\tResolvedConfig,\n\tResolvedNamedAccounts,\n\tResolvedNamedSigners,\n\tUnknownArtifacts,\n\tUnknownDeployments,\n\tUnresolvedUnknownNamedAccounts,\n} from './types';\nimport {JSONRPCHTTPProvider} from 'eip-1193-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 {\n\tEIP1193Account,\n\tEIP1193DATA,\n\tEIP1193ProviderWithoutEvents,\n\tEIP1193Transaction,\n\tEIP1193TransactionReceipt,\n} from 'eip-1193';\nimport {ProvidedContext} from '../executor/types';\nimport {spin} from '../internal/logging';\nimport {PendingExecution} from './types';\n\nexport type EnvironmentExtenstion = (env: Environment) => Environment;\n//we store this globally so this is not lost\n(globalThis as any).extensions = [];\nexport function extendEnvironment(extension: EnvironmentExtenstion): void {\n\t(globalThis as any).extensions.push(extension);\n}\n\nexport type SignerProtocolFunction = (protocolString: string) => Promise<NamedSigner>;\nexport type SignerProtocol = {\n\tgetSigner: SignerProtocolFunction;\n};\n\n//we store this globally so this is not lost\n(globalThis as any).signerProtocols = {};\nexport function handleSignerProtocol(protocol: string, getSigner: SignerProtocolFunction): void {\n\t(globalThis as any).signerProtocols[protocol] = {\n\t\tgetSigner,\n\t};\n}\n\nfunction wait(numSeconds: number): Promise<void> {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(resolve, numSeconds * 1000);\n\t});\n}\n\nfunction displayTransaction(transaction: EIP1193Transaction) {\n\tif (transaction.type === '0x2') {\n\t\treturn `(maxFeePerGas: ${BigInt(transaction.maxFeePerGas).toString()}, maxPriorityFeePerGas: ${BigInt(\n\t\t\ttransaction.maxPriorityFeePerGas\n\t\t).toString()})`;\n\t} else {\n\t\treturn `(gasPrice: ${BigInt(transaction.gasPrice).toString()})`;\n\t}\n}\n\nexport async function createEnvironment<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(\n\tconfig: ResolvedConfig,\n\tprovidedContext: ProvidedContext<Artifacts, NamedAccounts>\n): Promise<{internal: InternalEnvironment; external: Environment}> {\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 folderPath = ensureDeploymentFolder();\n\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\tlet existingPendingTansactions: PendingTransaction[];\n\t\ttry {\n\t\t\texistingPendingTansactions = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t} catch {\n\t\t\texistingPendingTansactions = [];\n\t\t}\n\t\tif (existingPendingTansactions.length > 0) {\n\t\t\twhile (existingPendingTansactions.length > 0) {\n\t\t\t\tconst pendingTransaction = existingPendingTansactions.shift();\n\t\t\t\tif (pendingTransaction) {\n\t\t\t\t\tif (pendingTransaction.type === 'deployment') {\n\t\t\t\t\t\tconst spinner = spin(`recovering ${pendingTransaction.name} with transaction ${pendingTransaction.txHash}`);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait waitForDeploymentTransactionAndSave(pendingTransaction);\n\t\t\t\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingTansactions, 2));\n\t\t\t\t\t\t\tspinner.succeed();\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tspinner.fail();\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst spinner = spin(`recovering execution's transaction ${pendingTransaction.txHash}`);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait waitForTransaction(pendingTransaction.txHash);\n\t\t\t\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingTansactions, 2));\n\t\t\t\t\t\t\tspinner.succeed();\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tspinner.fail();\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tfs.rmSync(filepath);\n\t\t}\n\t}\n\n\tasync function savePendingTransaction(pendingTransaction: PendingTransaction) {\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst folderPath = ensureDeploymentFolder();\n\t\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\t\tlet existingPendinTransactions: PendingTransaction[];\n\t\t\ttry {\n\t\t\t\texistingPendinTransactions = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendinTransactions = [];\n\t\t\t}\n\t\t\texistingPendinTransactions.push(pendingTransaction);\n\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendinTransactions, 2));\n\t\t}\n\t\treturn deployments;\n\t}\n\n\tasync function waitForTransactionReceipt(params: {\n\t\thash: EIP1193DATA;\n\t\t// confirmations?: number; // TODO\n\t\tpollingInterval?: number;\n\t\t// timeout?: number; // TODO\n\t}): Promise<EIP1193TransactionReceipt> {\n\t\t// const {hash, confirmations, pollingInterval, timeout} = {confirmations: 1, pollingInterval: 1, ...params};\n\t\tconst {hash, pollingInterval} = {pollingInterval: 1, ...params};\n\n\t\tlet receipt = await provider.request({\n\t\t\tmethod: 'eth_getTransactionReceipt',\n\t\t\tparams: [hash],\n\t\t});\n\t\tif (!receipt || !receipt.blockHash) {\n\t\t\tawait wait(pollingInterval);\n\t\t\treturn waitForTransactionReceipt(params);\n\t\t}\n\t\treturn receipt;\n\t}\n\n\tasync function deleteTransaction<TAbi extends Abi = Abi>(hash: string) {\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst folderPath = ensureDeploymentFolder();\n\t\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\t\tlet existingPendinTransactions: PendingTransaction[];\n\t\t\ttry {\n\t\t\t\texistingPendinTransactions = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendinTransactions = [];\n\t\t\t}\n\t\t\texistingPendinTransactions = existingPendinTransactions.filter((v) => v.txHash !== hash);\n\t\t\tif (existingPendinTransactions.length === 0) {\n\t\t\t\tfs.rmSync(filepath);\n\t\t\t} else {\n\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendinTransactions, 2));\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function exportDeploymentsAsTypes() {\n\t\tconst folderPath = './generated';\n\t\tfs.mkdirSync(folderPath, {recursive: true});\n\t\tfs.writeFileSync(`${folderPath}/deployments.ts`, `export default ${JSONToString(deployments, 2)} as const;`);\n\t}\n\n\tasync function waitForTransaction(\n\t\thash: `0x${string}`,\n\t\tinfo?: {message?: string; transaction?: EIP1193Transaction | null}\n\t): Promise<EIP1193TransactionReceipt> {\n\t\tconst spinner = spin(\n\t\t\tinfo?.message\n\t\t\t\t? info.message\n\t\t\t\t: ` - Broadcasting tx:\\n ${hash}${\n\t\t\t\t\t\tinfo?.transaction ? `\\n ${displayTransaction(info?.transaction)}` : ''\n\t\t\t\t }`\n\t\t);\n\t\tlet receipt: EIP1193TransactionReceipt;\n\t\ttry {\n\t\t\treceipt = await waitForTransactionReceipt({\n\t\t\t\thash,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tspinner.fail();\n\t\t\tthrow e;\n\t\t}\n\t\tif (!receipt) {\n\t\t\tthrow new Error(`receipt for ${hash} not found`);\n\t\t} else {\n\t\t\tspinner.succeed();\n\t\t}\n\t\treturn receipt;\n\t}\n\n\tasync function waitForDeploymentTransactionAndSave<TAbi extends Abi = Abi>(\n\t\tpendingDeployment: PendingDeployment<TAbi>,\n\t\ttransaction?: EIP1193Transaction | null\n\t): Promise<Deployment<TAbi>> {\n\t\tconst message = ` - Deploying ${pendingDeployment.name} with tx:\\n ${pendingDeployment.txHash}${\n\t\t\ttransaction ? `\\n ${displayTransaction(transaction)}` : ''\n\t\t}`;\n\t\tconst receipt = await waitForTransaction(pendingDeployment.txHash, {message, transaction});\n\n\t\tif (!receipt.contractAddress) {\n\t\t\tthrow new Error(`failed to deploy contract ${pendingDeployment.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(pendingDeployment.name, deployment);\n\t}\n\n\tasync function savePendingExecution(pendingExecution: PendingExecution) {\n\t\tawait savePendingTransaction(pendingExecution);\n\t\tlet transaction: EIP1193Transaction | null = null;\n\t\tconst spinner = spin(); // TODO spin(`fetching tx from peers ${pendingDeployment.txHash}`);\n\t\ttry {\n\t\t\ttransaction = await provider.request({\n\t\t\t\tmethod: 'eth_getTransactionByHash',\n\t\t\t\tparams: [pendingExecution.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 ${pendingExecution.txHash} not found`);\n\t\t} else {\n\t\t\tspinner.stop();\n\t\t}\n\n\t\tif (transaction) {\n\t\t\tpendingExecution.nonce = transaction.nonce;\n\t\t\tpendingExecution.txOrigin = transaction.from;\n\t\t}\n\n\t\tconst receipt = await waitForTransaction(pendingExecution.txHash, {transaction});\n\t\tawait deleteTransaction(pendingExecution.txHash);\n\t\treturn receipt;\n\t}\n\n\tasync function savePendingDeployment<TAbi extends Abi = Abi>(pendingDeployment: PendingDeployment<TAbi>) {\n\t\tawait savePendingTransaction(pendingDeployment);\n\t\tlet transaction: EIP1193Transaction | null = null;\n\t\tconst spinner = spin(); // TODO spin(`fetching tx from peers ${pendingDeployment.txHash}`);\n\t\ttry {\n\t\t\ttransaction = await provider.request({\n\t\t\t\tmethod: 'eth_getTransactionByHash',\n\t\t\t\tparams: [pendingDeployment.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\tif (transaction) {\n\t\t\t// we update the tx data with the one we get from the network\n\t\t\tpendingDeployment = {...pendingDeployment, nonce: transaction.nonce, txOrigin: transaction.from};\n\t\t}\n\n\t\tconst deployment = await waitForDeploymentTransactionAndSave<TAbi>(pendingDeployment, transaction);\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\tsavePendingDeployment,\n\t\tsavePendingExecution,\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\tif (msg) {\n\t\t\tconsole.log(msg);\n\t\t}\n\t\treturn this;\n\t},\n\tfail(msg?: string) {\n\t\tif (msg) {\n\t\t\tconsole.error(msg);\n\t\t}\n\t\treturn this;\n\t},\n};\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","transaction","fs","path","spinner"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils/fs.ts","../src/executor/index.ts","../src/environment/index.ts","../src/utils/json.ts","../src/environment/deployments.ts","../src/internal/logging.ts"],"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): Promise<Environment> {\n\tconst resolvedConfig = resolveConfig(config);\n\treturn executeDeployScripts<Artifacts, NamedAccounts, Deployments>(resolvedConfig);\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<Environment> {\n\tsetLogLevel(typeof config.logLevel === 'undefined' ? 0 : config.logLevel);\n\n\tlet filepaths;\n\tfilepaths = traverseMultipleDirectory([config.scripts]);\n\tfilepaths = filepaths\n\t\t.filter((v) => !path.basename(v).startsWith('_'))\n\t\t.sort((a: string, b: string) => {\n\t\t\tif (a < b) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (a > b) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\treturn 0;\n\t\t});\n\n\tlet providedContext: ProvidedContext<Artifacts, NamedAccounts> | undefined;\n\n\tconst scriptModuleByFilePath: {[filename: string]: DeployScriptModule} = {};\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\tconst spinner = spin(`- Executing ${filename}`);\n\t\tif (deployScript.func.skip) {\n\t\t\tconst spinner = spin(` - skip?()`);\n\t\t\ttry {\n\t\t\t\tskip = await deployScript.func.skip(external);\n\t\t\t\tspinner.succeed(skip ? `skipping ${filename}` : undefined);\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\t\tif (!skip) {\n\t\t\tlet result;\n\n\t\t\ttry {\n\t\t\t\tresult = await deployScript.func(external);\n\t\t\t\tspinner.succeed(`\\n`);\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\tif (result && typeof result === 'boolean') {\n\t\t\t\t// if (!deployScript.func.id) {\n\t\t\t\t// \tthrow new Error(\n\t\t\t\t// \t\t`${deployScript.filePath} return true to not be executed again, but does not provide an id. the script function needs to have the field \"id\" to be set`\n\t\t\t\t// \t);\n\t\t\t\t// }\n\t\t\t\t// this.db.migrations[deployScript.func.id] = Math.floor(Date.now() / 1000);\n\n\t\t\t\tconst deploymentFolderPath = config.deployments;\n\n\t\t\t\t// TODO refactor to extract this whole path and folder existence stuff\n\t\t\t\t// const toSave = this.db.writeDeploymentsToFiles && this.network.saveDeployments;\n\t\t\t\t// if (toSave) {\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tfs.mkdirSync(this.deploymentsPath);\n\t\t\t\t// \t} catch (e) {}\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tfs.mkdirSync(path.join(this.deploymentsPath, deploymentFolderPath));\n\t\t\t\t// \t} catch (e) {}\n\t\t\t\t// \tfs.writeFileSync(\n\t\t\t\t// \t\tpath.join(this.deploymentsPath, deploymentFolderPath, '.migrations.json'),\n\t\t\t\t// \t\tJSON.stringify(this.db.migrations, null, ' ')\n\t\t\t\t// \t);\n\t\t\t\t// }\n\t\t\t}\n\t\t}\n\t}\n\n\treturn external;\n}\n","import fs from 'node:fs';\n\nimport {TransactionReceipt, createPublicClient, custom} from 'viem';\nimport {\n\tAccountType,\n\tDeployment,\n\tEnvironment,\n\tNamedSigner,\n\tPendingDeployment,\n\tPendingTransaction,\n\tResolvedAccount,\n\tResolvedConfig,\n\tResolvedNamedAccounts,\n\tResolvedNamedSigners,\n\tUnknownArtifacts,\n\tUnknownDeployments,\n\tUnresolvedUnknownNamedAccounts,\n} from './types';\nimport {JSONRPCHTTPProvider} from 'eip-1193-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 {\n\tEIP1193Account,\n\tEIP1193DATA,\n\tEIP1193ProviderWithoutEvents,\n\tEIP1193Transaction,\n\tEIP1193TransactionReceipt,\n} from 'eip-1193';\nimport {ProvidedContext} from '../executor/types';\nimport {spin} from '../internal/logging';\nimport {PendingExecution} from './types';\n\nexport type EnvironmentExtenstion = (env: Environment) => Environment;\n//we store this globally so this is not lost\n(globalThis as any).extensions = [];\nexport function extendEnvironment(extension: EnvironmentExtenstion): void {\n\t(globalThis as any).extensions.push(extension);\n}\n\nexport type SignerProtocolFunction = (protocolString: string) => Promise<NamedSigner>;\nexport type SignerProtocol = {\n\tgetSigner: SignerProtocolFunction;\n};\n\n//we store this globally so this is not lost\n(globalThis as any).signerProtocols = {};\nexport function handleSignerProtocol(protocol: string, getSigner: SignerProtocolFunction): void {\n\t(globalThis as any).signerProtocols[protocol] = {\n\t\tgetSigner,\n\t};\n}\n\nfunction wait(numSeconds: number): Promise<void> {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(resolve, numSeconds * 1000);\n\t});\n}\n\nfunction displayTransaction(transaction: EIP1193Transaction) {\n\tif (transaction.type === '0x2') {\n\t\treturn `(maxFeePerGas: ${BigInt(transaction.maxFeePerGas).toString()}, maxPriorityFeePerGas: ${BigInt(\n\t\t\ttransaction.maxPriorityFeePerGas\n\t\t).toString()})`;\n\t} else {\n\t\treturn `(gasPrice: ${BigInt(transaction.gasPrice).toString()})`;\n\t}\n}\n\nexport async function createEnvironment<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(\n\tconfig: ResolvedConfig,\n\tprovidedContext: ProvidedContext<Artifacts, NamedAccounts>\n): Promise<{internal: InternalEnvironment; external: Environment}> {\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\tif (!context.network.saveDeployments) {\n\t\t\treturn;\n\t\t}\n\t\tconst folderPath = ensureDeploymentFolder();\n\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\tlet existingPendingTansactions: PendingTransaction[];\n\t\ttry {\n\t\t\texistingPendingTansactions = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t} catch {\n\t\t\texistingPendingTansactions = [];\n\t\t}\n\t\tif (existingPendingTansactions.length > 0) {\n\t\t\twhile (existingPendingTansactions.length > 0) {\n\t\t\t\tconst pendingTransaction = existingPendingTansactions.shift();\n\t\t\t\tif (pendingTransaction) {\n\t\t\t\t\tif (pendingTransaction.type === 'deployment') {\n\t\t\t\t\t\tconst spinner = spin(`recovering ${pendingTransaction.name} with transaction ${pendingTransaction.txHash}`);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait waitForDeploymentTransactionAndSave(pendingTransaction);\n\t\t\t\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingTansactions, 2));\n\t\t\t\t\t\t\tspinner.succeed();\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tspinner.fail();\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst spinner = spin(`recovering execution's transaction ${pendingTransaction.txHash}`);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait waitForTransaction(pendingTransaction.txHash);\n\t\t\t\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingTansactions, 2));\n\t\t\t\t\t\t\tspinner.succeed();\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tspinner.fail();\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tfs.rmSync(filepath);\n\t\t}\n\t}\n\n\tasync function savePendingTransaction(pendingTransaction: PendingTransaction) {\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst folderPath = ensureDeploymentFolder();\n\t\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\t\tlet existingPendinTransactions: PendingTransaction[];\n\t\t\ttry {\n\t\t\t\texistingPendinTransactions = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendinTransactions = [];\n\t\t\t}\n\t\t\texistingPendinTransactions.push(pendingTransaction);\n\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendinTransactions, 2));\n\t\t}\n\t\treturn deployments;\n\t}\n\n\tasync function waitForTransactionReceipt(params: {\n\t\thash: EIP1193DATA;\n\t\t// confirmations?: number; // TODO\n\t\tpollingInterval?: number;\n\t\t// timeout?: number; // TODO\n\t}): Promise<EIP1193TransactionReceipt> {\n\t\t// const {hash, confirmations, pollingInterval, timeout} = {confirmations: 1, pollingInterval: 1, ...params};\n\t\tconst {hash, pollingInterval} = {pollingInterval: 1, ...params};\n\n\t\tlet receipt = await provider.request({\n\t\t\tmethod: 'eth_getTransactionReceipt',\n\t\t\tparams: [hash],\n\t\t});\n\t\tif (!receipt || !receipt.blockHash) {\n\t\t\tawait wait(pollingInterval);\n\t\t\treturn waitForTransactionReceipt(params);\n\t\t}\n\t\treturn receipt;\n\t}\n\n\tasync function deleteTransaction<TAbi extends Abi = Abi>(hash: string) {\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst folderPath = ensureDeploymentFolder();\n\t\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\t\tlet existingPendinTransactions: PendingTransaction[];\n\t\t\ttry {\n\t\t\t\texistingPendinTransactions = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendinTransactions = [];\n\t\t\t}\n\t\t\texistingPendinTransactions = existingPendinTransactions.filter((v) => v.txHash !== hash);\n\t\t\tif (existingPendinTransactions.length === 0) {\n\t\t\t\tfs.rmSync(filepath);\n\t\t\t} else {\n\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendinTransactions, 2));\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function exportDeploymentsAsTypes() {\n\t\tconst folderPath = './generated';\n\t\tfs.mkdirSync(folderPath, {recursive: true});\n\t\tfs.writeFileSync(`${folderPath}/deployments.ts`, `export default ${JSONToString(deployments, 2)} as const;`);\n\t}\n\n\tasync function waitForTransaction(\n\t\thash: `0x${string}`,\n\t\tinfo?: {message?: string; transaction?: EIP1193Transaction | null}\n\t): Promise<EIP1193TransactionReceipt> {\n\t\tconst spinner = spin(\n\t\t\tinfo?.message\n\t\t\t\t? info.message\n\t\t\t\t: ` - Broadcasting tx:\\n ${hash}${\n\t\t\t\t\t\tinfo?.transaction ? `\\n ${displayTransaction(info?.transaction)}` : ''\n\t\t\t\t }`\n\t\t);\n\t\tlet receipt: EIP1193TransactionReceipt;\n\t\ttry {\n\t\t\treceipt = await waitForTransactionReceipt({\n\t\t\t\thash,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tspinner.fail();\n\t\t\tthrow e;\n\t\t}\n\t\tif (!receipt) {\n\t\t\tthrow new Error(`receipt for ${hash} not found`);\n\t\t} else {\n\t\t\tspinner.succeed();\n\t\t}\n\t\treturn receipt;\n\t}\n\n\tasync function waitForDeploymentTransactionAndSave<TAbi extends Abi = Abi>(\n\t\tpendingDeployment: PendingDeployment<TAbi>,\n\t\ttransaction?: EIP1193Transaction | null\n\t): Promise<Deployment<TAbi>> {\n\t\tconst message = ` - Deploying ${pendingDeployment.name} with tx:\\n ${pendingDeployment.txHash}${\n\t\t\ttransaction ? `\\n ${displayTransaction(transaction)}` : ''\n\t\t}`;\n\t\tconst receipt = await waitForTransaction(pendingDeployment.txHash, {message, transaction});\n\n\t\tif (!receipt.contractAddress) {\n\t\t\tthrow new Error(`failed to deploy contract ${pendingDeployment.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(pendingDeployment.name, deployment);\n\t}\n\n\tasync function savePendingExecution(pendingExecution: PendingExecution) {\n\t\tawait savePendingTransaction(pendingExecution);\n\t\tlet transaction: EIP1193Transaction | null = null;\n\t\tconst spinner = spin(); // TODO spin(`fetching tx from peers ${pendingDeployment.txHash}`);\n\t\ttry {\n\t\t\ttransaction = await provider.request({\n\t\t\t\tmethod: 'eth_getTransactionByHash',\n\t\t\t\tparams: [pendingExecution.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 ${pendingExecution.txHash} not found`);\n\t\t} else {\n\t\t\tspinner.stop();\n\t\t}\n\n\t\tif (transaction) {\n\t\t\tpendingExecution.nonce = transaction.nonce;\n\t\t\tpendingExecution.txOrigin = transaction.from;\n\t\t}\n\n\t\tconst receipt = await waitForTransaction(pendingExecution.txHash, {transaction});\n\t\tawait deleteTransaction(pendingExecution.txHash);\n\t\treturn receipt;\n\t}\n\n\tasync function savePendingDeployment<TAbi extends Abi = Abi>(pendingDeployment: PendingDeployment<TAbi>) {\n\t\tawait savePendingTransaction(pendingDeployment);\n\t\tlet transaction: EIP1193Transaction | null = null;\n\t\tconst spinner = spin(); // TODO spin(`fetching tx from peers ${pendingDeployment.txHash}`);\n\t\ttry {\n\t\t\ttransaction = await provider.request({\n\t\t\t\tmethod: 'eth_getTransactionByHash',\n\t\t\t\tparams: [pendingDeployment.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\tif (transaction) {\n\t\t\t// we update the tx data with the one we get from the network\n\t\t\tpendingDeployment = {...pendingDeployment, nonce: transaction.nonce, txOrigin: transaction.from};\n\t\t}\n\n\t\tconst deployment = await waitForDeploymentTransactionAndSave<TAbi>(pendingDeployment, transaction);\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\tsavePendingDeployment,\n\t\tsavePendingExecution,\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\tif (msg) {\n\t\t\tconsole.log(msg);\n\t\t}\n\t\treturn this;\n\t},\n\tfail(msg?: string) {\n\t\tif (msg) {\n\t\t\tconsole.error(msg);\n\t\t}\n\t\treturn this;\n\t},\n};\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","transaction","fs","path","spinner"]}
package/dist/index.js CHANGED
@@ -8,7 +8,7 @@ import {
8
8
  readAndResolveConfig,
9
9
  readConfig,
10
10
  resolveConfig
11
- } from "./chunk-NV3PV2YD.js";
11
+ } from "./chunk-2P2ZLJOB.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.16",
3
+ "version": "0.5.17",
4
4
  "description": "deploy smart contract on ethereum-compatible networks",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -267,6 +267,9 @@ export async function createEnvironment<
267
267
  }
268
268
 
269
269
  async function recoverTransactionsIfAny<TAbi extends Abi = Abi>(): Promise<void> {
270
+ if (!context.network.saveDeployments) {
271
+ return;
272
+ }
270
273
  const folderPath = ensureDeploymentFolder();
271
274
  const filepath = path.join(folderPath, '.pending_transactions.json');
272
275
  let existingPendingTansactions: PendingTransaction[];
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/fs.ts","../src/executor/index.ts","../src/environment/index.ts","../src/utils/json.ts","../src/environment/deployments.ts","../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): Promise<Environment> {\n\tconst resolvedConfig = resolveConfig(config);\n\treturn executeDeployScripts<Artifacts, NamedAccounts, Deployments>(resolvedConfig);\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<Environment> {\n\tsetLogLevel(typeof config.logLevel === 'undefined' ? 0 : config.logLevel);\n\n\tlet filepaths;\n\tfilepaths = traverseMultipleDirectory([config.scripts]);\n\tfilepaths = filepaths\n\t\t.filter((v) => !path.basename(v).startsWith('_'))\n\t\t.sort((a: string, b: string) => {\n\t\t\tif (a < b) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (a > b) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\treturn 0;\n\t\t});\n\n\tlet providedContext: ProvidedContext<Artifacts, NamedAccounts> | undefined;\n\n\tconst scriptModuleByFilePath: {[filename: string]: DeployScriptModule} = {};\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\tconst spinner = spin(`- Executing ${filename}`);\n\t\tif (deployScript.func.skip) {\n\t\t\tconst spinner = spin(` - skip?()`);\n\t\t\ttry {\n\t\t\t\tskip = await deployScript.func.skip(external);\n\t\t\t\tspinner.succeed(skip ? `skipping ${filename}` : undefined);\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\t\tif (!skip) {\n\t\t\tlet result;\n\n\t\t\ttry {\n\t\t\t\tresult = await deployScript.func(external);\n\t\t\t\tspinner.succeed(`\\n`);\n\t\t\t} catch (e) {\n\t\t\t\tspinner.fail();\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\tif (result && typeof result === 'boolean') {\n\t\t\t\t// if (!deployScript.func.id) {\n\t\t\t\t// \tthrow new Error(\n\t\t\t\t// \t\t`${deployScript.filePath} return true to not be executed again, but does not provide an id. the script function needs to have the field \"id\" to be set`\n\t\t\t\t// \t);\n\t\t\t\t// }\n\t\t\t\t// this.db.migrations[deployScript.func.id] = Math.floor(Date.now() / 1000);\n\n\t\t\t\tconst deploymentFolderPath = config.deployments;\n\n\t\t\t\t// TODO refactor to extract this whole path and folder existence stuff\n\t\t\t\t// const toSave = this.db.writeDeploymentsToFiles && this.network.saveDeployments;\n\t\t\t\t// if (toSave) {\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tfs.mkdirSync(this.deploymentsPath);\n\t\t\t\t// \t} catch (e) {}\n\t\t\t\t// \ttry {\n\t\t\t\t// \t\tfs.mkdirSync(path.join(this.deploymentsPath, deploymentFolderPath));\n\t\t\t\t// \t} catch (e) {}\n\t\t\t\t// \tfs.writeFileSync(\n\t\t\t\t// \t\tpath.join(this.deploymentsPath, deploymentFolderPath, '.migrations.json'),\n\t\t\t\t// \t\tJSON.stringify(this.db.migrations, null, ' ')\n\t\t\t\t// \t);\n\t\t\t\t// }\n\t\t\t}\n\t\t}\n\t}\n\n\treturn external;\n}\n","import fs from 'node:fs';\n\nimport {TransactionReceipt, createPublicClient, custom} from 'viem';\nimport {\n\tAccountType,\n\tDeployment,\n\tEnvironment,\n\tNamedSigner,\n\tPendingDeployment,\n\tPendingTransaction,\n\tResolvedAccount,\n\tResolvedConfig,\n\tResolvedNamedAccounts,\n\tResolvedNamedSigners,\n\tUnknownArtifacts,\n\tUnknownDeployments,\n\tUnresolvedUnknownNamedAccounts,\n} from './types';\nimport {JSONRPCHTTPProvider} from 'eip-1193-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 {\n\tEIP1193Account,\n\tEIP1193DATA,\n\tEIP1193ProviderWithoutEvents,\n\tEIP1193Transaction,\n\tEIP1193TransactionReceipt,\n} from 'eip-1193';\nimport {ProvidedContext} from '../executor/types';\nimport {spin} from '../internal/logging';\nimport {PendingExecution} from './types';\n\nexport type EnvironmentExtenstion = (env: Environment) => Environment;\n//we store this globally so this is not lost\n(globalThis as any).extensions = [];\nexport function extendEnvironment(extension: EnvironmentExtenstion): void {\n\t(globalThis as any).extensions.push(extension);\n}\n\nexport type SignerProtocolFunction = (protocolString: string) => Promise<NamedSigner>;\nexport type SignerProtocol = {\n\tgetSigner: SignerProtocolFunction;\n};\n\n//we store this globally so this is not lost\n(globalThis as any).signerProtocols = {};\nexport function handleSignerProtocol(protocol: string, getSigner: SignerProtocolFunction): void {\n\t(globalThis as any).signerProtocols[protocol] = {\n\t\tgetSigner,\n\t};\n}\n\nfunction wait(numSeconds: number): Promise<void> {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(resolve, numSeconds * 1000);\n\t});\n}\n\nfunction displayTransaction(transaction: EIP1193Transaction) {\n\tif (transaction.type === '0x2') {\n\t\treturn `(maxFeePerGas: ${BigInt(transaction.maxFeePerGas).toString()}, maxPriorityFeePerGas: ${BigInt(\n\t\t\ttransaction.maxPriorityFeePerGas\n\t\t).toString()})`;\n\t} else {\n\t\treturn `(gasPrice: ${BigInt(transaction.gasPrice).toString()})`;\n\t}\n}\n\nexport async function createEnvironment<\n\tArtifacts extends UnknownArtifacts = UnknownArtifacts,\n\tNamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,\n\tDeployments extends UnknownDeployments = UnknownDeployments\n>(\n\tconfig: ResolvedConfig,\n\tprovidedContext: ProvidedContext<Artifacts, NamedAccounts>\n): Promise<{internal: InternalEnvironment; external: Environment}> {\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 folderPath = ensureDeploymentFolder();\n\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\tlet existingPendingTansactions: PendingTransaction[];\n\t\ttry {\n\t\t\texistingPendingTansactions = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t} catch {\n\t\t\texistingPendingTansactions = [];\n\t\t}\n\t\tif (existingPendingTansactions.length > 0) {\n\t\t\twhile (existingPendingTansactions.length > 0) {\n\t\t\t\tconst pendingTransaction = existingPendingTansactions.shift();\n\t\t\t\tif (pendingTransaction) {\n\t\t\t\t\tif (pendingTransaction.type === 'deployment') {\n\t\t\t\t\t\tconst spinner = spin(`recovering ${pendingTransaction.name} with transaction ${pendingTransaction.txHash}`);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait waitForDeploymentTransactionAndSave(pendingTransaction);\n\t\t\t\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingTansactions, 2));\n\t\t\t\t\t\t\tspinner.succeed();\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tspinner.fail();\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst spinner = spin(`recovering execution's transaction ${pendingTransaction.txHash}`);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait waitForTransaction(pendingTransaction.txHash);\n\t\t\t\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendingTansactions, 2));\n\t\t\t\t\t\t\tspinner.succeed();\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tspinner.fail();\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tfs.rmSync(filepath);\n\t\t}\n\t}\n\n\tasync function savePendingTransaction(pendingTransaction: PendingTransaction) {\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst folderPath = ensureDeploymentFolder();\n\t\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\t\tlet existingPendinTransactions: PendingTransaction[];\n\t\t\ttry {\n\t\t\t\texistingPendinTransactions = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendinTransactions = [];\n\t\t\t}\n\t\t\texistingPendinTransactions.push(pendingTransaction);\n\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendinTransactions, 2));\n\t\t}\n\t\treturn deployments;\n\t}\n\n\tasync function waitForTransactionReceipt(params: {\n\t\thash: EIP1193DATA;\n\t\t// confirmations?: number; // TODO\n\t\tpollingInterval?: number;\n\t\t// timeout?: number; // TODO\n\t}): Promise<EIP1193TransactionReceipt> {\n\t\t// const {hash, confirmations, pollingInterval, timeout} = {confirmations: 1, pollingInterval: 1, ...params};\n\t\tconst {hash, pollingInterval} = {pollingInterval: 1, ...params};\n\n\t\tlet receipt = await provider.request({\n\t\t\tmethod: 'eth_getTransactionReceipt',\n\t\t\tparams: [hash],\n\t\t});\n\t\tif (!receipt || !receipt.blockHash) {\n\t\t\tawait wait(pollingInterval);\n\t\t\treturn waitForTransactionReceipt(params);\n\t\t}\n\t\treturn receipt;\n\t}\n\n\tasync function deleteTransaction<TAbi extends Abi = Abi>(hash: string) {\n\t\tif (context.network.saveDeployments) {\n\t\t\tconst folderPath = ensureDeploymentFolder();\n\t\t\tconst filepath = path.join(folderPath, '.pending_transactions.json');\n\t\t\tlet existingPendinTransactions: PendingTransaction[];\n\t\t\ttry {\n\t\t\t\texistingPendinTransactions = stringToJSON(fs.readFileSync(filepath, 'utf-8'));\n\t\t\t} catch {\n\t\t\t\texistingPendinTransactions = [];\n\t\t\t}\n\t\t\texistingPendinTransactions = existingPendinTransactions.filter((v) => v.txHash !== hash);\n\t\t\tif (existingPendinTransactions.length === 0) {\n\t\t\t\tfs.rmSync(filepath);\n\t\t\t} else {\n\t\t\t\tfs.writeFileSync(filepath, JSONToString(existingPendinTransactions, 2));\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function exportDeploymentsAsTypes() {\n\t\tconst folderPath = './generated';\n\t\tfs.mkdirSync(folderPath, {recursive: true});\n\t\tfs.writeFileSync(`${folderPath}/deployments.ts`, `export default ${JSONToString(deployments, 2)} as const;`);\n\t}\n\n\tasync function waitForTransaction(\n\t\thash: `0x${string}`,\n\t\tinfo?: {message?: string; transaction?: EIP1193Transaction | null}\n\t): Promise<EIP1193TransactionReceipt> {\n\t\tconst spinner = spin(\n\t\t\tinfo?.message\n\t\t\t\t? info.message\n\t\t\t\t: ` - Broadcasting tx:\\n ${hash}${\n\t\t\t\t\t\tinfo?.transaction ? `\\n ${displayTransaction(info?.transaction)}` : ''\n\t\t\t\t }`\n\t\t);\n\t\tlet receipt: EIP1193TransactionReceipt;\n\t\ttry {\n\t\t\treceipt = await waitForTransactionReceipt({\n\t\t\t\thash,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tspinner.fail();\n\t\t\tthrow e;\n\t\t}\n\t\tif (!receipt) {\n\t\t\tthrow new Error(`receipt for ${hash} not found`);\n\t\t} else {\n\t\t\tspinner.succeed();\n\t\t}\n\t\treturn receipt;\n\t}\n\n\tasync function waitForDeploymentTransactionAndSave<TAbi extends Abi = Abi>(\n\t\tpendingDeployment: PendingDeployment<TAbi>,\n\t\ttransaction?: EIP1193Transaction | null\n\t): Promise<Deployment<TAbi>> {\n\t\tconst message = ` - Deploying ${pendingDeployment.name} with tx:\\n ${pendingDeployment.txHash}${\n\t\t\ttransaction ? `\\n ${displayTransaction(transaction)}` : ''\n\t\t}`;\n\t\tconst receipt = await waitForTransaction(pendingDeployment.txHash, {message, transaction});\n\n\t\tif (!receipt.contractAddress) {\n\t\t\tthrow new Error(`failed to deploy contract ${pendingDeployment.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(pendingDeployment.name, deployment);\n\t}\n\n\tasync function savePendingExecution(pendingExecution: PendingExecution) {\n\t\tawait savePendingTransaction(pendingExecution);\n\t\tlet transaction: EIP1193Transaction | null = null;\n\t\tconst spinner = spin(); // TODO spin(`fetching tx from peers ${pendingDeployment.txHash}`);\n\t\ttry {\n\t\t\ttransaction = await provider.request({\n\t\t\t\tmethod: 'eth_getTransactionByHash',\n\t\t\t\tparams: [pendingExecution.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 ${pendingExecution.txHash} not found`);\n\t\t} else {\n\t\t\tspinner.stop();\n\t\t}\n\n\t\tif (transaction) {\n\t\t\tpendingExecution.nonce = transaction.nonce;\n\t\t\tpendingExecution.txOrigin = transaction.from;\n\t\t}\n\n\t\tconst receipt = await waitForTransaction(pendingExecution.txHash, {transaction});\n\t\tawait deleteTransaction(pendingExecution.txHash);\n\t\treturn receipt;\n\t}\n\n\tasync function savePendingDeployment<TAbi extends Abi = Abi>(pendingDeployment: PendingDeployment<TAbi>) {\n\t\tawait savePendingTransaction(pendingDeployment);\n\t\tlet transaction: EIP1193Transaction | null = null;\n\t\tconst spinner = spin(); // TODO spin(`fetching tx from peers ${pendingDeployment.txHash}`);\n\t\ttry {\n\t\t\ttransaction = await provider.request({\n\t\t\t\tmethod: 'eth_getTransactionByHash',\n\t\t\t\tparams: [pendingDeployment.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\tif (transaction) {\n\t\t\t// we update the tx data with the one we get from the network\n\t\t\tpendingDeployment = {...pendingDeployment, nonce: transaction.nonce, txOrigin: transaction.from};\n\t\t}\n\n\t\tconst deployment = await waitForDeploymentTransactionAndSave<TAbi>(pendingDeployment, transaction);\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\tsavePendingDeployment,\n\t\tsavePendingExecution,\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\tif (msg) {\n\t\t\tconsole.log(msg);\n\t\t}\n\t\treturn this;\n\t},\n\tfail(msg?: string) {\n\t\tif (msg) {\n\t\t\tconsole.error(msg);\n\t\t}\n\t\treturn this;\n\t},\n};\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","transaction","fs","path","spinner"]}