@cavos/cli 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/crypto.ts","../src/utils/encoding.ts","../src/core/MerkleTree.ts","../src/utils/constants.ts","../src/core/SessionKeyManager.ts","../src/core/NonceManager.ts","../src/core/AddressSeedManager.ts","../src/core/TransactionManager.ts","../src/auth/FirebaseAuth.ts","../src/storage/FileStorage.ts","../src/CavosAgent.ts"],"names":["randomBytes","num","hash","ec","typedData","path","os","fs","RpcProvider"],"mappings":"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","file":"index.js","sourcesContent":["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 { 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 { 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","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"]}