@chainstream-io/cli 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +4 -8
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -15,7 +15,7 @@ var init_constants = __esm({
|
|
|
15
15
|
"src/lib/constants.ts"() {
|
|
16
16
|
"use strict";
|
|
17
17
|
CHAINSTREAM_API_URL = process.env.CHAINSTREAM_API_URL ?? "https://api.chainstream.io";
|
|
18
|
-
TURNKEY_AUTH_PROXY_CONFIG_ID = process.env.TURNKEY_AUTH_PROXY_CONFIG_ID ?? "";
|
|
18
|
+
TURNKEY_AUTH_PROXY_CONFIG_ID = process.env.TURNKEY_AUTH_PROXY_CONFIG_ID ?? "7550819d-2607-4910-a3d9-8e6e3ff870f9";
|
|
19
19
|
SOLANA_RPC_URL = process.env.SOLANA_RPC_URL ?? "https://api.mainnet-beta.solana.com";
|
|
20
20
|
BASE_RPC_URL = process.env.BASE_RPC_URL ?? "https://mainnet.base.org";
|
|
21
21
|
BASE_CHAIN_ID = Number(process.env.BASE_CHAIN_ID ?? "8453");
|
|
@@ -262,8 +262,8 @@ async function signup(email, configId, verificationToken, publicKeyHex, privateK
|
|
|
262
262
|
const decoded = decodeJwtPayload(verificationToken);
|
|
263
263
|
const verificationPublicKey = decoded.public_key ?? publicKeyHex;
|
|
264
264
|
const signupBody = {
|
|
265
|
-
userName: email.split("@")[0]
|
|
266
|
-
organizationName: email
|
|
265
|
+
userName: `chainstream-personal-${email.split("@")[0]}`,
|
|
266
|
+
organizationName: `chainstream-personal-${email}`,
|
|
267
267
|
userEmail: email,
|
|
268
268
|
verificationToken,
|
|
269
269
|
apiKeys: [],
|
|
@@ -570,11 +570,7 @@ async function autoPurchaseOnDemand(config, plan = "nano") {
|
|
|
570
570
|
process.stderr.write(`[chainstream] No active subscription. Auto-purchasing ${plan} plan...
|
|
571
571
|
`);
|
|
572
572
|
try {
|
|
573
|
-
const resp = await x402Fetch(`${config.baseUrl}/x402/purchase
|
|
574
|
-
method: "POST",
|
|
575
|
-
headers: { "Content-Type": "application/json" },
|
|
576
|
-
body: JSON.stringify({ plan })
|
|
577
|
-
});
|
|
573
|
+
const resp = await x402Fetch(`${config.baseUrl}/x402/purchase?plan=${encodeURIComponent(plan)}`);
|
|
578
574
|
if (!resp.ok) {
|
|
579
575
|
const text = await resp.text().catch(() => "");
|
|
580
576
|
process.stderr.write(`[chainstream] Purchase failed (${resp.status}): ${text}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/constants.ts","../src/lib/config.ts","../src/wallet/raw-wallet.ts","../src/lib/turnkey.ts","../src/wallet/turnkey-wallet.ts","../src/wallet/index.ts","../src/lib/x402.ts","../src/index.ts","../src/lib/client.ts","../src/lib/validate.ts","../src/lib/output.ts","../src/commands/token.ts","../src/commands/market.ts","../src/commands/wallet.ts","../src/commands/kyt.ts","../src/commands/dex.ts","../src/commands/job.ts","../src/commands/auth.ts","../src/lib/keystore.ts","../src/commands/config-cmd.ts"],"sourcesContent":["/**\n * Public constants for the ChainStream CLI.\n *\n * All values can be overridden via environment variables for local development.\n * Production defaults are used when no env var is set.\n */\n\n/** ChainStream API base URL. */\nexport const CHAINSTREAM_API_URL =\n process.env.CHAINSTREAM_API_URL ?? \"https://api.chainstream.io\";\n\n/**\n * Turnkey auth proxy config ID — identifies the ChainStream organization's\n * hosted auth proxy at https://authproxy.turnkey.com.\n *\n * Create this at https://app.turnkey.com → Auth Proxy → New Configuration.\n * TODO: Replace with ChainStream's production config ID once created.\n */\nexport const TURNKEY_AUTH_PROXY_CONFIG_ID =\n process.env.TURNKEY_AUTH_PROXY_CONFIG_ID ?? \"\";\n\n/** Solana RPC endpoint. */\nexport const SOLANA_RPC_URL =\n process.env.SOLANA_RPC_URL ?? \"https://api.mainnet-beta.solana.com\";\n\n/** Base (EVM) RPC endpoint. */\nexport const BASE_RPC_URL =\n process.env.BASE_RPC_URL ?? \"https://mainnet.base.org\";\n\n/** Base chain ID (8453 = mainnet). */\nexport const BASE_CHAIN_ID = Number(process.env.BASE_CHAIN_ID ?? \"8453\");\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport { CHAINSTREAM_API_URL } from \"./constants.js\";\n\nconst CONFIG_DIR = join(homedir(), \".config\", \"chainstream\");\nconst CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\n\nexport interface TurnkeyCredentials {\n publicKeyHex: string;\n uncompressedPublicKeyHex?: string;\n privateKeyDer: string;\n organizationId: string;\n sessionToken: string;\n sessionExpiry: number;\n}\n\nexport interface RawWalletConfig {\n key: string;\n chain: \"evm\" | \"solana\";\n}\n\nexport interface Config {\n apiKey?: string;\n baseUrl: string;\n turnkey?: TurnkeyCredentials;\n rawWallet?: RawWalletConfig;\n}\n\nexport type WalletMode = \"turnkey\" | \"raw\" | undefined;\n\nexport function getConfigDir(): string {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true });\n }\n return CONFIG_DIR;\n}\n\nexport function loadConfig(): Config {\n const defaults: Config = {\n baseUrl: CHAINSTREAM_API_URL,\n };\n\n if (!existsSync(CONFIG_FILE)) return defaults;\n\n try {\n const raw = readFileSync(CONFIG_FILE, \"utf-8\");\n const parsed = JSON.parse(raw) as Partial<Config>;\n return { ...defaults, ...parsed };\n } catch {\n return defaults;\n }\n}\n\nexport function saveConfig(config: Config): void {\n getConfigDir();\n writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport function updateConfig(patch: Partial<Config>): void {\n const current = loadConfig();\n saveConfig({ ...current, ...patch });\n}\n\nexport function getWalletMode(config: Config): WalletMode {\n if (config.turnkey?.sessionToken) return \"turnkey\";\n if (config.rawWallet?.key) return \"raw\";\n return undefined;\n}\n","import { privateKeyToAccount } from \"viem/accounts\";\nimport type { Hex } from \"viem\";\nimport { Keypair, VersionedTransaction } from \"@solana/web3.js\";\nimport { sign as ed25519Sign } from \"node:crypto\";\nimport type { Wallet } from \"./types.js\";\n\nfunction bs58Decode(str: string): Uint8Array {\n const ALPHABET = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\n const BASE = 58;\n const result: number[] = [0];\n for (const char of str) {\n let carry = ALPHABET.indexOf(char);\n if (carry < 0) throw new Error(`Invalid base58 character: ${char}`);\n for (let j = 0; j < result.length; j++) {\n carry += result[j] * BASE;\n result[j] = carry & 0xff;\n carry >>= 8;\n }\n while (carry > 0) {\n result.push(carry & 0xff);\n carry >>= 8;\n }\n }\n for (const char of str) {\n if (char !== \"1\") break;\n result.push(0);\n }\n return new Uint8Array(result.reverse());\n}\n\nexport class RawKeyWallet implements Wallet {\n chain: \"evm\" | \"solana\";\n address: string;\n private privateKey: string;\n\n constructor(key: string, chain: \"evm\" | \"solana\") {\n this.chain = chain;\n this.privateKey = key;\n\n if (chain === \"evm\") {\n const hex = (key.startsWith(\"0x\") ? key : `0x${key}`) as Hex;\n const account = privateKeyToAccount(hex);\n this.address = account.address;\n } else {\n const decoded = bs58Decode(key);\n const keypair = Keypair.fromSecretKey(decoded);\n this.address = keypair.publicKey.toBase58();\n }\n }\n\n async signMessage(message: string): Promise<string> {\n if (this.chain === \"evm\") {\n const hex = (this.privateKey.startsWith(\"0x\") ? this.privateKey : `0x${this.privateKey}`) as Hex;\n const account = privateKeyToAccount(hex);\n return account.signMessage({ message });\n }\n\n // Solana: ed25519 sign using Node.js crypto with raw private key\n // Node.js crypto.sign with ed25519 needs the key in PKCS8 DER format.\n // Solana Keypair.secretKey is 64 bytes (32 secret + 32 public).\n // We convert to PKCS8 DER for node:crypto compatibility.\n const decoded = bs58Decode(this.privateKey);\n const secretKeyRaw = decoded.slice(0, 32);\n\n // PKCS8 DER wrapper for ed25519: fixed 16-byte prefix + 34-byte key (04 20 + 32 bytes)\n const pkcs8Prefix = Buffer.from(\"302e020100300506032b657004220420\", \"hex\");\n const pkcs8Der = Buffer.concat([pkcs8Prefix, Buffer.from(secretKeyRaw)]);\n\n const msgBytes = Buffer.from(message, \"utf-8\");\n const sig = ed25519Sign(null, msgBytes, { key: pkcs8Der, format: \"der\", type: \"pkcs8\" });\n return sig.toString(\"hex\");\n }\n\n async signTransaction(serializedTx: string): Promise<string> {\n const txBytes = Buffer.from(serializedTx, \"base64\");\n\n if (this.chain === \"solana\") {\n const tx = VersionedTransaction.deserialize(new Uint8Array(txBytes));\n const decoded = bs58Decode(this.privateKey);\n const keypair = Keypair.fromSecretKey(decoded);\n tx.sign([keypair]);\n return Buffer.from(tx.serialize()).toString(\"base64\");\n }\n\n // EVM: defi-service returns unsigned RLP as base64\n // For proper EVM tx signing, we'd need to parse the unsigned RLP and sign.\n // This is a placeholder — real implementation needs the unsigned tx fields.\n const hex = (this.privateKey.startsWith(\"0x\") ? this.privateKey : `0x${this.privateKey}`) as Hex;\n const account = privateKeyToAccount(hex);\n const signedHex = await account.signTransaction({ type: \"legacy\" } as never);\n return Buffer.from(signedHex.slice(2), \"hex\").toString(\"base64\");\n }\n}\n","/**\n * Turnkey Auth Proxy + Coordinator API client.\n * Adapted from openant-cli/src/lib/turnkey.ts for ChainStream.\n *\n * Flow:\n * 1. /v1/otp_init — send OTP to email\n * 2. /v1/otp_verify — verify OTP, get verification token\n * 3. /v1/account — check if user exists\n * 4. /v1/signup — create sub-org + wallets (new users only)\n * 5. /v1/otp_login — exchange verification token for session JWT\n */\n\nimport { createSign, generateKeyPairSync } from \"node:crypto\";\nimport type { TurnkeyCredentials } from \"./config.js\";\n\nconst AUTH_PROXY_BASE = \"https://authproxy.turnkey.com\";\nexport const TURNKEY_API_BASE = \"https://api.turnkey.com\";\n\nimport { TURNKEY_AUTH_PROXY_CONFIG_ID } from \"./constants.js\";\n\nexport const TURNKEY_CONFIG_ID = TURNKEY_AUTH_PROXY_CONFIG_ID;\n\n// ── P-256 Key Pair ───────────────────────────────────────────────\n\nexport interface P256KeyPair {\n publicKeyHex: string;\n uncompressedPublicKeyHex: string;\n privateKeyDer: string;\n}\n\nexport function generateP256KeyPair(): P256KeyPair {\n const { publicKey, privateKey } = generateKeyPairSync(\"ec\", {\n namedCurve: \"prime256v1\",\n publicKeyEncoding: { type: \"spki\", format: \"der\" },\n privateKeyEncoding: { type: \"pkcs8\", format: \"der\" },\n });\n\n const pubBuf = Buffer.from(publicKey);\n const uncompressedBytes = pubBuf.subarray(26);\n const x = uncompressedBytes.subarray(1, 33);\n const y = uncompressedBytes.subarray(33, 65);\n const prefix = y[31]! % 2 === 0 ? 0x02 : 0x03;\n const compressedHex = Buffer.concat([Buffer.from([prefix]), x]).toString(\"hex\");\n const uncompressedHex = Buffer.from(uncompressedBytes).toString(\"hex\");\n\n return {\n publicKeyHex: compressedHex,\n uncompressedPublicKeyHex: uncompressedHex,\n privateKeyDer: Buffer.from(privateKey).toString(\"base64\"),\n };\n}\n\nexport function signRawP256(message: string, privateKeyDerBase64: string): string {\n const signer = createSign(\"SHA256\");\n signer.update(message);\n signer.end();\n\n const derSig = signer.sign({\n key: Buffer.from(privateKeyDerBase64, \"base64\"),\n format: \"der\",\n type: \"pkcs8\",\n });\n\n return derToRawSignature(derSig);\n}\n\nfunction derToRawSignature(der: Buffer): string {\n let offset = 0;\n if (der[offset++] !== 0x30) throw new Error(\"Invalid DER signature\");\n offset++;\n\n if (der[offset++] !== 0x02) throw new Error(\"Invalid DER signature\");\n const rLen = der[offset++]!;\n const rBytes = der.subarray(offset, offset + rLen);\n offset += rLen;\n\n if (der[offset++] !== 0x02) throw new Error(\"Invalid DER signature\");\n const sLen = der[offset++]!;\n const sBytes = der.subarray(offset, offset + sLen);\n\n const r = padOrTrimTo32(rBytes);\n const s = padOrTrimTo32(sBytes);\n return Buffer.concat([r, s]).toString(\"hex\");\n}\n\nfunction padOrTrimTo32(buf: Buffer): Buffer {\n if (buf.length === 32) return buf;\n if (buf.length === 33 && buf[0] === 0x00) return buf.subarray(1);\n if (buf.length < 32) {\n const padded = Buffer.alloc(32);\n buf.copy(padded, 32 - buf.length);\n return padded;\n }\n return buf.subarray(buf.length - 32);\n}\n\n// ── JWT Decode ───────────────────────────────────────────────────\n\ninterface JwtPayload {\n id: string;\n exp: number;\n contact: string;\n public_key?: string;\n verification_type: string;\n organization_id?: string;\n}\n\nfunction decodeJwtPayload(jwt: string): JwtPayload {\n const parts = jwt.split(\".\");\n if (parts.length !== 3) throw new Error(\"Invalid JWT\");\n const payloadB64 = parts[1]!.replace(/-/g, \"+\").replace(/_/g, \"/\");\n return JSON.parse(Buffer.from(payloadB64, \"base64\").toString(\"utf-8\"));\n}\n\n// ── Auth Proxy ───────────────────────────────────────────────────\n\nasync function proxyRequest<T>(path: string, body: unknown, configId: string): Promise<T> {\n if (!configId) throw new Error(\"TURNKEY_AUTH_PROXY_CONFIG_ID not configured.\");\n\n const res = await fetch(`${AUTH_PROXY_BASE}${path}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Auth-Proxy-Config-ID\": configId,\n },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n let detail = text;\n try { detail = JSON.parse(text).message ?? text; } catch { /* ignore */ }\n throw new Error(`Turnkey auth proxy error (${res.status}): ${detail}`);\n }\n\n return res.json() as Promise<T>;\n}\n\nexport async function otpInit(email: string, configId: string): Promise<{ otpId: string }> {\n return proxyRequest(\"/v1/otp_init\", { otpType: \"OTP_TYPE_EMAIL\", contact: email }, configId);\n}\n\nexport async function otpVerify(\n otpId: string, otpCode: string, publicKeyHex: string, configId: string,\n): Promise<{ verificationToken: string }> {\n return proxyRequest(\"/v1/otp_verify\", { otpId, otpCode, publicKey: publicKeyHex }, configId);\n}\n\nexport async function checkAccount(\n email: string, configId: string, verificationToken?: string,\n): Promise<{ exists: boolean; organizationId?: string }> {\n try {\n const result = await proxyRequest<{ organizationId: string }>(\n \"/v1/account\",\n { filterType: \"EMAIL\", filterValue: email, ...(verificationToken && { verificationToken }) },\n configId,\n );\n return { exists: !!result.organizationId, organizationId: result.organizationId };\n } catch {\n return { exists: false };\n }\n}\n\nexport async function signup(\n email: string, configId: string, verificationToken: string,\n publicKeyHex: string, privateKeyDer: string,\n): Promise<{ organizationId: string }> {\n const decoded = decodeJwtPayload(verificationToken);\n const verificationPublicKey = decoded.public_key ?? publicKeyHex;\n\n const signupBody = {\n userName: email.split(\"@\")[0],\n organizationName: email,\n userEmail: email,\n verificationToken,\n apiKeys: [] as unknown[],\n authenticators: [] as unknown[],\n oauthProviders: [] as unknown[],\n wallet: {\n walletName: \"ChainStream Wallet\",\n accounts: [\n { curve: \"CURVE_SECP256K1\", pathFormat: \"PATH_FORMAT_BIP32\", path: \"m/44'/60'/0'/0/0\", addressFormat: \"ADDRESS_FORMAT_ETHEREUM\" },\n { curve: \"CURVE_ED25519\", pathFormat: \"PATH_FORMAT_BIP32\", path: \"m/44'/501'/0'/0'\", addressFormat: \"ADDRESS_FORMAT_SOLANA\" },\n ],\n },\n };\n\n const signatureMessage = JSON.stringify({\n signup: { email, apiKeys: signupBody.apiKeys, authenticators: signupBody.authenticators, oauthProviders: signupBody.oauthProviders },\n tokenId: decoded.id,\n type: \"USAGE_TYPE_SIGNUP\",\n });\n\n const signature = signRawP256(signatureMessage, privateKeyDer);\n\n return proxyRequest(\"/v1/signup\", {\n ...signupBody,\n clientSignature: {\n message: signatureMessage,\n publicKey: verificationPublicKey,\n scheme: \"CLIENT_SIGNATURE_SCHEME_API_P256\",\n signature,\n },\n }, configId);\n}\n\nexport async function otpLogin(\n verificationToken: string, publicKeyHex: string, privateKeyDerBase64: string, configId: string,\n): Promise<{ session: string }> {\n const decoded = decodeJwtPayload(verificationToken);\n const tokenUsageMessage = JSON.stringify({\n login: { publicKey: publicKeyHex },\n tokenId: decoded.id,\n type: \"USAGE_TYPE_LOGIN\",\n });\n const signature = signRawP256(tokenUsageMessage, privateKeyDerBase64);\n\n return proxyRequest(\"/v1/otp_login\", {\n verificationToken,\n publicKey: publicKeyHex,\n clientSignature: {\n message: tokenUsageMessage,\n publicKey: decoded.public_key ?? publicKeyHex,\n scheme: \"CLIENT_SIGNATURE_SCHEME_API_P256\",\n signature,\n },\n }, configId);\n}\n\nexport interface CompleteLoginResult {\n session: string;\n keyPair: P256KeyPair;\n organizationId: string;\n sessionExpiry: number;\n isNewUser: boolean;\n}\n\nexport async function completeLogin(\n otpId: string, otpCode: string, configId: string, email: string,\n): Promise<CompleteLoginResult> {\n const keyPair = generateP256KeyPair();\n const { verificationToken } = await otpVerify(otpId, otpCode, keyPair.publicKeyHex, configId);\n const account = await checkAccount(email, configId, verificationToken);\n\n let isNewUser = false;\n if (!account.exists) {\n await signup(email, configId, verificationToken, keyPair.publicKeyHex, keyPair.privateKeyDer);\n isNewUser = true;\n }\n\n const { session } = await otpLogin(verificationToken, keyPair.publicKeyHex, keyPair.privateKeyDer, configId);\n const sessionPayload = decodeJwtPayload(session);\n\n return {\n session,\n keyPair,\n organizationId: sessionPayload.organization_id ?? \"\",\n sessionExpiry: sessionPayload.exp,\n isNewUser,\n };\n}\n\n// ── Turnkey Coordinator API ──────────────────────────────────────\n\nexport function createApiStamp(body: string, publicKeyHex: string, privateKeyDerBase64: string): string {\n const signer = createSign(\"SHA256\");\n signer.update(body);\n signer.end();\n\n const signature = signer.sign({\n key: Buffer.from(privateKeyDerBase64, \"base64\"),\n format: \"der\",\n type: \"pkcs8\",\n });\n\n const stamp = JSON.stringify({\n publicKey: publicKeyHex,\n scheme: \"SIGNATURE_SCHEME_TK_API_P256\",\n signature: signature.toString(\"hex\"),\n });\n\n return Buffer.from(stamp).toString(\"base64\").replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\nexport async function turnkeyRequest<T>(\n path: string, body: Record<string, unknown>, creds: TurnkeyCredentials,\n): Promise<T> {\n const bodyStr = JSON.stringify(body);\n const stamp = createApiStamp(bodyStr, creds.publicKeyHex, creds.privateKeyDer);\n\n const res = await fetch(`${TURNKEY_API_BASE}${path}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-Stamp\": stamp },\n body: bodyStr,\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Turnkey API error (${res.status}): ${text}`);\n }\n\n return res.json() as Promise<T>;\n}\n\nexport async function refreshTurnkeySession(\n publicKeyHex: string, privateKeyDer: string, organizationId: string, expirationSeconds = 900,\n): Promise<{ session: string; expiry: number }> {\n const newKeyPair = generateP256KeyPair();\n\n const body = JSON.stringify({\n type: \"ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2\",\n timestampMs: Date.now().toString(),\n organizationId,\n parameters: {\n targetPublicKey: newKeyPair.uncompressedPublicKeyHex,\n expirationSeconds: String(expirationSeconds),\n },\n });\n\n const stampHeader = createApiStamp(body, publicKeyHex, privateKeyDer);\n\n const res = await fetch(`${TURNKEY_API_BASE}/public/v1/submit/create_read_write_session`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-Stamp\": stampHeader },\n body,\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Turnkey session refresh failed (${res.status}): ${text}`);\n }\n\n const data = await res.json() as {\n activity: { result?: { createReadWriteSessionResultV2?: { session?: string } } };\n };\n\n const session = data.activity?.result?.createReadWriteSessionResultV2?.session;\n if (!session) throw new Error(\"Turnkey session refresh: no session in response\");\n\n const payload = decodeJwtPayload(session);\n return { session, expiry: payload.exp };\n}\n\n// ── Wallet Discovery ─────────────────────────────────────────────\n\ninterface TurnkeyWalletAccount {\n address: string;\n addressFormat: string;\n}\n\nexport async function listWalletAccounts(creds: TurnkeyCredentials): Promise<TurnkeyWalletAccount[]> {\n const walletsData = await turnkeyRequest<{ wallets: Array<{ walletId: string }> }>(\n \"/public/v1/query/list_wallets\",\n { organizationId: creds.organizationId },\n creds,\n );\n\n const allAccounts: TurnkeyWalletAccount[] = [];\n for (const wallet of walletsData.wallets ?? []) {\n const accountsData = await turnkeyRequest<{ accounts: TurnkeyWalletAccount[] }>(\n \"/public/v1/query/list_wallet_accounts\",\n { organizationId: creds.organizationId, walletId: wallet.walletId, paginationOptions: { limit: \"100\" } },\n creds,\n );\n for (const acct of accountsData.accounts ?? []) {\n allAccounts.push(acct);\n }\n }\n return allAccounts;\n}\n\nexport async function getEvmAddress(creds: TurnkeyCredentials): Promise<string> {\n const accounts = await listWalletAccounts(creds);\n const evm = accounts.find(a => a.addressFormat === \"ADDRESS_FORMAT_ETHEREUM\");\n if (!evm) throw new Error(\"No EVM wallet found in Turnkey.\");\n return evm.address;\n}\n\nexport async function getSolanaAddress(creds: TurnkeyCredentials): Promise<string> {\n const accounts = await listWalletAccounts(creds);\n const sol = accounts.find(a => a.addressFormat === \"ADDRESS_FORMAT_SOLANA\");\n if (!sol) throw new Error(\"No Solana wallet found in Turnkey.\");\n return sol.address;\n}\n","import type { Wallet } from \"./types.js\";\nimport type { TurnkeyCredentials } from \"../lib/config.js\";\nimport { turnkeyRequest, getEvmAddress, getSolanaAddress } from \"../lib/turnkey.js\";\n\n/**\n * Turnkey TEE wallet — signs via Turnkey Coordinator API.\n * Private keys never leave the AWS Nitro Enclave.\n *\n * Adapted from openant-cli/src/lib/solana-signer.ts + evm-signer.ts.\n */\nexport class TurnkeyWallet implements Wallet {\n chain: \"evm\" | \"solana\";\n address: string;\n private creds: TurnkeyCredentials;\n\n constructor(creds: TurnkeyCredentials, chain: \"evm\" | \"solana\", address: string) {\n this.creds = creds;\n this.chain = chain;\n this.address = address;\n }\n\n static async create(creds: TurnkeyCredentials): Promise<{ evm: TurnkeyWallet; solana: TurnkeyWallet }> {\n const [evmAddr, solAddr] = await Promise.all([\n getEvmAddress(creds),\n getSolanaAddress(creds),\n ]);\n return {\n evm: new TurnkeyWallet(creds, \"evm\", evmAddr),\n solana: new TurnkeyWallet(creds, \"solana\", solAddr),\n };\n }\n\n async signMessage(message: string): Promise<string> {\n const payloadHex = Buffer.from(message, \"utf-8\").toString(\"hex\");\n\n const result = await turnkeyRequest<{\n activity: { result?: { signRawPayloadResult?: { r: string; s: string } } };\n }>(\n \"/public/v1/submit/sign_raw_payload\",\n {\n type: \"ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2\",\n timestampMs: Date.now().toString(),\n organizationId: this.creds.organizationId,\n parameters: {\n signWith: this.address,\n payload: payloadHex,\n encoding: \"PAYLOAD_ENCODING_HEXADECIMAL\",\n hashFunction: this.chain === \"evm\"\n ? \"HASH_FUNCTION_KECCAK256\"\n : \"HASH_FUNCTION_NOT_APPLICABLE\",\n },\n },\n this.creds,\n );\n\n const sigResult = result.activity?.result?.signRawPayloadResult;\n if (!sigResult) throw new Error(\"Turnkey signMessage: no signature in response\");\n\n if (this.chain === \"evm\") {\n return `0x${sigResult.r}${sigResult.s}`;\n }\n return `${sigResult.r}${sigResult.s}`;\n }\n\n async signTransaction(serializedTx: string): Promise<string> {\n const txBytes = Buffer.from(serializedTx, \"base64\");\n const unsignedHex = txBytes.toString(\"hex\");\n\n const txType = this.chain === \"evm\"\n ? \"TRANSACTION_TYPE_ETHEREUM\"\n : \"TRANSACTION_TYPE_SOLANA\";\n\n const result = await turnkeyRequest<{\n activity: { result?: { signTransactionResult?: { signedTransaction: string } } };\n }>(\n \"/public/v1/submit/sign_transaction\",\n {\n type: \"ACTIVITY_TYPE_SIGN_TRANSACTION_V2\",\n timestampMs: Date.now().toString(),\n organizationId: this.creds.organizationId,\n parameters: {\n signWith: this.address,\n unsignedTransaction: unsignedHex,\n type: txType,\n },\n },\n this.creds,\n );\n\n const signedHex = result.activity?.result?.signTransactionResult?.signedTransaction;\n if (!signedHex) throw new Error(\"Turnkey signTransaction: no signed tx in response\");\n\n return Buffer.from(signedHex, \"hex\").toString(\"base64\");\n }\n}\n","import type { Config, WalletMode } from \"../lib/config.js\";\nimport type { Wallet } from \"./types.js\";\nimport { RawKeyWallet } from \"./raw-wallet.js\";\nimport { TurnkeyWallet } from \"./turnkey-wallet.js\";\n\nexport function createWallet(config: Config, mode: WalletMode): Wallet {\n if (mode === \"raw\" && config.rawWallet) {\n return new RawKeyWallet(config.rawWallet.key, config.rawWallet.chain);\n }\n\n if (mode === \"turnkey\" && config.turnkey) {\n // Turnkey wallet addresses are resolved lazily on first signMessage/signTransaction call.\n // For API auth (X-Wallet-* headers), the SDK calls signMessage which triggers address resolution.\n // The default chain for API auth is \"evm\" — DeFi commands override per-operation.\n return new TurnkeyWallet(config.turnkey, \"evm\", \"\");\n }\n\n throw new Error(\n \"No wallet configured. Run:\\n\" +\n \" chainstream login # Create Turnkey wallet\\n\" +\n \" chainstream wallet set-raw # Use raw private key (dev)\",\n );\n}\n\n/**\n * Create wallet with resolved addresses (async, used when address is needed immediately).\n */\nexport async function createWalletWithAddresses(config: Config, mode: WalletMode): Promise<{\n evm?: Wallet;\n solana?: Wallet;\n}> {\n if (mode === \"raw\" && config.rawWallet) {\n const w = new RawKeyWallet(config.rawWallet.key, config.rawWallet.chain);\n return config.rawWallet.chain === \"evm\" ? { evm: w } : { solana: w };\n }\n\n if (mode === \"turnkey\" && config.turnkey) {\n const wallets = await TurnkeyWallet.create(config.turnkey);\n return { evm: wallets.evm, solana: wallets.solana };\n }\n\n throw new Error(\"No wallet configured.\");\n}\n\nexport type { Wallet } from \"./types.js\";\n","/**\n * x402 transparent payment — auto-handles 402 responses.\n *\n * Industry standard (Alchemy, Coinbase, x402-agent-pay):\n * - Agent calls API → gets 402 → @x402/fetch auto-pays → retries → success\n * - Agent never sees the 402 — payment is completely transparent\n */\n\nimport { x402Client } from \"@x402/core/client\";\nimport { wrapFetchWithPayment } from \"@x402/fetch\";\nimport { ExactEvmScheme } from \"@x402/evm/exact/client\";\nimport { ExactSvmScheme } from \"@x402/svm/exact/client\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport type { Hex } from \"viem\";\nimport type { Config } from \"./config.js\";\n\nlet _x402Fetch: typeof fetch | null = null;\n\n/**\n * Get a fetch function wrapped with x402 auto-payment.\n * Creates the x402 signer directly from the raw private key (not our Wallet wrapper),\n * because @x402/evm needs viem's Account interface (signTypedData, etc).\n */\nexport function getX402Fetch(config: Config): typeof fetch {\n if (_x402Fetch) return _x402Fetch;\n\n const client = new x402Client();\n\n if (config.rawWallet?.chain === \"evm\") {\n const hex = (config.rawWallet.key.startsWith(\"0x\") ? config.rawWallet.key : `0x${config.rawWallet.key}`) as Hex;\n const account = privateKeyToAccount(hex);\n client.register(\"eip155:*\", new ExactEvmScheme(account));\n } else if (config.rawWallet?.chain === \"solana\") {\n // Solana x402 needs @solana/kit signer — Phase 4 Turnkey\n // For now, only EVM is supported for auto-purchase\n process.stderr.write(\"[chainstream] Auto-purchase only supports EVM wallets currently.\\n\");\n }\n\n // Turnkey wallets: Phase 4 — need to create viem-compatible signer from Turnkey\n\n _x402Fetch = wrapFetchWithPayment(fetch, client);\n return _x402Fetch;\n}\n\n/**\n * Auto-purchase quota when API returns 402.\n * Uses @x402/fetch to transparently handle the x402 payment protocol.\n */\nexport async function autoPurchaseOnDemand(\n config: Config,\n plan = \"nano\",\n): Promise<{ success: boolean; plan?: string; expiresAt?: string }> {\n const x402Fetch = getX402Fetch(config);\n\n process.stderr.write(`[chainstream] No active subscription. Auto-purchasing ${plan} plan...\\n`);\n\n try {\n const resp = await x402Fetch(`${config.baseUrl}/x402/purchase`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ plan }),\n });\n\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n process.stderr.write(`[chainstream] Purchase failed (${resp.status}): ${text}\\n`);\n return { success: false };\n }\n\n const result = await resp.json() as Record<string, unknown>;\n process.stderr.write(`[chainstream] Subscription activated: ${result.plan} (expires: ${result.expires_at})\\n`);\n\n return {\n success: true,\n plan: result.plan as string,\n expiresAt: result.expires_at as string,\n };\n } catch (err) {\n process.stderr.write(`[chainstream] Auto-purchase error: ${err instanceof Error ? err.message : err}\\n`);\n return { success: false };\n }\n}\n\n/**\n * Get available pricing plans (no auth required).\n */\nexport async function getPricing(baseUrl: string): Promise<unknown> {\n const resp = await fetch(`${baseUrl}/x402/pricing`);\n if (!resp.ok) throw new Error(`Failed to get pricing (${resp.status})`);\n return resp.json();\n}\n","import { Command } from \"commander\";\nimport { registerTokenCommands } from \"./commands/token.js\";\nimport { registerMarketCommands } from \"./commands/market.js\";\nimport { registerWalletCommands } from \"./commands/wallet.js\";\nimport { registerKytCommands } from \"./commands/kyt.js\";\nimport { registerDexCommands } from \"./commands/dex.js\";\nimport { registerJobCommands } from \"./commands/job.js\";\nimport { registerAuthCommands } from \"./commands/auth.js\";\nimport { registerConfigCommands } from \"./commands/config-cmd.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"chainstream\")\n .version(\"0.1.0\")\n .description(\"ChainStream CLI — on-chain data and DeFi execution for AI agents\");\n\nregisterTokenCommands(program);\nregisterMarketCommands(program);\nregisterWalletCommands(program);\nregisterKytCommands(program);\nregisterDexCommands(program);\nregisterJobCommands(program);\nregisterAuthCommands(program);\nregisterConfigCommands(program);\n\nprogram.parseAsync().catch((err: Error) => {\n process.stderr.write(`[chainstream] ${err.message}\\n`);\n process.exit(1);\n});\n","import { ChainStreamClient } from \"@chainstream-io/sdk\";\nimport { loadConfig, getWalletMode } from \"./config.js\";\nimport { createWallet } from \"../wallet/index.js\";\nimport { autoPurchaseOnDemand } from \"./x402.js\";\nimport type { Wallet } from \"../wallet/types.js\";\n\nlet _client: ChainStreamClient | null = null;\nlet _wallet: Wallet | null = null;\n\nexport function createClient(): ChainStreamClient {\n if (_client) return _client;\n\n const config = loadConfig();\n const walletMode = getWalletMode(config);\n\n if (walletMode) {\n _wallet = createWallet(config, walletMode);\n _client = new ChainStreamClient(\"\", {\n serverUrl: config.baseUrl,\n walletSigner: _wallet,\n } as never);\n return _client;\n }\n\n if (config.apiKey) {\n _client = new ChainStreamClient(\"\", {\n serverUrl: config.baseUrl,\n apiKey: config.apiKey,\n });\n return _client;\n }\n\n throw new Error(\n \"Not authenticated. Run one of:\\n\" +\n \" chainstream login # Email OTP (creates Turnkey wallet)\\n\" +\n \" chainstream login --key # P-256 key (no email)\\n\" +\n \" chainstream wallet set-raw # Raw private key (dev)\\n\" +\n \" chainstream config set --key apiKey --value <key> # API key only\",\n );\n}\n\nexport function requireWallet(): ChainStreamClient {\n const config = loadConfig();\n const walletMode = getWalletMode(config);\n if (!walletMode) {\n throw new Error(\n \"Wallet required for this operation. Run:\\n\" +\n \" chainstream login # Create Turnkey wallet\\n\" +\n \" chainstream wallet set-raw # Dev: use raw private key\",\n );\n }\n return createClient();\n}\n\n/**\n * Execute an SDK call with automatic 402 → x402 purchase → retry.\n *\n * This is the transparent payment layer:\n * 1. Call the SDK method\n * 2. If 402: auto-purchase quota via x402 protocol\n * 3. Retry the original call\n * 4. Agent never sees the 402\n */\nexport async function callWithAutoPayment<T>(\n fn: () => Promise<T>,\n retried = false,\n): Promise<T> {\n try {\n return await fn();\n } catch (err: unknown) {\n const is402 = isPaymentRequired(err);\n\n if (is402 && !retried && _wallet) {\n const config = loadConfig();\n const result = await autoPurchaseOnDemand(config);\n\n if (result.success) {\n // Reset SDK client to pick up new subscription\n _client = null;\n createClient();\n return callWithAutoPayment(fn, true);\n }\n }\n\n throw err;\n }\n}\n\nfunction isPaymentRequired(err: unknown): boolean {\n if (!err || typeof err !== \"object\") return false;\n\n // Axios error with response.status === 402\n const axiosErr = err as { response?: { status?: number }; status?: number; message?: string };\n if (axiosErr.response?.status === 402) return true;\n if (axiosErr.status === 402) return true;\n if (axiosErr.message?.includes(\"402\")) return true;\n if (axiosErr.message?.includes(\"PAYMENT_REQUIRED\")) return true;\n\n return false;\n}\n","const VALID_CHAINS = new Set([\"sol\", \"bsc\", \"eth\"]);\nconst SOL_ADDRESS_RE = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;\nconst EVM_ADDRESS_RE = /^0x[0-9a-fA-F]{40}$/;\n\nconst CURRENCY_MAP: Record<string, Record<string, string>> = {\n sol: {\n SOL: \"So11111111111111111111111111111111111111112\",\n USDC: \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n },\n bsc: {\n BNB: \"0x0000000000000000000000000000000000000000\",\n USDC: \"0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d\",\n },\n eth: {\n ETH: \"0x0000000000000000000000000000000000000000\",\n USDC: \"0xA0b86991c6218b36c1d19d4a2e9eb0ce3606eB48\",\n },\n};\n\nexport function validateChain(chain: string): asserts chain is string {\n if (!VALID_CHAINS.has(chain)) {\n throw new Error(`Invalid chain \"${chain}\". Must be one of: ${[...VALID_CHAINS].join(\", \")}`);\n }\n}\n\nexport function validateAddress(address: string, chain: string): void {\n const isEvm = chain === \"bsc\" || chain === \"eth\";\n const valid = isEvm ? EVM_ADDRESS_RE.test(address) : SOL_ADDRESS_RE.test(address);\n if (!valid) {\n throw new Error(`Invalid address for chain \"${chain}\": \"${address}\"`);\n }\n}\n\nexport function validatePositiveNumber(value: string, label: string): void {\n const n = Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n throw new Error(`Invalid ${label}: \"${value}\". Must be a positive number.`);\n }\n}\n\nexport function validateSlippage(value: number): void {\n if (value < 0.001 || value > 0.5) {\n throw new Error(`Invalid slippage: ${value}. Must be between 0.001 (0.1%) and 0.5 (50%).`);\n }\n}\n\nexport function resolveCurrency(nameOrAddress: string, chain: string): string {\n const upper = nameOrAddress.toUpperCase();\n const resolved = CURRENCY_MAP[chain]?.[upper];\n if (resolved) return resolved;\n return nameOrAddress;\n}\n","const EXPLORERS: Record<string, string> = {\n sol: \"https://solscan.io/tx/\",\n bsc: \"https://bscscan.com/tx/\",\n eth: \"https://etherscan.io/tx/\",\n};\n\nexport function printResult(data: unknown, raw?: boolean): void {\n if (raw) {\n process.stdout.write(JSON.stringify(data) + \"\\n\");\n } else {\n process.stdout.write(JSON.stringify(data, null, 2) + \"\\n\");\n }\n}\n\nexport function printError(message: string): void {\n process.stderr.write(`[chainstream] Error: ${message}\\n`);\n}\n\nexport function exitOnError(err: unknown): never {\n const message = err instanceof Error ? err.message : String(err);\n printError(message);\n if (process.env.CHAINSTREAM_DEBUG && err instanceof Error && err.stack) {\n process.stderr.write(err.stack + \"\\n\");\n }\n process.exit(1);\n}\n\nexport function explorerUrl(chain: string, txHash: string): string {\n const base = EXPLORERS[chain] ?? EXPLORERS[\"eth\"];\n return `${base}${txHash}`;\n}\n","import { Command } from \"commander\";\nimport { createClient, callWithAutoPayment } from \"../lib/client.js\";\nimport { validateChain, validateAddress } from \"../lib/validate.js\";\nimport { printResult, exitOnError } from \"../lib/output.js\";\n\nexport function registerTokenCommands(program: Command): void {\n const token = program.command(\"token\").description(\"Token information and analytics\");\n\n token\n .command(\"search\")\n .description(\"Search tokens by keyword\")\n .requiredOption(\"--keyword <keyword>\", \"Search keyword (name, symbol, or address)\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .option(\"--limit <n>\", \"Max results\", \"20\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.token.search({ q: opts.keyword, chains: [opts.chain], limit: Number(opts.limit) }),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n token\n .command(\"info\")\n .description(\"Get full token detail\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Token contract address\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.token.getToken(opts.chain, opts.address),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n token\n .command(\"security\")\n .description(\"Check token security (honeypot, mint auth, freeze auth)\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Token contract address\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.token.getSecurity(opts.chain, opts.address),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n token\n .command(\"holders\")\n .description(\"Get top token holders\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Token contract address\")\n .option(\"--limit <n>\", \"Max results\", \"20\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.token.getTopHolders(opts.chain, opts.address, { limit: Number(opts.limit) } as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n token\n .command(\"candles\")\n .description(\"Get OHLCV candlestick data\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Token contract address\")\n .requiredOption(\"--resolution <res>\", \"Resolution: 1m/5m/15m/1h/4h/1d\")\n .option(\"--from <timestamp>\", \"Start time (Unix seconds)\")\n .option(\"--to <timestamp>\", \"End time (Unix seconds)\")\n .option(\"--limit <n>\", \"Max candles\", \"100\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const params: Record<string, unknown> = {\n resolution: opts.resolution,\n limit: Number(opts.limit),\n };\n if (opts.from) params.from = Number(opts.from);\n if (opts.to) params.to = Number(opts.to);\n const result = await callWithAutoPayment(() =>\n client.token.getCandles(opts.chain, opts.address, params as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n token\n .command(\"pools\")\n .description(\"Get liquidity pools for a token\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Token contract address\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.token.getPools(opts.chain, opts.address),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { createClient, callWithAutoPayment } from \"../lib/client.js\";\nimport { validateChain } from \"../lib/validate.js\";\nimport { printResult, exitOnError } from \"../lib/output.js\";\n\nexport function registerMarketCommands(program: Command): void {\n const market = program.command(\"market\").description(\"Market data and trending tokens\");\n\n market\n .command(\"trending\")\n .description(\"Get hot/trending tokens\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--duration <dur>\", \"Duration: 1h/6h/24h\")\n .option(\"--limit <n>\", \"Max results\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const client = createClient();\n const params: Record<string, unknown> = {};\n if (opts.limit) params.limit = Number(opts.limit);\n const result = await callWithAutoPayment(() =>\n client.ranking.getHotTokens(opts.chain, opts.duration, params as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n market\n .command(\"new\")\n .description(\"Get newly created tokens\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .option(\"--limit <n>\", \"Max results\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const client = createClient();\n const params: Record<string, unknown> = {};\n if (opts.limit) params.limit = Number(opts.limit);\n const result = await callWithAutoPayment(() =>\n client.ranking.getNewTokens(opts.chain, params as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n market\n .command(\"trades\")\n .description(\"Get recent trades\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .option(\"--token <address>\", \"Filter by token address\")\n .option(\"--limit <n>\", \"Max results\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const client = createClient();\n const params: Record<string, unknown> = {};\n if (opts.token) params.tokenAddress = opts.token;\n if (opts.limit) params.limit = Number(opts.limit);\n const result = await callWithAutoPayment(() =>\n client.trade.getTrades(opts.chain, params as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { createClient, callWithAutoPayment } from \"../lib/client.js\";\nimport { validateChain, validateAddress } from \"../lib/validate.js\";\nimport { printResult, exitOnError } from \"../lib/output.js\";\nimport { loadConfig, updateConfig } from \"../lib/config.js\";\nimport * as readline from \"node:readline/promises\";\n\nexport function registerWalletCommands(program: Command): void {\n const wallet = program.command(\"wallet\").description(\"Wallet analytics and management\");\n\n wallet\n .command(\"profile\")\n .description(\"Wallet profile: PnL + net worth + top holdings\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Wallet address\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const [pnl, netWorth, balance] = await callWithAutoPayment(() =>\n Promise.all([\n client.wallet.getPnl(opts.chain, opts.address),\n client.wallet.getNetWorth(opts.chain, opts.address),\n client.wallet.getTokensBalance(opts.chain, opts.address),\n ]),\n );\n printResult({ pnl, netWorth, balance }, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"pnl\")\n .description(\"Get wallet PnL details\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Wallet address\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.wallet.getPnl(opts.chain, opts.address),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"holdings\")\n .description(\"Get wallet token balances\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Wallet address\")\n .option(\"--limit <n>\", \"Max results\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const params: Record<string, unknown> = {};\n if (opts.limit) params.limit = Number(opts.limit);\n const result = await callWithAutoPayment(() =>\n client.wallet.getTokensBalance(opts.chain, opts.address, params as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"activity\")\n .description(\"Get wallet transfer history\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Wallet address\")\n .option(\"--limit <n>\", \"Max results\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const params: Record<string, unknown> = {};\n if (opts.limit) params.limit = Number(opts.limit);\n const result = await callWithAutoPayment(() =>\n client.wallet.getWalletTransfers(opts.chain, opts.address, params as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"address\")\n .description(\"Show current wallet addresses\")\n .action(async () => {\n try {\n const config = loadConfig();\n const walletMode = (await import(\"../lib/config.js\")).getWalletMode(config);\n if (walletMode === \"turnkey\" && config.turnkey) {\n const { createWalletWithAddresses } = await import(\"../wallet/index.js\");\n const wallets = await createWalletWithAddresses(config, \"turnkey\");\n if (wallets.evm) process.stdout.write(`EVM: ${wallets.evm.address}\\n`);\n if (wallets.solana) process.stdout.write(`Solana: ${wallets.solana.address}\\n`);\n } else if (config.rawWallet) {\n const { createWallet } = await import(\"../wallet/index.js\");\n const w = createWallet(config, \"raw\");\n process.stdout.write(`${w.chain.toUpperCase()}: ${w.address}\\n`);\n } else {\n process.stdout.write(\"No wallet configured. Run: chainstream login\\n\");\n }\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"balance\")\n .description(\"Show current wallet balance\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const config = loadConfig();\n let address: string | undefined;\n if (config.rawWallet) {\n const { createWallet } = await import(\"../wallet/index.js\");\n address = createWallet(config, \"raw\").address;\n }\n // Phase 4: Turnkey address resolution\n if (!address) throw new Error(\"No wallet configured. Run: chainstream login\");\n\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.wallet.getTokensBalance(opts.chain, address),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"set-raw\")\n .description(\"Set raw private key (dev/testing only)\")\n .requiredOption(\"--chain <chain>\", \"Chain: evm/solana\")\n .action(async (opts) => {\n try {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n process.stdout.write(\"⚠ WARNING: Raw private key will be stored in plaintext.\\n\");\n process.stdout.write(\" Use Turnkey (chainstream login) for production.\\n\\n\");\n const key = await rl.question(\"Enter private key: \");\n rl.close();\n\n if (!key.trim()) throw new Error(\"Empty key provided.\");\n\n updateConfig({\n rawWallet: { key: key.trim(), chain: opts.chain },\n });\n process.stdout.write(`Raw wallet set (${opts.chain}). Run 'chainstream wallet address' to verify.\\n`);\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"pricing\")\n .description(\"Show available x402 quota plans\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n const config = loadConfig();\n const { getPricing } = await import(\"../lib/x402.js\");\n const plans = await getPricing(config.baseUrl);\n printResult(plans, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { createClient, callWithAutoPayment } from \"../lib/client.js\";\nimport { validateChain, validateAddress } from \"../lib/validate.js\";\nimport { printResult, exitOnError } from \"../lib/output.js\";\n\nexport function registerKytCommands(program: Command): void {\n const kyt = program.command(\"kyt\").description(\"KYT address risk assessment\");\n\n kyt\n .command(\"risk\")\n .description(\"Assess address risk score\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Address to assess\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.kyt.getAddressRisk(opts.address),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { createClient, requireWallet, callWithAutoPayment } from \"../lib/client.js\";\nimport { validateChain, validateAddress, validateSlippage, resolveCurrency } from \"../lib/validate.js\";\nimport { printResult, exitOnError, explorerUrl } from \"../lib/output.js\";\nimport * as readline from \"node:readline/promises\";\n\nexport function registerDexCommands(program: Command): void {\n const dex = program.command(\"dex\").description(\"DEX swap, quote, and token creation\");\n\n dex\n .command(\"quote\")\n .description(\"Get swap quote (read-only)\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--input-token <addr>\", \"Input token (address or SOL/ETH/BNB/USDC)\")\n .requiredOption(\"--output-token <addr>\", \"Output token (address or SOL/ETH/BNB/USDC)\")\n .requiredOption(\"--amount <amount>\", \"Input amount (smallest unit)\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const inputToken = resolveCurrency(opts.inputToken, opts.chain);\n const outputToken = resolveCurrency(opts.outputToken, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.dex.quote(opts.chain, {\n inputMint: inputToken,\n outputMint: outputToken,\n amount: opts.amount,\n } as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n dex\n .command(\"swap\")\n .description(\"[FINANCIAL] Execute token swap (irreversible)\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--from <address>\", \"Sender wallet address\")\n .requiredOption(\"--input-token <addr>\", \"Input token (address or SOL/ETH/BNB/USDC)\")\n .requiredOption(\"--output-token <addr>\", \"Output token (address or SOL/ETH/BNB/USDC)\")\n .requiredOption(\"--amount <amount>\", \"Input amount (smallest unit)\")\n .option(\"--slippage <n>\", \"Slippage tolerance (e.g. 0.01 = 1%)\", \"0.01\")\n .option(\"--raw\", \"Single-line JSON output\")\n .option(\"--yes\", \"Skip confirmation prompt\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.from, opts.chain);\n if (opts.slippage) validateSlippage(Number(opts.slippage));\n\n const inputToken = resolveCurrency(opts.inputToken, opts.chain);\n const outputToken = resolveCurrency(opts.outputToken, opts.chain);\n const client = requireWallet();\n\n // Phase 1: Quote\n process.stderr.write(\"Fetching quote...\\n\");\n const quote = await callWithAutoPayment(() =>\n client.dex.quote(opts.chain, {\n inputMint: inputToken,\n outputMint: outputToken,\n amount: opts.amount,\n } as never),\n );\n\n // Phase 2: Confirm\n process.stderr.write(\"\\n--- Swap Summary ---\\n\");\n process.stderr.write(`Chain: ${opts.chain}\\n`);\n process.stderr.write(`Input: ${inputToken}\\n`);\n process.stderr.write(`Output: ${outputToken}\\n`);\n process.stderr.write(`Amount: ${opts.amount}\\n`);\n process.stderr.write(`Slippage: ${opts.slippage}\\n`);\n process.stderr.write(`Quote: ${JSON.stringify(quote)}\\n`);\n process.stderr.write(\"--------------------\\n\\n\");\n\n if (!opts.yes) {\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n const answer = await rl.question(\"Confirm swap? (y/N): \");\n rl.close();\n if (answer.toLowerCase() !== \"y\") {\n process.stderr.write(\"Swap cancelled.\\n\");\n return;\n }\n }\n\n // Phase 3: Build + Sign\n process.stderr.write(\"Building transaction...\\n\");\n const swapResult = await callWithAutoPayment(() =>\n client.dex.swap(opts.chain, {\n userAddress: opts.from,\n inputMint: inputToken,\n outputMint: outputToken,\n amount: opts.amount,\n slippage: Number(opts.slippage),\n } as never),\n ) as { serializedTx: string };\n\n const { createWallet } = await import(\"../wallet/index.js\");\n const { loadConfig, getWalletMode } = await import(\"../lib/config.js\");\n const config = loadConfig();\n const walletMode = getWalletMode(config);\n if (!walletMode) throw new Error(\"Wallet required for swap.\");\n\n const wallet = createWallet(config, walletMode);\n process.stderr.write(\"Signing transaction...\\n\");\n const signedTx = await wallet.signTransaction(swapResult.serializedTx);\n\n // Phase 4: Broadcast + Poll\n process.stderr.write(\"Broadcasting transaction...\\n\");\n const sendResult = await client.transaction.send(opts.chain as never, {\n signedTx,\n } as never) as { signature?: string; jobId?: string };\n\n if (sendResult.jobId) {\n process.stderr.write(`Job ${sendResult.jobId} submitted. Waiting for confirmation...\\n`);\n const jobResult = await client.waitForJob(sendResult.jobId);\n const result = {\n ...jobResult as Record<string, unknown>,\n explorer: explorerUrl(opts.chain, (sendResult.signature ?? (jobResult as Record<string, unknown>).hash as string) || \"\"),\n };\n printResult(result, opts.raw);\n } else {\n const result = {\n ...sendResult,\n explorer: explorerUrl(opts.chain, sendResult.signature ?? \"\"),\n };\n printResult(result, opts.raw);\n }\n } catch (err) { exitOnError(err); }\n });\n\n dex\n .command(\"create\")\n .description(\"[FINANCIAL] Create token on launchpad\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--name <name>\", \"Token name\")\n .requiredOption(\"--symbol <symbol>\", \"Token symbol\")\n .requiredOption(\"--uri <uri>\", \"Metadata URI (IPFS/HTTP)\")\n .option(\"--platform <platform>\", \"Launchpad: pumpfun/raydium\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const client = requireWallet();\n const result = await callWithAutoPayment(() =>\n client.dex.createToken(opts.chain, {\n name: opts.name,\n symbol: opts.symbol,\n uri: opts.uri,\n platform: opts.platform,\n } as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { createClient, callWithAutoPayment } from \"../lib/client.js\";\nimport { printResult, exitOnError } from \"../lib/output.js\";\n\nexport function registerJobCommands(program: Command): void {\n const job = program.command(\"job\").description(\"Job status polling\");\n\n job\n .command(\"status\")\n .description(\"Check job status\")\n .requiredOption(\"--id <jobId>\", \"Job ID\")\n .option(\"--wait\", \"Wait for job completion via SSE\")\n .option(\"--timeout <ms>\", \"Wait timeout in milliseconds\", \"60000\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n const client = createClient();\n if (opts.wait) {\n process.stderr.write(`Waiting for job ${opts.id}...\\n`);\n const result = await callWithAutoPayment(() =>\n client.waitForJob(opts.id, Number(opts.timeout)),\n );\n printResult(result, opts.raw);\n } else {\n const result = await callWithAutoPayment(() =>\n client.job.get(opts.id),\n );\n printResult(result, opts.raw);\n }\n } catch (err) { exitOnError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { loadConfig, updateConfig } from \"../lib/config.js\";\nimport { loadKey, saveKey, hasKey } from \"../lib/keystore.js\";\nimport {\n otpInit, completeLogin, generateP256KeyPair,\n refreshTurnkeySession, TURNKEY_CONFIG_ID,\n} from \"../lib/turnkey.js\";\nimport { exitOnError } from \"../lib/output.js\";\nimport * as readline from \"node:readline/promises\";\n\nexport function registerAuthCommands(program: Command): void {\n program\n .command(\"login\")\n .description(\"Authenticate via Email OTP (default) or P-256 key (--key)\")\n .argument(\"[email]\", \"Email address for OTP login\")\n .option(\"--key\", \"Use P-256 key login (no email required)\")\n .action(async (email: string | undefined, opts: { key?: boolean }) => {\n try {\n if (opts.key) {\n await doKeyLogin();\n } else {\n await doEmailLogin(email);\n }\n } catch (err) { exitOnError(err); }\n });\n\n program\n .command(\"verify\")\n .description(\"Verify email OTP (second step of login)\")\n .requiredOption(\"--otp-id <id>\", \"OTP ID from login step\")\n .requiredOption(\"--code <code>\", \"OTP code from email\")\n .requiredOption(\"--email <email>\", \"Email used in login step\")\n .action(async (opts: { otpId: string; code: string; email: string }) => {\n try {\n const configId = TURNKEY_CONFIG_ID;\n if (!configId) throw new Error(\"TURNKEY_AUTH_PROXY_CONFIG_ID not set.\");\n\n process.stderr.write(\"Verifying OTP...\\n\");\n const result = await completeLogin(opts.otpId, opts.code, configId, opts.email);\n\n saveKey({\n publicKeyHex: result.keyPair.publicKeyHex,\n uncompressedPublicKeyHex: result.keyPair.uncompressedPublicKeyHex,\n privateKeyDer: result.keyPair.privateKeyDer,\n organizationId: result.organizationId,\n });\n\n updateConfig({\n turnkey: {\n publicKeyHex: result.keyPair.publicKeyHex,\n privateKeyDer: result.keyPair.privateKeyDer,\n organizationId: result.organizationId,\n sessionToken: result.session,\n sessionExpiry: result.sessionExpiry,\n },\n });\n\n if (result.isNewUser) {\n process.stdout.write(\"Welcome! Your ChainStream wallet has been created.\\n\");\n process.stdout.write(\"Run 'chainstream wallet address' to see your addresses.\\n\");\n } else {\n process.stdout.write(\"Logged in successfully.\\n\");\n }\n } catch (err) { exitOnError(err); }\n });\n\n program\n .command(\"logout\")\n .description(\"Clear session (P-256 keys preserved)\")\n .action(() => {\n const config = loadConfig();\n if (config.turnkey) {\n updateConfig({ turnkey: undefined });\n process.stdout.write(\"Logged out. P-256 keys preserved in ~/.config/chainstream/keys/\\n\");\n process.stdout.write(\"Run 'chainstream login --key' to re-authenticate.\\n\");\n } else {\n process.stdout.write(\"Not logged in via Turnkey.\\n\");\n }\n });\n}\n\nasync function doKeyLogin(): Promise<void> {\n const existingKey = loadKey();\n\n if (existingKey?.organizationId) {\n process.stderr.write(\"Refreshing session with existing P-256 key...\\n\");\n const { session, expiry } = await refreshTurnkeySession(\n existingKey.publicKeyHex,\n existingKey.privateKeyDer,\n existingKey.organizationId,\n );\n\n updateConfig({\n turnkey: {\n publicKeyHex: existingKey.publicKeyHex,\n privateKeyDer: existingKey.privateKeyDer,\n organizationId: existingKey.organizationId,\n sessionToken: session,\n sessionExpiry: expiry,\n },\n });\n\n process.stdout.write(\"Logged in (key-based session refresh).\\n\");\n return;\n }\n\n if (hasKey()) {\n process.stderr.write(\"Found P-256 key but no organizationId.\\n\");\n process.stderr.write(\"You need to complete initial login via email first.\\n\");\n process.stderr.write(\"Run: chainstream login <your-email>\\n\");\n return;\n }\n\n // New user with --key: need email OTP first to create sub-org\n process.stderr.write(\"No existing key found.\\n\");\n process.stderr.write(\"First-time users must log in via email to create a wallet:\\n\");\n process.stderr.write(\" chainstream login <your-email>\\n\\n\");\n process.stderr.write(\"After initial setup, you can use 'chainstream login --key' for future logins.\\n\");\n}\n\nasync function doEmailLogin(email?: string): Promise<void> {\n const configId = TURNKEY_CONFIG_ID;\n if (!configId) throw new Error(\"TURNKEY_AUTH_PROXY_CONFIG_ID not set. Contact ChainStream support.\");\n\n if (!email) {\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n email = await rl.question(\"Enter your email: \");\n rl.close();\n if (!email?.trim()) throw new Error(\"Email required.\");\n email = email.trim();\n }\n\n process.stderr.write(`Sending OTP to ${email}...\\n`);\n const { otpId } = await otpInit(email, configId);\n\n // Interactive: prompt for OTP\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n const code = await rl.question(\"Enter OTP code: \");\n rl.close();\n\n if (!code?.trim()) throw new Error(\"OTP code required.\");\n\n process.stderr.write(\"Verifying...\\n\");\n const result = await completeLogin(otpId, code.trim(), configId, email);\n\n saveKey({\n publicKeyHex: result.keyPair.publicKeyHex,\n uncompressedPublicKeyHex: result.keyPair.uncompressedPublicKeyHex,\n privateKeyDer: result.keyPair.privateKeyDer,\n organizationId: result.organizationId,\n });\n\n updateConfig({\n turnkey: {\n publicKeyHex: result.keyPair.publicKeyHex,\n privateKeyDer: result.keyPair.privateKeyDer,\n organizationId: result.organizationId,\n sessionToken: result.session,\n sessionExpiry: result.sessionExpiry,\n },\n });\n\n if (result.isNewUser) {\n process.stdout.write(\"Welcome! Your ChainStream wallet has been created (EVM + Solana).\\n\");\n process.stdout.write(\"Run 'chainstream wallet address' to see your addresses.\\n\");\n } else {\n process.stdout.write(\"Logged in successfully.\\n\");\n }\n}\n","/**\n * P-256 Key Store — persistent key pair storage in ~/.config/chainstream/keys/.\n *\n * Keys are stored independently from config.json so that `logout`\n * (which clears config.turnkey) does not destroy the user's identity.\n *\n * Adapted from openant-cli/src/lib/keystore.ts.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, unlinkSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getConfigDir } from \"./config.js\";\n\nconst KEYS_DIR = join(getConfigDir(), \"keys\");\nconst DEFAULT_PROFILE = \"default\";\n\nfunction ensureKeysDir(): void {\n if (!existsSync(KEYS_DIR)) {\n mkdirSync(KEYS_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\nfunction privatePath(profile: string): string { return join(KEYS_DIR, `${profile}.private`); }\nfunction publicPath(profile: string): string { return join(KEYS_DIR, `${profile}.public`); }\nfunction metaPath(profile: string): string { return join(KEYS_DIR, `${profile}.json`); }\n\nexport interface StoredKeyPair {\n publicKeyHex: string;\n uncompressedPublicKeyHex: string;\n privateKeyDer: string;\n organizationId?: string;\n}\n\nexport function hasKey(profile = DEFAULT_PROFILE): boolean {\n return existsSync(privatePath(profile)) && existsSync(publicPath(profile));\n}\n\nexport function loadKey(profile = DEFAULT_PROFILE): StoredKeyPair | undefined {\n if (!hasKey(profile)) return undefined;\n\n try {\n const privateKeyDer = readFileSync(privatePath(profile), \"utf-8\").trim();\n const publicKeyHex = readFileSync(publicPath(profile), \"utf-8\").trim();\n\n let uncompressedPublicKeyHex = \"\";\n let organizationId: string | undefined;\n\n if (existsSync(metaPath(profile))) {\n const meta = JSON.parse(readFileSync(metaPath(profile), \"utf-8\"));\n uncompressedPublicKeyHex = meta.uncompressedPublicKeyHex ?? \"\";\n organizationId = meta.organizationId;\n }\n\n return { publicKeyHex, uncompressedPublicKeyHex, privateKeyDer, organizationId };\n } catch {\n return undefined;\n }\n}\n\nexport function saveKey(keyPair: StoredKeyPair, profile = DEFAULT_PROFILE): void {\n ensureKeysDir();\n writeFileSync(privatePath(profile), keyPair.privateKeyDer, { mode: 0o600 });\n writeFileSync(publicPath(profile), keyPair.publicKeyHex, { mode: 0o600 });\n writeFileSync(\n metaPath(profile),\n JSON.stringify({\n uncompressedPublicKeyHex: keyPair.uncompressedPublicKeyHex,\n ...(keyPair.organizationId ? { organizationId: keyPair.organizationId } : {}),\n }, null, 2),\n { mode: 0o600 },\n );\n}\n\nexport function updateKeyMeta(organizationId: string, profile = DEFAULT_PROFILE): void {\n if (!existsSync(metaPath(profile))) return;\n try {\n const meta = JSON.parse(readFileSync(metaPath(profile), \"utf-8\"));\n meta.organizationId = organizationId;\n writeFileSync(metaPath(profile), JSON.stringify(meta, null, 2), { mode: 0o600 });\n } catch { /* ignore */ }\n}\n\nexport function deleteKey(profile = DEFAULT_PROFILE): boolean {\n let deleted = false;\n for (const p of [privatePath(profile), publicPath(profile), metaPath(profile)]) {\n if (existsSync(p)) { unlinkSync(p); deleted = true; }\n }\n return deleted;\n}\n\nexport function listProfiles(): string[] {\n if (!existsSync(KEYS_DIR)) return [];\n return readdirSync(KEYS_DIR)\n .filter((f) => f.endsWith(\".private\"))\n .map((f) => f.replace(/\\.private$/, \"\"));\n}\n","import { Command } from \"commander\";\nimport { loadConfig, updateConfig, getWalletMode } from \"../lib/config.js\";\nimport { exitOnError } from \"../lib/output.js\";\n\nexport function registerConfigCommands(program: Command): void {\n const config = program.command(\"config\").description(\"Configuration management\");\n\n config\n .command(\"set\")\n .description(\"Set a configuration value\")\n .requiredOption(\"--key <key>\", \"Config key (apiKey, baseUrl)\")\n .requiredOption(\"--value <value>\", \"Config value\")\n .action((opts) => {\n try {\n const allowedKeys = [\"apiKey\", \"baseUrl\"];\n if (!allowedKeys.includes(opts.key)) {\n throw new Error(`Invalid key \"${opts.key}\". Allowed: ${allowedKeys.join(\", \")}`);\n }\n updateConfig({ [opts.key]: opts.value });\n process.stdout.write(`Set ${opts.key} = ${opts.key === \"apiKey\" ? \"***\" : opts.value}\\n`);\n } catch (err) { exitOnError(err); }\n });\n\n config\n .command(\"get\")\n .description(\"Show configuration\")\n .option(\"--key <key>\", \"Specific key to show\")\n .action((opts) => {\n try {\n const cfg = loadConfig();\n if (opts.key) {\n const value = (cfg as unknown as Record<string, unknown>)[opts.key];\n if (value === undefined) {\n process.stdout.write(`${opts.key}: (not set)\\n`);\n } else if (opts.key === \"apiKey\" && typeof value === \"string\") {\n process.stdout.write(`${opts.key}: ${value.slice(0, 8)}...${value.slice(-4)}\\n`);\n } else {\n process.stdout.write(`${opts.key}: ${JSON.stringify(value)}\\n`);\n }\n } else {\n const display = {\n apiKey: cfg.apiKey ? `${cfg.apiKey.slice(0, 8)}...` : undefined,\n baseUrl: cfg.baseUrl,\n walletMode: getWalletMode(cfg),\n turnkey: cfg.turnkey ? { organizationId: cfg.turnkey.organizationId } : undefined,\n rawWallet: cfg.rawWallet ? { chain: cfg.rawWallet.chain } : undefined,\n };\n process.stdout.write(JSON.stringify(display, null, 2) + \"\\n\");\n }\n } catch (err) { exitOnError(err); }\n });\n\n config\n .command(\"auth\")\n .description(\"Show current authentication status\")\n .action(() => {\n try {\n const cfg = loadConfig();\n const mode = getWalletMode(cfg);\n\n if (mode === \"turnkey\") {\n process.stdout.write(`Auth: Turnkey (org: ${cfg.turnkey!.organizationId})\\n`);\n const expiry = new Date(cfg.turnkey!.sessionExpiry * 1000);\n const expired = Date.now() > cfg.turnkey!.sessionExpiry * 1000;\n process.stdout.write(`Session: ${expired ? \"expired\" : \"active\"} (expires: ${expiry.toISOString()})\\n`);\n } else if (mode === \"raw\") {\n process.stdout.write(`Auth: Raw Key (${cfg.rawWallet!.chain})\\n`);\n } else if (cfg.apiKey) {\n process.stdout.write(`Auth: API Key (${cfg.apiKey.slice(0, 8)}...)\\n`);\n } else {\n process.stdout.write(\"Auth: Not configured\\n\");\n process.stdout.write(\" Run: chainstream login # Turnkey wallet\\n\");\n process.stdout.write(\" Run: chainstream config set apiKey <key> # API key\\n\");\n }\n } catch (err) { exitOnError(err); }\n });\n}\n"],"mappings":"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","names":["privateKeyToAccount","program","program","program","createWalletWithAddresses","createWallet","getPricing","program","readline","program","createWallet","loadConfig","getWalletMode","program","existsSync","mkdirSync","readFileSync","writeFileSync","join","readline","program","rl","program"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/constants.ts","../src/lib/config.ts","../src/wallet/raw-wallet.ts","../src/lib/turnkey.ts","../src/wallet/turnkey-wallet.ts","../src/wallet/index.ts","../src/lib/x402.ts","../src/index.ts","../src/lib/client.ts","../src/lib/validate.ts","../src/lib/output.ts","../src/commands/token.ts","../src/commands/market.ts","../src/commands/wallet.ts","../src/commands/kyt.ts","../src/commands/dex.ts","../src/commands/job.ts","../src/commands/auth.ts","../src/lib/keystore.ts","../src/commands/config-cmd.ts"],"sourcesContent":["/**\n * Public constants for the ChainStream CLI.\n *\n * All values can be overridden via environment variables for local development.\n * Production defaults are used when no env var is set.\n */\n\n/** ChainStream API base URL. */\nexport const CHAINSTREAM_API_URL =\n process.env.CHAINSTREAM_API_URL ?? \"https://api.chainstream.io\";\n\n/**\n * Turnkey auth proxy config ID — shared with openant-cli under parent org LB.\n * All user sub-orgs are created under the same parent; use the\n * \"chainstream-personal-\" prefix in userName / organizationName to\n * distinguish ChainStream users from OpenAnt users.\n */\nexport const TURNKEY_AUTH_PROXY_CONFIG_ID =\n process.env.TURNKEY_AUTH_PROXY_CONFIG_ID ?? \"7550819d-2607-4910-a3d9-8e6e3ff870f9\";\n\n/** Solana RPC endpoint. */\nexport const SOLANA_RPC_URL =\n process.env.SOLANA_RPC_URL ?? \"https://api.mainnet-beta.solana.com\";\n\n/** Base (EVM) RPC endpoint. */\nexport const BASE_RPC_URL =\n process.env.BASE_RPC_URL ?? \"https://mainnet.base.org\";\n\n/** Base chain ID (8453 = mainnet). */\nexport const BASE_CHAIN_ID = Number(process.env.BASE_CHAIN_ID ?? \"8453\");\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport { CHAINSTREAM_API_URL } from \"./constants.js\";\n\nconst CONFIG_DIR = join(homedir(), \".config\", \"chainstream\");\nconst CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\n\nexport interface TurnkeyCredentials {\n publicKeyHex: string;\n uncompressedPublicKeyHex?: string;\n privateKeyDer: string;\n organizationId: string;\n sessionToken: string;\n sessionExpiry: number;\n}\n\nexport interface RawWalletConfig {\n key: string;\n chain: \"evm\" | \"solana\";\n}\n\nexport interface Config {\n apiKey?: string;\n baseUrl: string;\n turnkey?: TurnkeyCredentials;\n rawWallet?: RawWalletConfig;\n}\n\nexport type WalletMode = \"turnkey\" | \"raw\" | undefined;\n\nexport function getConfigDir(): string {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true });\n }\n return CONFIG_DIR;\n}\n\nexport function loadConfig(): Config {\n const defaults: Config = {\n baseUrl: CHAINSTREAM_API_URL,\n };\n\n if (!existsSync(CONFIG_FILE)) return defaults;\n\n try {\n const raw = readFileSync(CONFIG_FILE, \"utf-8\");\n const parsed = JSON.parse(raw) as Partial<Config>;\n return { ...defaults, ...parsed };\n } catch {\n return defaults;\n }\n}\n\nexport function saveConfig(config: Config): void {\n getConfigDir();\n writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport function updateConfig(patch: Partial<Config>): void {\n const current = loadConfig();\n saveConfig({ ...current, ...patch });\n}\n\nexport function getWalletMode(config: Config): WalletMode {\n if (config.turnkey?.sessionToken) return \"turnkey\";\n if (config.rawWallet?.key) return \"raw\";\n return undefined;\n}\n","import { privateKeyToAccount } from \"viem/accounts\";\nimport type { Hex } from \"viem\";\nimport { Keypair, VersionedTransaction } from \"@solana/web3.js\";\nimport { sign as ed25519Sign } from \"node:crypto\";\nimport type { Wallet } from \"./types.js\";\n\nfunction bs58Decode(str: string): Uint8Array {\n const ALPHABET = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\n const BASE = 58;\n const result: number[] = [0];\n for (const char of str) {\n let carry = ALPHABET.indexOf(char);\n if (carry < 0) throw new Error(`Invalid base58 character: ${char}`);\n for (let j = 0; j < result.length; j++) {\n carry += result[j] * BASE;\n result[j] = carry & 0xff;\n carry >>= 8;\n }\n while (carry > 0) {\n result.push(carry & 0xff);\n carry >>= 8;\n }\n }\n for (const char of str) {\n if (char !== \"1\") break;\n result.push(0);\n }\n return new Uint8Array(result.reverse());\n}\n\nexport class RawKeyWallet implements Wallet {\n chain: \"evm\" | \"solana\";\n address: string;\n private privateKey: string;\n\n constructor(key: string, chain: \"evm\" | \"solana\") {\n this.chain = chain;\n this.privateKey = key;\n\n if (chain === \"evm\") {\n const hex = (key.startsWith(\"0x\") ? key : `0x${key}`) as Hex;\n const account = privateKeyToAccount(hex);\n this.address = account.address;\n } else {\n const decoded = bs58Decode(key);\n const keypair = Keypair.fromSecretKey(decoded);\n this.address = keypair.publicKey.toBase58();\n }\n }\n\n async signMessage(message: string): Promise<string> {\n if (this.chain === \"evm\") {\n const hex = (this.privateKey.startsWith(\"0x\") ? this.privateKey : `0x${this.privateKey}`) as Hex;\n const account = privateKeyToAccount(hex);\n return account.signMessage({ message });\n }\n\n // Solana: ed25519 sign using Node.js crypto with raw private key\n // Node.js crypto.sign with ed25519 needs the key in PKCS8 DER format.\n // Solana Keypair.secretKey is 64 bytes (32 secret + 32 public).\n // We convert to PKCS8 DER for node:crypto compatibility.\n const decoded = bs58Decode(this.privateKey);\n const secretKeyRaw = decoded.slice(0, 32);\n\n // PKCS8 DER wrapper for ed25519: fixed 16-byte prefix + 34-byte key (04 20 + 32 bytes)\n const pkcs8Prefix = Buffer.from(\"302e020100300506032b657004220420\", \"hex\");\n const pkcs8Der = Buffer.concat([pkcs8Prefix, Buffer.from(secretKeyRaw)]);\n\n const msgBytes = Buffer.from(message, \"utf-8\");\n const sig = ed25519Sign(null, msgBytes, { key: pkcs8Der, format: \"der\", type: \"pkcs8\" });\n return sig.toString(\"hex\");\n }\n\n async signTransaction(serializedTx: string): Promise<string> {\n const txBytes = Buffer.from(serializedTx, \"base64\");\n\n if (this.chain === \"solana\") {\n const tx = VersionedTransaction.deserialize(new Uint8Array(txBytes));\n const decoded = bs58Decode(this.privateKey);\n const keypair = Keypair.fromSecretKey(decoded);\n tx.sign([keypair]);\n return Buffer.from(tx.serialize()).toString(\"base64\");\n }\n\n // EVM: defi-service returns unsigned RLP as base64\n // For proper EVM tx signing, we'd need to parse the unsigned RLP and sign.\n // This is a placeholder — real implementation needs the unsigned tx fields.\n const hex = (this.privateKey.startsWith(\"0x\") ? this.privateKey : `0x${this.privateKey}`) as Hex;\n const account = privateKeyToAccount(hex);\n const signedHex = await account.signTransaction({ type: \"legacy\" } as never);\n return Buffer.from(signedHex.slice(2), \"hex\").toString(\"base64\");\n }\n}\n","/**\n * Turnkey Auth Proxy + Coordinator API client.\n * Adapted from openant-cli/src/lib/turnkey.ts for ChainStream.\n *\n * Flow:\n * 1. /v1/otp_init — send OTP to email\n * 2. /v1/otp_verify — verify OTP, get verification token\n * 3. /v1/account — check if user exists\n * 4. /v1/signup — create sub-org + wallets (new users only)\n * 5. /v1/otp_login — exchange verification token for session JWT\n */\n\nimport { createSign, generateKeyPairSync } from \"node:crypto\";\nimport type { TurnkeyCredentials } from \"./config.js\";\n\nconst AUTH_PROXY_BASE = \"https://authproxy.turnkey.com\";\nexport const TURNKEY_API_BASE = \"https://api.turnkey.com\";\n\nimport { TURNKEY_AUTH_PROXY_CONFIG_ID } from \"./constants.js\";\n\nexport const TURNKEY_CONFIG_ID = TURNKEY_AUTH_PROXY_CONFIG_ID;\n\n// ── P-256 Key Pair ───────────────────────────────────────────────\n\nexport interface P256KeyPair {\n publicKeyHex: string;\n uncompressedPublicKeyHex: string;\n privateKeyDer: string;\n}\n\nexport function generateP256KeyPair(): P256KeyPair {\n const { publicKey, privateKey } = generateKeyPairSync(\"ec\", {\n namedCurve: \"prime256v1\",\n publicKeyEncoding: { type: \"spki\", format: \"der\" },\n privateKeyEncoding: { type: \"pkcs8\", format: \"der\" },\n });\n\n const pubBuf = Buffer.from(publicKey);\n const uncompressedBytes = pubBuf.subarray(26);\n const x = uncompressedBytes.subarray(1, 33);\n const y = uncompressedBytes.subarray(33, 65);\n const prefix = y[31]! % 2 === 0 ? 0x02 : 0x03;\n const compressedHex = Buffer.concat([Buffer.from([prefix]), x]).toString(\"hex\");\n const uncompressedHex = Buffer.from(uncompressedBytes).toString(\"hex\");\n\n return {\n publicKeyHex: compressedHex,\n uncompressedPublicKeyHex: uncompressedHex,\n privateKeyDer: Buffer.from(privateKey).toString(\"base64\"),\n };\n}\n\nexport function signRawP256(message: string, privateKeyDerBase64: string): string {\n const signer = createSign(\"SHA256\");\n signer.update(message);\n signer.end();\n\n const derSig = signer.sign({\n key: Buffer.from(privateKeyDerBase64, \"base64\"),\n format: \"der\",\n type: \"pkcs8\",\n });\n\n return derToRawSignature(derSig);\n}\n\nfunction derToRawSignature(der: Buffer): string {\n let offset = 0;\n if (der[offset++] !== 0x30) throw new Error(\"Invalid DER signature\");\n offset++;\n\n if (der[offset++] !== 0x02) throw new Error(\"Invalid DER signature\");\n const rLen = der[offset++]!;\n const rBytes = der.subarray(offset, offset + rLen);\n offset += rLen;\n\n if (der[offset++] !== 0x02) throw new Error(\"Invalid DER signature\");\n const sLen = der[offset++]!;\n const sBytes = der.subarray(offset, offset + sLen);\n\n const r = padOrTrimTo32(rBytes);\n const s = padOrTrimTo32(sBytes);\n return Buffer.concat([r, s]).toString(\"hex\");\n}\n\nfunction padOrTrimTo32(buf: Buffer): Buffer {\n if (buf.length === 32) return buf;\n if (buf.length === 33 && buf[0] === 0x00) return buf.subarray(1);\n if (buf.length < 32) {\n const padded = Buffer.alloc(32);\n buf.copy(padded, 32 - buf.length);\n return padded;\n }\n return buf.subarray(buf.length - 32);\n}\n\n// ── JWT Decode ───────────────────────────────────────────────────\n\ninterface JwtPayload {\n id: string;\n exp: number;\n contact: string;\n public_key?: string;\n verification_type: string;\n organization_id?: string;\n}\n\nfunction decodeJwtPayload(jwt: string): JwtPayload {\n const parts = jwt.split(\".\");\n if (parts.length !== 3) throw new Error(\"Invalid JWT\");\n const payloadB64 = parts[1]!.replace(/-/g, \"+\").replace(/_/g, \"/\");\n return JSON.parse(Buffer.from(payloadB64, \"base64\").toString(\"utf-8\"));\n}\n\n// ── Auth Proxy ───────────────────────────────────────────────────\n\nasync function proxyRequest<T>(path: string, body: unknown, configId: string): Promise<T> {\n if (!configId) throw new Error(\"TURNKEY_AUTH_PROXY_CONFIG_ID not configured.\");\n\n const res = await fetch(`${AUTH_PROXY_BASE}${path}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Auth-Proxy-Config-ID\": configId,\n },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n let detail = text;\n try { detail = JSON.parse(text).message ?? text; } catch { /* ignore */ }\n throw new Error(`Turnkey auth proxy error (${res.status}): ${detail}`);\n }\n\n return res.json() as Promise<T>;\n}\n\nexport async function otpInit(email: string, configId: string): Promise<{ otpId: string }> {\n return proxyRequest(\"/v1/otp_init\", { otpType: \"OTP_TYPE_EMAIL\", contact: email }, configId);\n}\n\nexport async function otpVerify(\n otpId: string, otpCode: string, publicKeyHex: string, configId: string,\n): Promise<{ verificationToken: string }> {\n return proxyRequest(\"/v1/otp_verify\", { otpId, otpCode, publicKey: publicKeyHex }, configId);\n}\n\nexport async function checkAccount(\n email: string, configId: string, verificationToken?: string,\n): Promise<{ exists: boolean; organizationId?: string }> {\n try {\n const result = await proxyRequest<{ organizationId: string }>(\n \"/v1/account\",\n { filterType: \"EMAIL\", filterValue: email, ...(verificationToken && { verificationToken }) },\n configId,\n );\n return { exists: !!result.organizationId, organizationId: result.organizationId };\n } catch {\n return { exists: false };\n }\n}\n\nexport async function signup(\n email: string, configId: string, verificationToken: string,\n publicKeyHex: string, privateKeyDer: string,\n): Promise<{ organizationId: string }> {\n const decoded = decodeJwtPayload(verificationToken);\n const verificationPublicKey = decoded.public_key ?? publicKeyHex;\n\n const signupBody = {\n userName: `chainstream-personal-${email.split(\"@\")[0]}`,\n organizationName: `chainstream-personal-${email}`,\n userEmail: email,\n verificationToken,\n apiKeys: [] as unknown[],\n authenticators: [] as unknown[],\n oauthProviders: [] as unknown[],\n wallet: {\n walletName: \"ChainStream Wallet\",\n accounts: [\n { curve: \"CURVE_SECP256K1\", pathFormat: \"PATH_FORMAT_BIP32\", path: \"m/44'/60'/0'/0/0\", addressFormat: \"ADDRESS_FORMAT_ETHEREUM\" },\n { curve: \"CURVE_ED25519\", pathFormat: \"PATH_FORMAT_BIP32\", path: \"m/44'/501'/0'/0'\", addressFormat: \"ADDRESS_FORMAT_SOLANA\" },\n ],\n },\n };\n\n const signatureMessage = JSON.stringify({\n signup: { email, apiKeys: signupBody.apiKeys, authenticators: signupBody.authenticators, oauthProviders: signupBody.oauthProviders },\n tokenId: decoded.id,\n type: \"USAGE_TYPE_SIGNUP\",\n });\n\n const signature = signRawP256(signatureMessage, privateKeyDer);\n\n return proxyRequest(\"/v1/signup\", {\n ...signupBody,\n clientSignature: {\n message: signatureMessage,\n publicKey: verificationPublicKey,\n scheme: \"CLIENT_SIGNATURE_SCHEME_API_P256\",\n signature,\n },\n }, configId);\n}\n\nexport async function otpLogin(\n verificationToken: string, publicKeyHex: string, privateKeyDerBase64: string, configId: string,\n): Promise<{ session: string }> {\n const decoded = decodeJwtPayload(verificationToken);\n const tokenUsageMessage = JSON.stringify({\n login: { publicKey: publicKeyHex },\n tokenId: decoded.id,\n type: \"USAGE_TYPE_LOGIN\",\n });\n const signature = signRawP256(tokenUsageMessage, privateKeyDerBase64);\n\n return proxyRequest(\"/v1/otp_login\", {\n verificationToken,\n publicKey: publicKeyHex,\n clientSignature: {\n message: tokenUsageMessage,\n publicKey: decoded.public_key ?? publicKeyHex,\n scheme: \"CLIENT_SIGNATURE_SCHEME_API_P256\",\n signature,\n },\n }, configId);\n}\n\nexport interface CompleteLoginResult {\n session: string;\n keyPair: P256KeyPair;\n organizationId: string;\n sessionExpiry: number;\n isNewUser: boolean;\n}\n\nexport async function completeLogin(\n otpId: string, otpCode: string, configId: string, email: string,\n): Promise<CompleteLoginResult> {\n const keyPair = generateP256KeyPair();\n const { verificationToken } = await otpVerify(otpId, otpCode, keyPair.publicKeyHex, configId);\n const account = await checkAccount(email, configId, verificationToken);\n\n let isNewUser = false;\n if (!account.exists) {\n await signup(email, configId, verificationToken, keyPair.publicKeyHex, keyPair.privateKeyDer);\n isNewUser = true;\n }\n\n const { session } = await otpLogin(verificationToken, keyPair.publicKeyHex, keyPair.privateKeyDer, configId);\n const sessionPayload = decodeJwtPayload(session);\n\n return {\n session,\n keyPair,\n organizationId: sessionPayload.organization_id ?? \"\",\n sessionExpiry: sessionPayload.exp,\n isNewUser,\n };\n}\n\n// ── Turnkey Coordinator API ──────────────────────────────────────\n\nexport function createApiStamp(body: string, publicKeyHex: string, privateKeyDerBase64: string): string {\n const signer = createSign(\"SHA256\");\n signer.update(body);\n signer.end();\n\n const signature = signer.sign({\n key: Buffer.from(privateKeyDerBase64, \"base64\"),\n format: \"der\",\n type: \"pkcs8\",\n });\n\n const stamp = JSON.stringify({\n publicKey: publicKeyHex,\n scheme: \"SIGNATURE_SCHEME_TK_API_P256\",\n signature: signature.toString(\"hex\"),\n });\n\n return Buffer.from(stamp).toString(\"base64\").replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\nexport async function turnkeyRequest<T>(\n path: string, body: Record<string, unknown>, creds: TurnkeyCredentials,\n): Promise<T> {\n const bodyStr = JSON.stringify(body);\n const stamp = createApiStamp(bodyStr, creds.publicKeyHex, creds.privateKeyDer);\n\n const res = await fetch(`${TURNKEY_API_BASE}${path}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-Stamp\": stamp },\n body: bodyStr,\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Turnkey API error (${res.status}): ${text}`);\n }\n\n return res.json() as Promise<T>;\n}\n\nexport async function refreshTurnkeySession(\n publicKeyHex: string, privateKeyDer: string, organizationId: string, expirationSeconds = 900,\n): Promise<{ session: string; expiry: number }> {\n const newKeyPair = generateP256KeyPair();\n\n const body = JSON.stringify({\n type: \"ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2\",\n timestampMs: Date.now().toString(),\n organizationId,\n parameters: {\n targetPublicKey: newKeyPair.uncompressedPublicKeyHex,\n expirationSeconds: String(expirationSeconds),\n },\n });\n\n const stampHeader = createApiStamp(body, publicKeyHex, privateKeyDer);\n\n const res = await fetch(`${TURNKEY_API_BASE}/public/v1/submit/create_read_write_session`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-Stamp\": stampHeader },\n body,\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Turnkey session refresh failed (${res.status}): ${text}`);\n }\n\n const data = await res.json() as {\n activity: { result?: { createReadWriteSessionResultV2?: { session?: string } } };\n };\n\n const session = data.activity?.result?.createReadWriteSessionResultV2?.session;\n if (!session) throw new Error(\"Turnkey session refresh: no session in response\");\n\n const payload = decodeJwtPayload(session);\n return { session, expiry: payload.exp };\n}\n\n// ── Wallet Discovery ─────────────────────────────────────────────\n\ninterface TurnkeyWalletAccount {\n address: string;\n addressFormat: string;\n}\n\nexport async function listWalletAccounts(creds: TurnkeyCredentials): Promise<TurnkeyWalletAccount[]> {\n const walletsData = await turnkeyRequest<{ wallets: Array<{ walletId: string }> }>(\n \"/public/v1/query/list_wallets\",\n { organizationId: creds.organizationId },\n creds,\n );\n\n const allAccounts: TurnkeyWalletAccount[] = [];\n for (const wallet of walletsData.wallets ?? []) {\n const accountsData = await turnkeyRequest<{ accounts: TurnkeyWalletAccount[] }>(\n \"/public/v1/query/list_wallet_accounts\",\n { organizationId: creds.organizationId, walletId: wallet.walletId, paginationOptions: { limit: \"100\" } },\n creds,\n );\n for (const acct of accountsData.accounts ?? []) {\n allAccounts.push(acct);\n }\n }\n return allAccounts;\n}\n\nexport async function getEvmAddress(creds: TurnkeyCredentials): Promise<string> {\n const accounts = await listWalletAccounts(creds);\n const evm = accounts.find(a => a.addressFormat === \"ADDRESS_FORMAT_ETHEREUM\");\n if (!evm) throw new Error(\"No EVM wallet found in Turnkey.\");\n return evm.address;\n}\n\nexport async function getSolanaAddress(creds: TurnkeyCredentials): Promise<string> {\n const accounts = await listWalletAccounts(creds);\n const sol = accounts.find(a => a.addressFormat === \"ADDRESS_FORMAT_SOLANA\");\n if (!sol) throw new Error(\"No Solana wallet found in Turnkey.\");\n return sol.address;\n}\n","import type { Wallet } from \"./types.js\";\nimport type { TurnkeyCredentials } from \"../lib/config.js\";\nimport { turnkeyRequest, getEvmAddress, getSolanaAddress } from \"../lib/turnkey.js\";\n\n/**\n * Turnkey TEE wallet — signs via Turnkey Coordinator API.\n * Private keys never leave the AWS Nitro Enclave.\n *\n * Adapted from openant-cli/src/lib/solana-signer.ts + evm-signer.ts.\n */\nexport class TurnkeyWallet implements Wallet {\n chain: \"evm\" | \"solana\";\n address: string;\n private creds: TurnkeyCredentials;\n\n constructor(creds: TurnkeyCredentials, chain: \"evm\" | \"solana\", address: string) {\n this.creds = creds;\n this.chain = chain;\n this.address = address;\n }\n\n static async create(creds: TurnkeyCredentials): Promise<{ evm: TurnkeyWallet; solana: TurnkeyWallet }> {\n const [evmAddr, solAddr] = await Promise.all([\n getEvmAddress(creds),\n getSolanaAddress(creds),\n ]);\n return {\n evm: new TurnkeyWallet(creds, \"evm\", evmAddr),\n solana: new TurnkeyWallet(creds, \"solana\", solAddr),\n };\n }\n\n async signMessage(message: string): Promise<string> {\n const payloadHex = Buffer.from(message, \"utf-8\").toString(\"hex\");\n\n const result = await turnkeyRequest<{\n activity: { result?: { signRawPayloadResult?: { r: string; s: string } } };\n }>(\n \"/public/v1/submit/sign_raw_payload\",\n {\n type: \"ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2\",\n timestampMs: Date.now().toString(),\n organizationId: this.creds.organizationId,\n parameters: {\n signWith: this.address,\n payload: payloadHex,\n encoding: \"PAYLOAD_ENCODING_HEXADECIMAL\",\n hashFunction: this.chain === \"evm\"\n ? \"HASH_FUNCTION_KECCAK256\"\n : \"HASH_FUNCTION_NOT_APPLICABLE\",\n },\n },\n this.creds,\n );\n\n const sigResult = result.activity?.result?.signRawPayloadResult;\n if (!sigResult) throw new Error(\"Turnkey signMessage: no signature in response\");\n\n if (this.chain === \"evm\") {\n return `0x${sigResult.r}${sigResult.s}`;\n }\n return `${sigResult.r}${sigResult.s}`;\n }\n\n async signTransaction(serializedTx: string): Promise<string> {\n const txBytes = Buffer.from(serializedTx, \"base64\");\n const unsignedHex = txBytes.toString(\"hex\");\n\n const txType = this.chain === \"evm\"\n ? \"TRANSACTION_TYPE_ETHEREUM\"\n : \"TRANSACTION_TYPE_SOLANA\";\n\n const result = await turnkeyRequest<{\n activity: { result?: { signTransactionResult?: { signedTransaction: string } } };\n }>(\n \"/public/v1/submit/sign_transaction\",\n {\n type: \"ACTIVITY_TYPE_SIGN_TRANSACTION_V2\",\n timestampMs: Date.now().toString(),\n organizationId: this.creds.organizationId,\n parameters: {\n signWith: this.address,\n unsignedTransaction: unsignedHex,\n type: txType,\n },\n },\n this.creds,\n );\n\n const signedHex = result.activity?.result?.signTransactionResult?.signedTransaction;\n if (!signedHex) throw new Error(\"Turnkey signTransaction: no signed tx in response\");\n\n return Buffer.from(signedHex, \"hex\").toString(\"base64\");\n }\n}\n","import type { Config, WalletMode } from \"../lib/config.js\";\nimport type { Wallet } from \"./types.js\";\nimport { RawKeyWallet } from \"./raw-wallet.js\";\nimport { TurnkeyWallet } from \"./turnkey-wallet.js\";\n\nexport function createWallet(config: Config, mode: WalletMode): Wallet {\n if (mode === \"raw\" && config.rawWallet) {\n return new RawKeyWallet(config.rawWallet.key, config.rawWallet.chain);\n }\n\n if (mode === \"turnkey\" && config.turnkey) {\n // Turnkey wallet addresses are resolved lazily on first signMessage/signTransaction call.\n // For API auth (X-Wallet-* headers), the SDK calls signMessage which triggers address resolution.\n // The default chain for API auth is \"evm\" — DeFi commands override per-operation.\n return new TurnkeyWallet(config.turnkey, \"evm\", \"\");\n }\n\n throw new Error(\n \"No wallet configured. Run:\\n\" +\n \" chainstream login # Create Turnkey wallet\\n\" +\n \" chainstream wallet set-raw # Use raw private key (dev)\",\n );\n}\n\n/**\n * Create wallet with resolved addresses (async, used when address is needed immediately).\n */\nexport async function createWalletWithAddresses(config: Config, mode: WalletMode): Promise<{\n evm?: Wallet;\n solana?: Wallet;\n}> {\n if (mode === \"raw\" && config.rawWallet) {\n const w = new RawKeyWallet(config.rawWallet.key, config.rawWallet.chain);\n return config.rawWallet.chain === \"evm\" ? { evm: w } : { solana: w };\n }\n\n if (mode === \"turnkey\" && config.turnkey) {\n const wallets = await TurnkeyWallet.create(config.turnkey);\n return { evm: wallets.evm, solana: wallets.solana };\n }\n\n throw new Error(\"No wallet configured.\");\n}\n\nexport type { Wallet } from \"./types.js\";\n","/**\n * x402 transparent payment — auto-handles 402 responses.\n *\n * Industry standard (Alchemy, Coinbase, x402-agent-pay):\n * - Agent calls API → gets 402 → @x402/fetch auto-pays → retries → success\n * - Agent never sees the 402 — payment is completely transparent\n */\n\nimport { x402Client } from \"@x402/core/client\";\nimport { wrapFetchWithPayment } from \"@x402/fetch\";\nimport { ExactEvmScheme } from \"@x402/evm/exact/client\";\nimport { ExactSvmScheme } from \"@x402/svm/exact/client\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport type { Hex } from \"viem\";\nimport type { Config } from \"./config.js\";\n\nlet _x402Fetch: typeof fetch | null = null;\n\n/**\n * Get a fetch function wrapped with x402 auto-payment.\n * Creates the x402 signer directly from the raw private key (not our Wallet wrapper),\n * because @x402/evm needs viem's Account interface (signTypedData, etc).\n */\nexport function getX402Fetch(config: Config): typeof fetch {\n if (_x402Fetch) return _x402Fetch;\n\n const client = new x402Client();\n\n if (config.rawWallet?.chain === \"evm\") {\n const hex = (config.rawWallet.key.startsWith(\"0x\") ? config.rawWallet.key : `0x${config.rawWallet.key}`) as Hex;\n const account = privateKeyToAccount(hex);\n client.register(\"eip155:*\", new ExactEvmScheme(account));\n } else if (config.rawWallet?.chain === \"solana\") {\n // Solana x402 needs @solana/kit signer — Phase 4 Turnkey\n // For now, only EVM is supported for auto-purchase\n process.stderr.write(\"[chainstream] Auto-purchase only supports EVM wallets currently.\\n\");\n }\n\n // Turnkey wallets: Phase 4 — need to create viem-compatible signer from Turnkey\n\n _x402Fetch = wrapFetchWithPayment(fetch, client);\n return _x402Fetch;\n}\n\n/**\n * Auto-purchase quota when API returns 402.\n * Uses @x402/fetch to transparently handle the x402 payment protocol.\n */\nexport async function autoPurchaseOnDemand(\n config: Config,\n plan = \"nano\",\n): Promise<{ success: boolean; plan?: string; expiresAt?: string }> {\n const x402Fetch = getX402Fetch(config);\n\n process.stderr.write(`[chainstream] No active subscription. Auto-purchasing ${plan} plan...\\n`);\n\n try {\n const resp = await x402Fetch(`${config.baseUrl}/x402/purchase?plan=${encodeURIComponent(plan)}`);\n\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n process.stderr.write(`[chainstream] Purchase failed (${resp.status}): ${text}\\n`);\n return { success: false };\n }\n\n const result = await resp.json() as Record<string, unknown>;\n process.stderr.write(`[chainstream] Subscription activated: ${result.plan} (expires: ${result.expires_at})\\n`);\n\n return {\n success: true,\n plan: result.plan as string,\n expiresAt: result.expires_at as string,\n };\n } catch (err) {\n process.stderr.write(`[chainstream] Auto-purchase error: ${err instanceof Error ? err.message : err}\\n`);\n return { success: false };\n }\n}\n\n/**\n * Get available pricing plans (no auth required).\n */\nexport async function getPricing(baseUrl: string): Promise<unknown> {\n const resp = await fetch(`${baseUrl}/x402/pricing`);\n if (!resp.ok) throw new Error(`Failed to get pricing (${resp.status})`);\n return resp.json();\n}\n","import { Command } from \"commander\";\nimport { registerTokenCommands } from \"./commands/token.js\";\nimport { registerMarketCommands } from \"./commands/market.js\";\nimport { registerWalletCommands } from \"./commands/wallet.js\";\nimport { registerKytCommands } from \"./commands/kyt.js\";\nimport { registerDexCommands } from \"./commands/dex.js\";\nimport { registerJobCommands } from \"./commands/job.js\";\nimport { registerAuthCommands } from \"./commands/auth.js\";\nimport { registerConfigCommands } from \"./commands/config-cmd.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"chainstream\")\n .version(\"0.1.0\")\n .description(\"ChainStream CLI — on-chain data and DeFi execution for AI agents\");\n\nregisterTokenCommands(program);\nregisterMarketCommands(program);\nregisterWalletCommands(program);\nregisterKytCommands(program);\nregisterDexCommands(program);\nregisterJobCommands(program);\nregisterAuthCommands(program);\nregisterConfigCommands(program);\n\nprogram.parseAsync().catch((err: Error) => {\n process.stderr.write(`[chainstream] ${err.message}\\n`);\n process.exit(1);\n});\n","import { ChainStreamClient } from \"@chainstream-io/sdk\";\nimport { loadConfig, getWalletMode } from \"./config.js\";\nimport { createWallet } from \"../wallet/index.js\";\nimport { autoPurchaseOnDemand } from \"./x402.js\";\nimport type { Wallet } from \"../wallet/types.js\";\n\nlet _client: ChainStreamClient | null = null;\nlet _wallet: Wallet | null = null;\n\nexport function createClient(): ChainStreamClient {\n if (_client) return _client;\n\n const config = loadConfig();\n const walletMode = getWalletMode(config);\n\n if (walletMode) {\n _wallet = createWallet(config, walletMode);\n _client = new ChainStreamClient(\"\", {\n serverUrl: config.baseUrl,\n walletSigner: _wallet,\n } as never);\n return _client;\n }\n\n if (config.apiKey) {\n _client = new ChainStreamClient(\"\", {\n serverUrl: config.baseUrl,\n apiKey: config.apiKey,\n });\n return _client;\n }\n\n throw new Error(\n \"Not authenticated. Run one of:\\n\" +\n \" chainstream login # Email OTP (creates Turnkey wallet)\\n\" +\n \" chainstream login --key # P-256 key (no email)\\n\" +\n \" chainstream wallet set-raw # Raw private key (dev)\\n\" +\n \" chainstream config set --key apiKey --value <key> # API key only\",\n );\n}\n\nexport function requireWallet(): ChainStreamClient {\n const config = loadConfig();\n const walletMode = getWalletMode(config);\n if (!walletMode) {\n throw new Error(\n \"Wallet required for this operation. Run:\\n\" +\n \" chainstream login # Create Turnkey wallet\\n\" +\n \" chainstream wallet set-raw # Dev: use raw private key\",\n );\n }\n return createClient();\n}\n\n/**\n * Execute an SDK call with automatic 402 → x402 purchase → retry.\n *\n * This is the transparent payment layer:\n * 1. Call the SDK method\n * 2. If 402: auto-purchase quota via x402 protocol\n * 3. Retry the original call\n * 4. Agent never sees the 402\n */\nexport async function callWithAutoPayment<T>(\n fn: () => Promise<T>,\n retried = false,\n): Promise<T> {\n try {\n return await fn();\n } catch (err: unknown) {\n const is402 = isPaymentRequired(err);\n\n if (is402 && !retried && _wallet) {\n const config = loadConfig();\n const result = await autoPurchaseOnDemand(config);\n\n if (result.success) {\n // Reset SDK client to pick up new subscription\n _client = null;\n createClient();\n return callWithAutoPayment(fn, true);\n }\n }\n\n throw err;\n }\n}\n\nfunction isPaymentRequired(err: unknown): boolean {\n if (!err || typeof err !== \"object\") return false;\n\n // Axios error with response.status === 402\n const axiosErr = err as { response?: { status?: number }; status?: number; message?: string };\n if (axiosErr.response?.status === 402) return true;\n if (axiosErr.status === 402) return true;\n if (axiosErr.message?.includes(\"402\")) return true;\n if (axiosErr.message?.includes(\"PAYMENT_REQUIRED\")) return true;\n\n return false;\n}\n","const VALID_CHAINS = new Set([\"sol\", \"bsc\", \"eth\"]);\nconst SOL_ADDRESS_RE = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;\nconst EVM_ADDRESS_RE = /^0x[0-9a-fA-F]{40}$/;\n\nconst CURRENCY_MAP: Record<string, Record<string, string>> = {\n sol: {\n SOL: \"So11111111111111111111111111111111111111112\",\n USDC: \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n },\n bsc: {\n BNB: \"0x0000000000000000000000000000000000000000\",\n USDC: \"0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d\",\n },\n eth: {\n ETH: \"0x0000000000000000000000000000000000000000\",\n USDC: \"0xA0b86991c6218b36c1d19d4a2e9eb0ce3606eB48\",\n },\n};\n\nexport function validateChain(chain: string): asserts chain is string {\n if (!VALID_CHAINS.has(chain)) {\n throw new Error(`Invalid chain \"${chain}\". Must be one of: ${[...VALID_CHAINS].join(\", \")}`);\n }\n}\n\nexport function validateAddress(address: string, chain: string): void {\n const isEvm = chain === \"bsc\" || chain === \"eth\";\n const valid = isEvm ? EVM_ADDRESS_RE.test(address) : SOL_ADDRESS_RE.test(address);\n if (!valid) {\n throw new Error(`Invalid address for chain \"${chain}\": \"${address}\"`);\n }\n}\n\nexport function validatePositiveNumber(value: string, label: string): void {\n const n = Number(value);\n if (!Number.isFinite(n) || n <= 0) {\n throw new Error(`Invalid ${label}: \"${value}\". Must be a positive number.`);\n }\n}\n\nexport function validateSlippage(value: number): void {\n if (value < 0.001 || value > 0.5) {\n throw new Error(`Invalid slippage: ${value}. Must be between 0.001 (0.1%) and 0.5 (50%).`);\n }\n}\n\nexport function resolveCurrency(nameOrAddress: string, chain: string): string {\n const upper = nameOrAddress.toUpperCase();\n const resolved = CURRENCY_MAP[chain]?.[upper];\n if (resolved) return resolved;\n return nameOrAddress;\n}\n","const EXPLORERS: Record<string, string> = {\n sol: \"https://solscan.io/tx/\",\n bsc: \"https://bscscan.com/tx/\",\n eth: \"https://etherscan.io/tx/\",\n};\n\nexport function printResult(data: unknown, raw?: boolean): void {\n if (raw) {\n process.stdout.write(JSON.stringify(data) + \"\\n\");\n } else {\n process.stdout.write(JSON.stringify(data, null, 2) + \"\\n\");\n }\n}\n\nexport function printError(message: string): void {\n process.stderr.write(`[chainstream] Error: ${message}\\n`);\n}\n\nexport function exitOnError(err: unknown): never {\n const message = err instanceof Error ? err.message : String(err);\n printError(message);\n if (process.env.CHAINSTREAM_DEBUG && err instanceof Error && err.stack) {\n process.stderr.write(err.stack + \"\\n\");\n }\n process.exit(1);\n}\n\nexport function explorerUrl(chain: string, txHash: string): string {\n const base = EXPLORERS[chain] ?? EXPLORERS[\"eth\"];\n return `${base}${txHash}`;\n}\n","import { Command } from \"commander\";\nimport { createClient, callWithAutoPayment } from \"../lib/client.js\";\nimport { validateChain, validateAddress } from \"../lib/validate.js\";\nimport { printResult, exitOnError } from \"../lib/output.js\";\n\nexport function registerTokenCommands(program: Command): void {\n const token = program.command(\"token\").description(\"Token information and analytics\");\n\n token\n .command(\"search\")\n .description(\"Search tokens by keyword\")\n .requiredOption(\"--keyword <keyword>\", \"Search keyword (name, symbol, or address)\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .option(\"--limit <n>\", \"Max results\", \"20\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.token.search({ q: opts.keyword, chains: [opts.chain], limit: Number(opts.limit) }),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n token\n .command(\"info\")\n .description(\"Get full token detail\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Token contract address\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.token.getToken(opts.chain, opts.address),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n token\n .command(\"security\")\n .description(\"Check token security (honeypot, mint auth, freeze auth)\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Token contract address\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.token.getSecurity(opts.chain, opts.address),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n token\n .command(\"holders\")\n .description(\"Get top token holders\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Token contract address\")\n .option(\"--limit <n>\", \"Max results\", \"20\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.token.getTopHolders(opts.chain, opts.address, { limit: Number(opts.limit) } as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n token\n .command(\"candles\")\n .description(\"Get OHLCV candlestick data\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Token contract address\")\n .requiredOption(\"--resolution <res>\", \"Resolution: 1m/5m/15m/1h/4h/1d\")\n .option(\"--from <timestamp>\", \"Start time (Unix seconds)\")\n .option(\"--to <timestamp>\", \"End time (Unix seconds)\")\n .option(\"--limit <n>\", \"Max candles\", \"100\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const params: Record<string, unknown> = {\n resolution: opts.resolution,\n limit: Number(opts.limit),\n };\n if (opts.from) params.from = Number(opts.from);\n if (opts.to) params.to = Number(opts.to);\n const result = await callWithAutoPayment(() =>\n client.token.getCandles(opts.chain, opts.address, params as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n token\n .command(\"pools\")\n .description(\"Get liquidity pools for a token\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Token contract address\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.token.getPools(opts.chain, opts.address),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { createClient, callWithAutoPayment } from \"../lib/client.js\";\nimport { validateChain } from \"../lib/validate.js\";\nimport { printResult, exitOnError } from \"../lib/output.js\";\n\nexport function registerMarketCommands(program: Command): void {\n const market = program.command(\"market\").description(\"Market data and trending tokens\");\n\n market\n .command(\"trending\")\n .description(\"Get hot/trending tokens\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--duration <dur>\", \"Duration: 1h/6h/24h\")\n .option(\"--limit <n>\", \"Max results\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const client = createClient();\n const params: Record<string, unknown> = {};\n if (opts.limit) params.limit = Number(opts.limit);\n const result = await callWithAutoPayment(() =>\n client.ranking.getHotTokens(opts.chain, opts.duration, params as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n market\n .command(\"new\")\n .description(\"Get newly created tokens\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .option(\"--limit <n>\", \"Max results\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const client = createClient();\n const params: Record<string, unknown> = {};\n if (opts.limit) params.limit = Number(opts.limit);\n const result = await callWithAutoPayment(() =>\n client.ranking.getNewTokens(opts.chain, params as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n market\n .command(\"trades\")\n .description(\"Get recent trades\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .option(\"--token <address>\", \"Filter by token address\")\n .option(\"--limit <n>\", \"Max results\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const client = createClient();\n const params: Record<string, unknown> = {};\n if (opts.token) params.tokenAddress = opts.token;\n if (opts.limit) params.limit = Number(opts.limit);\n const result = await callWithAutoPayment(() =>\n client.trade.getTrades(opts.chain, params as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { createClient, callWithAutoPayment } from \"../lib/client.js\";\nimport { validateChain, validateAddress } from \"../lib/validate.js\";\nimport { printResult, exitOnError } from \"../lib/output.js\";\nimport { loadConfig, updateConfig } from \"../lib/config.js\";\nimport * as readline from \"node:readline/promises\";\n\nexport function registerWalletCommands(program: Command): void {\n const wallet = program.command(\"wallet\").description(\"Wallet analytics and management\");\n\n wallet\n .command(\"profile\")\n .description(\"Wallet profile: PnL + net worth + top holdings\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Wallet address\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const [pnl, netWorth, balance] = await callWithAutoPayment(() =>\n Promise.all([\n client.wallet.getPnl(opts.chain, opts.address),\n client.wallet.getNetWorth(opts.chain, opts.address),\n client.wallet.getTokensBalance(opts.chain, opts.address),\n ]),\n );\n printResult({ pnl, netWorth, balance }, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"pnl\")\n .description(\"Get wallet PnL details\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Wallet address\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.wallet.getPnl(opts.chain, opts.address),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"holdings\")\n .description(\"Get wallet token balances\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Wallet address\")\n .option(\"--limit <n>\", \"Max results\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const params: Record<string, unknown> = {};\n if (opts.limit) params.limit = Number(opts.limit);\n const result = await callWithAutoPayment(() =>\n client.wallet.getTokensBalance(opts.chain, opts.address, params as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"activity\")\n .description(\"Get wallet transfer history\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Wallet address\")\n .option(\"--limit <n>\", \"Max results\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const params: Record<string, unknown> = {};\n if (opts.limit) params.limit = Number(opts.limit);\n const result = await callWithAutoPayment(() =>\n client.wallet.getWalletTransfers(opts.chain, opts.address, params as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"address\")\n .description(\"Show current wallet addresses\")\n .action(async () => {\n try {\n const config = loadConfig();\n const walletMode = (await import(\"../lib/config.js\")).getWalletMode(config);\n if (walletMode === \"turnkey\" && config.turnkey) {\n const { createWalletWithAddresses } = await import(\"../wallet/index.js\");\n const wallets = await createWalletWithAddresses(config, \"turnkey\");\n if (wallets.evm) process.stdout.write(`EVM: ${wallets.evm.address}\\n`);\n if (wallets.solana) process.stdout.write(`Solana: ${wallets.solana.address}\\n`);\n } else if (config.rawWallet) {\n const { createWallet } = await import(\"../wallet/index.js\");\n const w = createWallet(config, \"raw\");\n process.stdout.write(`${w.chain.toUpperCase()}: ${w.address}\\n`);\n } else {\n process.stdout.write(\"No wallet configured. Run: chainstream login\\n\");\n }\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"balance\")\n .description(\"Show current wallet balance\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const config = loadConfig();\n let address: string | undefined;\n if (config.rawWallet) {\n const { createWallet } = await import(\"../wallet/index.js\");\n address = createWallet(config, \"raw\").address;\n }\n // Phase 4: Turnkey address resolution\n if (!address) throw new Error(\"No wallet configured. Run: chainstream login\");\n\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.wallet.getTokensBalance(opts.chain, address),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"set-raw\")\n .description(\"Set raw private key (dev/testing only)\")\n .requiredOption(\"--chain <chain>\", \"Chain: evm/solana\")\n .action(async (opts) => {\n try {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n process.stdout.write(\"⚠ WARNING: Raw private key will be stored in plaintext.\\n\");\n process.stdout.write(\" Use Turnkey (chainstream login) for production.\\n\\n\");\n const key = await rl.question(\"Enter private key: \");\n rl.close();\n\n if (!key.trim()) throw new Error(\"Empty key provided.\");\n\n updateConfig({\n rawWallet: { key: key.trim(), chain: opts.chain },\n });\n process.stdout.write(`Raw wallet set (${opts.chain}). Run 'chainstream wallet address' to verify.\\n`);\n } catch (err) { exitOnError(err); }\n });\n\n wallet\n .command(\"pricing\")\n .description(\"Show available x402 quota plans\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n const config = loadConfig();\n const { getPricing } = await import(\"../lib/x402.js\");\n const plans = await getPricing(config.baseUrl);\n printResult(plans, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { createClient, callWithAutoPayment } from \"../lib/client.js\";\nimport { validateChain, validateAddress } from \"../lib/validate.js\";\nimport { printResult, exitOnError } from \"../lib/output.js\";\n\nexport function registerKytCommands(program: Command): void {\n const kyt = program.command(\"kyt\").description(\"KYT address risk assessment\");\n\n kyt\n .command(\"risk\")\n .description(\"Assess address risk score\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--address <address>\", \"Address to assess\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.address, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.kyt.getAddressRisk(opts.address),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { createClient, requireWallet, callWithAutoPayment } from \"../lib/client.js\";\nimport { validateChain, validateAddress, validateSlippage, resolveCurrency } from \"../lib/validate.js\";\nimport { printResult, exitOnError, explorerUrl } from \"../lib/output.js\";\nimport * as readline from \"node:readline/promises\";\n\nexport function registerDexCommands(program: Command): void {\n const dex = program.command(\"dex\").description(\"DEX swap, quote, and token creation\");\n\n dex\n .command(\"quote\")\n .description(\"Get swap quote (read-only)\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--input-token <addr>\", \"Input token (address or SOL/ETH/BNB/USDC)\")\n .requiredOption(\"--output-token <addr>\", \"Output token (address or SOL/ETH/BNB/USDC)\")\n .requiredOption(\"--amount <amount>\", \"Input amount (smallest unit)\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const inputToken = resolveCurrency(opts.inputToken, opts.chain);\n const outputToken = resolveCurrency(opts.outputToken, opts.chain);\n const client = createClient();\n const result = await callWithAutoPayment(() =>\n client.dex.quote(opts.chain, {\n inputMint: inputToken,\n outputMint: outputToken,\n amount: opts.amount,\n } as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n\n dex\n .command(\"swap\")\n .description(\"[FINANCIAL] Execute token swap (irreversible)\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--from <address>\", \"Sender wallet address\")\n .requiredOption(\"--input-token <addr>\", \"Input token (address or SOL/ETH/BNB/USDC)\")\n .requiredOption(\"--output-token <addr>\", \"Output token (address or SOL/ETH/BNB/USDC)\")\n .requiredOption(\"--amount <amount>\", \"Input amount (smallest unit)\")\n .option(\"--slippage <n>\", \"Slippage tolerance (e.g. 0.01 = 1%)\", \"0.01\")\n .option(\"--raw\", \"Single-line JSON output\")\n .option(\"--yes\", \"Skip confirmation prompt\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n validateAddress(opts.from, opts.chain);\n if (opts.slippage) validateSlippage(Number(opts.slippage));\n\n const inputToken = resolveCurrency(opts.inputToken, opts.chain);\n const outputToken = resolveCurrency(opts.outputToken, opts.chain);\n const client = requireWallet();\n\n // Phase 1: Quote\n process.stderr.write(\"Fetching quote...\\n\");\n const quote = await callWithAutoPayment(() =>\n client.dex.quote(opts.chain, {\n inputMint: inputToken,\n outputMint: outputToken,\n amount: opts.amount,\n } as never),\n );\n\n // Phase 2: Confirm\n process.stderr.write(\"\\n--- Swap Summary ---\\n\");\n process.stderr.write(`Chain: ${opts.chain}\\n`);\n process.stderr.write(`Input: ${inputToken}\\n`);\n process.stderr.write(`Output: ${outputToken}\\n`);\n process.stderr.write(`Amount: ${opts.amount}\\n`);\n process.stderr.write(`Slippage: ${opts.slippage}\\n`);\n process.stderr.write(`Quote: ${JSON.stringify(quote)}\\n`);\n process.stderr.write(\"--------------------\\n\\n\");\n\n if (!opts.yes) {\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n const answer = await rl.question(\"Confirm swap? (y/N): \");\n rl.close();\n if (answer.toLowerCase() !== \"y\") {\n process.stderr.write(\"Swap cancelled.\\n\");\n return;\n }\n }\n\n // Phase 3: Build + Sign\n process.stderr.write(\"Building transaction...\\n\");\n const swapResult = await callWithAutoPayment(() =>\n client.dex.swap(opts.chain, {\n userAddress: opts.from,\n inputMint: inputToken,\n outputMint: outputToken,\n amount: opts.amount,\n slippage: Number(opts.slippage),\n } as never),\n ) as { serializedTx: string };\n\n const { createWallet } = await import(\"../wallet/index.js\");\n const { loadConfig, getWalletMode } = await import(\"../lib/config.js\");\n const config = loadConfig();\n const walletMode = getWalletMode(config);\n if (!walletMode) throw new Error(\"Wallet required for swap.\");\n\n const wallet = createWallet(config, walletMode);\n process.stderr.write(\"Signing transaction...\\n\");\n const signedTx = await wallet.signTransaction(swapResult.serializedTx);\n\n // Phase 4: Broadcast + Poll\n process.stderr.write(\"Broadcasting transaction...\\n\");\n const sendResult = await client.transaction.send(opts.chain as never, {\n signedTx,\n } as never) as { signature?: string; jobId?: string };\n\n if (sendResult.jobId) {\n process.stderr.write(`Job ${sendResult.jobId} submitted. Waiting for confirmation...\\n`);\n const jobResult = await client.waitForJob(sendResult.jobId);\n const result = {\n ...jobResult as Record<string, unknown>,\n explorer: explorerUrl(opts.chain, (sendResult.signature ?? (jobResult as Record<string, unknown>).hash as string) || \"\"),\n };\n printResult(result, opts.raw);\n } else {\n const result = {\n ...sendResult,\n explorer: explorerUrl(opts.chain, sendResult.signature ?? \"\"),\n };\n printResult(result, opts.raw);\n }\n } catch (err) { exitOnError(err); }\n });\n\n dex\n .command(\"create\")\n .description(\"[FINANCIAL] Create token on launchpad\")\n .requiredOption(\"--chain <chain>\", \"Chain: sol/bsc/eth\")\n .requiredOption(\"--name <name>\", \"Token name\")\n .requiredOption(\"--symbol <symbol>\", \"Token symbol\")\n .requiredOption(\"--uri <uri>\", \"Metadata URI (IPFS/HTTP)\")\n .option(\"--platform <platform>\", \"Launchpad: pumpfun/raydium\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n validateChain(opts.chain);\n const client = requireWallet();\n const result = await callWithAutoPayment(() =>\n client.dex.createToken(opts.chain, {\n name: opts.name,\n symbol: opts.symbol,\n uri: opts.uri,\n platform: opts.platform,\n } as never),\n );\n printResult(result, opts.raw);\n } catch (err) { exitOnError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { createClient, callWithAutoPayment } from \"../lib/client.js\";\nimport { printResult, exitOnError } from \"../lib/output.js\";\n\nexport function registerJobCommands(program: Command): void {\n const job = program.command(\"job\").description(\"Job status polling\");\n\n job\n .command(\"status\")\n .description(\"Check job status\")\n .requiredOption(\"--id <jobId>\", \"Job ID\")\n .option(\"--wait\", \"Wait for job completion via SSE\")\n .option(\"--timeout <ms>\", \"Wait timeout in milliseconds\", \"60000\")\n .option(\"--raw\", \"Single-line JSON output\")\n .action(async (opts) => {\n try {\n const client = createClient();\n if (opts.wait) {\n process.stderr.write(`Waiting for job ${opts.id}...\\n`);\n const result = await callWithAutoPayment(() =>\n client.waitForJob(opts.id, Number(opts.timeout)),\n );\n printResult(result, opts.raw);\n } else {\n const result = await callWithAutoPayment(() =>\n client.job.get(opts.id),\n );\n printResult(result, opts.raw);\n }\n } catch (err) { exitOnError(err); }\n });\n}\n","import { Command } from \"commander\";\nimport { loadConfig, updateConfig } from \"../lib/config.js\";\nimport { loadKey, saveKey, hasKey } from \"../lib/keystore.js\";\nimport {\n otpInit, completeLogin, generateP256KeyPair,\n refreshTurnkeySession, TURNKEY_CONFIG_ID,\n} from \"../lib/turnkey.js\";\nimport { exitOnError } from \"../lib/output.js\";\nimport * as readline from \"node:readline/promises\";\n\nexport function registerAuthCommands(program: Command): void {\n program\n .command(\"login\")\n .description(\"Authenticate via Email OTP (default) or P-256 key (--key)\")\n .argument(\"[email]\", \"Email address for OTP login\")\n .option(\"--key\", \"Use P-256 key login (no email required)\")\n .action(async (email: string | undefined, opts: { key?: boolean }) => {\n try {\n if (opts.key) {\n await doKeyLogin();\n } else {\n await doEmailLogin(email);\n }\n } catch (err) { exitOnError(err); }\n });\n\n program\n .command(\"verify\")\n .description(\"Verify email OTP (second step of login)\")\n .requiredOption(\"--otp-id <id>\", \"OTP ID from login step\")\n .requiredOption(\"--code <code>\", \"OTP code from email\")\n .requiredOption(\"--email <email>\", \"Email used in login step\")\n .action(async (opts: { otpId: string; code: string; email: string }) => {\n try {\n const configId = TURNKEY_CONFIG_ID;\n if (!configId) throw new Error(\"TURNKEY_AUTH_PROXY_CONFIG_ID not set.\");\n\n process.stderr.write(\"Verifying OTP...\\n\");\n const result = await completeLogin(opts.otpId, opts.code, configId, opts.email);\n\n saveKey({\n publicKeyHex: result.keyPair.publicKeyHex,\n uncompressedPublicKeyHex: result.keyPair.uncompressedPublicKeyHex,\n privateKeyDer: result.keyPair.privateKeyDer,\n organizationId: result.organizationId,\n });\n\n updateConfig({\n turnkey: {\n publicKeyHex: result.keyPair.publicKeyHex,\n privateKeyDer: result.keyPair.privateKeyDer,\n organizationId: result.organizationId,\n sessionToken: result.session,\n sessionExpiry: result.sessionExpiry,\n },\n });\n\n if (result.isNewUser) {\n process.stdout.write(\"Welcome! Your ChainStream wallet has been created.\\n\");\n process.stdout.write(\"Run 'chainstream wallet address' to see your addresses.\\n\");\n } else {\n process.stdout.write(\"Logged in successfully.\\n\");\n }\n } catch (err) { exitOnError(err); }\n });\n\n program\n .command(\"logout\")\n .description(\"Clear session (P-256 keys preserved)\")\n .action(() => {\n const config = loadConfig();\n if (config.turnkey) {\n updateConfig({ turnkey: undefined });\n process.stdout.write(\"Logged out. P-256 keys preserved in ~/.config/chainstream/keys/\\n\");\n process.stdout.write(\"Run 'chainstream login --key' to re-authenticate.\\n\");\n } else {\n process.stdout.write(\"Not logged in via Turnkey.\\n\");\n }\n });\n}\n\nasync function doKeyLogin(): Promise<void> {\n const existingKey = loadKey();\n\n if (existingKey?.organizationId) {\n process.stderr.write(\"Refreshing session with existing P-256 key...\\n\");\n const { session, expiry } = await refreshTurnkeySession(\n existingKey.publicKeyHex,\n existingKey.privateKeyDer,\n existingKey.organizationId,\n );\n\n updateConfig({\n turnkey: {\n publicKeyHex: existingKey.publicKeyHex,\n privateKeyDer: existingKey.privateKeyDer,\n organizationId: existingKey.organizationId,\n sessionToken: session,\n sessionExpiry: expiry,\n },\n });\n\n process.stdout.write(\"Logged in (key-based session refresh).\\n\");\n return;\n }\n\n if (hasKey()) {\n process.stderr.write(\"Found P-256 key but no organizationId.\\n\");\n process.stderr.write(\"You need to complete initial login via email first.\\n\");\n process.stderr.write(\"Run: chainstream login <your-email>\\n\");\n return;\n }\n\n // New user with --key: need email OTP first to create sub-org\n process.stderr.write(\"No existing key found.\\n\");\n process.stderr.write(\"First-time users must log in via email to create a wallet:\\n\");\n process.stderr.write(\" chainstream login <your-email>\\n\\n\");\n process.stderr.write(\"After initial setup, you can use 'chainstream login --key' for future logins.\\n\");\n}\n\nasync function doEmailLogin(email?: string): Promise<void> {\n const configId = TURNKEY_CONFIG_ID;\n if (!configId) throw new Error(\"TURNKEY_AUTH_PROXY_CONFIG_ID not set. Contact ChainStream support.\");\n\n if (!email) {\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n email = await rl.question(\"Enter your email: \");\n rl.close();\n if (!email?.trim()) throw new Error(\"Email required.\");\n email = email.trim();\n }\n\n process.stderr.write(`Sending OTP to ${email}...\\n`);\n const { otpId } = await otpInit(email, configId);\n\n // Interactive: prompt for OTP\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n const code = await rl.question(\"Enter OTP code: \");\n rl.close();\n\n if (!code?.trim()) throw new Error(\"OTP code required.\");\n\n process.stderr.write(\"Verifying...\\n\");\n const result = await completeLogin(otpId, code.trim(), configId, email);\n\n saveKey({\n publicKeyHex: result.keyPair.publicKeyHex,\n uncompressedPublicKeyHex: result.keyPair.uncompressedPublicKeyHex,\n privateKeyDer: result.keyPair.privateKeyDer,\n organizationId: result.organizationId,\n });\n\n updateConfig({\n turnkey: {\n publicKeyHex: result.keyPair.publicKeyHex,\n privateKeyDer: result.keyPair.privateKeyDer,\n organizationId: result.organizationId,\n sessionToken: result.session,\n sessionExpiry: result.sessionExpiry,\n },\n });\n\n if (result.isNewUser) {\n process.stdout.write(\"Welcome! Your ChainStream wallet has been created (EVM + Solana).\\n\");\n process.stdout.write(\"Run 'chainstream wallet address' to see your addresses.\\n\");\n } else {\n process.stdout.write(\"Logged in successfully.\\n\");\n }\n}\n","/**\n * P-256 Key Store — persistent key pair storage in ~/.config/chainstream/keys/.\n *\n * Keys are stored independently from config.json so that `logout`\n * (which clears config.turnkey) does not destroy the user's identity.\n *\n * Adapted from openant-cli/src/lib/keystore.ts.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, unlinkSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getConfigDir } from \"./config.js\";\n\nconst KEYS_DIR = join(getConfigDir(), \"keys\");\nconst DEFAULT_PROFILE = \"default\";\n\nfunction ensureKeysDir(): void {\n if (!existsSync(KEYS_DIR)) {\n mkdirSync(KEYS_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\nfunction privatePath(profile: string): string { return join(KEYS_DIR, `${profile}.private`); }\nfunction publicPath(profile: string): string { return join(KEYS_DIR, `${profile}.public`); }\nfunction metaPath(profile: string): string { return join(KEYS_DIR, `${profile}.json`); }\n\nexport interface StoredKeyPair {\n publicKeyHex: string;\n uncompressedPublicKeyHex: string;\n privateKeyDer: string;\n organizationId?: string;\n}\n\nexport function hasKey(profile = DEFAULT_PROFILE): boolean {\n return existsSync(privatePath(profile)) && existsSync(publicPath(profile));\n}\n\nexport function loadKey(profile = DEFAULT_PROFILE): StoredKeyPair | undefined {\n if (!hasKey(profile)) return undefined;\n\n try {\n const privateKeyDer = readFileSync(privatePath(profile), \"utf-8\").trim();\n const publicKeyHex = readFileSync(publicPath(profile), \"utf-8\").trim();\n\n let uncompressedPublicKeyHex = \"\";\n let organizationId: string | undefined;\n\n if (existsSync(metaPath(profile))) {\n const meta = JSON.parse(readFileSync(metaPath(profile), \"utf-8\"));\n uncompressedPublicKeyHex = meta.uncompressedPublicKeyHex ?? \"\";\n organizationId = meta.organizationId;\n }\n\n return { publicKeyHex, uncompressedPublicKeyHex, privateKeyDer, organizationId };\n } catch {\n return undefined;\n }\n}\n\nexport function saveKey(keyPair: StoredKeyPair, profile = DEFAULT_PROFILE): void {\n ensureKeysDir();\n writeFileSync(privatePath(profile), keyPair.privateKeyDer, { mode: 0o600 });\n writeFileSync(publicPath(profile), keyPair.publicKeyHex, { mode: 0o600 });\n writeFileSync(\n metaPath(profile),\n JSON.stringify({\n uncompressedPublicKeyHex: keyPair.uncompressedPublicKeyHex,\n ...(keyPair.organizationId ? { organizationId: keyPair.organizationId } : {}),\n }, null, 2),\n { mode: 0o600 },\n );\n}\n\nexport function updateKeyMeta(organizationId: string, profile = DEFAULT_PROFILE): void {\n if (!existsSync(metaPath(profile))) return;\n try {\n const meta = JSON.parse(readFileSync(metaPath(profile), \"utf-8\"));\n meta.organizationId = organizationId;\n writeFileSync(metaPath(profile), JSON.stringify(meta, null, 2), { mode: 0o600 });\n } catch { /* ignore */ }\n}\n\nexport function deleteKey(profile = DEFAULT_PROFILE): boolean {\n let deleted = false;\n for (const p of [privatePath(profile), publicPath(profile), metaPath(profile)]) {\n if (existsSync(p)) { unlinkSync(p); deleted = true; }\n }\n return deleted;\n}\n\nexport function listProfiles(): string[] {\n if (!existsSync(KEYS_DIR)) return [];\n return readdirSync(KEYS_DIR)\n .filter((f) => f.endsWith(\".private\"))\n .map((f) => f.replace(/\\.private$/, \"\"));\n}\n","import { Command } from \"commander\";\nimport { loadConfig, updateConfig, getWalletMode } from \"../lib/config.js\";\nimport { exitOnError } from \"../lib/output.js\";\n\nexport function registerConfigCommands(program: Command): void {\n const config = program.command(\"config\").description(\"Configuration management\");\n\n config\n .command(\"set\")\n .description(\"Set a configuration value\")\n .requiredOption(\"--key <key>\", \"Config key (apiKey, baseUrl)\")\n .requiredOption(\"--value <value>\", \"Config value\")\n .action((opts) => {\n try {\n const allowedKeys = [\"apiKey\", \"baseUrl\"];\n if (!allowedKeys.includes(opts.key)) {\n throw new Error(`Invalid key \"${opts.key}\". Allowed: ${allowedKeys.join(\", \")}`);\n }\n updateConfig({ [opts.key]: opts.value });\n process.stdout.write(`Set ${opts.key} = ${opts.key === \"apiKey\" ? \"***\" : opts.value}\\n`);\n } catch (err) { exitOnError(err); }\n });\n\n config\n .command(\"get\")\n .description(\"Show configuration\")\n .option(\"--key <key>\", \"Specific key to show\")\n .action((opts) => {\n try {\n const cfg = loadConfig();\n if (opts.key) {\n const value = (cfg as unknown as Record<string, unknown>)[opts.key];\n if (value === undefined) {\n process.stdout.write(`${opts.key}: (not set)\\n`);\n } else if (opts.key === \"apiKey\" && typeof value === \"string\") {\n process.stdout.write(`${opts.key}: ${value.slice(0, 8)}...${value.slice(-4)}\\n`);\n } else {\n process.stdout.write(`${opts.key}: ${JSON.stringify(value)}\\n`);\n }\n } else {\n const display = {\n apiKey: cfg.apiKey ? `${cfg.apiKey.slice(0, 8)}...` : undefined,\n baseUrl: cfg.baseUrl,\n walletMode: getWalletMode(cfg),\n turnkey: cfg.turnkey ? { organizationId: cfg.turnkey.organizationId } : undefined,\n rawWallet: cfg.rawWallet ? { chain: cfg.rawWallet.chain } : undefined,\n };\n process.stdout.write(JSON.stringify(display, null, 2) + \"\\n\");\n }\n } catch (err) { exitOnError(err); }\n });\n\n config\n .command(\"auth\")\n .description(\"Show current authentication status\")\n .action(() => {\n try {\n const cfg = loadConfig();\n const mode = getWalletMode(cfg);\n\n if (mode === \"turnkey\") {\n process.stdout.write(`Auth: Turnkey (org: ${cfg.turnkey!.organizationId})\\n`);\n const expiry = new Date(cfg.turnkey!.sessionExpiry * 1000);\n const expired = Date.now() > cfg.turnkey!.sessionExpiry * 1000;\n process.stdout.write(`Session: ${expired ? \"expired\" : \"active\"} (expires: ${expiry.toISOString()})\\n`);\n } else if (mode === \"raw\") {\n process.stdout.write(`Auth: Raw Key (${cfg.rawWallet!.chain})\\n`);\n } else if (cfg.apiKey) {\n process.stdout.write(`Auth: API Key (${cfg.apiKey.slice(0, 8)}...)\\n`);\n } else {\n process.stdout.write(\"Auth: Not configured\\n\");\n process.stdout.write(\" Run: chainstream login # Turnkey wallet\\n\");\n process.stdout.write(\" Run: chainstream config set apiKey <key> # API key\\n\");\n }\n } catch (err) { exitOnError(err); }\n });\n}\n"],"mappings":"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","names":["privateKeyToAccount","program","program","program","createWalletWithAddresses","createWallet","getPricing","program","readline","program","createWallet","loadConfig","getWalletMode","program","existsSync","mkdirSync","readFileSync","writeFileSync","join","readline","program","rl","program"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chainstream-io/cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "ChainStream CLI — on-chain data and DeFi execution for AI agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"node": ">=18"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@chainstream-io/sdk": "
|
|
43
|
+
"@chainstream-io/sdk": "latest",
|
|
44
44
|
"@scure/base": "^2.0.0",
|
|
45
45
|
"@solana/web3.js": "^1.98.4",
|
|
46
46
|
"@x402/core": "^2.7.0",
|