@macwlt/cli 0.0.1-alpha

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/command.ts","../src/config/GlobalConfig.ts","../src/config/fileConfigStorage.ts","../src/config/parseGlobalConfigData.ts","../src/config/parseJsonValue.ts","../src/result.ts","../src/config/globalConfigPath.ts","../src/config/createFileIfAbsent.ts","../config.default.json","../src/config/defaultGlobalConfigContents.ts","../src/config/ensureGlobalConfig.ts","../src/config/resetGlobalConfig.ts","../src/native.ts","../src/nativeError.ts","../src/parseFlags.ts","../src/withWallet.ts","../src/base64.ts","../src/hex.ts","../src/walletOutput.ts","../src/commands/create.ts","../src/terminalConfirmationPrompt.ts","../src/hooks/createConfirmationHook.ts","../src/commands/reset.ts","../src/commands/resetConfig.ts","../src/commands/pubkey.ts","../src/commands/address.ts","../src/bytesInput.ts","../src/commands/signEth.ts","../src/commands/signPsbt.ts","../src/commands/help.ts","../src/commands/version.ts","../src/commands/send.ts","../src/ethereum/EthereumConfig.ts","../src/ethereum/EvmCall.ts","../src/ethereum/EthereumClient.ts","../src/ethereum/EthereumAsset.ts","../src/ethereum/decodeErc20Decimals.ts","../src/ethereum/decodeErc20Balance.ts","../src/ethereum/encodeErc20BalanceOf.ts","../src/ethereum/encodeErc20DecimalsCall.ts","../src/ethereum/encodeErc20Transfer.ts","../src/ethereum/getEthereumAssetBalance.ts","../src/ethereum/getEthereumPortfolioBalances.ts","../src/ethereum/parseEthereumPortfolioConfig.ts","../src/ethereum/parseTokenAmount.ts","../src/ethereum/resolveEthereumRpcUrl.ts","../src/ethereum/serializeSignedTransaction.ts","../src/ethereum/serializeUnsignedTransaction.ts","../src/ethereum/sendErc20Token.ts","../src/ethereum/sendNativeEth.ts","../src/ethereum/createViemTransport.ts","../src/commands/ethereumWalletAddress.ts","../src/commands/formatEthereumClientError.ts","../src/commands/resolveEthereumCommandRpcUrl.ts","../src/commands/balance.ts","../src/commands.ts","../src/main.ts"],"sourcesContent":["import { z } from \"zod\";\nimport {\n createFileIfAbsent,\n ensureGlobalConfig,\n fileConfigStorage,\n type ConfigStorage,\n} from \"./config\";\nimport { defaultLibraryPath, openNativeClient, type NativeClient, type NativeError } from \"./native\";\nimport { formatNativeError } from \"./nativeError\";\nimport { err, type Result } from \"./result\";\nimport { commands } from \"./commands\";\n\nfunction parsedEnv(value: { [key: string]: unknown }): NodeJS.ProcessEnv {\n return value as unknown as NodeJS.ProcessEnv;\n}\n\nconst cliInputSchema = z.object({\n args: z.array(z.string()),\n env: z.object({\n HOME: z.string().optional(),\n MACWLT_LIB: z.string().optional(),\n }).passthrough(),\n});\n\nexport const cliVersion = \"0.1.0\";\n\nexport type CliResult = {\n readonly exitCode: number;\n readonly stdout: string;\n readonly stderr: string;\n};\n\nexport type CommandHook =\n () => Result<void, string> | Promise<Result<void, string>>;\n\nexport interface Command<P = unknown> {\n readonly name: string;\n readonly aliases?: readonly string[];\n readonly needsClient?: boolean;\n readonly beforeRun?: CommandHook;\n describe(): string;\n parse(args: readonly string[]): Result<P, string>;\n run(ctx: CommandContext, parsed: P): Promise<Result<string, string>>;\n}\n\nexport interface CommandContext {\n readonly env: NodeJS.ProcessEnv;\n readonly client: NativeClient;\n readonly registry: readonly Command[];\n readonly configStorage: ConfigStorage;\n}\n\nexport type RunCliOptions = {\n readonly configStorage?: ConfigStorage;\n readonly createConfigFile?: typeof createFileIfAbsent;\n};\n\nexport async function runCli(\n args: readonly string[],\n env: NodeJS.ProcessEnv = process.env,\n registry: readonly Command[] = commands,\n options: RunCliOptions = {},\n): Promise<CliResult> {\n const input = cliInputSchema.safeParse({ args: [...args], env });\n if (!input.success) return failure(\"invalid process input\");\n\n const processEnv = parsedEnv(input.data.env);\n const configStorage = options.configStorage ?? fileConfigStorage;\n const initialized = await ensureGlobalConfig({\n homeDirectory: processEnv.HOME?.length ? processEnv.HOME : undefined,\n createFile: options.createConfigFile,\n });\n if (!initialized.ok) {\n return failure(\n `failed to initialize config ${initialized.error.path}: ${messageFromUnknown(initialized.error.cause)}`,\n );\n }\n\n const [name, ...rest] = input.data.args;\n if (!name) return success(helpText(registry));\n\n const command = registry.find((c) => c.name === name || c.aliases?.includes(name));\n if (!command) return failure(`unknown command: ${name}\\n\\n${helpText(registry)}`);\n\n const parsed = command.parse(rest);\n if (!parsed.ok) return failure(parsed.error);\n\n if (command.needsClient === false) {\n const ctx: CommandContext = {\n env: processEnv,\n client: neverClient(),\n registry,\n configStorage,\n };\n return await runCommand(command, ctx, parsed.value);\n }\n\n const clientResult = openNativeClient(defaultLibraryPath(input.data.env.MACWLT_LIB));\n if (!clientResult.ok) return failure(formatNativeError(clientResult.error));\n\n const client = clientResult.value;\n try {\n const ctx: CommandContext = {\n env: processEnv,\n client,\n registry,\n configStorage,\n };\n return await runCommand(command, ctx, parsed.value);\n } finally {\n client.close();\n }\n}\n\nasync function runCommand<P>(command: Command<P>, ctx: CommandContext, parsed: P): Promise<CliResult> {\n if (command.beforeRun !== undefined) {\n const beforeRun = await command.beforeRun();\n if (!beforeRun.ok) return failure(beforeRun.error);\n }\n const result = await command.run(ctx, parsed);\n if (!result.ok) return failure(result.error);\n return success(result.value);\n}\n\nexport function helpText(registry: readonly Command[]): string {\n return [\n \"Usage:\",\n ...registry.map((c) => c.describe()).filter((line) => line.length > 0),\n \"\",\n \"Environment:\",\n \" MACWLT_LIB Override the bundled or checkout libmacwlt.dylib path\",\n ].join(\"\\n\");\n}\n\nfunction neverClient(): NativeClient {\n return {\n libraryPath: \"\",\n close: () => {},\n withWallet: <T, E>(_body: (wallet: never) => Result<T, E>): Result<T, E | NativeError> =>\n err({ kind: \"missing-library\", libraryPath: \"\" }) as unknown as Result<T, E | NativeError>,\n };\n}\n\nfunction success(stdout: string): CliResult {\n return { exitCode: 0, stdout: `${stdout}\\n`, stderr: \"\" };\n}\n\nfunction failure(stderr: string): CliResult {\n return { exitCode: 1, stdout: \"\", stderr: `${stderr}\\n` };\n}\n\nfunction messageFromUnknown(value: unknown): string {\n return value instanceof Error ? value.message : String(value);\n}\n","import { homedir } from \"node:os\";\nimport type { ConfigStorage } from \"./ConfigStorage\";\nimport { fileConfigStorage } from \"./fileConfigStorage\";\nimport {\n parseGlobalConfigData,\n type GlobalConfigData,\n} from \"./parseGlobalConfigData\";\nimport type { GlobalConfigValidationError } from \"./GlobalConfigValidationError\";\nimport { parseJsonValue, type JsonValue } from \"./parseJsonValue\";\nimport { globalConfigPath } from \"./globalConfigPath\";\nimport { err, ok, type Result } from \"../result\";\n\nexport type GlobalConfigLoadOptions = {\n readonly homeDirectory?: string;\n readonly storage?: ConfigStorage;\n};\n\nexport type GlobalConfigLoadError =\n | { readonly kind: \"read-failed\"; readonly path: string; readonly cause: unknown }\n | { readonly kind: \"invalid-json\"; readonly path: string; readonly message: string }\n | (GlobalConfigValidationError & { readonly path: string });\n\nexport type GlobalConfigSaveError = {\n readonly kind: \"write-failed\";\n readonly path: string;\n readonly cause: unknown;\n};\n\nexport class GlobalConfig {\n readonly #path: string;\n readonly #storage: ConfigStorage;\n #data: GlobalConfigData;\n #dirty = false;\n\n private constructor(\n path: string,\n storage: ConfigStorage,\n data: GlobalConfigData,\n ) {\n this.#path = path;\n this.#storage = storage;\n this.#data = data;\n }\n\n static async load(\n options: GlobalConfigLoadOptions = {},\n ): Promise<Result<GlobalConfig, GlobalConfigLoadError>> {\n const path = globalConfigPath(options.homeDirectory ?? homedir());\n const storage = options.storage ?? fileConfigStorage;\n\n let contents: string | undefined;\n try {\n contents = await storage.read(path);\n } catch (cause: unknown) {\n return err({ kind: \"read-failed\", path, cause });\n }\n\n if (contents === undefined) {\n return ok(new GlobalConfig(path, storage, {}));\n }\n\n let input: unknown;\n try {\n input = JSON.parse(contents) as unknown;\n } catch (caught: unknown) {\n return err({\n kind: \"invalid-json\",\n path,\n message: caught instanceof Error ? caught.message : String(caught),\n });\n }\n\n const parsed = parseGlobalConfigData(input);\n if (!parsed.ok) return err({ ...parsed.error, path });\n return ok(new GlobalConfig(path, storage, parsed.value));\n }\n\n get path(): string {\n return this.#path;\n }\n\n get dirty(): boolean {\n return this.#dirty;\n }\n\n get data(): GlobalConfigData {\n return cloneData(this.#data);\n }\n\n get(key: string): JsonValue | undefined {\n if (!Object.hasOwn(this.#data, key)) return undefined;\n const value = this.#data[key];\n return value === undefined ? undefined : cloneValue(value);\n }\n\n set(\n key: string,\n input: unknown,\n ): Result<void, GlobalConfigValidationError> {\n if (key.length === 0) {\n return err({ kind: \"invalid-config\", message: \"config key must not be empty\" });\n }\n const value = parseJsonValue(input);\n if (!value.ok) return value;\n\n this.#data = { ...this.#data, [key]: value.value };\n this.#dirty = true;\n return ok(undefined);\n }\n\n delete(key: string): void {\n if (!Object.hasOwn(this.#data, key)) return;\n const { [key]: removed, ...remaining } = this.#data;\n void removed;\n this.#data = remaining;\n this.#dirty = true;\n }\n\n replace(\n input: unknown,\n ): Result<void, GlobalConfigValidationError> {\n const data = parseGlobalConfigData(input);\n if (!data.ok) return data;\n\n this.#data = data.value;\n this.#dirty = true;\n return ok(undefined);\n }\n\n async save(): Promise<Result<void, GlobalConfigSaveError>> {\n const contents = `${JSON.stringify(this.#data, null, 2)}\\n`;\n try {\n await this.#storage.write(this.#path, contents);\n } catch (cause: unknown) {\n return err({ kind: \"write-failed\", path: this.#path, cause });\n }\n this.#dirty = false;\n return ok(undefined);\n }\n}\n\nfunction cloneData(data: GlobalConfigData): GlobalConfigData {\n return structuredClone(data);\n}\n\nfunction cloneValue(value: JsonValue): JsonValue {\n return structuredClone(value);\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { ConfigStorage } from \"./ConfigStorage\";\n\nexport const fileConfigStorage: ConfigStorage = {\n async read(path: string): Promise<string | undefined> {\n try {\n return await readFile(path, \"utf8\");\n } catch (caught: unknown) {\n if (isNotFoundError(caught)) return undefined;\n throw caught;\n }\n },\n\n async write(path: string, contents: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true, mode: 0o700 });\n await writeFile(path, contents, { encoding: \"utf8\", mode: 0o600 });\n },\n};\n\nfunction isNotFoundError(caught: unknown): boolean {\n return caught instanceof Error\n && \"code\" in caught\n && caught.code === \"ENOENT\";\n}\n","import { z } from \"zod\";\nimport type { GlobalConfigValidationError } from \"./GlobalConfigValidationError\";\nimport { parseJsonValue, type JsonValue } from \"./parseJsonValue\";\nimport { err, ok, type Result } from \"../result\";\n\nexport type GlobalConfigData = {\n readonly [key: string]: JsonValue;\n};\n\nconst globalConfigDataSchema = z.record(z.unknown());\n\nexport function parseGlobalConfigData(\n input: unknown,\n): Result<GlobalConfigData, GlobalConfigValidationError> {\n const parsed = globalConfigDataSchema.safeParse(input);\n if (!parsed.success) {\n return err({\n kind: \"invalid-config\",\n message: parsed.error.issues\n .map((issue) => `${issue.path.join(\".\") || \"config\"}: ${issue.message}`)\n .join(\"; \"),\n });\n }\n const data: Record<string, JsonValue> = {};\n for (const [key, inputValue] of Object.entries(parsed.data)) {\n const value = parseJsonValue(inputValue);\n if (!value.ok) {\n return err({\n kind: \"invalid-config\",\n message: `${key}: ${value.error.message}`,\n });\n }\n data[key] = value.value;\n }\n return ok(data);\n}\n","import { z } from \"zod\";\nimport type { GlobalConfigValidationError } from \"./GlobalConfigValidationError\";\nimport { err, ok, type Result } from \"../result\";\n\nexport type JsonValue =\n | null\n | boolean\n | number\n | string\n | readonly JsonValue[]\n | { readonly [key: string]: JsonValue };\n\nconst jsonValueSchema: z.ZodType<JsonValue> = z.lazy(() =>\n z.union([\n z.null(),\n z.boolean(),\n z.number().finite(),\n z.string(),\n z.array(jsonValueSchema),\n z.record(jsonValueSchema),\n ])\n);\n\nexport function parseJsonValue(\n input: unknown,\n): Result<JsonValue, GlobalConfigValidationError> {\n const parsed = jsonValueSchema.safeParse(input);\n if (!parsed.success) {\n return err({\n kind: \"invalid-config\",\n message: parsed.error.issues\n .map((issue) => `${issue.path.join(\".\") || \"value\"}: ${issue.message}`)\n .join(\"; \"),\n });\n }\n return ok(parsed.data);\n}\n","export type Result<T, E> =\n | { readonly ok: true; readonly value: T }\n | { readonly ok: false; readonly error: E };\n\nexport function ok<T, E>(value: T): Result<T, E> {\n return { ok: true, value };\n}\n\nexport function err<T, E>(error: E): Result<T, E> {\n return { ok: false, error };\n}\n","import { join } from \"node:path\";\n\nexport function globalConfigPath(homeDirectory: string): string {\n return join(homeDirectory, \".config\", \"macwlt\", \"config.json\");\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nexport async function createFileIfAbsent(\n path: string,\n contents: string,\n): Promise<\"created\" | \"already-exists\"> {\n await mkdir(dirname(path), { recursive: true, mode: 0o700 });\n try {\n await writeFile(path, contents, {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: 0o600,\n });\n return \"created\";\n } catch (caught: unknown) {\n if (isAlreadyExistsError(caught)) return \"already-exists\";\n throw caught;\n }\n}\n\nfunction isAlreadyExistsError(caught: unknown): boolean {\n return caught instanceof Error\n && \"code\" in caught\n && caught.code === \"EEXIST\";\n}\n","{\n \"ethereum\": {\n \"chains\": {\n \"1\": {\n \"name\": \"Ethereum Mainnet\",\n \"rpcUrl\": \"https://ethereum-rpc.publicnode.com\",\n \"nativeAsset\": {\n \"symbol\": \"ETH\"\n },\n \"assets\": [\n {\n \"symbol\": \"USDC\",\n \"address\": \"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48\"\n },\n {\n \"symbol\": \"USDT\",\n \"address\": \"0xdac17f958d2ee523a2206206994597c13d831ec7\"\n },\n {\n \"symbol\": \"WETH\",\n \"address\": \"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2\"\n }\n ]\n },\n \"42161\": {\n \"name\": \"Arbitrum One\",\n \"rpcUrl\": \"https://arbitrum-one-rpc.publicnode.com\",\n \"nativeAsset\": {\n \"symbol\": \"ETH\"\n },\n \"assets\": [\n {\n \"symbol\": \"USDC\",\n \"address\": \"0xaf88d065e77c8cc2239327c5edb3a432268e5831\"\n },\n {\n \"symbol\": \"USDT\",\n \"address\": \"0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9\"\n },\n {\n \"symbol\": \"WETH\",\n \"address\": \"0x82af49447d8a07e3bd95bd0d56f35241523fbab1\"\n }\n ]\n },\n \"8453\": {\n \"name\": \"Base\",\n \"rpcUrl\": \"https://base-rpc.publicnode.com\",\n \"nativeAsset\": {\n \"symbol\": \"ETH\"\n },\n \"assets\": [\n {\n \"symbol\": \"USDC\",\n \"address\": \"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913\"\n },\n {\n \"symbol\": \"WETH\",\n \"address\": \"0x4200000000000000000000000000000000000006\"\n }\n ]\n },\n \"10\": {\n \"name\": \"OP Mainnet\",\n \"rpcUrl\": \"https://optimism-rpc.publicnode.com\",\n \"nativeAsset\": {\n \"symbol\": \"ETH\"\n },\n \"assets\": [\n {\n \"symbol\": \"USDC\",\n \"address\": \"0x0b2c639c533813f4aa9d7837caf62653d097ff85\"\n },\n {\n \"symbol\": \"USDT\",\n \"address\": \"0x94b008aa00579c1307b0ef2c499ad98a8ce58e58\"\n },\n {\n \"symbol\": \"WETH\",\n \"address\": \"0x4200000000000000000000000000000000000006\"\n }\n ]\n },\n \"137\": {\n \"name\": \"Polygon PoS\",\n \"rpcUrl\": \"https://polygon-bor-rpc.publicnode.com\",\n \"nativeAsset\": {\n \"symbol\": \"POL\"\n },\n \"assets\": [\n {\n \"symbol\": \"USDC\",\n \"address\": \"0x3c499c542cef5e3811e1192ce70d8cc03d5c3359\"\n },\n {\n \"symbol\": \"USDT\",\n \"address\": \"0xc2132d05d31c914a87c6611c10748aeb04b58e8f\"\n },\n {\n \"symbol\": \"WETH\",\n \"address\": \"0x7ceb23fd6bc0add59e62ac25578270cff1b9f619\"\n }\n ]\n },\n \"56\": {\n \"name\": \"BNB Smart Chain\",\n \"rpcUrl\": \"https://bsc-rpc.publicnode.com\",\n \"nativeAsset\": {\n \"symbol\": \"BNB\"\n },\n \"assets\": [\n {\n \"symbol\": \"USDC\",\n \"address\": \"0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d\"\n },\n {\n \"symbol\": \"USDT\",\n \"address\": \"0x55d398326f99059ff775485246999027b3197955\"\n },\n {\n \"symbol\": \"WBNB\",\n \"address\": \"0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c\"\n }\n ]\n },\n \"43114\": {\n \"name\": \"Avalanche C-Chain\",\n \"rpcUrl\": \"https://avalanche-c-chain-rpc.publicnode.com\",\n \"nativeAsset\": {\n \"symbol\": \"AVAX\"\n },\n \"assets\": [\n {\n \"symbol\": \"USDC\",\n \"address\": \"0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e\"\n },\n {\n \"symbol\": \"USDT\",\n \"address\": \"0x9702230a8ea53601f5cd2dc00fdbc13d4df4a8c7\"\n },\n {\n \"symbol\": \"WAVAX\",\n \"address\": \"0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7\"\n }\n ]\n }\n }\n }\n}\n","import defaultConfigInput from \"../../config.default.json\";\nimport { parseGlobalConfigData } from \"./parseGlobalConfigData\";\n\nconst parsedDefaultConfig = parseGlobalConfigData(defaultConfigInput);\nif (!parsedDefaultConfig.ok) {\n throw new Error(\n `invalid config.default.json: ${parsedDefaultConfig.error.message}`,\n );\n}\n\nconst contents = `${JSON.stringify(parsedDefaultConfig.value, null, 2)}\\n`;\n\nexport function defaultGlobalConfigContents(): string {\n return contents;\n}\n","import { homedir } from \"node:os\";\nimport { createFileIfAbsent } from \"./createFileIfAbsent\";\nimport { defaultGlobalConfigContents } from \"./defaultGlobalConfigContents\";\nimport { globalConfigPath } from \"./globalConfigPath\";\nimport { err, ok, type Result } from \"../result\";\n\nexport type EnsureGlobalConfigOptions = {\n readonly homeDirectory?: string;\n readonly createFile?: typeof createFileIfAbsent;\n};\n\nexport type EnsureGlobalConfigError = {\n readonly kind: \"write-failed\";\n readonly path: string;\n readonly cause: unknown;\n};\n\nexport type EnsureGlobalConfigResult = {\n readonly path: string;\n readonly created: boolean;\n};\n\nexport async function ensureGlobalConfig(\n options: EnsureGlobalConfigOptions = {},\n): Promise<Result<EnsureGlobalConfigResult, EnsureGlobalConfigError>> {\n const path = globalConfigPath(options.homeDirectory ?? homedir());\n const createFile = options.createFile ?? createFileIfAbsent;\n\n try {\n const creation = await createFile(\n path,\n defaultGlobalConfigContents(),\n );\n return ok({ path, created: creation === \"created\" });\n } catch (cause: unknown) {\n return err({ kind: \"write-failed\", path, cause });\n }\n}\n","import { homedir } from \"node:os\";\nimport type { ConfigStorage } from \"./ConfigStorage\";\nimport { defaultGlobalConfigContents } from \"./defaultGlobalConfigContents\";\nimport { fileConfigStorage } from \"./fileConfigStorage\";\nimport { globalConfigPath } from \"./globalConfigPath\";\nimport { err, ok, type Result } from \"../result\";\n\nexport type ResetGlobalConfigOptions = {\n readonly homeDirectory?: string;\n readonly storage?: ConfigStorage;\n};\n\nexport type ResetGlobalConfigError = {\n readonly kind: \"write-failed\";\n readonly path: string;\n readonly cause: unknown;\n};\n\nexport async function resetGlobalConfig(\n options: ResetGlobalConfigOptions = {},\n): Promise<Result<string, ResetGlobalConfigError>> {\n const path = globalConfigPath(options.homeDirectory ?? homedir());\n const storage = options.storage ?? fileConfigStorage;\n\n try {\n await storage.write(path, defaultGlobalConfigContents());\n return ok(path);\n } catch (cause: unknown) {\n return err({ kind: \"write-failed\", path, cause });\n }\n}\n","import { dlopen, ptr, read, type Pointer } from \"bun:ffi\";\nimport { existsSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { err, ok, type Result } from \"./result\";\n\nconst MACWLT_SUCCESS = 0;\nconst MACWLT_ERR_BUFFER_TOO_SMALL = 5;\n\nconst nativeSymbols = {\n macwlt_wallet_create: { args: [\"ptr\"], returns: \"int\" },\n macwlt_wallet_free: { args: [\"ptr\"], returns: \"void\" },\n macwlt_last_error: { args: [\"ptr\"], returns: \"int\" },\n macwlt_last_error_message: { args: [\"ptr\"], returns: \"cstring\" },\n macwlt_reset_wallet: { args: [\"ptr\"], returns: \"int\" },\n macwlt_bootstrap_wallet: { args: [\"ptr\", \"ptr\", \"ptr\"], returns: \"int\" },\n macwlt_sign_psbt: { args: [\"ptr\", \"ptr\", \"usize\", \"ptr\", \"ptr\"], returns: \"int\" },\n macwlt_sign_eth_tx: { args: [\"ptr\", \"ptr\", \"usize\", \"ptr\", \"ptr\"], returns: \"int\" },\n macwlt_export_pubkey: { args: [\"ptr\", \"cstring\", \"ptr\", \"ptr\"], returns: \"int\" },\n macwlt_export_address: { args: [\"ptr\", \"cstring\", \"int\", \"ptr\", \"ptr\"], returns: \"int\" },\n} as const;\n\nexport type AddressType =\n | \"bitcoin\"\n | \"bitcoin-testnet\"\n | \"bitcoin-taproot\"\n | \"bitcoin-taproot-testnet\"\n | \"ethereum\";\n\nexport type NativeError =\n | { readonly kind: \"load\"; readonly libraryPath: string; readonly message: string }\n | { readonly kind: \"missing-library\"; readonly libraryPath: string }\n | { readonly kind: \"wallet-create\"; readonly message: string }\n | { readonly kind: \"native\"; readonly operation: string; readonly code: number; readonly message: string }\n | { readonly kind: \"oversized-output\"; readonly operation: string; readonly size: bigint };\n\nexport type NativeClient = {\n readonly libraryPath: string;\n readonly close: () => void;\n readonly withWallet: <T, E>(body: (wallet: NativeWallet) => Result<T, E>) => Result<T, E | NativeError>;\n};\n\nexport type NativeWallet = {\n readonly reset: () => Result<void, NativeError>;\n readonly bootstrap: () => Result<Uint8Array, NativeError>;\n readonly exportPubkey: (derivationPath: string) => Result<Uint8Array, NativeError>;\n readonly exportAddress: (derivationPath: string, addressType: AddressType) => Result<string, NativeError>;\n readonly signEthereumTransaction: (transaction: Uint8Array) => Result<Uint8Array, NativeError>;\n readonly signPsbt: (psbt: Uint8Array) => Result<Uint8Array, NativeError>;\n};\n\ntype NativeLibrary = ReturnType<typeof dlopen<typeof nativeSymbols>>;\ntype NativeSymbols = NativeLibrary[\"symbols\"];\n\nexport function defaultLibraryPath(envPath: string | undefined): string {\n if (envPath && envPath.length > 0) return resolve(envPath);\n\n const candidates = [\n resolve(join(import.meta.dir, \"../native/libmacwlt.dylib\")),\n resolve(join(process.cwd(), \"build/libmacwlt.dylib\")),\n resolve(join(process.cwd(), \"../build/libmacwlt.dylib\")),\n resolve(join(import.meta.dir, \"../../build/libmacwlt.dylib\")),\n resolve(join(import.meta.dir, \"../../../build/libmacwlt.dylib\")),\n ];\n return candidates.find((candidate) => existsSync(candidate)) ?? candidates[0] ?? resolve(\"build/libmacwlt.dylib\");\n}\n\nexport function openNativeClient(libraryPath: string): Result<NativeClient, NativeError> {\n if (!existsSync(libraryPath)) return err({ kind: \"missing-library\", libraryPath });\n\n let library: NativeLibrary;\n try {\n library = dlopen(libraryPath, nativeSymbols);\n } catch (caught: unknown) {\n return err({ kind: \"load\", libraryPath, message: messageFromUnknown(caught) });\n }\n\n const client: NativeClient = {\n libraryPath,\n close: () => library.close(),\n withWallet: <T, E>(body: (wallet: NativeWallet) => Result<T, E>): Result<T, E | NativeError> => {\n const walletResult = createWallet(library.symbols);\n if (!walletResult.ok) return walletResult;\n\n try {\n return body(walletResult.value);\n } finally {\n walletResult.value.close();\n }\n },\n };\n return ok(client);\n}\n\nfunction createWallet(symbols: NativeSymbols): Result<NativeWallet & { readonly close: () => void }, NativeError> {\n const walletSlot = new BigUint64Array(1);\n const createStatus = symbols.macwlt_wallet_create(ptr(walletSlot));\n const walletAddress = read.ptr(ptr(walletSlot));\n if (createStatus !== MACWLT_SUCCESS || walletAddress === 0) {\n return err({ kind: \"wallet-create\", message: \"macwlt_wallet_create failed\" });\n }\n\n const walletPointer = walletAddress as Pointer;\n const wallet: NativeWallet & { readonly close: () => void } = {\n close: () => {\n symbols.macwlt_wallet_free(walletPointer);\n },\n reset: () => {\n const status = symbols.macwlt_reset_wallet(walletPointer);\n if (status !== MACWLT_SUCCESS) {\n return err(nativeError(symbols, walletPointer, \"reset wallet\", symbols.macwlt_last_error(walletPointer)));\n }\n return ok(undefined);\n },\n bootstrap: () => outputBytes(symbols, walletPointer, \"bootstrap\", 33, (output, length) =>\n symbols.macwlt_bootstrap_wallet(walletPointer, output, length)\n ),\n exportPubkey: (derivationPath: string) =>\n outputBytes(symbols, walletPointer, \"export pubkey\", 33, (output, length) =>\n symbols.macwlt_export_pubkey(walletPointer, cString(derivationPath), output, length)\n ),\n exportAddress: (derivationPath: string, addressType: AddressType) => {\n const result = outputBytes(symbols, walletPointer, \"export address\", 96, (output, length) =>\n symbols.macwlt_export_address(walletPointer, cString(derivationPath), nativeAddressType(addressType), output, length)\n );\n if (!result.ok) return result;\n const terminator = result.value.indexOf(0);\n const addressBytes = terminator >= 0 ? result.value.slice(0, terminator) : result.value;\n return ok(new TextDecoder().decode(addressBytes));\n },\n signEthereumTransaction: (transaction: Uint8Array) =>\n outputBytes(symbols, walletPointer, \"sign ethereum transaction\", 65, (output, length) =>\n symbols.macwlt_sign_eth_tx(walletPointer, ptr(transaction), transaction.length, output, length)\n ),\n signPsbt: (psbt: Uint8Array) =>\n outputBytes(symbols, walletPointer, \"sign psbt\", Math.max(psbt.length + 1024, 1024), (output, length) =>\n symbols.macwlt_sign_psbt(walletPointer, ptr(psbt), psbt.length, output, length)\n ),\n };\n return ok(wallet);\n}\n\nfunction outputBytes(\n symbols: NativeSymbols,\n walletPointer: Pointer,\n operation: string,\n initialCapacity: number,\n call: (output: Pointer | null, length: Pointer) => number,\n): Result<Uint8Array, NativeError> {\n const firstLength = new BigUint64Array([BigInt(initialCapacity)]);\n const firstBuffer = initialCapacity > 0 ? new Uint8Array(initialCapacity) : null;\n const firstStatus = call(firstBuffer ? ptr(firstBuffer) : null, ptr(firstLength));\n if (firstStatus === MACWLT_SUCCESS && firstBuffer) {\n const lengthResult = sizeFromSlot(operation, firstLength);\n if (!lengthResult.ok) return lengthResult;\n return ok(firstBuffer.slice(0, lengthResult.value));\n }\n\n const firstError = symbols.macwlt_last_error(walletPointer);\n if (firstError !== MACWLT_ERR_BUFFER_TOO_SMALL) {\n return err(nativeError(symbols, walletPointer, operation, firstError));\n }\n\n const requiredLength = sizeFromSlot(operation, firstLength);\n if (!requiredLength.ok) return requiredLength;\n const retryLength = new BigUint64Array([BigInt(requiredLength.value)]);\n const retryBuffer = new Uint8Array(requiredLength.value);\n const retryStatus = call(ptr(retryBuffer), ptr(retryLength));\n if (retryStatus !== MACWLT_SUCCESS) {\n return err(nativeError(symbols, walletPointer, operation, symbols.macwlt_last_error(walletPointer)));\n }\n\n const finalLength = sizeFromSlot(operation, retryLength);\n if (!finalLength.ok) return finalLength;\n return ok(retryBuffer.slice(0, finalLength.value));\n}\n\nfunction sizeFromSlot(operation: string, slot: BigUint64Array): Result<number, NativeError> {\n const size = slot[0] ?? 0n;\n if (size > BigInt(Number.MAX_SAFE_INTEGER)) {\n return err({ kind: \"oversized-output\", operation, size });\n }\n return ok(Number(size));\n}\n\nfunction cString(value: string): Uint8Array {\n const encoded = new TextEncoder().encode(value);\n const output = new Uint8Array(encoded.length + 1);\n output.set(encoded);\n return output;\n}\n\nfunction nativeAddressType(addressType: AddressType): number {\n switch (addressType) {\n case \"bitcoin\":\n return 1;\n case \"bitcoin-testnet\":\n return 2;\n case \"ethereum\":\n return 3;\n case \"bitcoin-taproot\":\n return 4;\n case \"bitcoin-taproot-testnet\":\n return 5;\n }\n}\n\nfunction nativeError(symbols: NativeSymbols, walletPointer: Pointer, operation: string, code: number): NativeError {\n const nativeMessage = symbols.macwlt_last_error_message(walletPointer);\n const message = nativeMessage ? nativeMessage.toString() : messageForNativeCode(code);\n return { kind: \"native\", operation, code, message };\n}\n\nfunction messageForNativeCode(code: number): string {\n switch (code) {\n case 1:\n return \"invalid argument\";\n case 2:\n return \"wallet data is unavailable\";\n case 3:\n return \"authentication is required\";\n case 4:\n return \"authentication failed\";\n case 5:\n return \"output buffer is too small\";\n case 6:\n return \"operation is unsupported\";\n case 7:\n return \"input parsing failed\";\n case 8:\n return \"signing failed\";\n case 9:\n return \"internal native error\";\n default:\n return `unknown native error ${code}`;\n }\n}\n\nfunction messageFromUnknown(caught: unknown): string {\n if (caught instanceof Error) return caught.message;\n return String(caught);\n}\n","import type { NativeError } from \"./native\";\n\nexport function formatNativeError(error: NativeError): string {\n switch (error.kind) {\n case \"missing-library\":\n return `native library not found at ${error.libraryPath}; reinstall @macwlt/cli, run make build in a checkout, or set MACWLT_LIB`;\n case \"load\":\n return `failed to load ${error.libraryPath}: ${error.message}`;\n case \"wallet-create\":\n return error.message;\n case \"native\":\n return `${error.operation} failed: ${error.message}`;\n case \"oversized-output\":\n return `${error.operation} produced an oversized output (${error.size.toString()} bytes)`;\n }\n}\n\nexport function formatExecutionError(error: string | NativeError): string {\n return typeof error === \"string\" ? error : formatNativeError(error);\n}\n","import { err, ok, type Result } from \"./result\";\n\nexport type ParsedFlags = {\n readonly json: boolean;\n readonly positionals: readonly string[];\n readonly options: ReadonlyMap<string, string>;\n readonly switches: ReadonlySet<string>;\n};\n\nexport function parseFlags(args: readonly string[]): Result<ParsedFlags, string> {\n let json = false;\n const positionals: string[] = [];\n const options = new Map<string, string>();\n const switches = new Set<string>();\n\n for (let index = 0; index < args.length; index++) {\n const arg = args[index];\n if (!arg) continue;\n if (arg === \"--json\") {\n json = true;\n continue;\n }\n if (arg === \"--reset\" || arg === \"--yes\") {\n switches.add(arg.slice(2));\n continue;\n }\n if (!arg.startsWith(\"--\")) {\n positionals.push(arg);\n continue;\n }\n\n const key = arg.slice(2);\n if (key.length === 0) return err(\"empty option name\");\n const value = args[index + 1];\n if (!value || value.startsWith(\"--\")) return err(`missing value for --${key}`);\n options.set(key, value);\n index++;\n }\n\n return ok({ json, positionals, options, switches });\n}","import type { NativeClient, NativeWallet } from \"./native\";\nimport { err, ok, type Result } from \"./result\";\nimport { formatExecutionError } from \"./nativeError\";\n\nexport function runWithWallet<T>(\n client: NativeClient,\n body: (wallet: NativeWallet) => Result<T, string>,\n): Result<T, string> {\n const result = client.withWallet<T, string>(body);\n if (!result.ok) return err(formatExecutionError(result.error));\n return ok(result.value);\n}","import { err, ok, type Result } from \"./result\";\n\nexport type Base64Error =\n | { readonly kind: \"empty\" }\n | { readonly kind: \"invalid\"; readonly value: string };\n\nexport function bytesToBase64(bytes: Uint8Array): string {\n return Buffer.from(bytes).toString(\"base64\");\n}\n\nexport function base64ToBytes(input: string): Result<Uint8Array, Base64Error> {\n if (input.length === 0) return err({ kind: \"empty\" });\n const normalized = input.trim();\n if (normalized.length === 0) return err({ kind: \"empty\" });\n\n const decoded = Buffer.from(normalized, \"base64\");\n if (decoded.length === 0 || Buffer.from(decoded).toString(\"base64\").replace(/=+$/, \"\") !== normalized.replace(/=+$/, \"\")) {\n return err({ kind: \"invalid\", value: input });\n }\n return ok(new Uint8Array(decoded));\n}\n","import { err, ok, type Result } from \"./result\";\n\nexport type HexError =\n | { readonly kind: \"empty\" }\n | { readonly kind: \"invalid\"; readonly value: string };\n\nexport function bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nexport function hexToBytes(input: string): Result<Uint8Array, HexError> {\n const normalized = input.startsWith(\"0x\") || input.startsWith(\"0X\")\n ? input.slice(2)\n : input;\n if (normalized.length === 0) return err({ kind: \"empty\" });\n if (normalized.length % 2 !== 0 || !/^[0-9a-fA-F]+$/.test(normalized)) {\n return err({ kind: \"invalid\", value: input });\n }\n\n const bytes = new Uint8Array(normalized.length / 2);\n for (let index = 0; index < bytes.length; index++) {\n const pair = normalized.slice(index * 2, index * 2 + 2);\n bytes[index] = Number.parseInt(pair, 16);\n }\n return ok(bytes);\n}\n","import { bytesToBase64 } from \"./base64\";\nimport { bytesToHex } from \"./hex\";\n\nexport function formatDataOutput(bytes: Uint8Array, json: boolean, key: string): string {\n const hex = bytesToHex(bytes);\n if (!json) return hex;\n return JSON.stringify({ [key]: hex }, null, 2);\n}\n\nexport type PsbtTextFormat = \"base64\" | \"hex\";\n\nexport function formatPsbt(bytes: Uint8Array, format: PsbtTextFormat): string {\n return format === \"base64\" ? bytesToBase64(bytes) : bytesToHex(bytes);\n}","import { err, ok, type Result } from \"../result\";\nimport { parseFlags } from \"../parseFlags\";\nimport { runWithWallet } from \"../withWallet\";\nimport { formatDataOutput } from \"../walletOutput\";\nimport { formatNativeError } from \"../nativeError\";\nimport type { Command, CommandContext } from \"../command\";\n\nexport type CreateArgs = { readonly reset: boolean; readonly json: boolean };\n\nexport const createCommand: Command<CreateArgs> = {\n name: \"create\",\n describe(): string {\n return \" macwlt create [--reset] [--json]\";\n },\n parse: parseCreate,\n async run(ctx: CommandContext, args: CreateArgs): Promise<Result<string, string>> {\n const result = runWithWallet<string>(ctx.client, (wallet) => {\n if (args.reset) {\n const reset = wallet.reset();\n if (!reset.ok) return err(formatNativeError(reset.error));\n }\n const publicKey = wallet.bootstrap();\n if (!publicKey.ok) return err(formatNativeError(publicKey.error));\n return ok(formatDataOutput(publicKey.value, args.json, \"jointPublicKey\"));\n });\n return result;\n },\n};\n\nfunction parseCreate(args: readonly string[]): Result<CreateArgs, string> {\n const flags = parseFlags(args);\n if (!flags.ok) return flags;\n if (flags.value.positionals.length > 0) return err(\"create does not accept positional arguments\");\n return ok({ reset: flags.value.switches.has(\"reset\"), json: flags.value.json });\n}","import { createInterface } from \"node:readline/promises\";\n\nexport type ConfirmationPrompt = (question: string) => Promise<boolean>;\n\nexport async function terminalConfirmationPrompt(\n question: string,\n): Promise<boolean> {\n const readline = createInterface({\n input: process.stdin,\n output: process.stderr,\n });\n try {\n return isAffirmativeConfirmation(await readline.question(question));\n } catch {\n return false;\n } finally {\n readline.close();\n }\n}\n\nfunction isAffirmativeConfirmation(answer: string): boolean {\n const normalized = answer.trim().toLowerCase();\n return normalized === \"y\" || normalized === \"yes\";\n}\n","import type { CommandHook } from \"../command\";\nimport { err, ok } from \"../result\";\nimport {\n terminalConfirmationPrompt,\n type ConfirmationPrompt,\n} from \"../terminalConfirmationPrompt\";\n\nexport function createConfirmationHook(\n prompt: ConfirmationPrompt = terminalConfirmationPrompt,\n): CommandHook {\n return async () => {\n const confirmed = await prompt(\"Continue? [y/N] \");\n return confirmed ? ok(undefined) : err(\"command cancelled\");\n };\n}\n","import { err, ok, type Result } from \"../result\";\nimport { parseFlags } from \"../parseFlags\";\nimport { runWithWallet } from \"../withWallet\";\nimport { formatNativeError } from \"../nativeError\";\nimport type { Command, CommandContext } from \"../command\";\nimport { createConfirmationHook } from \"../hooks/createConfirmationHook\";\n\nexport type ResetArgs = { readonly json: boolean };\n\nexport const resetCommand: Command<ResetArgs> = {\n name: \"reset\",\n beforeRun: createConfirmationHook(),\n describe(): string {\n return \" macwlt reset --yes [--json]\";\n },\n parse: parseReset,\n async run(ctx: CommandContext, args: ResetArgs): Promise<Result<string, string>> {\n return runWithWallet<string>(ctx.client, (wallet) => {\n const reset = wallet.reset();\n if (!reset.ok) return err(formatNativeError(reset.error));\n if (!args.json) return ok(\"wallet reset\");\n return ok(JSON.stringify({ reset: true }, null, 2));\n });\n },\n};\n\nfunction parseReset(args: readonly string[]): Result<ResetArgs, string> {\n const flags = parseFlags(args);\n if (!flags.ok) return flags;\n if (flags.value.positionals.length > 0) return err(\"reset does not accept positional arguments\");\n if (!flags.value.switches.has(\"yes\")) return err(\"reset requires --yes\");\n return ok({ json: flags.value.json });\n}","import type { Command, CommandContext } from \"../command\";\nimport { resetGlobalConfig } from \"../config\";\nimport { createConfirmationHook } from \"../hooks/createConfirmationHook\";\nimport { parseFlags } from \"../parseFlags\";\nimport { err, ok, type Result } from \"../result\";\n\nexport type ResetConfigArgs = { readonly json: boolean };\n\nexport const resetConfigCommand: Command<ResetConfigArgs> = {\n name: \"reset-config\",\n needsClient: false,\n beforeRun: createConfirmationHook(),\n describe(): string {\n return \" macwlt reset-config [--json]\";\n },\n parse: parseResetConfig,\n async run(\n ctx: CommandContext,\n args: ResetConfigArgs,\n ): Promise<Result<string, string>> {\n const reset = await resetGlobalConfig({\n homeDirectory: ctx.env.HOME?.length ? ctx.env.HOME : undefined,\n storage: ctx.configStorage,\n });\n if (!reset.ok) {\n return err(\n `failed to reset config ${reset.error.path}: ${messageFromUnknown(reset.error.cause)}`,\n );\n }\n\n if (!args.json) return ok(`config reset to defaults: ${reset.value}`);\n return ok(JSON.stringify({\n reset: true,\n path: reset.value,\n }, null, 2));\n },\n};\n\nexport function parseResetConfig(\n args: readonly string[],\n): Result<ResetConfigArgs, string> {\n const flags = parseFlags(args);\n if (!flags.ok) return flags;\n if (flags.value.positionals.length > 0) {\n return err(\"reset-config does not accept positional arguments\");\n }\n if (flags.value.options.size > 0 || flags.value.switches.size > 0) {\n return err(\"reset-config only accepts --json\");\n }\n return ok({ json: flags.value.json });\n}\n\nfunction messageFromUnknown(value: unknown): string {\n return value instanceof Error ? value.message : String(value);\n}\n","import { err, ok, type Result } from \"../result\";\nimport { parseFlags } from \"../parseFlags\";\nimport { runWithWallet } from \"../withWallet\";\nimport { formatDataOutput } from \"../walletOutput\";\nimport { formatNativeError } from \"../nativeError\";\nimport type { Command, CommandContext } from \"../command\";\n\nexport type PubkeyArgs = { readonly derivationPath: string; readonly json: boolean };\n\nexport const pubkeyCommand: Command<PubkeyArgs> = {\n name: \"pubkey\",\n describe(): string {\n return \" macwlt pubkey [path] [--json]\";\n },\n parse: parsePubkey,\n async run(ctx: CommandContext, args: PubkeyArgs): Promise<Result<string, string>> {\n return runWithWallet<string>(ctx.client, (wallet) => {\n const bootstrapped = wallet.bootstrap();\n if (!bootstrapped.ok) return err(formatNativeError(bootstrapped.error));\n const publicKey = wallet.exportPubkey(args.derivationPath);\n if (!publicKey.ok) return err(formatNativeError(publicKey.error));\n return ok(formatDataOutput(publicKey.value, args.json, \"publicKey\"));\n });\n },\n};\n\nfunction parsePubkey(args: readonly string[]): Result<PubkeyArgs, string> {\n const flags = parseFlags(args);\n if (!flags.ok) return flags;\n if (flags.value.positionals.length > 1) return err(\"pubkey accepts at most one derivation path\");\n return ok({ derivationPath: flags.value.positionals[0] ?? \"m\", json: flags.value.json });\n}","import { err, ok, type Result } from \"../result\";\nimport { parseFlags } from \"../parseFlags\";\nimport { runWithWallet } from \"../withWallet\";\nimport { formatNativeError } from \"../nativeError\";\nimport type { AddressType } from \"../native\";\nimport type { Command, CommandContext } from \"../command\";\n\nexport type AddressArgs = {\n readonly derivationPath: string;\n readonly addressType: AddressType;\n readonly json: boolean;\n};\n\nexport const addressCommand: Command<AddressArgs> = {\n name: \"address\",\n describe(): string {\n return \" macwlt address [path] --type bitcoin|bitcoin-testnet|bitcoin-taproot|bitcoin-taproot-testnet|ethereum [--json]\";\n },\n parse: parseAddress,\n async run(ctx: CommandContext, args: AddressArgs): Promise<Result<string, string>> {\n return runWithWallet<string>(ctx.client, (wallet) => {\n const bootstrapped = wallet.bootstrap();\n if (!bootstrapped.ok) return err(formatNativeError(bootstrapped.error));\n const address = wallet.exportAddress(args.derivationPath, args.addressType);\n if (!address.ok) return err(formatNativeError(address.error));\n if (!args.json) return ok(address.value);\n return ok(JSON.stringify({ address: address.value, derivationPath: args.derivationPath, type: args.addressType }, null, 2));\n });\n },\n};\n\nfunction parseAddress(args: readonly string[]): Result<AddressArgs, string> {\n const flags = parseFlags(args);\n if (!flags.ok) return flags;\n if (flags.value.positionals.length > 1) return err(\"address accepts at most one derivation path\");\n const type = flags.value.options.get(\"type\");\n if (!isAddressType(type)) {\n return err(\n \"address requires --type bitcoin|bitcoin-testnet|bitcoin-taproot|bitcoin-taproot-testnet|ethereum\",\n );\n }\n return ok({ derivationPath: flags.value.positionals[0] ?? \"m\", addressType: type, json: flags.value.json });\n}\n\nexport function isAddressType(value: string | undefined): value is AddressType {\n return value === \"bitcoin\"\n || value === \"bitcoin-testnet\"\n || value === \"bitcoin-taproot\"\n || value === \"bitcoin-taproot-testnet\"\n || value === \"ethereum\";\n}","import { err, ok, type Result } from \"./result\";\nimport { base64ToBytes } from \"./base64\";\nimport { hexToBytes } from \"./hex\";\n\nexport type BytesInput =\n | { readonly kind: \"hex\"; readonly value: string }\n | { readonly kind: \"base64\"; readonly value: string }\n | { readonly kind: \"file\"; readonly path: string };\n\nexport function parseBytesInput(\n options: ReadonlyMap<string, string>,\n allowed: readonly string[],\n): Result<BytesInput, string> {\n const entries = allowed.flatMap((key) => {\n const value = options.get(key);\n return value ? [{ key, value }] : [];\n });\n if (entries.length !== 1) return err(`provide exactly one input option: ${allowed.map((key) => `--${key}`).join(\", \")}`);\n\n const input = entries[0];\n if (!input) return err(\"missing input\");\n if (input.key === \"hex\") return ok({ kind: \"hex\", value: input.value });\n if (input.key === \"base64\") return ok({ kind: \"base64\", value: input.value });\n return ok({ kind: \"file\", path: input.value });\n}\n\nexport async function readInput(input: BytesInput): Promise<Result<Uint8Array, string>> {\n switch (input.kind) {\n case \"hex\": {\n const decoded = hexToBytes(input.value);\n if (!decoded.ok) return err(decoded.error.kind === \"empty\" ? \"hex input is empty\" : `invalid hex input: ${decoded.error.value}`);\n return decoded;\n }\n case \"base64\": {\n const decoded = base64ToBytes(input.value);\n if (!decoded.ok) return err(decoded.error.kind === \"empty\" ? \"base64 input is empty\" : \"invalid base64 input\");\n return decoded;\n }\n case \"file\": {\n try {\n return ok(new Uint8Array(await Bun.file(input.path).arrayBuffer()));\n } catch (caught: unknown) {\n return err(`failed to read ${input.path}: ${caught instanceof Error ? caught.message : String(caught)}`);\n }\n }\n }\n}","import { err, ok, type Result } from \"../result\";\nimport { parseFlags } from \"../parseFlags\";\nimport { readInput, parseBytesInput, type BytesInput } from \"../bytesInput\";\nimport { runWithWallet } from \"../withWallet\";\nimport { formatDataOutput } from \"../walletOutput\";\nimport { formatNativeError } from \"../nativeError\";\nimport type { Command, CommandContext } from \"../command\";\n\nexport type SignEthArgs = { readonly input: BytesInput; readonly json: boolean };\n\nexport const signEthCommand: Command<SignEthArgs> = {\n name: \"sign-eth\",\n describe(): string {\n return \" macwlt sign-eth --hex <typed-transaction-preimage-hex> [--json]\";\n },\n parse: parseSignEth,\n async run(ctx: CommandContext, args: SignEthArgs): Promise<Result<string, string>> {\n const transaction = await readInput(args.input);\n if (!transaction.ok) return transaction;\n return runWithWallet<string>(ctx.client, (wallet) => {\n const bootstrapped = wallet.bootstrap();\n if (!bootstrapped.ok) return err(formatNativeError(bootstrapped.error));\n const signature = wallet.signEthereumTransaction(transaction.value);\n if (!signature.ok) return err(formatNativeError(signature.error));\n return ok(formatDataOutput(signature.value, args.json, \"signature\"));\n });\n },\n};\n\nfunction parseSignEth(args: readonly string[]): Result<SignEthArgs, string> {\n const flags = parseFlags(args);\n if (!flags.ok) return flags;\n if (flags.value.positionals.length > 0) return err(\"sign-eth does not accept positional arguments\");\n const input = parseBytesInput(flags.value.options, [\"hex\", \"in\"]);\n if (!input.ok) return input;\n return ok({ input: input.value, json: flags.value.json });\n}","import { err, ok, type Result } from \"../result\";\nimport { parseFlags } from \"../parseFlags\";\nimport { readInput, parseBytesInput, type BytesInput } from \"../bytesInput\";\nimport { runWithWallet } from \"../withWallet\";\nimport { formatPsbt, type PsbtTextFormat } from \"../walletOutput\";\nimport { formatNativeError } from \"../nativeError\";\nimport type { Command, CommandContext } from \"../command\";\n\nexport type PsbtOutputFormat = PsbtTextFormat | \"raw\";\n\ntype OutputTarget =\n | { readonly kind: \"stdout\" }\n | { readonly kind: \"file\"; readonly path: string };\n\nexport type SignPsbtArgs = {\n readonly input: BytesInput;\n readonly output: OutputTarget;\n readonly format: PsbtOutputFormat;\n readonly json: boolean;\n};\n\nexport const signPsbtCommand: Command<SignPsbtArgs> = {\n name: \"sign-psbt\",\n describe(): string {\n return [\n \" macwlt sign-psbt --base64 <psbt> [--format base64|hex] [--json]\",\n \" macwlt sign-psbt --hex <psbt-hex> [--out <file>] [--format base64|hex|raw]\",\n \" macwlt sign-psbt --in <file> [--out <file>] [--format base64|hex|raw]\",\n ].join(\"\\n\");\n },\n parse: parseSignPsbt,\n async run(ctx: CommandContext, args: SignPsbtArgs): Promise<Result<string, string>> {\n const psbt = await readInput(args.input);\n if (!psbt.ok) return psbt;\n const signedResult = runWithWallet<Uint8Array>(ctx.client, (wallet) => {\n const bootstrapped = wallet.bootstrap();\n if (!bootstrapped.ok) return err(formatNativeError(bootstrapped.error));\n const signedPsbt = wallet.signPsbt(psbt.value);\n if (!signedPsbt.ok) return err(formatNativeError(signedPsbt.error));\n return ok(signedPsbt.value);\n });\n if (!signedResult.ok) return signedResult;\n\n if (args.output.kind === \"file\") {\n const bytes = args.format === \"raw\"\n ? signedResult.value\n : new TextEncoder().encode(formatPsbt(signedResult.value, args.format));\n await Bun.write(args.output.path, bytes);\n return ok(args.json\n ? JSON.stringify({ output: args.output.path, format: args.format }, null, 2)\n : args.output.path);\n }\n\n if (args.format === \"raw\") return err(\"--format raw requires --out <file>\");\n if (args.json) return ok(JSON.stringify({ signedPsbt: formatPsbt(signedResult.value, args.format), format: args.format }, null, 2));\n return ok(formatPsbt(signedResult.value, args.format));\n },\n};\n\nfunction parseSignPsbt(args: readonly string[]): Result<SignPsbtArgs, string> {\n const flags = parseFlags(args);\n if (!flags.ok) return flags;\n if (flags.value.positionals.length > 0) return err(\"sign-psbt does not accept positional arguments\");\n const input = parseBytesInput(flags.value.options, [\"base64\", \"hex\", \"in\"]);\n if (!input.ok) return input;\n const format = flags.value.options.get(\"format\") ?? \"base64\";\n if (!isPsbtOutputFormat(format)) return err(\"--format must be base64, hex, or raw\");\n const out = flags.value.options.get(\"out\");\n return ok({\n input: input.value,\n output: out ? { kind: \"file\", path: out } : { kind: \"stdout\" },\n format,\n json: flags.value.json,\n });\n}\n\nexport function isPsbtOutputFormat(value: string): value is PsbtOutputFormat {\n return value === \"base64\" || value === \"hex\" || value === \"raw\";\n}","import { ok, type Result } from \"../result\";\nimport { helpText, type Command, type CommandContext } from \"../command\";\n\nexport type HelpArgs = { readonly kind: \"help\" };\n\nexport const helpCommand: Command<HelpArgs> = {\n name: \"help\",\n aliases: [\"--help\", \"-h\"],\n needsClient: false,\n describe(): string {\n return \"\";\n },\n parse(_args: readonly string[]): Result<HelpArgs, string> {\n return ok({ kind: \"help\" });\n },\n async run(ctx: CommandContext, _args: HelpArgs): Promise<Result<string, string>> {\n return ok(helpText(ctx.registry));\n },\n};","import { ok, type Result } from \"../result\";\nimport { cliVersion, type Command, type CommandContext } from \"../command\";\n\nexport type VersionArgs = { readonly kind: \"version\" };\n\nexport const versionCommand: Command<VersionArgs> = {\n name: \"version\",\n aliases: [\"--version\", \"-v\"],\n needsClient: false,\n describe(): string {\n return \" macwlt version\";\n },\n parse(_args: readonly string[]): Result<VersionArgs, string> {\n return ok({ kind: \"version\" });\n },\n async run(_ctx: CommandContext, _args: VersionArgs): Promise<Result<string, string>> {\n return ok(`macwlt ${cliVersion}`);\n },\n};","import { isAddress } from \"viem\";\nimport type { Command, CommandContext } from \"../command\";\nimport {\n EthereumClient,\n createViemTransport,\n parseEthereumAsset,\n parseEthereumConfig,\n sendErc20Token,\n sendNativeEth,\n type Erc20TransactionSigner,\n type EthereumAddress,\n type SendErc20TokenError,\n type SendNativeEthError,\n} from \"../ethereum\";\nimport { ethereumWalletAddress } from \"./ethereumWalletAddress\";\nimport { formatEthereumClientError } from \"./formatEthereumClientError\";\nimport { resolveEthereumCommandRpcUrl } from \"./resolveEthereumCommandRpcUrl\";\nimport { formatNativeError } from \"../nativeError\";\nimport { parseFlags } from \"../parseFlags\";\nimport { err, ok, type Result } from \"../result\";\nimport { runWithWallet } from \"../withWallet\";\n\nexport type SendArgs = {\n readonly amount: string;\n readonly asset:\n | { readonly kind: \"native-eth\" }\n | { readonly kind: \"erc20\"; readonly tokenAddress: EthereumAddress };\n readonly chainId: number;\n readonly recipient: EthereumAddress;\n readonly rpcUrl: string | undefined;\n readonly derivationPath: string;\n readonly json: boolean;\n};\n\nexport const sendCommand: Command<SendArgs> = {\n name: \"send\",\n describe(): string {\n return \" macwlt send <amount> <token-address|ETH> <chain-id> <recipient> [--rpc <url>] [--path <derivation-path>] [--json]\";\n },\n parse: parseSend,\n async run(ctx: CommandContext, args: SendArgs): Promise<Result<string, string>> {\n const rpcUrl = await resolveEthereumCommandRpcUrl(\n ctx.env,\n args.chainId,\n args.rpcUrl,\n );\n if (!rpcUrl.ok) return rpcUrl;\n\n const ethereumClient = EthereumClient.create(\n { rpcUrl: rpcUrl.value, chainId: args.chainId },\n createViemTransport,\n );\n if (!ethereumClient.ok) {\n return err(`invalid Ethereum client configuration: ${ethereumClient.error.kind}`);\n }\n\n const signer = ethereumSigner(ctx, args.derivationPath);\n if (!signer.ok) return signer;\n if (args.asset.kind === \"native-eth\") {\n const sent = await sendNativeEth(ethereumClient.value, signer.value, {\n recipient: args.recipient,\n amount: args.amount,\n });\n if (!sent.ok) return err(formatNativeSendError(sent.error));\n if (!args.json) return ok(sent.value.transactionHash);\n return ok(JSON.stringify({\n transactionHash: sent.value.transactionHash,\n chainId: args.chainId,\n asset: \"ETH\",\n recipient: args.recipient,\n from: sent.value.from,\n amount: args.amount,\n amountWei: sent.value.amountWei.toString(),\n feeWei: sent.value.feeWei.toString(),\n }, null, 2));\n } else {\n const sent = await sendErc20Token(ethereumClient.value, signer.value, {\n tokenAddress: args.asset.tokenAddress,\n recipient: args.recipient,\n amount: args.amount,\n });\n if (!sent.ok) return err(formatSendError(sent.error));\n\n if (!args.json) return ok(sent.value.transactionHash);\n return ok(JSON.stringify({\n transactionHash: sent.value.transactionHash,\n chainId: args.chainId,\n tokenAddress: args.asset.tokenAddress,\n recipient: args.recipient,\n from: sent.value.from,\n amount: args.amount,\n amountBaseUnits: sent.value.amountBaseUnits.toString(),\n decimals: sent.value.decimals,\n }, null, 2));\n }\n },\n};\n\nexport function parseSend(args: readonly string[]): Result<SendArgs, string> {\n const flags = parseFlags(args);\n if (!flags.ok) return flags;\n if (flags.value.positionals.length !== 4) {\n return err(\n \"send requires <amount> <token-address> <chain-id> <recipient>\",\n );\n }\n if (flags.value.switches.size > 0) {\n return err(\"send does not accept switch options\");\n }\n for (const option of flags.value.options.keys()) {\n if (option !== \"rpc\" && option !== \"path\") {\n return err(`unknown send option: --${option}`);\n }\n }\n\n const [amount, assetValue, chainIdValue, recipient] =\n flags.value.positionals;\n if (!amount || !/^(?:0|[1-9]\\d*)(?:\\.\\d+)?$/.test(amount)) {\n return err(\"send amount must be a non-negative decimal number\");\n }\n if (/^0(?:\\.0+)?$/.test(amount)) {\n return err(\"send amount must be greater than zero\");\n }\n if (!assetValue) {\n return err(\"send token-address must be ETH or a valid Ethereum address\");\n }\n const asset = parseEthereumAsset(assetValue);\n if (!asset.ok) {\n return err(\"send token-address must be ETH or a valid Ethereum address\");\n }\n if (!recipient || !isAddress(recipient)) {\n return err(\"send recipient must be a valid Ethereum address\");\n }\n\n const chainId = Number(chainIdValue);\n if (!Number.isSafeInteger(chainId) || chainId <= 0) {\n return err(\"send chain-id must be a positive integer\");\n }\n\n const rpcUrl = flags.value.options.get(\"rpc\");\n if (rpcUrl !== undefined) {\n const config = parseEthereumConfig({ rpcUrl, chainId });\n if (!config.ok) return err(\"send --rpc must be a valid HTTP(S) URL\");\n }\n\n return ok({\n amount,\n asset: asset.value,\n chainId,\n recipient,\n rpcUrl,\n derivationPath: flags.value.options.get(\"path\") ?? \"m\",\n json: flags.value.json,\n });\n}\n\nfunction ethereumSigner(\n ctx: CommandContext,\n derivationPath: string,\n): Result<Erc20TransactionSigner, string> {\n const address = ethereumWalletAddress(ctx.client, derivationPath);\n if (!address.ok) return address;\n\n return ok({\n address: address.value,\n sign(transaction: Uint8Array): Result<Uint8Array, string> {\n return runWithWallet<Uint8Array>(ctx.client, (wallet) => {\n const bootstrapped = wallet.bootstrap();\n if (!bootstrapped.ok) return err(formatNativeError(bootstrapped.error));\n const signature = wallet.signEthereumTransaction(transaction);\n if (!signature.ok) return err(formatNativeError(signature.error));\n return ok(signature.value);\n });\n },\n });\n}\n\nfunction formatSendError(error: SendErc20TokenError): string {\n switch (error.kind) {\n case \"chain-client\":\n return `${error.stage} failed: ${formatEthereumClientError(error.error)}`;\n case \"missing-token-decimals\":\n return \"token decimals call returned no data\";\n case \"token-decimals\":\n return `invalid token decimals response: ${error.error.message}`;\n case \"token-amount\":\n return error.error.kind === \"zero-token-amount\"\n ? \"send amount must be greater than zero\"\n : `send amount ${error.error.value} cannot be represented by this token`;\n case \"signing-failed\":\n return `transaction signing failed: ${error.message}`;\n case \"invalid-signature\":\n return error.error.kind === \"invalid-signature-length\"\n ? `native wallet returned a ${error.error.actual}-byte Ethereum signature; expected 65`\n : `native wallet returned invalid Ethereum recovery parity ${error.error.actual}`;\n }\n}\n\nfunction formatNativeSendError(error: SendNativeEthError): string {\n switch (error.kind) {\n case \"chain-client\":\n return `${error.stage} failed: ${formatEthereumClientError(error.error)}`;\n case \"amount\":\n return error.error.kind === \"zero-token-amount\"\n ? \"send amount must be greater than zero\"\n : \"send ETH amount is invalid\";\n case \"insufficient-funds\":\n return `insufficient ETH balance: have ${error.balanceWei} wei, require ${error.requiredWei} wei including gas`;\n case \"signing-failed\":\n return `transaction signing failed: ${error.message}`;\n case \"invalid-signature\":\n return error.error.kind === \"invalid-signature-length\"\n ? `native wallet returned a ${error.error.actual}-byte Ethereum signature; expected 65`\n : `native wallet returned invalid Ethereum recovery parity ${error.error.actual}`;\n }\n}\n","import { z } from \"zod\";\nimport { err, ok, type Result } from \"../result\";\n\nexport type ChainId = number & { readonly __brand: \"ChainId\" };\nexport type RpcUrl = string & { readonly __brand: \"RpcUrl\" };\n\nexport type EthereumConfig = {\n readonly rpcUrl: RpcUrl;\n readonly chainId: ChainId;\n};\n\nexport type EthereumConfigInput = {\n readonly rpcUrl: string;\n readonly chainId: number;\n};\n\nexport type EthereumConfigError =\n | { readonly kind: \"invalid-rpc-url\"; readonly value: string }\n | { readonly kind: \"invalid-chain-id\"; readonly value: number };\n\nconst rpcUrlSchema = z\n .string()\n .superRefine((value, context) => {\n try {\n const protocol = new URL(value).protocol;\n if (protocol === \"http:\" || protocol === \"https:\") return;\n } catch {\n // Report malformed URLs through the same stable domain error.\n }\n context.addIssue({ code: z.ZodIssueCode.custom, message: \"Invalid RPC URL\" });\n });\n\nconst chainIdSchema = z.number().int().positive().safe();\n\nexport function parseEthereumConfig(\n input: EthereumConfigInput,\n): Result<EthereumConfig, EthereumConfigError> {\n const rpcUrl = rpcUrlSchema.safeParse(input.rpcUrl);\n if (!rpcUrl.success) {\n return err({ kind: \"invalid-rpc-url\", value: input.rpcUrl });\n }\n\n const chainId = chainIdSchema.safeParse(input.chainId);\n if (!chainId.success) {\n return err({ kind: \"invalid-chain-id\", value: input.chainId });\n }\n\n return ok({\n rpcUrl: rpcUrl.data as RpcUrl,\n chainId: chainId.data as ChainId,\n });\n}\n","import { z } from \"zod\";\nimport { err, ok, type Result } from \"../result\";\n\nexport type Hex = `0x${string}`;\nexport type EthereumAddress = `0x${string}`;\nexport type EvmBlockTag = \"earliest\" | \"finalized\" | \"latest\" | \"pending\" | \"safe\";\nexport type EvmBlock = EvmBlockTag | bigint;\n\nexport type EvmCallRequest = {\n readonly to: EthereumAddress;\n readonly data?: Hex;\n readonly from?: EthereumAddress;\n readonly gas?: bigint;\n readonly gasPrice?: bigint;\n readonly value?: bigint;\n readonly block?: EvmBlock;\n};\n\nexport type EvmCallResult = {\n readonly data: Hex | undefined;\n};\n\nexport type EvmValidationError = {\n readonly message: string;\n};\n\nconst addressSchema = z.string().regex(/^0x[0-9a-fA-F]{40}$/);\nconst hexSchema = z.string().regex(/^0x(?:[0-9a-fA-F]{2})*$/);\nconst quantitySchema = z.bigint().nonnegative();\nconst blockSchema = z.union([\n z.enum([\"earliest\", \"finalized\", \"latest\", \"pending\", \"safe\"]),\n quantitySchema,\n]);\n\nconst evmCallRequestSchema = z.object({\n to: addressSchema,\n data: hexSchema.optional(),\n from: addressSchema.optional(),\n gas: quantitySchema.optional(),\n gasPrice: quantitySchema.optional(),\n value: quantitySchema.optional(),\n block: blockSchema.optional(),\n}).strict();\n\nconst evmCallResultSchema = z.object({\n data: hexSchema.optional(),\n});\n\nexport function parseEvmCallRequest(\n input: EvmCallRequest,\n): Result<EvmCallRequest, EvmValidationError> {\n const parsed = evmCallRequestSchema.safeParse(input);\n if (!parsed.success) {\n return err({ message: parsed.error.issues.map((issue) => issue.message).join(\"; \") });\n }\n return ok(parsed.data as EvmCallRequest);\n}\n\nexport function parseEvmCallResult(\n input: unknown,\n): Result<EvmCallResult, EvmValidationError> {\n const parsed = evmCallResultSchema.safeParse(input);\n if (!parsed.success) {\n return err({ message: parsed.error.issues.map((issue) => issue.message).join(\"; \") });\n }\n return ok(parsed.data as EvmCallResult);\n}\n","import {\n parseEthereumConfig,\n type EthereumConfig,\n type EthereumConfigError,\n type EthereumConfigInput,\n} from \"./EthereumConfig\";\nimport {\n parseEvmCallRequest,\n parseEvmCallResult,\n type EvmCallRequest,\n type EvmCallResult,\n} from \"./EvmCall\";\nimport type {\n EvmTransactionRequest,\n TransactionHash,\n} from \"./EvmTransaction\";\nimport { err, ok, type Result } from \"../result\";\nimport { z } from \"zod\";\n\nexport interface EvmCallTransport {\n call(request: EvmCallRequest): Promise<unknown>;\n}\n\nexport interface EvmTransport extends EvmCallTransport {\n getChainId(): Promise<unknown>;\n getTransactionCount(address: string): Promise<unknown>;\n getBalance(address: string): Promise<unknown>;\n estimateGas(request: EvmTransactionRequest): Promise<unknown>;\n getGasPrice(): Promise<unknown>;\n sendRawTransaction(transaction: string): Promise<unknown>;\n}\n\nexport type EvmCallTransportFactory = (config: EthereumConfig) => EvmCallTransport;\n\nexport type EthereumClientCreationError =\n | EthereumConfigError\n | { readonly kind: \"transport-creation-failed\"; readonly cause: unknown };\n\nexport type EthereumCallError =\n | { readonly kind: \"invalid-request\"; readonly message: string }\n | { readonly kind: \"transport-failed\"; readonly cause: unknown }\n | { readonly kind: \"invalid-response\"; readonly message: string };\n\nexport type EthereumTransactionOperation =\n | \"get-chain-id\"\n | \"get-transaction-count\"\n | \"get-balance\"\n | \"estimate-gas\"\n | \"get-gas-price\"\n | \"send-raw-transaction\";\n\nexport type EthereumTransactionError =\n | { readonly kind: \"unsupported-transport\" }\n | { readonly kind: \"invalid-request\"; readonly message: string }\n | {\n readonly kind: \"transport-failed\";\n readonly operation: EthereumTransactionOperation;\n readonly cause: unknown;\n }\n | {\n readonly kind: \"invalid-response\";\n readonly operation: EthereumTransactionOperation;\n readonly message: string;\n }\n | {\n readonly kind: \"chain-mismatch\";\n readonly expected: number;\n readonly actual: number;\n };\n\nconst addressSchema = z.string().regex(/^0x[0-9a-fA-F]{40}$/);\nconst transactionRequestSchema = z.object({\n from: addressSchema,\n to: addressSchema,\n data: z.string().regex(/^0x(?:[0-9a-fA-F]{2})*$/).optional(),\n value: z.bigint().nonnegative().optional(),\n}).strict();\nconst chainIdSchema = z.number().int().positive().safe();\nconst transactionCountSchema = z.number().int().nonnegative().safe();\nconst quantitySchema = z.bigint().nonnegative();\nconst transactionHashSchema = z.custom<TransactionHash>(\n (value) =>\n typeof value === \"string\"\n && /^0x[0-9a-fA-F]{64}$/.test(value),\n);\n\nexport class EthereumClient {\n readonly #config: EthereumConfig;\n readonly #transport: EvmCallTransport;\n #chainVerification: Promise<Result<void, EthereumTransactionError>> | undefined;\n\n private constructor(config: EthereumConfig, transport: EvmCallTransport) {\n this.#config = config;\n this.#transport = transport;\n }\n\n static create(\n input: EthereumConfigInput,\n createTransport: EvmCallTransportFactory,\n ): Result<EthereumClient, EthereumClientCreationError> {\n const config = parseEthereumConfig(input);\n if (!config.ok) return config;\n\n try {\n return ok(new EthereumClient(config.value, createTransport(config.value)));\n } catch (cause: unknown) {\n return err({ kind: \"transport-creation-failed\", cause });\n }\n }\n\n get config(): EthereumConfig {\n return this.#config;\n }\n\n async call(\n request: EvmCallRequest,\n ): Promise<Result<EvmCallResult, EthereumCallError>> {\n const parsedRequest = parseEvmCallRequest(request);\n if (!parsedRequest.ok) {\n return err({ kind: \"invalid-request\", message: parsedRequest.error.message });\n }\n\n let response: unknown;\n try {\n response = await this.#transport.call(parsedRequest.value);\n } catch (cause: unknown) {\n return err({ kind: \"transport-failed\", cause });\n }\n\n const parsedResponse = parseEvmCallResult(response);\n if (!parsedResponse.ok) {\n return err({ kind: \"invalid-response\", message: parsedResponse.error.message });\n }\n return ok(parsedResponse.value);\n }\n\n async verifyChain(): Promise<Result<void, EthereumTransactionError>> {\n this.#chainVerification ??= this.#verifyConfiguredChain();\n return await this.#chainVerification;\n }\n\n async #verifyConfiguredChain(): Promise<Result<void, EthereumTransactionError>> {\n const chainId = await this.#performTransactionOperation(\n \"get-chain-id\",\n (transport) => transport.getChainId(),\n chainIdSchema,\n );\n if (!chainId.ok) return chainId;\n if (chainId.value !== this.#config.chainId) {\n return err({\n kind: \"chain-mismatch\",\n expected: this.#config.chainId,\n actual: chainId.value,\n });\n }\n return ok(undefined);\n }\n\n async getTransactionCount(\n address: string,\n ): Promise<Result<number, EthereumTransactionError>> {\n if (!addressSchema.safeParse(address).success) {\n return err({ kind: \"invalid-request\", message: \"invalid Ethereum address\" });\n }\n return await this.#performTransactionOperation(\n \"get-transaction-count\",\n (transport) => transport.getTransactionCount(address),\n transactionCountSchema,\n );\n }\n\n async estimateGas(\n request: EvmTransactionRequest,\n ): Promise<Result<bigint, EthereumTransactionError>> {\n const parsed = transactionRequestSchema.safeParse(request);\n if (!parsed.success) {\n return err({\n kind: \"invalid-request\",\n message: parsed.error.issues.map((issue) => issue.message).join(\"; \"),\n });\n }\n return await this.#performTransactionOperation(\n \"estimate-gas\",\n (transport) =>\n transport.estimateGas(parsed.data as EvmTransactionRequest),\n quantitySchema,\n );\n }\n\n async getBalance(\n address: string,\n ): Promise<Result<bigint, EthereumTransactionError>> {\n if (!addressSchema.safeParse(address).success) {\n return err({ kind: \"invalid-request\", message: \"invalid Ethereum address\" });\n }\n return await this.#performTransactionOperation(\n \"get-balance\",\n (transport) => transport.getBalance(address),\n quantitySchema,\n );\n }\n\n async getGasPrice(): Promise<Result<bigint, EthereumTransactionError>> {\n return await this.#performTransactionOperation(\n \"get-gas-price\",\n (transport) => transport.getGasPrice(),\n quantitySchema,\n );\n }\n\n async sendRawTransaction(\n transaction: string,\n ): Promise<Result<TransactionHash, EthereumTransactionError>> {\n if (!/^0x(?:[0-9a-fA-F]{2})+$/.test(transaction)) {\n return err({ kind: \"invalid-request\", message: \"invalid serialized transaction\" });\n }\n return await this.#performTransactionOperation(\n \"send-raw-transaction\",\n (transport) => transport.sendRawTransaction(transaction),\n transactionHashSchema,\n );\n }\n\n async #performTransactionOperation<T>(\n operation: EthereumTransactionOperation,\n perform: (transport: EvmTransport) => Promise<unknown>,\n schema: z.ZodType<T>,\n ): Promise<Result<T, EthereumTransactionError>> {\n if (!isEvmTransport(this.#transport)) {\n return err({ kind: \"unsupported-transport\" });\n }\n\n let response: unknown;\n try {\n response = await perform(this.#transport);\n } catch (cause: unknown) {\n return err({ kind: \"transport-failed\", operation, cause });\n }\n\n const parsed = schema.safeParse(response);\n if (!parsed.success) {\n return err({\n kind: \"invalid-response\",\n operation,\n message: parsed.error.issues.map((issue) => issue.message).join(\"; \"),\n });\n }\n return ok(parsed.data);\n }\n}\n\nfunction isEvmTransport(transport: EvmCallTransport): transport is EvmTransport {\n const candidate = transport as Partial<EvmTransport>;\n return typeof candidate.getChainId === \"function\"\n && typeof candidate.getTransactionCount === \"function\"\n && typeof candidate.getBalance === \"function\"\n && typeof candidate.estimateGas === \"function\"\n && typeof candidate.getGasPrice === \"function\"\n && typeof candidate.sendRawTransaction === \"function\";\n}\n","import { isAddress } from \"viem\";\nimport type { EthereumAddress } from \"./EvmCall\";\nimport { err, ok, type Result } from \"../result\";\n\nexport type EthereumAsset =\n | { readonly kind: \"native-eth\" }\n | { readonly kind: \"erc20\"; readonly tokenAddress: EthereumAddress };\n\nexport function parseEthereumAsset(\n input: string,\n): Result<EthereumAsset, \"invalid-ethereum-asset\"> {\n if (input.toUpperCase() === \"ETH\") return ok({ kind: \"native-eth\" });\n if (!isAddress(input)) return err(\"invalid-ethereum-asset\");\n return ok({ kind: \"erc20\", tokenAddress: input });\n}\n","import { decodeFunctionResult } from \"viem\";\nimport { err, ok, type Result } from \"../result\";\nimport type { Hex } from \"./EvmCall\";\n\nconst decimalsAbi = [{\n type: \"function\",\n name: \"decimals\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint8\" }],\n}] as const;\n\nexport type Erc20DecimalsError = {\n readonly kind: \"invalid-token-decimals\";\n readonly message: string;\n};\n\nexport function decodeErc20Decimals(\n data: Hex,\n): Result<number, Erc20DecimalsError> {\n try {\n const decimals = decodeFunctionResult({\n abi: decimalsAbi,\n functionName: \"decimals\",\n data,\n });\n if (!Number.isSafeInteger(decimals) || decimals < 0 || decimals > 255) {\n return err({\n kind: \"invalid-token-decimals\",\n message: \"token returned decimals outside the uint8 range\",\n });\n }\n return ok(decimals);\n } catch (caught: unknown) {\n return err({\n kind: \"invalid-token-decimals\",\n message: caught instanceof Error ? caught.message : String(caught),\n });\n }\n}\n","import { decodeFunctionResult } from \"viem\";\nimport type { Hex } from \"./EvmCall\";\nimport { err, ok, type Result } from \"../result\";\n\nconst balanceOfAbi = [{\n type: \"function\",\n name: \"balanceOf\",\n stateMutability: \"view\",\n inputs: [{ name: \"account\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n}] as const;\n\nexport type Erc20BalanceError = {\n readonly kind: \"invalid-token-balance\";\n readonly message: string;\n};\n\nexport function decodeErc20Balance(\n data: Hex,\n): Result<bigint, Erc20BalanceError> {\n try {\n return ok(decodeFunctionResult({\n abi: balanceOfAbi,\n functionName: \"balanceOf\",\n data,\n }));\n } catch (caught: unknown) {\n return err({\n kind: \"invalid-token-balance\",\n message: caught instanceof Error ? caught.message : String(caught),\n });\n }\n}\n","import { encodeFunctionData, type Hex } from \"viem\";\nimport type { EthereumAddress } from \"./EvmCall\";\n\nconst balanceOfAbi = [{\n type: \"function\",\n name: \"balanceOf\",\n stateMutability: \"view\",\n inputs: [{ name: \"account\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n}] as const;\n\nexport function encodeErc20BalanceOf(account: EthereumAddress): Hex {\n return encodeFunctionData({\n abi: balanceOfAbi,\n functionName: \"balanceOf\",\n args: [account],\n });\n}\n","import { encodeFunctionData, type Hex } from \"viem\";\n\nconst decimalsAbi = [{\n type: \"function\",\n name: \"decimals\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint8\" }],\n}] as const;\n\nexport function encodeErc20DecimalsCall(): Hex {\n return encodeFunctionData({\n abi: decimalsAbi,\n functionName: \"decimals\",\n });\n}\n","import { encodeFunctionData, type Hex } from \"viem\";\nimport type { EthereumAddress } from \"./EvmCall\";\n\nconst transferAbi = [{\n type: \"function\",\n name: \"transfer\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"to\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n}] as const;\n\nexport function encodeErc20Transfer(\n recipient: EthereumAddress,\n amount: bigint,\n): Hex {\n return encodeFunctionData({\n abi: transferAbi,\n functionName: \"transfer\",\n args: [recipient, amount],\n });\n}\n","import { formatUnits } from \"viem\";\nimport {\n EthereumClient,\n type EthereumCallError,\n type EthereumTransactionError,\n} from \"./EthereumClient\";\nimport type { EthereumAsset } from \"./EthereumAsset\";\nimport type { EthereumAddress } from \"./EvmCall\";\nimport {\n decodeErc20Balance,\n type Erc20BalanceError,\n} from \"./decodeErc20Balance\";\nimport {\n decodeErc20Decimals,\n type Erc20DecimalsError,\n} from \"./decodeErc20Decimals\";\nimport { encodeErc20BalanceOf } from \"./encodeErc20BalanceOf\";\nimport { encodeErc20DecimalsCall } from \"./encodeErc20DecimalsCall\";\nimport { err, ok, type Result } from \"../result\";\n\nexport type EthereumAssetBalance =\n | {\n readonly kind: \"native-eth\";\n readonly address: EthereumAddress;\n readonly balance: string;\n readonly balanceBaseUnits: bigint;\n readonly decimals: 18;\n }\n | {\n readonly kind: \"erc20\";\n readonly address: EthereumAddress;\n readonly tokenAddress: EthereumAddress;\n readonly balance: string;\n readonly balanceBaseUnits: bigint;\n readonly decimals: number;\n };\n\nexport type EthereumBalanceStage =\n | \"verify-chain\"\n | \"get-native-balance\"\n | \"read-token-balance\"\n | \"read-token-decimals\";\n\nexport type EthereumAssetBalanceError =\n | {\n readonly kind: \"chain-client\";\n readonly stage: EthereumBalanceStage;\n readonly error: EthereumCallError | EthereumTransactionError;\n }\n | { readonly kind: \"missing-token-balance\" }\n | { readonly kind: \"missing-token-decimals\" }\n | { readonly kind: \"token-balance\"; readonly error: Erc20BalanceError }\n | { readonly kind: \"token-decimals\"; readonly error: Erc20DecimalsError };\n\nexport async function getEthereumAssetBalance(\n client: EthereumClient,\n address: EthereumAddress,\n asset: EthereumAsset,\n): Promise<Result<EthereumAssetBalance, EthereumAssetBalanceError>> {\n const verified = await client.verifyChain();\n if (!verified.ok) {\n return err({ kind: \"chain-client\", stage: \"verify-chain\", error: verified.error });\n }\n\n if (asset.kind === \"native-eth\") {\n const balance = await client.getBalance(address);\n if (!balance.ok) {\n return err({\n kind: \"chain-client\",\n stage: \"get-native-balance\",\n error: balance.error,\n });\n }\n return ok({\n kind: \"native-eth\",\n address,\n balance: formatUnits(balance.value, 18),\n balanceBaseUnits: balance.value,\n decimals: 18,\n });\n }\n\n const [balanceCall, decimalsCall] = await Promise.all([\n client.call({\n to: asset.tokenAddress,\n data: encodeErc20BalanceOf(address),\n }),\n client.call({\n to: asset.tokenAddress,\n data: encodeErc20DecimalsCall(),\n }),\n ]);\n if (!balanceCall.ok) {\n return err({\n kind: \"chain-client\",\n stage: \"read-token-balance\",\n error: balanceCall.error,\n });\n }\n if (!decimalsCall.ok) {\n return err({\n kind: \"chain-client\",\n stage: \"read-token-decimals\",\n error: decimalsCall.error,\n });\n }\n if (balanceCall.value.data === undefined) {\n return err({ kind: \"missing-token-balance\" });\n }\n if (decimalsCall.value.data === undefined) {\n return err({ kind: \"missing-token-decimals\" });\n }\n\n const balance = decodeErc20Balance(balanceCall.value.data);\n if (!balance.ok) return err({ kind: \"token-balance\", error: balance.error });\n const decimals = decodeErc20Decimals(decimalsCall.value.data);\n if (!decimals.ok) return err({ kind: \"token-decimals\", error: decimals.error });\n return ok({\n kind: \"erc20\",\n address,\n tokenAddress: asset.tokenAddress,\n balance: formatUnits(balance.value, decimals.value),\n balanceBaseUnits: balance.value,\n decimals: decimals.value,\n });\n}\n","import {\n EthereumClient,\n type EthereumClientCreationError,\n type EvmCallTransportFactory,\n} from \"./EthereumClient\";\nimport type { EthereumAsset } from \"./EthereumAsset\";\nimport type { EthereumAddress } from \"./EvmCall\";\nimport {\n getEthereumAssetBalance,\n type EthereumAssetBalance,\n type EthereumAssetBalanceError,\n} from \"./getEthereumAssetBalance\";\nimport type { ConfiguredEthereumChain } from \"./parseEthereumPortfolioConfig\";\n\nexport type EthereumPortfolioAssetBalance =\n | {\n readonly status: \"fulfilled\";\n readonly symbol: string;\n readonly balance: EthereumAssetBalance;\n }\n | {\n readonly status: \"failed\";\n readonly symbol: string;\n readonly asset: EthereumAsset;\n readonly error: EthereumAssetBalanceError;\n };\n\nexport type EthereumPortfolioChainBalances =\n | {\n readonly status: \"fulfilled\";\n readonly chain: ConfiguredEthereumChain;\n readonly assets: readonly EthereumPortfolioAssetBalance[];\n }\n | {\n readonly status: \"failed\";\n readonly chain: ConfiguredEthereumChain;\n readonly error: EthereumClientCreationError;\n };\n\nexport async function getEthereumPortfolioBalances(\n chains: readonly ConfiguredEthereumChain[],\n address: EthereumAddress,\n createTransport: EvmCallTransportFactory,\n): Promise<readonly EthereumPortfolioChainBalances[]> {\n return await Promise.all(\n chains.map(async (chain): Promise<EthereumPortfolioChainBalances> => {\n const client = EthereumClient.create(\n { chainId: chain.chainId, rpcUrl: chain.rpcUrl },\n createTransport,\n );\n if (!client.ok) {\n return { status: \"failed\", chain, error: client.error };\n }\n\n const assets: readonly {\n readonly symbol: string;\n readonly asset: EthereumAsset;\n }[] = [\n {\n symbol: chain.nativeSymbol,\n asset: { kind: \"native-eth\" },\n },\n ...chain.assets.map((asset) => ({\n symbol: asset.symbol,\n asset: {\n kind: \"erc20\" as const,\n tokenAddress: asset.address,\n },\n })),\n ];\n\n const balances = await Promise.all(\n assets.map(async ({ symbol, asset }): Promise<EthereumPortfolioAssetBalance> => {\n const balance = await getEthereumAssetBalance(\n client.value,\n address,\n asset,\n );\n return balance.ok\n ? { status: \"fulfilled\", symbol, balance: balance.value }\n : { status: \"failed\", symbol, asset, error: balance.error };\n }),\n );\n return { status: \"fulfilled\", chain, assets: balances };\n }),\n );\n}\n","import { isAddress } from \"viem\";\nimport { z } from \"zod\";\nimport type { GlobalConfigData } from \"../config\";\nimport { err, ok, type Result } from \"../result\";\nimport { parseEthereumConfig, type RpcUrl } from \"./EthereumConfig\";\nimport type { EthereumAddress } from \"./EvmCall\";\n\nexport type ConfiguredErc20Asset = {\n readonly symbol: string;\n readonly address: EthereumAddress;\n};\n\nexport type ConfiguredEthereumChain = {\n readonly chainId: number;\n readonly name: string;\n readonly rpcUrl: RpcUrl;\n readonly nativeSymbol: string;\n readonly assets: readonly ConfiguredErc20Asset[];\n};\n\nexport type EthereumPortfolioConfigError = {\n readonly kind: \"invalid-portfolio-config\";\n readonly message: string;\n};\n\nconst symbolSchema = z.string().trim().min(1).max(16).regex(/^[A-Za-z0-9._-]+$/);\nconst assetSchema = z.object({\n symbol: symbolSchema,\n address: z.string().refine(isAddress, \"invalid Ethereum address\"),\n}).strict();\nconst chainSchema = z.object({\n name: z.string().trim().min(1),\n rpcUrl: z.string(),\n nativeAsset: z.object({\n symbol: symbolSchema,\n }).strict(),\n assets: z.array(assetSchema),\n}).strict();\nconst portfolioSchema = z.object({\n ethereum: z.object({\n chains: z.record(chainSchema),\n }).passthrough(),\n}).passthrough();\n\nexport function parseEthereumPortfolioConfig(\n input: GlobalConfigData,\n): Result<readonly ConfiguredEthereumChain[], EthereumPortfolioConfigError> {\n const parsed = portfolioSchema.safeParse(input);\n if (!parsed.success) {\n return err({\n kind: \"invalid-portfolio-config\",\n message: parsed.error.issues\n .map((issue) => `${issue.path.join(\".\") || \"config\"}: ${issue.message}`)\n .join(\"; \"),\n });\n }\n\n const chains: ConfiguredEthereumChain[] = [];\n for (const [chainIdValue, chain] of Object.entries(parsed.data.ethereum.chains)) {\n const chainId = Number(chainIdValue);\n if (!Number.isSafeInteger(chainId) || chainId <= 0) {\n return invalid(`ethereum.chains.${chainIdValue}: invalid chain ID`);\n }\n const ethereumConfig = parseEthereumConfig({\n chainId,\n rpcUrl: chain.rpcUrl,\n });\n if (!ethereumConfig.ok) {\n return invalid(`ethereum.chains.${chainIdValue}.rpcUrl: invalid HTTP(S) URL`);\n }\n\n const symbols = new Set<string>();\n const addresses = new Set<string>();\n for (const asset of chain.assets) {\n const symbol = asset.symbol.toUpperCase();\n const address = asset.address.toLowerCase();\n if (symbol === chain.nativeAsset.symbol.toUpperCase()) {\n return invalid(\n `ethereum.chains.${chainIdValue}.assets: ${asset.symbol} duplicates the native symbol`,\n );\n }\n if (symbols.has(symbol)) {\n return invalid(\n `ethereum.chains.${chainIdValue}.assets: duplicate symbol ${asset.symbol}`,\n );\n }\n if (addresses.has(address)) {\n return invalid(\n `ethereum.chains.${chainIdValue}.assets: duplicate address ${asset.address}`,\n );\n }\n symbols.add(symbol);\n addresses.add(address);\n }\n\n chains.push({\n chainId,\n name: chain.name,\n rpcUrl: ethereumConfig.value.rpcUrl,\n nativeSymbol: chain.nativeAsset.symbol,\n assets: chain.assets.map((asset) => ({\n symbol: asset.symbol,\n address: asset.address as EthereumAddress,\n })),\n });\n }\n return ok(chains);\n}\n\nfunction invalid(\n message: string,\n): Result<never, EthereumPortfolioConfigError> {\n return err({ kind: \"invalid-portfolio-config\", message });\n}\n","import { parseUnits } from \"viem\";\nimport { err, ok, type Result } from \"../result\";\n\nexport type TokenAmountError =\n | { readonly kind: \"invalid-token-amount\"; readonly value: string }\n | { readonly kind: \"zero-token-amount\" };\n\nexport function parseTokenAmount(\n value: string,\n decimals: number,\n): Result<bigint, TokenAmountError> {\n if (!Number.isInteger(decimals) || decimals < 0 || decimals > 255) {\n return err({ kind: \"invalid-token-amount\", value });\n }\n if (!/^(?:0|[1-9]\\d*)(?:\\.\\d+)?$/.test(value)) {\n return err({ kind: \"invalid-token-amount\", value });\n }\n const fractionalDigits = value.split(\".\")[1]?.length ?? 0;\n if (fractionalDigits > decimals) {\n return err({ kind: \"invalid-token-amount\", value });\n }\n\n try {\n const amount = parseUnits(value, decimals);\n if (amount <= 0n) return err({ kind: \"zero-token-amount\" });\n if (amount >= 1n << 256n) {\n return err({ kind: \"invalid-token-amount\", value });\n }\n return ok(amount);\n } catch {\n return err({ kind: \"invalid-token-amount\", value });\n }\n}\n","import { z } from \"zod\";\nimport type { GlobalConfigData } from \"../config/parseGlobalConfigData\";\nimport { parseEthereumConfig, type RpcUrl } from \"./EthereumConfig\";\nimport { err, ok, type Result } from \"../result\";\n\nexport type EthereumRpcResolutionError =\n | { readonly kind: \"missing-chain-rpc\"; readonly chainId: number }\n | { readonly kind: \"invalid-chain-rpc\"; readonly chainId: number };\n\nconst ethereumChainsSchema = z.object({\n ethereum: z.object({\n chains: z.record(z.object({\n rpcUrl: z.string(),\n }).passthrough()),\n }).passthrough(),\n}).passthrough();\n\nexport function resolveEthereumRpcUrl(\n config: GlobalConfigData,\n chainId: number,\n): Result<RpcUrl, EthereumRpcResolutionError> {\n const parsed = ethereumChainsSchema.safeParse(config);\n if (!parsed.success) {\n return err({ kind: \"missing-chain-rpc\", chainId });\n }\n const rpcUrl = parsed.data.ethereum.chains[String(chainId)]?.rpcUrl;\n if (!rpcUrl) return err({ kind: \"missing-chain-rpc\", chainId });\n\n const ethereumConfig = parseEthereumConfig({ rpcUrl, chainId });\n if (!ethereumConfig.ok) {\n return err({ kind: \"invalid-chain-rpc\", chainId });\n }\n return ok(ethereumConfig.value.rpcUrl);\n}\n","import { serializeTransaction, type Hex, type Signature } from \"viem\";\nimport { bytesToHex } from \"../hex\";\nimport { err, ok, type Result } from \"../result\";\nimport type { LegacyTransaction } from \"./LegacyTransaction\";\n\nexport type EthereumSignatureError =\n | { readonly kind: \"invalid-signature-length\"; readonly actual: number }\n | { readonly kind: \"invalid-signature-parity\"; readonly actual: number };\n\nexport function serializeSignedTransaction(\n transaction: LegacyTransaction,\n signature: Uint8Array,\n): Result<Hex, EthereumSignatureError> {\n if (signature.length !== 65) {\n return err({\n kind: \"invalid-signature-length\",\n actual: signature.length,\n });\n }\n const parity = signature[64];\n if (parity !== 0 && parity !== 1) {\n return err({\n kind: \"invalid-signature-parity\",\n actual: parity ?? -1,\n });\n }\n\n const parsedSignature: Signature = {\n r: `0x${bytesToHex(signature.slice(0, 32))}`,\n s: `0x${bytesToHex(signature.slice(32, 64))}`,\n v: 27n + BigInt(parity),\n };\n return ok(serializeTransaction(transaction, parsedSignature));\n}\n","import { serializeTransaction, type Hex } from \"viem\";\nimport type { LegacyTransaction } from \"./LegacyTransaction\";\n\nexport function serializeUnsignedTransaction(\n transaction: LegacyTransaction,\n): Hex {\n return serializeTransaction(transaction);\n}\n","import type {\n EthereumCallError,\n EthereumTransactionError,\n} from \"./EthereumClient\";\nimport { EthereumClient } from \"./EthereumClient\";\nimport type { EthereumAddress, Hex } from \"./EvmCall\";\nimport {\n decodeErc20Decimals,\n type Erc20DecimalsError,\n} from \"./decodeErc20Decimals\";\nimport { encodeErc20DecimalsCall } from \"./encodeErc20DecimalsCall\";\nimport { encodeErc20Transfer } from \"./encodeErc20Transfer\";\nimport type { LegacyTransaction } from \"./LegacyTransaction\";\nimport {\n parseTokenAmount,\n type TokenAmountError,\n} from \"./parseTokenAmount\";\nimport {\n serializeSignedTransaction,\n type EthereumSignatureError,\n} from \"./serializeSignedTransaction\";\nimport { serializeUnsignedTransaction } from \"./serializeUnsignedTransaction\";\nimport { hexToBytes } from \"../hex\";\nimport { err, ok, type Result } from \"../result\";\n\nexport type Erc20TransactionSigner = {\n readonly address: EthereumAddress;\n sign(transaction: Uint8Array): Result<Uint8Array, string>;\n};\n\nexport type SendErc20TokenInput = {\n readonly tokenAddress: EthereumAddress;\n readonly recipient: EthereumAddress;\n readonly amount: string;\n};\n\nexport type SendErc20TokenResult = {\n readonly transactionHash: Hex;\n readonly from: EthereumAddress;\n readonly amountBaseUnits: bigint;\n readonly decimals: number;\n};\n\nexport type SendErc20Stage =\n | \"verify-chain\"\n | \"read-token-decimals\"\n | \"get-transaction-count\"\n | \"estimate-gas\"\n | \"get-gas-price\"\n | \"broadcast\";\n\nexport type SendErc20TokenError =\n | {\n readonly kind: \"chain-client\";\n readonly stage: SendErc20Stage;\n readonly error: EthereumCallError | EthereumTransactionError;\n }\n | { readonly kind: \"missing-token-decimals\" }\n | { readonly kind: \"token-decimals\"; readonly error: Erc20DecimalsError }\n | { readonly kind: \"token-amount\"; readonly error: TokenAmountError }\n | { readonly kind: \"signing-failed\"; readonly message: string }\n | { readonly kind: \"invalid-signature\"; readonly error: EthereumSignatureError };\n\nexport async function sendErc20Token(\n client: EthereumClient,\n signer: Erc20TransactionSigner,\n input: SendErc20TokenInput,\n): Promise<Result<SendErc20TokenResult, SendErc20TokenError>> {\n const verified = await client.verifyChain();\n if (!verified.ok) {\n return err({ kind: \"chain-client\", stage: \"verify-chain\", error: verified.error });\n }\n\n const decimalsCall = await client.call({\n to: input.tokenAddress,\n data: encodeErc20DecimalsCall(),\n });\n if (!decimalsCall.ok) {\n return err({\n kind: \"chain-client\",\n stage: \"read-token-decimals\",\n error: decimalsCall.error,\n });\n }\n if (decimalsCall.value.data === undefined) {\n return err({ kind: \"missing-token-decimals\" });\n }\n\n const decimals = decodeErc20Decimals(decimalsCall.value.data);\n if (!decimals.ok) return err({ kind: \"token-decimals\", error: decimals.error });\n\n const amount = parseTokenAmount(input.amount, decimals.value);\n if (!amount.ok) return err({ kind: \"token-amount\", error: amount.error });\n const data = encodeErc20Transfer(input.recipient, amount.value);\n const request = {\n from: signer.address,\n to: input.tokenAddress,\n data,\n value: 0n,\n } as const;\n\n const [nonce, gas, gasPrice] = await Promise.all([\n client.getTransactionCount(signer.address),\n client.estimateGas(request),\n client.getGasPrice(),\n ]);\n if (!nonce.ok) {\n return err({\n kind: \"chain-client\",\n stage: \"get-transaction-count\",\n error: nonce.error,\n });\n }\n if (!gas.ok) {\n return err({ kind: \"chain-client\", stage: \"estimate-gas\", error: gas.error });\n }\n if (!gasPrice.ok) {\n return err({\n kind: \"chain-client\",\n stage: \"get-gas-price\",\n error: gasPrice.error,\n });\n }\n\n const transaction: LegacyTransaction = {\n type: \"legacy\",\n chainId: client.config.chainId,\n nonce: nonce.value,\n gas: gas.value,\n gasPrice: gasPrice.value,\n to: input.tokenAddress,\n value: 0n,\n data,\n };\n const unsignedTransaction = serializeUnsignedTransaction(transaction);\n const preimage = hexToBytes(unsignedTransaction);\n if (!preimage.ok) {\n return err({\n kind: \"signing-failed\",\n message: \"could not serialize the transaction signing preimage\",\n });\n }\n\n const signature = signer.sign(preimage.value);\n if (!signature.ok) {\n return err({ kind: \"signing-failed\", message: signature.error });\n }\n const signedTransaction = serializeSignedTransaction(\n transaction,\n signature.value,\n );\n if (!signedTransaction.ok) {\n return err({ kind: \"invalid-signature\", error: signedTransaction.error });\n }\n\n const transactionHash = await client.sendRawTransaction(\n signedTransaction.value,\n );\n if (!transactionHash.ok) {\n return err({\n kind: \"chain-client\",\n stage: \"broadcast\",\n error: transactionHash.error,\n });\n }\n return ok({\n transactionHash: transactionHash.value,\n from: signer.address,\n amountBaseUnits: amount.value,\n decimals: decimals.value,\n });\n}\n","import {\n EthereumClient,\n type EthereumTransactionError,\n} from \"./EthereumClient\";\nimport type { EthereumAddress, Hex } from \"./EvmCall\";\nimport type { Erc20TransactionSigner } from \"./sendErc20Token\";\nimport {\n parseTokenAmount,\n type TokenAmountError,\n} from \"./parseTokenAmount\";\nimport type { LegacyTransaction } from \"./LegacyTransaction\";\nimport {\n serializeSignedTransaction,\n type EthereumSignatureError,\n} from \"./serializeSignedTransaction\";\nimport { serializeUnsignedTransaction } from \"./serializeUnsignedTransaction\";\nimport { hexToBytes } from \"../hex\";\nimport { err, ok, type Result } from \"../result\";\n\nexport type SendNativeEthInput = {\n readonly recipient: EthereumAddress;\n readonly amount: string;\n};\n\nexport type SendNativeEthResult = {\n readonly transactionHash: Hex;\n readonly from: EthereumAddress;\n readonly amountWei: bigint;\n readonly feeWei: bigint;\n readonly balanceWei: bigint;\n};\n\nexport type SendNativeEthStage =\n | \"verify-chain\"\n | \"get-transaction-count\"\n | \"get-balance\"\n | \"estimate-gas\"\n | \"get-gas-price\"\n | \"broadcast\";\n\nexport type SendNativeEthError =\n | {\n readonly kind: \"chain-client\";\n readonly stage: SendNativeEthStage;\n readonly error: EthereumTransactionError;\n }\n | { readonly kind: \"amount\"; readonly error: TokenAmountError }\n | {\n readonly kind: \"insufficient-funds\";\n readonly balanceWei: bigint;\n readonly requiredWei: bigint;\n }\n | { readonly kind: \"signing-failed\"; readonly message: string }\n | { readonly kind: \"invalid-signature\"; readonly error: EthereumSignatureError };\n\nexport async function sendNativeEth(\n client: EthereumClient,\n signer: Erc20TransactionSigner,\n input: SendNativeEthInput,\n): Promise<Result<SendNativeEthResult, SendNativeEthError>> {\n const verified = await client.verifyChain();\n if (!verified.ok) {\n return err({ kind: \"chain-client\", stage: \"verify-chain\", error: verified.error });\n }\n const amount = parseTokenAmount(input.amount, 18);\n if (!amount.ok) return err({ kind: \"amount\", error: amount.error });\n\n const request = {\n from: signer.address,\n to: input.recipient,\n value: amount.value,\n } as const;\n const [nonce, balance, gas, gasPrice] = await Promise.all([\n client.getTransactionCount(signer.address),\n client.getBalance(signer.address),\n client.estimateGas(request),\n client.getGasPrice(),\n ]);\n if (!nonce.ok) {\n return err({\n kind: \"chain-client\",\n stage: \"get-transaction-count\",\n error: nonce.error,\n });\n }\n if (!balance.ok) {\n return err({ kind: \"chain-client\", stage: \"get-balance\", error: balance.error });\n }\n if (!gas.ok) {\n return err({ kind: \"chain-client\", stage: \"estimate-gas\", error: gas.error });\n }\n if (!gasPrice.ok) {\n return err({\n kind: \"chain-client\",\n stage: \"get-gas-price\",\n error: gasPrice.error,\n });\n }\n\n const feeWei = gas.value * gasPrice.value;\n const requiredWei = amount.value + feeWei;\n if (balance.value < requiredWei) {\n return err({\n kind: \"insufficient-funds\",\n balanceWei: balance.value,\n requiredWei,\n });\n }\n\n const transaction: LegacyTransaction = {\n type: \"legacy\",\n chainId: client.config.chainId,\n nonce: nonce.value,\n gas: gas.value,\n gasPrice: gasPrice.value,\n to: input.recipient,\n value: amount.value,\n data: \"0x\",\n };\n const preimage = hexToBytes(serializeUnsignedTransaction(transaction));\n if (!preimage.ok) {\n return err({\n kind: \"signing-failed\",\n message: \"could not serialize the transaction signing preimage\",\n });\n }\n const signature = signer.sign(preimage.value);\n if (!signature.ok) {\n return err({ kind: \"signing-failed\", message: signature.error });\n }\n const signed = serializeSignedTransaction(transaction, signature.value);\n if (!signed.ok) {\n return err({ kind: \"invalid-signature\", error: signed.error });\n }\n const transactionHash = await client.sendRawTransaction(signed.value);\n if (!transactionHash.ok) {\n return err({\n kind: \"chain-client\",\n stage: \"broadcast\",\n error: transactionHash.error,\n });\n }\n return ok({\n transactionHash: transactionHash.value,\n from: signer.address,\n amountWei: amount.value,\n feeWei,\n balanceWei: balance.value,\n });\n}\n","import {\n createPublicClient,\n defineChain,\n http,\n type CallParameters,\n type HttpTransportConfig,\n} from \"viem\";\nimport type { EthereumConfig } from \"./EthereumConfig\";\nimport type { EvmBlockTag, EvmCallRequest } from \"./EvmCall\";\nimport type { EvmTransport } from \"./EthereumClient\";\nimport type { EvmTransactionRequest } from \"./EvmTransaction\";\n\nexport type ViemTransportOptions = {\n readonly fetchFn?: HttpTransportConfig[\"fetchFn\"];\n};\n\nexport function createViemTransport(\n config: EthereumConfig,\n options: ViemTransportOptions = {},\n): EvmTransport {\n const chain = defineChain({\n id: config.chainId,\n name: `Chain ${config.chainId}`,\n nativeCurrency: { name: \"Native Currency\", symbol: \"NATIVE\", decimals: 18 },\n rpcUrls: { default: { http: [config.rpcUrl] } },\n });\n const client = createPublicClient({\n chain,\n transport: http(config.rpcUrl, { fetchFn: options.fetchFn }),\n });\n\n return {\n async call(request: EvmCallRequest): Promise<unknown> {\n const response = await client.call(toViemCallParameters(request));\n return { data: response.data };\n },\n async getChainId(): Promise<unknown> {\n return await client.getChainId();\n },\n async getTransactionCount(address: string): Promise<unknown> {\n return await client.getTransactionCount({\n address: address as `0x${string}`,\n blockTag: \"pending\",\n });\n },\n async getBalance(address: string): Promise<unknown> {\n return await client.getBalance({\n address: address as `0x${string}`,\n blockTag: \"pending\",\n });\n },\n async estimateGas(request: EvmTransactionRequest): Promise<unknown> {\n return await client.estimateGas({\n account: request.from,\n to: request.to,\n data: request.data,\n value: request.value,\n });\n },\n async getGasPrice(): Promise<unknown> {\n return await client.getGasPrice();\n },\n async sendRawTransaction(transaction: string): Promise<unknown> {\n return await client.sendRawTransaction({\n serializedTransaction: transaction as `0x${string}`,\n });\n },\n };\n}\n\nfunction toViemCallParameters(request: EvmCallRequest): CallParameters {\n const block = typeof request.block === \"bigint\"\n ? { blockNumber: request.block }\n : typeof request.block === \"string\"\n ? { blockTag: request.block as EvmBlockTag }\n : {};\n const parameters = {\n to: request.to,\n data: request.data,\n account: request.from,\n gas: request.gas,\n value: request.value,\n ...block,\n };\n\n return request.gasPrice === undefined\n ? parameters\n : { ...parameters, type: \"legacy\", gasPrice: request.gasPrice };\n}\n","import { isAddress } from \"viem\";\nimport type { EthereumAddress } from \"../ethereum\";\nimport { formatNativeError } from \"../nativeError\";\nimport type { NativeClient } from \"../native\";\nimport { err, ok, type Result } from \"../result\";\nimport { runWithWallet } from \"../withWallet\";\n\nexport function ethereumWalletAddress(\n client: NativeClient,\n derivationPath: string,\n): Result<EthereumAddress, string> {\n const address = runWithWallet<string>(client, (wallet) => {\n const bootstrapped = wallet.bootstrap();\n if (!bootstrapped.ok) return err(formatNativeError(bootstrapped.error));\n const exported = wallet.exportAddress(derivationPath, \"ethereum\");\n if (!exported.ok) return err(formatNativeError(exported.error));\n return ok(exported.value);\n });\n if (!address.ok) return address;\n if (!isAddress(address.value)) {\n return err(\"native wallet returned an invalid Ethereum address\");\n }\n return ok(address.value);\n}\n","import type {\n EthereumCallError,\n EthereumTransactionError,\n} from \"../ethereum\";\n\nexport function formatEthereumClientError(\n error: EthereumCallError | EthereumTransactionError,\n): string {\n switch (error.kind) {\n case \"unsupported-transport\":\n return \"configured Ethereum transport does not support transactions\";\n case \"invalid-request\":\n return error.message;\n case \"transport-failed\":\n return messageFromUnknown(error.cause);\n case \"invalid-response\":\n return error.message;\n case \"chain-mismatch\":\n return `RPC node reports chain ${error.actual}, expected ${error.expected}`;\n }\n}\n\nfunction messageFromUnknown(value: unknown): string {\n return value instanceof Error ? value.message : String(value);\n}\n","import { GlobalConfig, type GlobalConfigLoadError } from \"../config\";\nimport { resolveEthereumRpcUrl } from \"../ethereum\";\nimport { err, ok, type Result } from \"../result\";\n\nexport async function resolveEthereumCommandRpcUrl(\n env: NodeJS.ProcessEnv,\n chainId: number,\n explicitRpcUrl: string | undefined,\n): Promise<Result<string, string>> {\n if (explicitRpcUrl !== undefined) return ok(explicitRpcUrl);\n\n const homeDirectory = env.HOME?.length ? env.HOME : undefined;\n const loaded = await GlobalConfig.load({ homeDirectory });\n if (!loaded.ok) return err(formatConfigLoadError(loaded.error));\n const rpcUrl = resolveEthereumRpcUrl(loaded.value.data, chainId);\n if (!rpcUrl.ok) {\n const configPath = loaded.value.path;\n return err(\n rpcUrl.error.kind === \"missing-chain-rpc\"\n ? `no RPC configured for chain ${chainId} in ${configPath}; set ethereum.chains.${chainId}.rpcUrl or pass --rpc`\n : `invalid RPC configured for chain ${chainId} in ${configPath}`,\n );\n }\n return ok(rpcUrl.value);\n}\n\nfunction formatConfigLoadError(error: GlobalConfigLoadError): string {\n switch (error.kind) {\n case \"read-failed\":\n return `failed to read global config ${error.path}: ${messageFromUnknown(error.cause)}`;\n case \"invalid-json\":\n return `invalid JSON in global config ${error.path}: ${error.message}`;\n case \"invalid-config\":\n return `invalid global config ${error.path}: ${error.message}`;\n }\n}\n\nfunction messageFromUnknown(value: unknown): string {\n return value instanceof Error ? value.message : String(value);\n}\n","import type { Command, CommandContext } from \"../command\";\nimport { GlobalConfig, type GlobalConfigLoadError } from \"../config\";\nimport {\n EthereumClient,\n createViemTransport,\n getEthereumAssetBalance,\n getEthereumPortfolioBalances,\n parseEthereumAsset,\n parseEthereumConfig,\n parseEthereumPortfolioConfig,\n type EthereumAsset,\n type EthereumAssetBalanceError,\n type EthereumClientCreationError,\n type EthereumPortfolioAssetBalance,\n type EthereumPortfolioChainBalances,\n} from \"../ethereum\";\nimport { parseFlags } from \"../parseFlags\";\nimport { err, ok, type Result } from \"../result\";\nimport { ethereumWalletAddress } from \"./ethereumWalletAddress\";\nimport { formatEthereumClientError } from \"./formatEthereumClientError\";\nimport { resolveEthereumCommandRpcUrl } from \"./resolveEthereumCommandRpcUrl\";\n\nexport type BalanceArgs =\n | {\n readonly kind: \"portfolio\";\n readonly derivationPath: string;\n readonly json: boolean;\n }\n | {\n readonly kind: \"asset\";\n readonly asset: EthereumAsset;\n readonly chainId: number;\n readonly rpcUrl: string | undefined;\n readonly derivationPath: string;\n readonly json: boolean;\n };\n\ntype AssetBalanceArgs = Extract<BalanceArgs, { readonly kind: \"asset\" }>;\ntype PortfolioBalanceArgs = Extract<BalanceArgs, { readonly kind: \"portfolio\" }>;\n\nexport const balanceCommand: Command<BalanceArgs> = {\n name: \"balance\",\n describe(): string {\n return [\n \" macwlt balance [--path <derivation-path>] [--json]\",\n \" macwlt balance <ETH|token-address> <chain-id> [--rpc <url>] [--path <derivation-path>] [--json]\",\n ].join(\"\\n\");\n },\n parse: parseBalance,\n async run(\n ctx: CommandContext,\n args: BalanceArgs,\n ): Promise<Result<string, string>> {\n switch (args.kind) {\n case \"portfolio\":\n return await runPortfolioBalance(ctx, args);\n case \"asset\":\n return await runAssetBalance(ctx, args);\n }\n },\n};\n\nexport function parseBalance(\n args: readonly string[],\n): Result<BalanceArgs, string> {\n const flags = parseFlags(args);\n if (!flags.ok) return flags;\n if (flags.value.switches.size > 0) {\n return err(\"balance does not accept switch options\");\n }\n for (const option of flags.value.options.keys()) {\n if (option !== \"rpc\" && option !== \"path\") {\n return err(`unknown balance option: --${option}`);\n }\n }\n\n const derivationPath = flags.value.options.get(\"path\") ?? \"m\";\n if (flags.value.positionals.length === 0) {\n if (flags.value.options.has(\"rpc\")) {\n return err(\"balance --rpc requires <ETH|token-address> <chain-id>\");\n }\n return ok({\n kind: \"portfolio\",\n derivationPath,\n json: flags.value.json,\n });\n }\n if (flags.value.positionals.length !== 2) {\n return err(\"balance accepts no positionals or requires <ETH|token-address> <chain-id>\");\n }\n\n const [assetValue, chainIdValue] = flags.value.positionals;\n if (!assetValue) {\n return err(\"balance asset must be ETH or a valid Ethereum token address\");\n }\n const asset = parseEthereumAsset(assetValue);\n if (!asset.ok) {\n return err(\"balance asset must be ETH or a valid Ethereum token address\");\n }\n const chainId = Number(chainIdValue);\n if (!Number.isSafeInteger(chainId) || chainId <= 0) {\n return err(\"balance chain-id must be a positive integer\");\n }\n\n const rpcUrl = flags.value.options.get(\"rpc\");\n if (rpcUrl !== undefined) {\n const config = parseEthereumConfig({ rpcUrl, chainId });\n if (!config.ok) return err(\"balance --rpc must be a valid HTTP(S) URL\");\n }\n return ok({\n kind: \"asset\",\n asset: asset.value,\n chainId,\n rpcUrl,\n derivationPath,\n json: flags.value.json,\n });\n}\n\nasync function runAssetBalance(\n ctx: CommandContext,\n args: AssetBalanceArgs,\n): Promise<Result<string, string>> {\n const rpcUrl = await resolveEthereumCommandRpcUrl(\n ctx.env,\n args.chainId,\n args.rpcUrl,\n );\n if (!rpcUrl.ok) return rpcUrl;\n const client = EthereumClient.create(\n { rpcUrl: rpcUrl.value, chainId: args.chainId },\n createViemTransport,\n );\n if (!client.ok) {\n return err(`invalid Ethereum client configuration: ${client.error.kind}`);\n }\n const address = ethereumWalletAddress(ctx.client, args.derivationPath);\n if (!address.ok) return address;\n\n const balance = await getEthereumAssetBalance(\n client.value,\n address.value,\n args.asset,\n );\n if (!balance.ok) return err(formatBalanceError(balance.error));\n if (!args.json) {\n return ok(\n balance.value.kind === \"native-eth\"\n ? `${balance.value.balance} ETH`\n : balance.value.balance,\n );\n }\n if (balance.value.kind === \"native-eth\") {\n return ok(JSON.stringify({\n address: balance.value.address,\n chainId: args.chainId,\n asset: \"ETH\",\n balance: balance.value.balance,\n balanceWei: balance.value.balanceBaseUnits.toString(),\n decimals: balance.value.decimals,\n }, null, 2));\n }\n return ok(JSON.stringify({\n address: balance.value.address,\n chainId: args.chainId,\n tokenAddress: balance.value.tokenAddress,\n balance: balance.value.balance,\n balanceBaseUnits: balance.value.balanceBaseUnits.toString(),\n decimals: balance.value.decimals,\n }, null, 2));\n}\n\nasync function runPortfolioBalance(\n ctx: CommandContext,\n args: PortfolioBalanceArgs,\n): Promise<Result<string, string>> {\n const homeDirectory = ctx.env.HOME?.length ? ctx.env.HOME : undefined;\n const loaded = await GlobalConfig.load({\n homeDirectory,\n storage: ctx.configStorage,\n });\n if (!loaded.ok) return err(formatConfigLoadError(loaded.error));\n const config = parseEthereumPortfolioConfig(loaded.value.data);\n if (!config.ok) {\n return err(`invalid EVM portfolio config ${loaded.value.path}: ${config.error.message}`);\n }\n if (config.value.length === 0) {\n return err(`no EVM chains configured in ${loaded.value.path}`);\n }\n\n const address = ethereumWalletAddress(ctx.client, args.derivationPath);\n if (!address.ok) return address;\n const portfolio = await getEthereumPortfolioBalances(\n config.value,\n address.value,\n createViemTransport,\n );\n\n return ok(\n args.json\n ? formatPortfolioJson(address.value, portfolio)\n : formatPortfolioText(address.value, portfolio),\n );\n}\n\nfunction formatPortfolioJson(\n address: string,\n portfolio: readonly EthereumPortfolioChainBalances[],\n): string {\n return JSON.stringify({\n address,\n chains: portfolio.map((chain) => {\n if (chain.status === \"failed\") {\n return {\n chainId: chain.chain.chainId,\n name: chain.chain.name,\n status: \"failed\",\n error: formatClientCreationError(chain.error),\n };\n }\n return {\n chainId: chain.chain.chainId,\n name: chain.chain.name,\n status: \"ok\",\n assets: chain.assets\n .filter(isHeldAsset)\n .map(formatPortfolioAssetJson),\n errors: chain.assets\n .filter(isFailedAsset)\n .map((asset) => ({\n symbol: asset.symbol,\n kind: asset.asset.kind === \"native-eth\" ? \"native\" : \"erc20\",\n ...(asset.asset.kind === \"erc20\"\n ? { tokenAddress: asset.asset.tokenAddress }\n : {}),\n error: formatBalanceError(asset.error),\n })),\n };\n }),\n }, null, 2);\n}\n\nfunction formatPortfolioText(\n address: string,\n portfolio: readonly EthereumPortfolioChainBalances[],\n): string {\n const lines = [`Wallet ${address}`];\n let heldAssetCount = 0;\n\n for (const chain of portfolio) {\n if (chain.status === \"failed\") {\n lines.push(\n `${chain.chain.name} (${chain.chain.chainId}): unavailable: ${formatClientCreationError(chain.error)}`,\n );\n continue;\n }\n const heldAssets = chain.assets.filter(isHeldAsset);\n const failedAssets = chain.assets.filter(isFailedAsset);\n if (heldAssets.length === 0 && failedAssets.length === 0) continue;\n\n lines.push(`${chain.chain.name} (${chain.chain.chainId})`);\n for (const asset of heldAssets) {\n heldAssetCount++;\n lines.push(` ${asset.symbol}: ${asset.balance.balance}`);\n }\n for (const asset of failedAssets) {\n lines.push(` ${asset.symbol}: unavailable: ${formatBalanceError(asset.error)}`);\n }\n }\n\n if (heldAssetCount === 0) lines.push(\"No configured assets held.\");\n return lines.join(\"\\n\");\n}\n\nfunction formatPortfolioAssetJson(\n asset: Extract<EthereumPortfolioAssetBalance, { readonly status: \"fulfilled\" }>,\n): object {\n const balance = asset.balance;\n return {\n symbol: asset.symbol,\n kind: balance.kind === \"native-eth\" ? \"native\" : \"erc20\",\n ...(balance.kind === \"erc20\" ? { tokenAddress: balance.tokenAddress } : {}),\n balance: balance.balance,\n balanceBaseUnits: balance.balanceBaseUnits.toString(),\n decimals: balance.decimals,\n };\n}\n\nfunction isHeldAsset(\n asset: EthereumPortfolioAssetBalance,\n): asset is Extract<EthereumPortfolioAssetBalance, { readonly status: \"fulfilled\" }> {\n return asset.status === \"fulfilled\" && asset.balance.balanceBaseUnits > 0n;\n}\n\nfunction isFailedAsset(\n asset: EthereumPortfolioAssetBalance,\n): asset is Extract<EthereumPortfolioAssetBalance, { readonly status: \"failed\" }> {\n return asset.status === \"failed\";\n}\n\nfunction formatBalanceError(error: EthereumAssetBalanceError): string {\n switch (error.kind) {\n case \"chain-client\":\n return `${error.stage} failed: ${formatEthereumClientError(error.error)}`;\n case \"missing-token-balance\":\n return \"token balance call returned no data\";\n case \"missing-token-decimals\":\n return \"token decimals call returned no data\";\n case \"token-balance\":\n return `invalid token balance response: ${error.error.message}`;\n case \"token-decimals\":\n return `invalid token decimals response: ${error.error.message}`;\n }\n}\n\nfunction formatClientCreationError(error: EthereumClientCreationError): string {\n switch (error.kind) {\n case \"invalid-rpc-url\":\n return `invalid RPC URL ${error.value}`;\n case \"invalid-chain-id\":\n return `invalid chain ID ${error.value}`;\n case \"transport-creation-failed\":\n return messageFromUnknown(error.cause);\n }\n}\n\nfunction formatConfigLoadError(error: GlobalConfigLoadError): string {\n switch (error.kind) {\n case \"read-failed\":\n return `failed to read global config ${error.path}: ${messageFromUnknown(error.cause)}`;\n case \"invalid-json\":\n return `invalid JSON in global config ${error.path}: ${error.message}`;\n case \"invalid-config\":\n return `invalid global config ${error.path}: ${error.message}`;\n }\n}\n\nfunction messageFromUnknown(value: unknown): string {\n return value instanceof Error ? value.message : String(value);\n}\n","import type { Command } from \"./command\";\nimport { createCommand } from \"./commands/create\";\nimport { resetCommand } from \"./commands/reset\";\nimport { resetConfigCommand } from \"./commands/resetConfig\";\nimport { pubkeyCommand } from \"./commands/pubkey\";\nimport { addressCommand } from \"./commands/address\";\nimport { signEthCommand } from \"./commands/signEth\";\nimport { signPsbtCommand } from \"./commands/signPsbt\";\nimport { helpCommand } from \"./commands/help\";\nimport { versionCommand } from \"./commands/version\";\nimport { sendCommand } from \"./commands/send\";\nimport { balanceCommand } from \"./commands/balance\";\n\nexport const commands: readonly Command[] = [\n createCommand,\n resetCommand,\n resetConfigCommand,\n pubkeyCommand,\n addressCommand,\n balanceCommand,\n signEthCommand,\n signPsbtCommand,\n sendCommand,\n helpCommand,\n versionCommand,\n];\n","import { runCli } from \"./command\";\n\nconst result = await runCli(Bun.argv.slice(2));\nif (result.stdout.length > 0) process.stdout.write(result.stdout);\nif (result.stderr.length > 0) process.stderr.write(result.stderr);\nprocess.exitCode = result.exitCode;\n"],"mappings":"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","names":["z","contents","z","z","contents","mkdir","writeFile","dirname","contents","homedir","homedir","homedir","homedir","join","join","result","result","result","messageFromUnknown","isAddress","z","z","z","z","z","addressSchema","chainIdSchema","quantitySchema","decodeFunctionResult","decodeFunctionResult","balanceOfAbi","encodeFunctionData","decimalsAbi","encodeFunctionData","balance","isAddress","z","z","isAddress","z","z","serializeTransaction","isAddress","isAddress","messageFromUnknown","messageFromUnknown","isAddress","formatConfigLoadError","messageFromUnknown","z","messageFromUnknown","result"]}
@@ -0,0 +1,30 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
3
+ "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
4
+ <plist version="1.0">
5
+ <dict>
6
+ <key>CFBundleDevelopmentRegion</key>
7
+ <string>en</string>
8
+ <key>CFBundleExecutable</key>
9
+ <string>com.macwlt.SigningService</string>
10
+ <key>CFBundleIdentifier</key>
11
+ <string>com.macwlt.SigningService</string>
12
+ <key>CFBundleInfoDictionaryVersion</key>
13
+ <string>6.0</string>
14
+ <key>CFBundleName</key>
15
+ <string>SigningService</string>
16
+ <key>CFBundlePackageType</key>
17
+ <string>XPC!</string>
18
+ <key>CFBundleShortVersionString</key>
19
+ <string>1.0</string>
20
+ <key>CFBundleVersion</key>
21
+ <string>1</string>
22
+ <key>XPCService</key>
23
+ <dict>
24
+ <key>JoinExistingSession</key>
25
+ <false/>
26
+ <key>ServiceType</key>
27
+ <string>Application</string>
28
+ </dict>
29
+ </dict>
30
+ </plist>
@@ -0,0 +1,125 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>files</key>
6
+ <dict/>
7
+ <key>files2</key>
8
+ <dict>
9
+ <key>Frameworks/libsecp256k1.6.dylib</key>
10
+ <dict>
11
+ <key>cdhash</key>
12
+ <data>
13
+ aKfXFdCm0nDBxYSnHKYTH1VXG54=
14
+ </data>
15
+ <key>requirement</key>
16
+ <string>cdhash H"68a7d715d0a6d270c1c584a71ca6131f55571b9e"</string>
17
+ </dict>
18
+ </dict>
19
+ <key>rules</key>
20
+ <dict>
21
+ <key>^Resources/</key>
22
+ <true/>
23
+ <key>^Resources/.*\.lproj/</key>
24
+ <dict>
25
+ <key>optional</key>
26
+ <true/>
27
+ <key>weight</key>
28
+ <real>1000</real>
29
+ </dict>
30
+ <key>^Resources/.*\.lproj/locversion.plist$</key>
31
+ <dict>
32
+ <key>omit</key>
33
+ <true/>
34
+ <key>weight</key>
35
+ <real>1100</real>
36
+ </dict>
37
+ <key>^Resources/Base\.lproj/</key>
38
+ <dict>
39
+ <key>weight</key>
40
+ <real>1010</real>
41
+ </dict>
42
+ <key>^version.plist$</key>
43
+ <true/>
44
+ </dict>
45
+ <key>rules2</key>
46
+ <dict>
47
+ <key>.*\.dSYM($|/)</key>
48
+ <dict>
49
+ <key>weight</key>
50
+ <real>11</real>
51
+ </dict>
52
+ <key>^(.*/)?\.DS_Store$</key>
53
+ <dict>
54
+ <key>omit</key>
55
+ <true/>
56
+ <key>weight</key>
57
+ <real>2000</real>
58
+ </dict>
59
+ <key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
60
+ <dict>
61
+ <key>nested</key>
62
+ <true/>
63
+ <key>weight</key>
64
+ <real>10</real>
65
+ </dict>
66
+ <key>^.*</key>
67
+ <true/>
68
+ <key>^Info\.plist$</key>
69
+ <dict>
70
+ <key>omit</key>
71
+ <true/>
72
+ <key>weight</key>
73
+ <real>20</real>
74
+ </dict>
75
+ <key>^PkgInfo$</key>
76
+ <dict>
77
+ <key>omit</key>
78
+ <true/>
79
+ <key>weight</key>
80
+ <real>20</real>
81
+ </dict>
82
+ <key>^Resources/</key>
83
+ <dict>
84
+ <key>weight</key>
85
+ <real>20</real>
86
+ </dict>
87
+ <key>^Resources/.*\.lproj/</key>
88
+ <dict>
89
+ <key>optional</key>
90
+ <true/>
91
+ <key>weight</key>
92
+ <real>1000</real>
93
+ </dict>
94
+ <key>^Resources/.*\.lproj/locversion.plist$</key>
95
+ <dict>
96
+ <key>omit</key>
97
+ <true/>
98
+ <key>weight</key>
99
+ <real>1100</real>
100
+ </dict>
101
+ <key>^Resources/Base\.lproj/</key>
102
+ <dict>
103
+ <key>weight</key>
104
+ <real>1010</real>
105
+ </dict>
106
+ <key>^[^/]+$</key>
107
+ <dict>
108
+ <key>nested</key>
109
+ <true/>
110
+ <key>weight</key>
111
+ <real>10</real>
112
+ </dict>
113
+ <key>^embedded\.provisionprofile$</key>
114
+ <dict>
115
+ <key>weight</key>
116
+ <real>20</real>
117
+ </dict>
118
+ <key>^version\.plist$</key>
119
+ <dict>
120
+ <key>weight</key>
121
+ <real>20</real>
122
+ </dict>
123
+ </dict>
124
+ </dict>
125
+ </plist>
Binary file