@chainstream-io/cli 0.0.3 → 0.0.5

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 CHANGED
@@ -10,12 +10,14 @@ var __export = (target, all) => {
10
10
  };
11
11
 
12
12
  // src/lib/constants.ts
13
- var CHAINSTREAM_API_URL, TURNKEY_AUTH_PROXY_CONFIG_ID, SOLANA_RPC_URL, BASE_RPC_URL, BASE_CHAIN_ID;
13
+ var CHAINSTREAM_API_URL, CHAINSTREAM_AUTH_URL, TURNKEY_AUTH_PROXY_CONFIG_ID, TURNKEY_SUB_ORG_PREFIX, SOLANA_RPC_URL, BASE_RPC_URL, BASE_CHAIN_ID;
14
14
  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
+ CHAINSTREAM_AUTH_URL = process.env.CHAINSTREAM_AUTH_URL ?? "https://auth.chainstream.io";
18
19
  TURNKEY_AUTH_PROXY_CONFIG_ID = process.env.TURNKEY_AUTH_PROXY_CONFIG_ID ?? "7550819d-2607-4910-a3d9-8e6e3ff870f9";
20
+ TURNKEY_SUB_ORG_PREFIX = "chainstream-personal";
19
21
  SOLANA_RPC_URL = process.env.SOLANA_RPC_URL ?? "https://api.mainnet-beta.solana.com";
20
22
  BASE_RPC_URL = process.env.BASE_RPC_URL ?? "https://mainnet.base.org";
21
23
  BASE_CHAIN_ID = Number(process.env.BASE_CHAIN_ID ?? "8453");
@@ -62,7 +64,7 @@ function updateConfig(patch) {
62
64
  saveConfig({ ...current, ...patch });
63
65
  }
64
66
  function getWalletMode(config) {
65
- if (config.turnkey?.sessionToken) return "turnkey";
67
+ if (config.turnkey?.organizationId) return "turnkey";
66
68
  if (config.rawWallet?.key) return "raw";
67
69
  return void 0;
68
70
  }
@@ -157,6 +159,26 @@ var init_raw_wallet = __esm({
157
159
  });
158
160
 
159
161
  // src/lib/turnkey.ts
162
+ var turnkey_exports = {};
163
+ __export(turnkey_exports, {
164
+ TURNKEY_API_BASE: () => TURNKEY_API_BASE,
165
+ TURNKEY_CONFIG_ID: () => TURNKEY_CONFIG_ID,
166
+ checkAccount: () => checkAccount,
167
+ completeLogin: () => completeLogin,
168
+ createApiStamp: () => createApiStamp,
169
+ generateP256KeyPair: () => generateP256KeyPair,
170
+ getEvmAddress: () => getEvmAddress,
171
+ getSolanaAddress: () => getSolanaAddress,
172
+ listWalletAccounts: () => listWalletAccounts,
173
+ otpInit: () => otpInit,
174
+ otpLogin: () => otpLogin,
175
+ otpVerify: () => otpVerify,
176
+ refreshTurnkeySession: () => refreshTurnkeySession,
177
+ signRawP256: () => signRawP256,
178
+ signup: () => signup,
179
+ turnkeyRequest: () => turnkeyRequest,
180
+ updateTurnkeyUserEmail: () => updateTurnkeyUserEmail
181
+ });
160
182
  import { createSign, generateKeyPairSync } from "crypto";
