@cavos/cli 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +0 -32
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -856,18 +856,6 @@ function loadPolicy() {
|
|
|
856
856
|
return void 0;
|
|
857
857
|
}
|
|
858
858
|
}
|
|
859
|
-
function savePolicy(policy2) {
|
|
860
|
-
ensureDir(CAVOS_DIR);
|
|
861
|
-
const stored = {
|
|
862
|
-
spendingLimits: policy2.spendingLimits.map((sl) => ({
|
|
863
|
-
token: sl.token,
|
|
864
|
-
limit: sl.limit.toString()
|
|
865
|
-
})),
|
|
866
|
-
allowedContracts: policy2.allowedContracts,
|
|
867
|
-
maxCallsPerTx: policy2.maxCallsPerTx
|
|
868
|
-
};
|
|
869
|
-
fs.writeFileSync(POLICY_FILE, JSON.stringify(stored, null, 2), { mode: 384 });
|
|
870
|
-
}
|
|
871
859
|
function saveConfig(config) {
|
|
872
860
|
ensureDir(CAVOS_DIR);
|
|
873
861
|
const existing = loadConfig();
|
|
@@ -1842,26 +1830,6 @@ program.command("emergency-revoke").description("Emergency revoke all sessions")
|
|
|
1842
1830
|
}
|
|
1843
1831
|
});
|
|
1844
1832
|
var policy = program.command("policy").description("Manage local spending policies");
|
|
1845
|
-
policy.command("import").description("Import a policy JSON exported from the Dashboard").argument("<json>", "Policy JSON string").action((jsonStr) => {
|
|
1846
|
-
try {
|
|
1847
|
-
const imported = JSON.parse(jsonStr);
|
|
1848
|
-
if (!imported.spendingLimits || !imported.allowedContracts) {
|
|
1849
|
-
throw new Error("Invalid policy format. Missing spendingLimits or allowedContracts.");
|
|
1850
|
-
}
|
|
1851
|
-
const policyParams = {
|
|
1852
|
-
...imported,
|
|
1853
|
-
spendingLimits: imported.spendingLimits.map((sl) => ({ ...sl, limit: BigInt(sl.limit) }))
|
|
1854
|
-
};
|
|
1855
|
-
savePolicy(policyParams);
|
|
1856
|
-
console.log("Policy imported successfully.");
|
|
1857
|
-
} catch (err) {
|
|
1858
|
-
console.error(`Import failed: ${err.message}`);
|
|
1859
|
-
}
|
|
1860
|
-
});
|
|
1861
|
-
policy.command("clear").description("Clear the local policy").action(() => {
|
|
1862
|
-
savePolicy({ spendingLimits: [], allowedContracts: [], maxCallsPerTx: 10 });
|
|
1863
|
-
console.log("Policy cleared.");
|
|
1864
|
-
});
|
|
1865
1833
|
policy.command("show").description("Show the current local policy").option("--json", "Output as JSON").action((opts) => {
|
|
1866
1834
|
const p = loadPolicy();
|
|
1867
1835
|
if (!p || p.spendingLimits.length === 0 && p.allowedContracts.length === 0) {
|
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.1.0');\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\npolicy\n .command('import')\n .description('Import a policy JSON exported from the Dashboard')\n .argument('<json>', 'Policy JSON string')\n .action((jsonStr) => {\n try {\n const imported = JSON.parse(jsonStr);\n if (!imported.spendingLimits || !imported.allowedContracts) {\n throw new Error('Invalid policy format. Missing spendingLimits or allowedContracts.');\n }\n const policyParams = {\n ...imported,\n spendingLimits: imported.spendingLimits.map((sl: any) => ({ ...sl, limit: BigInt(sl.limit) }))\n };\n savePolicy(policyParams);\n console.log('Policy imported successfully.');\n } catch (err: any) {\n console.error(`Import failed: ${err.message}`);\n }\n });\n\npolicy\n .command('clear')\n .description('Clear the local policy')\n .action(() => {\n savePolicy({ spendingLimits: [], allowedContracts: [], maxCallsPerTx: 10 });\n console.log('Policy cleared.');\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);\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","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; 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);\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"]}
|