@cavos/cli 0.0.7 → 0.1.0

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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @cavos/cli
2
2
 
3
- **Cavos CLI** is the ultimate toolkit for AI Agents to interact with Starknet. It provides a session-key based wallet interface designed for both human manual use and autonomous agent execution.
3
+ **Cavos CLI** is the ultimate toolkit for AI Agents to interact with Starknet (Mainnet). It provides a session-key based wallet interface designed for both human manual use and autonomous agent execution.
4
4
 
5
5
  ## Features
6
6
 
@@ -31,7 +31,7 @@ Before acting, you need a session token. You can generate one from your Cavos Da
31
31
 
32
32
  1. **Import Session:**
33
33
  ```bash
34
- cavos session import "eyJhbG..." --app-id "YOUR_APP_ID"
34
+ cavos session import "eyJhbG..."
35
35
  ```
36
36
 
37
37
  2. **Verify Status:**
package/dist/cli.js CHANGED
@@ -1515,20 +1515,19 @@ var tools_default = [
1515
1515
 
1516
1516
  // src/cli.ts
1517
1517
  var program = new import_commander.Command();
1518
- program.name("cavos").description("Cavos CLI \u2014 AI agent wallet toolkit for Starknet").version("0.0.7");
1518
+ program.name("cavos").description("Cavos CLI \u2014 AI agent wallet toolkit for Starknet").version("0.1.0");
1519
1519
  var DEFAULT_APP_ID = "0c3ff58a-1968-41c2-b0e0-a5c47309e77d";
1520
- var DEFAULT_NETWORK = "mainnet";
1521
1520
  function getAgent(opts) {
1522
1521
  const config = loadConfig();
1523
1522
  const appId = opts.appId || config.defaultAppId || process.env.CAVOS_APP_ID || DEFAULT_APP_ID;
1524
- const network = opts.network || config.network || process.env.CAVOS_NETWORK || DEFAULT_NETWORK;
1523
+ const network = "mainnet";
1525
1524
  const policy2 = loadPolicy();
1526
1525
  return new CavosAgent({ appId, network, policy: policy2 });
1527
1526
  }
1528
- function resolveToken(symbol, network) {
1529
- if (!symbol) return network === "mainnet" ? TOKENS_MAINNET.STRK : TOKENS_SEPOLIA.STRK;
1527
+ function resolveToken(symbol) {
1528
+ if (!symbol) return TOKENS_MAINNET.STRK;
1530
1529
  const upper = symbol.toUpperCase();
1531
- const tokens = network === "mainnet" ? TOKENS_MAINNET : TOKENS_SEPOLIA;
1530
+ const tokens = TOKENS_MAINNET;
1532
1531
  if (upper === "STRK") return tokens.STRK;
1533
1532
  if (upper === "ETH") return tokens.ETH;
1534
1533
  return symbol;
@@ -1571,7 +1570,7 @@ async function waitForTx(agent, txHash, timeoutMs = 12e4) {
1571
1570
  }
1572
1571
  throw new Error(`Transaction confirmation timeout after ${timeoutMs / 1e3}s`);
1573
1572
  }
1574
- program.command("whoami").description("Show current session info").option("--app-id <appId>", "App ID").option("--network <network>", "Network").option("--json", "Output as JSON").action(async (opts) => {
1573
+ program.command("whoami").description("Show current session info").option("--app-id <appId>", "App ID").option("--json", "Output as JSON").action(async (opts) => {
1575
1574
  try {
1576
1575
  const agent = getAgent(opts);
1577
1576
  const mode = process.env.CAVOS_TOKEN || process.env.CAVOS_SESSION_TOKEN ? "env" : "disk";
@@ -1608,13 +1607,11 @@ program.command("whoami").description("Show current session info").option("--app
1608
1607
  outError(opts.json, err.message);
1609
1608
  }
1610
1609
  });
1611
- program.command("transfer").description("Transfer ERC-20 tokens").requiredOption("--to <address>", "Recipient address").requiredOption("--amount <amount>", "Amount in human-readable units (e.g. 1.5)").option("--token <token>", "Token symbol (STRK, ETH) or address", "STRK").option("--app-id <appId>", "App ID").option("--network <network>", "Network").option("--wait", "Wait for on-chain confirmation").option("--json", "Output as JSON").action(async (opts) => {
1610
+ program.command("transfer").description("Transfer ERC-20 tokens").requiredOption("--to <address>", "Recipient address").requiredOption("--amount <amount>", "Amount in human-readable units (e.g. 1.5)").option("--token <token>", "Token symbol (STRK, ETH) or address", "STRK").option("--app-id <appId>", "App ID").option("--wait", "Wait for on-chain confirmation").option("--json", "Output as JSON").action(async (opts) => {
1612
1611
  try {
1613
1612
  const agent = getAgent(opts);
1614
1613
  if (!agent.isAuthenticated()) outError(opts.json, "No session. Import one: cavos session import <token>", "NoSession");
1615
- const config = loadConfig();
1616
- const network = opts.network || config.network || DEFAULT_NETWORK;
1617
- const tokenAddress = resolveToken(opts.token, network);
1614
+ const tokenAddress = resolveToken(opts.token);
1618
1615
  const amount = BigInt(Math.floor(parseFloat(opts.amount) * 1e18));
1619
1616
  if (!opts.json) console.log(`Transferring ${opts.amount} ${opts.token} to ${opts.to}...`);
1620
1617
  const txHash = await agent.transfer(tokenAddress, opts.to, amount);
@@ -1622,7 +1619,7 @@ program.command("transfer").description("Transfer ERC-20 tokens").requiredOption
1622
1619
  if (!opts.json) console.log("Waiting for confirmation...");
1623
1620
  await waitForTx(agent, txHash);
1624
1621
  }
1625
- const explorerBase = network === "mainnet" ? "https://voyager.online/tx" : "https://sepolia.voyager.online/tx";
1622
+ const explorerBase = "https://voyager.online/tx";
1626
1623
  out(opts.json, { status: "ok", transaction_hash: txHash, explorer: `${explorerBase}/${txHash}` }, () => {
1627
1624
  console.log(`Transaction: ${txHash}`);
1628
1625
  console.log(`Explorer: ${explorerBase}/${txHash}`);
@@ -1631,13 +1628,11 @@ program.command("transfer").description("Transfer ERC-20 tokens").requiredOption
1631
1628
  outError(opts.json, err.message, "TransferFailed");
1632
1629
  }
1633
1630
  });
1634
- program.command("approve").description("Approve ERC-20 spending").requiredOption("--spender <address>", "Spender address").requiredOption("--amount <amount>", "Amount in human-readable units").option("--token <token>", "Token symbol or address", "STRK").option("--app-id <appId>", "App ID").option("--network <network>", "Network").option("--wait", "Wait for on-chain confirmation").option("--json", "Output as JSON").action(async (opts) => {
1631
+ program.command("approve").description("Approve ERC-20 spending").requiredOption("--spender <address>", "Spender address").requiredOption("--amount <amount>", "Amount in human-readable units").option("--token <token>", "Token symbol or address", "STRK").option("--app-id <appId>", "App ID").option("--wait", "Wait for on-chain confirmation").option("--json", "Output as JSON").action(async (opts) => {
1635
1632
  try {
1636
1633
  const agent = getAgent(opts);
1637
1634
  if (!agent.isAuthenticated()) outError(opts.json, "No session. Import one: cavos session import <token>", "NoSession");
1638
- const config = loadConfig();
1639
- const network = opts.network || config.network || DEFAULT_NETWORK;
1640
- const tokenAddress = resolveToken(opts.token, network);
1635
+ const tokenAddress = resolveToken(opts.token);
1641
1636
  const amount = BigInt(Math.floor(parseFloat(opts.amount) * 1e18));
1642
1637
  if (!opts.json) console.log(`Approving ${opts.amount} ${opts.token} for ${opts.spender}...`);
1643
1638
  const txHash = await agent.approve(tokenAddress, opts.spender, amount);
@@ -1645,7 +1640,7 @@ program.command("approve").description("Approve ERC-20 spending").requiredOption
1645
1640
  if (!opts.json) console.log("Waiting for confirmation...");
1646
1641
  await waitForTx(agent, txHash);
1647
1642
  }
1648
- const explorerBase = network === "mainnet" ? "https://voyager.online/tx" : "https://sepolia.voyager.online/tx";
1643
+ const explorerBase = "https://voyager.online/tx";
1649
1644
  out(opts.json, { status: "ok", transaction_hash: txHash, explorer: `${explorerBase}/${txHash}` }, () => {
1650
1645
  console.log(`Transaction: ${txHash}`);
1651
1646
  console.log(`Explorer: ${explorerBase}/${txHash}`);
@@ -1654,20 +1649,18 @@ program.command("approve").description("Approve ERC-20 spending").requiredOption
1654
1649
  outError(opts.json, err.message, "ApproveFailed");
1655
1650
  }
1656
1651
  });
1657
- program.command("execute").description("Execute a raw contract call").requiredOption("--contract <address>", "Contract address").requiredOption("--entrypoint <name>", "Entrypoint name").option("--calldata <data>", "Comma-separated calldata values").option("--app-id <appId>", "App ID").option("--network <network>", "Network").option("--wait", "Wait for on-chain confirmation").option("--json", "Output as JSON").action(async (opts) => {
1652
+ program.command("execute").description("Execute a raw contract call").requiredOption("--contract <address>", "Contract address").requiredOption("--entrypoint <name>", "Entrypoint name").option("--calldata <data>", "Comma-separated calldata values").option("--app-id <appId>", "App ID").option("--wait", "Wait for on-chain confirmation").option("--json", "Output as JSON").action(async (opts) => {
1658
1653
  try {
1659
1654
  const agent = getAgent(opts);
1660
1655
  if (!agent.isAuthenticated()) outError(opts.json, "No session. Import one: cavos session import <token>", "NoSession");
1661
1656
  const calldata = opts.calldata ? opts.calldata.split(",").map((s) => s.trim()) : [];
1662
- const config = loadConfig();
1663
- const network = opts.network || config.network || DEFAULT_NETWORK;
1664
1657
  if (!opts.json) console.log(`Executing ${opts.entrypoint} on ${opts.contract}...`);
1665
1658
  const txHash = await agent.execute({ contractAddress: opts.contract, entrypoint: opts.entrypoint, calldata });
1666
1659
  if (opts.wait) {
1667
1660
  if (!opts.json) console.log("Waiting for confirmation...");
1668
1661
  await waitForTx(agent, txHash);
1669
1662
  }
1670
- const explorerBase = network === "mainnet" ? "https://voyager.online/tx" : "https://sepolia.voyager.online/tx";
1663
+ const explorerBase = "https://voyager.online/tx";
1671
1664
  out(opts.json, { status: "ok", transaction_hash: txHash, explorer: `${explorerBase}/${txHash}` }, () => {
1672
1665
  console.log(`Transaction: ${txHash}`);
1673
1666
  console.log(`Explorer: ${explorerBase}/${txHash}`);
@@ -1676,7 +1669,7 @@ program.command("execute").description("Execute a raw contract call").requiredOp
1676
1669
  outError(opts.json, err.message, "ExecuteFailed");
1677
1670
  }
1678
1671
  });
1679
- program.command("multicall").description("Execute multiple contract calls in one transaction").requiredOption("--calls <json>", 'JSON array of calls: [{"contractAddress":"0x...","entrypoint":"fn","calldata":["0x..."]}]').option("--app-id <appId>", "App ID").option("--network <network>", "Network").option("--wait", "Wait for on-chain confirmation").option("--json", "Output as JSON").action(async (opts) => {
1672
+ program.command("multicall").description("Execute multiple contract calls in one transaction").requiredOption("--calls <json>", 'JSON array of calls: [{"contractAddress":"0x...","entrypoint":"fn","calldata":["0x..."]}]').option("--app-id <appId>", "App ID").option("--wait", "Wait for on-chain confirmation").option("--json", "Output as JSON").action(async (opts) => {
1680
1673
  try {
1681
1674
  const agent = getAgent(opts);
1682
1675
  if (!agent.isAuthenticated()) outError(opts.json, "No session. Import one: cavos session import <token>", "NoSession");
@@ -1688,15 +1681,13 @@ program.command("multicall").description("Execute multiple contract calls in one
1688
1681
  outError(opts.json, `Invalid --calls JSON: ${e.message}`, "InvalidInput");
1689
1682
  return;
1690
1683
  }
1691
- const config = loadConfig();
1692
- const network = opts.network || config.network || DEFAULT_NETWORK;
1693
1684
  if (!opts.json) console.log(`Executing ${calls.length} calls...`);
1694
1685
  const txHash = await agent.execute(calls);
1695
1686
  if (opts.wait) {
1696
1687
  if (!opts.json) console.log("Waiting for confirmation...");
1697
1688
  await waitForTx(agent, txHash);
1698
1689
  }
1699
- const explorerBase = network === "mainnet" ? "https://voyager.online/tx" : "https://sepolia.voyager.online/tx";
1690
+ const explorerBase = "https://voyager.online/tx";
1700
1691
  out(opts.json, { status: "ok", transaction_hash: txHash, call_count: calls.length, explorer: `${explorerBase}/${txHash}` }, () => {
1701
1692
  console.log(`Transaction: ${txHash}`);
1702
1693
  console.log(`Explorer: ${explorerBase}/${txHash}`);
@@ -1705,7 +1696,7 @@ program.command("multicall").description("Execute multiple contract calls in one
1705
1696
  outError(opts.json, err.message, "MulticallFailed");
1706
1697
  }
1707
1698
  });
1708
- program.command("deploy").description("Deploy the account contract").option("--app-id <appId>", "App ID").option("--network <network>", "Network").option("--json", "Output as JSON").action(async (opts) => {
1699
+ program.command("deploy").description("Deploy the account contract").option("--app-id <appId>", "App ID").option("--json", "Output as JSON").action(async (opts) => {
1709
1700
  try {
1710
1701
  const agent = getAgent(opts);
1711
1702
  if (!agent.isAuthenticated()) outError(opts.json, "No session. Import one: cavos session import <token>", "NoSession");
@@ -1724,15 +1715,13 @@ program.command("deploy").description("Deploy the account contract").option("--a
1724
1715
  outError(opts.json, err.message, "DeployFailed");
1725
1716
  }
1726
1717
  });
1727
- program.command("balance").description("Show token balance").option("--token <token>", "Token symbol or address").option("--app-id <appId>", "App ID").option("--network <network>", "Network").option("--json", "Output as JSON").action(async (opts) => {
1718
+ program.command("balance").description("Show token balance").option("--token <token>", "Token symbol or address").option("--app-id <appId>", "App ID").option("--json", "Output as JSON").action(async (opts) => {
1728
1719
  try {
1729
1720
  const agent = getAgent(opts);
1730
1721
  if (!agent.isAuthenticated()) outError(opts.json, "No session. Import one: cavos session import <token>", "NoSession");
1731
- const config = loadConfig();
1732
- const network = opts.network || config.network || DEFAULT_NETWORK;
1733
- const tokens = network === "mainnet" ? TOKENS_MAINNET : TOKENS_SEPOLIA;
1722
+ const tokens = TOKENS_MAINNET;
1734
1723
  if (opts.token) {
1735
- const tokenAddress = resolveToken(opts.token, network);
1724
+ const tokenAddress = resolveToken(opts.token);
1736
1725
  const balance = await agent.getBalance(tokenAddress);
1737
1726
  out(opts.json, { status: "ok", token: opts.token, balance: formatBalance(balance), raw: balance.toString() }, () => {
1738
1727
  console.log(`${opts.token}: ${formatBalance(balance)}`);
@@ -1754,7 +1743,7 @@ program.command("balance").description("Show token balance").option("--token <to
1754
1743
  outError(opts.json, err.message);
1755
1744
  }
1756
1745
  });
1757
- program.command("session-status").description("Show on-chain session status").option("--app-id <appId>", "App ID").option("--network <network>", "Network").option("--json", "Output as JSON").action(async (opts) => {
1746
+ program.command("session-status").description("Show on-chain session status").option("--app-id <appId>", "App ID").option("--json", "Output as JSON").action(async (opts) => {
1758
1747
  try {
1759
1748
  const agent = getAgent(opts);
1760
1749
  if (!agent.isAuthenticated()) outError(opts.json, "No session. Import one: cavos session import <token>", "NoSession");
@@ -1778,7 +1767,7 @@ program.command("session-status").description("Show on-chain session status").op
1778
1767
  }
1779
1768
  });
1780
1769
  var session = program.command("session").description("Manage agent sessions");
1781
- session.command("import").description("Import an agent session token provisioned from the Dashboard").argument("<token>", "Base64 encoded session token").option("--app-id <appId>", "App ID to associate with this session").option("--network <network>", "Network (mainnet | sepolia)").option("--json", "Output as JSON").action((token, opts) => {
1770
+ session.command("import").description("Import an agent session token provisioned from the Dashboard").argument("<token>", "Base64 encoded session token").option("--app-id <appId>", "App ID to associate with this session").option("--json", "Output as JSON").action((token, opts) => {
1782
1771
  try {
1783
1772
  const decoded = Buffer.from(token, "base64").toString();
1784
1773
  const sessionData = JSON.parse(decoded);
@@ -1787,12 +1776,10 @@ session.command("import").description("Import an agent session token provisioned
1787
1776
  }
1788
1777
  const config = loadConfig();
1789
1778
  const appId = opts.appId || config.defaultAppId || DEFAULT_APP_ID;
1790
- const network = opts.network || config.network || DEFAULT_NETWORK;
1791
1779
  saveSession(appId, sessionData);
1792
- saveConfig({ defaultAppId: appId, network });
1793
- out(opts.json, { status: "ok", address: sessionData.walletAddress, app_id: appId, network }, () => {
1780
+ saveConfig({ defaultAppId: appId });
1781
+ out(opts.json, { status: "ok", address: sessionData.walletAddress, app_id: appId }, () => {
1794
1782
  console.log(`Session imported: ${sessionData.walletAddress}`);
1795
- console.log(`App ID: ${appId} | Network: ${network}`);
1796
1783
  });
1797
1784
  } catch (err) {
1798
1785
  if (opts.json) {
@@ -1802,7 +1789,7 @@ session.command("import").description("Import an agent session token provisioned
1802
1789
  }
1803
1790
  }
1804
1791
  });
1805
- program.command("revoke-session").description("Revoke a session key (requires active session)").option("--key <sessionKey>", "Specific session key to revoke (defaults to current)").option("--app-id <appId>", "App ID").option("--network <network>", "Network").option("--json", "Output as JSON").action(async (opts) => {
1792
+ program.command("revoke-session").description("Revoke a session key (requires active session)").option("--key <sessionKey>", "Specific session key to revoke (defaults to current)").option("--app-id <appId>", "App ID").option("--json", "Output as JSON").action(async (opts) => {
1806
1793
  try {
1807
1794
  const agent = getAgent(opts);
1808
1795
  if (!agent.isAuthenticated()) outError(opts.json, "No session. Import one: cavos session import <token>", "NoSession");
@@ -1816,7 +1803,7 @@ program.command("revoke-session").description("Revoke a session key (requires ac
1816
1803
  outError(opts.json, err.message, code);
1817
1804
  }
1818
1805
  });
1819
- program.command("emergency-revoke").description("Emergency revoke all sessions").option("--app-id <appId>", "App ID").option("--network <network>", "Network").option("--json", "Output as JSON").action(async (opts) => {
1806
+ program.command("emergency-revoke").description("Emergency revoke all sessions").option("--app-id <appId>", "App ID").option("--json", "Output as JSON").action(async (opts) => {
1820
1807
  try {
1821
1808
  const agent = getAgent(opts);
1822
1809
  if (!agent.isAuthenticated()) outError(opts.json, "No session. Import one: cavos session import <token>", "NoSession");
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/CavosAgent.ts","../src/core/SessionKeyManager.ts","../src/utils/crypto.ts","../src/utils/encoding.ts","../src/core/MerkleTree.ts","../src/utils/constants.ts","../src/core/NonceManager.ts","../src/core/AddressSeedManager.ts","../src/core/TransactionManager.ts","../src/auth/FirebaseAuth.ts","../src/storage/FileStorage.ts","../src/utils/tools.json"],"sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport { CavosAgent } from './CavosAgent';\nimport { loadConfig, saveConfig, saveSession, loadPolicy, savePolicy } from './storage/FileStorage';\nimport { TOKENS_SEPOLIA, TOKENS_MAINNET } from './utils/constants';\nimport toolsSchema from './utils/tools.json';\n\nconst program = new Command();\n\nprogram\n .name('cavos')\n .description('Cavos CLI — AI agent wallet toolkit for Starknet')\n .version('0.0.7');\n\nconst DEFAULT_APP_ID = '0c3ff58a-1968-41c2-b0e0-a5c47309e77d';\nconst DEFAULT_NETWORK = 'mainnet' as const;\n\nfunction getAgent(opts: { appId?: string; network?: string }): CavosAgent {\n const config = loadConfig();\n const appId = (opts.appId || config.defaultAppId || process.env.CAVOS_APP_ID || DEFAULT_APP_ID) as string;\n const network = (opts.network || config.network || process.env.CAVOS_NETWORK || DEFAULT_NETWORK) as 'mainnet' | 'sepolia';\n const policy = loadPolicy();\n return new CavosAgent({ appId, network, policy });\n}\n\nfunction resolveToken(symbol: string | undefined, network: 'mainnet' | 'sepolia'): string {\n if (!symbol) return network === 'mainnet' ? TOKENS_MAINNET.STRK : TOKENS_SEPOLIA.STRK;\n const upper = symbol.toUpperCase();\n const tokens = network === 'mainnet' ? TOKENS_MAINNET : TOKENS_SEPOLIA;\n if (upper === 'STRK') return tokens.STRK;\n if (upper === 'ETH') return tokens.ETH;\n return symbol;\n}\n\nfunction formatBalance(raw: bigint, decimals: number = 18): string {\n const whole = raw / BigInt(10 ** decimals);\n const remainder = raw % BigInt(10 ** decimals);\n const fractional = remainder.toString().padStart(decimals, '0').slice(0, 6);\n return `${whole}.${fractional}`;\n}\n\n/** Output helper: prints JSON if --json, else calls humanFn */\nfunction out(json: boolean, data: object, humanFn: () => void): void {\n if (json) {\n console.log(JSON.stringify(data, null, 2));\n } else {\n humanFn();\n }\n}\n\n/** Error output helper */\nfunction outError(json: boolean, message: string, code: string = 'Error'): void {\n if (json) {\n console.error(JSON.stringify({ status: 'error', error_code: code, message }));\n } else {\n console.error(`${code}: ${message}`);\n }\n process.exit(1);\n}\n\n/** Wait for a transaction to be confirmed on-chain */\nasync function waitForTx(agent: CavosAgent, txHash: string, timeoutMs = 120000): Promise<void> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n try {\n const receipt = await (agent as any).provider.getTransactionReceipt(txHash);\n if (receipt) {\n const status = (receipt as any).execution_status || (receipt as any).finality_status || (receipt as any).status;\n if (status === 'SUCCEEDED' || status === 'ACCEPTED_ON_L2' || status === 'ACCEPTED_ON_L1') return;\n if (status === 'REVERTED') throw new Error(`Transaction ${txHash} was reverted`);\n }\n } catch (e: any) {\n if (e.message?.includes('reverted')) throw e;\n }\n await new Promise(r => setTimeout(r, 3000));\n }\n throw new Error(`Transaction confirmation timeout after ${timeoutMs / 1000}s`);\n}\n\n// ============ Info Commands ============\n\nprogram\n .command('whoami')\n .description('Show current session info')\n .option('--app-id <appId>', 'App ID')\n .option('--network <network>', 'Network')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n const mode = (process.env.CAVOS_TOKEN || process.env.CAVOS_SESSION_TOKEN) ? 'env' : 'disk';\n\n if (!agent.isAuthenticated()) {\n out(opts.json, { status: 'unauthenticated', mode }, () => {\n console.log('Status: Not authenticated.');\n });\n return;\n }\n\n const address = agent.getAddress();\n const deployed = await agent.isDeployed();\n let sessionInfo: object = { registered: false };\n\n if (deployed) {\n const s = await agent.getSessionStatus();\n sessionInfo = {\n registered: s.registered,\n expired: s.expired,\n can_renew: s.canRenew,\n valid_until: s.validUntil ? new Date(Number(s.validUntil) * 1000).toISOString() : null,\n renewal_deadline: s.renewalDeadline ? new Date(Number(s.renewalDeadline) * 1000).toISOString() : null,\n };\n }\n\n out(opts.json, { status: 'ok', mode, address, deployed, session: sessionInfo }, () => {\n console.log(`Mode: ${mode}`);\n console.log(`Address: ${address}`);\n console.log(`Deployed: ${deployed ? 'Yes' : 'No'}`);\n if (deployed) {\n const s = sessionInfo as any;\n console.log(`Session: ${s.registered ? (s.expired ? (s.can_renew ? 'Renewable' : 'Expired') : 'Active') : 'Not registered'}`);\n if (s.valid_until) console.log(`Valid until: ${s.valid_until}`);\n }\n });\n } catch (err: any) {\n outError(opts.json, err.message);\n }\n });\n\n// ============ Transaction Commands ============\n\nprogram\n .command('transfer')\n .description('Transfer ERC-20 tokens')\n .requiredOption('--to <address>', 'Recipient address')\n .requiredOption('--amount <amount>', 'Amount in human-readable units (e.g. 1.5)')\n .option('--token <token>', 'Token symbol (STRK, ETH) or address', 'STRK')\n .option('--app-id <appId>', 'App ID')\n .option('--network <network>', 'Network')\n .option('--wait', 'Wait for on-chain confirmation')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n if (!agent.isAuthenticated()) outError(opts.json, 'No session. Import one: cavos session import <token>', 'NoSession');\n\n const config = loadConfig();\n const network = (opts.network || config.network || DEFAULT_NETWORK) as 'mainnet' | 'sepolia';\n const tokenAddress = resolveToken(opts.token, network);\n const amount = BigInt(Math.floor(parseFloat(opts.amount) * 1e18));\n\n if (!opts.json) console.log(`Transferring ${opts.amount} ${opts.token} to ${opts.to}...`);\n const txHash = await agent.transfer(tokenAddress, opts.to, amount);\n\n if (opts.wait) {\n if (!opts.json) console.log('Waiting for confirmation...');\n await waitForTx(agent, txHash);\n }\n\n const explorerBase = network === 'mainnet' ? 'https://voyager.online/tx' : 'https://sepolia.voyager.online/tx';\n out(opts.json, { status: 'ok', transaction_hash: txHash, explorer: `${explorerBase}/${txHash}` }, () => {\n console.log(`Transaction: ${txHash}`);\n console.log(`Explorer: ${explorerBase}/${txHash}`);\n });\n } catch (err: any) {\n outError(opts.json, err.message, 'TransferFailed');\n }\n });\n\nprogram\n .command('approve')\n .description('Approve ERC-20 spending')\n .requiredOption('--spender <address>', 'Spender address')\n .requiredOption('--amount <amount>', 'Amount in human-readable units')\n .option('--token <token>', 'Token symbol or address', 'STRK')\n .option('--app-id <appId>', 'App ID')\n .option('--network <network>', 'Network')\n .option('--wait', 'Wait for on-chain confirmation')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n if (!agent.isAuthenticated()) outError(opts.json, 'No session. Import one: cavos session import <token>', 'NoSession');\n\n const config = loadConfig();\n const network = (opts.network || config.network || DEFAULT_NETWORK) as 'mainnet' | 'sepolia';\n const tokenAddress = resolveToken(opts.token, network);\n const amount = BigInt(Math.floor(parseFloat(opts.amount) * 1e18));\n\n if (!opts.json) console.log(`Approving ${opts.amount} ${opts.token} for ${opts.spender}...`);\n const txHash = await agent.approve(tokenAddress, opts.spender, amount);\n\n if (opts.wait) {\n if (!opts.json) console.log('Waiting for confirmation...');\n await waitForTx(agent, txHash);\n }\n\n const explorerBase = network === 'mainnet' ? 'https://voyager.online/tx' : 'https://sepolia.voyager.online/tx';\n out(opts.json, { status: 'ok', transaction_hash: txHash, explorer: `${explorerBase}/${txHash}` }, () => {\n console.log(`Transaction: ${txHash}`);\n console.log(`Explorer: ${explorerBase}/${txHash}`);\n });\n } catch (err: any) {\n outError(opts.json, err.message, 'ApproveFailed');\n }\n });\n\nprogram\n .command('execute')\n .description('Execute a raw contract call')\n .requiredOption('--contract <address>', 'Contract address')\n .requiredOption('--entrypoint <name>', 'Entrypoint name')\n .option('--calldata <data>', 'Comma-separated calldata values')\n .option('--app-id <appId>', 'App ID')\n .option('--network <network>', 'Network')\n .option('--wait', 'Wait for on-chain confirmation')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n if (!agent.isAuthenticated()) outError(opts.json, 'No session. Import one: cavos session import <token>', 'NoSession');\n\n const calldata = opts.calldata ? opts.calldata.split(',').map((s: string) => s.trim()) : [];\n const config = loadConfig();\n const network = (opts.network || config.network || DEFAULT_NETWORK) as 'mainnet' | 'sepolia';\n\n if (!opts.json) console.log(`Executing ${opts.entrypoint} on ${opts.contract}...`);\n const txHash = await agent.execute({ contractAddress: opts.contract, entrypoint: opts.entrypoint, calldata });\n\n if (opts.wait) {\n if (!opts.json) console.log('Waiting for confirmation...');\n await waitForTx(agent, txHash);\n }\n\n const explorerBase = network === 'mainnet' ? 'https://voyager.online/tx' : 'https://sepolia.voyager.online/tx';\n out(opts.json, { status: 'ok', transaction_hash: txHash, explorer: `${explorerBase}/${txHash}` }, () => {\n console.log(`Transaction: ${txHash}`);\n console.log(`Explorer: ${explorerBase}/${txHash}`);\n });\n } catch (err: any) {\n outError(opts.json, err.message, 'ExecuteFailed');\n }\n });\n\nprogram\n .command('multicall')\n .description('Execute multiple contract calls in one transaction')\n .requiredOption('--calls <json>', 'JSON array of calls: [{\"contractAddress\":\"0x...\",\"entrypoint\":\"fn\",\"calldata\":[\"0x...\"]}]')\n .option('--app-id <appId>', 'App ID')\n .option('--network <network>', 'Network')\n .option('--wait', 'Wait for on-chain confirmation')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n if (!agent.isAuthenticated()) outError(opts.json, 'No session. Import one: cavos session import <token>', 'NoSession');\n\n let calls: any[];\n try {\n calls = JSON.parse(opts.calls);\n if (!Array.isArray(calls) || calls.length === 0) throw new Error('calls must be a non-empty JSON array');\n } catch (e: any) {\n outError(opts.json, `Invalid --calls JSON: ${e.message}`, 'InvalidInput');\n return;\n }\n\n const config = loadConfig();\n const network = (opts.network || config.network || DEFAULT_NETWORK) as 'mainnet' | 'sepolia';\n\n if (!opts.json) console.log(`Executing ${calls.length} calls...`);\n const txHash = await agent.execute(calls);\n\n if (opts.wait) {\n if (!opts.json) console.log('Waiting for confirmation...');\n await waitForTx(agent, txHash);\n }\n\n const explorerBase = network === 'mainnet' ? 'https://voyager.online/tx' : 'https://sepolia.voyager.online/tx';\n out(opts.json, { status: 'ok', transaction_hash: txHash, call_count: calls.length, explorer: `${explorerBase}/${txHash}` }, () => {\n console.log(`Transaction: ${txHash}`);\n console.log(`Explorer: ${explorerBase}/${txHash}`);\n });\n } catch (err: any) {\n outError(opts.json, err.message, 'MulticallFailed');\n }\n });\n\nprogram\n .command('deploy')\n .description('Deploy the account contract')\n .option('--app-id <appId>', 'App ID')\n .option('--network <network>', 'Network')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n if (!agent.isAuthenticated()) outError(opts.json, 'No session. Import one: cavos session import <token>', 'NoSession');\n\n if (!opts.json) console.log('Deploying account...');\n const result = await agent.deploy();\n\n if (result === 'already-deployed') {\n out(opts.json, { status: 'ok', deployed: true, message: 'Account already deployed' }, () => {\n console.log('Account is already deployed.');\n });\n } else {\n out(opts.json, { status: 'ok', deployed: true, transaction_hash: result }, () => {\n console.log(`Deployed: ${result}`);\n });\n }\n } catch (err: any) {\n outError(opts.json, err.message, 'DeployFailed');\n }\n });\n\n// ============ Query Commands ============\n\nprogram\n .command('balance')\n .description('Show token balance')\n .option('--token <token>', 'Token symbol or address')\n .option('--app-id <appId>', 'App ID')\n .option('--network <network>', 'Network')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n if (!agent.isAuthenticated()) outError(opts.json, 'No session. Import one: cavos session import <token>', 'NoSession');\n\n const config = loadConfig();\n const network = (opts.network || config.network || DEFAULT_NETWORK) as 'mainnet' | 'sepolia';\n const tokens = network === 'mainnet' ? TOKENS_MAINNET : TOKENS_SEPOLIA;\n\n if (opts.token) {\n const tokenAddress = resolveToken(opts.token, network);\n const balance = await agent.getBalance(tokenAddress);\n out(opts.json, { status: 'ok', token: opts.token, balance: formatBalance(balance), raw: balance.toString() }, () => {\n console.log(`${opts.token}: ${formatBalance(balance)}`);\n });\n } else {\n const [ethBal, strkBal] = await Promise.all([agent.getBalance(tokens.ETH), agent.getBalance(tokens.STRK)]);\n out(opts.json, {\n status: 'ok',\n balances: {\n ETH: { balance: formatBalance(ethBal), raw: ethBal.toString() },\n STRK: { balance: formatBalance(strkBal), raw: strkBal.toString() },\n }\n }, () => {\n console.log(`ETH: ${formatBalance(ethBal)}`);\n console.log(`STRK: ${formatBalance(strkBal)}`);\n });\n }\n } catch (err: any) {\n outError(opts.json, err.message);\n }\n });\n\nprogram\n .command('session-status')\n .description('Show on-chain session status')\n .option('--app-id <appId>', 'App ID')\n .option('--network <network>', 'Network')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n if (!agent.isAuthenticated()) outError(opts.json, 'No session. Import one: cavos session import <token>', 'NoSession');\n\n const s = await agent.getSessionStatus();\n const state = !s.registered ? 'not_registered' : s.expired ? (s.canRenew ? 'renewable' : 'expired') : 'active';\n\n out(opts.json, {\n status: 'ok',\n state,\n registered: s.registered,\n expired: s.expired,\n can_renew: s.canRenew,\n valid_until: s.validUntil ? new Date(Number(s.validUntil) * 1000).toISOString() : null,\n renewal_deadline: s.renewalDeadline ? new Date(Number(s.renewalDeadline) * 1000).toISOString() : null,\n }, () => {\n console.log(`State: ${state}`);\n if (s.validUntil) console.log(`Valid until: ${new Date(Number(s.validUntil) * 1000).toISOString()}`);\n if (s.renewalDeadline) console.log(`Renewal deadline: ${new Date(Number(s.renewalDeadline) * 1000).toISOString()}`);\n });\n } catch (err: any) {\n outError(opts.json, err.message);\n }\n });\n\n// ============ Session Commands ============\n\nconst session = program.command('session').description('Manage agent sessions');\n\nsession\n .command('import')\n .description('Import an agent session token provisioned from the Dashboard')\n .argument('<token>', 'Base64 encoded session token')\n .option('--app-id <appId>', 'App ID to associate with this session')\n .option('--network <network>', 'Network (mainnet | sepolia)')\n .option('--json', 'Output as JSON')\n .action((token, opts) => {\n try {\n const decoded = Buffer.from(token, 'base64').toString();\n const sessionData = JSON.parse(decoded);\n\n if (!sessionData.walletAddress || !sessionData.sessionPrivateKey) {\n throw new Error('Invalid session token format.');\n }\n\n const config = loadConfig();\n const appId = opts.appId || config.defaultAppId || DEFAULT_APP_ID;\n const network = opts.network || config.network || DEFAULT_NETWORK;\n\n saveSession(appId, sessionData);\n saveConfig({ defaultAppId: appId, network });\n\n out(opts.json, { status: 'ok', address: sessionData.walletAddress, app_id: appId, network }, () => {\n console.log(`Session imported: ${sessionData.walletAddress}`);\n console.log(`App ID: ${appId} | Network: ${network}`);\n });\n } catch (err: any) {\n if (opts.json) {\n console.error(JSON.stringify({ status: 'error', error_code: 'ImportFailed', message: err.message }));\n } else {\n console.error(`Import failed: ${err.message}`);\n }\n }\n });\n\n// ============ Security Commands ============\n\nprogram\n .command('revoke-session')\n .description('Revoke a session key (requires active session)')\n .option('--key <sessionKey>', 'Specific session key to revoke (defaults to current)')\n .option('--app-id <appId>', 'App ID')\n .option('--network <network>', 'Network')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n if (!agent.isAuthenticated()) outError(opts.json, 'No session. Import one: cavos session import <token>', 'NoSession');\n\n if (!opts.json) console.log('Revoking session...');\n const txHash = await agent.revokeSession(opts.key);\n\n out(opts.json, { status: 'ok', transaction_hash: txHash }, () => {\n console.log(`Session revoked: ${txHash}`);\n });\n } catch (err: any) {\n const code = err.message?.includes('Session not registered') ? 'SessionNotRegistered' : 'RevokeFailed';\n outError(opts.json, err.message, code);\n }\n });\n\nprogram\n .command('emergency-revoke')\n .description('Emergency revoke all sessions')\n .option('--app-id <appId>', 'App ID')\n .option('--network <network>', 'Network')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n if (!agent.isAuthenticated()) outError(opts.json, 'No session. Import one: cavos session import <token>', 'NoSession');\n\n if (!opts.json) console.log('Emergency revoking all sessions...');\n const txHash = await agent.emergencyRevokeAll();\n\n out(opts.json, { status: 'ok', transaction_hash: txHash }, () => {\n console.log(`All sessions revoked: ${txHash}`);\n });\n } catch (err: any) {\n outError(opts.json, err.message, 'EmergencyRevokeFailed');\n }\n });\n\n// ============ Policy Commands ============\n\nconst policy = program.command('policy').description('Manage local spending policies');\n\n\n\npolicy\n .command('show')\n .description('Show the current local policy')\n .option('--json', 'Output as JSON')\n .action((opts) => {\n const p = loadPolicy();\n if (!p || (p.spendingLimits.length === 0 && p.allowedContracts.length === 0)) {\n out(opts.json, { status: 'ok', policy: null, message: 'No local policy defined.' }, () => {\n console.log('No local policy defined. The agent will follow default app constraints.');\n });\n return;\n }\n out(opts.json, {\n status: 'ok',\n policy: {\n spending_limits: p.spendingLimits.map(sl => ({ token: sl.token, limit: formatBalance(sl.limit) })),\n allowed_contracts: p.allowedContracts,\n max_calls_per_tx: p.maxCallsPerTx,\n }\n }, () => {\n console.log('--- Current Local Policy ---');\n console.log('Spending Limits:');\n if (p.spendingLimits.length === 0) console.log(' (None)');\n p.spendingLimits.forEach(sl => console.log(` ${sl.token}: ${formatBalance(sl.limit)}`));\n console.log('\\nAllowed Contracts:');\n if (p.allowedContracts.length === 0) console.log(' (None — all allowed)');\n p.allowedContracts.forEach(addr => console.log(` ${addr}`));\n });\n });\n\n// ============ Tools Commands ============\n\nconst tools = program.command('tools').description('AI Agent tool definitions');\n\ntools\n .command('list')\n .description('List tools in OpenAI-compatible JSON format')\n .action(() => {\n console.log(JSON.stringify(toolsSchema, null, 2));\n });\n\n// ============ Read-Only Commands ============\n\nprogram\n .command('call')\n .description('Call a contract entrypoint (read-only)')\n .requiredOption('--contract <address>', 'Contract address')\n .requiredOption('--entrypoint <name>', 'Entrypoint name')\n .option('--calldata <data>', 'Comma-separated calldata or JSON array', '[]')\n .option('--block <blockId>', 'Block identifier (default: latest)', 'latest')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n let calldata: string[] = [];\n if (opts.calldata.startsWith('[')) {\n calldata = JSON.parse(opts.calldata);\n } else {\n calldata = opts.calldata.split(',').filter((x: string) => x);\n }\n\n const result = await (agent as any).provider.callContract({\n contractAddress: opts.contract,\n entrypoint: opts.entrypoint,\n calldata: calldata,\n }, opts.block);\n\n out(opts.json, { success: true, result }, () => {\n console.log('Result:', result);\n });\n } catch (e: any) {\n outError(opts.json, e.message);\n }\n });\n\nprogram\n .command('simulate')\n .description('Simulate a transaction execution')\n .requiredOption('--contract <address>', 'Contract address')\n .requiredOption('--entrypoint <name>', 'Entrypoint name')\n .option('--calldata <data>', 'Comma-separated calldata or JSON array', '[]')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n let calldata: string[] = [];\n if (opts.calldata.startsWith('[')) {\n calldata = JSON.parse(opts.calldata);\n } else {\n calldata = opts.calldata.split(',').filter((x: string) => x);\n }\n\n // We need an account to simulate\n if (!agent.isAuthenticated()) {\n throw new Error('Authentication required for simulation');\n }\n\n // Access private account property (workaround for private field)\n const account = (agent as any).sessionAccount || (agent as any).account;\n\n const invocation = {\n contractAddress: opts.contract,\n entrypoint: opts.entrypoint,\n calldata: calldata\n };\n\n const simulation = await account.simulateTransaction([invocation]);\n\n out(opts.json, { success: true, simulation }, () => {\n console.log('Simulation Check:', simulation);\n console.log('Logs:', simulation[0].transaction_trace.execution_resources);\n });\n } catch (e: any) {\n outError(opts.json, e.message);\n }\n });\n\nprogram\n .command('estimate')\n .description('Estimate fee for a transaction')\n .requiredOption('--contract <address>', 'Contract address')\n .requiredOption('--entrypoint <name>', 'Entrypoint name')\n .option('--calldata <data>', 'Comma-separated calldata or JSON array', '[]')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n let calldata: string[] = [];\n if (opts.calldata.startsWith('[')) {\n calldata = JSON.parse(opts.calldata);\n } else {\n calldata = opts.calldata.split(',').filter((x: string) => x);\n }\n\n if (!agent.isAuthenticated()) {\n throw new Error('Authentication required for estimation');\n }\n\n const account = (agent as any).sessionAccount || (agent as any).account;\n\n const invocation = {\n contractAddress: opts.contract,\n entrypoint: opts.entrypoint,\n calldata: calldata\n };\n\n const estimate = await account.estimateFee([invocation]);\n\n out(opts.json, { success: true, estimate }, () => {\n console.log(`Estimated Fee: ${formatBalance(estimate.amount)} ETH`);\n console.log(`Gas Usage: ${estimate.overall_fee}`);\n });\n } catch (e: any) {\n outError(opts.json, e.message);\n }\n });\n\n// ============ Introspection & Monitoring (Phase 2) ============\n\nconst contract = program.command('contract').description('Contract introspection tools');\n\ncontract\n .command('get-abi')\n .description('Get the ABI of a contract to understand how to interact with it')\n .requiredOption('--address <address>', 'Contract address')\n .option('--json', 'Output as JSON (default)')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n // We don't need auth for this, just provider\n const provider = (agent as any).provider;\n\n if (!opts.json) console.log(`Fetching ABI for ${opts.address}...`);\n\n const contractClass = await provider.getClassAt(opts.address, 'latest');\n if (!contractClass || !contractClass.abi) {\n throw new Error('No ABI found for this contract');\n }\n\n out(true, { status: 'ok', address: opts.address, abi: contractClass.abi }, () => {\n console.log(JSON.stringify(contractClass.abi, null, 2));\n });\n } catch (e: any) {\n outError(opts.json, e.message, 'AbiFetchFailed');\n }\n });\n\nconst tx = program.command('tx').description('Transaction monitoring tools');\n\ntx\n .command('status')\n .description('Get detailed status of a transaction')\n .requiredOption('--hash <hash>', 'Transaction hash')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n const provider = (agent as any).provider;\n\n const receipt = await provider.getTransactionReceipt(opts.hash);\n\n out(opts.json, { status: 'ok', receipt }, () => {\n console.log('--- Transaction Receipt ---');\n console.log(`Hash: ${receipt.transaction_hash}`);\n console.log(`Status: ${(receipt as any).execution_status || (receipt as any).finality_status || (receipt as any).status}`);\n if ((receipt as any).revert_reason) {\n console.log(`Revert Reason: ${(receipt as any).revert_reason}`);\n }\n console.log(`Actual Fee: ${formatBalance((receipt as any).actual_fee?.amount || 0)} ETH`);\n });\n } catch (e: any) {\n outError(opts.json, e.message, 'TxStatusFailed');\n }\n });\n\nconst events = program.command('events').description('Event listening tools');\n\nevents\n .command('list')\n .description('List events emitted by a contract')\n .requiredOption('--contract <address>', 'Contract address')\n .option('--from-block <block>', 'Start block number or tag (default: latest - 100)')\n .option('--to-block <block>', 'End block number or tag (default: latest)')\n .option('--keys <keys>', 'Comma-separated event keys (hashes) to filter by')\n .option('--page-size <size>', 'Number of events per page', '10')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n const provider = (agent as any).provider;\n\n let fromBlock = opts.fromBlock;\n if (!fromBlock) {\n // Default to looking back 100 blocks if possible, or just latest\n // For simplicity in CLI, let's default to 'latest' if not specified, or handle logic\n // But Starknet RPC usually requires explicit blocks.\n // Let's use 'pending' as default to_block and 'latest' as default from_block if not careful.\n // Better: requires explicit input or sensible default.\n // For now, let's just use what user gave or undefined (which might error if provider strict).\n }\n\n const keys = opts.keys ? opts.keys.split(',').map((k: string) => k.trim()) : undefined;\n const pageSize = parseInt(opts.pageSize, 10);\n\n const filter = {\n address: opts.contract,\n from_block: opts.fromBlock ? (isNaN(opts.fromBlock) ? opts.fromBlock : { block_number: parseInt(opts.fromBlock) }) : 'latest',\n to_block: opts.toBlock ? (isNaN(opts.toBlock) ? opts.toBlock : { block_number: parseInt(opts.toBlock) }) : 'latest',\n keys,\n chunk_size: pageSize\n };\n\n const response = await provider.getEvents(filter);\n\n out(opts.json, { status: 'ok', events: response.events, continuation_token: response.continuation_token }, () => {\n console.log(`Found ${response.events.length} events.`);\n response.events.forEach((ev: any) => {\n console.log(`- Tx: ${ev.transaction_hash}`);\n console.log(` Keys: ${ev.keys.join(', ')}`);\n console.log(` Data: ${ev.data.join(', ')}`);\n });\n });\n } catch (e: any) {\n outError(opts.json, e.message, 'EventsFetchFailed');\n }\n });\n\n\n\nprogram.parse();\n","import { RpcProvider, Call, num } from 'starknet';\nimport { AgentConfig, SessionKeyPolicy, NonceParams, SessionStatus } from './types';\nimport { generateSessionKeyPair } from './core/SessionKeyManager';\nimport { generateNonceParams, computeNonce } from './core/NonceManager';\nimport { computeAddressSeed, computeContractAddress } from './core/AddressSeedManager';\nimport {\n execute,\n deployAccount,\n renewSession,\n revokeSession,\n emergencyRevokeAllSessions,\n isDeployed,\n getSessionStatus,\n getBalance,\n TransactionSession,\n} from './core/TransactionManager';\nimport { firebaseLogin, validateApp } from './auth/FirebaseAuth';\nimport { saveSession, loadSession, deleteSession, saveConfig, loadConfig } from './storage/FileStorage';\nimport {\n DEFAULT_BACKEND_URL,\n DEFAULT_PAYMASTER_KEY,\n DEFAULT_RPC,\n DEFAULT_OAUTH_CONFIG_SEPOLIA,\n DEFAULT_OAUTH_CONFIG_MAINNET,\n TOKENS_SEPOLIA,\n TOKENS_MAINNET,\n} from './utils/constants';\nimport { parseJWT } from './utils/encoding';\n\nexport class CavosAgent {\n private config: Required<Pick<AgentConfig, 'appId' | 'network' | 'backendUrl'>> & AgentConfig;\n private provider: RpcProvider;\n private session: TransactionSession | null = null;\n private appSalt: string | null = null;\n\n constructor(config: AgentConfig) {\n const network = config.network ?? 'sepolia';\n const backendUrl = config.backendUrl ?? DEFAULT_BACKEND_URL;\n const rpcUrl = config.starknetRpcUrl ?? DEFAULT_RPC[network];\n\n this.config = { ...config, network, backendUrl };\n this.provider = new RpcProvider({ nodeUrl: rpcUrl });\n\n // Master-less Agent Support\n // CAVOS_TOKEN: single env var containing the full base64 session token\n // CAVOS_SESSION_TOKEN + CAVOS_PUBLIC_ADDRESS: legacy two-var form (still supported)\n const envToken = process.env.CAVOS_TOKEN || process.env.CAVOS_SESSION_TOKEN;\n\n if (envToken) {\n try {\n const sessionData = JSON.parse(Buffer.from(envToken, 'base64').toString());\n this.session = sessionData;\n this.appSalt = sessionData.appSalt ?? null;\n } catch (e) {\n console.warn(`[CavosAgent] Failed to parse session token: ${e}`);\n }\n } else {\n // Try to restore session from disk\n this.restoreSession();\n }\n }\n\n // ============ Auth ============\n\n /**\n * Login with Firebase email/password.\n * Generates session keys, authenticates, and persists the session.\n */\n async login(email: string, password: string, walletName?: string): Promise<void> {\n const { appId, network, backendUrl } = this.config;\n\n // Validate app and get salt\n const { allowed, appSalt } = await validateApp(backendUrl, appId, network);\n if (!allowed) {\n throw new Error('App not allowed or subscription limit reached.');\n }\n this.appSalt = appSalt ?? '0x0';\n\n // Generate session key pair\n const { privateKey, publicKey } = generateSessionKeyPair();\n\n // Generate nonce params\n const now = BigInt(Math.floor(Date.now() / 1000));\n const duration = BigInt(this.config.sessionDuration ?? 86400);\n const grace = BigInt(this.config.renewalGracePeriod ?? 172800);\n const nonceParams = generateNonceParams(publicKey, now, duration, grace);\n const nonce = computeNonce(nonceParams);\n\n // Authenticate via Firebase\n const { jwt, claims } = await firebaseLogin(backendUrl, appId, email, password, nonce);\n\n // Compute wallet address\n const oauthConfig = network === 'mainnet'\n ? DEFAULT_OAUTH_CONFIG_MAINNET\n : DEFAULT_OAUTH_CONFIG_SEPOLIA;\n\n const addressSeed = computeAddressSeed(claims.sub, this.appSalt, walletName);\n const walletAddress = computeContractAddress(\n claims.sub,\n this.appSalt,\n oauthConfig.cavosAccountClassHash,\n oauthConfig.jwksRegistryAddress,\n walletName,\n );\n\n // Build session\n this.session = {\n jwt,\n sessionPrivateKey: privateKey,\n sessionPubKey: publicKey,\n nonce,\n nonceParams,\n jwtClaims: claims,\n walletAddress,\n addressSeed,\n appSalt: this.appSalt,\n sessionPolicy: this.config.policy,\n walletName,\n };\n\n // Persist\n saveSession(appId, this.session);\n saveConfig({ defaultAppId: appId, network });\n }\n\n /**\n * Login using a pre-existing JWT token.\n * Useful for non-interactive agents or CI/CD.\n */\n async loginWithJWT(jwt: string, walletName?: string): Promise<void> {\n const { appId, network, backendUrl } = this.config;\n\n // Validate app and get salt\n const { allowed, appSalt } = await validateApp(backendUrl, appId, network);\n if (!allowed) {\n throw new Error('App not allowed or subscription limit reached.');\n }\n this.appSalt = appSalt ?? '0x0';\n\n // Parse JWT to get claims (nonce, sub, etc.)\n const claims = parseJWT(jwt);\n\n // Generate session key pair (we need a local key to sign txs even with external JWT)\n const { privateKey, publicKey } = generateSessionKeyPair();\n\n // Reconstruct nonce params from JWT (or generate fresh ones if we assume the JWT is just for identity)\n // Actually, on Starknet, the JWT is the \"signature\" for deployment/registration.\n // The session key is what we use for later transactions.\n\n // For simplicity, we generate fresh session params. \n // The JWT is used once to \"own\" the session on-chain.\n const now = BigInt(Math.floor(Date.now() / 1000));\n const duration = BigInt(this.config.sessionDuration ?? 86400);\n const grace = BigInt(this.config.renewalGracePeriod ?? 172800);\n const nonceParams = generateNonceParams(publicKey, now, duration, grace);\n const nonce = computeNonce(nonceParams);\n\n // Compute wallet address\n const oauthConfig = network === 'mainnet'\n ? DEFAULT_OAUTH_CONFIG_MAINNET\n : DEFAULT_OAUTH_CONFIG_SEPOLIA;\n\n const addressSeed = computeAddressSeed(claims.sub, this.appSalt, walletName);\n const walletAddress = computeContractAddress(\n claims.sub,\n this.appSalt,\n oauthConfig.cavosAccountClassHash,\n oauthConfig.jwksRegistryAddress,\n walletName,\n );\n\n // Build session\n this.session = {\n jwt,\n sessionPrivateKey: privateKey,\n sessionPubKey: publicKey,\n nonce,\n nonceParams,\n jwtClaims: claims,\n walletAddress,\n addressSeed,\n appSalt: this.appSalt,\n sessionPolicy: this.config.policy,\n walletName,\n };\n\n // Persist\n saveSession(appId, this.session);\n saveConfig({ defaultAppId: appId, network });\n }\n\n /**\n * Check if the agent has a valid session.\n */\n isAuthenticated(): boolean {\n return this.session !== null;\n }\n\n /**\n * Get the wallet address.\n */\n getAddress(): string | null {\n return this.session?.walletAddress ?? null;\n }\n\n /**\n * Logout — clear the persisted session.\n */\n logout(): void {\n deleteSession(this.config.appId);\n this.session = null;\n this.appSalt = null;\n }\n\n // ============ Transactions ============\n\n /**\n * Execute one or more calls via paymaster.\n * Handles session registration automatically on first call.\n */\n async execute(calls: Call | Call[]): Promise<string> {\n this.ensureSession();\n return execute(\n this.provider,\n this.session!,\n calls,\n this.getSalt(),\n this.getPaymasterKey(),\n this.config.network,\n this.config.backendUrl,\n );\n }\n\n /**\n * Transfer ERC-20 tokens.\n */\n async transfer(tokenAddress: string, to: string, amount: bigint): Promise<string> {\n const low = num.toHex(amount & ((1n << 128n) - 1n));\n const high = num.toHex(amount >> 128n);\n\n return this.execute({\n contractAddress: tokenAddress,\n entrypoint: 'transfer',\n calldata: [to, low, high],\n });\n }\n\n /**\n * Approve ERC-20 spending.\n */\n async approve(tokenAddress: string, spender: string, amount: bigint): Promise<string> {\n const low = num.toHex(amount & ((1n << 128n) - 1n));\n const high = num.toHex(amount >> 128n);\n\n return this.execute({\n contractAddress: tokenAddress,\n entrypoint: 'approve',\n calldata: [spender, low, high],\n });\n }\n\n /**\n * Deploy the account contract.\n */\n async deploy(): Promise<string> {\n this.ensureSession();\n const oauthConfig = this.config.network === 'mainnet'\n ? DEFAULT_OAUTH_CONFIG_MAINNET\n : DEFAULT_OAUTH_CONFIG_SEPOLIA;\n\n return deployAccount(\n this.provider,\n this.session!,\n oauthConfig.cavosAccountClassHash,\n oauthConfig.jwksRegistryAddress,\n this.getSalt(),\n this.getPaymasterKey(),\n this.config.network,\n this.config.backendUrl,\n );\n }\n\n // ============ Queries ============\n\n /**\n * Get ERC-20 balance.\n */\n async getBalance(tokenAddress?: string): Promise<bigint> {\n this.ensureSession();\n const tokens = this.config.network === 'mainnet' ? TOKENS_MAINNET : TOKENS_SEPOLIA;\n const token = tokenAddress ?? tokens.STRK;\n return getBalance(this.provider, token, this.session!.walletAddress);\n }\n\n /**\n * Check if the account is deployed.\n */\n async isDeployed(): Promise<boolean> {\n this.ensureSession();\n return isDeployed(this.provider, this.session!.walletAddress);\n }\n\n /**\n * Get on-chain session status.\n */\n async getSessionStatus(): Promise<SessionStatus> {\n this.ensureSession();\n return getSessionStatus(this.provider, this.session!.walletAddress, this.session!.sessionPubKey);\n }\n\n // ============ Session Management ============\n\n /**\n * Renew the current session (if in grace period).\n */\n async renewSession(): Promise<string> {\n this.ensureSession();\n const oldSession = this.session!;\n\n const { privateKey, publicKey } = generateSessionKeyPair();\n const now = BigInt(Math.floor(Date.now() / 1000));\n const duration = BigInt(this.config.sessionDuration ?? 86400);\n const grace = BigInt(this.config.renewalGracePeriod ?? 172800);\n const nonceParams = generateNonceParams(publicKey, now, duration, grace);\n const nonce = computeNonce(nonceParams);\n\n const txHash = await renewSession(\n this.provider,\n oldSession,\n { sessionPubKey: publicKey, nonce, nonceParams, sessionPolicy: this.config.policy },\n this.getPaymasterKey(),\n this.config.network,\n );\n\n // Update session with new keys\n this.session = {\n ...oldSession,\n sessionPrivateKey: privateKey,\n sessionPubKey: publicKey,\n nonce,\n nonceParams,\n sessionPolicy: this.config.policy,\n };\n saveSession(this.config.appId, this.session);\n\n return txHash;\n }\n\n /**\n * Revoke a specific session key (defaults to current).\n */\n async revokeSession(sessionKey?: string): Promise<string> {\n this.ensureSession();\n const keyToRevoke = sessionKey ?? this.session!.sessionPubKey;\n return revokeSession(\n this.provider,\n this.session!,\n keyToRevoke,\n this.getSalt(),\n this.getPaymasterKey(),\n this.config.network,\n this.config.backendUrl,\n );\n }\n\n /**\n * Emergency revoke all sessions.\n */\n async emergencyRevokeAll(): Promise<string> {\n this.ensureSession();\n return emergencyRevokeAllSessions(\n this.provider,\n this.session!,\n this.getSalt(),\n this.getPaymasterKey(),\n this.config.network,\n this.config.backendUrl,\n );\n }\n\n // ============ Internals ============\n\n private ensureSession(): void {\n if (!this.session) {\n throw new Error('Not authenticated. Call login() first.');\n }\n }\n\n private getSalt(): string {\n return this.appSalt ?? '0x0';\n }\n\n private getPaymasterKey(): string {\n return this.config.paymasterApiKey ?? DEFAULT_PAYMASTER_KEY;\n }\n\n private restoreSession(): void {\n const stored = loadSession(this.config.appId);\n if (!stored) return;\n\n // Reconstruct session — JWT may be expired, but session key may still be valid on-chain\n this.session = {\n jwt: stored.jwt ?? '',\n sessionPrivateKey: stored.sessionPrivateKey,\n sessionPubKey: stored.sessionPubKey,\n nonce: stored.nonce,\n nonceParams: stored.nonceParams,\n jwtClaims: stored.jwtClaims ?? { sub: '', nonce: '', exp: 0, iss: '', aud: '' },\n walletAddress: stored.walletAddress ?? '',\n addressSeed: stored.addressSeed ?? '',\n sessionPolicy: stored.sessionPolicy,\n appSalt: stored.appSalt,\n walletName: stored.walletName,\n };\n this.appSalt = stored.appSalt ?? null;\n }\n}\n","import { ec, num, hash, shortString } from 'starknet';\nimport { getRandomBytes } from '../utils/crypto';\nimport {\n base64UrlToBytes, bytesToU128Limbs, subToFelt, stringToFelt,\n parseJWT, extractKidFromJwt, findClaimOffsets, base64UrlToBase64,\n} from '../utils/encoding';\nimport { computeMerkleRoot, computeMerkleProof } from './MerkleTree';\nimport { OAUTH_JWT_V1_MAGIC, SESSION_V1_MAGIC, STARK_CURVE_ORDER } from '../utils/constants';\nimport { NonceParams, SessionKeyPolicy } from '../types';\n\n/**\n * Generate a new session key pair.\n */\nexport function generateSessionKeyPair(): { privateKey: string; publicKey: string } {\n const randomBytes = getRandomBytes(32);\n let pk = BigInt('0x' + Array.from(randomBytes).map(b => b.toString(16).padStart(2, '0')).join(''));\n pk = (pk % (STARK_CURVE_ORDER - 1n)) + 1n;\n const privateKey = '0x' + pk.toString(16);\n const publicKey = ec.starkCurve.getStarkKey(privateKey);\n return { privateKey, publicKey };\n}\n\n/**\n * Build a lightweight session signature (SESSION_V1).\n * Used for transactions after the session is registered on-chain.\n */\nexport function buildSessionSignature(\n transactionHash: string,\n sessionPrivateKey: string,\n sessionPubKey: string,\n calls?: { contractAddress: string }[],\n policy?: SessionKeyPolicy,\n): string[] {\n const signature = ec.starkCurve.sign(transactionHash, sessionPrivateKey);\n\n const sig: string[] = [\n SESSION_V1_MAGIC,\n num.toHex(signature.r),\n num.toHex(signature.s),\n sessionPubKey,\n ];\n\n if (calls && policy?.allowedContracts?.length) {\n for (const call of calls) {\n const proof = computeMerkleProof(policy.allowedContracts, call.contractAddress);\n sig.push(num.toHex(proof.length));\n sig.push(...proof);\n }\n }\n\n return sig;\n}\n\n/**\n * Build the full JWT signature data (OAUTH_JWT_V1) for on-chain verification.\n * Used for the first transaction to register the session.\n */\nexport async function buildJWTSignatureData(\n transactionHash: string,\n session: {\n jwt: string;\n sessionPrivateKey: string;\n sessionPubKey: string;\n nonce: string;\n nonceParams: NonceParams;\n jwtClaims: { sub: string; nonce: string; exp: number; iss: string; aud: string };\n sessionPolicy?: SessionKeyPolicy;\n },\n salt: string,\n backendUrl: string,\n): Promise<string[]> {\n const { jwt, sessionPrivateKey, sessionPubKey, nonceParams, jwtClaims } = session;\n\n const signature = ec.starkCurve.sign(transactionHash, sessionPrivateKey);\n\n // Extract RSA signature from JWT\n const jwtParts = jwt.split('.');\n const rsaSignature = base64UrlToBytes(jwtParts[2]);\n const rsaLimbs = bytesToU128Limbs(rsaSignature);\n\n // Get signed data (header.payload)\n const signedData = `${jwtParts[0]}.${jwtParts[1]}`;\n const signedDataBytes = Buffer.from(signedData, 'utf-8');\n\n const offsets = findClaimOffsets(jwt);\n const jwt_sub_felt = subToFelt(jwtClaims.sub);\n const salt_hex = num.toHex(salt);\n\n // Pack signedDataBytes into 31-byte chunks\n const packedBytes: string[] = [];\n const PACK_SIZE = 31;\n for (let i = 0; i < signedDataBytes.length; i += PACK_SIZE) {\n let chunk = 0n;\n const end = Math.min(i + PACK_SIZE, signedDataBytes.length);\n for (let j = i; j < end; j++) {\n chunk = (chunk * 256n) + BigInt(signedDataBytes[j]);\n }\n packedBytes.push(num.toHex(chunk));\n }\n\n // Calculate Montgomery constants for RSA verification\n const kid = extractKidFromJwt(jwt);\n const iss = jwtClaims.iss;\n const modulusLimbs = await fetchModulusForKid(kid, iss, backendUrl);\n const { n_prime, r_sq } = calculateMontgomeryConstants(modulusLimbs);\n\n const sig: string[] = [\n OAUTH_JWT_V1_MAGIC,\n num.toHex(signature.r),\n num.toHex(signature.s),\n sessionPubKey,\n num.toHex(nonceParams.validUntil),\n num.toHex(nonceParams.randomness),\n jwt_sub_felt,\n session.nonce,\n num.toHex(jwtClaims.exp),\n stringToFelt(kid),\n stringToFelt(jwtClaims.iss),\n stringToFelt(jwtClaims.aud),\n salt_hex,\n num.toHex(offsets.sub_offset),\n num.toHex(offsets.sub_len),\n num.toHex(offsets.nonce_offset),\n num.toHex(offsets.nonce_len),\n num.toHex(offsets.kid_offset),\n num.toHex(offsets.kid_len),\n num.toHex(16),\n ...rsaLimbs,\n num.toHex(16),\n ...n_prime,\n num.toHex(16),\n ...r_sq,\n num.toHex(signedDataBytes.length),\n ...packedBytes,\n ];\n\n // Append policy fields\n sig.push(num.toHex(nonceParams.validAfter));\n\n const policy = session.sessionPolicy;\n if (policy) {\n const merkleRoot = policy.allowedContracts.length > 0\n ? computeMerkleRoot(policy.allowedContracts)\n : '0x0';\n sig.push(merkleRoot);\n sig.push(num.toHex(policy.maxCallsPerTx));\n sig.push(num.toHex(policy.spendingLimits.length));\n for (const limit of policy.spendingLimits) {\n sig.push(num.toHex(limit.token));\n const limitBig = BigInt(limit.limit);\n sig.push(num.toHex(limitBig & ((1n << 128n) - 1n)));\n sig.push(num.toHex(limitBig >> 128n));\n }\n } else {\n sig.push('0x0');\n sig.push(num.toHex(10));\n sig.push(num.toHex(0));\n }\n\n return sig;\n}\n\n// ---- Internal helpers ----\n\nasync function fetchModulusForKid(kid: string, issuer: string, backendUrl: string): Promise<bigint[]> {\n let jwksUrl = 'https://www.googleapis.com/oauth2/v3/certs';\n if (issuer === 'https://appleid.apple.com') {\n jwksUrl = 'https://appleid.apple.com/auth/keys';\n } else if (issuer === 'https://cavos.app/firebase') {\n jwksUrl = `${backendUrl}/api/jwks/firebase`;\n }\n\n const response = await fetch(jwksUrl);\n const data: any = await response.json();\n const jwks = data.jwks || data;\n\n if (!jwks.keys || !Array.isArray(jwks.keys)) {\n throw new Error(`Invalid JWKS response from ${jwksUrl}`);\n }\n\n const key = jwks.keys.find((k: any) => k.kid === kid);\n if (!key || !key.n) {\n throw new Error(`Key not found for kid: ${kid}`);\n }\n\n const modulusBytes = base64UrlToBytes(key.n);\n const limbs = bytesToU128Limbs(modulusBytes);\n return limbs.map(l => BigInt(l));\n}\n\nfunction calculateMontgomeryConstants(n_limbs: bigint[]): { n_prime: string[]; r_sq: string[] } {\n let n = 0n;\n for (let i = 0; i < n_limbs.length; i++) {\n n += n_limbs[i] * (1n << (BigInt(i) * 128n));\n }\n\n const R = 1n << 2048n;\n\n function modInverse(a: bigint, mod: bigint): bigint {\n let t = 0n, newt = 1n, r = mod, newr = a;\n while (newr !== 0n) {\n const q = r / newr;\n [t, newt] = [newt, t - q * newt];\n [r, newr] = [newr, r - q * newr];\n }\n if (r > 1n) throw new Error('n is not invertible');\n if (t < 0n) t += mod;\n return t;\n }\n\n const n_inv = modInverse(n, R);\n const n_prime_val = (R - n_inv) % R;\n const r_sq_val = (R * R) % n;\n\n const toLimbs = (val: bigint): string[] => {\n const limbs: string[] = [];\n for (let i = 0; i < 16; i++) {\n const limb = (val >> (BigInt(i) * 128n)) & ((1n << 128n) - 1n);\n limbs.push(num.toHex(limb));\n }\n return limbs;\n };\n\n return { n_prime: toLimbs(n_prime_val), r_sq: toLimbs(r_sq_val) };\n}\n","import { randomBytes } from 'crypto';\n\n/**\n * Generate cryptographically secure random bytes (Node.js native)\n */\nexport function getRandomBytes(length: number): Uint8Array {\n return new Uint8Array(randomBytes(length));\n}\n\n/**\n * Generate a random bigint within the Stark field (< 2^251)\n */\nexport function randomFieldElement(): bigint {\n const bytes = getRandomBytes(32);\n const hex = Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\n return BigInt('0x' + hex) % (2n ** 251n);\n}\n","import { num } from 'starknet';\n\n/**\n * Convert base64url string to standard base64\n */\nexport function base64UrlToBase64(base64url: string): string {\n return base64url\n .replace(/-/g, '+')\n .replace(/_/g, '/')\n .padEnd(base64url.length + (4 - (base64url.length % 4)) % 4, '=');\n}\n\n/**\n * Decode base64url string to bytes\n */\nexport function base64UrlToBytes(base64url: string): Uint8Array {\n const base64 = base64UrlToBase64(base64url);\n const buf = Buffer.from(base64, 'base64');\n return new Uint8Array(buf);\n}\n\n/**\n * Convert bytes to 16 x u128 limbs (Little-Endian) for RSA on-chain verification\n */\nexport function bytesToU128Limbs(bytes: Uint8Array): string[] {\n const limbs: string[] = [];\n for (let i = 15; i >= 0; i--) {\n let limb = 0n;\n for (let j = 0; j < 16; j++) {\n const byteIdx = i * 16 + j;\n if (byteIdx < bytes.length) {\n limb = (limb * 256n) + BigInt(bytes[byteIdx]);\n }\n }\n limbs.push(num.toHex(limb));\n }\n return limbs;\n}\n\n/**\n * Convert an OAuth sub claim to felt252\n */\nexport function subToFelt(sub: string): string {\n try {\n const subBigInt = BigInt(sub);\n if (subBigInt < 2n ** 251n) {\n return num.toHex(subBigInt);\n }\n } catch {\n // Not a pure number (e.g. Apple sub)\n }\n return stringToFelt(sub);\n}\n\n/**\n * Convert a short string to felt252 (max 31 bytes)\n */\nexport function stringToFelt(str: string): string {\n const bytes = Buffer.from(str, 'utf-8');\n let result = 0n;\n for (let i = 0; i < bytes.length && i < 31; i++) {\n result = result * 256n + BigInt(bytes[i]);\n }\n return num.toHex(result);\n}\n\n/**\n * Parse a JWT token and extract claims\n */\nexport function parseJWT(jwt: string): { sub: string; nonce: string; exp: number; iss: string; aud: string } {\n const parts = jwt.split('.');\n if (parts.length !== 3) {\n throw new Error('Invalid JWT format');\n }\n const payload = JSON.parse(Buffer.from(base64UrlToBase64(parts[1]), 'base64').toString('utf-8'));\n return {\n sub: payload.sub,\n nonce: payload.nonce,\n exp: payload.exp,\n iss: payload.iss,\n aud: Array.isArray(payload.aud) ? payload.aud[0] : payload.aud,\n };\n}\n\n/**\n * Extract the Key ID (kid) from a JWT header\n */\nexport function extractKidFromJwt(jwt: string): string {\n const parts = jwt.split('.');\n const header = JSON.parse(Buffer.from(base64UrlToBase64(parts[0]), 'base64').toString('utf-8'));\n return header.kid || '';\n}\n\n/**\n * Find claim offsets in the decoded JWT segments for on-chain verification\n */\nexport function findClaimOffsets(jwt: string): {\n sub_offset: number; sub_len: number;\n nonce_offset: number; nonce_len: number;\n kid_offset: number; kid_len: number;\n} {\n const parts = jwt.split('.');\n const headerJson = JSON.parse(Buffer.from(base64UrlToBase64(parts[0]), 'base64').toString('utf-8'));\n const payloadJson = JSON.parse(Buffer.from(base64UrlToBase64(parts[1]), 'base64').toString('utf-8'));\n\n const subValue = payloadJson.sub || '';\n const nonceValue = payloadJson.nonce || '';\n const kidValue = headerJson.kid || '';\n\n const decodedPayload = Buffer.from(base64UrlToBase64(parts[1]), 'base64').toString('utf-8');\n const decodedHeader = Buffer.from(base64UrlToBase64(parts[0]), 'base64').toString('utf-8');\n\n const findClaimValueOffset = (decoded: string, key: string, value: string): number => {\n const exactPattern = `\"${key}\":\"${value}\"`;\n let idx = decoded.indexOf(exactPattern);\n if (idx >= 0) return idx + key.length + 4;\n\n const spacedPattern = `\"${key}\": \"${value}\"`;\n idx = decoded.indexOf(spacedPattern);\n if (idx >= 0) return idx + key.length + 5;\n\n const keyPattern = `\"${key}\"`;\n idx = decoded.indexOf(keyPattern);\n if (idx >= 0) {\n const colonIdx = decoded.indexOf(':', idx + key.length + 2);\n if (colonIdx >= 0) {\n const valueQuoteIdx = decoded.indexOf('\"', colonIdx + 1);\n if (valueQuoteIdx >= 0) return valueQuoteIdx + 1;\n }\n }\n return -1;\n };\n\n const subValueStart = findClaimValueOffset(decodedPayload, 'sub', subValue);\n if (subValueStart < 0) throw new Error('Failed to find sub claim in JWT payload');\n\n const nonceValueStart = findClaimValueOffset(decodedPayload, 'nonce', nonceValue);\n if (nonceValueStart < 0) throw new Error('Failed to find nonce claim in JWT payload');\n\n const kidValueStart = findClaimValueOffset(decodedHeader, 'kid', kidValue);\n if (kidValueStart < 0) throw new Error('Failed to find kid claim in JWT header');\n\n return {\n sub_offset: subValueStart, sub_len: subValue.length,\n nonce_offset: nonceValueStart, nonce_len: nonceValue.length,\n kid_offset: kidValueStart, kid_len: kidValue.length,\n };\n}\n","import { hash, num } from 'starknet';\n\n/**\n * Compute Merkle root from a list of allowed contract addresses.\n * Uses Poseidon hash, matching the on-chain verification.\n */\nexport function computeMerkleRoot(contracts: string[]): string {\n if (contracts.length === 0) return '0x0';\n\n let leaves = contracts.map(c =>\n hash.computePoseidonHashOnElements([num.toHex(c)])\n );\n\n leaves.sort((a, b) => {\n const aBig = BigInt(a);\n const bBig = BigInt(b);\n if (aBig < bBig) return -1;\n if (aBig > bBig) return 1;\n return 0;\n });\n\n while (leaves.length > 1) {\n const nextLevel: string[] = [];\n for (let i = 0; i < leaves.length; i += 2) {\n if (i + 1 < leaves.length) {\n const left = leaves[i];\n const right = leaves[i + 1];\n const leftBig = BigInt(left);\n const rightBig = BigInt(right);\n if (leftBig < rightBig) {\n nextLevel.push(hash.computePoseidonHashOnElements([left, right]));\n } else {\n nextLevel.push(hash.computePoseidonHashOnElements([right, left]));\n }\n } else {\n nextLevel.push(leaves[i]);\n }\n }\n leaves = nextLevel;\n }\n\n return leaves[0];\n}\n\n/**\n * Compute Merkle proof for a given contract address.\n */\nexport function computeMerkleProof(contracts: string[], targetContract: string): string[] {\n if (contracts.length === 0) return [];\n\n let leaves = contracts.map(c =>\n hash.computePoseidonHashOnElements([num.toHex(c)])\n );\n\n leaves.sort((a, b) => {\n const aBig = BigInt(a);\n const bBig = BigInt(b);\n if (aBig < bBig) return -1;\n if (aBig > bBig) return 1;\n return 0;\n });\n\n const targetLeaf = hash.computePoseidonHashOnElements([num.toHex(targetContract)]);\n let targetIdx = leaves.indexOf(targetLeaf);\n if (targetIdx === -1) return [];\n\n const proof: string[] = [];\n let currentLevel = [...leaves];\n\n while (currentLevel.length > 1) {\n const nextLevel: string[] = [];\n let nextTargetIdx = -1;\n\n for (let i = 0; i < currentLevel.length; i += 2) {\n if (i + 1 < currentLevel.length) {\n const left = currentLevel[i];\n const right = currentLevel[i + 1];\n\n if (i === targetIdx || i + 1 === targetIdx) {\n proof.push(i === targetIdx ? right : left);\n nextTargetIdx = Math.floor(i / 2);\n }\n\n const leftBig = BigInt(left);\n const rightBig = BigInt(right);\n if (leftBig < rightBig) {\n nextLevel.push(hash.computePoseidonHashOnElements([left, right]));\n } else {\n nextLevel.push(hash.computePoseidonHashOnElements([right, left]));\n }\n } else {\n if (i === targetIdx) {\n nextTargetIdx = Math.floor(i / 2);\n }\n nextLevel.push(currentLevel[i]);\n }\n }\n\n currentLevel = nextLevel;\n targetIdx = nextTargetIdx;\n }\n\n return proof;\n}\n","// Signature magic values (must match Cairo contract)\nexport const OAUTH_JWT_V1_MAGIC = '0x4f415554485f4a57545f5631';\nexport const SESSION_V1_MAGIC = '0x53455353494f4e5f5631';\n\n// Stark curve order\nexport const STARK_CURVE_ORDER = BigInt('0x800000000000010ffffffffffffffffb781126dcae7b2321e66a241adc64d2f');\n\n// Well-known token addresses (Sepolia)\nexport const TOKENS_SEPOLIA = {\n STRK: '0x04718f5a0Fc34cC1AF16A1cdee98fFB20C31f5cD61D6Ab07201858f4287c938D',\n ETH: '0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7',\n} as const;\n\n// Well-known token addresses (Mainnet)\nexport const TOKENS_MAINNET = {\n STRK: '0x04718f5a0Fc34cC1AF16A1cdee98fFB20C31f5cD61D6Ab07201858f4287c938D',\n ETH: '0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7',\n} as const;\n\n// Default RPC URLs\nexport const DEFAULT_RPC = {\n mainnet: 'https://starknet-mainnet.g.alchemy.com/starknet/version/rpc/v0_10/dql5pMT88iueZWl7L0yzT56uVk0EBU4L',\n sepolia: 'https://starknet-sepolia.g.alchemy.com/starknet/version/rpc/v0_10/dql5pMT88iueZWl7L0yzT56uVk0EBU4L',\n} as const;\n\n// Default OAuth config (Sepolia)\nexport const DEFAULT_OAUTH_CONFIG_SEPOLIA = {\n jwksRegistryAddress: '0x05a19f14719dec9e27eb2aa38c5b68277bdb5c41570e548504722f737a3da6c6',\n cavosAccountClassHash: '0x40f4075372d7b9b964910755dcdf96935280c8b675272f656b2d43d1ae4bbf4',\n};\n\n// Default OAuth config (Mainnet)\nexport const DEFAULT_OAUTH_CONFIG_MAINNET = {\n jwksRegistryAddress: '0x07787f624d6869ae306dc17b49174b284dbadd1e999c1c8733ce72eb7ac518c2',\n cavosAccountClassHash: '0x40f4075372d7b9b964910755dcdf96935280c8b675272f656b2d43d1ae4bbf4',\n};\n\n// Default backend URL\nexport const DEFAULT_BACKEND_URL = 'https://cavos.xyz';\n\n// Default paymaster API key (shared Sepolia key)\nexport const DEFAULT_PAYMASTER_KEY = 'c37c52b7-ea5a-4426-8121-329a78354b0b';\n","import { hash, num } from 'starknet';\nimport { randomFieldElement } from '../utils/crypto';\nimport { NonceParams } from '../types';\n\n/**\n * Compute the nonce for a session.\n * Must match Cairo: PoseidonTrait::new().update(session_key).update(valid_until).update(randomness).finalize()\n */\nexport function computeNonce(params: NonceParams): string {\n return hash.computePoseidonHashOnElements([\n params.sessionPubKey,\n num.toHex(params.validUntil),\n num.toHex(params.randomness),\n ]);\n}\n\n/**\n * Generate nonce parameters for a new session.\n */\nexport function generateNonceParams(\n sessionPubKey: string,\n currentTimestamp: bigint,\n sessionDurationSeconds: bigint = 86400n,\n renewalGraceSeconds: bigint = 172800n,\n): NonceParams {\n const randomness = randomFieldElement();\n return {\n sessionPubKey,\n validAfter: currentTimestamp,\n validUntil: currentTimestamp + sessionDurationSeconds,\n renewalDeadline: currentTimestamp + renewalGraceSeconds,\n randomness,\n };\n}\n","import { hash, num } from 'starknet';\nimport { subToFelt, stringToFelt } from '../utils/encoding';\n\n/**\n * Compute the address seed from a user's OAuth `sub` claim and a salt.\n * The salt can optionally incorporate a wallet name to allow multiple addresses per sub.\n */\nexport function computeAddressSeed(sub: string, salt: string, walletName?: string): string {\n const subFeltVal = subToFelt(sub);\n let saltFelt = num.toHex(salt);\n\n if (walletName) {\n // If a wallet name is provided, we derive a new salt: Poseidon(app_salt, wallet_name)\n const nameFelt = stringToFelt(walletName);\n saltFelt = hash.computePoseidonHashOnElements([saltFelt, nameFelt]);\n }\n\n return hash.computePoseidonHashOnElements([subFeltVal, saltFelt]);\n}\n\n/**\n * Compute the contract address for an OAuth wallet.\n */\nexport function computeContractAddress(\n sub: string,\n salt: string,\n classHash: string,\n jwksRegistryAddress: string,\n walletName?: string,\n): string {\n const addressSeed = computeAddressSeed(sub, salt, walletName);\n const constructorCalldata = [addressSeed, jwksRegistryAddress];\n return hash.calculateContractAddressFromHash(\n addressSeed,\n classHash,\n constructorCalldata,\n 0,\n );\n}\n","import {\n RpcProvider,\n Call,\n num,\n typedData,\n hash,\n ec,\n} from 'starknet';\nimport { buildSessionSignature, buildJWTSignatureData } from './SessionKeyManager';\nimport { computeMerkleRoot } from './MerkleTree';\nimport { NonceParams, SessionKeyPolicy, SessionStatus } from '../types';\n\nexport interface TransactionSession {\n jwt: string;\n sessionPrivateKey: string;\n sessionPubKey: string;\n nonce: string;\n nonceParams: NonceParams;\n jwtClaims: { sub: string; nonce: string; exp: number; iss: string; aud: string };\n walletAddress: string;\n addressSeed: string;\n appSalt?: string;\n sessionPolicy?: SessionKeyPolicy;\n walletName?: string;\n}\n\n/**\n * Check if the account is deployed on-chain.\n */\nexport async function isDeployed(provider: RpcProvider, address: string): Promise<boolean> {\n try {\n const classHash = await provider.getClassHashAt(address, 'latest');\n return !!classHash;\n } catch {\n return false;\n }\n}\n\n/**\n * Get session status from on-chain.\n */\nexport async function getSessionStatus(\n provider: RpcProvider,\n walletAddress: string,\n sessionPubKey: string,\n): Promise<SessionStatus> {\n try {\n const result = await provider.callContract({\n contractAddress: walletAddress,\n entrypoint: 'get_session',\n calldata: [sessionPubKey],\n }, 'latest');\n\n const nonce = BigInt(result[0]);\n const validUntil = BigInt(result[2]);\n const renewalDeadline = BigInt(result[3]);\n\n const registered = nonce !== 0n;\n if (!registered) {\n return { registered: false, expired: false, canRenew: false };\n }\n\n const block = await provider.getBlock('latest');\n const now = BigInt(block.timestamp);\n const expired = now >= validUntil;\n const canRenew = expired && now < renewalDeadline;\n\n return { registered, expired, canRenew, validUntil, renewalDeadline };\n } catch {\n return { registered: false, expired: false, canRenew: false };\n }\n}\n\n/**\n * Deploy the OAuth account contract via AVNU Paymaster.\n */\nexport async function deployAccount(\n provider: RpcProvider,\n session: TransactionSession,\n classHash: string,\n jwksRegistryAddress: string,\n salt: string,\n paymasterApiKey: string,\n network: 'mainnet' | 'sepolia',\n backendUrl: string,\n): Promise<string> {\n const deployed = await isDeployed(provider, session.walletAddress);\n if (deployed) return 'already-deployed';\n\n const constructorCalldata = [\n num.toHex(session.addressSeed),\n num.toHex(jwksRegistryAddress),\n ];\n\n const baseUrl = network === 'mainnet'\n ? 'https://starknet.api.avnu.fi'\n : 'https://sepolia.api.avnu.fi';\n\n // Use AVNU deploy endpoint — build typed data with deployment data\n const buildResponse = await fetch(`${baseUrl}/paymaster/v1/build-typed-data`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': paymasterApiKey,\n },\n body: JSON.stringify({\n userAddress: session.walletAddress,\n calls: [],\n accountClassHash: classHash,\n accountCalldata: constructorCalldata,\n }),\n });\n\n if (!buildResponse.ok) {\n const errText = await buildResponse.text();\n if (errText.includes('already deployed')) return 'already-deployed';\n throw new Error(`Deploy build-typed-data failed: ${errText}`);\n }\n\n const paymasterTypedData = await buildResponse.json();\n const messageHash = computeTypedDataHash(paymasterTypedData, session.walletAddress);\n\n // Deploy always uses JWT signature\n const signature = await buildJWTSignatureData(messageHash, session, salt, backendUrl);\n\n const executeResponse = await fetch(`${baseUrl}/paymaster/v1/execute`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': paymasterApiKey,\n },\n body: JSON.stringify({\n userAddress: session.walletAddress,\n typedData: JSON.stringify(paymasterTypedData),\n signature,\n }),\n });\n\n if (!executeResponse.ok) {\n const errText = await executeResponse.text();\n if (errText.includes('already deployed')) return 'already-deployed';\n throw new Error(`Deploy execute failed: ${errText}`);\n }\n\n const result = (await executeResponse.json()) as { transactionHash: string };\n await provider.waitForTransaction(result.transactionHash);\n return result.transactionHash;\n}\n\n/**\n * Execute calls using the AVNU Paymaster.\n * Automatically handles session status:\n * - Not registered → JWT signature (registers + executes)\n * - Active → session signature\n * - Expired + renewable → throws (caller should renew first)\n * - Expired + not renewable → throws\n */\nexport async function execute(\n provider: RpcProvider,\n session: TransactionSession,\n calls: Call | Call[],\n salt: string,\n paymasterApiKey: string,\n network: 'mainnet' | 'sepolia',\n backendUrl: string,\n): Promise<string> {\n const callsArray = Array.isArray(calls) ? calls : [calls];\n\n const status = await getSessionStatus(provider, session.walletAddress, session.sessionPubKey);\n\n if (!status.registered) {\n return executeWithAVNU(provider, session, callsArray, salt, paymasterApiKey, network, backendUrl, true);\n }\n\n if (status.expired && status.canRenew) {\n throw new Error('SESSION_RENEWABLE: Session expired but can be renewed. Call renewSession() first.');\n }\n\n if (status.expired && !status.canRenew) {\n throw new Error('SESSION_EXPIRED: Session expired outside grace period. Please login again.');\n }\n\n return executeWithAVNU(provider, session, callsArray, salt, paymasterApiKey, network, backendUrl, false);\n}\n\n/**\n * Execute calls via AVNU API.\n */\nasync function executeWithAVNU(\n provider: RpcProvider,\n session: TransactionSession,\n calls: Call[],\n salt: string,\n paymasterApiKey: string,\n network: 'mainnet' | 'sepolia',\n backendUrl: string,\n forceJWT: boolean,\n): Promise<string> {\n const baseUrl = network === 'mainnet'\n ? 'https://starknet.api.avnu.fi'\n : 'https://sepolia.api.avnu.fi';\n\n const formattedCalls = calls.map(call => ({\n contractAddress: call.contractAddress,\n entrypoint: call.entrypoint,\n calldata: call.calldata\n ? (call.calldata as string[]).map(c => num.toHex(c))\n : [],\n }));\n\n const buildResponse = await fetch(`${baseUrl}/paymaster/v1/build-typed-data`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': paymasterApiKey,\n },\n body: JSON.stringify({\n userAddress: session.walletAddress,\n calls: formattedCalls,\n }),\n });\n\n if (!buildResponse.ok) {\n throw new Error(`Build typed data failed: ${await buildResponse.text()}`);\n }\n\n const paymasterTypedData = await buildResponse.json();\n const messageHash = computeTypedDataHash(paymasterTypedData, session.walletAddress);\n\n const signature = forceJWT\n ? await buildJWTSignatureData(messageHash, session, salt, backendUrl)\n : buildSessionSignature(\n messageHash,\n session.sessionPrivateKey,\n session.sessionPubKey,\n calls.map(c => ({ contractAddress: c.contractAddress })),\n session.sessionPolicy,\n );\n\n const executeResponse = await fetch(`${baseUrl}/paymaster/v1/execute`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': paymasterApiKey,\n },\n body: JSON.stringify({\n userAddress: session.walletAddress,\n typedData: JSON.stringify(paymasterTypedData),\n signature,\n }),\n });\n\n if (!executeResponse.ok) {\n const errorText = await executeResponse.text();\n if (errorText.includes('Session expired')) {\n throw new Error('SESSION_EXPIRED: Session has expired. Call renewSession() first.');\n }\n throw new Error(`Execute failed: ${errorText}`);\n }\n\n const result = (await executeResponse.json()) as { transactionHash: string };\n return result.transactionHash;\n}\n\n/**\n * Renew session using the grace period.\n * Old session key signs the new session params to authorize renewal.\n */\nexport async function renewSession(\n provider: RpcProvider,\n oldSession: TransactionSession,\n newSession: {\n sessionPubKey: string;\n nonce: string;\n nonceParams: NonceParams;\n sessionPolicy?: SessionKeyPolicy;\n },\n paymasterApiKey: string,\n network: 'mainnet' | 'sepolia',\n): Promise<string> {\n const policy = newSession.sessionPolicy;\n const allowedContractsRoot = policy?.allowedContracts?.length\n ? computeMerkleRoot(policy.allowedContracts)\n : '0x0';\n const maxCallsPerTx = policy?.maxCallsPerTx ?? 10;\n\n // Sign new session params with OLD key\n const message = hash.computePoseidonHashOnElements([\n newSession.sessionPubKey,\n newSession.nonce,\n num.toHex(newSession.nonceParams.validAfter),\n num.toHex(newSession.nonceParams.validUntil),\n num.toHex(newSession.nonceParams.renewalDeadline),\n allowedContractsRoot,\n num.toHex(maxCallsPerTx),\n ]);\n\n const oldSignature = ec.starkCurve.sign(message, oldSession.sessionPrivateKey);\n\n // Build spending policies calldata\n const spendingCalldata: string[] = [];\n if (policy?.spendingLimits?.length) {\n spendingCalldata.push(num.toHex(policy.spendingLimits.length));\n for (const limit of policy.spendingLimits) {\n spendingCalldata.push(num.toHex(limit.token));\n const limitBig = BigInt(limit.limit);\n spendingCalldata.push(num.toHex(limitBig & ((1n << 128n) - 1n)));\n spendingCalldata.push(num.toHex(limitBig >> 128n));\n }\n } else {\n spendingCalldata.push(num.toHex(0));\n }\n\n const renewCall: Call = {\n contractAddress: oldSession.walletAddress,\n entrypoint: 'renew_session',\n calldata: [\n oldSession.sessionPubKey,\n num.toHex(oldSignature.r),\n num.toHex(oldSignature.s),\n newSession.sessionPubKey,\n newSession.nonce,\n num.toHex(newSession.nonceParams.validAfter),\n num.toHex(newSession.nonceParams.validUntil),\n num.toHex(newSession.nonceParams.renewalDeadline),\n allowedContractsRoot,\n num.toHex(maxCallsPerTx),\n ...spendingCalldata,\n ],\n };\n\n const baseUrl = network === 'mainnet'\n ? 'https://starknet.api.avnu.fi'\n : 'https://sepolia.api.avnu.fi';\n\n const buildResponse = await fetch(`${baseUrl}/paymaster/v1/build-typed-data`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': paymasterApiKey,\n },\n body: JSON.stringify({\n userAddress: oldSession.walletAddress,\n calls: [{\n contractAddress: renewCall.contractAddress,\n entrypoint: renewCall.entrypoint,\n calldata: renewCall.calldata,\n }],\n }),\n });\n\n if (!buildResponse.ok) {\n throw new Error(`Renew build-typed-data failed: ${await buildResponse.text()}`);\n }\n\n const paymasterTypedData = await buildResponse.json();\n const messageHash = computeTypedDataHash(paymasterTypedData, oldSession.walletAddress);\n\n const signature = buildSessionSignature(\n messageHash,\n oldSession.sessionPrivateKey,\n oldSession.sessionPubKey,\n );\n\n const executeResponse = await fetch(`${baseUrl}/paymaster/v1/execute`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': paymasterApiKey,\n },\n body: JSON.stringify({\n userAddress: oldSession.walletAddress,\n typedData: JSON.stringify(paymasterTypedData),\n signature,\n }),\n });\n\n if (!executeResponse.ok) {\n const errorText = await executeResponse.text();\n if (errorText.includes('Renewal period expired')) {\n throw new Error('Grace period expired. Please login again.');\n }\n throw new Error(`Renew session failed: ${errorText}`);\n }\n\n const result = await executeResponse.json();\n return result.transactionHash;\n}\n\n/**\n * Revoke a specific session key.\n */\nexport async function revokeSession(\n provider: RpcProvider,\n session: TransactionSession,\n sessionKeyToRevoke: string,\n salt: string,\n paymasterApiKey: string,\n network: 'mainnet' | 'sepolia',\n backendUrl: string,\n): Promise<string> {\n const revokeCall: Call = {\n contractAddress: session.walletAddress,\n entrypoint: 'revoke_session',\n calldata: [sessionKeyToRevoke],\n };\n\n return execute(provider, session, [revokeCall], salt, paymasterApiKey, network, backendUrl);\n}\n\n/**\n * Emergency revoke all sessions (increments revocation epoch).\n */\nexport async function emergencyRevokeAllSessions(\n provider: RpcProvider,\n session: TransactionSession,\n salt: string,\n paymasterApiKey: string,\n network: 'mainnet' | 'sepolia',\n backendUrl: string,\n): Promise<string> {\n const revokeCall: Call = {\n contractAddress: session.walletAddress,\n entrypoint: 'emergency_revoke',\n calldata: [],\n };\n\n return execute(provider, session, [revokeCall], salt, paymasterApiKey, network, backendUrl);\n}\n\n/**\n * Query ERC-20 balance.\n */\nexport async function getBalance(\n provider: RpcProvider,\n tokenAddress: string,\n walletAddress: string,\n): Promise<bigint> {\n const result = await provider.callContract({\n contractAddress: tokenAddress,\n entrypoint: 'balanceOf',\n calldata: [walletAddress],\n });\n // u256 = (low, high)\n const low = BigInt(result[0]);\n const high = BigInt(result[1]);\n return low + (high << 128n);\n}\n\n// ---- Internal ----\n\nfunction computeTypedDataHash(paymasterTypedData: any, address: string): string {\n return typedData.getMessageHash(paymasterTypedData, address);\n}\n","import { parseJWT } from '../utils/encoding';\n\n/**\n * Login with Firebase email/password via the Cavos backend.\n * Returns the JWT token on success.\n */\nexport async function firebaseLogin(\n backendUrl: string,\n appId: string,\n email: string,\n password: string,\n nonce: string,\n): Promise<{ jwt: string; claims: { sub: string; nonce: string; exp: number; iss: string; aud: string } }> {\n const response = await fetch(`${backendUrl}/api/oauth/firebase/login`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email, password, nonce, app_id: appId }),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Login failed' }));\n if (error.error === 'email_not_verified') {\n throw new Error('Email not verified. Please verify your email on agent.cavos.xyz first.');\n }\n throw new Error(error.error || 'Login failed');\n }\n\n const { jwt } = await response.json();\n const claims = parseJWT(jwt);\n\n if (claims.nonce !== nonce) {\n throw new Error('JWT nonce mismatch. Possible replay attack.');\n }\n\n return { jwt, claims };\n}\n\n/**\n * Validate app access and get app salt.\n */\nexport async function validateApp(\n backendUrl: string,\n appId: string,\n network: string,\n): Promise<{ allowed: boolean; appSalt?: string }> {\n try {\n const response = await fetch(\n `${backendUrl}/api/apps/${appId}/validate?network=${network}`,\n );\n if (!response.ok) return { allowed: true };\n const result = await response.json();\n return { allowed: result.allowed !== false, appSalt: result.app_salt };\n } catch {\n return { allowed: true };\n }\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { StoredSession, NonceParams, SessionKeyPolicy } from '../types';\n\nconst CAVOS_DIR = path.join(os.homedir(), '.cavos');\nconst SESSIONS_DIR = path.join(CAVOS_DIR, 'sessions');\nconst CONFIG_FILE = path.join(CAVOS_DIR, 'config.json');\n\nfunction ensureDir(dir: string): void {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true, mode: 0o700 });\n }\n}\n\n/**\n * Save a session to disk.\n */\nexport function saveSession(appId: string, session: {\n sessionPrivateKey: string;\n sessionPubKey: string;\n nonceParams: NonceParams;\n nonce: string;\n jwt?: string;\n jwtClaims?: { sub: string; nonce: string; exp: number; iss: string; aud: string };\n walletAddress?: string;\n addressSeed?: string;\n appSalt?: string;\n sessionPolicy?: SessionKeyPolicy;\n walletName?: string;\n}): void {\n ensureDir(SESSIONS_DIR);\n const stored: StoredSession = {\n sessionPrivateKey: session.sessionPrivateKey,\n sessionPubKey: session.sessionPubKey,\n nonceParams: {\n sessionPubKey: session.nonceParams.sessionPubKey,\n validAfter: session.nonceParams.validAfter.toString(),\n validUntil: session.nonceParams.validUntil.toString(),\n renewalDeadline: session.nonceParams.renewalDeadline.toString(),\n randomness: session.nonceParams.randomness.toString(),\n },\n nonce: session.nonce,\n jwt: session.jwt,\n jwtClaims: session.jwtClaims,\n walletAddress: session.walletAddress,\n addressSeed: session.addressSeed,\n sessionPolicy: session.sessionPolicy ? {\n spendingLimits: session.sessionPolicy.spendingLimits.map(sl => ({\n token: sl.token,\n limit: sl.limit.toString(),\n })),\n allowedContracts: session.sessionPolicy.allowedContracts,\n maxCallsPerTx: session.sessionPolicy.maxCallsPerTx,\n } : undefined,\n appSalt: session.appSalt,\n walletName: session.walletName,\n };\n const filePath = path.join(SESSIONS_DIR, `${appId}.json`);\n fs.writeFileSync(filePath, JSON.stringify(stored, null, 2), { mode: 0o600 });\n}\n\n/**\n * Load a session from disk. Returns null if not found.\n */\nexport function loadSession(appId: string): {\n sessionPrivateKey: string;\n sessionPubKey: string;\n nonceParams: NonceParams;\n nonce: string;\n jwt?: string;\n jwtClaims?: { sub: string; nonce: string; exp: number; iss: string; aud: string };\n walletAddress?: string;\n addressSeed?: string;\n appSalt?: string;\n sessionPolicy?: SessionKeyPolicy;\n walletName?: string;\n} | null {\n const filePath = path.join(SESSIONS_DIR, `${appId}.json`);\n if (!fs.existsSync(filePath)) return null;\n\n try {\n const stored: StoredSession = JSON.parse(fs.readFileSync(filePath, 'utf-8'));\n return {\n sessionPrivateKey: stored.sessionPrivateKey,\n sessionPubKey: stored.sessionPubKey,\n nonceParams: {\n sessionPubKey: stored.nonceParams.sessionPubKey,\n validAfter: BigInt(stored.nonceParams.validAfter),\n validUntil: BigInt(stored.nonceParams.validUntil),\n renewalDeadline: BigInt(stored.nonceParams.renewalDeadline),\n randomness: BigInt(stored.nonceParams.randomness),\n },\n nonce: stored.nonce,\n jwt: stored.jwt,\n jwtClaims: stored.jwtClaims,\n walletAddress: stored.walletAddress,\n addressSeed: stored.addressSeed,\n sessionPolicy: stored.sessionPolicy ? {\n spendingLimits: stored.sessionPolicy.spendingLimits.map(sl => ({\n token: sl.token,\n limit: BigInt(sl.limit),\n })),\n allowedContracts: stored.sessionPolicy.allowedContracts,\n maxCallsPerTx: stored.sessionPolicy.maxCallsPerTx,\n } : undefined,\n appSalt: stored.appSalt,\n walletName: stored.walletName,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Delete a session from disk.\n */\nexport function deleteSession(appId: string): void {\n const filePath = path.join(SESSIONS_DIR, `${appId}.json`);\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n }\n}\n\nconst POLICY_FILE = path.join(CAVOS_DIR, 'policy.json');\n\n/**\n * Load policy from disk.\n */\nexport function loadPolicy(): SessionKeyPolicy | undefined {\n if (!fs.existsSync(POLICY_FILE)) return undefined;\n try {\n const stored = JSON.parse(fs.readFileSync(POLICY_FILE, 'utf-8'));\n return {\n spendingLimits: (stored.spendingLimits || []).map((sl: any) => ({\n token: sl.token,\n limit: BigInt(sl.limit),\n })),\n allowedContracts: stored.allowedContracts || [],\n maxCallsPerTx: stored.maxCallsPerTx || 10,\n };\n } catch {\n return undefined;\n }\n}\n\n/**\n * Save policy to disk.\n */\nexport function savePolicy(policy: SessionKeyPolicy): void {\n ensureDir(CAVOS_DIR);\n const stored = {\n spendingLimits: policy.spendingLimits.map((sl) => ({\n token: sl.token,\n limit: sl.limit.toString(),\n })),\n allowedContracts: policy.allowedContracts,\n maxCallsPerTx: policy.maxCallsPerTx,\n };\n fs.writeFileSync(POLICY_FILE, JSON.stringify(stored, null, 2), { mode: 0o600 });\n}\n\n/**\n * Save CLI config.\n */\nexport function saveConfig(config: { defaultAppId?: string; network?: string }): void {\n ensureDir(CAVOS_DIR);\n const existing = loadConfig();\n const merged = { ...existing, ...config };\n fs.writeFileSync(CONFIG_FILE, JSON.stringify(merged, null, 2), { mode: 0o600 });\n}\n\n/**\n * Load CLI config.\n */\nexport function loadConfig(): { defaultAppId?: string; network?: string } {\n if (!fs.existsSync(CONFIG_FILE)) return {};\n try {\n return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf-8'));\n } catch {\n return {};\n }\n}\n","[\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_whoami\",\n \"description\": \"Show current session info: wallet address, deployment status, and on-chain session validity. Call this first to confirm the agent is authenticated and ready.\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {}\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_balance\",\n \"description\": \"Show token balance for the current wallet. Returns ETH and STRK balances by default, or a specific token if provided. Always check balance before attempting a transfer.\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"token\": {\n \"type\": \"string\",\n \"description\": \"Token symbol (STRK, ETH) or full contract address. Omit to show both ETH and STRK.\"\n }\n }\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_transfer\",\n \"description\": \"Transfer ERC-20 tokens to another Starknet address. Amounts are in human-readable units (e.g. '1.5' for 1.5 STRK). The session must be active on-chain. Verify balance first.\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"to\": {\n \"type\": \"string\",\n \"description\": \"Recipient Starknet address (hex, e.g. 0x...)\"\n },\n \"amount\": {\n \"type\": \"string\",\n \"description\": \"Amount in human-readable units (e.g. '1.5', '0.01')\"\n },\n \"token\": {\n \"type\": \"string\",\n \"description\": \"Token symbol (STRK, ETH) or contract address. Defaults to STRK.\",\n \"default\": \"STRK\"\n }\n },\n \"required\": [\n \"to\",\n \"amount\"\n ]\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_approve\",\n \"description\": \"Approve a spender contract to spend up to a specified amount of tokens on behalf of the wallet. Required before interacting with DeFi protocols.\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"spender\": {\n \"type\": \"string\",\n \"description\": \"Starknet address of the contract being approved to spend tokens\"\n },\n \"amount\": {\n \"type\": \"string\",\n \"description\": \"Maximum amount to approve in human-readable units (e.g. '100')\"\n },\n \"token\": {\n \"type\": \"string\",\n \"description\": \"Token symbol (STRK, ETH) or contract address. Defaults to STRK.\",\n \"default\": \"STRK\"\n }\n },\n \"required\": [\n \"spender\",\n \"amount\"\n ]\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_execute\",\n \"description\": \"Execute an arbitrary contract call on Starknet. Use this for any contract interaction not covered by transfer or approve. Calldata values are comma-separated hex or decimal strings.\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"contract\": {\n \"type\": \"string\",\n \"description\": \"Target contract address (hex)\"\n },\n \"entrypoint\": {\n \"type\": \"string\",\n \"description\": \"Name of the function/entrypoint to call (e.g. 'swap', 'deposit')\"\n },\n \"calldata\": {\n \"type\": \"string\",\n \"description\": \"Comma-separated calldata values (hex or decimal). Omit if the function takes no arguments.\"\n }\n },\n \"required\": [\n \"contract\",\n \"entrypoint\"\n ]\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_session_status\",\n \"description\": \"Show on-chain session status for the current session key: whether it is registered, active, expired, or renewable. Use this to diagnose transaction failures.\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {}\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_multicall\",\n \"description\": \"Execute multiple contract calls atomically in a single transaction. All calls succeed or all fail together. Use this instead of calling cavos_execute multiple times when you need to batch operations (e.g., approve + swap in one tx). More efficient and safer than sequential calls.\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"calls\": {\n \"type\": \"array\",\n \"description\": \"Array of contract calls to execute atomically\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"contract\": {\n \"type\": \"string\",\n \"description\": \"Target contract address (hex)\"\n },\n \"entrypoint\": {\n \"type\": \"string\",\n \"description\": \"Name of the function/entrypoint to call\"\n },\n \"calldata\": {\n \"type\": \"string\",\n \"description\": \"Comma-separated calldata values (hex or decimal). Omit if the function takes no arguments.\"\n }\n },\n \"required\": [\n \"contract\",\n \"entrypoint\"\n ]\n },\n \"minItems\": 2\n }\n },\n \"required\": [\n \"calls\"\n ]\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_policy_show\",\n \"description\": \"Show the local spending policy: allowed contracts and per-token spending limits. The agent will refuse transactions that violate this policy.\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {}\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_call\",\n \"description\": \"Execute a read-only contract call on Starknet. Use this to query state (e.g. balance, allowance, owner) without spending gas.\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"contract\": {\n \"type\": \"string\",\n \"description\": \"Target contract address (hex)\"\n },\n \"entrypoint\": {\n \"type\": \"string\",\n \"description\": \"Name of the view function to call\"\n },\n \"calldata\": {\n \"type\": \"string\",\n \"description\": \"Comma-separated arguments or JSON array string\"\n }\n },\n \"required\": [\n \"contract\",\n \"entrypoint\"\n ]\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_simulate\",\n \"description\": \"Simulate a transaction execution to check for errors and gas usage before sending it. Highly recommended for complex interactions.\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"contract\": {\n \"type\": \"string\",\n \"description\": \"Target contract address (hex)\"\n },\n \"entrypoint\": {\n \"type\": \"string\",\n \"description\": \"Name of the function to simulate\"\n },\n \"calldata\": {\n \"type\": \"string\",\n \"description\": \"Comma-separated arguments or JSON array string\"\n }\n },\n \"required\": [\n \"contract\",\n \"entrypoint\"\n ]\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_estimate\",\n \"description\": \"Estimate grid fees for a transaction. Useful for checking if the wallet has enough funds to cover gas.\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"contract\": {\n \"type\": \"string\",\n \"description\": \"Target contract address (hex)\"\n },\n \"entrypoint\": {\n \"type\": \"string\",\n \"description\": \"Name of the function to estimate\"\n },\n \"calldata\": {\n \"type\": \"string\",\n \"description\": \"Comma-separated arguments or JSON array string\"\n }\n },\n \"required\": [\n \"contract\",\n \"entrypoint\"\n ]\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_contract_get_abi\",\n \"description\": \"Fetch the ABI of a contract to understand its available functions and events. Use this when you need to interact with a new contract but don't know its interface.\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"address\": {\n \"type\": \"string\",\n \"description\": \"Contract address (hex)\"\n }\n },\n \"required\": [\n \"address\"\n ]\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_tx_status\",\n \"description\": \"Check the detailed status of a transaction. Use this to verify if a transaction succeeded, failed (and why), or is still pending.\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"hash\": {\n \"type\": \"string\",\n \"description\": \"Transaction hash (hex)\"\n }\n },\n \"required\": [\n \"hash\"\n ]\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_events_list\",\n \"description\": \"List events emitted by a contract. Use this to monitor for specific activities (e.g. 'Swap', 'Transfer').\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"contract\": {\n \"type\": \"string\",\n \"description\": \"Contract address emitting the events\"\n },\n \"keys\": {\n \"type\": \"string\",\n \"description\": \"Comma-separated event keys (topic hashes) to filter by. Optional.\"\n },\n \"from_block\": {\n \"type\": \"string\",\n \"description\": \"Start block number or 'pending'/'latest'. Optional.\"\n },\n \"to_block\": {\n \"type\": \"string\",\n \"description\": \"End block number. Optional.\"\n },\n \"page_size\": {\n \"type\": \"string\",\n \"description\": \"Number of events to return (default 10). Optional.\"\n }\n },\n \"required\": [\n \"contract\"\n ]\n }\n }\n }\n]"],"mappings":"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","names":["import_starknet","import_starknet","import_starknet","randomBytes","policy","session","import_starknet","import_starknet","import_starknet","session","policy","session","policy"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/CavosAgent.ts","../src/core/SessionKeyManager.ts","../src/utils/crypto.ts","../src/utils/encoding.ts","../src/core/MerkleTree.ts","../src/utils/constants.ts","../src/core/NonceManager.ts","../src/core/AddressSeedManager.ts","../src/core/TransactionManager.ts","../src/auth/FirebaseAuth.ts","../src/storage/FileStorage.ts","../src/utils/tools.json"],"sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport { CavosAgent } from './CavosAgent';\nimport { loadConfig, saveConfig, saveSession, loadPolicy, savePolicy } from './storage/FileStorage';\nimport { TOKENS_SEPOLIA, TOKENS_MAINNET } from './utils/constants';\nimport toolsSchema from './utils/tools.json';\n\nconst program = new Command();\n\nprogram\n .name('cavos')\n .description('Cavos CLI — AI agent wallet toolkit for Starknet')\n .version('0.1.0');\n\nconst DEFAULT_APP_ID = '0c3ff58a-1968-41c2-b0e0-a5c47309e77d';\nconst DEFAULT_NETWORK = 'mainnet' as const;\n\nfunction getAgent(opts: { appId?: string }): CavosAgent {\n const config = loadConfig();\n const appId = (opts.appId || config.defaultAppId || process.env.CAVOS_APP_ID || DEFAULT_APP_ID) as string;\n const network = 'mainnet';\n const policy = loadPolicy();\n return new CavosAgent({ appId, network, policy });\n}\n\nfunction resolveToken(symbol: string | undefined): string {\n if (!symbol) return TOKENS_MAINNET.STRK;\n const upper = symbol.toUpperCase();\n const tokens = TOKENS_MAINNET;\n if (upper === 'STRK') return tokens.STRK;\n if (upper === 'ETH') return tokens.ETH;\n return symbol;\n}\n\nfunction formatBalance(raw: bigint, decimals: number = 18): string {\n const whole = raw / BigInt(10 ** decimals);\n const remainder = raw % BigInt(10 ** decimals);\n const fractional = remainder.toString().padStart(decimals, '0').slice(0, 6);\n return `${whole}.${fractional}`;\n}\n\n/** Output helper: prints JSON if --json, else calls humanFn */\nfunction out(json: boolean, data: object, humanFn: () => void): void {\n if (json) {\n console.log(JSON.stringify(data, null, 2));\n } else {\n humanFn();\n }\n}\n\n/** Error output helper */\nfunction outError(json: boolean, message: string, code: string = 'Error'): void {\n if (json) {\n console.error(JSON.stringify({ status: 'error', error_code: code, message }));\n } else {\n console.error(`${code}: ${message}`);\n }\n process.exit(1);\n}\n\n/** Wait for a transaction to be confirmed on-chain */\nasync function waitForTx(agent: CavosAgent, txHash: string, timeoutMs = 120000): Promise<void> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n try {\n const receipt = await (agent as any).provider.getTransactionReceipt(txHash);\n if (receipt) {\n const status = (receipt as any).execution_status || (receipt as any).finality_status || (receipt as any).status;\n if (status === 'SUCCEEDED' || status === 'ACCEPTED_ON_L2' || status === 'ACCEPTED_ON_L1') return;\n if (status === 'REVERTED') throw new Error(`Transaction ${txHash} was reverted`);\n }\n } catch (e: any) {\n if (e.message?.includes('reverted')) throw e;\n }\n await new Promise(r => setTimeout(r, 3000));\n }\n throw new Error(`Transaction confirmation timeout after ${timeoutMs / 1000}s`);\n}\n\n// ============ Info Commands ============\n\nprogram\n .command('whoami')\n .description('Show current session info')\n .option('--app-id <appId>', 'App ID')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n const mode = (process.env.CAVOS_TOKEN || process.env.CAVOS_SESSION_TOKEN) ? 'env' : 'disk';\n\n if (!agent.isAuthenticated()) {\n out(opts.json, { status: 'unauthenticated', mode }, () => {\n console.log('Status: Not authenticated.');\n });\n return;\n }\n\n const address = agent.getAddress();\n const deployed = await agent.isDeployed();\n let sessionInfo: object = { registered: false };\n\n if (deployed) {\n const s = await agent.getSessionStatus();\n sessionInfo = {\n registered: s.registered,\n expired: s.expired,\n can_renew: s.canRenew,\n valid_until: s.validUntil ? new Date(Number(s.validUntil) * 1000).toISOString() : null,\n renewal_deadline: s.renewalDeadline ? new Date(Number(s.renewalDeadline) * 1000).toISOString() : null,\n };\n }\n\n out(opts.json, { status: 'ok', mode, address, deployed, session: sessionInfo }, () => {\n console.log(`Mode: ${mode}`);\n console.log(`Address: ${address}`);\n console.log(`Deployed: ${deployed ? 'Yes' : 'No'}`);\n if (deployed) {\n const s = sessionInfo as any;\n console.log(`Session: ${s.registered ? (s.expired ? (s.can_renew ? 'Renewable' : 'Expired') : 'Active') : 'Not registered'}`);\n if (s.valid_until) console.log(`Valid until: ${s.valid_until}`);\n }\n });\n } catch (err: any) {\n outError(opts.json, err.message);\n }\n });\n\n// ============ Transaction Commands ============\n\nprogram\n .command('transfer')\n .description('Transfer ERC-20 tokens')\n .requiredOption('--to <address>', 'Recipient address')\n .requiredOption('--amount <amount>', 'Amount in human-readable units (e.g. 1.5)')\n .option('--token <token>', 'Token symbol (STRK, ETH) or address', 'STRK')\n .option('--app-id <appId>', 'App ID')\n .option('--wait', 'Wait for on-chain confirmation')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n if (!agent.isAuthenticated()) outError(opts.json, 'No session. Import one: cavos session import <token>', 'NoSession');\n\n const tokenAddress = resolveToken(opts.token);\n const amount = BigInt(Math.floor(parseFloat(opts.amount) * 1e18));\n\n if (!opts.json) console.log(`Transferring ${opts.amount} ${opts.token} to ${opts.to}...`);\n const txHash = await agent.transfer(tokenAddress, opts.to, amount);\n\n if (opts.wait) {\n if (!opts.json) console.log('Waiting for confirmation...');\n await waitForTx(agent, txHash);\n }\n\n const explorerBase = 'https://voyager.online/tx';\n out(opts.json, { status: 'ok', transaction_hash: txHash, explorer: `${explorerBase}/${txHash}` }, () => {\n console.log(`Transaction: ${txHash}`);\n console.log(`Explorer: ${explorerBase}/${txHash}`);\n });\n } catch (err: any) {\n outError(opts.json, err.message, 'TransferFailed');\n }\n });\n\nprogram\n .command('approve')\n .description('Approve ERC-20 spending')\n .requiredOption('--spender <address>', 'Spender address')\n .requiredOption('--amount <amount>', 'Amount in human-readable units')\n .option('--token <token>', 'Token symbol or address', 'STRK')\n .option('--app-id <appId>', 'App ID')\n .option('--wait', 'Wait for on-chain confirmation')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n if (!agent.isAuthenticated()) outError(opts.json, 'No session. Import one: cavos session import <token>', 'NoSession');\n\n const tokenAddress = resolveToken(opts.token);\n const amount = BigInt(Math.floor(parseFloat(opts.amount) * 1e18));\n\n if (!opts.json) console.log(`Approving ${opts.amount} ${opts.token} for ${opts.spender}...`);\n const txHash = await agent.approve(tokenAddress, opts.spender, amount);\n\n if (opts.wait) {\n if (!opts.json) console.log('Waiting for confirmation...');\n await waitForTx(agent, txHash);\n }\n\n const explorerBase = 'https://voyager.online/tx';\n out(opts.json, { status: 'ok', transaction_hash: txHash, explorer: `${explorerBase}/${txHash}` }, () => {\n console.log(`Transaction: ${txHash}`);\n console.log(`Explorer: ${explorerBase}/${txHash}`);\n });\n } catch (err: any) {\n outError(opts.json, err.message, 'ApproveFailed');\n }\n });\n\nprogram\n .command('execute')\n .description('Execute a raw contract call')\n .requiredOption('--contract <address>', 'Contract address')\n .requiredOption('--entrypoint <name>', 'Entrypoint name')\n .option('--calldata <data>', 'Comma-separated calldata values')\n .option('--app-id <appId>', 'App ID')\n .option('--wait', 'Wait for on-chain confirmation')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n if (!agent.isAuthenticated()) outError(opts.json, 'No session. Import one: cavos session import <token>', 'NoSession');\n\n const calldata = opts.calldata ? opts.calldata.split(',').map((s: string) => s.trim()) : [];\n\n if (!opts.json) console.log(`Executing ${opts.entrypoint} on ${opts.contract}...`);\n const txHash = await agent.execute({ contractAddress: opts.contract, entrypoint: opts.entrypoint, calldata });\n\n if (opts.wait) {\n if (!opts.json) console.log('Waiting for confirmation...');\n await waitForTx(agent, txHash);\n }\n\n const explorerBase = 'https://voyager.online/tx';\n out(opts.json, { status: 'ok', transaction_hash: txHash, explorer: `${explorerBase}/${txHash}` }, () => {\n console.log(`Transaction: ${txHash}`);\n console.log(`Explorer: ${explorerBase}/${txHash}`);\n });\n } catch (err: any) {\n outError(opts.json, err.message, 'ExecuteFailed');\n }\n });\n\nprogram\n .command('multicall')\n .description('Execute multiple contract calls in one transaction')\n .requiredOption('--calls <json>', 'JSON array of calls: [{\"contractAddress\":\"0x...\",\"entrypoint\":\"fn\",\"calldata\":[\"0x...\"]}]')\n .option('--app-id <appId>', 'App ID')\n .option('--wait', 'Wait for on-chain confirmation')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n if (!agent.isAuthenticated()) outError(opts.json, 'No session. Import one: cavos session import <token>', 'NoSession');\n\n let calls: any[];\n try {\n calls = JSON.parse(opts.calls);\n if (!Array.isArray(calls) || calls.length === 0) throw new Error('calls must be a non-empty JSON array');\n } catch (e: any) {\n outError(opts.json, `Invalid --calls JSON: ${e.message}`, 'InvalidInput');\n return;\n }\n\n if (!opts.json) console.log(`Executing ${calls.length} calls...`);\n const txHash = await agent.execute(calls);\n\n if (opts.wait) {\n if (!opts.json) console.log('Waiting for confirmation...');\n await waitForTx(agent, txHash);\n }\n\n const explorerBase = 'https://voyager.online/tx';\n out(opts.json, { status: 'ok', transaction_hash: txHash, call_count: calls.length, explorer: `${explorerBase}/${txHash}` }, () => {\n console.log(`Transaction: ${txHash}`);\n console.log(`Explorer: ${explorerBase}/${txHash}`);\n });\n } catch (err: any) {\n outError(opts.json, err.message, 'MulticallFailed');\n }\n });\n\nprogram\n .command('deploy')\n .description('Deploy the account contract')\n .option('--app-id <appId>', 'App ID')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n if (!agent.isAuthenticated()) outError(opts.json, 'No session. Import one: cavos session import <token>', 'NoSession');\n\n if (!opts.json) console.log('Deploying account...');\n const result = await agent.deploy();\n\n if (result === 'already-deployed') {\n out(opts.json, { status: 'ok', deployed: true, message: 'Account already deployed' }, () => {\n console.log('Account is already deployed.');\n });\n } else {\n out(opts.json, { status: 'ok', deployed: true, transaction_hash: result }, () => {\n console.log(`Deployed: ${result}`);\n });\n }\n } catch (err: any) {\n outError(opts.json, err.message, 'DeployFailed');\n }\n });\n\n// ============ Query Commands ============\n\nprogram\n .command('balance')\n .description('Show token balance')\n .option('--token <token>', 'Token symbol or address')\n .option('--app-id <appId>', 'App ID')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n if (!agent.isAuthenticated()) outError(opts.json, 'No session. Import one: cavos session import <token>', 'NoSession');\n\n const tokens = TOKENS_MAINNET;\n\n if (opts.token) {\n const tokenAddress = resolveToken(opts.token);\n const balance = await agent.getBalance(tokenAddress);\n out(opts.json, { status: 'ok', token: opts.token, balance: formatBalance(balance), raw: balance.toString() }, () => {\n console.log(`${opts.token}: ${formatBalance(balance)}`);\n });\n } else {\n const [ethBal, strkBal] = await Promise.all([agent.getBalance(tokens.ETH), agent.getBalance(tokens.STRK)]);\n out(opts.json, {\n status: 'ok',\n balances: {\n ETH: { balance: formatBalance(ethBal), raw: ethBal.toString() },\n STRK: { balance: formatBalance(strkBal), raw: strkBal.toString() },\n }\n }, () => {\n console.log(`ETH: ${formatBalance(ethBal)}`);\n console.log(`STRK: ${formatBalance(strkBal)}`);\n });\n }\n } catch (err: any) {\n outError(opts.json, err.message);\n }\n });\n\nprogram\n .command('session-status')\n .description('Show on-chain session status')\n .option('--app-id <appId>', 'App ID')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n if (!agent.isAuthenticated()) outError(opts.json, 'No session. Import one: cavos session import <token>', 'NoSession');\n\n const s = await agent.getSessionStatus();\n const state = !s.registered ? 'not_registered' : s.expired ? (s.canRenew ? 'renewable' : 'expired') : 'active';\n\n out(opts.json, {\n status: 'ok',\n state,\n registered: s.registered,\n expired: s.expired,\n can_renew: s.canRenew,\n valid_until: s.validUntil ? new Date(Number(s.validUntil) * 1000).toISOString() : null,\n renewal_deadline: s.renewalDeadline ? new Date(Number(s.renewalDeadline) * 1000).toISOString() : null,\n }, () => {\n console.log(`State: ${state}`);\n if (s.validUntil) console.log(`Valid until: ${new Date(Number(s.validUntil) * 1000).toISOString()}`);\n if (s.renewalDeadline) console.log(`Renewal deadline: ${new Date(Number(s.renewalDeadline) * 1000).toISOString()}`);\n });\n } catch (err: any) {\n outError(opts.json, err.message);\n }\n });\n\n// ============ Session Commands ============\n\nconst session = program.command('session').description('Manage agent sessions');\n\nsession\n .command('import')\n .description('Import an agent session token provisioned from the Dashboard')\n .argument('<token>', 'Base64 encoded session token')\n .option('--app-id <appId>', 'App ID to associate with this session')\n .option('--json', 'Output as JSON')\n .action((token, opts) => {\n try {\n const decoded = Buffer.from(token, 'base64').toString();\n const sessionData = JSON.parse(decoded);\n\n if (!sessionData.walletAddress || !sessionData.sessionPrivateKey) {\n throw new Error('Invalid session token format.');\n }\n\n const config = loadConfig();\n const appId = opts.appId || config.defaultAppId || DEFAULT_APP_ID;\n\n saveSession(appId, sessionData);\n saveConfig({ defaultAppId: appId });\n\n out(opts.json, { status: 'ok', address: sessionData.walletAddress, app_id: appId }, () => {\n console.log(`Session imported: ${sessionData.walletAddress}`);\n });\n } catch (err: any) {\n if (opts.json) {\n console.error(JSON.stringify({ status: 'error', error_code: 'ImportFailed', message: err.message }));\n } else {\n console.error(`Import failed: ${err.message}`);\n }\n }\n });\n\n// ============ Security Commands ============\n\nprogram\n .command('revoke-session')\n .description('Revoke a session key (requires active session)')\n .option('--key <sessionKey>', 'Specific session key to revoke (defaults to current)')\n .option('--app-id <appId>', 'App ID')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n if (!agent.isAuthenticated()) outError(opts.json, 'No session. Import one: cavos session import <token>', 'NoSession');\n\n if (!opts.json) console.log('Revoking session...');\n const txHash = await agent.revokeSession(opts.key);\n\n out(opts.json, { status: 'ok', transaction_hash: txHash }, () => {\n console.log(`Session revoked: ${txHash}`);\n });\n } catch (err: any) {\n const code = err.message?.includes('Session not registered') ? 'SessionNotRegistered' : 'RevokeFailed';\n outError(opts.json, err.message, code);\n }\n });\n\nprogram\n .command('emergency-revoke')\n .description('Emergency revoke all sessions')\n .option('--app-id <appId>', 'App ID')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n if (!agent.isAuthenticated()) outError(opts.json, 'No session. Import one: cavos session import <token>', 'NoSession');\n\n if (!opts.json) console.log('Emergency revoking all sessions...');\n const txHash = await agent.emergencyRevokeAll();\n\n out(opts.json, { status: 'ok', transaction_hash: txHash }, () => {\n console.log(`All sessions revoked: ${txHash}`);\n });\n } catch (err: any) {\n outError(opts.json, err.message, 'EmergencyRevokeFailed');\n }\n });\n\n// ============ Policy Commands ============\n\nconst policy = program.command('policy').description('Manage local spending policies');\n\n\n\npolicy\n .command('show')\n .description('Show the current local policy')\n .option('--json', 'Output as JSON')\n .action((opts) => {\n const p = loadPolicy();\n if (!p || (p.spendingLimits.length === 0 && p.allowedContracts.length === 0)) {\n out(opts.json, { status: 'ok', policy: null, message: 'No local policy defined.' }, () => {\n console.log('No local policy defined. The agent will follow default app constraints.');\n });\n return;\n }\n out(opts.json, {\n status: 'ok',\n policy: {\n spending_limits: p.spendingLimits.map(sl => ({ token: sl.token, limit: formatBalance(sl.limit) })),\n allowed_contracts: p.allowedContracts,\n max_calls_per_tx: p.maxCallsPerTx,\n }\n }, () => {\n console.log('--- Current Local Policy ---');\n console.log('Spending Limits:');\n if (p.spendingLimits.length === 0) console.log(' (None)');\n p.spendingLimits.forEach(sl => console.log(` ${sl.token}: ${formatBalance(sl.limit)}`));\n console.log('\\nAllowed Contracts:');\n if (p.allowedContracts.length === 0) console.log(' (None — all allowed)');\n p.allowedContracts.forEach(addr => console.log(` ${addr}`));\n });\n });\n\n// ============ Tools Commands ============\n\nconst tools = program.command('tools').description('AI Agent tool definitions');\n\ntools\n .command('list')\n .description('List tools in OpenAI-compatible JSON format')\n .action(() => {\n console.log(JSON.stringify(toolsSchema, null, 2));\n });\n\n// ============ Read-Only Commands ============\n\nprogram\n .command('call')\n .description('Call a contract entrypoint (read-only)')\n .requiredOption('--contract <address>', 'Contract address')\n .requiredOption('--entrypoint <name>', 'Entrypoint name')\n .option('--calldata <data>', 'Comma-separated calldata or JSON array', '[]')\n .option('--block <blockId>', 'Block identifier (default: latest)', 'latest')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n let calldata: string[] = [];\n if (opts.calldata.startsWith('[')) {\n calldata = JSON.parse(opts.calldata);\n } else {\n calldata = opts.calldata.split(',').filter((x: string) => x);\n }\n\n const result = await (agent as any).provider.callContract({\n contractAddress: opts.contract,\n entrypoint: opts.entrypoint,\n calldata: calldata,\n }, opts.block);\n\n out(opts.json, { success: true, result }, () => {\n console.log('Result:', result);\n });\n } catch (e: any) {\n outError(opts.json, e.message);\n }\n });\n\nprogram\n .command('simulate')\n .description('Simulate a transaction execution')\n .requiredOption('--contract <address>', 'Contract address')\n .requiredOption('--entrypoint <name>', 'Entrypoint name')\n .option('--calldata <data>', 'Comma-separated calldata or JSON array', '[]')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n let calldata: string[] = [];\n if (opts.calldata.startsWith('[')) {\n calldata = JSON.parse(opts.calldata);\n } else {\n calldata = opts.calldata.split(',').filter((x: string) => x);\n }\n\n // We need an account to simulate\n if (!agent.isAuthenticated()) {\n throw new Error('Authentication required for simulation');\n }\n\n // Access private account property (workaround for private field)\n const account = (agent as any).sessionAccount || (agent as any).account;\n\n const invocation = {\n contractAddress: opts.contract,\n entrypoint: opts.entrypoint,\n calldata: calldata\n };\n\n const simulation = await account.simulateTransaction([invocation]);\n\n out(opts.json, { success: true, simulation }, () => {\n console.log('Simulation Check:', simulation);\n console.log('Logs:', simulation[0].transaction_trace.execution_resources);\n });\n } catch (e: any) {\n outError(opts.json, e.message);\n }\n });\n\nprogram\n .command('estimate')\n .description('Estimate fee for a transaction')\n .requiredOption('--contract <address>', 'Contract address')\n .requiredOption('--entrypoint <name>', 'Entrypoint name')\n .option('--calldata <data>', 'Comma-separated calldata or JSON array', '[]')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n let calldata: string[] = [];\n if (opts.calldata.startsWith('[')) {\n calldata = JSON.parse(opts.calldata);\n } else {\n calldata = opts.calldata.split(',').filter((x: string) => x);\n }\n\n if (!agent.isAuthenticated()) {\n throw new Error('Authentication required for estimation');\n }\n\n const account = (agent as any).sessionAccount || (agent as any).account;\n\n const invocation = {\n contractAddress: opts.contract,\n entrypoint: opts.entrypoint,\n calldata: calldata\n };\n\n const estimate = await account.estimateFee([invocation]);\n\n out(opts.json, { success: true, estimate }, () => {\n console.log(`Estimated Fee: ${formatBalance(estimate.amount)} ETH`);\n console.log(`Gas Usage: ${estimate.overall_fee}`);\n });\n } catch (e: any) {\n outError(opts.json, e.message);\n }\n });\n\n// ============ Introspection & Monitoring (Phase 2) ============\n\nconst contract = program.command('contract').description('Contract introspection tools');\n\ncontract\n .command('get-abi')\n .description('Get the ABI of a contract to understand how to interact with it')\n .requiredOption('--address <address>', 'Contract address')\n .option('--json', 'Output as JSON (default)')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n // We don't need auth for this, just provider\n const provider = (agent as any).provider;\n\n if (!opts.json) console.log(`Fetching ABI for ${opts.address}...`);\n\n const contractClass = await provider.getClassAt(opts.address, 'latest');\n if (!contractClass || !contractClass.abi) {\n throw new Error('No ABI found for this contract');\n }\n\n out(true, { status: 'ok', address: opts.address, abi: contractClass.abi }, () => {\n console.log(JSON.stringify(contractClass.abi, null, 2));\n });\n } catch (e: any) {\n outError(opts.json, e.message, 'AbiFetchFailed');\n }\n });\n\nconst tx = program.command('tx').description('Transaction monitoring tools');\n\ntx\n .command('status')\n .description('Get detailed status of a transaction')\n .requiredOption('--hash <hash>', 'Transaction hash')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n const provider = (agent as any).provider;\n\n const receipt = await provider.getTransactionReceipt(opts.hash);\n\n out(opts.json, { status: 'ok', receipt }, () => {\n console.log('--- Transaction Receipt ---');\n console.log(`Hash: ${receipt.transaction_hash}`);\n console.log(`Status: ${(receipt as any).execution_status || (receipt as any).finality_status || (receipt as any).status}`);\n if ((receipt as any).revert_reason) {\n console.log(`Revert Reason: ${(receipt as any).revert_reason}`);\n }\n console.log(`Actual Fee: ${formatBalance((receipt as any).actual_fee?.amount || 0)} ETH`);\n });\n } catch (e: any) {\n outError(opts.json, e.message, 'TxStatusFailed');\n }\n });\n\nconst events = program.command('events').description('Event listening tools');\n\nevents\n .command('list')\n .description('List events emitted by a contract')\n .requiredOption('--contract <address>', 'Contract address')\n .option('--from-block <block>', 'Start block number or tag (default: latest - 100)')\n .option('--to-block <block>', 'End block number or tag (default: latest)')\n .option('--keys <keys>', 'Comma-separated event keys (hashes) to filter by')\n .option('--page-size <size>', 'Number of events per page', '10')\n .option('--json', 'Output as JSON')\n .action(async (opts) => {\n try {\n const agent = getAgent(opts);\n const provider = (agent as any).provider;\n\n let fromBlock = opts.fromBlock;\n if (!fromBlock) {\n // Default to looking back 100 blocks if possible, or just latest\n // For simplicity in CLI, let's default to 'latest' if not specified, or handle logic\n // But Starknet RPC usually requires explicit blocks.\n // Let's use 'pending' as default to_block and 'latest' as default from_block if not careful.\n // Better: requires explicit input or sensible default.\n // For now, let's just use what user gave or undefined (which might error if provider strict).\n }\n\n const keys = opts.keys ? opts.keys.split(',').map((k: string) => k.trim()) : undefined;\n const pageSize = parseInt(opts.pageSize, 10);\n\n const filter = {\n address: opts.contract,\n from_block: opts.fromBlock ? (isNaN(opts.fromBlock) ? opts.fromBlock : { block_number: parseInt(opts.fromBlock) }) : 'latest',\n to_block: opts.toBlock ? (isNaN(opts.toBlock) ? opts.toBlock : { block_number: parseInt(opts.toBlock) }) : 'latest',\n keys,\n chunk_size: pageSize\n };\n\n const response = await provider.getEvents(filter);\n\n out(opts.json, { status: 'ok', events: response.events, continuation_token: response.continuation_token }, () => {\n console.log(`Found ${response.events.length} events.`);\n response.events.forEach((ev: any) => {\n console.log(`- Tx: ${ev.transaction_hash}`);\n console.log(` Keys: ${ev.keys.join(', ')}`);\n console.log(` Data: ${ev.data.join(', ')}`);\n });\n });\n } catch (e: any) {\n outError(opts.json, e.message, 'EventsFetchFailed');\n }\n });\n\n\n\nprogram.parse();\n","import { RpcProvider, Call, num } from 'starknet';\nimport { AgentConfig, SessionKeyPolicy, NonceParams, SessionStatus } from './types';\nimport { generateSessionKeyPair } from './core/SessionKeyManager';\nimport { generateNonceParams, computeNonce } from './core/NonceManager';\nimport { computeAddressSeed, computeContractAddress } from './core/AddressSeedManager';\nimport {\n execute,\n deployAccount,\n renewSession,\n revokeSession,\n emergencyRevokeAllSessions,\n isDeployed,\n getSessionStatus,\n getBalance,\n TransactionSession,\n} from './core/TransactionManager';\nimport { firebaseLogin, validateApp } from './auth/FirebaseAuth';\nimport { saveSession, loadSession, deleteSession, saveConfig, loadConfig } from './storage/FileStorage';\nimport {\n DEFAULT_BACKEND_URL,\n DEFAULT_PAYMASTER_KEY,\n DEFAULT_RPC,\n DEFAULT_OAUTH_CONFIG_SEPOLIA,\n DEFAULT_OAUTH_CONFIG_MAINNET,\n TOKENS_SEPOLIA,\n TOKENS_MAINNET,\n} from './utils/constants';\nimport { parseJWT } from './utils/encoding';\n\nexport class CavosAgent {\n private config: Required<Pick<AgentConfig, 'appId' | 'network' | 'backendUrl'>> & AgentConfig;\n private provider: RpcProvider;\n private session: TransactionSession | null = null;\n private appSalt: string | null = null;\n\n constructor(config: AgentConfig) {\n const network = config.network ?? 'sepolia';\n const backendUrl = config.backendUrl ?? DEFAULT_BACKEND_URL;\n const rpcUrl = config.starknetRpcUrl ?? DEFAULT_RPC[network];\n\n this.config = { ...config, network, backendUrl };\n this.provider = new RpcProvider({ nodeUrl: rpcUrl });\n\n // Master-less Agent Support\n // CAVOS_TOKEN: single env var containing the full base64 session token\n // CAVOS_SESSION_TOKEN + CAVOS_PUBLIC_ADDRESS: legacy two-var form (still supported)\n const envToken = process.env.CAVOS_TOKEN || process.env.CAVOS_SESSION_TOKEN;\n\n if (envToken) {\n try {\n const sessionData = JSON.parse(Buffer.from(envToken, 'base64').toString());\n this.session = sessionData;\n this.appSalt = sessionData.appSalt ?? null;\n } catch (e) {\n console.warn(`[CavosAgent] Failed to parse session token: ${e}`);\n }\n } else {\n // Try to restore session from disk\n this.restoreSession();\n }\n }\n\n // ============ Auth ============\n\n /**\n * Login with Firebase email/password.\n * Generates session keys, authenticates, and persists the session.\n */\n async login(email: string, password: string, walletName?: string): Promise<void> {\n const { appId, network, backendUrl } = this.config;\n\n // Validate app and get salt\n const { allowed, appSalt } = await validateApp(backendUrl, appId, network);\n if (!allowed) {\n throw new Error('App not allowed or subscription limit reached.');\n }\n this.appSalt = appSalt ?? '0x0';\n\n // Generate session key pair\n const { privateKey, publicKey } = generateSessionKeyPair();\n\n // Generate nonce params\n const now = BigInt(Math.floor(Date.now() / 1000));\n const duration = BigInt(this.config.sessionDuration ?? 86400);\n const grace = BigInt(this.config.renewalGracePeriod ?? 172800);\n const nonceParams = generateNonceParams(publicKey, now, duration, grace);\n const nonce = computeNonce(nonceParams);\n\n // Authenticate via Firebase\n const { jwt, claims } = await firebaseLogin(backendUrl, appId, email, password, nonce);\n\n // Compute wallet address\n const oauthConfig = network === 'mainnet'\n ? DEFAULT_OAUTH_CONFIG_MAINNET\n : DEFAULT_OAUTH_CONFIG_SEPOLIA;\n\n const addressSeed = computeAddressSeed(claims.sub, this.appSalt, walletName);\n const walletAddress = computeContractAddress(\n claims.sub,\n this.appSalt,\n oauthConfig.cavosAccountClassHash,\n oauthConfig.jwksRegistryAddress,\n walletName,\n );\n\n // Build session\n this.session = {\n jwt,\n sessionPrivateKey: privateKey,\n sessionPubKey: publicKey,\n nonce,\n nonceParams,\n jwtClaims: claims,\n walletAddress,\n addressSeed,\n appSalt: this.appSalt,\n sessionPolicy: this.config.policy,\n walletName,\n };\n\n // Persist\n saveSession(appId, this.session);\n saveConfig({ defaultAppId: appId, network });\n }\n\n /**\n * Login using a pre-existing JWT token.\n * Useful for non-interactive agents or CI/CD.\n */\n async loginWithJWT(jwt: string, walletName?: string): Promise<void> {\n const { appId, network, backendUrl } = this.config;\n\n // Validate app and get salt\n const { allowed, appSalt } = await validateApp(backendUrl, appId, network);\n if (!allowed) {\n throw new Error('App not allowed or subscription limit reached.');\n }\n this.appSalt = appSalt ?? '0x0';\n\n // Parse JWT to get claims (nonce, sub, etc.)\n const claims = parseJWT(jwt);\n\n // Generate session key pair (we need a local key to sign txs even with external JWT)\n const { privateKey, publicKey } = generateSessionKeyPair();\n\n // Reconstruct nonce params from JWT (or generate fresh ones if we assume the JWT is just for identity)\n // Actually, on Starknet, the JWT is the \"signature\" for deployment/registration.\n // The session key is what we use for later transactions.\n\n // For simplicity, we generate fresh session params. \n // The JWT is used once to \"own\" the session on-chain.\n const now = BigInt(Math.floor(Date.now() / 1000));\n const duration = BigInt(this.config.sessionDuration ?? 86400);\n const grace = BigInt(this.config.renewalGracePeriod ?? 172800);\n const nonceParams = generateNonceParams(publicKey, now, duration, grace);\n const nonce = computeNonce(nonceParams);\n\n // Compute wallet address\n const oauthConfig = network === 'mainnet'\n ? DEFAULT_OAUTH_CONFIG_MAINNET\n : DEFAULT_OAUTH_CONFIG_SEPOLIA;\n\n const addressSeed = computeAddressSeed(claims.sub, this.appSalt, walletName);\n const walletAddress = computeContractAddress(\n claims.sub,\n this.appSalt,\n oauthConfig.cavosAccountClassHash,\n oauthConfig.jwksRegistryAddress,\n walletName,\n );\n\n // Build session\n this.session = {\n jwt,\n sessionPrivateKey: privateKey,\n sessionPubKey: publicKey,\n nonce,\n nonceParams,\n jwtClaims: claims,\n walletAddress,\n addressSeed,\n appSalt: this.appSalt,\n sessionPolicy: this.config.policy,\n walletName,\n };\n\n // Persist\n saveSession(appId, this.session);\n saveConfig({ defaultAppId: appId, network });\n }\n\n /**\n * Check if the agent has a valid session.\n */\n isAuthenticated(): boolean {\n return this.session !== null;\n }\n\n /**\n * Get the wallet address.\n */\n getAddress(): string | null {\n return this.session?.walletAddress ?? null;\n }\n\n /**\n * Logout — clear the persisted session.\n */\n logout(): void {\n deleteSession(this.config.appId);\n this.session = null;\n this.appSalt = null;\n }\n\n // ============ Transactions ============\n\n /**\n * Execute one or more calls via paymaster.\n * Handles session registration automatically on first call.\n */\n async execute(calls: Call | Call[]): Promise<string> {\n this.ensureSession();\n return execute(\n this.provider,\n this.session!,\n calls,\n this.getSalt(),\n this.getPaymasterKey(),\n this.config.network,\n this.config.backendUrl,\n );\n }\n\n /**\n * Transfer ERC-20 tokens.\n */\n async transfer(tokenAddress: string, to: string, amount: bigint): Promise<string> {\n const low = num.toHex(amount & ((1n << 128n) - 1n));\n const high = num.toHex(amount >> 128n);\n\n return this.execute({\n contractAddress: tokenAddress,\n entrypoint: 'transfer',\n calldata: [to, low, high],\n });\n }\n\n /**\n * Approve ERC-20 spending.\n */\n async approve(tokenAddress: string, spender: string, amount: bigint): Promise<string> {\n const low = num.toHex(amount & ((1n << 128n) - 1n));\n const high = num.toHex(amount >> 128n);\n\n return this.execute({\n contractAddress: tokenAddress,\n entrypoint: 'approve',\n calldata: [spender, low, high],\n });\n }\n\n /**\n * Deploy the account contract.\n */\n async deploy(): Promise<string> {\n this.ensureSession();\n const oauthConfig = this.config.network === 'mainnet'\n ? DEFAULT_OAUTH_CONFIG_MAINNET\n : DEFAULT_OAUTH_CONFIG_SEPOLIA;\n\n return deployAccount(\n this.provider,\n this.session!,\n oauthConfig.cavosAccountClassHash,\n oauthConfig.jwksRegistryAddress,\n this.getSalt(),\n this.getPaymasterKey(),\n this.config.network,\n this.config.backendUrl,\n );\n }\n\n // ============ Queries ============\n\n /**\n * Get ERC-20 balance.\n */\n async getBalance(tokenAddress?: string): Promise<bigint> {\n this.ensureSession();\n const tokens = this.config.network === 'mainnet' ? TOKENS_MAINNET : TOKENS_SEPOLIA;\n const token = tokenAddress ?? tokens.STRK;\n return getBalance(this.provider, token, this.session!.walletAddress);\n }\n\n /**\n * Check if the account is deployed.\n */\n async isDeployed(): Promise<boolean> {\n this.ensureSession();\n return isDeployed(this.provider, this.session!.walletAddress);\n }\n\n /**\n * Get on-chain session status.\n */\n async getSessionStatus(): Promise<SessionStatus> {\n this.ensureSession();\n return getSessionStatus(this.provider, this.session!.walletAddress, this.session!.sessionPubKey);\n }\n\n // ============ Session Management ============\n\n /**\n * Renew the current session (if in grace period).\n */\n async renewSession(): Promise<string> {\n this.ensureSession();\n const oldSession = this.session!;\n\n const { privateKey, publicKey } = generateSessionKeyPair();\n const now = BigInt(Math.floor(Date.now() / 1000));\n const duration = BigInt(this.config.sessionDuration ?? 86400);\n const grace = BigInt(this.config.renewalGracePeriod ?? 172800);\n const nonceParams = generateNonceParams(publicKey, now, duration, grace);\n const nonce = computeNonce(nonceParams);\n\n const txHash = await renewSession(\n this.provider,\n oldSession,\n { sessionPubKey: publicKey, nonce, nonceParams, sessionPolicy: this.config.policy },\n this.getPaymasterKey(),\n this.config.network,\n );\n\n // Update session with new keys\n this.session = {\n ...oldSession,\n sessionPrivateKey: privateKey,\n sessionPubKey: publicKey,\n nonce,\n nonceParams,\n sessionPolicy: this.config.policy,\n };\n saveSession(this.config.appId, this.session);\n\n return txHash;\n }\n\n /**\n * Revoke a specific session key (defaults to current).\n */\n async revokeSession(sessionKey?: string): Promise<string> {\n this.ensureSession();\n const keyToRevoke = sessionKey ?? this.session!.sessionPubKey;\n return revokeSession(\n this.provider,\n this.session!,\n keyToRevoke,\n this.getSalt(),\n this.getPaymasterKey(),\n this.config.network,\n this.config.backendUrl,\n );\n }\n\n /**\n * Emergency revoke all sessions.\n */\n async emergencyRevokeAll(): Promise<string> {\n this.ensureSession();\n return emergencyRevokeAllSessions(\n this.provider,\n this.session!,\n this.getSalt(),\n this.getPaymasterKey(),\n this.config.network,\n this.config.backendUrl,\n );\n }\n\n // ============ Internals ============\n\n private ensureSession(): void {\n if (!this.session) {\n throw new Error('Not authenticated. Call login() first.');\n }\n }\n\n private getSalt(): string {\n return this.appSalt ?? '0x0';\n }\n\n private getPaymasterKey(): string {\n return this.config.paymasterApiKey ?? DEFAULT_PAYMASTER_KEY;\n }\n\n private restoreSession(): void {\n const stored = loadSession(this.config.appId);\n if (!stored) return;\n\n // Reconstruct session — JWT may be expired, but session key may still be valid on-chain\n this.session = {\n jwt: stored.jwt ?? '',\n sessionPrivateKey: stored.sessionPrivateKey,\n sessionPubKey: stored.sessionPubKey,\n nonce: stored.nonce,\n nonceParams: stored.nonceParams,\n jwtClaims: stored.jwtClaims ?? { sub: '', nonce: '', exp: 0, iss: '', aud: '' },\n walletAddress: stored.walletAddress ?? '',\n addressSeed: stored.addressSeed ?? '',\n sessionPolicy: stored.sessionPolicy,\n appSalt: stored.appSalt,\n walletName: stored.walletName,\n };\n this.appSalt = stored.appSalt ?? null;\n }\n}\n","import { ec, num, hash, shortString } from 'starknet';\nimport { getRandomBytes } from '../utils/crypto';\nimport {\n base64UrlToBytes, bytesToU128Limbs, subToFelt, stringToFelt,\n parseJWT, extractKidFromJwt, findClaimOffsets, base64UrlToBase64,\n} from '../utils/encoding';\nimport { computeMerkleRoot, computeMerkleProof } from './MerkleTree';\nimport { OAUTH_JWT_V1_MAGIC, SESSION_V1_MAGIC, STARK_CURVE_ORDER } from '../utils/constants';\nimport { NonceParams, SessionKeyPolicy } from '../types';\n\n/**\n * Generate a new session key pair.\n */\nexport function generateSessionKeyPair(): { privateKey: string; publicKey: string } {\n const randomBytes = getRandomBytes(32);\n let pk = BigInt('0x' + Array.from(randomBytes).map(b => b.toString(16).padStart(2, '0')).join(''));\n pk = (pk % (STARK_CURVE_ORDER - 1n)) + 1n;\n const privateKey = '0x' + pk.toString(16);\n const publicKey = ec.starkCurve.getStarkKey(privateKey);\n return { privateKey, publicKey };\n}\n\n/**\n * Build a lightweight session signature (SESSION_V1).\n * Used for transactions after the session is registered on-chain.\n */\nexport function buildSessionSignature(\n transactionHash: string,\n sessionPrivateKey: string,\n sessionPubKey: string,\n calls?: { contractAddress: string }[],\n policy?: SessionKeyPolicy,\n): string[] {\n const signature = ec.starkCurve.sign(transactionHash, sessionPrivateKey);\n\n const sig: string[] = [\n SESSION_V1_MAGIC,\n num.toHex(signature.r),\n num.toHex(signature.s),\n sessionPubKey,\n ];\n\n if (calls && policy?.allowedContracts?.length) {\n for (const call of calls) {\n const proof = computeMerkleProof(policy.allowedContracts, call.contractAddress);\n sig.push(num.toHex(proof.length));\n sig.push(...proof);\n }\n }\n\n return sig;\n}\n\n/**\n * Build the full JWT signature data (OAUTH_JWT_V1) for on-chain verification.\n * Used for the first transaction to register the session.\n */\nexport async function buildJWTSignatureData(\n transactionHash: string,\n session: {\n jwt: string;\n sessionPrivateKey: string;\n sessionPubKey: string;\n nonce: string;\n nonceParams: NonceParams;\n jwtClaims: { sub: string; nonce: string; exp: number; iss: string; aud: string };\n sessionPolicy?: SessionKeyPolicy;\n },\n salt: string,\n backendUrl: string,\n): Promise<string[]> {\n const { jwt, sessionPrivateKey, sessionPubKey, nonceParams, jwtClaims } = session;\n\n const signature = ec.starkCurve.sign(transactionHash, sessionPrivateKey);\n\n // Extract RSA signature from JWT\n const jwtParts = jwt.split('.');\n const rsaSignature = base64UrlToBytes(jwtParts[2]);\n const rsaLimbs = bytesToU128Limbs(rsaSignature);\n\n // Get signed data (header.payload)\n const signedData = `${jwtParts[0]}.${jwtParts[1]}`;\n const signedDataBytes = Buffer.from(signedData, 'utf-8');\n\n const offsets = findClaimOffsets(jwt);\n const jwt_sub_felt = subToFelt(jwtClaims.sub);\n const salt_hex = num.toHex(salt);\n\n // Pack signedDataBytes into 31-byte chunks\n const packedBytes: string[] = [];\n const PACK_SIZE = 31;\n for (let i = 0; i < signedDataBytes.length; i += PACK_SIZE) {\n let chunk = 0n;\n const end = Math.min(i + PACK_SIZE, signedDataBytes.length);\n for (let j = i; j < end; j++) {\n chunk = (chunk * 256n) + BigInt(signedDataBytes[j]);\n }\n packedBytes.push(num.toHex(chunk));\n }\n\n // Calculate Montgomery constants for RSA verification\n const kid = extractKidFromJwt(jwt);\n const iss = jwtClaims.iss;\n const modulusLimbs = await fetchModulusForKid(kid, iss, backendUrl);\n const { n_prime, r_sq } = calculateMontgomeryConstants(modulusLimbs);\n\n const sig: string[] = [\n OAUTH_JWT_V1_MAGIC,\n num.toHex(signature.r),\n num.toHex(signature.s),\n sessionPubKey,\n num.toHex(nonceParams.validUntil),\n num.toHex(nonceParams.randomness),\n jwt_sub_felt,\n session.nonce,\n num.toHex(jwtClaims.exp),\n stringToFelt(kid),\n stringToFelt(jwtClaims.iss),\n stringToFelt(jwtClaims.aud),\n salt_hex,\n num.toHex(offsets.sub_offset),\n num.toHex(offsets.sub_len),\n num.toHex(offsets.nonce_offset),\n num.toHex(offsets.nonce_len),\n num.toHex(offsets.kid_offset),\n num.toHex(offsets.kid_len),\n num.toHex(16),\n ...rsaLimbs,\n num.toHex(16),\n ...n_prime,\n num.toHex(16),\n ...r_sq,\n num.toHex(signedDataBytes.length),\n ...packedBytes,\n ];\n\n // Append policy fields\n sig.push(num.toHex(nonceParams.validAfter));\n\n const policy = session.sessionPolicy;\n if (policy) {\n const merkleRoot = policy.allowedContracts.length > 0\n ? computeMerkleRoot(policy.allowedContracts)\n : '0x0';\n sig.push(merkleRoot);\n sig.push(num.toHex(policy.maxCallsPerTx));\n sig.push(num.toHex(policy.spendingLimits.length));\n for (const limit of policy.spendingLimits) {\n sig.push(num.toHex(limit.token));\n const limitBig = BigInt(limit.limit);\n sig.push(num.toHex(limitBig & ((1n << 128n) - 1n)));\n sig.push(num.toHex(limitBig >> 128n));\n }\n } else {\n sig.push('0x0');\n sig.push(num.toHex(10));\n sig.push(num.toHex(0));\n }\n\n return sig;\n}\n\n// ---- Internal helpers ----\n\nasync function fetchModulusForKid(kid: string, issuer: string, backendUrl: string): Promise<bigint[]> {\n let jwksUrl = 'https://www.googleapis.com/oauth2/v3/certs';\n if (issuer === 'https://appleid.apple.com') {\n jwksUrl = 'https://appleid.apple.com/auth/keys';\n } else if (issuer === 'https://cavos.app/firebase') {\n jwksUrl = `${backendUrl}/api/jwks/firebase`;\n }\n\n const response = await fetch(jwksUrl);\n const data: any = await response.json();\n const jwks = data.jwks || data;\n\n if (!jwks.keys || !Array.isArray(jwks.keys)) {\n throw new Error(`Invalid JWKS response from ${jwksUrl}`);\n }\n\n const key = jwks.keys.find((k: any) => k.kid === kid);\n if (!key || !key.n) {\n throw new Error(`Key not found for kid: ${kid}`);\n }\n\n const modulusBytes = base64UrlToBytes(key.n);\n const limbs = bytesToU128Limbs(modulusBytes);\n return limbs.map(l => BigInt(l));\n}\n\nfunction calculateMontgomeryConstants(n_limbs: bigint[]): { n_prime: string[]; r_sq: string[] } {\n let n = 0n;\n for (let i = 0; i < n_limbs.length; i++) {\n n += n_limbs[i] * (1n << (BigInt(i) * 128n));\n }\n\n const R = 1n << 2048n;\n\n function modInverse(a: bigint, mod: bigint): bigint {\n let t = 0n, newt = 1n, r = mod, newr = a;\n while (newr !== 0n) {\n const q = r / newr;\n [t, newt] = [newt, t - q * newt];\n [r, newr] = [newr, r - q * newr];\n }\n if (r > 1n) throw new Error('n is not invertible');\n if (t < 0n) t += mod;\n return t;\n }\n\n const n_inv = modInverse(n, R);\n const n_prime_val = (R - n_inv) % R;\n const r_sq_val = (R * R) % n;\n\n const toLimbs = (val: bigint): string[] => {\n const limbs: string[] = [];\n for (let i = 0; i < 16; i++) {\n const limb = (val >> (BigInt(i) * 128n)) & ((1n << 128n) - 1n);\n limbs.push(num.toHex(limb));\n }\n return limbs;\n };\n\n return { n_prime: toLimbs(n_prime_val), r_sq: toLimbs(r_sq_val) };\n}\n","import { randomBytes } from 'crypto';\n\n/**\n * Generate cryptographically secure random bytes (Node.js native)\n */\nexport function getRandomBytes(length: number): Uint8Array {\n return new Uint8Array(randomBytes(length));\n}\n\n/**\n * Generate a random bigint within the Stark field (< 2^251)\n */\nexport function randomFieldElement(): bigint {\n const bytes = getRandomBytes(32);\n const hex = Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\n return BigInt('0x' + hex) % (2n ** 251n);\n}\n","import { num } from 'starknet';\n\n/**\n * Convert base64url string to standard base64\n */\nexport function base64UrlToBase64(base64url: string): string {\n return base64url\n .replace(/-/g, '+')\n .replace(/_/g, '/')\n .padEnd(base64url.length + (4 - (base64url.length % 4)) % 4, '=');\n}\n\n/**\n * Decode base64url string to bytes\n */\nexport function base64UrlToBytes(base64url: string): Uint8Array {\n const base64 = base64UrlToBase64(base64url);\n const buf = Buffer.from(base64, 'base64');\n return new Uint8Array(buf);\n}\n\n/**\n * Convert bytes to 16 x u128 limbs (Little-Endian) for RSA on-chain verification\n */\nexport function bytesToU128Limbs(bytes: Uint8Array): string[] {\n const limbs: string[] = [];\n for (let i = 15; i >= 0; i--) {\n let limb = 0n;\n for (let j = 0; j < 16; j++) {\n const byteIdx = i * 16 + j;\n if (byteIdx < bytes.length) {\n limb = (limb * 256n) + BigInt(bytes[byteIdx]);\n }\n }\n limbs.push(num.toHex(limb));\n }\n return limbs;\n}\n\n/**\n * Convert an OAuth sub claim to felt252\n */\nexport function subToFelt(sub: string): string {\n try {\n const subBigInt = BigInt(sub);\n if (subBigInt < 2n ** 251n) {\n return num.toHex(subBigInt);\n }\n } catch {\n // Not a pure number (e.g. Apple sub)\n }\n return stringToFelt(sub);\n}\n\n/**\n * Convert a short string to felt252 (max 31 bytes)\n */\nexport function stringToFelt(str: string): string {\n const bytes = Buffer.from(str, 'utf-8');\n let result = 0n;\n for (let i = 0; i < bytes.length && i < 31; i++) {\n result = result * 256n + BigInt(bytes[i]);\n }\n return num.toHex(result);\n}\n\n/**\n * Parse a JWT token and extract claims\n */\nexport function parseJWT(jwt: string): { sub: string; nonce: string; exp: number; iss: string; aud: string } {\n const parts = jwt.split('.');\n if (parts.length !== 3) {\n throw new Error('Invalid JWT format');\n }\n const payload = JSON.parse(Buffer.from(base64UrlToBase64(parts[1]), 'base64').toString('utf-8'));\n return {\n sub: payload.sub,\n nonce: payload.nonce,\n exp: payload.exp,\n iss: payload.iss,\n aud: Array.isArray(payload.aud) ? payload.aud[0] : payload.aud,\n };\n}\n\n/**\n * Extract the Key ID (kid) from a JWT header\n */\nexport function extractKidFromJwt(jwt: string): string {\n const parts = jwt.split('.');\n const header = JSON.parse(Buffer.from(base64UrlToBase64(parts[0]), 'base64').toString('utf-8'));\n return header.kid || '';\n}\n\n/**\n * Find claim offsets in the decoded JWT segments for on-chain verification\n */\nexport function findClaimOffsets(jwt: string): {\n sub_offset: number; sub_len: number;\n nonce_offset: number; nonce_len: number;\n kid_offset: number; kid_len: number;\n} {\n const parts = jwt.split('.');\n const headerJson = JSON.parse(Buffer.from(base64UrlToBase64(parts[0]), 'base64').toString('utf-8'));\n const payloadJson = JSON.parse(Buffer.from(base64UrlToBase64(parts[1]), 'base64').toString('utf-8'));\n\n const subValue = payloadJson.sub || '';\n const nonceValue = payloadJson.nonce || '';\n const kidValue = headerJson.kid || '';\n\n const decodedPayload = Buffer.from(base64UrlToBase64(parts[1]), 'base64').toString('utf-8');\n const decodedHeader = Buffer.from(base64UrlToBase64(parts[0]), 'base64').toString('utf-8');\n\n const findClaimValueOffset = (decoded: string, key: string, value: string): number => {\n const exactPattern = `\"${key}\":\"${value}\"`;\n let idx = decoded.indexOf(exactPattern);\n if (idx >= 0) return idx + key.length + 4;\n\n const spacedPattern = `\"${key}\": \"${value}\"`;\n idx = decoded.indexOf(spacedPattern);\n if (idx >= 0) return idx + key.length + 5;\n\n const keyPattern = `\"${key}\"`;\n idx = decoded.indexOf(keyPattern);\n if (idx >= 0) {\n const colonIdx = decoded.indexOf(':', idx + key.length + 2);\n if (colonIdx >= 0) {\n const valueQuoteIdx = decoded.indexOf('\"', colonIdx + 1);\n if (valueQuoteIdx >= 0) return valueQuoteIdx + 1;\n }\n }\n return -1;\n };\n\n const subValueStart = findClaimValueOffset(decodedPayload, 'sub', subValue);\n if (subValueStart < 0) throw new Error('Failed to find sub claim in JWT payload');\n\n const nonceValueStart = findClaimValueOffset(decodedPayload, 'nonce', nonceValue);\n if (nonceValueStart < 0) throw new Error('Failed to find nonce claim in JWT payload');\n\n const kidValueStart = findClaimValueOffset(decodedHeader, 'kid', kidValue);\n if (kidValueStart < 0) throw new Error('Failed to find kid claim in JWT header');\n\n return {\n sub_offset: subValueStart, sub_len: subValue.length,\n nonce_offset: nonceValueStart, nonce_len: nonceValue.length,\n kid_offset: kidValueStart, kid_len: kidValue.length,\n };\n}\n","import { hash, num } from 'starknet';\n\n/**\n * Compute Merkle root from a list of allowed contract addresses.\n * Uses Poseidon hash, matching the on-chain verification.\n */\nexport function computeMerkleRoot(contracts: string[]): string {\n if (contracts.length === 0) return '0x0';\n\n let leaves = contracts.map(c =>\n hash.computePoseidonHashOnElements([num.toHex(c)])\n );\n\n leaves.sort((a, b) => {\n const aBig = BigInt(a);\n const bBig = BigInt(b);\n if (aBig < bBig) return -1;\n if (aBig > bBig) return 1;\n return 0;\n });\n\n while (leaves.length > 1) {\n const nextLevel: string[] = [];\n for (let i = 0; i < leaves.length; i += 2) {\n if (i + 1 < leaves.length) {\n const left = leaves[i];\n const right = leaves[i + 1];\n const leftBig = BigInt(left);\n const rightBig = BigInt(right);\n if (leftBig < rightBig) {\n nextLevel.push(hash.computePoseidonHashOnElements([left, right]));\n } else {\n nextLevel.push(hash.computePoseidonHashOnElements([right, left]));\n }\n } else {\n nextLevel.push(leaves[i]);\n }\n }\n leaves = nextLevel;\n }\n\n return leaves[0];\n}\n\n/**\n * Compute Merkle proof for a given contract address.\n */\nexport function computeMerkleProof(contracts: string[], targetContract: string): string[] {\n if (contracts.length === 0) return [];\n\n let leaves = contracts.map(c =>\n hash.computePoseidonHashOnElements([num.toHex(c)])\n );\n\n leaves.sort((a, b) => {\n const aBig = BigInt(a);\n const bBig = BigInt(b);\n if (aBig < bBig) return -1;\n if (aBig > bBig) return 1;\n return 0;\n });\n\n const targetLeaf = hash.computePoseidonHashOnElements([num.toHex(targetContract)]);\n let targetIdx = leaves.indexOf(targetLeaf);\n if (targetIdx === -1) return [];\n\n const proof: string[] = [];\n let currentLevel = [...leaves];\n\n while (currentLevel.length > 1) {\n const nextLevel: string[] = [];\n let nextTargetIdx = -1;\n\n for (let i = 0; i < currentLevel.length; i += 2) {\n if (i + 1 < currentLevel.length) {\n const left = currentLevel[i];\n const right = currentLevel[i + 1];\n\n if (i === targetIdx || i + 1 === targetIdx) {\n proof.push(i === targetIdx ? right : left);\n nextTargetIdx = Math.floor(i / 2);\n }\n\n const leftBig = BigInt(left);\n const rightBig = BigInt(right);\n if (leftBig < rightBig) {\n nextLevel.push(hash.computePoseidonHashOnElements([left, right]));\n } else {\n nextLevel.push(hash.computePoseidonHashOnElements([right, left]));\n }\n } else {\n if (i === targetIdx) {\n nextTargetIdx = Math.floor(i / 2);\n }\n nextLevel.push(currentLevel[i]);\n }\n }\n\n currentLevel = nextLevel;\n targetIdx = nextTargetIdx;\n }\n\n return proof;\n}\n","// Signature magic values (must match Cairo contract)\nexport const OAUTH_JWT_V1_MAGIC = '0x4f415554485f4a57545f5631';\nexport const SESSION_V1_MAGIC = '0x53455353494f4e5f5631';\n\n// Stark curve order\nexport const STARK_CURVE_ORDER = BigInt('0x800000000000010ffffffffffffffffb781126dcae7b2321e66a241adc64d2f');\n\n// Well-known token addresses (Sepolia)\nexport const TOKENS_SEPOLIA = {\n STRK: '0x04718f5a0Fc34cC1AF16A1cdee98fFB20C31f5cD61D6Ab07201858f4287c938D',\n ETH: '0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7',\n} as const;\n\n// Well-known token addresses (Mainnet)\nexport const TOKENS_MAINNET = {\n STRK: '0x04718f5a0Fc34cC1AF16A1cdee98fFB20C31f5cD61D6Ab07201858f4287c938D',\n ETH: '0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7',\n} as const;\n\n// Default RPC URLs\nexport const DEFAULT_RPC = {\n mainnet: 'https://starknet-mainnet.g.alchemy.com/starknet/version/rpc/v0_10/dql5pMT88iueZWl7L0yzT56uVk0EBU4L',\n sepolia: 'https://starknet-sepolia.g.alchemy.com/starknet/version/rpc/v0_10/dql5pMT88iueZWl7L0yzT56uVk0EBU4L',\n} as const;\n\n// Default OAuth config (Sepolia)\nexport const DEFAULT_OAUTH_CONFIG_SEPOLIA = {\n jwksRegistryAddress: '0x05a19f14719dec9e27eb2aa38c5b68277bdb5c41570e548504722f737a3da6c6',\n cavosAccountClassHash: '0x40f4075372d7b9b964910755dcdf96935280c8b675272f656b2d43d1ae4bbf4',\n};\n\n// Default OAuth config (Mainnet)\nexport const DEFAULT_OAUTH_CONFIG_MAINNET = {\n jwksRegistryAddress: '0x07787f624d6869ae306dc17b49174b284dbadd1e999c1c8733ce72eb7ac518c2',\n cavosAccountClassHash: '0x40f4075372d7b9b964910755dcdf96935280c8b675272f656b2d43d1ae4bbf4',\n};\n\n// Default backend URL\nexport const DEFAULT_BACKEND_URL = 'https://cavos.xyz';\n\n// Default paymaster API key (shared Sepolia key)\nexport const DEFAULT_PAYMASTER_KEY = 'c37c52b7-ea5a-4426-8121-329a78354b0b';\n","import { hash, num } from 'starknet';\nimport { randomFieldElement } from '../utils/crypto';\nimport { NonceParams } from '../types';\n\n/**\n * Compute the nonce for a session.\n * Must match Cairo: PoseidonTrait::new().update(session_key).update(valid_until).update(randomness).finalize()\n */\nexport function computeNonce(params: NonceParams): string {\n return hash.computePoseidonHashOnElements([\n params.sessionPubKey,\n num.toHex(params.validUntil),\n num.toHex(params.randomness),\n ]);\n}\n\n/**\n * Generate nonce parameters for a new session.\n */\nexport function generateNonceParams(\n sessionPubKey: string,\n currentTimestamp: bigint,\n sessionDurationSeconds: bigint = 86400n,\n renewalGraceSeconds: bigint = 172800n,\n): NonceParams {\n const randomness = randomFieldElement();\n return {\n sessionPubKey,\n validAfter: currentTimestamp,\n validUntil: currentTimestamp + sessionDurationSeconds,\n renewalDeadline: currentTimestamp + renewalGraceSeconds,\n randomness,\n };\n}\n","import { hash, num } from 'starknet';\nimport { subToFelt, stringToFelt } from '../utils/encoding';\n\n/**\n * Compute the address seed from a user's OAuth `sub` claim and a salt.\n * The salt can optionally incorporate a wallet name to allow multiple addresses per sub.\n */\nexport function computeAddressSeed(sub: string, salt: string, walletName?: string): string {\n const subFeltVal = subToFelt(sub);\n let saltFelt = num.toHex(salt);\n\n if (walletName) {\n // If a wallet name is provided, we derive a new salt: Poseidon(app_salt, wallet_name)\n const nameFelt = stringToFelt(walletName);\n saltFelt = hash.computePoseidonHashOnElements([saltFelt, nameFelt]);\n }\n\n return hash.computePoseidonHashOnElements([subFeltVal, saltFelt]);\n}\n\n/**\n * Compute the contract address for an OAuth wallet.\n */\nexport function computeContractAddress(\n sub: string,\n salt: string,\n classHash: string,\n jwksRegistryAddress: string,\n walletName?: string,\n): string {\n const addressSeed = computeAddressSeed(sub, salt, walletName);\n const constructorCalldata = [addressSeed, jwksRegistryAddress];\n return hash.calculateContractAddressFromHash(\n addressSeed,\n classHash,\n constructorCalldata,\n 0,\n );\n}\n","import {\n RpcProvider,\n Call,\n num,\n typedData,\n hash,\n ec,\n} from 'starknet';\nimport { buildSessionSignature, buildJWTSignatureData } from './SessionKeyManager';\nimport { computeMerkleRoot } from './MerkleTree';\nimport { NonceParams, SessionKeyPolicy, SessionStatus } from '../types';\n\nexport interface TransactionSession {\n jwt: string;\n sessionPrivateKey: string;\n sessionPubKey: string;\n nonce: string;\n nonceParams: NonceParams;\n jwtClaims: { sub: string; nonce: string; exp: number; iss: string; aud: string };\n walletAddress: string;\n addressSeed: string;\n appSalt?: string;\n sessionPolicy?: SessionKeyPolicy;\n walletName?: string;\n}\n\n/**\n * Check if the account is deployed on-chain.\n */\nexport async function isDeployed(provider: RpcProvider, address: string): Promise<boolean> {\n try {\n const classHash = await provider.getClassHashAt(address, 'latest');\n return !!classHash;\n } catch {\n return false;\n }\n}\n\n/**\n * Get session status from on-chain.\n */\nexport async function getSessionStatus(\n provider: RpcProvider,\n walletAddress: string,\n sessionPubKey: string,\n): Promise<SessionStatus> {\n try {\n const result = await provider.callContract({\n contractAddress: walletAddress,\n entrypoint: 'get_session',\n calldata: [sessionPubKey],\n }, 'latest');\n\n const nonce = BigInt(result[0]);\n const validUntil = BigInt(result[2]);\n const renewalDeadline = BigInt(result[3]);\n\n const registered = nonce !== 0n;\n if (!registered) {\n return { registered: false, expired: false, canRenew: false };\n }\n\n const block = await provider.getBlock('latest');\n const now = BigInt(block.timestamp);\n const expired = now >= validUntil;\n const canRenew = expired && now < renewalDeadline;\n\n return { registered, expired, canRenew, validUntil, renewalDeadline };\n } catch {\n return { registered: false, expired: false, canRenew: false };\n }\n}\n\n/**\n * Deploy the OAuth account contract via AVNU Paymaster.\n */\nexport async function deployAccount(\n provider: RpcProvider,\n session: TransactionSession,\n classHash: string,\n jwksRegistryAddress: string,\n salt: string,\n paymasterApiKey: string,\n network: 'mainnet' | 'sepolia',\n backendUrl: string,\n): Promise<string> {\n const deployed = await isDeployed(provider, session.walletAddress);\n if (deployed) return 'already-deployed';\n\n const constructorCalldata = [\n num.toHex(session.addressSeed),\n num.toHex(jwksRegistryAddress),\n ];\n\n const baseUrl = network === 'mainnet'\n ? 'https://starknet.api.avnu.fi'\n : 'https://sepolia.api.avnu.fi';\n\n // Use AVNU deploy endpoint — build typed data with deployment data\n const buildResponse = await fetch(`${baseUrl}/paymaster/v1/build-typed-data`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': paymasterApiKey,\n },\n body: JSON.stringify({\n userAddress: session.walletAddress,\n calls: [],\n accountClassHash: classHash,\n accountCalldata: constructorCalldata,\n }),\n });\n\n if (!buildResponse.ok) {\n const errText = await buildResponse.text();\n if (errText.includes('already deployed')) return 'already-deployed';\n throw new Error(`Deploy build-typed-data failed: ${errText}`);\n }\n\n const paymasterTypedData = await buildResponse.json();\n const messageHash = computeTypedDataHash(paymasterTypedData, session.walletAddress);\n\n // Deploy always uses JWT signature\n const signature = await buildJWTSignatureData(messageHash, session, salt, backendUrl);\n\n const executeResponse = await fetch(`${baseUrl}/paymaster/v1/execute`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': paymasterApiKey,\n },\n body: JSON.stringify({\n userAddress: session.walletAddress,\n typedData: JSON.stringify(paymasterTypedData),\n signature,\n }),\n });\n\n if (!executeResponse.ok) {\n const errText = await executeResponse.text();\n if (errText.includes('already deployed')) return 'already-deployed';\n throw new Error(`Deploy execute failed: ${errText}`);\n }\n\n const result = (await executeResponse.json()) as { transactionHash: string };\n await provider.waitForTransaction(result.transactionHash);\n return result.transactionHash;\n}\n\n/**\n * Execute calls using the AVNU Paymaster.\n * Automatically handles session status:\n * - Not registered → JWT signature (registers + executes)\n * - Active → session signature\n * - Expired + renewable → throws (caller should renew first)\n * - Expired + not renewable → throws\n */\nexport async function execute(\n provider: RpcProvider,\n session: TransactionSession,\n calls: Call | Call[],\n salt: string,\n paymasterApiKey: string,\n network: 'mainnet' | 'sepolia',\n backendUrl: string,\n): Promise<string> {\n const callsArray = Array.isArray(calls) ? calls : [calls];\n\n const status = await getSessionStatus(provider, session.walletAddress, session.sessionPubKey);\n\n if (!status.registered) {\n return executeWithAVNU(provider, session, callsArray, salt, paymasterApiKey, network, backendUrl, true);\n }\n\n if (status.expired && status.canRenew) {\n throw new Error('SESSION_RENEWABLE: Session expired but can be renewed. Call renewSession() first.');\n }\n\n if (status.expired && !status.canRenew) {\n throw new Error('SESSION_EXPIRED: Session expired outside grace period. Please login again.');\n }\n\n return executeWithAVNU(provider, session, callsArray, salt, paymasterApiKey, network, backendUrl, false);\n}\n\n/**\n * Execute calls via AVNU API.\n */\nasync function executeWithAVNU(\n provider: RpcProvider,\n session: TransactionSession,\n calls: Call[],\n salt: string,\n paymasterApiKey: string,\n network: 'mainnet' | 'sepolia',\n backendUrl: string,\n forceJWT: boolean,\n): Promise<string> {\n const baseUrl = network === 'mainnet'\n ? 'https://starknet.api.avnu.fi'\n : 'https://sepolia.api.avnu.fi';\n\n const formattedCalls = calls.map(call => ({\n contractAddress: call.contractAddress,\n entrypoint: call.entrypoint,\n calldata: call.calldata\n ? (call.calldata as string[]).map(c => num.toHex(c))\n : [],\n }));\n\n const buildResponse = await fetch(`${baseUrl}/paymaster/v1/build-typed-data`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': paymasterApiKey,\n },\n body: JSON.stringify({\n userAddress: session.walletAddress,\n calls: formattedCalls,\n }),\n });\n\n if (!buildResponse.ok) {\n throw new Error(`Build typed data failed: ${await buildResponse.text()}`);\n }\n\n const paymasterTypedData = await buildResponse.json();\n const messageHash = computeTypedDataHash(paymasterTypedData, session.walletAddress);\n\n const signature = forceJWT\n ? await buildJWTSignatureData(messageHash, session, salt, backendUrl)\n : buildSessionSignature(\n messageHash,\n session.sessionPrivateKey,\n session.sessionPubKey,\n calls.map(c => ({ contractAddress: c.contractAddress })),\n session.sessionPolicy,\n );\n\n const executeResponse = await fetch(`${baseUrl}/paymaster/v1/execute`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': paymasterApiKey,\n },\n body: JSON.stringify({\n userAddress: session.walletAddress,\n typedData: JSON.stringify(paymasterTypedData),\n signature,\n }),\n });\n\n if (!executeResponse.ok) {\n const errorText = await executeResponse.text();\n if (errorText.includes('Session expired')) {\n throw new Error('SESSION_EXPIRED: Session has expired. Call renewSession() first.');\n }\n throw new Error(`Execute failed: ${errorText}`);\n }\n\n const result = (await executeResponse.json()) as { transactionHash: string };\n return result.transactionHash;\n}\n\n/**\n * Renew session using the grace period.\n * Old session key signs the new session params to authorize renewal.\n */\nexport async function renewSession(\n provider: RpcProvider,\n oldSession: TransactionSession,\n newSession: {\n sessionPubKey: string;\n nonce: string;\n nonceParams: NonceParams;\n sessionPolicy?: SessionKeyPolicy;\n },\n paymasterApiKey: string,\n network: 'mainnet' | 'sepolia',\n): Promise<string> {\n const policy = newSession.sessionPolicy;\n const allowedContractsRoot = policy?.allowedContracts?.length\n ? computeMerkleRoot(policy.allowedContracts)\n : '0x0';\n const maxCallsPerTx = policy?.maxCallsPerTx ?? 10;\n\n // Sign new session params with OLD key\n const message = hash.computePoseidonHashOnElements([\n newSession.sessionPubKey,\n newSession.nonce,\n num.toHex(newSession.nonceParams.validAfter),\n num.toHex(newSession.nonceParams.validUntil),\n num.toHex(newSession.nonceParams.renewalDeadline),\n allowedContractsRoot,\n num.toHex(maxCallsPerTx),\n ]);\n\n const oldSignature = ec.starkCurve.sign(message, oldSession.sessionPrivateKey);\n\n // Build spending policies calldata\n const spendingCalldata: string[] = [];\n if (policy?.spendingLimits?.length) {\n spendingCalldata.push(num.toHex(policy.spendingLimits.length));\n for (const limit of policy.spendingLimits) {\n spendingCalldata.push(num.toHex(limit.token));\n const limitBig = BigInt(limit.limit);\n spendingCalldata.push(num.toHex(limitBig & ((1n << 128n) - 1n)));\n spendingCalldata.push(num.toHex(limitBig >> 128n));\n }\n } else {\n spendingCalldata.push(num.toHex(0));\n }\n\n const renewCall: Call = {\n contractAddress: oldSession.walletAddress,\n entrypoint: 'renew_session',\n calldata: [\n oldSession.sessionPubKey,\n num.toHex(oldSignature.r),\n num.toHex(oldSignature.s),\n newSession.sessionPubKey,\n newSession.nonce,\n num.toHex(newSession.nonceParams.validAfter),\n num.toHex(newSession.nonceParams.validUntil),\n num.toHex(newSession.nonceParams.renewalDeadline),\n allowedContractsRoot,\n num.toHex(maxCallsPerTx),\n ...spendingCalldata,\n ],\n };\n\n const baseUrl = network === 'mainnet'\n ? 'https://starknet.api.avnu.fi'\n : 'https://sepolia.api.avnu.fi';\n\n const buildResponse = await fetch(`${baseUrl}/paymaster/v1/build-typed-data`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': paymasterApiKey,\n },\n body: JSON.stringify({\n userAddress: oldSession.walletAddress,\n calls: [{\n contractAddress: renewCall.contractAddress,\n entrypoint: renewCall.entrypoint,\n calldata: renewCall.calldata,\n }],\n }),\n });\n\n if (!buildResponse.ok) {\n throw new Error(`Renew build-typed-data failed: ${await buildResponse.text()}`);\n }\n\n const paymasterTypedData = await buildResponse.json();\n const messageHash = computeTypedDataHash(paymasterTypedData, oldSession.walletAddress);\n\n const signature = buildSessionSignature(\n messageHash,\n oldSession.sessionPrivateKey,\n oldSession.sessionPubKey,\n );\n\n const executeResponse = await fetch(`${baseUrl}/paymaster/v1/execute`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': paymasterApiKey,\n },\n body: JSON.stringify({\n userAddress: oldSession.walletAddress,\n typedData: JSON.stringify(paymasterTypedData),\n signature,\n }),\n });\n\n if (!executeResponse.ok) {\n const errorText = await executeResponse.text();\n if (errorText.includes('Renewal period expired')) {\n throw new Error('Grace period expired. Please login again.');\n }\n throw new Error(`Renew session failed: ${errorText}`);\n }\n\n const result = await executeResponse.json();\n return result.transactionHash;\n}\n\n/**\n * Revoke a specific session key.\n */\nexport async function revokeSession(\n provider: RpcProvider,\n session: TransactionSession,\n sessionKeyToRevoke: string,\n salt: string,\n paymasterApiKey: string,\n network: 'mainnet' | 'sepolia',\n backendUrl: string,\n): Promise<string> {\n const revokeCall: Call = {\n contractAddress: session.walletAddress,\n entrypoint: 'revoke_session',\n calldata: [sessionKeyToRevoke],\n };\n\n return execute(provider, session, [revokeCall], salt, paymasterApiKey, network, backendUrl);\n}\n\n/**\n * Emergency revoke all sessions (increments revocation epoch).\n */\nexport async function emergencyRevokeAllSessions(\n provider: RpcProvider,\n session: TransactionSession,\n salt: string,\n paymasterApiKey: string,\n network: 'mainnet' | 'sepolia',\n backendUrl: string,\n): Promise<string> {\n const revokeCall: Call = {\n contractAddress: session.walletAddress,\n entrypoint: 'emergency_revoke',\n calldata: [],\n };\n\n return execute(provider, session, [revokeCall], salt, paymasterApiKey, network, backendUrl);\n}\n\n/**\n * Query ERC-20 balance.\n */\nexport async function getBalance(\n provider: RpcProvider,\n tokenAddress: string,\n walletAddress: string,\n): Promise<bigint> {\n const result = await provider.callContract({\n contractAddress: tokenAddress,\n entrypoint: 'balanceOf',\n calldata: [walletAddress],\n });\n // u256 = (low, high)\n const low = BigInt(result[0]);\n const high = BigInt(result[1]);\n return low + (high << 128n);\n}\n\n// ---- Internal ----\n\nfunction computeTypedDataHash(paymasterTypedData: any, address: string): string {\n return typedData.getMessageHash(paymasterTypedData, address);\n}\n","import { parseJWT } from '../utils/encoding';\n\n/**\n * Login with Firebase email/password via the Cavos backend.\n * Returns the JWT token on success.\n */\nexport async function firebaseLogin(\n backendUrl: string,\n appId: string,\n email: string,\n password: string,\n nonce: string,\n): Promise<{ jwt: string; claims: { sub: string; nonce: string; exp: number; iss: string; aud: string } }> {\n const response = await fetch(`${backendUrl}/api/oauth/firebase/login`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email, password, nonce, app_id: appId }),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Login failed' }));\n if (error.error === 'email_not_verified') {\n throw new Error('Email not verified. Please verify your email on agent.cavos.xyz first.');\n }\n throw new Error(error.error || 'Login failed');\n }\n\n const { jwt } = await response.json();\n const claims = parseJWT(jwt);\n\n if (claims.nonce !== nonce) {\n throw new Error('JWT nonce mismatch. Possible replay attack.');\n }\n\n return { jwt, claims };\n}\n\n/**\n * Validate app access and get app salt.\n */\nexport async function validateApp(\n backendUrl: string,\n appId: string,\n network: string,\n): Promise<{ allowed: boolean; appSalt?: string }> {\n try {\n const response = await fetch(\n `${backendUrl}/api/apps/${appId}/validate?network=${network}`,\n );\n if (!response.ok) return { allowed: true };\n const result = await response.json();\n return { allowed: result.allowed !== false, appSalt: result.app_salt };\n } catch {\n return { allowed: true };\n }\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { StoredSession, NonceParams, SessionKeyPolicy } from '../types';\n\nconst CAVOS_DIR = path.join(os.homedir(), '.cavos');\nconst SESSIONS_DIR = path.join(CAVOS_DIR, 'sessions');\nconst CONFIG_FILE = path.join(CAVOS_DIR, 'config.json');\n\nfunction ensureDir(dir: string): void {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true, mode: 0o700 });\n }\n}\n\n/**\n * Save a session to disk.\n */\nexport function saveSession(appId: string, session: {\n sessionPrivateKey: string;\n sessionPubKey: string;\n nonceParams: NonceParams;\n nonce: string;\n jwt?: string;\n jwtClaims?: { sub: string; nonce: string; exp: number; iss: string; aud: string };\n walletAddress?: string;\n addressSeed?: string;\n appSalt?: string;\n sessionPolicy?: SessionKeyPolicy;\n walletName?: string;\n}): void {\n ensureDir(SESSIONS_DIR);\n const stored: StoredSession = {\n sessionPrivateKey: session.sessionPrivateKey,\n sessionPubKey: session.sessionPubKey,\n nonceParams: {\n sessionPubKey: session.nonceParams.sessionPubKey,\n validAfter: session.nonceParams.validAfter.toString(),\n validUntil: session.nonceParams.validUntil.toString(),\n renewalDeadline: session.nonceParams.renewalDeadline.toString(),\n randomness: session.nonceParams.randomness.toString(),\n },\n nonce: session.nonce,\n jwt: session.jwt,\n jwtClaims: session.jwtClaims,\n walletAddress: session.walletAddress,\n addressSeed: session.addressSeed,\n sessionPolicy: session.sessionPolicy ? {\n spendingLimits: session.sessionPolicy.spendingLimits.map(sl => ({\n token: sl.token,\n limit: sl.limit.toString(),\n })),\n allowedContracts: session.sessionPolicy.allowedContracts,\n maxCallsPerTx: session.sessionPolicy.maxCallsPerTx,\n } : undefined,\n appSalt: session.appSalt,\n walletName: session.walletName,\n };\n const filePath = path.join(SESSIONS_DIR, `${appId}.json`);\n fs.writeFileSync(filePath, JSON.stringify(stored, null, 2), { mode: 0o600 });\n}\n\n/**\n * Load a session from disk. Returns null if not found.\n */\nexport function loadSession(appId: string): {\n sessionPrivateKey: string;\n sessionPubKey: string;\n nonceParams: NonceParams;\n nonce: string;\n jwt?: string;\n jwtClaims?: { sub: string; nonce: string; exp: number; iss: string; aud: string };\n walletAddress?: string;\n addressSeed?: string;\n appSalt?: string;\n sessionPolicy?: SessionKeyPolicy;\n walletName?: string;\n} | null {\n const filePath = path.join(SESSIONS_DIR, `${appId}.json`);\n if (!fs.existsSync(filePath)) return null;\n\n try {\n const stored: StoredSession = JSON.parse(fs.readFileSync(filePath, 'utf-8'));\n return {\n sessionPrivateKey: stored.sessionPrivateKey,\n sessionPubKey: stored.sessionPubKey,\n nonceParams: {\n sessionPubKey: stored.nonceParams.sessionPubKey,\n validAfter: BigInt(stored.nonceParams.validAfter),\n validUntil: BigInt(stored.nonceParams.validUntil),\n renewalDeadline: BigInt(stored.nonceParams.renewalDeadline),\n randomness: BigInt(stored.nonceParams.randomness),\n },\n nonce: stored.nonce,\n jwt: stored.jwt,\n jwtClaims: stored.jwtClaims,\n walletAddress: stored.walletAddress,\n addressSeed: stored.addressSeed,\n sessionPolicy: stored.sessionPolicy ? {\n spendingLimits: stored.sessionPolicy.spendingLimits.map(sl => ({\n token: sl.token,\n limit: BigInt(sl.limit),\n })),\n allowedContracts: stored.sessionPolicy.allowedContracts,\n maxCallsPerTx: stored.sessionPolicy.maxCallsPerTx,\n } : undefined,\n appSalt: stored.appSalt,\n walletName: stored.walletName,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Delete a session from disk.\n */\nexport function deleteSession(appId: string): void {\n const filePath = path.join(SESSIONS_DIR, `${appId}.json`);\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n }\n}\n\nconst POLICY_FILE = path.join(CAVOS_DIR, 'policy.json');\n\n/**\n * Load policy from disk.\n */\nexport function loadPolicy(): SessionKeyPolicy | undefined {\n if (!fs.existsSync(POLICY_FILE)) return undefined;\n try {\n const stored = JSON.parse(fs.readFileSync(POLICY_FILE, 'utf-8'));\n return {\n spendingLimits: (stored.spendingLimits || []).map((sl: any) => ({\n token: sl.token,\n limit: BigInt(sl.limit),\n })),\n allowedContracts: stored.allowedContracts || [],\n maxCallsPerTx: stored.maxCallsPerTx || 10,\n };\n } catch {\n return undefined;\n }\n}\n\n/**\n * Save policy to disk.\n */\nexport function savePolicy(policy: SessionKeyPolicy): void {\n ensureDir(CAVOS_DIR);\n const stored = {\n spendingLimits: policy.spendingLimits.map((sl) => ({\n token: sl.token,\n limit: sl.limit.toString(),\n })),\n allowedContracts: policy.allowedContracts,\n maxCallsPerTx: policy.maxCallsPerTx,\n };\n fs.writeFileSync(POLICY_FILE, JSON.stringify(stored, null, 2), { mode: 0o600 });\n}\n\n/**\n * Save CLI config.\n */\nexport function saveConfig(config: { defaultAppId?: string; network?: string }): void {\n ensureDir(CAVOS_DIR);\n const existing = loadConfig();\n const merged = { ...existing, ...config };\n fs.writeFileSync(CONFIG_FILE, JSON.stringify(merged, null, 2), { mode: 0o600 });\n}\n\n/**\n * Load CLI config.\n */\nexport function loadConfig(): { defaultAppId?: string; network?: string } {\n if (!fs.existsSync(CONFIG_FILE)) return {};\n try {\n return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf-8'));\n } catch {\n return {};\n }\n}\n","[\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_whoami\",\n \"description\": \"Show current session info: wallet address, deployment status, and on-chain session validity. Call this first to confirm the agent is authenticated and ready.\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {}\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_balance\",\n \"description\": \"Show token balance for the current wallet. Returns ETH and STRK balances by default, or a specific token if provided. Always check balance before attempting a transfer.\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"token\": {\n \"type\": \"string\",\n \"description\": \"Token symbol (STRK, ETH) or full contract address. Omit to show both ETH and STRK.\"\n }\n }\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_transfer\",\n \"description\": \"Transfer ERC-20 tokens to another Starknet address. Amounts are in human-readable units (e.g. '1.5' for 1.5 STRK). The session must be active on-chain. Verify balance first.\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"to\": {\n \"type\": \"string\",\n \"description\": \"Recipient Starknet address (hex, e.g. 0x...)\"\n },\n \"amount\": {\n \"type\": \"string\",\n \"description\": \"Amount in human-readable units (e.g. '1.5', '0.01')\"\n },\n \"token\": {\n \"type\": \"string\",\n \"description\": \"Token symbol (STRK, ETH) or contract address. Defaults to STRK.\",\n \"default\": \"STRK\"\n }\n },\n \"required\": [\n \"to\",\n \"amount\"\n ]\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_approve\",\n \"description\": \"Approve a spender contract to spend up to a specified amount of tokens on behalf of the wallet. Required before interacting with DeFi protocols.\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"spender\": {\n \"type\": \"string\",\n \"description\": \"Starknet address of the contract being approved to spend tokens\"\n },\n \"amount\": {\n \"type\": \"string\",\n \"description\": \"Maximum amount to approve in human-readable units (e.g. '100')\"\n },\n \"token\": {\n \"type\": \"string\",\n \"description\": \"Token symbol (STRK, ETH) or contract address. Defaults to STRK.\",\n \"default\": \"STRK\"\n }\n },\n \"required\": [\n \"spender\",\n \"amount\"\n ]\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_execute\",\n \"description\": \"Execute an arbitrary contract call on Starknet. Use this for any contract interaction not covered by transfer or approve. Calldata values are comma-separated hex or decimal strings.\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"contract\": {\n \"type\": \"string\",\n \"description\": \"Target contract address (hex)\"\n },\n \"entrypoint\": {\n \"type\": \"string\",\n \"description\": \"Name of the function/entrypoint to call (e.g. 'swap', 'deposit')\"\n },\n \"calldata\": {\n \"type\": \"string\",\n \"description\": \"Comma-separated calldata values (hex or decimal). Omit if the function takes no arguments.\"\n }\n },\n \"required\": [\n \"contract\",\n \"entrypoint\"\n ]\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_session_status\",\n \"description\": \"Show on-chain session status for the current session key: whether it is registered, active, expired, or renewable. Use this to diagnose transaction failures.\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {}\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_multicall\",\n \"description\": \"Execute multiple contract calls atomically in a single transaction. All calls succeed or all fail together. Use this instead of calling cavos_execute multiple times when you need to batch operations (e.g., approve + swap in one tx). More efficient and safer than sequential calls.\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"calls\": {\n \"type\": \"array\",\n \"description\": \"Array of contract calls to execute atomically\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"contract\": {\n \"type\": \"string\",\n \"description\": \"Target contract address (hex)\"\n },\n \"entrypoint\": {\n \"type\": \"string\",\n \"description\": \"Name of the function/entrypoint to call\"\n },\n \"calldata\": {\n \"type\": \"string\",\n \"description\": \"Comma-separated calldata values (hex or decimal). Omit if the function takes no arguments.\"\n }\n },\n \"required\": [\n \"contract\",\n \"entrypoint\"\n ]\n },\n \"minItems\": 2\n }\n },\n \"required\": [\n \"calls\"\n ]\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_policy_show\",\n \"description\": \"Show the local spending policy: allowed contracts and per-token spending limits. The agent will refuse transactions that violate this policy.\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {}\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_call\",\n \"description\": \"Execute a read-only contract call on Starknet. Use this to query state (e.g. balance, allowance, owner) without spending gas.\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"contract\": {\n \"type\": \"string\",\n \"description\": \"Target contract address (hex)\"\n },\n \"entrypoint\": {\n \"type\": \"string\",\n \"description\": \"Name of the view function to call\"\n },\n \"calldata\": {\n \"type\": \"string\",\n \"description\": \"Comma-separated arguments or JSON array string\"\n }\n },\n \"required\": [\n \"contract\",\n \"entrypoint\"\n ]\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_simulate\",\n \"description\": \"Simulate a transaction execution to check for errors and gas usage before sending it. Highly recommended for complex interactions.\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"contract\": {\n \"type\": \"string\",\n \"description\": \"Target contract address (hex)\"\n },\n \"entrypoint\": {\n \"type\": \"string\",\n \"description\": \"Name of the function to simulate\"\n },\n \"calldata\": {\n \"type\": \"string\",\n \"description\": \"Comma-separated arguments or JSON array string\"\n }\n },\n \"required\": [\n \"contract\",\n \"entrypoint\"\n ]\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_estimate\",\n \"description\": \"Estimate grid fees for a transaction. Useful for checking if the wallet has enough funds to cover gas.\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"contract\": {\n \"type\": \"string\",\n \"description\": \"Target contract address (hex)\"\n },\n \"entrypoint\": {\n \"type\": \"string\",\n \"description\": \"Name of the function to estimate\"\n },\n \"calldata\": {\n \"type\": \"string\",\n \"description\": \"Comma-separated arguments or JSON array string\"\n }\n },\n \"required\": [\n \"contract\",\n \"entrypoint\"\n ]\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_contract_get_abi\",\n \"description\": \"Fetch the ABI of a contract to understand its available functions and events. Use this when you need to interact with a new contract but don't know its interface.\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"address\": {\n \"type\": \"string\",\n \"description\": \"Contract address (hex)\"\n }\n },\n \"required\": [\n \"address\"\n ]\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_tx_status\",\n \"description\": \"Check the detailed status of a transaction. Use this to verify if a transaction succeeded, failed (and why), or is still pending.\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"hash\": {\n \"type\": \"string\",\n \"description\": \"Transaction hash (hex)\"\n }\n },\n \"required\": [\n \"hash\"\n ]\n }\n }\n },\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"cavos_events_list\",\n \"description\": \"List events emitted by a contract. Use this to monitor for specific activities (e.g. 'Swap', 'Transfer').\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"contract\": {\n \"type\": \"string\",\n \"description\": \"Contract address emitting the events\"\n },\n \"keys\": {\n \"type\": \"string\",\n \"description\": \"Comma-separated event keys (topic hashes) to filter by. Optional.\"\n },\n \"from_block\": {\n \"type\": \"string\",\n \"description\": \"Start block number or 'pending'/'latest'. Optional.\"\n },\n \"to_block\": {\n \"type\": \"string\",\n \"description\": \"End block number. Optional.\"\n },\n \"page_size\": {\n \"type\": \"string\",\n \"description\": \"Number of events to return (default 10). Optional.\"\n }\n },\n \"required\": [\n \"contract\"\n ]\n }\n }\n }\n]"],"mappings":"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","names":["import_starknet","import_starknet","import_starknet","randomBytes","policy","session","import_starknet","import_starknet","import_starknet","session","policy","session","policy"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cavos/cli",
3
- "version": "0.0.7",
3
+ "version": "0.1.0",
4
4
  "description": "Node.js SDK + CLI for AI agents to control Cavos wallets on Starknet",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",