161
183
  function generateP256KeyPair() {
162
184
  const { publicKey, privateKey } = generateKeyPairSync("ec", {
@@ -262,8 +284,8 @@ async function signup(email, configId, verificationToken, publicKeyHex, privateK
262
284
  const decoded = decodeJwtPayload(verificationToken);
263
285
  const verificationPublicKey = decoded.public_key ?? publicKeyHex;
264
286
  const signupBody = {
265
- userName: `chainstream-personal-${email.split("@")[0]}`,
266
- organizationName: `chainstream-personal-${email}`,
287
+ userName: `${TURNKEY_SUB_ORG_PREFIX}-${email.split("@")[0]}`,
288
+ organizationName: `${TURNKEY_SUB_ORG_PREFIX}-${email}`,
267
289
  userEmail: email,
268
290
  verificationToken,
269
291
  apiKeys: [],
@@ -388,6 +410,19 @@ async function refreshTurnkeySession(publicKeyHex, privateKeyDer, organizationId
388
410
  const payload = decodeJwtPayload(session);
389
411
  return { session, expiry: payload.exp };
390
412
  }
413
+ async function updateTurnkeyUserEmail(email, verificationToken, creds) {
414
+ const usersData = await turnkeyRequest("/public/v1/query/list_users", {
415
+ organizationId: creds.organizationId
416
+ }, creds);
417
+ const userId = usersData.users?.[0]?.userId;
418
+ if (!userId) throw new Error("Cannot find Turnkey user in sub-org");
419
+ await turnkeyRequest("/public/v1/submit/update_user_email", {
420
+ type: "ACTIVITY_TYPE_UPDATE_USER_EMAIL",
421
+ timestampMs: Date.now().toString(),
422
+ organizationId: creds.organizationId,
423
+ parameters: { userId, userEmail: email, verificationToken }
424
+ }, creds);
425
+ }
391
426
  async function listWalletAccounts(creds) {
392
427
  const walletsData = await turnkeyRequest(
393
428
  "/public/v1/query/list_wallets",
@@ -456,7 +491,18 @@ var init_turnkey_wallet = __esm({
456
491
  };
457
492
  }
458
493
  async signMessage(message) {
459
- const payloadHex = Buffer.from(message, "utf-8").toString("hex");
494
+ let payloadHex;
495
+ let hashFunction;
496
+ if (this.chain === "evm") {
497
+ const prefix = `Ethereum Signed Message:
498
+ ${message.length}`;
499
+ const prefixed = Buffer.concat([Buffer.from(prefix, "utf-8"), Buffer.from(message, "utf-8")]);
500
+ payloadHex = prefixed.toString("hex");
501
+ hashFunction = "HASH_FUNCTION_KECCAK256";
502
+ } else {
503
+ payloadHex = Buffer.from(message, "utf-8").toString("hex");
504
+ hashFunction = "HASH_FUNCTION_NOT_APPLICABLE";
505
+ }
460
506
  const result = await turnkeyRequest(
461
507
  "/public/v1/submit/sign_raw_payload",
462
508
  {
@@ -467,7 +513,7 @@ var init_turnkey_wallet = __esm({
467
513
  signWith: this.address,
468
514
  payload: payloadHex,
469
515
  encoding: "PAYLOAD_ENCODING_HEXADECIMAL",
470
- hashFunction: this.chain === "evm" ? "HASH_FUNCTION_KECCAK256" : "HASH_FUNCTION_NOT_APPLICABLE"
516
+ hashFunction
471
517
  }
472
518
  },
473
519
  this.creds
@@ -475,7 +521,8 @@ var init_turnkey_wallet = __esm({
475
521
  const sigResult = result.activity?.result?.signRawPayloadResult;
476
522
  if (!sigResult) throw new Error("Turnkey signMessage: no signature in response");
477
523
  if (this.chain === "evm") {
478
- return `0x${sigResult.r}${sigResult.s}`;
524
+ const v = sigResult.v === "00" ? "1b" : "1c";
525
+ return `0x${sigResult.r}${sigResult.s}${v}`;
479
526
  }
480
527
  return `${sigResult.r}${sigResult.s}`;
481
528
  }
@@ -516,7 +563,13 @@ function createWallet(config, mode) {
516
563
  return new RawKeyWallet(config.rawWallet.key, config.rawWallet.chain);
517
564
  }
518
565
  if (mode === "turnkey" && config.turnkey) {
519
- return new TurnkeyWallet(config.turnkey, "evm", "");
566
+ const address = config.turnkey.evmAddress;
567
+ if (!address) {
568
+ throw new Error(
569
+ "Turnkey wallet address not found in config.\nPlease re-login to resolve addresses: chainstream login"
570
+ );
571
+ }
572
+ return new TurnkeyWallet(config.turnkey, "evm", address);
520
573
  }
521
574
  throw new Error(
522
575
  "No wallet configured. Run:\n chainstream login # Create Turnkey wallet\n chainstream wallet set-raw # Use raw private key (dev)"
@@ -552,6 +605,38 @@ import { x402Client } from "@x402/core/client";
552
605
  import { wrapFetchWithPayment } from "@x402/fetch";
553
606
  import { ExactEvmScheme } from "@x402/evm/exact/client";
554
607
  import { privateKeyToAccount as privateKeyToAccount2 } from "viem/accounts";
608
+ import { hashTypedData } from "viem";
609
+ function createTurnkeyPaymentAccount(creds) {
610
+ const address = creds.evmAddress;
611
+ return {
612
+ address,
613
+ type: "local",
614
+ source: "custom",
615
+ publicKey: "0x",
616
+ async signTypedData(args) {
617
+ const digest = hashTypedData(args);
618
+ const result = await turnkeyRequest(
619
+ "/public/v1/submit/sign_raw_payload",
620
+ {
621
+ type: "ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2",
622
+ timestampMs: Date.now().toString(),
623
+ organizationId: creds.organizationId,
624
+ parameters: {
625
+ signWith: address,
626
+ payload: digest.slice(2),
627
+ encoding: "PAYLOAD_ENCODING_HEXADECIMAL",
628
+ hashFunction: "HASH_FUNCTION_NO_OP"
629
+ }
630
+ },
631
+ creds
632
+ );
633
+ const sig = result.activity?.result?.signRawPayloadResult;
634
+ if (!sig) throw new Error("Turnkey signTypedData: no signature");
635
+ const v = sig.v === "00" ? "1b" : "1c";
636
+ return `0x${sig.r}${sig.s}${v}`;
637
+ }
638
+ };
639
+ }
555
640
  function getX402Fetch(config) {
556
641
  if (_x402Fetch) return _x402Fetch;
557
642
  const client = new x402Client();
@@ -559,8 +644,9 @@ function getX402Fetch(config) {
559
644
  const hex = config.rawWallet.key.startsWith("0x") ? config.rawWallet.key : `0x${config.rawWallet.key}`;
560
645
  const account = privateKeyToAccount2(hex);
561
646
  client.register("eip155:*", new ExactEvmScheme(account));
562
- } else if (config.rawWallet?.chain === "solana") {
563
- process.stderr.write("[chainstream] Auto-purchase only supports EVM wallets currently.\n");
647
+ } else if (config.turnkey?.evmAddress && config.turnkey?.organizationId) {
648
+ const account = createTurnkeyPaymentAccount(config.turnkey);
649
+ client.register("eip155:*", new ExactEvmScheme(account));
564
650
  }
565
651
  _x402Fetch = wrapFetchWithPayment(fetch, client);
566
652
  return _x402Fetch;
@@ -600,6 +686,7 @@ var _x402Fetch;
600
686
  var init_x402 = __esm({
601
687
  "src/lib/x402.ts"() {
602
688
  "use strict";
689
+ init_turnkey();
603
690
  _x402Fetch = null;
604
691
  }
605
692
  });
@@ -952,12 +1039,19 @@ function registerWalletCommands(program2) {
952
1039
  const config = loadConfig();
953
1040
  const walletMode = (await Promise.resolve().then(() => (init_config(), config_exports))).getWalletMode(config);
954
1041
  if (walletMode === "turnkey" && config.turnkey) {
955
- const { createWalletWithAddresses: createWalletWithAddresses2 } = await Promise.resolve().then(() => (init_wallet(), wallet_exports));
956
- const wallets = await createWalletWithAddresses2(config, "turnkey");
957
- if (wallets.evm) process.stdout.write(`EVM: ${wallets.evm.address}
1042
+ if (config.turnkey.evmAddress || config.turnkey.solanaAddress) {
1043
+ if (config.turnkey.evmAddress) process.stdout.write(`EVM: ${config.turnkey.evmAddress}
958
1044
  `);
959
- if (wallets.solana) process.stdout.write(`Solana: ${wallets.solana.address}
1045
+ if (config.turnkey.solanaAddress) process.stdout.write(`Solana: ${config.turnkey.solanaAddress}
960
1046
  `);
1047
+ } else {
1048
+ const { createWalletWithAddresses: createWalletWithAddresses2 } = await Promise.resolve().then(() => (init_wallet(), wallet_exports));
1049
+ const wallets = await createWalletWithAddresses2(config, "turnkey");
1050
+ if (wallets.evm) process.stdout.write(`EVM: ${wallets.evm.address}
1051
+ `);
1052
+ if (wallets.solana) process.stdout.write(`Solana: ${wallets.solana.address}
1053
+ `);
1054
+ }
961
1055
  } else if (config.rawWallet) {
962
1056
  const { createWallet: createWallet2 } = await Promise.resolve().then(() => (init_wallet(), wallet_exports));
963
1057
  const w = createWallet2(config, "raw");
@@ -974,10 +1068,18 @@ function registerWalletCommands(program2) {
974
1068
  try {
975
1069
  validateChain(opts.chain);
976
1070
  const config = loadConfig();
1071
+ const { getWalletMode: getWalletMode2 } = await Promise.resolve().then(() => (init_config(), config_exports));
1072
+ const walletMode = getWalletMode2(config);
977
1073
  let address;
978
- if (config.rawWallet) {
1074
+ if (walletMode === "raw" && config.rawWallet) {
979
1075
  const { createWallet: createWallet2 } = await Promise.resolve().then(() => (init_wallet(), wallet_exports));
980
1076
  address = createWallet2(config, "raw").address;
1077
+ } else if (walletMode === "turnkey" && config.turnkey) {
1078
+ address = config.turnkey.evmAddress;
1079
+ if (!address) {
1080
+ const { getEvmAddress: getEvmAddress2 } = await Promise.resolve().then(() => (init_turnkey(), turnkey_exports));
1081
+ address = await getEvmAddress2(config.turnkey);
1082
+ }
981
1083
  }
982
1084
  if (!address) throw new Error("No wallet configured. Run: chainstream login");
983
1085
  const client = createClient();
@@ -1185,6 +1287,7 @@ function registerJobCommands(program2) {
1185
1287
 
1186
1288
  // src/commands/auth.ts
1187
1289
  init_config();
1290
+ import { createSign as createSign2 } from "crypto";
1188
1291
 
1189
1292
  // src/lib/keystore.ts
1190
1293
  init_config();
@@ -1242,14 +1345,25 @@ function saveKey(keyPair, profile = DEFAULT_PROFILE) {
1242
1345
 
1243
1346
  // src/commands/auth.ts
1244
1347
  init_turnkey();
1348
+ init_constants();
1245
1349
  import * as readline3 from "readline/promises";
1350
+ async function resolveAndStoreAddresses(turnkeyCreds) {
1351
+ process.stderr.write("Resolving wallet addresses...\n");
1352
+ const [evmAddress, solanaAddress] = await Promise.all([
1353
+ getEvmAddress(turnkeyCreds),
1354
+ getSolanaAddress(turnkeyCreds)
1355
+ ]);
1356
+ updateConfig({
1357
+ turnkey: { ...turnkeyCreds, evmAddress, solanaAddress }
1358
+ });
1359
+ }
1246
1360
  function registerAuthCommands(program2) {
1247
- program2.command("login").description("Authenticate via Email OTP (default) or P-256 key (--key)").argument("[email]", "Email address for OTP login").option("--key", "Use P-256 key login (no email required)").action(async (email, opts) => {
1361
+ program2.command("login").description("Create wallet (default) or login via email OTP (--email)").argument("[email]", "Email address for OTP login (optional)").option("--email", "Use email OTP login instead of key-based").action(async (emailArg, opts) => {
1248
1362
  try {
1249
- if (opts.key) {
1250
- await doKeyLogin();
1363
+ if (opts.email || emailArg) {
1364
+ await doEmailLogin(emailArg);
1251
1365
  } else {
1252
- await doEmailLogin(email);
1366
+ await doKeyLogin();
1253
1367
  }
1254
1368
  } catch (err) {
1255
1369
  exitOnError(err);
@@ -1267,21 +1381,25 @@ function registerAuthCommands(program2) {
1267
1381
  privateKeyDer: result.keyPair.privateKeyDer,
1268
1382
  organizationId: result.organizationId
1269
1383
  });
1270
- updateConfig({
1271
- turnkey: {
1272
- publicKeyHex: result.keyPair.publicKeyHex,
1273
- privateKeyDer: result.keyPair.privateKeyDer,
1274
- organizationId: result.organizationId,
1275
- sessionToken: result.session,
1276
- sessionExpiry: result.sessionExpiry
1277
- }
1278
- });
1384
+ const turnkeyCreds = {
1385
+ publicKeyHex: result.keyPair.publicKeyHex,
1386
+ privateKeyDer: result.keyPair.privateKeyDer,
1387
+ organizationId: result.organizationId,
1388
+ sessionToken: result.session,
1389
+ sessionExpiry: result.sessionExpiry
1390
+ };
1391
+ updateConfig({ turnkey: turnkeyCreds });
1392
+ await resolveAndStoreAddresses(turnkeyCreds);
1393
+ const config = loadConfig();
1279
1394
  if (result.isNewUser) {
1280
1395
  process.stdout.write("Welcome! Your ChainStream wallet has been created.\n");
1281
- process.stdout.write("Run 'chainstream wallet address' to see your addresses.\n");
1282
1396
  } else {
1283
1397
  process.stdout.write("Logged in successfully.\n");
1284
1398
  }
1399
+ process.stdout.write(` EVM: ${config.turnkey?.evmAddress}
1400
+ `);
1401
+ process.stdout.write(` Solana: ${config.turnkey?.solanaAddress}
1402
+ `);
1285
1403
  } catch (err) {
1286
1404
  exitOnError(err);
1287
1405
  }
@@ -1291,11 +1409,47 @@ function registerAuthCommands(program2) {
1291
1409
  if (config.turnkey) {
1292
1410
  updateConfig({ turnkey: void 0 });
1293
1411
  process.stdout.write("Logged out. P-256 keys preserved in ~/.config/chainstream/keys/\n");
1294
- process.stdout.write("Run 'chainstream login --key' to re-authenticate.\n");
1412
+ process.stdout.write("Run 'chainstream login' to re-authenticate.\n");
1295
1413
  } else {
1296
1414
  process.stdout.write("Not logged in via Turnkey.\n");
1297
1415
  }
1298
1416
  });
1417
+ program2.command("bind-email").description("Bind an email to your wallet (for account recovery)").argument("[email]", "Email address to bind").action(async (emailArg) => {
1418
+ try {
1419
+ await doBindEmail(emailArg);
1420
+ } catch (err) {
1421
+ exitOnError(err);
1422
+ }
1423
+ });
1424
+ }
1425
+ function signTimestamp(timestampMs, privateKeyDerBase64) {
1426
+ const signer = createSign2("SHA256");
1427
+ signer.update(timestampMs);
1428
+ signer.end();
1429
+ const sig = signer.sign({
1430
+ key: Buffer.from(privateKeyDerBase64, "base64"),
1431
+ format: "der",
1432
+ type: "pkcs8"
1433
+ });
1434
+ return sig.toString("hex");
1435
+ }
1436
+ async function callKeyAuth(publicKeyHex, uncompressedPublicKeyHex, timestampMs, signature) {
1437
+ const authUrl = loadConfig().authUrl ?? CHAINSTREAM_AUTH_URL;
1438
+ const res = await fetch(`${authUrl}/api/auth/key`, {
1439
+ method: "POST",
1440
+ headers: { "Content-Type": "application/json" },
1441
+ body: JSON.stringify({ publicKeyHex, uncompressedPublicKeyHex, timestampMs, signature })
1442
+ });
1443
+ if (!res.ok) {
1444
+ const text = await res.text().catch(() => "");
1445
+ let detail = text;
1446
+ try {
1447
+ detail = JSON.parse(text).message ?? text;
1448
+ } catch {
1449
+ }
1450
+ throw new Error(`Auth service error (${res.status}): ${detail}`);
1451
+ }
1452
+ return res.json();
1299
1453
  }
1300
1454
  async function doKeyLogin() {
1301
1455
  const existingKey = loadKey();
@@ -1306,28 +1460,81 @@ async function doKeyLogin() {
1306
1460
  existingKey.privateKeyDer,
1307
1461
  existingKey.organizationId
1308
1462
  );
1309
- updateConfig({
1310
- turnkey: {
1311
- publicKeyHex: existingKey.publicKeyHex,
1312
- privateKeyDer: existingKey.privateKeyDer,
1313
- organizationId: existingKey.organizationId,
1314
- sessionToken: session,
1315
- sessionExpiry: expiry
1316
- }
1317
- });
1318
- process.stdout.write("Logged in (key-based session refresh).\n");
1463
+ const turnkeyCreds = {
1464
+ publicKeyHex: existingKey.publicKeyHex,
1465
+ privateKeyDer: existingKey.privateKeyDer,
1466
+ organizationId: existingKey.organizationId,
1467
+ sessionToken: session,
1468
+ sessionExpiry: expiry
1469
+ };
1470
+ updateConfig({ turnkey: turnkeyCreds });
1471
+ const config = loadConfig();
1472
+ if (!config.turnkey?.evmAddress) {
1473
+ await resolveAndStoreAddresses(config.turnkey);
1474
+ }
1475
+ process.stdout.write("Logged in (session refresh).\n");
1476
+ const updated = loadConfig();
1477
+ process.stdout.write(` EVM: ${updated.turnkey?.evmAddress}
1478
+ `);
1479
+ process.stdout.write(` Solana: ${updated.turnkey?.solanaAddress}
1480
+ `);
1319
1481
  return;
1320
1482
  }
1321
- if (hasKey()) {
1322
- process.stderr.write("Found P-256 key but no organizationId.\n");
1323
- process.stderr.write("You need to complete initial login via email first.\n");
1324
- process.stderr.write("Run: chainstream login <your-email>\n");
1325
- return;
1483
+ let keyPair;
1484
+ const storedKey = loadKey();
1485
+ if (storedKey?.publicKeyHex && storedKey.privateKeyDer && storedKey.uncompressedPublicKeyHex) {
1486
+ keyPair = {
1487
+ publicKeyHex: storedKey.publicKeyHex,
1488
+ uncompressedPublicKeyHex: storedKey.uncompressedPublicKeyHex,
1489
+ privateKeyDer: storedKey.privateKeyDer
1490
+ };
1491
+ process.stderr.write(`Using existing key (${keyPair.publicKeyHex.slice(0, 16)}...)
1492
+ `);
1493
+ } else {
1494
+ keyPair = generateP256KeyPair();
1495
+ saveKey({
1496
+ publicKeyHex: keyPair.publicKeyHex,
1497
+ uncompressedPublicKeyHex: keyPair.uncompressedPublicKeyHex,
1498
+ privateKeyDer: keyPair.privateKeyDer
1499
+ });
1500
+ process.stderr.write(`Generated new P-256 key pair
1501
+ `);
1326
1502
  }
1327
- process.stderr.write("No existing key found.\n");
1328
- process.stderr.write("First-time users must log in via email to create a wallet:\n");
1329
- process.stderr.write(" chainstream login <your-email>\n\n");
1330
- process.stderr.write("After initial setup, you can use 'chainstream login --key' for future logins.\n");
1503
+ const timestampMs = Date.now().toString();
1504
+ const signature = signTimestamp(timestampMs, keyPair.privateKeyDer);
1505
+ process.stderr.write("Registering with ChainStream...\n");
1506
+ const result = await callKeyAuth(
1507
+ keyPair.publicKeyHex,
1508
+ keyPair.uncompressedPublicKeyHex,
1509
+ timestampMs,
1510
+ signature
1511
+ );
1512
+ saveKey({
1513
+ publicKeyHex: keyPair.publicKeyHex,
1514
+ uncompressedPublicKeyHex: keyPair.uncompressedPublicKeyHex,
1515
+ privateKeyDer: keyPair.privateKeyDer,
1516
+ organizationId: result.orgId
1517
+ });
1518
+ updateConfig({
1519
+ turnkey: {
1520
+ publicKeyHex: keyPair.publicKeyHex,
1521
+ privateKeyDer: keyPair.privateKeyDer,
1522
+ organizationId: result.orgId,
1523
+ sessionToken: "",
1524
+ sessionExpiry: 0,
1525
+ evmAddress: result.evmAddress,
1526
+ solanaAddress: result.solanaAddress
1527
+ }
1528
+ });
1529
+ if (result.isNewUser) {
1530
+ process.stdout.write("Welcome! Your ChainStream wallet has been created.\n");
1531
+ } else {
1532
+ process.stdout.write("Logged in successfully.\n");
1533
+ }
1534
+ process.stdout.write(` EVM: ${result.evmAddress}
1535
+ `);
1536
+ process.stdout.write(` Solana: ${result.solanaAddress}
1537
+ `);
1331
1538
  }
1332
1539
  async function doEmailLogin(email) {
1333
1540
  const configId = TURNKEY_CONFIG_ID;
@@ -1342,6 +1549,13 @@ async function doEmailLogin(email) {
1342
1549
  process.stderr.write(`Sending OTP to ${email}...
1343
1550
  `);
1344
1551
  const { otpId } = await otpInit(email, configId);
1552
+ if (!process.stdin.isTTY) {
1553
+ process.stdout.write(JSON.stringify({ otpId, email }) + "\n");
1554
+ process.stderr.write("Non-interactive mode: complete login with:\n");
1555
+ process.stderr.write(` chainstream verify --otp-id ${otpId} --code <code> --email ${email}
1556
+ `);
1557
+ return;
1558
+ }
1345
1559
  const rl = readline3.createInterface({ input: process.stdin, output: process.stderr });
1346
1560
  const code = await rl.question("Enter OTP code: ");
1347
1561
  rl.close();
@@ -1354,21 +1568,60 @@ async function doEmailLogin(email) {
1354
1568
  privateKeyDer: result.keyPair.privateKeyDer,
1355
1569
  organizationId: result.organizationId
1356
1570
  });
1357
- updateConfig({
1358
- turnkey: {
1359
- publicKeyHex: result.keyPair.publicKeyHex,
1360
- privateKeyDer: result.keyPair.privateKeyDer,
1361
- organizationId: result.organizationId,
1362
- sessionToken: result.session,
1363
- sessionExpiry: result.sessionExpiry
1364
- }
1365
- });
1571
+ const turnkeyCreds = {
1572
+ publicKeyHex: result.keyPair.publicKeyHex,
1573
+ privateKeyDer: result.keyPair.privateKeyDer,
1574
+ organizationId: result.organizationId,
1575
+ sessionToken: result.session,
1576
+ sessionExpiry: result.sessionExpiry
1577
+ };
1578
+ updateConfig({ turnkey: turnkeyCreds });
1579
+ await resolveAndStoreAddresses(turnkeyCreds);
1580
+ const config = loadConfig();
1366
1581
  if (result.isNewUser) {
1367
- process.stdout.write("Welcome! Your ChainStream wallet has been created (EVM + Solana).\n");
1368
- process.stdout.write("Run 'chainstream wallet address' to see your addresses.\n");
1582
+ process.stdout.write("Welcome! Your ChainStream wallet has been created.\n");
1369
1583
  } else {
1370
1584
  process.stdout.write("Logged in successfully.\n");
1371
1585
  }
1586
+ process.stdout.write(` EVM: ${config.turnkey?.evmAddress}
1587
+ `);
1588
+ process.stdout.write(` Solana: ${config.turnkey?.solanaAddress}
1589
+ `);
1590
+ }
1591
+ async function doBindEmail(email) {
1592
+ const config = loadConfig();
1593
+ if (!config.turnkey?.organizationId) {
1594
+ throw new Error("No wallet found. Run 'chainstream login' first.");
1595
+ }
1596
+ const configId = TURNKEY_CONFIG_ID;
1597
+ if (!configId) throw new Error("TURNKEY_AUTH_PROXY_CONFIG_ID not set.");
1598
+ if (!email) {
1599
+ const rl2 = readline3.createInterface({ input: process.stdin, output: process.stderr });
1600
+ email = await rl2.question("Enter email to bind: ");
1601
+ rl2.close();
1602
+ if (!email?.trim()) throw new Error("Email required.");
1603
+ email = email.trim();
1604
+ }
1605
+ process.stderr.write(`Sending verification code to ${email}...
1606
+ `);
1607
+ const { otpId } = await otpInit(email, configId);
1608
+ if (!process.stdin.isTTY) {
1609
+ process.stdout.write(JSON.stringify({ otpId, email }) + "\n");
1610
+ process.stderr.write("Non-interactive mode. To complete binding, verify the OTP\n");
1611
+ process.stderr.write("and call the Turnkey update_user_email API with the verificationToken.\n");
1612
+ return;
1613
+ }
1614
+ const rl = readline3.createInterface({ input: process.stdin, output: process.stderr });
1615
+ const code = await rl.question("Enter verification code: ");
1616
+ rl.close();
1617
+ if (!code?.trim()) throw new Error("Verification code required.");
1618
+ process.stderr.write("Verifying...\n");
1619
+ const { verificationToken } = await otpVerify(otpId, code.trim(), config.turnkey.publicKeyHex, configId);
1620
+ process.stderr.write("Binding email to Turnkey wallet...\n");
1621
+ await updateTurnkeyUserEmail(email, verificationToken, config.turnkey);
1622
+ process.stdout.write(`Email ${email} bound successfully.
1623
+ `);
1624
+ process.stdout.write("You can now use this email for account recovery.\n");
1372
1625
  }
1373
1626
 
1374
1627
  // src/commands/config-cmd.ts
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 — 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"]}
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/** ChainStream Auth Service base URL (for key-based login). */\nexport const CHAINSTREAM_AUTH_URL =\n process.env.CHAINSTREAM_AUTH_URL ?? \"https://auth.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/** Prefix for Turnkey sub-org userName / organizationName. */\nexport const TURNKEY_SUB_ORG_PREFIX = \"chainstream-personal\";\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 evmAddress?: string;\n solanaAddress?: string;\n}\n\nexport interface RawWalletConfig {\n key: string;\n chain: \"evm\" | \"solana\";\n}\n\nexport interface Config {\n apiKey?: string;\n baseUrl: string;\n authUrl?: 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?.organizationId) 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, TURNKEY_SUB_ORG_PREFIX } 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: `${TURNKEY_SUB_ORG_PREFIX}-${email.split(\"@\")[0]}`,\n organizationName: `${TURNKEY_SUB_ORG_PREFIX}-${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// ── Email Binding ────────────────────────────────────────────────\n\n/**\n * Bind an email to the Turnkey sub-org user.\n * Requires a verificationToken from OTP verify to prove email ownership.\n * Must be called with the sub-org user's own API key (not parent org).\n */\nexport async function updateTurnkeyUserEmail(\n email: string, verificationToken: string, creds: TurnkeyCredentials,\n): Promise<void> {\n const usersData = await turnkeyRequest<{\n users: Array<{ userId: string }>;\n }>(\"/public/v1/query/list_users\", {\n organizationId: creds.organizationId,\n }, creds);\n\n const userId = usersData.users?.[0]?.userId;\n if (!userId) throw new Error(\"Cannot find Turnkey user in sub-org\");\n\n await turnkeyRequest(\"/public/v1/submit/update_user_email\", {\n type: \"ACTIVITY_TYPE_UPDATE_USER_EMAIL\",\n timestampMs: Date.now().toString(),\n organizationId: creds.organizationId,\n parameters: { userId, userEmail: email, verificationToken },\n }, creds);\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 let payloadHex: string;\n let hashFunction: string;\n\n if (this.chain === \"evm\") {\n // EIP-191 personal_sign: hash(\"\\x19Ethereum Signed Message:\\n\" + len + message)\n const prefix = `\\x19Ethereum Signed Message:\\n${message.length}`;\n const prefixed = Buffer.concat([Buffer.from(prefix, \"utf-8\"), Buffer.from(message, \"utf-8\")]);\n payloadHex = prefixed.toString(\"hex\");\n hashFunction = \"HASH_FUNCTION_KECCAK256\";\n } else {\n payloadHex = Buffer.from(message, \"utf-8\").toString(\"hex\");\n hashFunction = \"HASH_FUNCTION_NOT_APPLICABLE\";\n }\n\n const result = await turnkeyRequest<{\n activity: { result?: { signRawPayloadResult?: { r: string; s: string; v: 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,\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 const v = sigResult.v === \"00\" ? \"1b\" : \"1c\";\n return `0x${sigResult.r}${sigResult.s}${v}`;\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 const address = config.turnkey.evmAddress;\n if (!address) {\n throw new Error(\n \"Turnkey wallet address not found in config.\\n\" +\n \"Please re-login to resolve addresses: chainstream login\",\n );\n }\n return new TurnkeyWallet(config.turnkey, \"evm\", address);\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 { privateKeyToAccount } from \"viem/accounts\";\nimport { hashTypedData, type Hex, type Address } from \"viem\";\nimport type { Config, TurnkeyCredentials } from \"./config.js\";\nimport { turnkeyRequest } from \"./turnkey.js\";\n\nlet _x402Fetch: typeof fetch | null = null;\n\n/**\n * Create a viem-compatible Account backed by Turnkey for x402 payment signing.\n * Uses hashTypedData locally + HASH_FUNCTION_NO_OP to avoid Turnkey's\n * EIP-712 serialization issues.\n */\nfunction createTurnkeyPaymentAccount(creds: TurnkeyCredentials) {\n const address = creds.evmAddress! as Address;\n return {\n address,\n type: \"local\" as const,\n source: \"custom\" as const,\n publicKey: \"0x\" as Hex,\n async signTypedData(args: { domain: Record<string, unknown>; types: Record<string, unknown[]>; primaryType: string; message: Record<string, unknown> }): Promise<Hex> {\n const digest = hashTypedData(args as Parameters<typeof hashTypedData>[0]);\n\n const result = await turnkeyRequest<{\n activity: { result?: { signRawPayloadResult?: { r: string; s: string; v: 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: creds.organizationId,\n parameters: {\n signWith: address,\n payload: digest.slice(2),\n encoding: \"PAYLOAD_ENCODING_HEXADECIMAL\",\n hashFunction: \"HASH_FUNCTION_NO_OP\",\n },\n },\n creds,\n );\n\n const sig = result.activity?.result?.signRawPayloadResult;\n if (!sig) throw new Error(\"Turnkey signTypedData: no signature\");\n const v = sig.v === \"00\" ? \"1b\" : \"1c\";\n return `0x${sig.r}${sig.s}${v}` as Hex;\n },\n };\n}\n\n/**\n * Get a fetch function wrapped with x402 auto-payment.\n * Supports both raw private keys and Turnkey wallets.\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.turnkey?.evmAddress && config.turnkey?.organizationId) {\n const account = createTurnkeyPaymentAccount(config.turnkey);\n client.register(\"eip155:*\", new ExactEvmScheme(account as never));\n }\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 if (config.turnkey.evmAddress || config.turnkey.solanaAddress) {\n if (config.turnkey.evmAddress) process.stdout.write(`EVM: ${config.turnkey.evmAddress}\\n`);\n if (config.turnkey.solanaAddress) process.stdout.write(`Solana: ${config.turnkey.solanaAddress}\\n`);\n } else {\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 }\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 const { getWalletMode } = await import(\"../lib/config.js\");\n const walletMode = getWalletMode(config);\n\n let address: string | undefined;\n if (walletMode === \"raw\" && config.rawWallet) {\n const { createWallet } = await import(\"../wallet/index.js\");\n address = createWallet(config, \"raw\").address;\n } else if (walletMode === \"turnkey\" && config.turnkey) {\n address = config.turnkey.evmAddress;\n if (!address) {\n const { getEvmAddress } = await import(\"../lib/turnkey.js\");\n address = await getEvmAddress(config.turnkey);\n }\n }\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 { createSign } from \"node:crypto\";\nimport { loadConfig, updateConfig, type TurnkeyCredentials } from \"../lib/config.js\";\nimport { loadKey, saveKey, hasKey } from \"../lib/keystore.js\";\nimport {\n otpInit, otpVerify, completeLogin, generateP256KeyPair,\n refreshTurnkeySession, TURNKEY_CONFIG_ID,\n getEvmAddress, getSolanaAddress, updateTurnkeyUserEmail,\n} from \"../lib/turnkey.js\";\nimport { CHAINSTREAM_AUTH_URL } from \"../lib/constants.js\";\nimport { exitOnError } from \"../lib/output.js\";\nimport * as readline from \"node:readline/promises\";\n\nasync function resolveAndStoreAddresses(turnkeyCreds: TurnkeyCredentials): Promise<void> {\n process.stderr.write(\"Resolving wallet addresses...\\n\");\n const [evmAddress, solanaAddress] = await Promise.all([\n getEvmAddress(turnkeyCreds),\n getSolanaAddress(turnkeyCreds),\n ]);\n updateConfig({\n turnkey: { ...turnkeyCreds, evmAddress, solanaAddress },\n });\n}\n\nexport function registerAuthCommands(program: Command): void {\n program\n .command(\"login\")\n .description(\"Create wallet (default) or login via email OTP (--email)\")\n .argument(\"[email]\", \"Email address for OTP login (optional)\")\n .option(\"--email\", \"Use email OTP login instead of key-based\")\n .action(async (emailArg: string | undefined, opts: { email?: boolean }) => {\n try {\n if (opts.email || emailArg) {\n await doEmailLogin(emailArg);\n } else {\n await doKeyLogin();\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 const turnkeyCreds: TurnkeyCredentials = {\n publicKeyHex: result.keyPair.publicKeyHex,\n privateKeyDer: result.keyPair.privateKeyDer,\n organizationId: result.organizationId,\n sessionToken: result.session,\n sessionExpiry: result.sessionExpiry,\n };\n updateConfig({ turnkey: turnkeyCreds });\n\n await resolveAndStoreAddresses(turnkeyCreds);\n const config = loadConfig();\n\n if (result.isNewUser) {\n process.stdout.write(\"Welcome! Your ChainStream wallet has been created.\\n\");\n } else {\n process.stdout.write(\"Logged in successfully.\\n\");\n }\n process.stdout.write(` EVM: ${config.turnkey?.evmAddress}\\n`);\n process.stdout.write(` Solana: ${config.turnkey?.solanaAddress}\\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' to re-authenticate.\\n\");\n } else {\n process.stdout.write(\"Not logged in via Turnkey.\\n\");\n }\n });\n\n program\n .command(\"bind-email\")\n .description(\"Bind an email to your wallet (for account recovery)\")\n .argument(\"[email]\", \"Email address to bind\")\n .action(async (emailArg?: string) => {\n try {\n await doBindEmail(emailArg);\n } catch (err) { exitOnError(err); }\n });\n}\n\n// ── Key-based login (default, no email required) ─────────────────\n\nfunction signTimestamp(timestampMs: string, privateKeyDerBase64: string): string {\n const signer = createSign(\"SHA256\");\n signer.update(timestampMs);\n signer.end();\n const sig = signer.sign({\n key: Buffer.from(privateKeyDerBase64, \"base64\"),\n format: \"der\",\n type: \"pkcs8\",\n });\n return sig.toString(\"hex\");\n}\n\ninterface KeyAuthResponse {\n orgId: string;\n evmAddress: string;\n solanaAddress: string;\n isNewUser: boolean;\n}\n\nasync function callKeyAuth(\n publicKeyHex: string,\n uncompressedPublicKeyHex: string,\n timestampMs: string,\n signature: string,\n): Promise<KeyAuthResponse> {\n const authUrl = loadConfig().authUrl ?? CHAINSTREAM_AUTH_URL;\n\n const res = await fetch(`${authUrl}/api/auth/key`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ publicKeyHex, uncompressedPublicKeyHex, timestampMs, signature }),\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(`Auth service error (${res.status}): ${detail}`);\n }\n\n return res.json() as Promise<KeyAuthResponse>;\n}\n\nasync function doKeyLogin(): Promise<void> {\n // If user already has credentials with an orgId, just refresh the session\n const existingKey = loadKey();\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 const turnkeyCreds: TurnkeyCredentials = {\n publicKeyHex: existingKey.publicKeyHex,\n privateKeyDer: existingKey.privateKeyDer,\n organizationId: existingKey.organizationId,\n sessionToken: session,\n sessionExpiry: expiry,\n };\n updateConfig({ turnkey: turnkeyCreds });\n\n const config = loadConfig();\n if (!config.turnkey?.evmAddress) {\n await resolveAndStoreAddresses(config.turnkey!);\n }\n\n process.stdout.write(\"Logged in (session refresh).\\n\");\n const updated = loadConfig();\n process.stdout.write(` EVM: ${updated.turnkey?.evmAddress}\\n`);\n process.stdout.write(` Solana: ${updated.turnkey?.solanaAddress}\\n`);\n return;\n }\n\n // Generate or load P-256 key pair\n let keyPair: ReturnType<typeof generateP256KeyPair>;\n const storedKey = loadKey();\n\n if (storedKey?.publicKeyHex && storedKey.privateKeyDer && storedKey.uncompressedPublicKeyHex) {\n keyPair = {\n publicKeyHex: storedKey.publicKeyHex,\n uncompressedPublicKeyHex: storedKey.uncompressedPublicKeyHex,\n privateKeyDer: storedKey.privateKeyDer,\n };\n process.stderr.write(`Using existing key (${keyPair.publicKeyHex.slice(0, 16)}...)\\n`);\n } else {\n keyPair = generateP256KeyPair();\n saveKey({\n publicKeyHex: keyPair.publicKeyHex,\n uncompressedPublicKeyHex: keyPair.uncompressedPublicKeyHex,\n privateKeyDer: keyPair.privateKeyDer,\n });\n process.stderr.write(`Generated new P-256 key pair\\n`);\n }\n\n // Sign timestamp and call auth service\n const timestampMs = Date.now().toString();\n const signature = signTimestamp(timestampMs, keyPair.privateKeyDer);\n\n process.stderr.write(\"Registering with ChainStream...\\n\");\n const result = await callKeyAuth(\n keyPair.publicKeyHex,\n keyPair.uncompressedPublicKeyHex,\n timestampMs,\n signature,\n );\n\n // Save org ID to keystore metadata\n saveKey({\n publicKeyHex: keyPair.publicKeyHex,\n uncompressedPublicKeyHex: keyPair.uncompressedPublicKeyHex,\n privateKeyDer: keyPair.privateKeyDer,\n organizationId: result.orgId,\n });\n\n // Save credentials + addresses to config\n updateConfig({\n turnkey: {\n publicKeyHex: keyPair.publicKeyHex,\n privateKeyDer: keyPair.privateKeyDer,\n organizationId: result.orgId,\n sessionToken: \"\",\n sessionExpiry: 0,\n evmAddress: result.evmAddress,\n solanaAddress: result.solanaAddress,\n },\n });\n\n if (result.isNewUser) {\n process.stdout.write(\"Welcome! Your ChainStream wallet has been created.\\n\");\n } else {\n process.stdout.write(\"Logged in successfully.\\n\");\n }\n process.stdout.write(` EVM: ${result.evmAddress}\\n`);\n process.stdout.write(` Solana: ${result.solanaAddress}\\n`);\n}\n\n// ── Email OTP login (optional, --email flag) ─────────────────────\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 if (!process.stdin.isTTY) {\n process.stdout.write(JSON.stringify({ otpId, email }) + \"\\n\");\n process.stderr.write(\"Non-interactive mode: complete login with:\\n\");\n process.stderr.write(` chainstream verify --otp-id ${otpId} --code <code> --email ${email}\\n`);\n return;\n }\n\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 const turnkeyCreds: TurnkeyCredentials = {\n publicKeyHex: result.keyPair.publicKeyHex,\n privateKeyDer: result.keyPair.privateKeyDer,\n organizationId: result.organizationId,\n sessionToken: result.session,\n sessionExpiry: result.sessionExpiry,\n };\n updateConfig({ turnkey: turnkeyCreds });\n\n await resolveAndStoreAddresses(turnkeyCreds);\n const config = loadConfig();\n\n if (result.isNewUser) {\n process.stdout.write(\"Welcome! Your ChainStream wallet has been created.\\n\");\n } else {\n process.stdout.write(\"Logged in successfully.\\n\");\n }\n process.stdout.write(` EVM: ${config.turnkey?.evmAddress}\\n`);\n process.stdout.write(` Solana: ${config.turnkey?.solanaAddress}\\n`);\n}\n\n// ── Bind email (optional, for account recovery) ──────────────────\n\nasync function doBindEmail(email?: string): Promise<void> {\n const config = loadConfig();\n if (!config.turnkey?.organizationId) {\n throw new Error(\"No wallet found. Run 'chainstream login' first.\");\n }\n\n const configId = TURNKEY_CONFIG_ID;\n if (!configId) throw new Error(\"TURNKEY_AUTH_PROXY_CONFIG_ID not set.\");\n\n if (!email) {\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n email = await rl.question(\"Enter email to bind: \");\n rl.close();\n if (!email?.trim()) throw new Error(\"Email required.\");\n email = email.trim();\n }\n\n process.stderr.write(`Sending verification code to ${email}...\\n`);\n const { otpId } = await otpInit(email, configId);\n\n if (!process.stdin.isTTY) {\n process.stdout.write(JSON.stringify({ otpId, email }) + \"\\n\");\n process.stderr.write(\"Non-interactive mode. To complete binding, verify the OTP\\n\");\n process.stderr.write(\"and call the Turnkey update_user_email API with the verificationToken.\\n\");\n return;\n }\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stderr });\n const code = await rl.question(\"Enter verification code: \");\n rl.close();\n if (!code?.trim()) throw new Error(\"Verification code required.\");\n\n process.stderr.write(\"Verifying...\\n\");\n const { verificationToken } = await otpVerify(otpId, code.trim(), config.turnkey.publicKeyHex, configId);\n\n process.stderr.write(\"Binding email to Turnkey wallet...\\n\");\n await updateTurnkeyUserEmail(email, verificationToken, config.turnkey);\n\n process.stdout.write(`Email ${email} bound successfully.\\n`);\n process.stdout.write(\"You can now use this email for account recovery.\\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","getWalletMode","getEvmAddress","getPricing","program","readline","program","createWallet","loadConfig","getWalletMode","program","createSign","existsSync","mkdirSync","readFileSync","writeFileSync","join","readline","program","createSign","rl","program"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chainstream-io/cli",
3
- "version": "0.0.3",
3
+ "version": "0.0.5",
4
4
  "description": "ChainStream CLI — on-chain data and DeFi execution for AI agents",
5
5
  "type": "module",
6
6
  "bin": {
@@ -43,6 +43,8 @@
43
43
  "@chainstream-io/sdk": "latest",
44
44
  "@scure/base": "^2.0.0",
45
45
  "@solana/web3.js": "^1.98.4",
46
+ "@turnkey/sdk-server": "^5.1.1",
47
+ "@turnkey/viem": "^0.14.26",
46
48
  "@x402/core": "^2.7.0",
47
49
  "@x402/evm": "^2.7.0",
48
50
  "@x402/fetch": "^2.7.0",