@cavos/kit 0.0.1 → 0.0.2

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/crypto/encoding.ts","../../src/crypto/signature.ts","../../src/signer/WebCryptoSigner.ts","../../src/chains/starknet/constants.ts","../../src/chains/starknet/StarknetAdapter.ts","../../src/chains/starknet/StarknetDeviceSigner.ts","../../src/registry/WalletRegistry.ts","../../src/registry/HttpWalletRegistry.ts","../../src/recovery/HttpRecoveryClient.ts","../../src/recovery/BackupSigner.ts","../../src/identity.ts","../../src/Cavos.ts","../../src/auth/CavosAuth.ts","../../src/react/CavosAuthModal.tsx","../../src/react/CavosProvider.tsx"],"names":["p256","sha256","hash","num","Signer","toHex","fromHex","randomBytes","pbkdf2","hkdf","RpcProvider","PaymasterRpc","address","Account","account","isSigner","jsxs","jsx","useState","useEffect","useRef","useCallback","e","Fragment","createContext","useContext"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Low-level encoding helpers shared across the kit.\n */\n\nconst U128_MASK = (1n << 128n) - 1n;\n\n/** Split a u256 into the `[low, high]` felt pair Cairo expects. */\nexport function u256ToFelts(value: bigint): [bigint, bigint] {\n return [value & U128_MASK, value >> 128n];\n}\n\n/** Big-endian bytes -> bigint. */\nexport function bytesToBigInt(bytes: Uint8Array): bigint {\n let out = 0n;\n for (const b of bytes) out = (out << 8n) | BigInt(b);\n return out;\n}\n\nexport function bytesToHex(bytes: Uint8Array): string {\n let s = \"0x\";\n for (const b of bytes) s += b.toString(16).padStart(2, \"0\");\n return s;\n}\n\nexport function hexToBytes(hex: string): Uint8Array {\n const clean = hex.startsWith(\"0x\") ? hex.slice(2) : hex;\n const padded = clean.length % 2 ? \"0\" + clean : clean;\n const out = new Uint8Array(padded.length / 2);\n for (let i = 0; i < out.length; i++) out[i] = parseInt(padded.slice(i * 2, i * 2 + 2), 16);\n return out;\n}\n\n/** A felt/bigint -> 32-byte big-endian Uint8Array (the tx-hash width). */\nexport function bigIntTo32Bytes(value: bigint): Uint8Array {\n const out = new Uint8Array(32);\n let v = value;\n for (let i = 31; i >= 0; i--) {\n out[i] = Number(v & 0xffn);\n v >>= 8n;\n }\n return out;\n}\n","/**\n * secp256r1 signature helpers for silent device signers.\n */\nimport { p256 } from \"@noble/curves/p256\";\nimport type { DevicePublicKey, DeviceSignature } from \"../signer/DeviceSigner\";\nimport { u256ToFelts } from \"./encoding\";\n\n/**\n * Serialize a device signature to the felt array for `tx_info.signature`:\n * [ r_low, r_high, s_low, s_high, y_parity ]\n * exactly what DeviceAccount.__validate__ decodes.\n */\nexport function signatureToFelts(sig: DeviceSignature): bigint[] {\n const [rLow, rHigh] = u256ToFelts(sig.r);\n const [sLow, sHigh] = u256ToFelts(sig.s);\n return [rLow, rHigh, sLow, sHigh, sig.yParity ? 1n : 0n];\n}\n\n/**\n * Recover the parity bit of an (r, s) signature over `digest` for a known\n * pubkey. WebCrypto/Secure Enclave don't return a recovery id, so we derive it\n * by trying both candidates and matching the device's public key.\n */\nexport function recoverYParity(\n r: bigint,\n s: bigint,\n digest: Uint8Array,\n pubkey: DevicePublicKey,\n): boolean {\n for (const bit of [0, 1] as const) {\n try {\n const candidate = new p256.Signature(r, s).addRecoveryBit(bit);\n const point = candidate.recoverPublicKey(digest).toAffine();\n if (point.x === pubkey.x && point.y === pubkey.y) {\n return bit === 1;\n }\n } catch {\n // try the other bit\n }\n }\n throw new Error(\"kit/signature: could not recover parity for the given pubkey\");\n}\n","import { sha256 } from \"@noble/hashes/sha256\";\nimport type { DeviceSigner, DevicePublicKey, DeviceSignature } from \"./DeviceSigner\";\nimport { bytesToBigInt } from \"../crypto/encoding\";\nimport { recoverYParity } from \"../crypto/signature\";\n\nconst IDB_NAME = \"cavos-kit\";\nconst IDB_STORE = \"device-keys\";\n\nexport interface WebCryptoSignerOptions {\n /**\n * Storage key for the device's private key (e.g. the account address). One\n * silent key per (this value, browser profile).\n */\n keyId: string;\n}\n\ninterface StoredKey {\n privateKey: CryptoKey; // non-extractable; structured-cloneable\n x: bigint;\n y: bigint;\n}\n\n/**\n * Silent, device-bound signer for the browser. Generates a non-extractable\n * secp256r1 (P-256) key via WebCrypto and stores the `CryptoKey` in IndexedDB.\n * The private key is never exposed to JS and signing produces NO UI — there is\n * no passkey, no Face ID / Touch ID prompt. To the user it is invisible; they\n * only ever see the OAuth / email login used to derive their address.\n */\nexport class WebCryptoSigner implements DeviceSigner {\n private constructor(\n private readonly privateKey: CryptoKey,\n private readonly publicKey: DevicePublicKey,\n readonly keyId: string,\n ) {}\n\n /** Create a fresh device key (first run on this device) and persist it. */\n static async create(opts: WebCryptoSignerOptions): Promise<WebCryptoSigner> {\n assertSecureContext();\n const pair = await crypto.subtle.generateKey(\n { name: \"ECDSA\", namedCurve: \"P-256\" },\n false, // private key is NON-extractable\n [\"sign\", \"verify\"],\n );\n const publicKey = await exportPublicKey(pair.publicKey);\n await idbPut(opts.keyId, { privateKey: pair.privateKey, x: publicKey.x, y: publicKey.y });\n return new WebCryptoSigner(pair.privateKey, publicKey, opts.keyId);\n }\n\n /** Load an existing device key from storage, or null if none exists yet. */\n static async load(opts: WebCryptoSignerOptions): Promise<WebCryptoSigner | null> {\n const rec = await idbGet(opts.keyId);\n if (!rec) return null;\n return new WebCryptoSigner(rec.privateKey, { x: rec.x, y: rec.y }, opts.keyId);\n }\n\n /** Load the device key, creating one on first use. */\n static async loadOrCreate(opts: WebCryptoSignerOptions): Promise<WebCryptoSigner> {\n return (await WebCryptoSigner.load(opts)) ?? (await WebCryptoSigner.create(opts));\n }\n\n async getPublicKey(): Promise<DevicePublicKey> {\n return this.publicKey;\n }\n\n async sign(txHash: Uint8Array): Promise<DeviceSignature> {\n // WebCrypto ECDSA hashes the message with SHA-256 internally, then signs.\n const raw = new Uint8Array(\n await crypto.subtle.sign(\n { name: \"ECDSA\", hash: \"SHA-256\" },\n this.privateKey,\n txHash as unknown as BufferSource,\n ),\n );\n // IEEE P1363 form: r || s, 32 bytes each.\n const r = bytesToBigInt(raw.subarray(0, 32));\n const s = bytesToBigInt(raw.subarray(32, 64));\n const digest = sha256(txHash);\n const yParity = recoverYParity(r, s, digest, this.publicKey);\n return { r, s, yParity };\n }\n}\n\nasync function exportPublicKey(publicKey: CryptoKey): Promise<DevicePublicKey> {\n const raw = new Uint8Array(await crypto.subtle.exportKey(\"raw\", publicKey)); // 0x04 || X || Y\n return { x: bytesToBigInt(raw.subarray(1, 33)), y: bytesToBigInt(raw.subarray(33, 65)) };\n}\n\n/**\n * WebCrypto (`crypto.subtle`) is only available in secure contexts — HTTPS, or\n * `http://localhost`. Accessing the dev server over a LAN IP (e.g.\n * http://192.168.1.24:3000) is NOT secure, so `crypto.subtle` is undefined and\n * device-key generation would crash with a cryptic \"undefined is not an object\".\n * Fail early with an actionable message instead.\n */\nfunction assertSecureContext(): void {\n const ok =\n typeof crypto !== \"undefined\" &&\n typeof crypto.subtle !== \"undefined\" &&\n (typeof window === \"undefined\" || window.isSecureContext);\n if (!ok) {\n throw new Error(\n \"Cavos: WebCrypto is unavailable. Device keys require a secure context — use HTTPS, or http://localhost. \" +\n \"(For LAN/mobile dev testing, run `next dev --experimental-https`.)\",\n );\n }\n}\n\n// --- minimal IndexedDB wrapper ---\n\nfunction openDb(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(IDB_NAME, 1);\n req.onupgradeneeded = () => req.result.createObjectStore(IDB_STORE);\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\n\nasync function idbPut(keyId: string, value: StoredKey): Promise<void> {\n const db = await openDb();\n await tx(db, \"readwrite\", (store) => store.put(value, keyId));\n db.close();\n}\n\nasync function idbGet(keyId: string): Promise<StoredKey | null> {\n const db = await openDb();\n const result = await tx(db, \"readonly\", (store) => store.get(keyId));\n db.close();\n return (result as StoredKey) ?? null;\n}\n\nfunction tx<T>(\n db: IDBDatabase,\n mode: IDBTransactionMode,\n run: (store: IDBObjectStore) => IDBRequest<T>,\n): Promise<T> {\n return new Promise((resolve, reject) => {\n const store = db.transaction(IDB_STORE, mode).objectStore(IDB_STORE);\n const req = run(store);\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\n","/** Starknet network presets and well-known addresses for the kit. */\n\nexport const STARKNET_NETWORKS = {\n sepolia: {\n chainId: \"0x534e5f5345504f4c4941\", // SN_SEPOLIA\n rpcUrl: \"https://api.cartridge.gg/x/starknet/sepolia\",\n },\n mainnet: {\n chainId: \"0x534e5f4d41494e\", // SN_MAIN\n rpcUrl: \"https://api.cartridge.gg/x/starknet/mainnet\",\n },\n} as const;\n\nexport type StarknetNetwork = keyof typeof STARKNET_NETWORKS;\n\n/** Universal Deployer Contract (same address on mainnet & sepolia). */\nexport const UDC_ADDRESS =\n \"0x041a78e741e5af2fec34b695679bc6891742439f7afb8484ecd7766661ad02bf\";\n\n/** Cavos-hosted SNIP-29 paymaster (same service @cavos/react uses). */\nexport const CAVOS_PAYMASTER_URL: Record<StarknetNetwork, string> = {\n sepolia: \"https://sepolia-paymaster.cavos.xyz\",\n mainnet: \"https://paymaster.cavos.xyz\",\n};\n\n/**\n * DeviceAccount class hash, per network. Populated from\n * `account-contracts/starknet/deployments/<network>.json` after declaring.\n * Left empty until the class is declared on each network.\n */\nexport const DEVICE_ACCOUNT_CLASS_HASH: Record<StarknetNetwork, string> = {\n sepolia: \"0x6c3c3426667b6d4adda18a0b8d8cc34c495a1ace7276c4470068ad4c324876d\",\n mainnet: \"\",\n};\n","import { hash, num } from \"starknet\";\nimport type { ChainAdapter, ChainCall, ComputeAddressParams } from \"../ChainAdapter\";\nimport type { DeviceSigner, DevicePublicKey } from \"../../signer/DeviceSigner\";\nimport { signatureToFelts } from \"../../crypto/signature\";\nimport { u256ToFelts, bigIntTo32Bytes } from \"../../crypto/encoding\";\nimport { UDC_ADDRESS } from \"./constants\";\n\nexport interface StarknetAdapterOptions {\n classHash: string;\n /** Read provider for `isAuthorizedSigner`. Optional for build-only usage. */\n provider?: { callContract(call: { contractAddress: string; entrypoint: string; calldata: string[] }): Promise<string[]> };\n /** Signer used to sign outgoing transactions. */\n signer?: DeviceSigner;\n}\n\n/** Starknet implementation of the device-signer account adapter. */\nexport class StarknetAdapter implements ChainAdapter {\n readonly chain = \"starknet\" as const;\n\n constructor(private readonly opts: StarknetAdapterOptions) {}\n\n computeAddress({ addressSeed, initialSigner, salt }: ComputeAddressParams): string {\n return hash.calculateContractAddressFromHash(\n num.toHex(salt ?? addressSeed),\n this.opts.classHash,\n this.constructorCalldata(addressSeed, initialSigner),\n 0, // deployerAddress 0 => deterministic counterfactual address\n );\n }\n\n /** Single UDC deploy; the constructor registers the first device signer, so\n * the account is ready the moment it is deployed (fits the paymaster's\n * deploy + execute_from_outside bundle). */\n buildDeploy(params: ComputeAddressParams): ChainCall[] {\n const salt = params.salt ?? params.addressSeed;\n const calldata = this.constructorCalldata(params.addressSeed, params.initialSigner);\n return [\n {\n contractAddress: UDC_ADDRESS,\n entrypoint: \"deployContract\",\n calldata: [\n this.opts.classHash,\n num.toHex(salt),\n \"0x0\", // unique = false -> deployer-independent address\n num.toHex(calldata.length),\n ...calldata,\n ],\n },\n ];\n }\n\n /** Constructor calldata: [address_seed, pub_x_low, pub_x_high, pub_y_low, pub_y_high]. */\n constructorCalldata(addressSeed: bigint, initialSigner: DevicePublicKey): string[] {\n return [num.toHex(addressSeed), ...pubkeyCalldata(initialSigner)];\n }\n\n buildAddSigner(accountAddress: string, signer: DevicePublicKey): ChainCall {\n return { contractAddress: accountAddress, entrypoint: \"add_signer\", calldata: pubkeyCalldata(signer) };\n }\n\n buildRemoveSigner(accountAddress: string, signer: DevicePublicKey): ChainCall {\n return { contractAddress: accountAddress, entrypoint: \"remove_signer\", calldata: pubkeyCalldata(signer) };\n }\n\n async isAuthorizedSigner(accountAddress: string, signer: DevicePublicKey): Promise<boolean> {\n if (!this.opts.provider) throw new Error(\"kit/starknet: provider required for reads\");\n const res = await this.opts.provider.callContract({\n contractAddress: accountAddress,\n entrypoint: \"is_authorized_signer\",\n calldata: pubkeyCalldata(signer),\n });\n return BigInt(res[0] ?? 0) !== 0n;\n }\n\n async buildSignature(txHash: bigint): Promise<string[]> {\n if (!this.opts.signer) throw new Error(\"kit/starknet: signer required to sign\");\n const sig = await this.opts.signer.sign(bigIntTo32Bytes(txHash));\n return signatureToFelts(sig).map((f) => num.toHex(f));\n }\n}\n\n/** Encode a P-256 pubkey as `[x_low, x_high, y_low, y_high]` (two u256s). */\nfunction pubkeyCalldata(pk: DevicePublicKey): string[] {\n const [xl, xh] = u256ToFelts(pk.x);\n const [yl, yh] = u256ToFelts(pk.y);\n return [num.toHex(xl), num.toHex(xh), num.toHex(yl), num.toHex(yh)];\n}\n","import { Signer, num, type ArraySignatureType } from \"starknet\";\nimport type { DeviceSigner } from \"../../signer/DeviceSigner\";\nimport { signatureToFelts } from \"../../crypto/signature\";\nimport { bigIntTo32Bytes } from \"../../crypto/encoding\";\n\n/**\n * A starknet.js `SignerInterface` backed by a device signer. Extends the base\n * `Signer` so all transaction/declare hash computation (v3) is reused; only the\n * raw hash-signing primitive is overridden to sign silently with the device key.\n *\n * Usage:\n * const account = new Account(provider, address, new StarknetDeviceSigner(device), \"1\");\n * await account.execute(calls); // DeviceAccount validates the device signature\n *\n * For gasless flows, hand this signer to your paymaster SDK (e.g. AVNU) the same\n * way you would any starknet.js signer.\n */\nexport class StarknetDeviceSigner extends Signer {\n constructor(private readonly device: DeviceSigner) {\n // Base `pk` is unused: device accounts have no single Stark private key.\n super(\"0x1\");\n }\n\n /** Device accounts are not controlled by a single Stark pubkey. */\n override async getPubKey(): Promise<string> {\n return \"0x0\";\n }\n\n /** Sign the computed tx hash silently with the device signer. */\n protected override async signRaw(msgHash: string): Promise<ArraySignatureType> {\n const sig = await this.device.sign(bigIntTo32Bytes(BigInt(msgHash)));\n return signatureToFelts(sig).map((f) => num.toHex(f));\n }\n}\n","import type { DevicePublicKey } from \"../signer/DeviceSigner\";\n\n/**\n * Off-chain map of `user_id -> wallet`. Because the account address is\n * `f(identity, first_device_pubkey)` (unforgeable, secure), it is NOT derivable\n * from the identity alone on a new device. The backend is the source of truth\n * for \"does this user already have a wallet?\" — enabling multi-device:\n *\n * - First device, unknown user -> deploy a new wallet, then `register`.\n * - Same user, new device -> `lookup` returns the existing wallet; the\n * new device is added as a signer (recovery\n * approval), NOT a new wallet.\n *\n * The backend implements this (it already manages the user<->address binding).\n */\nexport interface WalletRegistry {\n /** The user's existing wallet, or null if they don't have one yet. */\n lookup(userId: string): Promise<RegisteredWallet | null>;\n\n /** Record a freshly deployed wallet for the user (first device). */\n register(params: {\n userId: string;\n address: string;\n initialSigner: DevicePublicKey;\n }): Promise<void>;\n\n /** Note an additional device signer for the user's wallet (after approval). */\n addDevice?(params: {\n userId: string;\n address: string;\n signer: DevicePublicKey;\n }): Promise<void>;\n}\n\nexport interface RegisteredWallet {\n address: string;\n /** Public keys of the devices registered on this wallet (if tracked). */\n devices?: DevicePublicKey[];\n}\n\n/** Simple in-memory registry for demos / tests. */\nexport class InMemoryWalletRegistry implements WalletRegistry {\n private wallets = new Map<string, RegisteredWallet>();\n\n async lookup(userId: string): Promise<RegisteredWallet | null> {\n return this.wallets.get(userId) ?? null;\n }\n async register(params: { userId: string; address: string; initialSigner: DevicePublicKey }) {\n this.wallets.set(params.userId, { address: params.address, devices: [params.initialSigner] });\n }\n async addDevice(params: { userId: string; address: string; signer: DevicePublicKey }) {\n const w = this.wallets.get(params.userId);\n if (w) w.devices = [...(w.devices ?? []), params.signer];\n }\n}\n","import type { DevicePublicKey } from \"../signer/DeviceSigner\";\nimport type { WalletRegistry, RegisteredWallet } from \"./WalletRegistry\";\n\nexport interface HttpWalletRegistryOptions {\n /** Cavos backend base URL (e.g. https://cavos.xyz). */\n baseUrl: string;\n /** The Cavos App ID — authenticates the SDK calls (verifyAppId). */\n appId: string;\n /** Network the wallet lives on (e.g. \"sepolia\"). */\n network: string;\n}\n\n/** Serialize a bigint pubkey component for transport (hex string). */\nfunction toHex(n: bigint): string {\n return \"0x\" + n.toString(16);\n}\n\n/** Parse a hex/decimal string back to a bigint pubkey component. */\nfunction fromHex(s: string): bigint {\n return BigInt(s);\n}\n\n/**\n * WalletRegistry backed by the Cavos backend (`/api/wallets`). This is the\n * persistent, cross-device source of truth for `user_id -> wallet`. The backend\n * stores authorized device signers in `wallet_devices`; the registry maps a\n * backend `userId` (the OAuth `sub`) onto that wallet row.\n */\nexport class HttpWalletRegistry implements WalletRegistry {\n constructor(private readonly opts: HttpWalletRegistryOptions) {}\n\n async lookup(userId: string): Promise<RegisteredWallet | null> {\n const url = new URL(\"/api/wallets\", this.opts.baseUrl);\n url.searchParams.set(\"app_id\", this.opts.appId);\n url.searchParams.set(\"user_social_id\", userId);\n url.searchParams.set(\"network\", this.opts.network);\n\n const res = await fetch(url, { headers: { \"Content-Type\": \"application/json\" } });\n if (!res.ok) throw new Error(`registry lookup failed: ${res.status}`);\n const data = await res.json();\n if (!data.found || !data.address) return null;\n\n const devices: DevicePublicKey[] | undefined = Array.isArray(data.devices)\n ? data.devices.map((d: { pub_x: string; pub_y: string }) => ({\n x: fromHex(d.pub_x),\n y: fromHex(d.pub_y),\n }))\n : undefined;\n\n return { address: data.address, devices };\n }\n\n async register(params: {\n userId: string;\n address: string;\n initialSigner: DevicePublicKey;\n }): Promise<void> {\n const res = await fetch(new URL(\"/api/wallets\", this.opts.baseUrl), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n app_id: this.opts.appId,\n user_social_id: params.userId,\n network: this.opts.network,\n address: params.address,\n // Device-signer wallets send their initial signer (no encrypted blob).\n devices: [{ x: toHex(params.initialSigner.x), y: toHex(params.initialSigner.y) }],\n }),\n });\n if (!res.ok) {\n const t = await res.text().catch(() => \"\");\n throw new Error(`registry register failed: ${res.status} ${t}`);\n }\n }\n\n async addDevice?(params: {\n userId: string;\n address: string;\n signer: DevicePublicKey;\n }): Promise<void> {\n // The backend mirrors `wallet_devices` via the confirm endpoint after an\n // on-chain add_signer, so this is a no-op here (kept for interface parity).\n void params;\n }\n}\n","import type { DevicePublicKey } from \"../signer/DeviceSigner\";\nimport type { RecoveryClient, PendingDeviceRequest } from \"./RecoveryClient\";\n\nexport interface HttpRecoveryClientOptions {\n /** Cavos backend base URL (e.g. https://cavos.xyz). */\n baseUrl: string;\n /** The Cavos App ID — authenticates SDK calls. */\n appId: string;\n}\n\nfunction toHex(n: bigint): string {\n return \"0x\" + n.toString(16);\n}\nfunction fromHex(s: string): bigint {\n return BigInt(s);\n}\n\nfunction deviceLabel(): string {\n if (typeof navigator !== \"undefined\") {\n return navigator.userAgent || \"a new device\";\n }\n return \"a new device\";\n}\n\n/**\n * RecoveryClient backed by the Cavos backend's device-approval relay\n * (`/api/devices/request`). The relay holds NO keys — it stores the pending\n * request, emails the wallet owner, and mirrors the on-chain `add_signer` once a\n * registered device confirms.\n */\nexport class HttpRecoveryClient implements RecoveryClient {\n constructor(private readonly opts: HttpRecoveryClientOptions) {}\n\n async requestDeviceAddition(params: {\n userId: string;\n accountAddress: string;\n newSigner: DevicePublicKey;\n email?: string;\n deviceLabel?: string;\n }): Promise<{ requestId: string }> {\n const res = await fetch(new URL(\"/api/devices/request\", this.opts.baseUrl), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n app_id: this.opts.appId,\n wallet_address: params.accountAddress,\n new_pub_x: toHex(params.newSigner.x),\n new_pub_y: toHex(params.newSigner.y),\n device_label: params.deviceLabel ?? deviceLabel(),\n ...(params.email ? { email: params.email } : {}),\n }),\n });\n if (!res.ok) {\n const t = await res.text().catch(() => \"\");\n throw new Error(`requestDeviceAddition failed: ${res.status} ${t}`);\n }\n const data = await res.json();\n return { requestId: data.request_id };\n }\n\n async getPendingRequest(requestId: string): Promise<PendingDeviceRequest | null> {\n const url = new URL(\"/api/devices/request\", this.opts.baseUrl);\n url.searchParams.set(\"id\", requestId);\n const res = await fetch(url, { headers: { \"Content-Type\": \"application/json\" } });\n if (!res.ok) throw new Error(`getPendingRequest failed: ${res.status}`);\n const data = await res.json();\n if (!data.found) return null;\n\n const status = data.status as PendingDeviceRequest[\"status\"];\n return {\n requestId: data.request_id,\n appId: data.app_id,\n userId: \"\", // the approving device already knows its own identity\n accountAddress: data.wallet_address,\n newSigner: { x: fromHex(data.new_pub_x), y: fromHex(data.new_pub_y) },\n createdAt: data.created_at,\n status,\n };\n }\n\n async confirmDeviceAddition(params: {\n requestId: string;\n txHash: string;\n }): Promise<void> {\n const res = await fetch(\n new URL(`/api/devices/request/${params.requestId}/confirm`, this.opts.baseUrl),\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ tx_hash: params.txHash }),\n },\n );\n if (!res.ok) {\n const t = await res.text().catch(() => \"\");\n throw new Error(`confirmDeviceAddition failed: ${res.status} ${t}`);\n }\n }\n}\n","import { p256 } from \"@noble/curves/p256\";\nimport { hkdf } from \"@noble/hashes/hkdf\";\nimport { pbkdf2 } from \"@noble/hashes/pbkdf2\";\nimport { sha256 } from \"@noble/hashes/sha256\";\nimport { randomBytes } from \"@noble/hashes/utils\";\nimport type { DeviceSigner, DevicePublicKey, DeviceSignature } from \"../signer/DeviceSigner\";\nimport { bytesToBigInt, bigIntTo32Bytes } from \"../crypto/encoding\";\nimport { recoverYParity } from \"../crypto/signature\";\n\n/**\n * Self-custodial account recovery via a backup signer derived from a code.\n *\n * The user generates a human-readable recovery code once (see\n * `generateRecoveryCode`). That code is stretched with PBKDF2 + HKDF into a\n * deterministic secp256r1 private key — the SAME key on every device that\n * enters the SAME code. The code never leaves the device: the backend and the\n * chain only ever see the derived public key, which is registered on-chain as\n * an ordinary signer via `add_signer`. Recovering access after losing every\n * device is therefore: enter the code → re-derive the backup key → sign an\n * `add_signer` for the new device. No guardian, no timelock, no custodial key.\n *\n * This module is intentionally chain-agnostic and free of WebCrypto/DOM calls:\n * the derivation is pure `@noble/*` math, so the identical code runs in the\n * browser, React Native, and (eventually) Solana / Stellar / EVM adapters.\n */\n\n/** Fixed domain-separation salt for `deriveBackupKey`. Bumped only to re-derive\n * a new key space (e.g. changing the KDF parameters). Never per-user. */\nconst BACKUP_KDF_SALT = \"cavos-recovery-v1\";\n/** PBKDF2 iteration count. High enough to make brute-forcing a strong code\n * infeasible, low enough that derivation stays well under a second. */\nconst BACKUP_PBKDF2_ITERATIONS = 210_000;\n/** HKDF info string, scopes the derived material to \"backup-signer\". */\nconst BACKUP_HKDF_INFO = \"cavos-backup-signer\";\n\n/** How many words make up a recovery code. 16 words @ 8 bits/word = 128 bits. */\nconst CODE_WORDS = 16;\n\n/**\n * Generate a fresh, human-readable recovery code. The caller MUST present this\n * to the user exactly once and never persist it server-side. ~128 bits of\n * entropy encoded as words from a fixed wordlist (BIP39-style but our own list,\n * so we don't pull a dependency on a BIP39 wordfile).\n */\nexport function generateRecoveryCode(): string {\n const bytes = randomBytes(CODE_WORDS);\n const words: string[] = [];\n for (const b of bytes) words.push(WORDLIST[b]);\n return words.join(\" \");\n}\n\n/**\n * Deterministically derive a secp256r1 keypair from a recovery code. Pure\n * function: the same normalised code always yields the same keypair, on any\n * runtime. Returns the raw 32-byte private key (so it can be wrapped in a\n * `BackupSigner` or fed to any chain adapter) plus the public key coordinates\n * the contract stores as an authorised signer.\n *\n * Normalisation trims surrounding whitespace and collapses runs of spaces, so\n * \"a b\" and \"a b\" derive the same key regardless of how the code was pasted.\n */\nexport function deriveBackupKey(code: string): {\n privateKey: Uint8Array;\n publicKey: DevicePublicKey;\n} {\n const normalised = code.trim().replace(/\\s+/g, \" \").toLowerCase();\n if (!normalised) throw new Error(\"kit: recovery code is empty\");\n\n // Stretch the low-entropy-ish human code into 32 bytes with PBKDF2, then mix\n // into a scoped seed with HKDF. PBKDF2 also serves as the brute-force brake.\n const stretched = pbkdf2(\n sha256,\n new TextEncoder().encode(normalised),\n new TextEncoder().encode(BACKUP_KDF_SALT),\n { c: BACKUP_PBKDF2_ITERATIONS, dkLen: 32 },\n );\n const seed = hkdf(sha256, stretched, undefined, BACKUP_HKDF_INFO, 32);\n\n // Reduce the seed to a valid secp256r1 scalar. The seed is 32 bytes (< n with\n // overwhelming probability); reducing mod n keeps it a valid private key\n // without bias that matters in practice for an HMAC-stretched 256-bit input.\n const d = bytesToBigInt(seed) % p256.CURVE.n;\n if (d === 0n) throw new Error(\"kit: derived backup key is zero (retry with a new code)\");\n\n const priv = bigIntTo32Bytes(d);\n // isCompressed = false → uncompressed point (0x04 || X || Y, 65 bytes), so the\n // X/Y split below is correct. The default would return a 33-byte compressed\n // point and the Y half would be empty.\n const pub = p256.getPublicKey(priv, false);\n return {\n privateKey: priv,\n publicKey: { x: bytesToBigInt(pub.subarray(1, 33)), y: bytesToBigInt(pub.subarray(33, 65)) },\n };\n}\n\n/**\n * A `DeviceSigner` backed by an in-memory backup key derived from a recovery\n * code. Used transiently during recovery to sign the `add_signer` that\n * authorises a new device — it is NOT persisted and should not be reused as a\n * device signer. The key material lives only for the duration of the recovery\n * transaction.\n */\nexport class BackupSigner implements DeviceSigner {\n private readonly privateKey: Uint8Array;\n private readonly publicKeyValue: DevicePublicKey;\n\n constructor(privateKey: Uint8Array, publicKey: DevicePublicKey) {\n this.privateKey = privateKey;\n this.publicKeyValue = publicKey;\n }\n\n /** Build a signer from a recovery code (derive + wrap in one step). */\n static fromCode(code: string): BackupSigner {\n const { privateKey, publicKey } = deriveBackupKey(code);\n return new BackupSigner(privateKey, publicKey);\n }\n\n async getPublicKey(): Promise<DevicePublicKey> {\n return this.publicKeyValue;\n }\n\n async sign(txHash: Uint8Array): Promise<DeviceSignature> {\n // Mirror the WebCrypto path exactly: WebCrypto's `subtle.sign({ hash:\n // 'SHA-256' }, key, txHash)` hashes `txHash` with SHA-256 and signs the\n // digest. `p256.sign(msgHash)` signs the bytes it's given WITHOUT hashing,\n // so we pre-hash here to produce the same (r, s) the contract verifies.\n const digest = sha256(txHash);\n const sig = p256.sign(digest, this.privateKey);\n const yParity = recoverYParity(sig.r, sig.s, digest, this.publicKeyValue);\n return { r: sig.r, s: sig.s, yParity };\n }\n}\n\n// 256 short, unambiguous, lowercase English words. Chosen to be hard to\n// misread and easy to type; not the full BIP39 list (we don't need 2048 — 8\n// bits/word is plenty at 16 words). Keep this list stable: changing it changes\n// the meaning of every existing recovery code. Must stay exactly 256 unique\n// entries so each byte value maps to one word.\nconst WORDLIST = [\n \"able\", \"acid\", \"amber\", \"apple\", \"arch\", \"arrow\", \"ashen\", \"atlas\",\n \"axis\", \"badge\", \"baker\", \"balm\", \"banner\", \"basin\", \"beacon\", \"bench\",\n \"beryl\", \"birch\", \"blade\", \"bloom\", \"bluer\", \"border\", \"brave\", \"brick\",\n \"brook\", \"cabin\", \"candle\", \"carbon\", \"cargo\", \"cedar\", \"chalk\", \"charm\",\n \"chrome\", \"cipher\", \"clam\", \"clasp\", \"cliff\", \"clock\", \"cobia\", \"comet\",\n \"coral\", \"cotton\", \"coves\", \"crane\", \"crest\", \"crow\", \"crystal\", \"curio\",\n \"dawn\", \"delta\", \"denim\", \"depth\", \"dewy\", \"digger\", \"docks\", \"dover\",\n \"drift\", \"dunes\", \"eagle\", \"ember\", \"echo\", \"eden\", \"elite\", \"ethic\",\n \"fable\", \"falcon\", \"fawn\", \"feather\", \"fern\", \"fjord\", \"flame\", \"flint\",\n \"forest\", \"forge\", \"frost\", \"garnet\", \"gemini\", \"glade\", \"glider\", \"glow\",\n \"granite\", \"grove\", \"guppy\", \"harbor\", \"haven\", \"hazel\", \"helio\", \"heron\",\n \"hickory\", \"honey\", \"horizon\", \"ivory\", \"jade\", \"jasper\", \"kestrel\", \"knot\",\n \"lagoon\", \"lattice\", \"laurel\", \"lavender\", \"lemon\", \"linden\", \"loon\", \"luger\",\n \"lumen\", \"lunar\", \"mango\", \"maple\", \"marble\", \"marsh\", \"meadow\", \"mercy\",\n \"mistle\", \"monsoon\", \"morning\", \"moss\", \"nacre\", \"nectar\", \"needle\", \"nimbus\",\n \"nova\", \"ocean\", \"onyx\", \"orbit\", \"otter\", \"palm\", \"panda\", \"pansy\",\n \"papaya\", \"passage\", \"pebble\", \"pelican\", \"pepper\", \"petal\", \"piano\", \"pierce\",\n \"pilot\", \"pioneer\", \"platinum\", \"plume\", \"poplar\", \"porpoise\", \"prairie\", \"prism\",\n \"pulsar\", \"quartz\", \"quasar\", \"quill\", \"quiver\", \"raven\", \"reef\", \"relic\",\n \"ridge\", \"ripple\", \"robin\", \"rocket\", \"rouge\", \"ruby\", \"saffron\", \"sage\",\n \"sail\", \"salmon\", \"sapphire\", \"scarab\", \"shadow\", \"shale\", \"sienna\", \"silica\",\n \"silver\", \"skyline\", \"slate\", \"sonar\", \"spruce\", \"starling\", \"stone\", \"sugar\",\n \"summit\", \"sunset\", \"swan\", \"tangent\", \"tarragon\", \"temple\", \"thistle\", \"thrush\",\n \"tiger\", \"topaz\", \"tundra\", \"turtle\", \"umber\", \"union\", \"valley\", \"vapor\",\n \"vector\", \"velvet\", \"violet\", \"vortex\", \"walnut\", \"whale\", \"winter\", \"wisp\",\n \"wisteria\", \"xenon\", \"yarrow\", \"zephyr\", \"zinc\", \"zodiac\", \"anchor\", \"basil\",\n \"cider\", \"daisy\", \"elfin\", \"ferry\", \"gimlet\", \"halcyon\", \"indigo\", \"juniper\",\n \"kindle\", \"lilac\", \"mantis\", \"nylon\", \"oracle\", \"parch\", \"quokka\", \"ramble\",\n \"thatch\", \"ultra\", \"vivid\", \"xylo\", \"yodel\", \"zesty\", \"arbor\", \"bliss\",\n \"calyx\", \"dwindle\", \"folio\", \"globe\", \"hymn\", \"ionic\", \"jolly\", \"knack\",\n \"lyric\", \"myrtle\", \"noble\", \"plumb\", \"quaint\", \"rustic\", \"satin\", \"timber\",\n \"urge\", \"vault\", \"whimsy\", \"yearn\", \"zenith\", \"ash\", \"beach\", \"dusk\",\n];\n","import { hash } from \"starknet\";\n\n/**\n * The address seed binds a wallet to a stable, backend-managed user identity.\n * The deterministic account address is derived from this seed + salt ONLY — never\n * from a device pubkey — so the same user resolves to the same wallet on any\n * device. The backend owns the user_id <-> address mapping off-chain.\n */\nexport interface IdentityInput {\n /** Stable, backend-managed user identifier (e.g. from email / magic link). */\n userId: string;\n /** Per-app salt, so the same user has distinct wallets across apps. */\n appSalt: string;\n}\n\n/** Derive the felt `address_seed` passed to the contract constructor. */\nexport function deriveAddressSeed({ userId, appSalt }: IdentityInput): bigint {\n // Poseidon over the identity components; stable and collision-resistant.\n const h = hash.computePoseidonHashOnElements([feltFromString(userId), feltFromString(appSalt)]);\n return BigInt(h);\n}\n\n/** Map an arbitrary UTF-8 string into a felt via Poseidon over its byte chunks. */\nfunction feltFromString(s: string): bigint {\n const bytes = new TextEncoder().encode(s);\n const chunks: bigint[] = [];\n for (let i = 0; i < bytes.length; i += 31) {\n let w = 0n;\n for (const b of bytes.subarray(i, i + 31)) w = (w << 8n) | BigInt(b);\n chunks.push(w);\n }\n if (chunks.length === 0) return 0n;\n if (chunks.length === 1) return chunks[0];\n return BigInt(hash.computePoseidonHashOnElements(chunks));\n}\n","import { Account, RpcProvider, PaymasterRpc, num, type Call } from \"starknet\";\nimport type { AuthProvider, Identity } from \"./auth/AuthProvider\";\nimport type { DeviceSigner, DevicePublicKey } from \"./signer/DeviceSigner\";\nimport { WebCryptoSigner } from \"./signer/WebCryptoSigner\";\nimport { StarknetAdapter } from \"./chains/starknet/StarknetAdapter\";\nimport { StarknetDeviceSigner } from \"./chains/starknet/StarknetDeviceSigner\";\nimport type { ChainCall } from \"./chains/ChainAdapter\";\nimport type { WalletRegistry } from \"./registry/WalletRegistry\";\nimport { InMemoryWalletRegistry } from \"./registry/WalletRegistry\";\nimport { HttpWalletRegistry } from \"./registry/HttpWalletRegistry\";\nimport type { RecoveryClient } from \"./recovery/RecoveryClient\";\nimport { HttpRecoveryClient } from \"./recovery/HttpRecoveryClient\";\nimport { BackupSigner, deriveBackupKey } from \"./recovery/BackupSigner\";\nimport { deriveAddressSeed } from \"./identity\";\nimport {\n CAVOS_PAYMASTER_URL,\n DEVICE_ACCOUNT_CLASS_HASH,\n STARKNET_NETWORKS,\n type StarknetNetwork,\n} from \"./chains/starknet/constants\";\n\nexport interface ConnectOptions {\n network: StarknetNetwork;\n /** Authenticated user (pass `identity` directly, or an `auth` provider). */\n auth?: AuthProvider;\n identity?: Identity;\n appSalt: string;\n /**\n * Cavos App ID. When set (with `backendUrl`), the kit uses the hosted\n * WalletRegistry + RecoveryClient by default for real multi-device support.\n */\n appId?: string;\n /** Cavos backend base URL. Defaults to https://cavos.xyz. */\n backendUrl?: string;\n /**\n * Off-chain user_id -> wallet map. Defaults to the hosted HttpWalletRegistry\n * when `appId` is set, else an in-memory registry (single-device only).\n */\n registry?: WalletRegistry;\n /**\n * Device-approval relay. Defaults to HttpRecoveryClient when `appId` is set;\n * used to request addition of this device when it isn't an authorized signer.\n */\n recovery?: RecoveryClient;\n /** Cavos paymaster API key (sponsors deploy + execute). */\n paymasterApiKey: string;\n paymasterUrl?: string;\n rpcUrl?: string;\n classHash?: string;\n /** Override the device signer factory (native / tests); default WebCrypto. */\n createSigner?: (keyId: string) => Promise<DeviceSigner>;\n}\n\n/** Whether this device can already operate the wallet, or needs to be added. */\nexport type ConnectStatus = \"ready\" | \"needs-device-approval\";\n\n/** Options for recovering an account after losing every device signer. */\nexport interface RecoveryOptions {\n /** The recovery code the user stored when they ran setupRecovery. */\n code: string;\n /** Authenticated identity (same user who owns the account). */\n identity: Identity;\n network: StarknetNetwork;\n appSalt: string;\n paymasterApiKey: string;\n appId?: string;\n backendUrl?: string;\n rpcUrl?: string;\n paymasterUrl?: string;\n classHash?: string;\n /** Off-chain user_id -> wallet map. Defaults to the hosted registry. */\n registry?: WalletRegistry;\n /** Override the new device's signer (native / tests); default WebCrypto. */\n createSigner?: (keyId: string) => Promise<DeviceSigner>;\n}\n\n/**\n * High-level Cavos wallet. One call logs the user in and returns a ready, gas-\n * sponsored smart account controlled by a silent device key.\n *\n * const cavos = await Cavos.connect({ network, identity, appSalt, registry, paymasterApiKey });\n * if (cavos.status === \"ready\") await cavos.execute(calls);\n *\n * The account address is `f(identity, device_pubkey)` — unforgeable, so it can't\n * be hijacked. The `registry` recognizes returning users across devices: a new\n * device on an existing account is flagged `needs-device-approval` (add it via\n * an already-registered device) instead of creating a second wallet.\n */\nexport class Cavos {\n /** Request id of the pending device-addition, when status is needs-device-approval. */\n pendingRequestId: string | null = null;\n\n private constructor(\n readonly identity: Identity,\n readonly address: string,\n readonly status: ConnectStatus,\n readonly account: Account,\n private readonly adapter: StarknetAdapter,\n private readonly devicePubkey: DevicePublicKey,\n ) {}\n\n static async connect(opts: ConnectOptions): Promise<Cavos> {\n const identity = opts.identity ?? (await opts.auth?.authenticate());\n if (!identity) throw new Error(\"kit: connect requires `identity` or `auth`\");\n\n const classHash = opts.classHash ?? DEVICE_ACCOUNT_CLASS_HASH[opts.network];\n if (!classHash) throw new Error(`kit: no DeviceAccount class hash for ${opts.network}`);\n\n const provider = new RpcProvider({\n nodeUrl: opts.rpcUrl ?? STARKNET_NETWORKS[opts.network].rpcUrl,\n });\n const paymaster = new PaymasterRpc({\n nodeUrl: opts.paymasterUrl ?? CAVOS_PAYMASTER_URL[opts.network],\n headers: { \"x-paymaster-api-key\": opts.paymasterApiKey },\n });\n\n const addressSeed = deriveAddressSeed({ userId: identity.userId, appSalt: opts.appSalt });\n\n // This device's silent signer.\n const signer = opts.createSigner\n ? await opts.createSigner(`${identity.userId}:${opts.appSalt}`)\n : await WebCryptoSigner.loadOrCreate({ keyId: `${identity.userId}:${opts.appSalt}` });\n const devicePubkey = await signer.getPublicKey();\n\n const adapter = new StarknetAdapter({ classHash, signer, provider });\n const makeAccount = (address: string) =>\n new Account({\n provider,\n address,\n signer: new StarknetDeviceSigner(signer),\n paymaster,\n cairoVersion: \"1\",\n });\n\n // Returning user? The registry knows their wallet (address is device-bound,\n // so it isn't derivable from identity alone). Default to the hosted\n // HttpWalletRegistry when appId is provided, else an in-memory map.\n const backendUrl = opts.backendUrl ?? \"https://cavos.xyz\";\n const registry =\n opts.registry ??\n (opts.appId\n ? new HttpWalletRegistry({ baseUrl: backendUrl, appId: opts.appId, network: opts.network })\n : defaultRegistry);\n const recovery =\n opts.recovery ?? (opts.appId ? new HttpRecoveryClient({ baseUrl: backendUrl, appId: opts.appId }) : null);\n const existing = await registry.lookup(identity.userId);\n\n if (existing) {\n const account = makeAccount(existing.address);\n const isSigner = await adapter.isAuthorizedSigner(existing.address, devicePubkey);\n const cavos = new Cavos(\n identity,\n existing.address,\n isSigner ? \"ready\" : \"needs-device-approval\",\n account,\n adapter,\n devicePubkey,\n );\n\n // New device on an existing wallet: ask the backend to email the owner an\n // approval link. The approving device signs add_signer on-chain; this device\n // becomes \"ready\" after that. Best-effort: never blocks the connect result.\n //\n // De-duplicate within a short window so a page refresh, reconnect, or\n // rapid retry doesn't spam the owner with one email per attempt. The\n // backend already dedups by request id within its 24h TTL, but that still\n // re-sends the email on each fresh request id — this client-side guard\n // collapses the burst. We keep the last requestId and reuse it.\n if (!isSigner && recovery) {\n const dedup = lastDeviceRequest.get(identity.userId);\n const fresh = dedup && Date.now() - dedup.requestedAt < DEVICE_REQUEST_DEDUP_MS;\n try {\n if (fresh) {\n cavos.pendingRequestId = dedup!.requestId;\n } else {\n const { requestId } = await recovery.requestDeviceAddition({\n userId: identity.userId,\n accountAddress: existing.address,\n newSigner: devicePubkey,\n ...(identity.email ? { email: identity.email } : {}),\n });\n cavos.pendingRequestId = requestId;\n lastDeviceRequest.set(identity.userId, { requestId, requestedAt: Date.now() });\n }\n } catch (e) {\n console.warn(\"[Cavos] requestDeviceAddition failed:\", e);\n }\n }\n return cavos;\n }\n\n // Compute the deterministic address for (identity, this device). The address\n // is device-bound, so it's NOT in the registry for a new device — but it may\n // already be deployed on-chain (same device reconnecting, or a re-run after a\n // deploy that succeeded before a timeout). Ask the chain before deploying:\n // re-deploying an existing account reverts (\"contract already deployed\").\n const address = adapter.computeAddress({ addressSeed, initialSigner: devicePubkey });\n const account = makeAccount(address);\n const alreadyDeployed = await isDeployed(provider, address);\n\n if (!alreadyDeployed) {\n const deploymentData = {\n address,\n class_hash: classHash,\n salt: num.toHex(addressSeed),\n calldata: adapter.constructorCalldata(addressSeed, devicePubkey),\n version: 1 as const,\n };\n const deployRes = await account.executePaymasterTransaction([], {\n feeMode: { mode: \"sponsored\" },\n deploymentData,\n });\n // Wait for the deploy to land before declaring the device \"ready\". Assuming\n // readiness here would report \"ready\" if the tx silently failed or hadn't\n // indexed yet — and the user would hit a confusing error on their first tx.\n try {\n await provider.waitForTransaction(deployRes.transaction_hash);\n } catch (e) {\n console.warn(\"[Cavos] deploy receipt wait failed:\", e);\n }\n }\n\n // Record the wallet (idempotent for reconnects) and resolve readiness from\n // the chain: this device is \"ready\" iff its pubkey is an authorized signer.\n // We re-read even right after a fresh deploy, so a deploy that failed to\n // index (or silently reverted) surfaces as needs-device-approval rather than\n // a false \"ready\".\n await registry.register({ userId: identity.userId, address, initialSigner: devicePubkey });\n let isSigner: boolean;\n try {\n isSigner = await adapter.isAuthorizedSigner(address, devicePubkey);\n } catch (e) {\n // Fall back to the deploy assumption only if the chain read itself errors\n // (e.g. node hiccup right after indexing) — the deploy did submit.\n console.warn(\"[Cavos] isAuthorizedSigner read failed:\", e);\n isSigner = !alreadyDeployed;\n }\n\n return new Cavos(\n identity,\n address,\n isSigner ? \"ready\" : \"needs-device-approval\",\n account,\n adapter,\n devicePubkey,\n );\n }\n\n /** This device's public key (e.g. to request addition to an existing wallet). */\n get publicKey(): DevicePublicKey {\n return this.devicePubkey;\n }\n\n /** Execute a sponsored (gasless) multicall, signed silently by the device. */\n async execute(calls: ChainCall[]): Promise<{ transactionHash: string }> {\n if (this.status !== \"ready\") {\n throw new Error(\"kit: this device is not yet an authorized signer of the wallet\");\n }\n const res = await this.account.executePaymasterTransaction(calls as Call[], {\n feeMode: { mode: \"sponsored\" },\n });\n return { transactionHash: res.transaction_hash };\n }\n\n /** Authorize an additional device signer (sponsored). Self-submitted. */\n async addSigner(pubkey: DevicePublicKey): Promise<{ transactionHash: string }> {\n return this.execute([this.adapter.buildAddSigner(this.address, pubkey)]);\n }\n\n /**\n * Register a self-custodial backup signer derived from `code`, so the account\n * can be recovered after the user loses every device. Idempotent: if the\n * derived backup key is already an authorised signer, this is a no-op.\n *\n * The code never leaves the device — only its deterministic public key is\n * added on-chain as an ordinary signer. Sponsor this like any other\n * add_signer (gasless). Returns the transaction hash (or undefined when the\n * backup was already set up).\n */\n async setupRecovery(code: string): Promise<{ transactionHash: string } | undefined> {\n const { publicKey: backupPubkey } = deriveBackupKey(code);\n // Skip the on-chain call if the backup signer is already registered.\n const already = await this.adapter.isAuthorizedSigner(this.address, backupPubkey);\n if (already) return undefined;\n return this.addSigner(backupPubkey);\n }\n\n /**\n * Recover an account after losing every device signer. Derives the backup key\n * from `code`, uses it (not the new device key) to sign an `add_signer` for\n * the new device, and returns a ready Cavos bound to the new device. The\n * account address is unchanged.\n *\n * Self-custodial: only someone holding the code (i.e. the rightful owner) can\n * re-derive the backup key. The backend never sees the code.\n */\n static async recover(opts: RecoveryOptions): Promise<Cavos> {\n const classHash = opts.classHash ?? DEVICE_ACCOUNT_CLASS_HASH[opts.network];\n if (!classHash) throw new Error(`kit: no DeviceAccount class hash for ${opts.network}`);\n\n const provider = new RpcProvider({\n nodeUrl: opts.rpcUrl ?? STARKNET_NETWORKS[opts.network].rpcUrl,\n });\n const paymaster = new PaymasterRpc({\n nodeUrl: opts.paymasterUrl ?? CAVOS_PAYMASTER_URL[opts.network],\n headers: { \"x-paymaster-api-key\": opts.paymasterApiKey },\n });\n\n // The new device's signer (created/loaded the same way connect() does).\n const signer = opts.createSigner\n ? await opts.createSigner(`${opts.identity.userId}:${opts.appSalt}`)\n : await WebCryptoSigner.loadOrCreate({ keyId: `${opts.identity.userId}:${opts.appSalt}` });\n const devicePubkey = await signer.getPublicKey();\n\n // The backup key drives THIS transaction: it's the only signer that can\n // authorise adding the new device after all device keys are lost.\n const backup = BackupSigner.fromCode(opts.code);\n const backupAdapter = new StarknetAdapter({ classHash, signer: backup, provider });\n\n const backendUrl = opts.backendUrl ?? \"https://cavos.xyz\";\n const registry =\n opts.registry ??\n (opts.appId\n ? new HttpWalletRegistry({ baseUrl: backendUrl, appId: opts.appId, network: opts.network })\n : defaultRegistry);\n const existing = await registry.lookup(opts.identity.userId);\n if (!existing) {\n throw new Error(\"kit: no account found for this identity — nothing to recover\");\n }\n\n // Authorise the new device, signed by the backup key (sponsored).\n const backupAccount = new Account({\n provider,\n address: existing.address,\n signer: new StarknetDeviceSigner(backup),\n paymaster,\n cairoVersion: \"1\",\n });\n const alreadyAuthed = await backupAdapter.isAuthorizedSigner(existing.address, devicePubkey);\n if (!alreadyAuthed) {\n const res = await backupAccount.executePaymasterTransaction(\n [backupAdapter.buildAddSigner(existing.address, devicePubkey)],\n { feeMode: { mode: \"sponsored\" } },\n );\n try {\n await provider.waitForTransaction(res.transaction_hash);\n } catch (e) {\n console.warn(\"[Cavos] recovery add_signer receipt wait failed:\", e);\n }\n }\n\n // Hand control to the new device's signer for all future operations.\n const adapter = new StarknetAdapter({ classHash, signer, provider });\n const account = new Account({\n provider,\n address: existing.address,\n signer: new StarknetDeviceSigner(signer),\n paymaster,\n cairoVersion: \"1\",\n });\n return new Cavos(opts.identity, existing.address, \"ready\", account, adapter, devicePubkey);\n }\n}\n\n/**\n * Shared in-memory registry used when `ConnectOptions.registry` is omitted.\n * Module-level so a returning user is recognized within a single browser session\n * (real cross-device recognition needs an HTTP backend implementation).\n */\nconst defaultRegistry = new InMemoryWalletRegistry();\n\n/**\n * Client-side de-duplication of device-addition requests, keyed by user id. A\n * burst of connects (refresh, reconnect, retry) within this window reuses the\n * last requestId instead of emailing the owner again. Runtime-agnostic — works\n * without DOM/localStorage so the same code runs on native.\n */\nconst DEVICE_REQUEST_DEDUP_MS = 5 * 60 * 1000; // 5 minutes\nconst lastDeviceRequest = new Map<string, { requestId: string; requestedAt: number }>();\n\n/** Whether an account contract is already deployed at `address`. */\nasync function isDeployed(provider: RpcProvider, address: string): Promise<boolean> {\n try {\n const classHash = await provider.getClassHashAt(address);\n return !!classHash && classHash !== \"0x0\";\n } catch {\n return false;\n }\n}\n","import { hash, num } from \"starknet\";\nimport type { AuthProvider, Identity } from \"./AuthProvider\";\n\nexport interface CavosAuthOptions {\n /** Cavos backend base URL. Defaults to the hosted service (same as @cavos/react). */\n backendUrl?: string;\n /** App identifier registered with Cavos (the `appId` from the dashboard). */\n appId?: string;\n}\n\n/**\n * Hosted login (Privy-like) backed by the Cavos backend — same endpoints\n * `@cavos/react` uses (Google / Apple OAuth + Firebase email OTP). Login only\n * resolves a stable `userId` (the OAuth `sub` claim); it never touches signing.\n * Feed the returned `Identity` to `Cavos.connect`.\n *\n * const auth = new CavosAuth({ appId });\n * // social: open the returned URL; user returns, then:\n * const identity = await auth.handleCallback(window.location.search);\n * // or email OTP:\n * await auth.sendOtp(email); const identity = await auth.verifyOtp(email, code);\n * const cavos = await Cavos.connect({ network, appSalt, identity, paymasterApiKey });\n *\n * Device-signer model note: the backend issues a Cavos JWT (the same one react\n * uses for on-chain RSA verification). Here we only need the stable `sub` claim\n * from it — the RSA/JWKS/nonce machinery react relies on is dead weight for the\n * device model, because the device key (not the JWT) authorizes on-chain calls.\n * We still send a `nonce` (Poseidon over random bytes) since the backend expects\n * it on the request; the value itself is irrelevant to us.\n */\nexport class CavosAuth implements AuthProvider {\n private readonly backendUrl: string;\n /** Most recent nonce sent to the backend (for the pending OAuth/OTP request). */\n private pendingNonce: string | null = null;\n private last: Identity | null = null;\n\n constructor(private readonly opts: CavosAuthOptions = {}) {\n this.backendUrl = opts.backendUrl ?? \"https://cavos.xyz\";\n }\n\n /** Redirect URL for Google login (open it; user returns to your redirectUri). */\n async getGoogleOAuthUrl(redirectUri?: string): Promise<string> {\n return this.oauthUrl(\"google\", redirectUri);\n }\n\n /** Redirect URL for Apple login. */\n async getAppleOAuthUrl(redirectUri?: string): Promise<string> {\n return this.oauthUrl(\"apple\", redirectUri);\n }\n\n private async oauthUrl(provider: \"google\" | \"apple\", redirectUri?: string): Promise<string> {\n if (typeof window === \"undefined\") throw new Error(\"kit/auth: OAuth requires a browser\");\n const params = new URLSearchParams({\n nonce: this.freshNonce(),\n redirect_uri: redirectUri ?? window.location.href,\n ...(this.opts.appId ? { app_id: this.opts.appId } : {}),\n });\n const { url } = await this.get(`/api/oauth/${provider}?${params}`);\n return url;\n }\n\n /**\n * Resolve the identity from an OAuth callback. The auth data is carried in the\n * `auth_data` (or `zk_auth_data`) query param on return. We only extract `sub`.\n */\n async handleCallback(authDataOrSearch: string): Promise<Identity> {\n const authData = extractAuthData(authDataOrSearch);\n return this.identityFromAuthData(authData, \"oauth\");\n }\n\n /** Send a one-time code to an email (Firebase OTP). */\n async sendOtp(email: string): Promise<void> {\n await this.post(\"/api/oauth/firebase/otp/request\", {\n email,\n nonce: this.freshNonce(),\n ...(this.opts.appId ? { app_id: this.opts.appId } : {}),\n });\n }\n\n /** Send a passwordless magic-link sign-in email (Firebase). */\n async sendMagicLink(email: string): Promise<void> {\n await this.post(\"/api/oauth/firebase/magic-link\", {\n email,\n nonce: this.freshNonce(),\n ...(this.opts.appId ? { app_id: this.opts.appId } : {}),\n ...(typeof window !== \"undefined\" ? { redirect_uri: window.location.href } : {}),\n });\n }\n\n /** Verify the OTP and resolve the identity. */\n async verifyOtp(email: string, code: string): Promise<Identity> {\n const res = await this.post(\"/api/oauth/firebase/otp/verify\", {\n email,\n code,\n nonce: this.consumeNonce(),\n ...(this.opts.appId ? { app_id: this.opts.appId } : {}),\n });\n return this.identityFromAuthData(res.id_token ?? res.jwt ?? res.token ?? JSON.stringify(res), \"otp\", email);\n }\n\n /** AuthProvider: returns the identity resolved by the last login step. */\n async authenticate(): Promise<Identity> {\n if (!this.last) throw new Error(\"kit/auth: no identity yet — complete a login first\");\n return this.last;\n }\n\n // ── internals ──────────────────────────────────────────────────────────────\n\n /**\n * Build an `Identity` from whatever the backend returned. The Cavos backend\n * wraps the user id in a JWT (its `sub` claim); for the device model we only\n * need that stable id — the signature is never checked on-chain.\n */\n private async identityFromAuthData(\n authData: string,\n provider: string,\n emailOverride?: string,\n ): Promise<Identity> {\n let token = authData;\n try {\n const parsed = JSON.parse(authData);\n token = parsed.id_token ?? parsed.jwt ?? parsed.token ?? authData;\n } catch {\n // raw JWT\n }\n const claims = parseJwt(token);\n return this.remember({\n userId: String(claims.sub ?? claims.user_id ?? claims.uid),\n email: claims.email ?? emailOverride,\n provider: claims.firebase?.sign_in_provider ?? claims.provider ?? provider,\n });\n }\n\n /** Generate (and remember) the nonce the Cavos backend expects on requests. */\n private freshNonce(): string {\n // 31-byte random felt; matches the shape the backend validates, value is\n // irrelevant to the device-signer model.\n const bytes = crypto.getRandomValues(new Uint8Array(31));\n const h = hash.computePoseidonHashOnElements([bytesToChunks(bytes)]);\n this.pendingNonce = num.toHex(h);\n return this.pendingNonce;\n }\n\n /** Return the pending nonce (for the verify step), clearing it. */\n private consumeNonce(): string {\n if (!this.pendingNonce) return this.freshNonce();\n const n = this.pendingNonce;\n this.pendingNonce = null;\n return n;\n }\n\n private remember(id: Identity): Identity {\n this.last = id;\n return id;\n }\n\n private async get(path: string): Promise<any> {\n const r = await fetch(`${this.backendUrl}${path}`);\n if (!r.ok) throw new Error(`kit/auth: ${path} -> ${r.status} ${await r.text()}`);\n return r.json();\n }\n\n private async post(path: string, body: unknown): Promise<any> {\n const r = await fetch(`${this.backendUrl}${path}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n if (!r.ok) throw new Error(`kit/auth: ${path} -> ${r.status} ${await r.text()}`);\n return r.json();\n }\n}\n\n/** Pull the `auth_data` / `zk_auth_data` value out of a callback string. */\nfunction extractAuthData(input: string): string {\n if (input.includes(\"auth_data=\") || input.includes(\"zk_auth_data=\")) {\n const params = new URLSearchParams(input.startsWith(\"?\") ? input : `?${input}`);\n return params.get(\"auth_data\") ?? params.get(\"zk_auth_data\") ?? input;\n }\n return input;\n}\n\n/** Decode a JWT payload (no verification — the backend already validated it). */\nfunction parseJwt(jwt: string): any {\n const part = jwt.split(\".\")[1];\n if (!part) throw new Error(\"kit/auth: malformed JWT\");\n const json = atob(part.replace(/-/g, \"+\").replace(/_/g, \"/\"));\n return JSON.parse(json);\n}\n\n/** Pack a byte array into the felt252 chunks Poseidon hashes over. */\nfunction bytesToChunks(bytes: Uint8Array): bigint {\n let w = 0n;\n for (const b of bytes.subarray(0, 31)) w = (w << 8n) | BigInt(b);\n return w;\n}\n","'use client';\n\nimport React, {\n useState,\n useEffect,\n useCallback,\n useRef,\n type CSSProperties,\n} from 'react';\nimport { useCavos } from './CavosProvider';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface CavosAuthModalProps {\n open: boolean;\n onClose: () => void;\n onSuccess?: (address: string) => void;\n appName?: string;\n appLogo?: string;\n providers?: ('google' | 'apple' | 'email')[];\n emailMode?: 'magic-link' | 'otp';\n primaryColor?: string;\n /** 'light' (default) or 'dark' */\n theme?: 'light' | 'dark';\n}\n\nconst cavosLogoBase64 = \"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\";\n\ntype Screen = 'select' | 'magic-link' | 'verify' | 'otp-code' | 'deploying' | 'device-approval' | 'recover';\n\n// ─── Style injection ──────────────────────────────────────────────────────────\n\nconst STYLE_ID = 'cavos-modal-styles-v2';\n\nfunction injectStyles() {\n if (typeof document === 'undefined') return;\n if (document.getElementById(STYLE_ID)) return;\n const el = document.createElement('style');\n el.id = STYLE_ID;\n el.textContent = `\n @keyframes cavos-fade { from { opacity:0; } to { opacity:1; } }\n @keyframes cavos-up {\n from { opacity:0; transform:translateY(12px) scale(0.985); }\n to { opacity:1; transform:translateY(0) scale(1); }\n }\n @keyframes cavos-sheet {\n from { transform:translateY(100%); }\n to { transform:translateY(0); }\n }\n @keyframes cavos-spin {\n from { transform:rotate(0deg); } to { transform:rotate(360deg); }\n }\n @keyframes cavos-pop {\n 0% { transform:scale(0.5); opacity:0; }\n 60% { transform:scale(1.12); opacity:1; }\n 100% { transform:scale(1); opacity:1; }\n }\n @keyframes cavos-check-draw {\n from { stroke-dashoffset: 30; }\n to { stroke-dashoffset: 0; }\n }\n @keyframes cavos-ring-glow {\n 0%,100% { box-shadow: 0 0 0 0 rgba(34,197,94,0.4); }\n 50% { box-shadow: 0 0 0 10px rgba(34,197,94,0); }\n }\n .cavos-check-circle {\n animation: cavos-pop 0.45s cubic-bezier(.22,1,.36,1) forwards;\n }\n .cavos-check-path {\n stroke-dasharray: 30;\n stroke-dashoffset: 30;\n animation: cavos-check-draw 0.35s 0.2s cubic-bezier(.22,1,.36,1) forwards;\n }\n .cavos-input-inner:focus { outline:none; }\n .cavos-provider:active { transform:scale(0.99); }\n .cavos-primary-btn:active { transform:scale(0.98); }\n .cavos-otp-input {\n width: 100%;\n text-align: center;\n font-size: 22px;\n font-weight: 600;\n background: transparent;\n border: none;\n outline: none;\n color: inherit;\n font-family: inherit;\n caret-color: transparent;\n }\n .cavos-otp-box {\n transition: border-color 0.15s, box-shadow 0.15s, transform 0.1s;\n }\n .cavos-otp-box-filled {\n transform: scale(1.04);\n }\n .cavos-divider-line {\n flex: 1;\n height: 1px;\n }\n /* Theme-aware interaction styles. The overlay carries data-cavos-theme so\n hovers/focus rings stay legible in both light and dark — the previous\n rgba(0,0,0,…) rules disappeared against the dark background. */\n [data-cavos-theme=\"light\"] .cavos-input-row:focus-within {\n border-color: rgba(0,0,0,0.35) !important;\n box-shadow: 0 0 0 3px rgba(0,0,0,0.06) !important;\n }\n [data-cavos-theme=\"dark\"] .cavos-input-row:focus-within {\n border-color: rgba(255,255,255,0.45) !important;\n box-shadow: 0 0 0 3px rgba(255,255,255,0.08) !important;\n }\n [data-cavos-theme=\"light\"] .cavos-provider:hover { background: rgba(0,0,0,0.035) !important; }\n [data-cavos-theme=\"dark\"] .cavos-provider:hover { background: rgba(255,255,255,0.07) !important; }\n [data-cavos-theme=\"light\"] .cavos-close:hover { background: rgba(0,0,0,0.05) !important; }\n [data-cavos-theme=\"dark\"] .cavos-close:hover { background: rgba(255,255,255,0.08) !important; }\n [data-cavos-theme=\"light\"] .cavos-sub-btn:hover { color: rgba(0,0,0,0.6) !important; }\n [data-cavos-theme=\"dark\"] .cavos-sub-btn:hover { color: rgba(255,255,255,0.65) !important; }\n [data-cavos-theme=\"light\"] .cavos-submit-btn:hover { color: rgba(0,0,0,0.8) !important; }\n [data-cavos-theme=\"dark\"] .cavos-submit-btn:hover { color: rgba(255,255,255,0.85) !important; }\n [data-cavos-theme=\"light\"] .cavos-primary-btn:hover { opacity: 0.88; }\n [data-cavos-theme=\"dark\"] .cavos-primary-btn:hover { opacity: 0.9; }\n [data-cavos-theme=\"light\"] .cavos-divider-line { background: rgba(0,0,0,0.08); }\n [data-cavos-theme=\"dark\"] .cavos-divider-line { background: rgba(255,255,255,0.1); }\n `;\n document.head.appendChild(el);\n}\n\n// ─── Icons ────────────────────────────────────────────────────────────────────\n\nconst GoogleIcon = () => (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\n <path d=\"M17.64 9.2c0-.637-.057-1.251-.164-1.84H9v3.481h4.844c-.209 1.125-.843 2.078-1.796 2.717v2.258h2.908c1.702-1.567 2.684-3.875 2.684-6.615z\" fill=\"#4285F4\"/>\n <path d=\"M9 18c2.43 0 4.467-.806 5.956-2.184l-2.908-2.258c-.806.54-1.837.86-3.048.86-2.344 0-4.328-1.584-5.036-3.711H.957v2.332A8.997 8.997 0 009 18z\" fill=\"#34A853\"/>\n <path d=\"M3.964 10.707A5.41 5.41 0 013.682 9c0-.593.102-1.17.282-1.707V4.961H.957A8.996 8.996 0 000 9c0 1.452.348 2.827.957 4.039l3.007-2.332z\" fill=\"#FBBC05\"/>\n <path d=\"M9 3.58c1.321 0 2.508.454 3.44 1.345l2.582-2.58C13.463.891 11.426 0 9 0A8.997 8.997 0 00.957 4.961L3.964 7.293C4.672 5.163 6.656 3.58 9 3.58z\" fill=\"#EA4335\"/>\n </svg>\n);\n\nconst AppleIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 814 1000\" fill=\"currentColor\">\n <path d=\"M788.1 340.9c-5.8 4.5-108.2 62.2-108.2 190.5 0 148.4 130.3 200.9 134.2 202.2-.6 3.2-20.7 71.9-68.7 141.9-42.8 61.6-87.5 123.1-155.5 123.1s-85.5-39.5-164-39.5c-76 0-103.7 40.8-165.9 40.8s-105-57.8-155.5-127.4C46 790.7 0 663 0 541.8c0-194.3 126.4-297.5 250.8-297.5 66.1 0 121.2 43.4 162.7 43.4 39.5 0 101.1-46 176.3-46 28.5 0 130.9 2.6 198.3 99.2zm-234-181.5c31.1-36.9 53.1-88.1 53.1-139.3 0-7.1-.6-14.3-1.9-20.1-50.6 1.9-110.8 33.7-147.1 75.8-28.5 32.4-55.1 83.6-55.1 135.5 0 7.8 1.3 15.6 1.9 18.1 3.2.6 8.4 1.3 13.6 1.3 45.4 0 102.5-30.4 135.5-71.3z\"/>\n </svg>\n);\n\nconst EmailIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\"/>\n <path d=\"m22 7-8.97 5.7a1.94 1.94 0 01-2.06 0L2 7\"/>\n </svg>\n);\n\nconst CavosLogo = ({ invert }: { invert?: boolean }) => (\n <img src={`data:image/png;base64,${cavosLogoBase64}`} alt=\"Cavos\" style={{ width: 'auto', height: '16px', objectFit: 'contain', opacity: 0.55, flexShrink: 0, filter: invert ? 'invert(1)' : 'none' }} />\n);\n\nfunction Spinner({ size = 16, color = '#888' }: { size?: number; color?: string }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\"\n style={{ animation: 'cavos-spin 0.75s linear infinite', flexShrink: 0 }}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke={color} strokeOpacity=\"0.2\" strokeWidth=\"2.5\"/>\n <path d=\"M12 2a10 10 0 0110 10\" stroke={color} strokeWidth=\"2.5\" strokeLinecap=\"round\"/>\n </svg>\n );\n}\n\n// ─── Mobile detection hook ────────────────────────────────────────────────────\n\nfunction useIsMobile() {\n const [isMobile, setIsMobile] = useState(false);\n useEffect(() => {\n const mq = window.matchMedia('(max-width: 640px)');\n setIsMobile(mq.matches);\n const handler = (e: MediaQueryListEvent) => setIsMobile(e.matches);\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n }, []);\n return isMobile;\n}\n\n// ─── Style helpers ────────────────────────────────────────────────────────────\n\nconst FONT = '-apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif';\n\nfunction baseOverlay(isMobile: boolean): CSSProperties {\n return {\n position: 'fixed', inset: 0,\n background: 'rgba(0,0,0,0.5)',\n backdropFilter: 'blur(10px)',\n WebkitBackdropFilter: 'blur(10px)',\n zIndex: 9999,\n display: 'flex',\n alignItems: isMobile ? 'flex-end' : 'center',\n justifyContent: 'center',\n padding: isMobile ? '0' : '16px',\n animation: 'cavos-fade 0.18s ease',\n fontFamily: FONT,\n };\n}\n\nfunction lightCard(isMobile: boolean, bg: string): CSSProperties {\n return isMobile ? {\n background: bg,\n borderRadius: '20px 20px 0 0',\n width: '100%',\n maxWidth: '100%',\n boxShadow: '0 -8px 40px rgba(0,0,0,0.18)',\n animation: 'cavos-sheet 0.32s cubic-bezier(0.22,1,0.36,1)',\n overflow: 'hidden',\n } : {\n background: bg,\n borderRadius: '22px',\n width: '100%',\n maxWidth: '400px',\n boxShadow: '0 24px 60px rgba(0,0,0,0.22), 0 0 0 1px rgba(0,0,0,0.05)',\n animation: 'cavos-up 0.25s cubic-bezier(0.22,1,0.36,1)',\n overflow: 'hidden',\n };\n}\n\nfunction providerBtn(textColor: string): CSSProperties {\n const isLight = textColor === '#111111' || textColor === '#111';\n return {\n width: '100%',\n display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '10px',\n padding: '12px 16px',\n background: isLight ? '#fff' : 'rgba(255,255,255,0.04)',\n border: `1px solid ${isLight ? 'rgba(0,0,0,0.12)' : 'rgba(255,255,255,0.12)'}`,\n borderRadius: '12px',\n cursor: 'pointer',\n fontSize: '14px',\n fontWeight: 500,\n color: textColor,\n fontFamily: 'inherit',\n transition: 'background 0.15s, transform 0.1s, border-color 0.15s',\n position: 'relative',\n };\n}\n\nfunction footerBar(textColor: string): CSSProperties {\n const isLight = textColor === '#111111' || textColor === '#111';\n return {\n borderTop: `1px solid ${isLight ? 'rgba(0,0,0,0.06)' : 'rgba(255,255,255,0.06)'}`,\n padding: '12px 20px',\n display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '5px',\n fontSize: '11px',\n color: isLight ? 'rgba(0,0,0,0.28)' : 'rgba(255,255,255,0.28)',\n };\n}\n\nfunction closeBtn(textColor: string): CSSProperties {\n return {\n position: 'absolute', top: '16px', right: '16px',\n width: '28px', height: '28px', borderRadius: '50%',\n border: 'none', background: 'transparent',\n cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center',\n color: textColor === '#111111' || textColor === '#111' ? 'rgba(0,0,0,0.3)' : 'rgba(255,255,255,0.4)',\n padding: 0, transition: 'background 0.15s',\n };\n}\n\nfunction mobileHandle(): CSSProperties {\n return {\n width: '36px', height: '4px', borderRadius: '2px',\n background: 'rgba(0,0,0,0.15)', margin: '12px auto 0',\n };\n}\n\nconst CloseX = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n);\n\n// ─── Main component ───────────────────────────────────────────────────────────\n\nexport function CavosAuthModal({\n open,\n onClose,\n appName,\n providers = ['google', 'apple', 'email'],\n emailMode = 'magic-link',\n primaryColor = '#0A0908',\n theme = 'light',\n}: CavosAuthModalProps) {\n const {\n login,\n sendMagicLink,\n sendOtp,\n verifyOtp,\n isAuthenticated,\n address,\n walletStatus,\n authError,\n clearAuthError,\n resendDeviceApproval,\n recover,\n } = useCavos();\n const isMobile = useIsMobile();\n\n // Theme-derived values\n const isLight = theme !== 'dark';\n const backgroundColor = isLight ? '#ffffff' : '#111111';\n const textColor = isLight ? '#111111' : '#ffffff';\n const subTextColor = isLight ? 'rgba(0,0,0,0.4)' : 'rgba(255,255,255,0.4)';\n const inputBg = isLight ? '#fff' : 'rgba(255,255,255,0.06)';\n const inputBorder = isLight ? '1px solid rgba(0,0,0,0.12)' : '1px solid rgba(255,255,255,0.12)';\n const errBg = isLight ? 'rgba(239,68,68,0.06)' : 'rgba(239,68,68,0.08)';\n const errColor = isLight ? '#dc2626' : '#f87171';\n const errBorder = isLight ? 'rgba(239,68,68,0.18)' : 'rgba(239,68,68,0.2)';\n const card = lightCard(isMobile, backgroundColor);\n const overlay = baseOverlay(isMobile);\n const handle = mobileHandle();\n const footer = footerBar(textColor);\n const close = closeBtn(textColor);\n const pBtn = providerBtn(textColor);\n\n const [screen, setScreen] = useState<Screen>('select');\n const [email, setEmail] = useState('');\n const [otpCode, setOtpCode] = useState('');\n const [error, setError] = useState('');\n const [busy, setBusy] = useState(false);\n const [deployState, setDeployState] = useState<'loading' | 'done'>('loading');\n const [resendCountdown, setResendCountdown] = useState(0);\n const [deviceResendBusy, setDeviceResendBusy] = useState(false);\n const [recoverCode, setRecoverCode] = useState('');\n const [recoverBusy, setRecoverBusy] = useState(false);\n\n const doneHandledRef = useRef(false);\n const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n // One ref per OTP box for focus management / auto-advance.\n const otpBoxRefs = useRef<Array<HTMLInputElement | null>>([null, null, null, null, null, null]);\n\n // Segmented OTP input helpers: keep `otpCode` (6-digit string) as the single\n // source of truth, drive focus by index, and handle paste/keystrokes cleanly.\n const setOtpDigit = (i: number, raw: string) => {\n const digit = raw.replace(/\\D/g, '').slice(-1);\n setOtpCode(prev => {\n const chars = prev.split('');\n while (chars.length < 6) chars.push('');\n chars[i] = digit;\n const next = chars.join('').slice(0, 6);\n // Auto-advance to the next empty box when a digit is typed.\n if (digit && i < 5) {\n const target = i + 1;\n otpBoxRefs.current[target]?.focus();\n }\n return next;\n });\n };\n\n const onOtpKeyDown = (i: number, e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace' && !otpCode[i] && i > 0) {\n // Empty box + backspace → move focus back instead of clearing nothing.\n otpBoxRefs.current[i - 1]?.focus();\n e.preventDefault();\n } else if (e.key === 'ArrowLeft' && i > 0) {\n otpBoxRefs.current[i - 1]?.focus();\n e.preventDefault();\n } else if (e.key === 'ArrowRight' && i < 5) {\n otpBoxRefs.current[i + 1]?.focus();\n e.preventDefault();\n }\n };\n\n const onOtpPaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n const text = e.clipboardData.getData('text').replace(/\\D/g, '').slice(0, 6);\n if (!text) return;\n e.preventDefault();\n setOtpCode(text);\n // Focus the box after the last pasted digit (or the last box).\n const focusIdx = Math.min(text.length, 5);\n otpBoxRefs.current[focusIdx]?.focus();\n };\n\n useEffect(() => { injectStyles(); }, []);\n\n // When the provider surfaces an unrecoverable connect error (e.g. a failed\n // OAuth callback), drop the user back on the provider-selection screen with\n // the message + a retry, instead of leaving the modal closed with no feedback.\n useEffect(() => {\n if (!authError) return;\n setBusy(false);\n setDeployState('loading');\n if (screen !== 'device-approval') setScreen('select');\n setError(authError);\n // The provider owns the error; once surfaced here it's \"consumed\" by the UI.\n clearAuthError();\n }, [authError, clearAuthError, screen]);\n\n const triggerDone = useCallback((addr: string) => {\n if (doneHandledRef.current) return;\n doneHandledRef.current = true;\n\n setScreen('deploying');\n setDeployState('done');\n\n closeTimerRef.current = setTimeout(() => {\n onClose();\n setScreen('select');\n setDeployState('loading');\n setEmail(''); setOtpCode(''); setError('');\n doneHandledRef.current = false;\n }, 1600);\n // addr unused beyond guarding the transition; keep the param for clarity.\n void addr;\n }, [onClose]);\n\n // Show the \"deploying\" screen whenever a deploy is in progress (e.g. while\n // returning from an OAuth redirect), or once authenticated, then flip to\n // \"done\" when the account is ready.\n useEffect(() => {\n if (!open) return;\n\n if (walletStatus.isDeploying && screen !== 'deploying' && screen !== 'verify') {\n setScreen('deploying');\n setDeployState('loading');\n doneHandledRef.current = false;\n }\n\n if (isAuthenticated && address && walletStatus.isReady) {\n triggerDone(address);\n }\n\n // This device needs approval: show the \"check your email\" screen. Don't\n // override the recover screen — the user navigated there intentionally from\n // device-approval to restore access with their recovery phrase.\n if (walletStatus.awaitingApproval && screen !== 'device-approval' && screen !== 'recover') {\n setScreen('device-approval');\n doneHandledRef.current = false;\n }\n }, [open, isAuthenticated, address, walletStatus.isReady, walletStatus.isDeploying, walletStatus.awaitingApproval, screen, triggerDone]);\n\n useEffect(() => () => {\n if (closeTimerRef.current) clearTimeout(closeTimerRef.current);\n }, []);\n\n const handleClose = () => {\n if (screen === 'deploying') return;\n setScreen('select'); setEmail(''); setOtpCode(''); setError('');\n doneHandledRef.current = false;\n onClose();\n };\n\n const handleOAuth = async (provider: 'google' | 'apple') => {\n setError(''); setBusy(true);\n try {\n await login(provider);\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : 'Authentication failed.';\n setError(msg); setBusy(false);\n }\n };\n\n const handleMagicLinkSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!email) return;\n setError(''); setBusy(true);\n try {\n await sendMagicLink(email);\n setScreen('verify');\n setResendCountdown(60);\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : 'Failed to send magic link.');\n } finally {\n setBusy(false);\n }\n };\n\n const handleOtpRequestSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!email) return;\n setError(''); setBusy(true);\n try {\n await sendOtp(email);\n setOtpCode('');\n setScreen('otp-code');\n setResendCountdown(60);\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : 'Failed to send code.');\n } finally {\n setBusy(false);\n }\n };\n\n const handleOtpVerifySubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!email || otpCode.length !== 6) return;\n setError(''); setBusy(true);\n try {\n await verifyOtp(email, otpCode);\n setScreen('deploying');\n setDeployState('loading');\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : 'Invalid or expired code.');\n setBusy(false);\n }\n };\n\n const handleResend = async () => {\n if (resendCountdown > 0) return;\n setError('');\n try {\n if (emailMode === 'otp') {\n await sendOtp(email);\n setOtpCode('');\n } else {\n await sendMagicLink(email);\n }\n setResendCountdown(60);\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : 'Failed to resend.');\n }\n };\n\n useEffect(() => {\n if (resendCountdown <= 0) return;\n const t = setTimeout(() => setResendCountdown(c => c - 1), 1000);\n return () => clearTimeout(t);\n }, [resendCountdown]);\n\n if (!open) return null;\n\n // ── Device approval (waiting for the owner to approve from another device) ─\n\n const handleDeviceResend = async () => {\n if (resendCountdown > 0 || deviceResendBusy) return;\n setDeviceResendBusy(true);\n setError('');\n try {\n await resendDeviceApproval();\n setResendCountdown(60);\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : 'Failed to resend. Try again.');\n } finally {\n setDeviceResendBusy(false);\n }\n };\n\n if (screen === 'device-approval') {\n // The provider nulls pendingRequestId when the request expires (while the\n // device is still awaiting approval) — that's our signal to switch copy.\n const expired = walletStatus.awaitingApproval && !walletStatus.pendingRequestId;\n return (\n <div style={overlay} data-cavos-theme={theme} role=\"dialog\" aria-modal>\n <div style={{ ...card, position: 'relative' }}>\n {isMobile && <div style={handle} />}\n <button className=\"cavos-close\" style={close} onClick={handleClose} aria-label=\"Close\"><CloseX /></button>\n <div style={{ padding: isMobile ? '28px 24px 32px' : '48px 24px 32px', textAlign: 'center' }}>\n <div style={{ width: 48, height: 48, borderRadius: '50%', margin: '0 auto 16px', background: expired ? 'rgba(239,68,68,0.08)' : 'rgba(59,130,246,0.08)', border: `1px solid ${expired ? 'rgba(239,68,68,0.18)' : 'rgba(59,130,246,0.18)'}`, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={expired ? '#dc2626' : '#3b82f6'} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"5\" y=\"2\" width=\"14\" height=\"20\" rx=\"2.5\" />\n <path d=\"M12 18h.01\" />\n </svg>\n </div>\n <h2 style={{ margin: '0 0 8px', fontSize: '17px', fontWeight: 600, color: textColor, letterSpacing: '-0.02em' }}>\n {expired ? 'Approval link expired' : 'Approve this device'}\n </h2>\n <p style={{ margin: '0 0 20px', fontSize: '13px', color: subTextColor, lineHeight: 1.55 }}>\n {expired\n ? 'The approval link is no longer valid. Request a new one below.'\n : <>For your security, we sent an email to approve this device.{appName ? <> Open it on a device where you're already signed in to your {appName} account.</> : null}</>}\n </p>\n {error && <div style={{ background: errBg, border: `1px solid ${errBorder}`, borderRadius: '10px', padding: '9px 13px', fontSize: '13px', color: errColor, marginBottom: '14px' }}>{error}</div>}\n {expired ? (\n <button className=\"cavos-primary-btn\" style={{ width: '100%', padding: '12px', borderRadius: '12px', border: 'none', background: primaryColor, color: '#fff', fontSize: '14px', fontWeight: 500, cursor: 'pointer', fontFamily: 'inherit', display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '8px', opacity: deviceResendBusy ? 0.65 : 1 }} onClick={handleDeviceResend} disabled={deviceResendBusy}>\n {deviceResendBusy && <Spinner size={15} color=\"#fff\" />}\n {deviceResendBusy ? 'Sending…' : 'Request a new link'}\n </button>\n ) : (\n <div style={{ background: isLight ? 'rgba(0,0,0,0.03)' : 'rgba(255,255,255,0.04)', border: `1px solid ${isLight ? 'rgba(0,0,0,0.06)' : 'rgba(255,255,255,0.06)'}`, borderRadius: '12px', padding: '14px 16px', display: 'flex', alignItems: 'center', gap: 10, justifyContent: 'center', marginBottom: '14px' }}>\n <Spinner size={14} color={subTextColor} />\n <span style={{ fontSize: '12px', color: subTextColor }}>Waiting for approval…</span>\n </div>\n )}\n {!expired && (\n <button className=\"cavos-sub-btn\" style={{ background: 'none', border: 'none', cursor: resendCountdown > 0 ? 'default' : 'pointer', fontSize: '13px', color: subTextColor, width: '100%', textAlign: 'center', padding: 0, fontFamily: 'inherit', transition: 'color 0.15s', opacity: resendCountdown > 0 ? 0.6 : 1 }} onClick={handleDeviceResend} disabled={resendCountdown > 0 || deviceResendBusy}>\n {resendCountdown > 0 ? `Resend email in ${resendCountdown}s` : 'Resend approval email'}\n </button>\n )}\n <button className=\"cavos-sub-btn\" style={{ background: 'none', border: 'none', cursor: 'pointer', fontSize: '13px', color: subTextColor, width: '100%', textAlign: 'center', padding: '14px 0 0', fontFamily: 'inherit', transition: 'color 0.15s' }} onClick={() => { setScreen('recover'); setError(''); }}>\n Sign in with recovery phrase instead\n </button>\n </div>\n <div style={footer}><CavosLogo invert={!isLight} /><span>Secured by Cavos</span></div>\n </div>\n </div>\n );\n }\n\n // ── Recover (lost all devices — restore access with the recovery code) ────\n\n const handleRecoverSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!recoverCode.trim()) return;\n setRecoverBusy(true);\n setError('');\n try {\n await recover(recoverCode);\n // The provider flips to ready; the existing effect drives triggerDone.\n setScreen('deploying');\n setDeployState('loading');\n } catch (e2) {\n setError(e2 instanceof Error ? e2.message : 'Sign-in failed. Check your recovery phrase and try again.');\n setRecoverBusy(false);\n }\n };\n\n if (screen === 'recover') {\n return (\n <div style={overlay} data-cavos-theme={theme} role=\"dialog\" aria-modal onClick={e => { if (e.target === e.currentTarget) handleClose(); }}>\n <div style={{ ...card, position: 'relative' }}>\n {isMobile && <div style={handle} />}\n <button className=\"cavos-close\" style={{ ...close, left: '16px', right: 'auto' }} onClick={() => { setScreen('device-approval'); setError(''); setRecoverCode(''); }} aria-label=\"Back\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\n </button>\n <button className=\"cavos-close\" style={close} onClick={handleClose} aria-label=\"Close\"><CloseX /></button>\n <div style={{ padding: isMobile ? '28px 22px 32px' : '52px 22px 22px' }}>\n <h2 style={{ margin: '0 0 6px', fontSize: '17px', fontWeight: 600, color: textColor, letterSpacing: '-0.02em', textAlign: 'center' }}>Sign in with recovery phrase</h2>\n <p style={{ margin: '0 0 20px', fontSize: '13px', color: subTextColor, textAlign: 'center', lineHeight: 1.5 }}>\n Enter the recovery phrase you saved when you set up this account.\n </p>\n {error && <div style={{ background: errBg, border: `1px solid ${errBorder}`, borderRadius: '10px', padding: '10px 14px', fontSize: '13px', color: errColor, marginBottom: '14px' }}>{error}</div>}\n <form onSubmit={handleRecoverSubmit} style={{ display: 'flex', flexDirection: 'column', gap: '10px' }}>\n <textarea\n className=\"cavos-input-inner\"\n style={{ width: '100%', padding: '12px 14px', border: inputBorder, borderRadius: '12px', fontSize: '14px', color: textColor, background: inputBg, fontFamily: 'inherit', boxSizing: 'border-box', resize: 'vertical', minHeight: 72, lineHeight: 1.5 }}\n placeholder=\"Enter your recovery phrase\"\n value={recoverCode}\n onChange={e => setRecoverCode(e.target.value)}\n required\n disabled={recoverBusy}\n autoFocus\n />\n <button type=\"submit\" className=\"cavos-primary-btn\" style={{ width: '100%', padding: '12px', marginTop: '4px', borderRadius: '12px', border: 'none', background: primaryColor, color: '#fff', fontSize: '14px', fontWeight: 500, cursor: 'pointer', fontFamily: 'inherit', display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '8px', transition: 'opacity 0.15s, transform 0.1s', opacity: recoverBusy ? 0.65 : 1 }} disabled={recoverBusy}>\n {recoverBusy && <Spinner size={15} color=\"#fff\" />}\n {recoverBusy ? 'Restoring access…' : 'Restore access'}\n </button>\n </form>\n </div>\n <div style={footer}><CavosLogo invert={!isLight} /><span>Secured by Cavos</span></div>\n </div>\n </div>\n );\n }\n\n // ── Deploying ─────────────────────────────────────────────────────────────\n\n if (screen === 'deploying') {\n const isDone = deployState === 'done';\n return (\n <div style={overlay} data-cavos-theme={theme} role=\"dialog\" aria-modal>\n <div style={card}>\n {isMobile && <div style={handle} />}\n <div style={{ padding: '52px 28px 44px', display: 'flex', flexDirection: 'column', alignItems: 'center', textAlign: 'center', gap: '16px' }}>\n {isDone ? (\n <div className=\"cavos-check-circle\" style={{ width: 64, height: 64, borderRadius: '50%', background: 'rgba(34,197,94,0.12)', border: '1.5px solid rgba(34,197,94,0.35)', display: 'flex', alignItems: 'center', justifyContent: 'center', animation: 'cavos-ring-glow 1.5s ease-out' }}>\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\">\n <polyline className=\"cavos-check-path\" points=\"20 6 9 17 4 12\" stroke=\"#22c55e\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </div>\n ) : (\n <div style={{ width: 64, height: 64, borderRadius: '50%', background: isLight ? 'rgba(0,0,0,0.04)' : 'rgba(255,255,255,0.04)', border: `1.5px solid ${isLight ? 'rgba(0,0,0,0.08)' : 'rgba(255,255,255,0.08)'}`, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <Spinner size={26} color={isLight ? 'rgba(0,0,0,0.4)' : 'rgba(255,255,255,0.6)'} />\n </div>\n )}\n <div>\n <h2 style={{ margin: 0, fontSize: '17px', fontWeight: 600, color: textColor, letterSpacing: '-0.02em' }}>\n {isDone ? \"You're all set\" : 'Setting up your account'}\n </h2>\n <p style={{ margin: '6px 0 0', fontSize: '13px', color: subTextColor }}>\n {isDone ? 'Your account is ready' : 'This only takes a moment…'}\n </p>\n </div>\n </div>\n <div style={footer}><CavosLogo invert={!isLight} /><span>Secured by Cavos</span></div>\n </div>\n </div>\n );\n }\n\n // ── Check your inbox ───────────────────────────────────────────────────────\n\n if (screen === 'verify') {\n return (\n <div style={overlay} data-cavos-theme={theme} role=\"dialog\" aria-modal onClick={e => { if (e.target === e.currentTarget) handleClose(); }}>\n <div style={{ ...card, position: 'relative' }}>\n {isMobile && <div style={handle} />}\n <button className=\"cavos-close\" style={close} onClick={handleClose} aria-label=\"Close\"><CloseX /></button>\n <div style={{ padding: isMobile ? '28px 24px 32px' : '40px 24px 24px', textAlign: 'center' }}>\n <div style={{ width: 48, height: 48, borderRadius: '50%', margin: '0 auto 16px', background: 'rgba(34,197,94,0.08)', border: '1px solid rgba(34,197,94,0.18)', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#22c55e\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\"/>\n </svg>\n </div>\n <h2 style={{ margin: '0 0 8px', fontSize: '17px', fontWeight: 600, color: textColor, letterSpacing: '-0.02em' }}>Check your inbox</h2>\n <p style={{ margin: '0 0 22px', fontSize: '13px', color: subTextColor, lineHeight: 1.55 }}>\n We sent a sign-in link to <strong style={{ color: textColor, fontWeight: 500 }}>{email}</strong>.<br />Open it on this device to continue.\n </p>\n {error && <div style={{ background: errBg, border: `1px solid ${errBorder}`, borderRadius: '10px', padding: '9px 13px', fontSize: '13px', color: errColor, marginBottom: '14px' }}>{error}</div>}\n <button className=\"cavos-primary-btn\" style={{ width: '100%', padding: '12px', borderRadius: '12px', border: 'none', background: resendCountdown > 0 ? (isLight ? 'rgba(0,0,0,0.06)' : 'rgba(255,255,255,0.08)') : primaryColor, color: resendCountdown > 0 ? subTextColor : '#fff', fontSize: '14px', fontWeight: 500, cursor: resendCountdown > 0 ? 'default' : 'pointer', fontFamily: 'inherit', transition: 'opacity 0.15s', marginBottom: '8px' }} onClick={handleResend} disabled={resendCountdown > 0}>\n {resendCountdown > 0 ? `Resend in ${resendCountdown}s` : 'Resend link'}\n </button>\n <button className=\"cavos-sub-btn\" style={{ background: 'none', border: 'none', cursor: 'pointer', fontSize: '13px', color: subTextColor, width: '100%', textAlign: 'center', padding: '8px 0 0', fontFamily: 'inherit', transition: 'color 0.15s' }} onClick={() => { setScreen('magic-link'); setError(''); }}>\n Use a different email\n </button>\n </div>\n <div style={footer}><CavosLogo invert={!isLight} /><span>Secured by Cavos</span></div>\n </div>\n </div>\n );\n }\n\n // ── OTP code entry ─────────────────────────────────────────────────────────\n\n if (screen === 'otp-code') {\n return (\n <div style={overlay} data-cavos-theme={theme} role=\"dialog\" aria-modal onClick={e => { if (e.target === e.currentTarget) handleClose(); }}>\n <div style={{ ...card, position: 'relative' }}>\n {isMobile && <div style={handle} />}\n <button className=\"cavos-close\" style={{ ...close, left: '16px', right: 'auto' }} onClick={() => { setScreen('magic-link'); setError(''); setOtpCode(''); }} aria-label=\"Back\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\n </button>\n <button className=\"cavos-close\" style={close} onClick={handleClose} aria-label=\"Close\"><CloseX /></button>\n <div style={{ padding: isMobile ? '28px 22px 32px' : '52px 22px 22px', textAlign: 'center' }}>\n <h2 style={{ margin: '0 0 8px', fontSize: '17px', fontWeight: 600, color: textColor, letterSpacing: '-0.02em' }}>Enter your code</h2>\n <p style={{ margin: '0 0 20px', fontSize: '13px', color: subTextColor, lineHeight: 1.5 }}>\n We sent a 6-digit code to <strong style={{ color: textColor, fontWeight: 500 }}>{email}</strong>.\n </p>\n {error && <div style={{ background: errBg, border: `1px solid ${errBorder}`, borderRadius: '10px', padding: '10px 14px', fontSize: '13px', color: errColor, marginBottom: '14px', textAlign: 'left' }}>{error}</div>}\n <form onSubmit={handleOtpVerifySubmit} style={{ display: 'flex', flexDirection: 'column', gap: '16px' }}>\n <div style={{ display: 'flex', gap: '8px', justifyContent: 'center' }} onPaste={onOtpPaste}>\n {[0, 1, 2, 3, 4, 5].map(i => (\n <input\n key={i}\n ref={el => { otpBoxRefs.current[i] = el; }}\n className={`cavos-input-inner cavos-otp-box ${otpCode[i] ? 'cavos-otp-box-filled' : ''}`}\n style={{\n width: '44px',\n height: '52px',\n padding: 0,\n border: inputBorder,\n borderRadius: '12px',\n fontSize: '22px',\n fontWeight: 600,\n color: textColor,\n background: inputBg,\n fontFamily: 'inherit',\n boxSizing: 'border-box',\n textAlign: 'center',\n }}\n type=\"text\"\n inputMode=\"numeric\"\n autoComplete={i === 0 ? 'one-time-code' : 'off'}\n maxLength={1}\n value={otpCode[i] ?? ''}\n onChange={e => setOtpDigit(i, e.target.value)}\n onKeyDown={e => onOtpKeyDown(i, e)}\n onFocus={e => e.target.select()}\n disabled={busy}\n autoFocus={i === 0}\n />\n ))}\n </div>\n <button type=\"submit\" className=\"cavos-primary-btn\" style={{ width: '100%', padding: '12px', marginTop: '4px', borderRadius: '12px', border: 'none', background: primaryColor, color: '#fff', fontSize: '14px', fontWeight: 500, cursor: 'pointer', fontFamily: 'inherit', display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '8px', transition: 'opacity 0.15s, transform 0.1s', opacity: busy || otpCode.length !== 6 ? 0.65 : 1 }} disabled={busy || otpCode.length !== 6}>\n {busy && <Spinner size={15} color=\"#fff\" />}\n {busy ? 'Verifying…' : 'Continue'}\n </button>\n </form>\n <button className=\"cavos-primary-btn\" style={{ width: '100%', padding: '12px', borderRadius: '12px', border: 'none', background: resendCountdown > 0 ? (isLight ? 'rgba(0,0,0,0.06)' : 'rgba(255,255,255,0.08)') : 'transparent', color: resendCountdown > 0 ? subTextColor : primaryColor, fontSize: '14px', fontWeight: 500, cursor: resendCountdown > 0 ? 'default' : 'pointer', fontFamily: 'inherit', transition: 'opacity 0.15s', marginTop: '8px' }} onClick={handleResend} disabled={resendCountdown > 0 || busy}>\n {resendCountdown > 0 ? `Resend in ${resendCountdown}s` : 'Resend code'}\n </button>\n <button className=\"cavos-sub-btn\" style={{ background: 'none', border: 'none', cursor: 'pointer', fontSize: '13px', color: subTextColor, width: '100%', textAlign: 'center', padding: '8px 0 0', fontFamily: 'inherit', transition: 'color 0.15s' }} onClick={() => { setScreen('magic-link'); setError(''); setOtpCode(''); }}>\n Use a different email\n </button>\n </div>\n <div style={footer}><CavosLogo invert={!isLight} /><span>Secured by Cavos</span></div>\n </div>\n </div>\n );\n }\n\n // ── Email form ─────────────────────────────────────────────────────────────\n\n if (screen === 'magic-link') {\n const isOtp = emailMode === 'otp';\n return (\n <div style={overlay} data-cavos-theme={theme} role=\"dialog\" aria-modal onClick={e => { if (e.target === e.currentTarget) handleClose(); }}>\n <div style={{ ...card, position: 'relative' }}>\n {isMobile && <div style={handle} />}\n <button className=\"cavos-close\" style={{ ...close, left: '16px', right: 'auto' }} onClick={() => { setScreen('select'); setError(''); }} aria-label=\"Back\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\n </button>\n <button className=\"cavos-close\" style={close} onClick={handleClose} aria-label=\"Close\"><CloseX /></button>\n <div style={{ padding: isMobile ? '28px 22px 32px' : '52px 22px 22px' }}>\n <h2 style={{ margin: '0 0 6px', fontSize: '17px', fontWeight: 600, color: textColor, letterSpacing: '-0.02em', textAlign: 'center' }}>Sign in with email</h2>\n <p style={{ margin: '0 0 20px', fontSize: '13px', color: subTextColor, textAlign: 'center', lineHeight: 1.5 }}>\n {isOtp ? \"We'll send a secure sign-in code to your inbox.\" : \"We'll send a secure sign-in link to your inbox.\"}\n </p>\n {error && <div style={{ background: errBg, border: `1px solid ${errBorder}`, borderRadius: '10px', padding: '10px 14px', fontSize: '13px', color: errColor, marginBottom: '14px' }}>{error}</div>}\n <form onSubmit={isOtp ? handleOtpRequestSubmit : handleMagicLinkSubmit} style={{ display: 'flex', flexDirection: 'column', gap: '10px' }}>\n <input className=\"cavos-input-inner\" style={{ width: '100%', padding: '12px 14px', border: inputBorder, borderRadius: '12px', fontSize: '14px', color: textColor, background: inputBg, fontFamily: 'inherit', boxSizing: 'border-box', transition: 'border-color 0.15s' }} type=\"email\" placeholder=\"your@email.com\" value={email} onChange={e => setEmail(e.target.value)} required disabled={busy} autoFocus />\n <button type=\"submit\" className=\"cavos-primary-btn\" style={{ width: '100%', padding: '12px', marginTop: '4px', borderRadius: '12px', border: 'none', background: primaryColor, color: '#fff', fontSize: '14px', fontWeight: 500, cursor: 'pointer', fontFamily: 'inherit', display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '8px', transition: 'opacity 0.15s, transform 0.1s', opacity: busy ? 0.65 : 1 }} disabled={busy}>\n {busy && <Spinner size={15} color=\"#fff\" />}\n {busy ? 'Sending…' : (isOtp ? 'Send code' : 'Send magic link')}\n </button>\n </form>\n </div>\n <div style={footer}><CavosLogo invert={!isLight} /><span>Secured by Cavos</span></div>\n </div>\n </div>\n );\n }\n\n // ── Provider selection ─────────────────────────────────────────────────────\n\n const showEmail = providers.includes('email');\n const showGoogle = providers.includes('google');\n const showApple = providers.includes('apple');\n const hasSocial = showGoogle || showApple;\n // Absolute-positioned icon so the label stays optically centered (matches the\n // Privy/Clerk full-width button look) instead of shifting when text changes.\n // No background box — the brand logos render clean, like native sign-in buttons.\n const btnIcon = (icon: React.ReactNode, busyIcon: React.ReactNode, color: string) => (\n <span style={{ position: 'absolute', left: '16px', width: 20, height: 20, display: 'flex', alignItems: 'center', justifyContent: 'center', color, flexShrink: 0 }}>\n {busy ? busyIcon : icon}\n </span>\n );\n\n return (\n <div style={overlay} data-cavos-theme={theme} role=\"dialog\" aria-modal onClick={e => { if (e.target === e.currentTarget) handleClose(); }}>\n <div style={{ ...card, position: 'relative' }}>\n {isMobile && <div style={handle} />}\n <button className=\"cavos-close\" style={close} onClick={handleClose} aria-label=\"Close\"><CloseX /></button>\n\n <div style={{ padding: isMobile ? '24px 20px 32px' : '40px 24px 24px' }}>\n <h2 style={{ margin: '0 0 22px', fontSize: '17px', fontWeight: 600, color: textColor, letterSpacing: '-0.02em', textAlign: 'center' }}>\n {appName ? `Sign in to ${appName}` : 'Log in or sign up'}\n </h2>\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: '10px' }}>\n {showGoogle && (\n <button className=\"cavos-provider\" style={{ ...pBtn, ...(busy ? { opacity: 0.55, cursor: 'not-allowed' } : {}) }} onClick={() => handleOAuth('google')} disabled={busy}>\n {btnIcon(<GoogleIcon />, <Spinner size={14} color=\"#888\" />, '#4285F4')}\n <span>Continue with Google</span>\n </button>\n )}\n\n {showApple && (\n <button className=\"cavos-provider\" style={{ ...pBtn, ...(busy ? { opacity: 0.55, cursor: 'not-allowed' } : {}) }} onClick={() => handleOAuth('apple')} disabled={busy}>\n {btnIcon(<AppleIcon />, <Spinner size={14} color={isLight ? '#111' : '#fff'} />, isLight ? '#111' : '#fff')}\n <span>Continue with Apple</span>\n </button>\n )}\n\n {showEmail && hasSocial && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px', margin: '6px 0 2px' }}>\n <span className=\"cavos-divider-line\" style={{ background: isLight ? 'rgba(0,0,0,0.08)' : 'rgba(255,255,255,0.08)' }} />\n <span style={{ fontSize: '12px', color: subTextColor, textTransform: 'uppercase', letterSpacing: '0.05em' }}>or</span>\n <span className=\"cavos-divider-line\" style={{ background: isLight ? 'rgba(0,0,0,0.08)' : 'rgba(255,255,255,0.08)' }} />\n </div>\n )}\n\n {showEmail && (\n <button className=\"cavos-provider\" style={{ ...pBtn, cursor: busy ? 'not-allowed' : 'pointer' }} onClick={() => setScreen('magic-link')} disabled={busy}>\n {btnIcon(<EmailIcon />, <Spinner size={14} color={subTextColor} />, subTextColor)}\n <span>Continue with email</span>\n </button>\n )}\n </div>\n\n {error && <div style={{ marginTop: '14px', background: errBg, border: `1px solid ${errBorder}`, borderRadius: '10px', padding: '9px 13px', fontSize: '13px', color: errColor }}>{error}</div>}\n\n <p style={{ margin: '18px 0 0', fontSize: '11px', color: subTextColor, textAlign: 'center', lineHeight: 1.55 }}>\n By continuing you agree to the{' '}\n <a href=\"https://cavos.xyz/user-privacy\" target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: isLight ? 'rgba(0,0,0,0.45)' : 'rgba(255,255,255,0.45)', textDecoration: 'underline' }}>Privacy Policy</a>\n{' & '}\n <a href=\"https://cavos.xyz/user-terms\" target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: isLight ? 'rgba(0,0,0,0.45)' : 'rgba(255,255,255,0.45)', textDecoration: 'underline' }}>Terms</a>.\n </p>\n </div>\n\n <div style={footer}><CavosLogo invert={!isLight} /><span>Secured by Cavos</span></div>\n </div>\n </div>\n );\n}\n\n// ─── useCavosAuth hook ────────────────────────────────────────────────────────\n\nexport function useCavosAuth() {\n const { openModal, closeModal, isAuthenticated, address, user, walletStatus, logout } = useCavos();\n return { openModal, closeModal, isAuthenticated, address, user, walletStatus, logout };\n}\n","'use client';\n\nimport {\n createContext,\n useContext,\n useEffect,\n useState,\n useCallback,\n useRef,\n type ReactNode,\n} from 'react';\nimport { Cavos } from '../Cavos';\nimport { CavosAuth } from '../auth/CavosAuth';\nimport type { Identity } from '../auth/AuthProvider';\nimport type { StarknetNetwork } from '../chains/starknet/constants';\nimport type { ChainCall } from '../chains/ChainAdapter';\nimport { HttpRecoveryClient } from '../recovery/HttpRecoveryClient';\nimport { generateRecoveryCode } from '../recovery/BackupSigner';\nimport { CavosAuthModal } from './CavosAuthModal';\n\nexport interface CavosConfig {\n /** Cavos App ID from the dashboard. */\n appId?: string;\n network: StarknetNetwork;\n /** Per-app salt so the same user has distinct wallets per app. */\n appSalt: string;\n /** Cavos paymaster API key (sponsors deploy + execute). */\n paymasterApiKey: string;\n /** Override the Cavos auth backend (self-hosted / staging). */\n authBackendUrl?: string;\n /** Override the Starknet RPC. */\n rpcUrl?: string;\n}\n\nexport interface CavosModalConfig {\n appName?: string;\n appLogo?: string;\n providers?: ('google' | 'apple' | 'email')[];\n /** How the built-in email provider authenticates. Defaults to magic link. */\n emailMode?: 'magic-link' | 'otp';\n primaryColor?: string;\n /** 'light' (default) or 'dark'. */\n theme?: 'light' | 'dark';\n onSuccess?: (address: string) => void;\n}\n\n/** Minimal wallet-status surface the React layer (and modal) needs. */\nexport interface WalletStatus {\n /** True while the device-signer account is being deployed. */\n isDeploying: boolean;\n /** True once deployed and this device is an authorized signer. */\n isReady: boolean;\n /** True if this device still needs approval to operate the wallet. */\n needsDeviceApproval: boolean;\n /** True while waiting for the owner to approve this device from another device. */\n awaitingApproval: boolean;\n /** The pending device-addition request id, when awaitingApproval. */\n pendingRequestId: string | null;\n}\n\nexport interface UserInfo {\n userId: string;\n email?: string;\n provider?: string;\n}\n\nexport interface CavosContextValue {\n /** Open / close the built-in auth modal. */\n openModal: () => void;\n closeModal: () => void;\n isAuthenticated: boolean;\n user: UserInfo | null;\n address: string | null;\n walletStatus: WalletStatus;\n isLoading: boolean;\n /** Last unrecoverable auth/connect error surfaced to the UI (e.g. a failed\n * OAuth callback). Null while things are healthy. Cleared on a new attempt. */\n authError: string | null;\n /** Clear `authError` (e.g. when the user starts a new login attempt). */\n clearAuthError: () => void;\n /** OAuth social login — opens the provider's hosted flow. */\n login: (provider: 'google' | 'apple') => Promise<void>;\n /** Send a passwordless magic-link email. */\n sendMagicLink: (email: string) => Promise<void>;\n /** Send an email OTP code. */\n sendOtp: (email: string) => Promise<void>;\n /** Verify an email OTP / complete a magic link and deploy the wallet. */\n verifyOtp: (email: string, code: string) => Promise<void>;\n /** Resolve identity from an OAuth callback (?auth_data=…) and deploy. */\n handleCallback: (authData: string) => Promise<void>;\n /** Execute a sponsored (gasless) multicall, signed by the device key. */\n execute: (calls: ChainCall[]) => Promise<{ transactionHash: string }>;\n /** Authorize another device signer on this wallet (sponsored add_signer). */\n addSigner: (pubkey: { x: bigint; y: bigint }) => Promise<{ transactionHash: string }>;\n /** Re-request the device-approval email for the current pending request. */\n resendDeviceApproval: () => Promise<void>;\n /**\n * Register a backup signer derived from `code` on the current account\n * (gasless). The code is generated by the kit and shown to the user once.\n * Resolves with the code so the caller can display it.\n */\n setupRecovery: () => Promise<string>;\n /**\n * Recover access after losing every device. Requires the recovery code. Runs\n * the full Cavos.recover flow and brings the provider to a ready state.\n */\n recover: (code: string) => Promise<void>;\n logout: () => void;\n}\n\nconst CavosContext = createContext<CavosContextValue | null>(null);\n\nexport interface CavosProviderProps {\n config: CavosConfig;\n modal?: CavosModalConfig;\n children: ReactNode;\n}\n\nconst INITIAL_STATUS: WalletStatus = {\n isDeploying: false,\n isReady: false,\n needsDeviceApproval: false,\n awaitingApproval: false,\n pendingRequestId: null,\n};\n\n/**\n * Drop-in Cavos provider. Wrap your app once; descendants call `useCavos()`.\n *\n * <CavosProvider config={{ network: 'sepolia', appSalt, paymasterApiKey }}\n * modal={{ appName: 'My App', theme: 'dark', emailMode: 'otp' }}>\n * <App />\n * </CavosProvider>\n *\n * Behind the scenes: login (social / email) resolves a stable identity, the kit\n * deploys a device-signer smart account gaslessly, and `execute()` submits\n * gasless multicalls signed silently by the browser's device key.\n */\nexport function CavosProvider({ config, modal, children }: CavosProviderProps) {\n const [auth] = useState(\n () => new CavosAuth({ appId: config.appId, backendUrl: config.authBackendUrl }),\n );\n const [cavos, setCavos] = useState<Cavos | null>(null);\n const [identity, setIdentity] = useState<Identity | null>(null);\n const [walletStatus, setWalletStatus] = useState<WalletStatus>(INITIAL_STATUS);\n const [isLoading, setIsLoading] = useState(false);\n const [authError, setAuthError] = useState<string | null>(null);\n const [modalOpen, setModalOpen] = useState(false);\n /** App name/logo fetched from the backend; overrides manual modal props when present. */\n const [branding, setBranding] = useState<{ appName?: string; appLogo?: string }>({});\n\n // Keep the latest config for callbacks that run after async gaps.\n const configRef = useRef(config);\n useEffect(() => {\n configRef.current = config;\n }, [config]);\n\n // Fetch app branding (name, logo) from the backend so the modal shows the\n // integrating app's identity without manual props.\n useEffect(() => {\n if (!config.appId || typeof window === 'undefined') return;\n const base = config.authBackendUrl ?? 'https://cavos.xyz';\n fetch(`${base}/api/oauth/firebase/app-branding?app_id=${encodeURIComponent(config.appId)}`)\n .then((r) => (r.ok ? r.json() : null))\n .then((d) => {\n if (d?.name) setBranding((b) => ({ ...b, appName: d.name }));\n if (d?.logo_url) setBranding((b) => ({ ...b, appLogo: d.logo_url }));\n })\n .catch(() => {});\n }, [config.appId, config.authBackendUrl]);\n\n const openModal = useCallback(() => setModalOpen(true), []);\n const closeModal = useCallback(() => setModalOpen(false), []);\n const clearAuthError = useCallback(() => setAuthError(null), []);\n\n // Re-request the device-approval email for the current pending request. The\n // backend dedups within its TTL; calling again re-sends the owner email so the\n // user can recover from a lost/spam-filtered message.\n const resendDeviceApproval = useCallback(async () => {\n if (!identity || !cavos || !cavos.pendingRequestId) return;\n const backendUrl = configRef.current.authBackendUrl ?? 'https://cavos.xyz';\n if (!configRef.current.appId) return;\n const recovery = new HttpRecoveryClient({ baseUrl: backendUrl, appId: configRef.current.appId });\n await recovery.requestDeviceAddition({\n userId: identity.userId,\n accountAddress: cavos.address,\n newSigner: cavos.publicKey,\n ...(identity.email ? { email: identity.email } : {}),\n });\n }, [identity, cavos]);\n\n // Bring the wallet online for an identity: Cavos.connect deploys if needed.\n const connect = useCallback(async (id: Identity): Promise<Cavos> => {\n setWalletStatus({ ...INITIAL_STATUS, isDeploying: true });\n const c = await Cavos.connect({\n network: configRef.current.network,\n identity: id,\n appSalt: configRef.current.appSalt,\n paymasterApiKey: configRef.current.paymasterApiKey,\n ...(configRef.current.appId ? { appId: configRef.current.appId } : {}),\n ...(configRef.current.authBackendUrl ? { backendUrl: configRef.current.authBackendUrl } : {}),\n ...(configRef.current.rpcUrl ? { rpcUrl: configRef.current.rpcUrl } : {}),\n });\n setCavos(c);\n setIdentity(id);\n setWalletStatus({\n isDeploying: false,\n isReady: c.status === 'ready',\n needsDeviceApproval: c.status === 'needs-device-approval',\n awaitingApproval: c.status === 'needs-device-approval' && !!c.pendingRequestId,\n pendingRequestId: c.pendingRequestId,\n });\n modal?.onSuccess?.(c.address);\n return c;\n }, [modal]);\n\n // On mount: if we're returning from OAuth (?auth_data=…), finish the login.\n // Open the modal immediately so the user sees the \"deploying\" state while the\n // wallet is being brought online — it flips to \"done\" once `isReady`.\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const params = new URLSearchParams(window.location.search);\n const authData = params.get('auth_data') || params.get('zk_auth_data');\n if (!authData) return;\n setModalOpen(true);\n setWalletStatus({ ...INITIAL_STATUS, isDeploying: true });\n let cancelled = false;\n (async () => {\n setIsLoading(true);\n try {\n await handleCallback(authData);\n if (!cancelled) window.history.replaceState({}, document.title, window.location.pathname);\n } catch (e) {\n console.error('[CavosProvider] OAuth callback error:', e);\n if (!cancelled) {\n // Surface the failure instead of closing the modal silently: the user\n // sees an actionable error with a retry, rather than the modal vanishing.\n const msg = e instanceof Error ? e.message : 'Sign-in failed. Please try again.';\n setAuthError(msg);\n setWalletStatus(INITIAL_STATUS);\n }\n } finally {\n if (!cancelled) setIsLoading(false);\n }\n })();\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleCallback = useCallback(async (authData: string) => {\n const id = await auth.handleCallback(authData);\n await connect(id);\n }, [auth, connect]);\n\n const login = useCallback(async (provider: 'google' | 'apple') => {\n if (typeof window === 'undefined') throw new Error('OAuth requires a browser');\n setAuthError(null);\n const url = await (provider === 'google'\n ? auth.getGoogleOAuthUrl(window.location.origin + window.location.pathname)\n : auth.getAppleOAuthUrl(window.location.origin + window.location.pathname));\n window.location.href = url;\n }, [auth]);\n\n const sendMagicLink = useCallback(async (email: string) => {\n await auth.sendMagicLink(email);\n }, [auth]);\n\n const sendOtp = useCallback(async (email: string) => {\n await auth.sendOtp(email);\n }, [auth]);\n\n const verifyOtp = useCallback(async (email: string, code: string) => {\n setAuthError(null);\n const id = await auth.verifyOtp(email, code);\n await connect(id);\n }, [auth, connect]);\n\n const execute = useCallback(async (calls: ChainCall[]) => {\n if (!cavos) throw new Error('Not logged in');\n return cavos.execute(calls);\n }, [cavos]);\n\n const addSigner = useCallback(\n async (pubkey: { x: bigint; y: bigint }) => {\n if (!cavos) throw new Error('Not logged in');\n return cavos.addSigner(pubkey);\n },\n [cavos],\n );\n\n // Generate a recovery code and register its derived backup signer on-chain.\n // The code is returned so the UI can display it once — the kit never persists\n // it and the backend never sees it.\n const setupRecovery = useCallback(async (): Promise<string> => {\n if (!cavos) throw new Error('Not logged in');\n const code = generateRecoveryCode();\n await cavos.setupRecovery(code);\n return code;\n }, [cavos]);\n\n // Recover access after losing every device. The caller passes the recovery\n // code; the backup key it derives authorises adding this new device. Brings\n // the provider straight to a ready state.\n const recover = useCallback(async (code: string) => {\n if (!identity) throw new Error('Sign in first so we know which account to recover.');\n setAuthError(null);\n setWalletStatus({ ...INITIAL_STATUS, isDeploying: true });\n try {\n const c = await Cavos.recover({\n code,\n identity,\n network: configRef.current.network,\n appSalt: configRef.current.appSalt,\n paymasterApiKey: configRef.current.paymasterApiKey,\n ...(configRef.current.appId ? { appId: configRef.current.appId } : {}),\n ...(configRef.current.authBackendUrl ? { backendUrl: configRef.current.authBackendUrl } : {}),\n ...(configRef.current.rpcUrl ? { rpcUrl: configRef.current.rpcUrl } : {}),\n });\n setCavos(c);\n setWalletStatus({ ...INITIAL_STATUS, isReady: true });\n modal?.onSuccess?.(c.address);\n } catch (e) {\n const msg = e instanceof Error ? e.message : 'Recovery failed. Check your code and try again.';\n setAuthError(msg);\n setWalletStatus(INITIAL_STATUS);\n throw e;\n }\n }, [identity, modal]);\n\n // Poll the pending device-addition request while this device is awaiting the\n // owner's approval. Once the owner approves (status === 'approved'), the new\n // signer is authorized on-chain, so reconnecting flips the device to \"ready\"\n // automatically — the requester no longer has to sign out and back in.\n useEffect(() => {\n if (!walletStatus.awaitingApproval || !walletStatus.pendingRequestId || !identity) return;\n if (!configRef.current.appId) return;\n const backendUrl = configRef.current.authBackendUrl ?? 'https://cavos.xyz';\n const recovery = new HttpRecoveryClient({ baseUrl: backendUrl, appId: configRef.current.appId });\n const requestId = walletStatus.pendingRequestId;\n let cancelled = false;\n const tick = async () => {\n try {\n const r = await recovery.getPendingRequest(requestId);\n if (cancelled || !r) return;\n if (r.status === 'expired') {\n // Surface expiry so the modal can offer \"request a new one\".\n setWalletStatus((s) => ({ ...s, pendingRequestId: null }));\n return;\n }\n if (r.status === 'approved') {\n // The owner added this device's signer on-chain — reconnect to flip\n // to \"ready\" without making the user log in again.\n await connect(identity);\n }\n } catch {\n /* transient network errors are fine; the next tick retries */\n }\n };\n const interval = setInterval(tick, 4000);\n return () => {\n cancelled = true;\n clearInterval(interval);\n };\n }, [walletStatus.awaitingApproval, walletStatus.pendingRequestId, identity, connect]);\n\n const logout = useCallback(() => {\n setCavos(null);\n setIdentity(null);\n setWalletStatus(INITIAL_STATUS);\n setAuthError(null);\n }, []);\n\n const value: CavosContextValue = {\n openModal,\n closeModal,\n isAuthenticated: !!cavos,\n user: identity\n ? { userId: identity.userId, email: identity.email, provider: identity.provider }\n : null,\n address: cavos?.address ?? null,\n walletStatus,\n isLoading,\n authError,\n clearAuthError,\n login,\n sendMagicLink,\n sendOtp,\n verifyOtp,\n handleCallback,\n execute,\n addSigner,\n resendDeviceApproval,\n setupRecovery,\n recover,\n logout,\n };\n\n return (\n <CavosContext.Provider value={value}>\n {children}\n {modal !== undefined && (\n <CavosAuthModal\n open={modalOpen}\n onClose={closeModal}\n appName={branding.appName ?? modal.appName}\n appLogo={branding.appLogo ?? modal.appLogo}\n providers={modal.providers}\n emailMode={modal.emailMode}\n primaryColor={modal.primaryColor}\n theme={modal.theme}\n />\n )}\n </CavosContext.Provider>\n );\n}\n\nexport function useCavos(): CavosContextValue {\n const ctx = useContext(CavosContext);\n if (!ctx) throw new Error('useCavos must be used within a CavosProvider');\n return ctx;\n}\n"]}
1
+ {"version":3,"sources":["../../src/crypto/encoding.ts","../../src/crypto/signature.ts","../../src/signer/WebCryptoSigner.ts","../../src/chains/starknet/constants.ts","../../src/chains/starknet/StarknetAdapter.ts","../../src/chains/starknet/StarknetDeviceSigner.ts","../../src/registry/WalletRegistry.ts","../../src/registry/HttpWalletRegistry.ts","../../src/identity.ts","../../src/chains/solana/constants.ts","../../src/chains/solana/SolanaAdapter.ts","../../src/chains/solana/SolanaRelayer.ts","../../src/recovery/BackupSigner.ts","../../src/chains/solana/CavosSolana.ts","../../src/recovery/HttpRecoveryClient.ts","../../src/Cavos.ts","../../src/auth/CavosAuth.ts","../../src/react/CavosAuthModal.tsx","../../src/react/CavosProvider.tsx"],"names":["p256","sha256","hash","num","Signer","PublicKey","TransactionInstruction","SystemProgram","SYSVAR_INSTRUCTIONS_PUBKEY","ix","tx","Transaction","randomBytes","pbkdf2","hkdf","Connection","isSigner","sendAndConfirmTransaction","toHex","fromHex","RpcProvider","PaymasterRpc","address","Account","defaultRegistry","account","jsxs","jsx","useState","useEffect","useRef","useCallback","e","Fragment","createContext","useContext"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Low-level encoding helpers shared across the kit.\n */\n\nconst U128_MASK = (1n << 128n) - 1n;\n\n/** Split a u256 into the `[low, high]` felt pair Cairo expects. */\nexport function u256ToFelts(value: bigint): [bigint, bigint] {\n return [value & U128_MASK, value >> 128n];\n}\n\n/** Big-endian bytes -> bigint. */\nexport function bytesToBigInt(bytes: Uint8Array): bigint {\n let out = 0n;\n for (const b of bytes) out = (out << 8n) | BigInt(b);\n return out;\n}\n\nexport function bytesToHex(bytes: Uint8Array): string {\n let s = \"0x\";\n for (const b of bytes) s += b.toString(16).padStart(2, \"0\");\n return s;\n}\n\nexport function hexToBytes(hex: string): Uint8Array {\n const clean = hex.startsWith(\"0x\") ? hex.slice(2) : hex;\n const padded = clean.length % 2 ? \"0\" + clean : clean;\n const out = new Uint8Array(padded.length / 2);\n for (let i = 0; i < out.length; i++) out[i] = parseInt(padded.slice(i * 2, i * 2 + 2), 16);\n return out;\n}\n\n/** A felt/bigint -> 32-byte big-endian Uint8Array (the tx-hash width). */\nexport function bigIntTo32Bytes(value: bigint): Uint8Array {\n const out = new Uint8Array(32);\n let v = value;\n for (let i = 31; i >= 0; i--) {\n out[i] = Number(v & 0xffn);\n v >>= 8n;\n }\n return out;\n}\n","/**\n * secp256r1 signature helpers for silent device signers.\n */\nimport { p256 } from \"@noble/curves/p256\";\nimport type { DevicePublicKey, DeviceSignature } from \"../signer/DeviceSigner\";\nimport { u256ToFelts } from \"./encoding\";\n\n/**\n * Serialize a device signature to the felt array for `tx_info.signature`:\n * [ r_low, r_high, s_low, s_high, y_parity ]\n * exactly what DeviceAccount.__validate__ decodes.\n */\nexport function signatureToFelts(sig: DeviceSignature): bigint[] {\n const [rLow, rHigh] = u256ToFelts(sig.r);\n const [sLow, sHigh] = u256ToFelts(sig.s);\n return [rLow, rHigh, sLow, sHigh, sig.yParity ? 1n : 0n];\n}\n\n/**\n * Recover the parity bit of an (r, s) signature over `digest` for a known\n * pubkey. WebCrypto/Secure Enclave don't return a recovery id, so we derive it\n * by trying both candidates and matching the device's public key.\n */\nexport function recoverYParity(\n r: bigint,\n s: bigint,\n digest: Uint8Array,\n pubkey: DevicePublicKey,\n): boolean {\n for (const bit of [0, 1] as const) {\n try {\n const candidate = new p256.Signature(r, s).addRecoveryBit(bit);\n const point = candidate.recoverPublicKey(digest).toAffine();\n if (point.x === pubkey.x && point.y === pubkey.y) {\n return bit === 1;\n }\n } catch {\n // try the other bit\n }\n }\n throw new Error(\"kit/signature: could not recover parity for the given pubkey\");\n}\n","import { sha256 } from \"@noble/hashes/sha256\";\nimport type { DeviceSigner, DevicePublicKey, DeviceSignature } from \"./DeviceSigner\";\nimport { bytesToBigInt } from \"../crypto/encoding\";\nimport { recoverYParity } from \"../crypto/signature\";\n\nconst IDB_NAME = \"cavos-kit\";\nconst IDB_STORE = \"device-keys\";\n\nexport interface WebCryptoSignerOptions {\n /**\n * Storage key for the device's private key (e.g. the account address). One\n * silent key per (this value, browser profile).\n */\n keyId: string;\n}\n\ninterface StoredKey {\n privateKey: CryptoKey; // non-extractable; structured-cloneable\n x: bigint;\n y: bigint;\n}\n\n/**\n * Silent, device-bound signer for the browser. Generates a non-extractable\n * secp256r1 (P-256) key via WebCrypto and stores the `CryptoKey` in IndexedDB.\n * The private key is never exposed to JS and signing produces NO UI — there is\n * no passkey, no Face ID / Touch ID prompt. To the user it is invisible; they\n * only ever see the OAuth / email login used to derive their address.\n */\nexport class WebCryptoSigner implements DeviceSigner {\n private constructor(\n private readonly privateKey: CryptoKey,\n private readonly publicKey: DevicePublicKey,\n readonly keyId: string,\n ) {}\n\n /** Create a fresh device key (first run on this device) and persist it. */\n static async create(opts: WebCryptoSignerOptions): Promise<WebCryptoSigner> {\n assertSecureContext();\n const pair = await crypto.subtle.generateKey(\n { name: \"ECDSA\", namedCurve: \"P-256\" },\n false, // private key is NON-extractable\n [\"sign\", \"verify\"],\n );\n const publicKey = await exportPublicKey(pair.publicKey);\n await idbPut(opts.keyId, { privateKey: pair.privateKey, x: publicKey.x, y: publicKey.y });\n return new WebCryptoSigner(pair.privateKey, publicKey, opts.keyId);\n }\n\n /** Load an existing device key from storage, or null if none exists yet. */\n static async load(opts: WebCryptoSignerOptions): Promise<WebCryptoSigner | null> {\n const rec = await idbGet(opts.keyId);\n if (!rec) return null;\n return new WebCryptoSigner(rec.privateKey, { x: rec.x, y: rec.y }, opts.keyId);\n }\n\n /** Load the device key, creating one on first use. */\n static async loadOrCreate(opts: WebCryptoSignerOptions): Promise<WebCryptoSigner> {\n return (await WebCryptoSigner.load(opts)) ?? (await WebCryptoSigner.create(opts));\n }\n\n async getPublicKey(): Promise<DevicePublicKey> {\n return this.publicKey;\n }\n\n async sign(txHash: Uint8Array): Promise<DeviceSignature> {\n // WebCrypto ECDSA hashes the message with SHA-256 internally, then signs.\n const raw = new Uint8Array(\n await crypto.subtle.sign(\n { name: \"ECDSA\", hash: \"SHA-256\" },\n this.privateKey,\n txHash as unknown as BufferSource,\n ),\n );\n // IEEE P1363 form: r || s, 32 bytes each.\n const r = bytesToBigInt(raw.subarray(0, 32));\n const s = bytesToBigInt(raw.subarray(32, 64));\n const digest = sha256(txHash);\n const yParity = recoverYParity(r, s, digest, this.publicKey);\n return { r, s, yParity };\n }\n}\n\nasync function exportPublicKey(publicKey: CryptoKey): Promise<DevicePublicKey> {\n const raw = new Uint8Array(await crypto.subtle.exportKey(\"raw\", publicKey)); // 0x04 || X || Y\n return { x: bytesToBigInt(raw.subarray(1, 33)), y: bytesToBigInt(raw.subarray(33, 65)) };\n}\n\n/**\n * WebCrypto (`crypto.subtle`) is only available in secure contexts — HTTPS, or\n * `http://localhost`. Accessing the dev server over a LAN IP (e.g.\n * http://192.168.1.24:3000) is NOT secure, so `crypto.subtle` is undefined and\n * device-key generation would crash with a cryptic \"undefined is not an object\".\n * Fail early with an actionable message instead.\n */\nfunction assertSecureContext(): void {\n const ok =\n typeof crypto !== \"undefined\" &&\n typeof crypto.subtle !== \"undefined\" &&\n (typeof window === \"undefined\" || window.isSecureContext);\n if (!ok) {\n throw new Error(\n \"Cavos: WebCrypto is unavailable. Device keys require a secure context — use HTTPS, or http://localhost. \" +\n \"(For LAN/mobile dev testing, run `next dev --experimental-https`.)\",\n );\n }\n}\n\n// --- minimal IndexedDB wrapper ---\n\nfunction openDb(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(IDB_NAME, 1);\n req.onupgradeneeded = () => req.result.createObjectStore(IDB_STORE);\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\n\nasync function idbPut(keyId: string, value: StoredKey): Promise<void> {\n const db = await openDb();\n await tx(db, \"readwrite\", (store) => store.put(value, keyId));\n db.close();\n}\n\nasync function idbGet(keyId: string): Promise<StoredKey | null> {\n const db = await openDb();\n const result = await tx(db, \"readonly\", (store) => store.get(keyId));\n db.close();\n return (result as StoredKey) ?? null;\n}\n\nfunction tx<T>(\n db: IDBDatabase,\n mode: IDBTransactionMode,\n run: (store: IDBObjectStore) => IDBRequest<T>,\n): Promise<T> {\n return new Promise((resolve, reject) => {\n const store = db.transaction(IDB_STORE, mode).objectStore(IDB_STORE);\n const req = run(store);\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\n","/** Starknet network presets and well-known addresses for the kit. */\n\nexport const STARKNET_NETWORKS = {\n sepolia: {\n chainId: \"0x534e5f5345504f4c4941\", // SN_SEPOLIA\n rpcUrl: \"https://api.cartridge.gg/x/starknet/sepolia\",\n },\n mainnet: {\n chainId: \"0x534e5f4d41494e\", // SN_MAIN\n rpcUrl: \"https://api.cartridge.gg/x/starknet/mainnet\",\n },\n} as const;\n\nexport type StarknetNetwork = keyof typeof STARKNET_NETWORKS;\n\n/** Universal Deployer Contract (same address on mainnet & sepolia). */\nexport const UDC_ADDRESS =\n \"0x041a78e741e5af2fec34b695679bc6891742439f7afb8484ecd7766661ad02bf\";\n\n/** Cavos-hosted SNIP-29 paymaster (same service @cavos/react uses). */\nexport const CAVOS_PAYMASTER_URL: Record<StarknetNetwork, string> = {\n sepolia: \"https://sepolia-paymaster.cavos.xyz\",\n mainnet: \"https://paymaster.cavos.xyz\",\n};\n\n/**\n * DeviceAccount class hash, per network. Populated from\n * `account-contracts/starknet/deployments/<network>.json` after declaring.\n *\n * Both networks were re-declared 2026-06-26 (code changed) to the same class\n * hash, so mainnet and sepolia run identical contract source.\n */\nexport const DEVICE_ACCOUNT_CLASS_HASH: Record<StarknetNetwork, string> = {\n sepolia: \"0x1840aded59e8a0d2b440a134cb9079a7fc11b06c77f58ed189ab436a034ca6a\",\n mainnet: \"0x1840aded59e8a0d2b440a134cb9079a7fc11b06c77f58ed189ab436a034ca6a\",\n};\n","import { hash, num } from \"starknet\";\nimport type { ChainAdapter, ChainCall, ComputeAddressParams } from \"../ChainAdapter\";\nimport type { DeviceSigner, DevicePublicKey } from \"../../signer/DeviceSigner\";\nimport { signatureToFelts } from \"../../crypto/signature\";\nimport { u256ToFelts, bigIntTo32Bytes } from \"../../crypto/encoding\";\nimport { UDC_ADDRESS } from \"./constants\";\n\nexport interface StarknetAdapterOptions {\n classHash: string;\n /** Read provider for `isAuthorizedSigner`. Optional for build-only usage. */\n provider?: { callContract(call: { contractAddress: string; entrypoint: string; calldata: string[] }): Promise<string[]> };\n /** Signer used to sign outgoing transactions. */\n signer?: DeviceSigner;\n}\n\n/** Starknet implementation of the device-signer account adapter. */\nexport class StarknetAdapter implements ChainAdapter {\n readonly chain = \"starknet\" as const;\n\n constructor(private readonly opts: StarknetAdapterOptions) {}\n\n computeAddress({ addressSeed, initialSigner, salt }: ComputeAddressParams): string {\n return hash.calculateContractAddressFromHash(\n num.toHex(salt ?? addressSeed),\n this.opts.classHash,\n this.constructorCalldata(addressSeed, initialSigner),\n 0, // deployerAddress 0 => deterministic counterfactual address\n );\n }\n\n /** Single UDC deploy; the constructor registers the first device signer, so\n * the account is ready the moment it is deployed (fits the paymaster's\n * deploy + execute_from_outside bundle). */\n buildDeploy(params: ComputeAddressParams): ChainCall[] {\n const salt = params.salt ?? params.addressSeed;\n const calldata = this.constructorCalldata(params.addressSeed, params.initialSigner);\n return [\n {\n contractAddress: UDC_ADDRESS,\n entrypoint: \"deployContract\",\n calldata: [\n this.opts.classHash,\n num.toHex(salt),\n \"0x0\", // unique = false -> deployer-independent address\n num.toHex(calldata.length),\n ...calldata,\n ],\n },\n ];\n }\n\n /** Constructor calldata: [address_seed, pub_x_low, pub_x_high, pub_y_low, pub_y_high]. */\n constructorCalldata(addressSeed: bigint, initialSigner: DevicePublicKey): string[] {\n return [num.toHex(addressSeed), ...pubkeyCalldata(initialSigner)];\n }\n\n buildAddSigner(accountAddress: string, signer: DevicePublicKey): ChainCall {\n return { contractAddress: accountAddress, entrypoint: \"add_signer\", calldata: pubkeyCalldata(signer) };\n }\n\n buildRemoveSigner(accountAddress: string, signer: DevicePublicKey): ChainCall {\n return { contractAddress: accountAddress, entrypoint: \"remove_signer\", calldata: pubkeyCalldata(signer) };\n }\n\n async isAuthorizedSigner(accountAddress: string, signer: DevicePublicKey): Promise<boolean> {\n if (!this.opts.provider) throw new Error(\"kit/starknet: provider required for reads\");\n const res = await this.opts.provider.callContract({\n contractAddress: accountAddress,\n entrypoint: \"is_authorized_signer\",\n calldata: pubkeyCalldata(signer),\n });\n return BigInt(res[0] ?? 0) !== 0n;\n }\n\n async buildSignature(txHash: bigint): Promise<string[]> {\n if (!this.opts.signer) throw new Error(\"kit/starknet: signer required to sign\");\n const sig = await this.opts.signer.sign(bigIntTo32Bytes(txHash));\n return signatureToFelts(sig).map((f) => num.toHex(f));\n }\n}\n\n/** Encode a P-256 pubkey as `[x_low, x_high, y_low, y_high]` (two u256s). */\nfunction pubkeyCalldata(pk: DevicePublicKey): string[] {\n const [xl, xh] = u256ToFelts(pk.x);\n const [yl, yh] = u256ToFelts(pk.y);\n return [num.toHex(xl), num.toHex(xh), num.toHex(yl), num.toHex(yh)];\n}\n","import { Signer, num, type ArraySignatureType } from \"starknet\";\nimport type { DeviceSigner } from \"../../signer/DeviceSigner\";\nimport { signatureToFelts } from \"../../crypto/signature\";\nimport { bigIntTo32Bytes } from \"../../crypto/encoding\";\n\n/**\n * A starknet.js `SignerInterface` backed by a device signer. Extends the base\n * `Signer` so all transaction/declare hash computation (v3) is reused; only the\n * raw hash-signing primitive is overridden to sign silently with the device key.\n *\n * Usage:\n * const account = new Account(provider, address, new StarknetDeviceSigner(device), \"1\");\n * await account.execute(calls); // DeviceAccount validates the device signature\n *\n * For gasless flows, hand this signer to your paymaster SDK (e.g. AVNU) the same\n * way you would any starknet.js signer.\n */\nexport class StarknetDeviceSigner extends Signer {\n constructor(private readonly device: DeviceSigner) {\n // Base `pk` is unused: device accounts have no single Stark private key.\n super(\"0x1\");\n }\n\n /** Device accounts are not controlled by a single Stark pubkey. */\n override async getPubKey(): Promise<string> {\n return \"0x0\";\n }\n\n /** Sign the computed tx hash silently with the device signer. */\n protected override async signRaw(msgHash: string): Promise<ArraySignatureType> {\n const sig = await this.device.sign(bigIntTo32Bytes(BigInt(msgHash)));\n return signatureToFelts(sig).map((f) => num.toHex(f));\n }\n}\n","import type { DevicePublicKey } from \"../signer/DeviceSigner\";\n\n/**\n * Off-chain map of `user_id -> wallet`. Because the account address is\n * `f(identity, first_device_pubkey)` (unforgeable, secure), it is NOT derivable\n * from the identity alone on a new device. The backend is the source of truth\n * for \"does this user already have a wallet?\" — enabling multi-device:\n *\n * - First device, unknown user -> deploy a new wallet, then `register`.\n * - Same user, new device -> `lookup` returns the existing wallet; the\n * new device is added as a signer (recovery\n * approval), NOT a new wallet.\n *\n * The backend implements this (it already manages the user<->address binding).\n */\nexport interface WalletRegistry {\n /** The user's existing wallet, or null if they don't have one yet. */\n lookup(userId: string): Promise<RegisteredWallet | null>;\n\n /** Record a freshly deployed wallet for the user (first device). */\n register(params: {\n userId: string;\n address: string;\n initialSigner: DevicePublicKey;\n }): Promise<void>;\n\n /** Note an additional device signer for the user's wallet (after approval). */\n addDevice?(params: {\n userId: string;\n address: string;\n signer: DevicePublicKey;\n }): Promise<void>;\n}\n\nexport interface RegisteredWallet {\n address: string;\n /** Public keys of the devices registered on this wallet (if tracked). */\n devices?: DevicePublicKey[];\n}\n\n/** Simple in-memory registry for demos / tests. */\nexport class InMemoryWalletRegistry implements WalletRegistry {\n private wallets = new Map<string, RegisteredWallet>();\n\n async lookup(userId: string): Promise<RegisteredWallet | null> {\n return this.wallets.get(userId) ?? null;\n }\n async register(params: { userId: string; address: string; initialSigner: DevicePublicKey }) {\n this.wallets.set(params.userId, { address: params.address, devices: [params.initialSigner] });\n }\n async addDevice(params: { userId: string; address: string; signer: DevicePublicKey }) {\n const w = this.wallets.get(params.userId);\n if (w) w.devices = [...(w.devices ?? []), params.signer];\n }\n}\n","import type { DevicePublicKey } from \"../signer/DeviceSigner\";\nimport type { WalletRegistry, RegisteredWallet } from \"./WalletRegistry\";\n\nexport interface HttpWalletRegistryOptions {\n /** Cavos backend base URL (e.g. https://cavos.xyz). */\n baseUrl: string;\n /** The Cavos App ID — authenticates the SDK calls (verifyAppId). */\n appId: string;\n /** Network the wallet lives on (e.g. \"sepolia\"). */\n network: string;\n}\n\n/** Serialize a bigint pubkey component for transport (hex string). */\nfunction toHex(n: bigint): string {\n return \"0x\" + n.toString(16);\n}\n\n/** Parse a hex/decimal string back to a bigint pubkey component. */\nfunction fromHex(s: string): bigint {\n return BigInt(s);\n}\n\n/**\n * WalletRegistry backed by the Cavos backend (`/api/wallets`). This is the\n * persistent, cross-device source of truth for `user_id -> wallet`. The backend\n * stores authorized device signers in `wallet_devices`; the registry maps a\n * backend `userId` (the OAuth `sub`) onto that wallet row.\n */\nexport class HttpWalletRegistry implements WalletRegistry {\n constructor(private readonly opts: HttpWalletRegistryOptions) {}\n\n async lookup(userId: string): Promise<RegisteredWallet | null> {\n const url = new URL(\"/api/wallets\", this.opts.baseUrl);\n url.searchParams.set(\"app_id\", this.opts.appId);\n url.searchParams.set(\"user_social_id\", userId);\n url.searchParams.set(\"network\", this.opts.network);\n\n const res = await fetch(url, { headers: { \"Content-Type\": \"application/json\" } });\n if (!res.ok) throw new Error(`registry lookup failed: ${res.status}`);\n const data = await res.json();\n if (!data.found || !data.address) return null;\n\n const devices: DevicePublicKey[] | undefined = Array.isArray(data.devices)\n ? data.devices.map((d: { pub_x: string; pub_y: string }) => ({\n x: fromHex(d.pub_x),\n y: fromHex(d.pub_y),\n }))\n : undefined;\n\n return { address: data.address, devices };\n }\n\n async register(params: {\n userId: string;\n address: string;\n initialSigner: DevicePublicKey;\n }): Promise<void> {\n const res = await fetch(new URL(\"/api/wallets\", this.opts.baseUrl), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n app_id: this.opts.appId,\n user_social_id: params.userId,\n network: this.opts.network,\n address: params.address,\n // Device-signer wallets send their initial signer (no encrypted blob).\n devices: [{ x: toHex(params.initialSigner.x), y: toHex(params.initialSigner.y) }],\n }),\n });\n if (!res.ok) {\n const t = await res.text().catch(() => \"\");\n throw new Error(`registry register failed: ${res.status} ${t}`);\n }\n }\n\n async addDevice?(params: {\n userId: string;\n address: string;\n signer: DevicePublicKey;\n }): Promise<void> {\n // The backend mirrors `wallet_devices` via the confirm endpoint after an\n // on-chain add_signer, so this is a no-op here (kept for interface parity).\n void params;\n }\n}\n","import { hash } from \"starknet\";\nimport { sha256 } from \"@noble/hashes/sha256\";\n\n/**\n * The address seed binds a wallet to a stable, backend-managed user identity.\n * The deterministic account address is derived from this seed + salt ONLY — never\n * from a device pubkey — so the same user resolves to the same wallet on any\n * device. The backend owns the user_id <-> address mapping off-chain.\n */\nexport interface IdentityInput {\n /** Stable, backend-managed user identifier (e.g. from email / magic link). */\n userId: string;\n /** Per-app salt, so the same user has distinct wallets across apps. */\n appSalt: string;\n}\n\n/** Derive the felt `address_seed` passed to the contract constructor. */\nexport function deriveAddressSeed({ userId, appSalt }: IdentityInput): bigint {\n // Poseidon over the identity components; stable and collision-resistant.\n const h = hash.computePoseidonHashOnElements([feltFromString(userId), feltFromString(appSalt)]);\n return BigInt(h);\n}\n\n/**\n * Solana variant: a 32-byte `address_seed` for the Cavos device-account PDA.\n * Uses the SAME identity input as Starknet (`userId + appSalt`) but hashes with\n * SHA-256 instead of Poseidon, since Solana has no native Poseidon and the PDA\n * seed is raw bytes. The same user therefore maps to a stable, app-scoped\n * address on each chain (different address spaces, one identity).\n */\nexport function deriveAddressSeedSolana({ userId, appSalt }: IdentityInput): Uint8Array {\n return sha256(new TextEncoder().encode(`cavos:solana:v1:${userId}:${appSalt}`));\n}\n\n/** Map an arbitrary UTF-8 string into a felt via Poseidon over its byte chunks. */\nfunction feltFromString(s: string): bigint {\n const bytes = new TextEncoder().encode(s);\n const chunks: bigint[] = [];\n for (let i = 0; i < bytes.length; i += 31) {\n let w = 0n;\n for (const b of bytes.subarray(i, i + 31)) w = (w << 8n) | BigInt(b);\n chunks.push(w);\n }\n if (chunks.length === 0) return 0n;\n if (chunks.length === 1) return chunks[0];\n return BigInt(hash.computePoseidonHashOnElements(chunks));\n}\n","/** Cavos device-account program + Solana primitives. */\n\n/** Deployed `cavos-device-account` program id (see account-contracts/solana). */\nexport const DEVICE_ACCOUNT_PROGRAM_ID =\n \"FHnoYNfYAmFrwt18gcBGG7G1S5q3RAbCBvrV2D29izNJ\";\n\n/** Native secp256r1 signature-verify precompile (SIMD-0075). */\nexport const SECP256R1_PROGRAM_ID =\n \"Secp256r1SigVerify1111111111111111111111111\";\n\n/** PDA seed prefix, must match the program's `ACCOUNT_SEED`. */\nexport const ACCOUNT_SEED = \"cavos-account\";\n\n/** Domain separators, must match the program's signed-message domains. */\nexport const DOMAIN_ADD = \"cavos:add_signer:v1\";\nexport const DOMAIN_REMOVE = \"cavos:remove_signer:v1\";\nexport const DOMAIN_TRANSFER = \"cavos:transfer:v1\";\n/** Arbitrary execution (CPI). The signed message commits to sha256 of the\n * canonical Borsh serialization of the instruction set — see `buildExecute`. */\nexport const DOMAIN_EXECUTE = \"cavos:execute:v1\";\n\n/** secp256r1 (P-256) curve order, for low-S normalization. */\nexport const SECP256R1_N =\n 0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551n;\n\nexport const SOLANA_NETWORKS = {\n \"solana-devnet\": \"https://api.devnet.solana.com\",\n \"solana-mainnet\": \"https://api.mainnet-beta.solana.com\",\n \"solana-localnet\": \"http://127.0.0.1:8899\",\n} as const;\n\nexport type SolanaNetwork = keyof typeof SOLANA_NETWORKS;\n","import {\n Connection,\n PublicKey,\n SystemProgram,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n TransactionInstruction,\n} from \"@solana/web3.js\";\nimport { sha256 } from \"@noble/hashes/sha256\";\nimport type { DeviceSigner, DevicePublicKey } from \"../../signer/DeviceSigner\";\nimport { bigIntTo32Bytes } from \"../../crypto/encoding\";\nimport {\n ACCOUNT_SEED,\n DEVICE_ACCOUNT_PROGRAM_ID,\n DOMAIN_ADD,\n DOMAIN_REMOVE,\n DOMAIN_TRANSFER,\n DOMAIN_EXECUTE,\n SECP256R1_N,\n SECP256R1_PROGRAM_ID,\n} from \"./constants\";\n\nconst COMPRESSED_PUBKEY_SIZE = 33;\nconst SIGNATURE_SIZE = 64;\nconst CURRENT_IX = 0xffff;\n\n/** An account meta candidate for a CPI instruction inside `execute`. Mirrors the\n * on-chain `AccountMetaCandidate` (Borsh). */\nexport interface InstructionAccount {\n pubkey: string;\n isSigner: boolean;\n isWritable: boolean;\n}\n\n/** A CPI instruction the device key authorizes via `execute`. Mirrors the\n * on-chain `InstructionData` (Borsh). Serialized canonically and hashed before\n * signing, so a signature binds exactly this instruction set. */\nexport interface InstructionData {\n programId: string;\n accounts: InstructionAccount[];\n data: Uint8Array;\n}\n\nexport interface SolanaAdapterOptions {\n /** Cavos device-account program id (defaults to the deployed one). */\n programId?: string;\n /** RPC connection for reads (`isAuthorizedSigner`) and nonce fetch. */\n connection?: Connection;\n /** Device signer used to authorize guarded actions. */\n signer?: DeviceSigner;\n}\n\n/**\n * Solana adapter for the Cavos device-signer account. Unlike Starknet (where the\n * account contract verifies the P-256 signature in `__validate__`), Solana\n * verifies it natively via the secp256r1 precompile, so every guarded action is\n * a two-instruction bundle: `[secp256r1 precompile ix, program ix]`. This adapter\n * derives the account PDA, builds those bundles, and reuses the same\n * `DeviceSigner` (P-256 / WebCrypto) as every other chain.\n */\nexport class SolanaAdapter {\n readonly chain = \"solana\" as const;\n readonly programId: PublicKey;\n\n constructor(private readonly opts: SolanaAdapterOptions = {}) {\n this.programId = new PublicKey(opts.programId ?? DEVICE_ACCOUNT_PROGRAM_ID);\n }\n\n /** Deterministic account address: PDA of [seed, address_seed, initial_signer_x]. */\n computeAddress(addressSeed: Uint8Array, initialSigner: DevicePublicKey): string {\n return this.pda(addressSeed, compressedPubkey(initialSigner)).toBase58();\n }\n\n private pda(addressSeed: Uint8Array, initialCompressed: Uint8Array): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from(ACCOUNT_SEED),\n Buffer.from(addressSeed),\n Buffer.from(initialCompressed.slice(1, 33)), // x-coordinate\n ],\n this.programId\n );\n return pda;\n }\n\n /** `initialize` instruction creating the account with its first device signer. */\n buildInitialize(\n addressSeed: Uint8Array,\n payer: string,\n initialSigner: DevicePublicKey\n ): TransactionInstruction {\n const initialCompressed = compressedPubkey(initialSigner);\n const account = this.pda(addressSeed, initialCompressed);\n const data = Buffer.concat([\n anchorDiscriminator(\"initialize\"),\n Buffer.from(addressSeed), // [u8;32]\n Buffer.from(initialCompressed), // [u8;33]\n ]);\n return new TransactionInstruction({\n programId: this.programId,\n keys: [\n { pubkey: account, isSigner: false, isWritable: true },\n { pubkey: new PublicKey(payer), isSigner: true, isWritable: true },\n { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n ],\n data,\n });\n }\n\n /** `[precompile, add_signer]` bundle, authorized by an existing device signer. */\n async buildAddSigner(\n account: string,\n newSigner: DevicePublicKey\n ): Promise<TransactionInstruction[]> {\n const accountPk = new PublicKey(account);\n const newCompressed = compressedPubkey(newSigner);\n const nonce = await this.fetchNonce(accountPk);\n const message = concatBytes(\n Buffer.from(DOMAIN_ADD),\n accountPk.toBuffer(),\n newCompressed,\n u64le(nonce)\n );\n const { precompileIx } = await this.signToPrecompile(message);\n const ix = new TransactionInstruction({\n programId: this.programId,\n keys: this.guardedKeys(accountPk),\n data: Buffer.concat([anchorDiscriminator(\"add_signer\"), Buffer.from(newCompressed)]),\n });\n return [precompileIx, ix];\n }\n\n /** `[precompile, remove_signer]` bundle, authorized by an existing device signer. */\n async buildRemoveSigner(\n account: string,\n signer: DevicePublicKey\n ): Promise<TransactionInstruction[]> {\n const accountPk = new PublicKey(account);\n const compressed = compressedPubkey(signer);\n const nonce = await this.fetchNonce(accountPk);\n const message = concatBytes(\n Buffer.from(DOMAIN_REMOVE),\n accountPk.toBuffer(),\n compressed,\n u64le(nonce)\n );\n const { precompileIx } = await this.signToPrecompile(message);\n const ix = new TransactionInstruction({\n programId: this.programId,\n keys: this.guardedKeys(accountPk),\n data: Buffer.concat([anchorDiscriminator(\"remove_signer\"), Buffer.from(compressed)]),\n });\n return [precompileIx, ix];\n }\n\n /** `[precompile, execute_transfer]` bundle moving lamports out of the account. */\n async buildExecuteTransfer(\n account: string,\n destination: string,\n amount: bigint\n ): Promise<TransactionInstruction[]> {\n const accountPk = new PublicKey(account);\n const destPk = new PublicKey(destination);\n const nonce = await this.fetchNonce(accountPk);\n const message = concatBytes(\n Buffer.from(DOMAIN_TRANSFER),\n accountPk.toBuffer(),\n destPk.toBuffer(),\n u64le(amount),\n u64le(nonce)\n );\n const { precompileIx } = await this.signToPrecompile(message);\n const ix = new TransactionInstruction({\n programId: this.programId,\n keys: [\n { pubkey: accountPk, isSigner: false, isWritable: true },\n { pubkey: destPk, isSigner: false, isWritable: true },\n { pubkey: SYSVAR_INSTRUCTIONS_PUBKEY, isSigner: false, isWritable: false },\n ],\n data: Buffer.concat([anchorDiscriminator(\"execute_transfer\"), u64le(amount)]),\n });\n return [precompileIx, ix];\n }\n\n /**\n * `[precompile, execute]` bundle running arbitrary CPI instructions with the\n * account PDA as signer. The device key signs over\n * `DOMAIN_EXECUTE || account || sha256(canonical(instructions)) || nonce`, so\n * the signature commits to the EXACT instruction set the program will invoke —\n * no account/data substitution is possible after signing.\n *\n * The instructions' accounts are passed to the program via `remaining_accounts`\n * (flattened, in order); the program enforces an exact, ordered mapping.\n */\n async buildExecute(\n account: string,\n instructions: InstructionData[]\n ): Promise<TransactionInstruction[]> {\n if (instructions.length === 0) throw new Error(\"kit/solana: execute requires at least one instruction\");\n\n const accountPk = new PublicKey(account);\n const nonce = await this.fetchNonce(accountPk);\n\n // Canonical Borsh serialization MUST match the on-chain\n // `hash_instructions` (sha256 over the concatenated `InstructionData`).\n const blob = serializeInstructions(instructions);\n const ixsHash = sha256(blob);\n\n const message = concatBytes(\n Buffer.from(DOMAIN_EXECUTE),\n accountPk.toBuffer(),\n Buffer.from(ixsHash),\n u64le(nonce)\n );\n const { precompileIx } = await this.signToPrecompile(message);\n\n // The program ix carries the instructions in its data; the accounts they\n // reference are flattened into `remaining_accounts` in order. The wire format\n // is discriminator + Borsh Vec<u8>(blob) = discriminator + u32_len + blob.\n // The signed hash (above) is over the inner `blob` only — no length prefix —\n // matching the program's parse and the relay's allowlist parser.\n const blobLen = Buffer.alloc(4);\n new DataView(blobLen.buffer).setUint32(0, blob.length, true);\n const data = Buffer.concat([anchorDiscriminator(\"execute\"), blobLen, blob]);\n const remainingAccounts: Array<{ pubkey: PublicKey; isSigner: false; isWritable: boolean }> = [];\n for (const ix of instructions) {\n for (const acc of ix.accounts) {\n remainingAccounts.push({\n pubkey: new PublicKey(acc.pubkey),\n isSigner: false, // signer flags are part of the signed InstructionData\n isWritable: acc.isWritable,\n });\n }\n // The CPI target program must be a remaining_account too — invoke_signed\n // needs it loaded. Appended (not part of the signed account list).\n remainingAccounts.push({\n pubkey: new PublicKey(ix.programId),\n isSigner: false,\n isWritable: false,\n });\n }\n const ix = new TransactionInstruction({\n programId: this.programId,\n keys: [\n { pubkey: accountPk, isSigner: false, isWritable: true },\n { pubkey: SYSVAR_INSTRUCTIONS_PUBKEY, isSigner: false, isWritable: false },\n ...remainingAccounts,\n ],\n data,\n });\n return [precompileIx, ix];\n }\n\n /** Read whether `signer` is currently an authorized signer of `account`. */\n async isAuthorizedSigner(account: string, signer: DevicePublicKey): Promise<boolean> {\n const signers = await this.fetchSigners(new PublicKey(account));\n const target = Buffer.from(compressedPubkey(signer)).toString(\"hex\");\n return signers.some((s) => Buffer.from(s).toString(\"hex\") === target);\n }\n\n private guardedKeys(account: PublicKey) {\n return [\n { pubkey: account, isSigner: false, isWritable: true },\n { pubkey: SYSVAR_INSTRUCTIONS_PUBKEY, isSigner: false, isWritable: false },\n ];\n }\n\n /** Sign `message` with the device key and build the matching precompile ix. */\n private async signToPrecompile(\n message: Uint8Array\n ): Promise<{ precompileIx: TransactionInstruction }> {\n if (!this.opts.signer) throw new Error(\"kit/solana: signer required to authorize\");\n const pubkey = await this.opts.signer.getPublicKey();\n // The signer signs sha256(message); the precompile recomputes sha256(message).\n const sig = await this.opts.signer.sign(message as Uint8Array);\n const signature = encodeLowSSignature(sig.r, sig.s);\n const precompileIx = buildSecp256r1Instruction(\n compressedPubkey(pubkey),\n signature,\n message\n );\n return { precompileIx };\n }\n\n private async fetchNonce(account: PublicKey): Promise<bigint> {\n const info = await this.requireConnection().getAccountInfo(account);\n if (!info) return 0n;\n // layout: 8 disc + 32 address_seed + 1 bump + 8 nonce(LE) + 33 initial_signer + ...\n // nonce is right after bump, so its offset is unaffected by initial_signer.\n return readU64le(info.data, 41);\n }\n\n private async fetchSigners(account: PublicKey): Promise<Uint8Array[]> {\n const info = await this.requireConnection().getAccountInfo(account);\n if (!info) return [];\n const d = info.data;\n // layout: 8 disc + 32 address_seed + 1 bump + 8 nonce + 33 initial_signer + 4 vec_len + signers\n const lenOffset = 8 + 32 + 1 + 8 + COMPRESSED_PUBKEY_SIZE; // = 82\n const count = d.readUInt32LE(lenOffset);\n const out: Uint8Array[] = [];\n let off = lenOffset + 4;\n for (let i = 0; i < count; i++) {\n out.push(Uint8Array.from(d.subarray(off, off + COMPRESSED_PUBKEY_SIZE)));\n off += COMPRESSED_PUBKEY_SIZE;\n }\n return out;\n }\n\n private requireConnection(): Connection {\n if (!this.opts.connection) throw new Error(\"kit/solana: connection required for reads\");\n return this.opts.connection;\n }\n}\n\n/** Compressed SEC1 P-256 pubkey (33 bytes) from {x, y}. */\nexport function compressedPubkey(pk: DevicePublicKey): Uint8Array {\n const out = new Uint8Array(COMPRESSED_PUBKEY_SIZE);\n out[0] = pk.y % 2n === 0n ? 0x02 : 0x03;\n out.set(bigIntTo32Bytes(pk.x), 1);\n return out;\n}\n\n/** Encode (r, s) as raw 64-byte r‖s, normalized to low-S (precompile requires it). */\nexport function encodeLowSSignature(r: bigint, s: bigint): Uint8Array {\n const lowS = s > SECP256R1_N / 2n ? SECP256R1_N - s : s;\n const out = new Uint8Array(SIGNATURE_SIZE);\n out.set(bigIntTo32Bytes(r), 0);\n out.set(bigIntTo32Bytes(lowS), 32);\n return out;\n}\n\n/** Build the native secp256r1 precompile instruction (single self-contained sig). */\nexport function buildSecp256r1Instruction(\n compressed: Uint8Array,\n signature: Uint8Array,\n message: Uint8Array\n): TransactionInstruction {\n const headerLen = 2;\n const offsetsLen = 14;\n const pubkeyOffset = headerLen + offsetsLen;\n const sigOffset = pubkeyOffset + COMPRESSED_PUBKEY_SIZE;\n const msgOffset = sigOffset + SIGNATURE_SIZE;\n const data = Buffer.alloc(msgOffset + message.length);\n\n data.writeUInt8(1, 0);\n data.writeUInt8(0, 1);\n let o = headerLen;\n data.writeUInt16LE(sigOffset, o); o += 2;\n data.writeUInt16LE(CURRENT_IX, o); o += 2;\n data.writeUInt16LE(pubkeyOffset, o); o += 2;\n data.writeUInt16LE(CURRENT_IX, o); o += 2;\n data.writeUInt16LE(msgOffset, o); o += 2;\n data.writeUInt16LE(message.length, o); o += 2;\n data.writeUInt16LE(CURRENT_IX, o); o += 2;\n Buffer.from(compressed).copy(data, pubkeyOffset);\n Buffer.from(signature).copy(data, sigOffset);\n Buffer.from(message).copy(data, msgOffset);\n\n return new TransactionInstruction({\n keys: [],\n programId: new PublicKey(SECP256R1_PROGRAM_ID),\n data,\n });\n}\n\n/** Anchor instruction discriminator = sha256(\"global:<name>\")[..8]. */\nexport function anchorDiscriminator(name: string): Buffer {\n return Buffer.from(sha256(`global:${name}`).slice(0, 8));\n}\n\nfunction u64le(n: bigint | number): Buffer {\n const b = Buffer.alloc(8);\n // Avoid Buffer.writeBigUInt64LE: the browser `buffer` polyfill doesn't\n // implement the BigInt methods. Use DataView instead.\n new DataView(b.buffer, b.byteOffset, 8).setBigUint64(0, BigInt(n), true);\n return b;\n}\n\nfunction readU64le(buf: Buffer, offset: number): bigint {\n return new DataView(buf.buffer, buf.byteOffset, buf.length).getBigUint64(\n offset,\n true,\n );\n}\n\nfunction concatBytes(...parts: Uint8Array[]): Uint8Array {\n const total = parts.reduce((n, p) => n + p.length, 0);\n const out = new Uint8Array(total);\n let off = 0;\n for (const p of parts) {\n out.set(p, off);\n off += p.length;\n }\n return out;\n}\n\n// ─── Canonical Borsh serialization for `execute` ────────────────────────────\n// MUST match the on-chain `InstructionData`/`AccountMetaCandidate` AnchorSer\n// layout byte-for-byte: `hash_instructions` hashes this and the program\n// requires the precompile-verified message to commit to the same hash. Changing\n// the byte layout here breaks signature binding (and recovery of past sigs).\n\n/** Serialize a single `InstructionData` exactly as Anchor's Borsh derive would. */\nfunction serializeInstruction(ix: InstructionData): Buffer {\n const programId = new PublicKey(ix.programId).toBuffer(); // 32 bytes\n const accounts = serializeAccounts(ix.accounts);\n const data = serializeVecU8(ix.data);\n return Buffer.concat([programId, accounts, data]);\n}\n\nfunction serializeAccounts(metas: InstructionAccount[]): Buffer {\n const len = Buffer.alloc(4);\n new DataView(len.buffer).setUint32(0, metas.length, true);\n const parts = metas.map(serializeAccountMeta);\n return Buffer.concat([len, ...parts]);\n}\n\nfunction serializeAccountMeta(meta: InstructionAccount): Buffer {\n const pubkey = new PublicKey(meta.pubkey).toBuffer(); // 32 bytes\n return Buffer.concat([pubkey, Buffer.from([meta.isSigner ? 1 : 0, meta.isWritable ? 1 : 0])]);\n}\n\nfunction serializeVecU8(data: Uint8Array): Buffer {\n const len = Buffer.alloc(4);\n new DataView(len.buffer).setUint32(0, data.length, true);\n return Buffer.concat([len, Buffer.from(data)]);\n}\n\n/** Serialize the full instruction set — the bytes `hash_instructions` hashes. */\nexport function serializeInstructions(instructions: InstructionData[]): Buffer {\n return Buffer.concat(instructions.map(serializeInstruction));\n}\n","import {\n Connection,\n PublicKey,\n Transaction,\n type TransactionInstruction,\n} from \"@solana/web3.js\";\nimport type { SolanaNetwork } from \"./constants\";\n\nexport interface SolanaRelayerOptions {\n /** Base URL of the Cavos backend exposing /api/solana/relay. */\n baseUrl: string;\n /** Cavos App ID (authorizes the sponsored request). */\n appId: string;\n network: SolanaNetwork;\n /** Connection used only to fetch a recent blockhash before serializing. */\n connection: Connection;\n}\n\n/**\n * Client for the Cavos Solana sponsoring relayer. Lets the SDK submit\n * device-account transactions WITHOUT the integrator holding a fee-payer\n * keypair: the relayer co-signs as fee payer and pays the fee/rent. The relayer\n * only pays — the device signature inside the instructions (verified by the\n * secp256r1 precompile) is what authorizes the action, and it does not bind the\n * fee payer, so sponsorship needs no re-signing.\n */\nexport class SolanaRelayer {\n private feePayer?: PublicKey;\n\n constructor(private readonly opts: SolanaRelayerOptions) {}\n\n /** The relayer's fee-payer pubkey (fetched + cached from the backend). */\n async getFeePayer(): Promise<PublicKey> {\n if (this.feePayer) return this.feePayer;\n const res = await fetch(`${this.opts.baseUrl}/api/solana/relay?network=${this.opts.network}`);\n if (!res.ok) throw new Error(`kit/solana: relayer fee-payer lookup failed (${res.status})`);\n const { fee_payer } = (await res.json()) as { fee_payer: string };\n this.feePayer = new PublicKey(fee_payer);\n return this.feePayer;\n }\n\n /**\n * Build a tx with the relayer as fee payer, serialize it unsigned, and POST it\n * to the relayer to co-sign + submit. Returns the confirmed signature.\n */\n async send(instructions: TransactionInstruction[]): Promise<string> {\n const feePayer = await this.getFeePayer();\n const { blockhash } = await this.opts.connection.getLatestBlockhash(\"confirmed\");\n const tx = new Transaction();\n tx.feePayer = feePayer;\n tx.recentBlockhash = blockhash;\n tx.add(...instructions);\n\n const serialized = tx\n .serialize({ requireAllSignatures: false, verifySignatures: false })\n .toString(\"base64\");\n\n const res = await fetch(`${this.opts.baseUrl}/api/solana/relay`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n app_id: this.opts.appId,\n network: this.opts.network,\n transaction: serialized,\n }),\n });\n if (!res.ok) {\n const detail = await res.text().catch(() => \"\");\n throw new Error(`kit/solana: relay failed (${res.status}) ${detail}`);\n }\n const { signature } = (await res.json()) as { signature: string };\n return signature;\n }\n}\n","import { p256 } from \"@noble/curves/p256\";\nimport { hkdf } from \"@noble/hashes/hkdf\";\nimport { pbkdf2 } from \"@noble/hashes/pbkdf2\";\nimport { sha256 } from \"@noble/hashes/sha256\";\nimport { randomBytes } from \"@noble/hashes/utils\";\nimport type { DeviceSigner, DevicePublicKey, DeviceSignature } from \"../signer/DeviceSigner\";\nimport { bytesToBigInt, bigIntTo32Bytes } from \"../crypto/encoding\";\nimport { recoverYParity } from \"../crypto/signature\";\n\n/**\n * Self-custodial account recovery via a backup signer derived from a code.\n *\n * The user generates a human-readable recovery code once (see\n * `generateRecoveryCode`). That code is stretched with PBKDF2 + HKDF into a\n * deterministic secp256r1 private key — the SAME key on every device that\n * enters the SAME code. The code never leaves the device: the backend and the\n * chain only ever see the derived public key, which is registered on-chain as\n * an ordinary signer via `add_signer`. Recovering access after losing every\n * device is therefore: enter the code → re-derive the backup key → sign an\n * `add_signer` for the new device. No guardian, no timelock, no custodial key.\n *\n * This module is intentionally chain-agnostic and free of WebCrypto/DOM calls:\n * the derivation is pure `@noble/*` math, so the identical code runs in the\n * browser, React Native, and (eventually) Solana / Stellar / EVM adapters.\n */\n\n/** Fixed domain-separation salt for `deriveBackupKey`. Bumped only to re-derive\n * a new key space (e.g. changing the KDF parameters). Never per-user. */\nconst BACKUP_KDF_SALT = \"cavos-recovery-v1\";\n/** PBKDF2 iteration count. High enough to make brute-forcing a strong code\n * infeasible, low enough that derivation stays well under a second. */\nconst BACKUP_PBKDF2_ITERATIONS = 210_000;\n/** HKDF info string, scopes the derived material to \"backup-signer\". */\nconst BACKUP_HKDF_INFO = \"cavos-backup-signer\";\n\n/** How many words make up a recovery code. 16 words @ 8 bits/word = 128 bits. */\nconst CODE_WORDS = 16;\n\n/**\n * Generate a fresh, human-readable recovery code. The caller MUST present this\n * to the user exactly once and never persist it server-side. ~128 bits of\n * entropy encoded as words from a fixed wordlist (BIP39-style but our own list,\n * so we don't pull a dependency on a BIP39 wordfile).\n */\nexport function generateRecoveryCode(): string {\n const bytes = randomBytes(CODE_WORDS);\n const words: string[] = [];\n for (const b of bytes) words.push(WORDLIST[b]);\n return words.join(\" \");\n}\n\n/**\n * Deterministically derive a secp256r1 keypair from a recovery code. Pure\n * function: the same normalised code always yields the same keypair, on any\n * runtime. Returns the raw 32-byte private key (so it can be wrapped in a\n * `BackupSigner` or fed to any chain adapter) plus the public key coordinates\n * the contract stores as an authorised signer.\n *\n * Normalisation trims surrounding whitespace and collapses runs of spaces, so\n * \"a b\" and \"a b\" derive the same key regardless of how the code was pasted.\n */\nexport function deriveBackupKey(code: string): {\n privateKey: Uint8Array;\n publicKey: DevicePublicKey;\n} {\n const normalised = code.trim().replace(/\\s+/g, \" \").toLowerCase();\n if (!normalised) throw new Error(\"kit: recovery code is empty\");\n\n // Stretch the low-entropy-ish human code into 32 bytes with PBKDF2, then mix\n // into a scoped seed with HKDF. PBKDF2 also serves as the brute-force brake.\n const stretched = pbkdf2(\n sha256,\n new TextEncoder().encode(normalised),\n new TextEncoder().encode(BACKUP_KDF_SALT),\n { c: BACKUP_PBKDF2_ITERATIONS, dkLen: 32 },\n );\n const seed = hkdf(sha256, stretched, undefined, BACKUP_HKDF_INFO, 32);\n\n // Reduce the seed to a valid secp256r1 scalar. The seed is 32 bytes (< n with\n // overwhelming probability); reducing mod n keeps it a valid private key\n // without bias that matters in practice for an HMAC-stretched 256-bit input.\n const d = bytesToBigInt(seed) % p256.CURVE.n;\n if (d === 0n) throw new Error(\"kit: derived backup key is zero (retry with a new code)\");\n\n const priv = bigIntTo32Bytes(d);\n // isCompressed = false → uncompressed point (0x04 || X || Y, 65 bytes), so the\n // X/Y split below is correct. The default would return a 33-byte compressed\n // point and the Y half would be empty.\n const pub = p256.getPublicKey(priv, false);\n return {\n privateKey: priv,\n publicKey: { x: bytesToBigInt(pub.subarray(1, 33)), y: bytesToBigInt(pub.subarray(33, 65)) },\n };\n}\n\n/**\n * A `DeviceSigner` backed by an in-memory backup key derived from a recovery\n * code. Used transiently during recovery to sign the `add_signer` that\n * authorises a new device — it is NOT persisted and should not be reused as a\n * device signer. The key material lives only for the duration of the recovery\n * transaction.\n */\nexport class BackupSigner implements DeviceSigner {\n private readonly privateKey: Uint8Array;\n private readonly publicKeyValue: DevicePublicKey;\n\n constructor(privateKey: Uint8Array, publicKey: DevicePublicKey) {\n this.privateKey = privateKey;\n this.publicKeyValue = publicKey;\n }\n\n /** Build a signer from a recovery code (derive + wrap in one step). */\n static fromCode(code: string): BackupSigner {\n const { privateKey, publicKey } = deriveBackupKey(code);\n return new BackupSigner(privateKey, publicKey);\n }\n\n async getPublicKey(): Promise<DevicePublicKey> {\n return this.publicKeyValue;\n }\n\n async sign(txHash: Uint8Array): Promise<DeviceSignature> {\n // Mirror the WebCrypto path exactly: WebCrypto's `subtle.sign({ hash:\n // 'SHA-256' }, key, txHash)` hashes `txHash` with SHA-256 and signs the\n // digest. `p256.sign(msgHash)` signs the bytes it's given WITHOUT hashing,\n // so we pre-hash here to produce the same (r, s) the contract verifies.\n const digest = sha256(txHash);\n const sig = p256.sign(digest, this.privateKey);\n const yParity = recoverYParity(sig.r, sig.s, digest, this.publicKeyValue);\n return { r: sig.r, s: sig.s, yParity };\n }\n}\n\n// 256 short, unambiguous, lowercase English words. Chosen to be hard to\n// misread and easy to type; not the full BIP39 list (we don't need 2048 — 8\n// bits/word is plenty at 16 words). Keep this list stable: changing it changes\n// the meaning of every existing recovery code. Must stay exactly 256 unique\n// entries so each byte value maps to one word.\nconst WORDLIST = [\n \"able\", \"acid\", \"amber\", \"apple\", \"arch\", \"arrow\", \"ashen\", \"atlas\",\n \"axis\", \"badge\", \"baker\", \"balm\", \"banner\", \"basin\", \"beacon\", \"bench\",\n \"beryl\", \"birch\", \"blade\", \"bloom\", \"bluer\", \"border\", \"brave\", \"brick\",\n \"brook\", \"cabin\", \"candle\", \"carbon\", \"cargo\", \"cedar\", \"chalk\", \"charm\",\n \"chrome\", \"cipher\", \"clam\", \"clasp\", \"cliff\", \"clock\", \"cobia\", \"comet\",\n \"coral\", \"cotton\", \"coves\", \"crane\", \"crest\", \"crow\", \"crystal\", \"curio\",\n \"dawn\", \"delta\", \"denim\", \"depth\", \"dewy\", \"digger\", \"docks\", \"dover\",\n \"drift\", \"dunes\", \"eagle\", \"ember\", \"echo\", \"eden\", \"elite\", \"ethic\",\n \"fable\", \"falcon\", \"fawn\", \"feather\", \"fern\", \"fjord\", \"flame\", \"flint\",\n \"forest\", \"forge\", \"frost\", \"garnet\", \"gemini\", \"glade\", \"glider\", \"glow\",\n \"granite\", \"grove\", \"guppy\", \"harbor\", \"haven\", \"hazel\", \"helio\", \"heron\",\n \"hickory\", \"honey\", \"horizon\", \"ivory\", \"jade\", \"jasper\", \"kestrel\", \"knot\",\n \"lagoon\", \"lattice\", \"laurel\", \"lavender\", \"lemon\", \"linden\", \"loon\", \"luger\",\n \"lumen\", \"lunar\", \"mango\", \"maple\", \"marble\", \"marsh\", \"meadow\", \"mercy\",\n \"mistle\", \"monsoon\", \"morning\", \"moss\", \"nacre\", \"nectar\", \"needle\", \"nimbus\",\n \"nova\", \"ocean\", \"onyx\", \"orbit\", \"otter\", \"palm\", \"panda\", \"pansy\",\n \"papaya\", \"passage\", \"pebble\", \"pelican\", \"pepper\", \"petal\", \"piano\", \"pierce\",\n \"pilot\", \"pioneer\", \"platinum\", \"plume\", \"poplar\", \"porpoise\", \"prairie\", \"prism\",\n \"pulsar\", \"quartz\", \"quasar\", \"quill\", \"quiver\", \"raven\", \"reef\", \"relic\",\n \"ridge\", \"ripple\", \"robin\", \"rocket\", \"rouge\", \"ruby\", \"saffron\", \"sage\",\n \"sail\", \"salmon\", \"sapphire\", \"scarab\", \"shadow\", \"shale\", \"sienna\", \"silica\",\n \"silver\", \"skyline\", \"slate\", \"sonar\", \"spruce\", \"starling\", \"stone\", \"sugar\",\n \"summit\", \"sunset\", \"swan\", \"tangent\", \"tarragon\", \"temple\", \"thistle\", \"thrush\",\n \"tiger\", \"topaz\", \"tundra\", \"turtle\", \"umber\", \"union\", \"valley\", \"vapor\",\n \"vector\", \"velvet\", \"violet\", \"vortex\", \"walnut\", \"whale\", \"winter\", \"wisp\",\n \"wisteria\", \"xenon\", \"yarrow\", \"zephyr\", \"zinc\", \"zodiac\", \"anchor\", \"basil\",\n \"cider\", \"daisy\", \"elfin\", \"ferry\", \"gimlet\", \"halcyon\", \"indigo\", \"juniper\",\n \"kindle\", \"lilac\", \"mantis\", \"nylon\", \"oracle\", \"parch\", \"quokka\", \"ramble\",\n \"thatch\", \"ultra\", \"vivid\", \"xylo\", \"yodel\", \"zesty\", \"arbor\", \"bliss\",\n \"calyx\", \"dwindle\", \"folio\", \"globe\", \"hymn\", \"ionic\", \"jolly\", \"knack\",\n \"lyric\", \"myrtle\", \"noble\", \"plumb\", \"quaint\", \"rustic\", \"satin\", \"timber\",\n \"urge\", \"vault\", \"whimsy\", \"yearn\", \"zenith\", \"ash\", \"beach\", \"dusk\",\n];\n","import {\n Connection,\n Keypair,\n PublicKey,\n Transaction,\n sendAndConfirmTransaction,\n type TransactionInstruction,\n} from \"@solana/web3.js\";\nimport type { AuthProvider, Identity } from \"../../auth/AuthProvider\";\nimport type { DeviceSigner, DevicePublicKey } from \"../../signer/DeviceSigner\";\nimport { WebCryptoSigner } from \"../../signer/WebCryptoSigner\";\nimport type { WalletRegistry } from \"../../registry/WalletRegistry\";\nimport { InMemoryWalletRegistry } from \"../../registry/WalletRegistry\";\nimport { HttpWalletRegistry } from \"../../registry/HttpWalletRegistry\";\nimport { deriveAddressSeedSolana } from \"../../identity\";\nimport { SolanaAdapter } from \"./SolanaAdapter\";\nimport type { InstructionData } from \"./SolanaAdapter\";\nimport { SolanaRelayer } from \"./SolanaRelayer\";\nimport { SOLANA_NETWORKS, type SolanaNetwork } from \"./constants\";\nimport { BackupSigner, deriveBackupKey } from \"../../recovery/BackupSigner\";\n\nexport interface ConnectSolanaOptions {\n network: SolanaNetwork;\n /** Authenticated user (pass `identity` directly, or an `auth` provider). */\n auth?: AuthProvider;\n identity?: Identity;\n appSalt: string;\n appId?: string;\n backendUrl?: string;\n registry?: WalletRegistry;\n /** RPC override (else the network default). */\n rpcUrl?: string;\n /** Cavos device-account program id override. */\n programId?: string;\n /** Override the device signer factory (native / tests); default WebCrypto. */\n createSigner?: (keyId: string) => Promise<DeviceSigner>;\n /**\n * Gasless sponsorship via the Cavos relayer. When set (or when `appId` +\n * `backendUrl` are given), transactions are co-signed + paid by the Cavos\n * relayer, so the integrator needs NO fee-payer keypair — the user's silent\n * device key (which holds no SOL) gets a seedless, gasless experience.\n */\n relayer?: SolanaRelayer;\n /**\n * Self-funded fallback: a fee-payer keypair the integrator funds. Used only\n * when no `relayer` is configured (tests / advanced). Sponsored relaying is\n * the default path when `appId` is provided.\n */\n feePayer?: Keypair;\n}\n\nexport type ConnectStatus = \"ready\" | \"needs-device-approval\";\n\n/**\n * Options for recovering a Solana account after losing every device signer.\n * Mirrors `RecoveryOptions` (Starknet), adapted to the Solana path: the backup\n * key signs the `add_signer` bundle via the secp256r1 precompile and the Cavos\n * relayer sponsors it (no fee-payer keypair needed).\n */\nexport interface RecoverSolanaOptions {\n /** The recovery code the user stored when they ran setupRecovery. */\n code: string;\n /** Authenticated identity (same user who owns the account). */\n identity: Identity;\n /** Solana network the account lives on. */\n network: SolanaNetwork;\n appSalt: string;\n appId?: string;\n backendUrl?: string;\n registry?: WalletRegistry;\n /** RPC override (else the network default). */\n rpcUrl?: string;\n /** Cavos device-account program id override. */\n programId?: string;\n /** Override the new device's signer (native / tests); default WebCrypto. */\n createSigner?: (keyId: string) => Promise<DeviceSigner>;\n /** Gasless sponsorship via the Cavos relayer (defaults to hosted when appId set). */\n relayer?: SolanaRelayer;\n /** Self-funded fallback when no relayer is configured (tests / advanced). */\n feePayer?: Keypair;\n}\n\n/**\n * High-level Solana entry — the Solana analogue of `Cavos.connect`. One call\n * derives the deterministic device-bound account, deploys it (PDA `initialize`)\n * if needed, registers it for cross-device recognition, and returns a ready\n * handle whose silent P-256 device key authorizes every action through the\n * native secp256r1 precompile.\n *\n * const cavos = await CavosSolana.connect({ network: \"solana-devnet\", identity, appSalt, feePayer });\n * if (cavos.status === \"ready\") await cavos.execute(amount, dest);\n *\n * Gasless by default: when an `appId` is provided the Cavos relayer co-signs +\n * pays (no fee-payer keypair needed). `feePayer` is the self-funded fallback.\n */\nexport class CavosSolana {\n /** Discriminant for the `CavosWallet` union — narrows `execute()` per chain. */\n readonly chain = \"solana\" as const;\n\n private constructor(\n readonly identity: Identity,\n readonly address: string,\n readonly status: ConnectStatus,\n readonly connection: Connection,\n private readonly adapter: SolanaAdapter,\n private readonly devicePubkey: DevicePublicKey,\n private readonly relayer?: SolanaRelayer,\n private readonly feePayer?: Keypair,\n ) {}\n\n get publicKey(): DevicePublicKey {\n return this.devicePubkey;\n }\n\n static async connect(opts: ConnectSolanaOptions): Promise<CavosSolana> {\n const identity = opts.identity ?? (await opts.auth?.authenticate());\n if (!identity) throw new Error(\"kit/solana: connect requires `identity` or `auth`\");\n\n // Client-side read RPC. The integrator SHOULD pass their own `rpcUrl` — the\n // public default is rate-limited and unfit for production. (This is separate\n // from the relayer's server-side RPC, which Cavos operates.) Warn loudly when\n // hitting mainnet on the shared public endpoint.\n if (opts.network === \"solana-mainnet\" && !opts.rpcUrl) {\n console.warn(\n \"[cavos] Using the public mainnet-beta RPC. Pass `rpcUrl` with your own \" +\n \"provider (Helius/Triton/QuickNode) for production — the public endpoint is rate-limited.\",\n );\n }\n const connection = new Connection(opts.rpcUrl ?? SOLANA_NETWORKS[opts.network], \"confirmed\");\n\n const signer = opts.createSigner\n ? await opts.createSigner(`${identity.userId}:${opts.appSalt}`)\n : await WebCryptoSigner.loadOrCreate({ keyId: `${identity.userId}:${opts.appSalt}` });\n const devicePubkey = await signer.getPublicKey();\n\n const adapter = new SolanaAdapter({ programId: opts.programId, connection, signer });\n const addressSeed = deriveAddressSeedSolana({ userId: identity.userId, appSalt: opts.appSalt });\n\n const backendUrl = opts.backendUrl ?? \"https://cavos.xyz\";\n const registry =\n opts.registry ??\n (opts.appId\n ? new HttpWalletRegistry({ baseUrl: backendUrl, appId: opts.appId, network: opts.network })\n : defaultRegistry);\n\n // Default to gasless sponsorship via the Cavos relayer when an appId is set,\n // so the integrator needs no fee payer. `feePayer` is the self-funded fallback.\n const relayer =\n opts.relayer ??\n (opts.appId\n ? new SolanaRelayer({ baseUrl: backendUrl, appId: opts.appId, network: opts.network, connection })\n : undefined);\n\n // Returning user on another device? The address is device-bound, so the\n // registry (not the identity alone) recognizes it. A new device is flagged\n // needs-device-approval (add it from an existing device) — same model as Starknet.\n const existing = await registry.lookup(identity.userId);\n if (existing) {\n const isSigner = await adapter.isAuthorizedSigner(existing.address, devicePubkey);\n return new CavosSolana(\n identity,\n existing.address,\n isSigner ? \"ready\" : \"needs-device-approval\",\n connection,\n adapter,\n devicePubkey,\n relayer,\n opts.feePayer,\n );\n }\n\n const address = adapter.computeAddress(addressSeed, devicePubkey);\n const deployed = (await connection.getAccountInfo(new PublicKey(address))) !== null;\n\n if (!deployed) {\n // Whoever pays must be the `initialize` payer/fee payer: the relayer (when\n // sponsoring) or the self-funded feePayer.\n if (relayer) {\n const payer = await relayer.getFeePayer();\n const ix = adapter.buildInitialize(addressSeed, payer.toBase58(), devicePubkey);\n await relayer.send([ix]);\n } else if (opts.feePayer) {\n const ix = adapter.buildInitialize(addressSeed, opts.feePayer.publicKey.toBase58(), devicePubkey);\n await sendAndConfirmTransaction(connection, new Transaction().add(ix), [opts.feePayer]);\n } else {\n throw new Error(\"kit/solana: a relayer (appId) or feePayer is required to initialize a new account\");\n }\n }\n\n await registry.register({ userId: identity.userId, address, initialSigner: devicePubkey });\n const isSigner = await adapter.isAuthorizedSigner(address, devicePubkey);\n return new CavosSolana(\n identity,\n address,\n isSigner ? \"ready\" : \"needs-device-approval\",\n connection,\n adapter,\n devicePubkey,\n relayer,\n opts.feePayer,\n );\n }\n\n /** Authorize an additional device signer (device-signed via precompile). */\n async addSigner(pubkey: DevicePublicKey): Promise<string> {\n const ixs = await this.adapter.buildAddSigner(this.address, pubkey);\n return this.send(ixs);\n }\n\n /** Move `amount` lamports out of the account to `destination` (device-signed). */\n async execute(amount: bigint, destination: string): Promise<string> {\n if (this.status !== \"ready\") {\n throw new Error(\"kit/solana: this device is not yet an authorized signer of the wallet\");\n }\n const ixs = await this.adapter.buildExecuteTransfer(this.address, destination, amount);\n return this.send(ixs);\n }\n\n /**\n * Run arbitrary CPI `instructions` with the account PDA as signer (device-\n * signed). The signature commits to sha256 of the canonical Borsh\n * serialization of the instructions, so it binds exactly the operations the\n * program will invoke. Unlocks SPL transfers, swaps, staking, etc.\n *\n * What the relayer will sponsor is constrained by the app's Solana program\n * allowlist (configured in the dashboard) — programs outside the allowlist are\n * rejected before co-signing.\n */\n async executeInstructions(instructions: InstructionData[]): Promise<string> {\n if (this.status !== \"ready\") {\n throw new Error(\"kit/solana: this device is not yet an authorized signer of the wallet\");\n }\n const ixs = await this.adapter.buildExecute(this.address, instructions);\n return this.send(ixs);\n }\n\n /**\n * Register the backup signer derived from `code` as an authorized signer of this\n * account (device-signed via precompile). Idempotent: returns without a tx if\n * the backup signer is already registered. The code never leaves the device —\n * only the derived public key travels on-chain.\n *\n * Self-custodial: anyone who can re-derive the backup key from the code (i.e.\n * the rightful owner) can later recover the account with `CavosSolana.recover`.\n * Run this once, on a registered device, and have the user store the code.\n */\n async setupRecovery(code: string): Promise<string | undefined> {\n if (this.status !== \"ready\") {\n throw new Error(\"kit/solana: setupRecovery requires a ready, registered device\");\n }\n const { publicKey: backupPubkey } = deriveBackupKey(code);\n // Skip the on-chain call if the backup signer is already registered.\n const already = await this.adapter.isAuthorizedSigner(this.address, backupPubkey);\n if (already) return undefined;\n return this.addSigner(backupPubkey);\n }\n\n /**\n * Recover an account after losing every device signer. Derives the backup key\n * from `code`, uses it (not the new device key) to sign an `add_signer` for the\n * new device, and returns a ready CavosSolana bound to the new device. The\n * account address is unchanged.\n *\n * Self-custodial: only someone holding the code (i.e. the rightful owner) can\n * re-derive the backup key. The backend never sees the code.\n *\n * This mirrors `Cavos.recover` (Starknet): the backup key is just another\n * authorized signer, so recovery is an `add_signer(newDevice)` bundle signed by\n * the backup key. The on-chain program needs no recovery-specific entrypoint.\n */\n static async recover(opts: RecoverSolanaOptions): Promise<CavosSolana> {\n if (opts.network === \"solana-mainnet\" && !opts.rpcUrl) {\n console.warn(\n \"[cavos] Using the public mainnet-beta RPC. Pass `rpcUrl` with your own \" +\n \"provider (Helius/Triton/QuickNode) for production — the public endpoint is rate-limited.\",\n );\n }\n const connection = new Connection(opts.rpcUrl ?? SOLANA_NETWORKS[opts.network], \"confirmed\");\n\n // The new device's signer (created/loaded the same way connect() does).\n const signer = opts.createSigner\n ? await opts.createSigner(`${opts.identity.userId}:${opts.appSalt}`)\n : await WebCryptoSigner.loadOrCreate({ keyId: `${opts.identity.userId}:${opts.appSalt}` });\n const devicePubkey = await signer.getPublicKey();\n\n // The backup key drives THIS transaction: it's the only signer that can\n // authorise adding the new device after all device keys are lost. The\n // adapter signs every bundle with whatever `signer` it's constructed with,\n // so a backup-backed adapter produces backup-signed `add_signer` bundles.\n const backup = BackupSigner.fromCode(opts.code);\n const backupAdapter = new SolanaAdapter({\n programId: opts.programId,\n connection,\n signer: backup,\n });\n\n const backendUrl = opts.backendUrl ?? \"https://cavos.xyz\";\n const registry =\n opts.registry ??\n (opts.appId\n ? new HttpWalletRegistry({ baseUrl: backendUrl, appId: opts.appId, network: opts.network })\n : defaultRegistry);\n const existing = await registry.lookup(opts.identity.userId);\n if (!existing) {\n throw new Error(\"kit/solana: no account found for this identity — nothing to recover\");\n }\n\n const relayer =\n opts.relayer ??\n (opts.appId\n ? new SolanaRelayer({ baseUrl: backendUrl, appId: opts.appId, network: opts.network, connection })\n : undefined);\n\n // Authorise the new device, signed by the backup key (sponsored by the relayer,\n // or self-funded). The account address is unchanged.\n const alreadyAuthed = await backupAdapter.isAuthorizedSigner(existing.address, devicePubkey);\n if (!alreadyAuthed) {\n const ixs = await backupAdapter.buildAddSigner(existing.address, devicePubkey);\n if (relayer) {\n await relayer.send(ixs);\n } else if (opts.feePayer) {\n await sendAndConfirmTransaction(connection, new Transaction().add(...ixs), [opts.feePayer]);\n } else {\n throw new Error(\"kit/solana: a relayer (appId) or feePayer is required to recover\");\n }\n }\n\n // Hand control to the new device's signer for all future operations.\n const adapter = new SolanaAdapter({ programId: opts.programId, connection, signer });\n return new CavosSolana(\n opts.identity,\n existing.address,\n \"ready\",\n connection,\n adapter,\n devicePubkey,\n relayer,\n opts.feePayer,\n );\n }\n\n private async send(ixs: TransactionInstruction[]): Promise<string> {\n // Prefer the sponsored relayer (no fee payer needed); fall back to self-funded.\n if (this.relayer) return this.relayer.send(ixs);\n if (this.feePayer) {\n return sendAndConfirmTransaction(this.connection, new Transaction().add(...ixs), [this.feePayer]);\n }\n throw new Error(\"kit/solana: no relayer or feePayer configured to submit transactions\");\n }\n}\n\nconst defaultRegistry = new InMemoryWalletRegistry();\n","import type { DevicePublicKey } from \"../signer/DeviceSigner\";\nimport type { RecoveryClient, PendingDeviceRequest } from \"./RecoveryClient\";\n\nexport interface HttpRecoveryClientOptions {\n /** Cavos backend base URL (e.g. https://cavos.xyz). */\n baseUrl: string;\n /** The Cavos App ID — authenticates SDK calls. */\n appId: string;\n}\n\nfunction toHex(n: bigint): string {\n return \"0x\" + n.toString(16);\n}\nfunction fromHex(s: string): bigint {\n return BigInt(s);\n}\n\nfunction deviceLabel(): string {\n if (typeof navigator !== \"undefined\") {\n return navigator.userAgent || \"a new device\";\n }\n return \"a new device\";\n}\n\n/**\n * RecoveryClient backed by the Cavos backend's device-approval relay\n * (`/api/devices/request`). The relay holds NO keys — it stores the pending\n * request, emails the wallet owner, and mirrors the on-chain `add_signer` once a\n * registered device confirms.\n */\nexport class HttpRecoveryClient implements RecoveryClient {\n constructor(private readonly opts: HttpRecoveryClientOptions) {}\n\n async requestDeviceAddition(params: {\n userId: string;\n accountAddress: string;\n newSigner: DevicePublicKey;\n email?: string;\n deviceLabel?: string;\n }): Promise<{ requestId: string }> {\n const res = await fetch(new URL(\"/api/devices/request\", this.opts.baseUrl), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n app_id: this.opts.appId,\n wallet_address: params.accountAddress,\n new_pub_x: toHex(params.newSigner.x),\n new_pub_y: toHex(params.newSigner.y),\n device_label: params.deviceLabel ?? deviceLabel(),\n ...(params.email ? { email: params.email } : {}),\n }),\n });\n if (!res.ok) {\n const t = await res.text().catch(() => \"\");\n throw new Error(`requestDeviceAddition failed: ${res.status} ${t}`);\n }\n const data = await res.json();\n return { requestId: data.request_id };\n }\n\n async getPendingRequest(requestId: string): Promise<PendingDeviceRequest | null> {\n const url = new URL(\"/api/devices/request\", this.opts.baseUrl);\n url.searchParams.set(\"id\", requestId);\n const res = await fetch(url, { headers: { \"Content-Type\": \"application/json\" } });\n if (!res.ok) throw new Error(`getPendingRequest failed: ${res.status}`);\n const data = await res.json();\n if (!data.found) return null;\n\n const status = data.status as PendingDeviceRequest[\"status\"];\n return {\n requestId: data.request_id,\n appId: data.app_id,\n userId: \"\", // the approving device already knows its own identity\n accountAddress: data.wallet_address,\n newSigner: { x: fromHex(data.new_pub_x), y: fromHex(data.new_pub_y) },\n createdAt: data.created_at,\n status,\n };\n }\n\n async confirmDeviceAddition(params: {\n requestId: string;\n txHash: string;\n }): Promise<void> {\n const res = await fetch(\n new URL(`/api/devices/request/${params.requestId}/confirm`, this.opts.baseUrl),\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ tx_hash: params.txHash }),\n },\n );\n if (!res.ok) {\n const t = await res.text().catch(() => \"\");\n throw new Error(`confirmDeviceAddition failed: ${res.status} ${t}`);\n }\n }\n}\n","import { Account, RpcProvider, PaymasterRpc, num, type Call } from \"starknet\";\nimport type { Keypair } from \"@solana/web3.js\";\nimport type { AuthProvider, Identity } from \"./auth/AuthProvider\";\nimport type { DeviceSigner, DevicePublicKey } from \"./signer/DeviceSigner\";\nimport { WebCryptoSigner } from \"./signer/WebCryptoSigner\";\nimport { StarknetAdapter } from \"./chains/starknet/StarknetAdapter\";\nimport { StarknetDeviceSigner } from \"./chains/starknet/StarknetDeviceSigner\";\nimport { CavosSolana } from \"./chains/solana/CavosSolana\";\nimport type { SolanaRelayer } from \"./chains/solana/SolanaRelayer\";\nimport type { SolanaNetwork } from \"./chains/solana/constants\";\nimport type { ChainCall } from \"./chains/ChainAdapter\";\nimport type { WalletRegistry } from \"./registry/WalletRegistry\";\nimport { InMemoryWalletRegistry } from \"./registry/WalletRegistry\";\nimport { HttpWalletRegistry } from \"./registry/HttpWalletRegistry\";\nimport type { RecoveryClient } from \"./recovery/RecoveryClient\";\nimport { HttpRecoveryClient } from \"./recovery/HttpRecoveryClient\";\nimport { BackupSigner, deriveBackupKey } from \"./recovery/BackupSigner\";\nimport { deriveAddressSeed } from \"./identity\";\nimport {\n CAVOS_PAYMASTER_URL,\n DEVICE_ACCOUNT_CLASS_HASH,\n STARKNET_NETWORKS,\n type StarknetNetwork,\n} from \"./chains/starknet/constants\";\n\n/** The chains the unified `Cavos.connect` can target. */\nexport type Chain = \"starknet\" | \"solana\";\n\n/**\n * Environment selector. `Cavos.connect` resolves it to the chain's concrete\n * network: starknet → sepolia/mainnet, solana → solana-devnet/solana-mainnet.\n */\nexport type NetworkEnv = \"mainnet\" | \"testnet\";\n\n/** Resolve the abstract `{ chain, network }` to each chain's concrete network. */\nconst STARKNET_ENV: Record<NetworkEnv, StarknetNetwork> = {\n mainnet: \"mainnet\",\n testnet: \"sepolia\",\n};\nconst SOLANA_ENV: Record<NetworkEnv, SolanaNetwork> = {\n mainnet: \"solana-mainnet\",\n testnet: \"solana-devnet\",\n};\n\n/** A connected wallet: discriminated by `chain`, so `execute()` stays native. */\nexport type CavosWallet = Cavos | CavosSolana;\n\nexport interface ConnectOptions {\n /** Target chain. The returned wallet is discriminated by this same value. */\n chain: Chain;\n /** Environment. Resolved to sepolia/devnet (testnet) or mainnet per chain. */\n network: NetworkEnv;\n /** Authenticated user (pass `identity` directly, or an `auth` provider). */\n auth?: AuthProvider;\n identity?: Identity;\n appSalt: string;\n /**\n * Cavos App ID. When set (with `backendUrl`), the kit uses the hosted\n * WalletRegistry + RecoveryClient by default for real multi-device support.\n */\n appId?: string;\n /** Cavos backend base URL. Defaults to https://cavos.xyz. */\n backendUrl?: string;\n /**\n * Off-chain user_id -> wallet map. Defaults to the hosted HttpWalletRegistry\n * when `appId` is set, else an in-memory registry (single-device only).\n */\n registry?: WalletRegistry;\n /**\n * Device-approval relay (Starknet). Defaults to HttpRecoveryClient when\n * `appId` is set; used to request addition of this device when it isn't a\n * signer yet.\n */\n recovery?: RecoveryClient;\n rpcUrl?: string;\n /** Override the device signer factory (native / tests); default WebCrypto. */\n createSigner?: (keyId: string) => Promise<DeviceSigner>;\n\n // --- Starknet-only ---\n /** Cavos paymaster API key (sponsors deploy + execute). Required for Starknet. */\n paymasterApiKey?: string;\n paymasterUrl?: string;\n classHash?: string;\n\n // --- Solana-only ---\n /** Cavos device-account program id override. */\n programId?: string;\n /** Gasless sponsorship relayer (defaults to the hosted one when `appId` set). */\n relayer?: SolanaRelayer;\n /** Self-funded fee-payer fallback when no relayer is configured. */\n feePayer?: Keypair;\n}\n\n/** The Starknet-specific connect options, resolved from the unified ones. */\ninterface StarknetConnectOptions {\n network: StarknetNetwork;\n auth?: AuthProvider;\n identity?: Identity;\n appSalt: string;\n appId?: string;\n backendUrl?: string;\n registry?: WalletRegistry;\n recovery?: RecoveryClient;\n paymasterApiKey: string;\n paymasterUrl?: string;\n rpcUrl?: string;\n classHash?: string;\n createSigner?: (keyId: string) => Promise<DeviceSigner>;\n}\n\n/** Whether this device can already operate the wallet, or needs to be added. */\nexport type ConnectStatus = \"ready\" | \"needs-device-approval\";\n\n/** Options for recovering an account after losing every device signer. */\nexport interface RecoveryOptions {\n /** The recovery code the user stored when they ran setupRecovery. */\n code: string;\n /** Authenticated identity (same user who owns the account). */\n identity: Identity;\n /** Environment (recovery is Starknet-only): testnet → sepolia, mainnet. */\n network: NetworkEnv;\n appSalt: string;\n paymasterApiKey: string;\n appId?: string;\n backendUrl?: string;\n rpcUrl?: string;\n paymasterUrl?: string;\n classHash?: string;\n /** Off-chain user_id -> wallet map. Defaults to the hosted registry. */\n registry?: WalletRegistry;\n /** Override the new device's signer (native / tests); default WebCrypto. */\n createSigner?: (keyId: string) => Promise<DeviceSigner>;\n}\n\n/**\n * High-level Cavos wallet. One call logs the user in and returns a ready, gas-\n * sponsored smart account controlled by a silent device key.\n *\n * const cavos = await Cavos.connect({ network, identity, appSalt, registry, paymasterApiKey });\n * if (cavos.status === \"ready\") await cavos.execute(calls);\n *\n * The account address is `f(identity, device_pubkey)` — unforgeable, so it can't\n * be hijacked. The `registry` recognizes returning users across devices: a new\n * device on an existing account is flagged `needs-device-approval` (add it via\n * an already-registered device) instead of creating a second wallet.\n */\nexport class Cavos {\n /** Discriminant for the `CavosWallet` union — narrows `execute()` per chain. */\n readonly chain = \"starknet\" as const;\n /** Request id of the pending device-addition, when status is needs-device-approval. */\n pendingRequestId: string | null = null;\n\n private constructor(\n readonly identity: Identity,\n readonly address: string,\n readonly status: ConnectStatus,\n readonly account: Account,\n private readonly adapter: StarknetAdapter,\n private readonly devicePubkey: DevicePublicKey,\n ) {}\n\n /**\n * Unified entry point. Pick a `chain` and an `network` environment; the kit\n * resolves the concrete network (sepolia/devnet for testnet, mainnet for\n * mainnet) and returns a chain-native wallet. The result is a discriminated\n * union (`wallet.chain`), so `execute()` keeps each chain's native signature:\n *\n * const wallet = await Cavos.connect({ chain: \"solana\", network: \"testnet\", identity, appSalt, appId });\n * if (wallet.chain === \"starknet\") await wallet.execute(calls);\n * else await wallet.execute(amount, dest);\n */\n static async connect(opts: ConnectOptions): Promise<CavosWallet> {\n if (opts.chain === \"solana\") {\n return CavosSolana.connect({\n network: SOLANA_ENV[opts.network],\n ...(opts.auth ? { auth: opts.auth } : {}),\n ...(opts.identity ? { identity: opts.identity } : {}),\n appSalt: opts.appSalt,\n ...(opts.appId ? { appId: opts.appId } : {}),\n ...(opts.backendUrl ? { backendUrl: opts.backendUrl } : {}),\n ...(opts.registry ? { registry: opts.registry } : {}),\n ...(opts.rpcUrl ? { rpcUrl: opts.rpcUrl } : {}),\n ...(opts.programId ? { programId: opts.programId } : {}),\n ...(opts.createSigner ? { createSigner: opts.createSigner } : {}),\n ...(opts.relayer ? { relayer: opts.relayer } : {}),\n ...(opts.feePayer ? { feePayer: opts.feePayer } : {}),\n });\n }\n if (!opts.paymasterApiKey) {\n throw new Error(\"kit: `paymasterApiKey` is required for Starknet connections\");\n }\n return Cavos.connectStarknet({\n network: STARKNET_ENV[opts.network],\n auth: opts.auth,\n identity: opts.identity,\n appSalt: opts.appSalt,\n appId: opts.appId,\n backendUrl: opts.backendUrl,\n registry: opts.registry,\n recovery: opts.recovery,\n paymasterApiKey: opts.paymasterApiKey,\n paymasterUrl: opts.paymasterUrl,\n rpcUrl: opts.rpcUrl,\n classHash: opts.classHash,\n createSigner: opts.createSigner,\n });\n }\n\n private static async connectStarknet(opts: StarknetConnectOptions): Promise<Cavos> {\n const identity = opts.identity ?? (await opts.auth?.authenticate());\n if (!identity) throw new Error(\"kit: connect requires `identity` or `auth`\");\n\n const classHash = opts.classHash ?? DEVICE_ACCOUNT_CLASS_HASH[opts.network];\n if (!classHash) throw new Error(`kit: no DeviceAccount class hash for ${opts.network}`);\n\n const provider = new RpcProvider({\n nodeUrl: opts.rpcUrl ?? STARKNET_NETWORKS[opts.network].rpcUrl,\n });\n const paymaster = new PaymasterRpc({\n nodeUrl: opts.paymasterUrl ?? CAVOS_PAYMASTER_URL[opts.network],\n headers: { \"x-paymaster-api-key\": opts.paymasterApiKey },\n });\n\n const addressSeed = deriveAddressSeed({ userId: identity.userId, appSalt: opts.appSalt });\n\n // This device's silent signer.\n const signer = opts.createSigner\n ? await opts.createSigner(`${identity.userId}:${opts.appSalt}`)\n : await WebCryptoSigner.loadOrCreate({ keyId: `${identity.userId}:${opts.appSalt}` });\n const devicePubkey = await signer.getPublicKey();\n\n const adapter = new StarknetAdapter({ classHash, signer, provider });\n const makeAccount = (address: string) =>\n new Account({\n provider,\n address,\n signer: new StarknetDeviceSigner(signer),\n paymaster,\n cairoVersion: \"1\",\n });\n\n // Returning user? The registry knows their wallet (address is device-bound,\n // so it isn't derivable from identity alone). Default to the hosted\n // HttpWalletRegistry when appId is provided, else an in-memory map.\n const backendUrl = opts.backendUrl ?? \"https://cavos.xyz\";\n const registry =\n opts.registry ??\n (opts.appId\n ? new HttpWalletRegistry({ baseUrl: backendUrl, appId: opts.appId, network: opts.network })\n : defaultRegistry);\n const recovery =\n opts.recovery ?? (opts.appId ? new HttpRecoveryClient({ baseUrl: backendUrl, appId: opts.appId }) : null);\n const existing = await registry.lookup(identity.userId);\n\n if (existing) {\n const account = makeAccount(existing.address);\n const isSigner = await adapter.isAuthorizedSigner(existing.address, devicePubkey);\n const cavos = new Cavos(\n identity,\n existing.address,\n isSigner ? \"ready\" : \"needs-device-approval\",\n account,\n adapter,\n devicePubkey,\n );\n\n // New device on an existing wallet: ask the backend to email the owner an\n // approval link. The approving device signs add_signer on-chain; this device\n // becomes \"ready\" after that. Best-effort: never blocks the connect result.\n //\n // De-duplicate within a short window so a page refresh, reconnect, or\n // rapid retry doesn't spam the owner with one email per attempt. The\n // backend already dedups by request id within its 24h TTL, but that still\n // re-sends the email on each fresh request id — this client-side guard\n // collapses the burst. We keep the last requestId and reuse it.\n if (!isSigner && recovery) {\n const dedup = lastDeviceRequest.get(identity.userId);\n const fresh = dedup && Date.now() - dedup.requestedAt < DEVICE_REQUEST_DEDUP_MS;\n try {\n if (fresh) {\n cavos.pendingRequestId = dedup!.requestId;\n } else {\n const { requestId } = await recovery.requestDeviceAddition({\n userId: identity.userId,\n accountAddress: existing.address,\n newSigner: devicePubkey,\n ...(identity.email ? { email: identity.email } : {}),\n });\n cavos.pendingRequestId = requestId;\n lastDeviceRequest.set(identity.userId, { requestId, requestedAt: Date.now() });\n }\n } catch (e) {\n console.warn(\"[Cavos] requestDeviceAddition failed:\", e);\n }\n }\n return cavos;\n }\n\n // Compute the deterministic address for (identity, this device). The address\n // is device-bound, so it's NOT in the registry for a new device — but it may\n // already be deployed on-chain (same device reconnecting, or a re-run after a\n // deploy that succeeded before a timeout). Ask the chain before deploying:\n // re-deploying an existing account reverts (\"contract already deployed\").\n const address = adapter.computeAddress({ addressSeed, initialSigner: devicePubkey });\n const account = makeAccount(address);\n const alreadyDeployed = await isDeployed(provider, address);\n\n if (!alreadyDeployed) {\n const deploymentData = {\n address,\n class_hash: classHash,\n salt: num.toHex(addressSeed),\n calldata: adapter.constructorCalldata(addressSeed, devicePubkey),\n version: 1 as const,\n };\n const deployRes = await account.executePaymasterTransaction([], {\n feeMode: { mode: \"sponsored\" },\n deploymentData,\n });\n // Wait for the deploy to land before declaring the device \"ready\". Assuming\n // readiness here would report \"ready\" if the tx silently failed or hadn't\n // indexed yet — and the user would hit a confusing error on their first tx.\n try {\n await provider.waitForTransaction(deployRes.transaction_hash);\n } catch (e) {\n console.warn(\"[Cavos] deploy receipt wait failed:\", e);\n }\n }\n\n // Record the wallet (idempotent for reconnects) and resolve readiness from\n // the chain: this device is \"ready\" iff its pubkey is an authorized signer.\n // We re-read even right after a fresh deploy, so a deploy that failed to\n // index (or silently reverted) surfaces as needs-device-approval rather than\n // a false \"ready\".\n await registry.register({ userId: identity.userId, address, initialSigner: devicePubkey });\n let isSigner: boolean;\n try {\n isSigner = await adapter.isAuthorizedSigner(address, devicePubkey);\n } catch (e) {\n // Fall back to the deploy assumption only if the chain read itself errors\n // (e.g. node hiccup right after indexing) — the deploy did submit.\n console.warn(\"[Cavos] isAuthorizedSigner read failed:\", e);\n isSigner = !alreadyDeployed;\n }\n\n return new Cavos(\n identity,\n address,\n isSigner ? \"ready\" : \"needs-device-approval\",\n account,\n adapter,\n devicePubkey,\n );\n }\n\n /** This device's public key (e.g. to request addition to an existing wallet). */\n get publicKey(): DevicePublicKey {\n return this.devicePubkey;\n }\n\n /** Execute a sponsored (gasless) multicall, signed silently by the device. */\n async execute(calls: ChainCall[]): Promise<{ transactionHash: string }> {\n if (this.status !== \"ready\") {\n throw new Error(\"kit: this device is not yet an authorized signer of the wallet\");\n }\n const res = await this.account.executePaymasterTransaction(calls as Call[], {\n feeMode: { mode: \"sponsored\" },\n });\n return { transactionHash: res.transaction_hash };\n }\n\n /** Authorize an additional device signer (sponsored). Self-submitted. */\n async addSigner(pubkey: DevicePublicKey): Promise<{ transactionHash: string }> {\n return this.execute([this.adapter.buildAddSigner(this.address, pubkey)]);\n }\n\n /**\n * Register a self-custodial backup signer derived from `code`, so the account\n * can be recovered after the user loses every device. Idempotent: if the\n * derived backup key is already an authorised signer, this is a no-op.\n *\n * The code never leaves the device — only its deterministic public key is\n * added on-chain as an ordinary signer. Sponsor this like any other\n * add_signer (gasless). Returns the transaction hash (or undefined when the\n * backup was already set up).\n */\n async setupRecovery(code: string): Promise<{ transactionHash: string } | undefined> {\n const { publicKey: backupPubkey } = deriveBackupKey(code);\n // Skip the on-chain call if the backup signer is already registered.\n const already = await this.adapter.isAuthorizedSigner(this.address, backupPubkey);\n if (already) return undefined;\n return this.addSigner(backupPubkey);\n }\n\n /**\n * Recover an account after losing every device signer. Derives the backup key\n * from `code`, uses it (not the new device key) to sign an `add_signer` for\n * the new device, and returns a ready Cavos bound to the new device. The\n * account address is unchanged.\n *\n * Self-custodial: only someone holding the code (i.e. the rightful owner) can\n * re-derive the backup key. The backend never sees the code.\n */\n static async recover(opts: RecoveryOptions): Promise<Cavos> {\n const network = STARKNET_ENV[opts.network];\n const classHash = opts.classHash ?? DEVICE_ACCOUNT_CLASS_HASH[network];\n if (!classHash) throw new Error(`kit: no DeviceAccount class hash for ${network}`);\n\n const provider = new RpcProvider({\n nodeUrl: opts.rpcUrl ?? STARKNET_NETWORKS[network].rpcUrl,\n });\n const paymaster = new PaymasterRpc({\n nodeUrl: opts.paymasterUrl ?? CAVOS_PAYMASTER_URL[network],\n headers: { \"x-paymaster-api-key\": opts.paymasterApiKey },\n });\n\n // The new device's signer (created/loaded the same way connect() does).\n const signer = opts.createSigner\n ? await opts.createSigner(`${opts.identity.userId}:${opts.appSalt}`)\n : await WebCryptoSigner.loadOrCreate({ keyId: `${opts.identity.userId}:${opts.appSalt}` });\n const devicePubkey = await signer.getPublicKey();\n\n // The backup key drives THIS transaction: it's the only signer that can\n // authorise adding the new device after all device keys are lost.\n const backup = BackupSigner.fromCode(opts.code);\n const backupAdapter = new StarknetAdapter({ classHash, signer: backup, provider });\n\n const backendUrl = opts.backendUrl ?? \"https://cavos.xyz\";\n const registry =\n opts.registry ??\n (opts.appId\n ? new HttpWalletRegistry({ baseUrl: backendUrl, appId: opts.appId, network })\n : defaultRegistry);\n const existing = await registry.lookup(opts.identity.userId);\n if (!existing) {\n throw new Error(\"kit: no account found for this identity — nothing to recover\");\n }\n\n // Authorise the new device, signed by the backup key (sponsored).\n const backupAccount = new Account({\n provider,\n address: existing.address,\n signer: new StarknetDeviceSigner(backup),\n paymaster,\n cairoVersion: \"1\",\n });\n const alreadyAuthed = await backupAdapter.isAuthorizedSigner(existing.address, devicePubkey);\n if (!alreadyAuthed) {\n const res = await backupAccount.executePaymasterTransaction(\n [backupAdapter.buildAddSigner(existing.address, devicePubkey)],\n { feeMode: { mode: \"sponsored\" } },\n );\n try {\n await provider.waitForTransaction(res.transaction_hash);\n } catch (e) {\n console.warn(\"[Cavos] recovery add_signer receipt wait failed:\", e);\n }\n }\n\n // Hand control to the new device's signer for all future operations.\n const adapter = new StarknetAdapter({ classHash, signer, provider });\n const account = new Account({\n provider,\n address: existing.address,\n signer: new StarknetDeviceSigner(signer),\n paymaster,\n cairoVersion: \"1\",\n });\n return new Cavos(opts.identity, existing.address, \"ready\", account, adapter, devicePubkey);\n }\n}\n\n/**\n * Shared in-memory registry used when `ConnectOptions.registry` is omitted.\n * Module-level so a returning user is recognized within a single browser session\n * (real cross-device recognition needs an HTTP backend implementation).\n */\nconst defaultRegistry = new InMemoryWalletRegistry();\n\n/**\n * Client-side de-duplication of device-addition requests, keyed by user id. A\n * burst of connects (refresh, reconnect, retry) within this window reuses the\n * last requestId instead of emailing the owner again. Runtime-agnostic — works\n * without DOM/localStorage so the same code runs on native.\n */\nconst DEVICE_REQUEST_DEDUP_MS = 5 * 60 * 1000; // 5 minutes\nconst lastDeviceRequest = new Map<string, { requestId: string; requestedAt: number }>();\n\n/** Whether an account contract is already deployed at `address`. */\nasync function isDeployed(provider: RpcProvider, address: string): Promise<boolean> {\n try {\n const classHash = await provider.getClassHashAt(address);\n return !!classHash && classHash !== \"0x0\";\n } catch {\n return false;\n }\n}\n","import { hash, num } from \"starknet\";\nimport type { AuthProvider, Identity } from \"./AuthProvider\";\n\nexport interface CavosAuthOptions {\n /** Cavos backend base URL. Defaults to the hosted service (same as @cavos/react). */\n backendUrl?: string;\n /** App identifier registered with Cavos (the `appId` from the dashboard). */\n appId?: string;\n}\n\n/**\n * Hosted login (Privy-like) backed by the Cavos backend — same endpoints\n * `@cavos/react` uses (Google / Apple OAuth + Firebase email OTP). Login only\n * resolves a stable `userId` (the OAuth `sub` claim); it never touches signing.\n * Feed the returned `Identity` to `Cavos.connect`.\n *\n * const auth = new CavosAuth({ appId });\n * // social: open the returned URL; user returns, then:\n * const identity = await auth.handleCallback(window.location.search);\n * // or email OTP:\n * await auth.sendOtp(email); const identity = await auth.verifyOtp(email, code);\n * const cavos = await Cavos.connect({ network, appSalt, identity, paymasterApiKey });\n *\n * Device-signer model note: the backend issues a Cavos JWT (the same one react\n * uses for on-chain RSA verification). Here we only need the stable `sub` claim\n * from it — the RSA/JWKS/nonce machinery react relies on is dead weight for the\n * device model, because the device key (not the JWT) authorizes on-chain calls.\n * We still send a `nonce` (Poseidon over random bytes) since the backend expects\n * it on the request; the value itself is irrelevant to us.\n */\nexport class CavosAuth implements AuthProvider {\n private readonly backendUrl: string;\n /** Most recent nonce sent to the backend (for the pending OAuth/OTP request). */\n private pendingNonce: string | null = null;\n private last: Identity | null = null;\n\n constructor(private readonly opts: CavosAuthOptions = {}) {\n this.backendUrl = opts.backendUrl ?? \"https://cavos.xyz\";\n }\n\n /** Redirect URL for Google login (open it; user returns to your redirectUri). */\n async getGoogleOAuthUrl(redirectUri?: string): Promise<string> {\n return this.oauthUrl(\"google\", redirectUri);\n }\n\n /** Redirect URL for Apple login. */\n async getAppleOAuthUrl(redirectUri?: string): Promise<string> {\n return this.oauthUrl(\"apple\", redirectUri);\n }\n\n private async oauthUrl(provider: \"google\" | \"apple\", redirectUri?: string): Promise<string> {\n if (typeof window === \"undefined\") throw new Error(\"kit/auth: OAuth requires a browser\");\n const params = new URLSearchParams({\n nonce: this.freshNonce(),\n redirect_uri: redirectUri ?? window.location.href,\n ...(this.opts.appId ? { app_id: this.opts.appId } : {}),\n });\n const { url } = await this.get(`/api/oauth/${provider}?${params}`);\n return url;\n }\n\n /**\n * Resolve the identity from an OAuth callback. The auth data is carried in the\n * `auth_data` (or `zk_auth_data`) query param on return. We only extract `sub`.\n */\n async handleCallback(authDataOrSearch: string): Promise<Identity> {\n const authData = extractAuthData(authDataOrSearch);\n return this.identityFromAuthData(authData, \"oauth\");\n }\n\n /** Send a one-time code to an email (Firebase OTP). */\n async sendOtp(email: string): Promise<void> {\n await this.post(\"/api/oauth/firebase/otp/request\", {\n email,\n nonce: this.freshNonce(),\n ...(this.opts.appId ? { app_id: this.opts.appId } : {}),\n });\n }\n\n /** Send a passwordless magic-link sign-in email (Firebase). */\n async sendMagicLink(email: string): Promise<void> {\n await this.post(\"/api/oauth/firebase/magic-link\", {\n email,\n nonce: this.freshNonce(),\n ...(this.opts.appId ? { app_id: this.opts.appId } : {}),\n ...(typeof window !== \"undefined\" ? { redirect_uri: window.location.href } : {}),\n });\n }\n\n /** Verify the OTP and resolve the identity. */\n async verifyOtp(email: string, code: string): Promise<Identity> {\n const res = await this.post(\"/api/oauth/firebase/otp/verify\", {\n email,\n code,\n nonce: this.consumeNonce(),\n ...(this.opts.appId ? { app_id: this.opts.appId } : {}),\n });\n return this.identityFromAuthData(res.id_token ?? res.jwt ?? res.token ?? JSON.stringify(res), \"otp\", email);\n }\n\n /** AuthProvider: returns the identity resolved by the last login step. */\n async authenticate(): Promise<Identity> {\n if (!this.last) throw new Error(\"kit/auth: no identity yet — complete a login first\");\n return this.last;\n }\n\n // ── internals ──────────────────────────────────────────────────────────────\n\n /**\n * Build an `Identity` from whatever the backend returned. The Cavos backend\n * wraps the user id in a JWT (its `sub` claim); for the device model we only\n * need that stable id — the signature is never checked on-chain.\n */\n private async identityFromAuthData(\n authData: string,\n provider: string,\n emailOverride?: string,\n ): Promise<Identity> {\n let token = authData;\n try {\n const parsed = JSON.parse(authData);\n token = parsed.id_token ?? parsed.jwt ?? parsed.token ?? authData;\n } catch {\n // raw JWT\n }\n const claims = parseJwt(token);\n return this.remember({\n userId: String(claims.sub ?? claims.user_id ?? claims.uid),\n email: claims.email ?? emailOverride,\n provider: claims.firebase?.sign_in_provider ?? claims.provider ?? provider,\n });\n }\n\n /** Generate (and remember) the nonce the Cavos backend expects on requests. */\n private freshNonce(): string {\n // 31-byte random felt; matches the shape the backend validates, value is\n // irrelevant to the device-signer model.\n const bytes = crypto.getRandomValues(new Uint8Array(31));\n const h = hash.computePoseidonHashOnElements([bytesToChunks(bytes)]);\n this.pendingNonce = num.toHex(h);\n return this.pendingNonce;\n }\n\n /** Return the pending nonce (for the verify step), clearing it. */\n private consumeNonce(): string {\n if (!this.pendingNonce) return this.freshNonce();\n const n = this.pendingNonce;\n this.pendingNonce = null;\n return n;\n }\n\n private remember(id: Identity): Identity {\n this.last = id;\n return id;\n }\n\n private async get(path: string): Promise<any> {\n const r = await fetch(`${this.backendUrl}${path}`);\n if (!r.ok) throw new Error(`kit/auth: ${path} -> ${r.status} ${await r.text()}`);\n return r.json();\n }\n\n private async post(path: string, body: unknown): Promise<any> {\n const r = await fetch(`${this.backendUrl}${path}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n if (!r.ok) throw new Error(`kit/auth: ${path} -> ${r.status} ${await r.text()}`);\n return r.json();\n }\n}\n\n/** Pull the `auth_data` / `zk_auth_data` value out of a callback string. */\nfunction extractAuthData(input: string): string {\n if (input.includes(\"auth_data=\") || input.includes(\"zk_auth_data=\")) {\n const params = new URLSearchParams(input.startsWith(\"?\") ? input : `?${input}`);\n return params.get(\"auth_data\") ?? params.get(\"zk_auth_data\") ?? input;\n }\n return input;\n}\n\n/** Decode a JWT payload (no verification — the backend already validated it). */\nfunction parseJwt(jwt: string): any {\n const part = jwt.split(\".\")[1];\n if (!part) throw new Error(\"kit/auth: malformed JWT\");\n const json = atob(part.replace(/-/g, \"+\").replace(/_/g, \"/\"));\n return JSON.parse(json);\n}\n\n/** Pack a byte array into the felt252 chunks Poseidon hashes over. */\nfunction bytesToChunks(bytes: Uint8Array): bigint {\n let w = 0n;\n for (const b of bytes.subarray(0, 31)) w = (w << 8n) | BigInt(b);\n return w;\n}\n","'use client';\n\nimport React, {\n useState,\n useEffect,\n useCallback,\n useRef,\n type CSSProperties,\n} from 'react';\nimport { useCavos } from './CavosProvider';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface CavosAuthModalProps {\n open: boolean;\n onClose: () => void;\n onSuccess?: (address: string) => void;\n appName?: string;\n appLogo?: string;\n providers?: ('google' | 'apple' | 'email')[];\n emailMode?: 'magic-link' | 'otp';\n primaryColor?: string;\n /** 'light' (default) or 'dark' */\n theme?: 'light' | 'dark';\n}\n\nconst cavosLogoBase64 = \"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\";\n\ntype Screen = 'select' | 'magic-link' | 'verify' | 'otp-code' | 'deploying' | 'device-approval' | 'recover';\n\n// ─── Style injection ──────────────────────────────────────────────────────────\n\nconst STYLE_ID = 'cavos-modal-styles-v2';\n\nfunction injectStyles() {\n if (typeof document === 'undefined') return;\n if (document.getElementById(STYLE_ID)) return;\n const el = document.createElement('style');\n el.id = STYLE_ID;\n el.textContent = `\n @keyframes cavos-fade { from { opacity:0; } to { opacity:1; } }\n @keyframes cavos-up {\n from { opacity:0; transform:translateY(12px) scale(0.985); }\n to { opacity:1; transform:translateY(0) scale(1); }\n }\n @keyframes cavos-sheet {\n from { transform:translateY(100%); }\n to { transform:translateY(0); }\n }\n @keyframes cavos-spin {\n from { transform:rotate(0deg); } to { transform:rotate(360deg); }\n }\n @keyframes cavos-pop {\n 0% { transform:scale(0.5); opacity:0; }\n 60% { transform:scale(1.12); opacity:1; }\n 100% { transform:scale(1); opacity:1; }\n }\n @keyframes cavos-check-draw {\n from { stroke-dashoffset: 30; }\n to { stroke-dashoffset: 0; }\n }\n @keyframes cavos-ring-glow {\n 0%,100% { box-shadow: 0 0 0 0 rgba(34,197,94,0.4); }\n 50% { box-shadow: 0 0 0 10px rgba(34,197,94,0); }\n }\n .cavos-check-circle {\n animation: cavos-pop 0.45s cubic-bezier(.22,1,.36,1) forwards;\n }\n .cavos-check-path {\n stroke-dasharray: 30;\n stroke-dashoffset: 30;\n animation: cavos-check-draw 0.35s 0.2s cubic-bezier(.22,1,.36,1) forwards;\n }\n .cavos-input-inner:focus { outline:none; }\n .cavos-provider:active { transform:scale(0.99); }\n .cavos-primary-btn:active { transform:scale(0.98); }\n .cavos-otp-input {\n width: 100%;\n text-align: center;\n font-size: 22px;\n font-weight: 600;\n background: transparent;\n border: none;\n outline: none;\n color: inherit;\n font-family: inherit;\n caret-color: transparent;\n }\n .cavos-otp-box {\n transition: border-color 0.15s, box-shadow 0.15s, transform 0.1s;\n }\n .cavos-otp-box-filled {\n transform: scale(1.04);\n }\n .cavos-divider-line {\n flex: 1;\n height: 1px;\n }\n /* Theme-aware interaction styles. The overlay carries data-cavos-theme so\n hovers/focus rings stay legible in both light and dark — the previous\n rgba(0,0,0,…) rules disappeared against the dark background. */\n [data-cavos-theme=\"light\"] .cavos-input-row:focus-within {\n border-color: rgba(0,0,0,0.35) !important;\n box-shadow: 0 0 0 3px rgba(0,0,0,0.06) !important;\n }\n [data-cavos-theme=\"dark\"] .cavos-input-row:focus-within {\n border-color: rgba(255,255,255,0.45) !important;\n box-shadow: 0 0 0 3px rgba(255,255,255,0.08) !important;\n }\n [data-cavos-theme=\"light\"] .cavos-provider:hover { background: rgba(0,0,0,0.035) !important; }\n [data-cavos-theme=\"dark\"] .cavos-provider:hover { background: rgba(255,255,255,0.07) !important; }\n [data-cavos-theme=\"light\"] .cavos-close:hover { background: rgba(0,0,0,0.05) !important; }\n [data-cavos-theme=\"dark\"] .cavos-close:hover { background: rgba(255,255,255,0.08) !important; }\n [data-cavos-theme=\"light\"] .cavos-sub-btn:hover { color: rgba(0,0,0,0.6) !important; }\n [data-cavos-theme=\"dark\"] .cavos-sub-btn:hover { color: rgba(255,255,255,0.65) !important; }\n [data-cavos-theme=\"light\"] .cavos-submit-btn:hover { color: rgba(0,0,0,0.8) !important; }\n [data-cavos-theme=\"dark\"] .cavos-submit-btn:hover { color: rgba(255,255,255,0.85) !important; }\n [data-cavos-theme=\"light\"] .cavos-primary-btn:hover { opacity: 0.88; }\n [data-cavos-theme=\"dark\"] .cavos-primary-btn:hover { opacity: 0.9; }\n [data-cavos-theme=\"light\"] .cavos-divider-line { background: rgba(0,0,0,0.08); }\n [data-cavos-theme=\"dark\"] .cavos-divider-line { background: rgba(255,255,255,0.1); }\n `;\n document.head.appendChild(el);\n}\n\n// ─── Icons ────────────────────────────────────────────────────────────────────\n\nconst GoogleIcon = () => (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\n <path d=\"M17.64 9.2c0-.637-.057-1.251-.164-1.84H9v3.481h4.844c-.209 1.125-.843 2.078-1.796 2.717v2.258h2.908c1.702-1.567 2.684-3.875 2.684-6.615z\" fill=\"#4285F4\"/>\n <path d=\"M9 18c2.43 0 4.467-.806 5.956-2.184l-2.908-2.258c-.806.54-1.837.86-3.048.86-2.344 0-4.328-1.584-5.036-3.711H.957v2.332A8.997 8.997 0 009 18z\" fill=\"#34A853\"/>\n <path d=\"M3.964 10.707A5.41 5.41 0 013.682 9c0-.593.102-1.17.282-1.707V4.961H.957A8.996 8.996 0 000 9c0 1.452.348 2.827.957 4.039l3.007-2.332z\" fill=\"#FBBC05\"/>\n <path d=\"M9 3.58c1.321 0 2.508.454 3.44 1.345l2.582-2.58C13.463.891 11.426 0 9 0A8.997 8.997 0 00.957 4.961L3.964 7.293C4.672 5.163 6.656 3.58 9 3.58z\" fill=\"#EA4335\"/>\n </svg>\n);\n\nconst AppleIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 814 1000\" fill=\"currentColor\">\n <path d=\"M788.1 340.9c-5.8 4.5-108.2 62.2-108.2 190.5 0 148.4 130.3 200.9 134.2 202.2-.6 3.2-20.7 71.9-68.7 141.9-42.8 61.6-87.5 123.1-155.5 123.1s-85.5-39.5-164-39.5c-76 0-103.7 40.8-165.9 40.8s-105-57.8-155.5-127.4C46 790.7 0 663 0 541.8c0-194.3 126.4-297.5 250.8-297.5 66.1 0 121.2 43.4 162.7 43.4 39.5 0 101.1-46 176.3-46 28.5 0 130.9 2.6 198.3 99.2zm-234-181.5c31.1-36.9 53.1-88.1 53.1-139.3 0-7.1-.6-14.3-1.9-20.1-50.6 1.9-110.8 33.7-147.1 75.8-28.5 32.4-55.1 83.6-55.1 135.5 0 7.8 1.3 15.6 1.9 18.1 3.2.6 8.4 1.3 13.6 1.3 45.4 0 102.5-30.4 135.5-71.3z\"/>\n </svg>\n);\n\nconst EmailIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\"/>\n <path d=\"m22 7-8.97 5.7a1.94 1.94 0 01-2.06 0L2 7\"/>\n </svg>\n);\n\nconst CavosLogo = ({ invert }: { invert?: boolean }) => (\n <img src={`data:image/png;base64,${cavosLogoBase64}`} alt=\"Cavos\" style={{ width: 'auto', height: '16px', objectFit: 'contain', opacity: 0.55, flexShrink: 0, filter: invert ? 'invert(1)' : 'none' }} />\n);\n\nfunction Spinner({ size = 16, color = '#888' }: { size?: number; color?: string }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\"\n style={{ animation: 'cavos-spin 0.75s linear infinite', flexShrink: 0 }}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke={color} strokeOpacity=\"0.2\" strokeWidth=\"2.5\"/>\n <path d=\"M12 2a10 10 0 0110 10\" stroke={color} strokeWidth=\"2.5\" strokeLinecap=\"round\"/>\n </svg>\n );\n}\n\n// ─── Mobile detection hook ────────────────────────────────────────────────────\n\nfunction useIsMobile() {\n const [isMobile, setIsMobile] = useState(false);\n useEffect(() => {\n const mq = window.matchMedia('(max-width: 640px)');\n setIsMobile(mq.matches);\n const handler = (e: MediaQueryListEvent) => setIsMobile(e.matches);\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n }, []);\n return isMobile;\n}\n\n// ─── Style helpers ────────────────────────────────────────────────────────────\n\nconst FONT = '-apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif';\n\nfunction baseOverlay(isMobile: boolean): CSSProperties {\n return {\n position: 'fixed', inset: 0,\n background: 'rgba(0,0,0,0.5)',\n backdropFilter: 'blur(10px)',\n WebkitBackdropFilter: 'blur(10px)',\n zIndex: 9999,\n display: 'flex',\n alignItems: isMobile ? 'flex-end' : 'center',\n justifyContent: 'center',\n padding: isMobile ? '0' : '16px',\n animation: 'cavos-fade 0.18s ease',\n fontFamily: FONT,\n };\n}\n\nfunction lightCard(isMobile: boolean, bg: string): CSSProperties {\n return isMobile ? {\n background: bg,\n borderRadius: '20px 20px 0 0',\n width: '100%',\n maxWidth: '100%',\n boxShadow: '0 -8px 40px rgba(0,0,0,0.18)',\n animation: 'cavos-sheet 0.32s cubic-bezier(0.22,1,0.36,1)',\n overflow: 'hidden',\n } : {\n background: bg,\n borderRadius: '22px',\n width: '100%',\n maxWidth: '400px',\n boxShadow: '0 24px 60px rgba(0,0,0,0.22), 0 0 0 1px rgba(0,0,0,0.05)',\n animation: 'cavos-up 0.25s cubic-bezier(0.22,1,0.36,1)',\n overflow: 'hidden',\n };\n}\n\nfunction providerBtn(textColor: string): CSSProperties {\n const isLight = textColor === '#111111' || textColor === '#111';\n return {\n width: '100%',\n display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '10px',\n padding: '12px 16px',\n background: isLight ? '#fff' : 'rgba(255,255,255,0.04)',\n border: `1px solid ${isLight ? 'rgba(0,0,0,0.12)' : 'rgba(255,255,255,0.12)'}`,\n borderRadius: '12px',\n cursor: 'pointer',\n fontSize: '14px',\n fontWeight: 500,\n color: textColor,\n fontFamily: 'inherit',\n transition: 'background 0.15s, transform 0.1s, border-color 0.15s',\n position: 'relative',\n };\n}\n\nfunction footerBar(textColor: string): CSSProperties {\n const isLight = textColor === '#111111' || textColor === '#111';\n return {\n borderTop: `1px solid ${isLight ? 'rgba(0,0,0,0.06)' : 'rgba(255,255,255,0.06)'}`,\n padding: '12px 20px',\n display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '5px',\n fontSize: '11px',\n color: isLight ? 'rgba(0,0,0,0.28)' : 'rgba(255,255,255,0.28)',\n };\n}\n\nfunction closeBtn(textColor: string): CSSProperties {\n return {\n position: 'absolute', top: '16px', right: '16px',\n width: '28px', height: '28px', borderRadius: '50%',\n border: 'none', background: 'transparent',\n cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center',\n color: textColor === '#111111' || textColor === '#111' ? 'rgba(0,0,0,0.3)' : 'rgba(255,255,255,0.4)',\n padding: 0, transition: 'background 0.15s',\n };\n}\n\nfunction mobileHandle(): CSSProperties {\n return {\n width: '36px', height: '4px', borderRadius: '2px',\n background: 'rgba(0,0,0,0.15)', margin: '12px auto 0',\n };\n}\n\nconst CloseX = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n);\n\n// ─── Main component ───────────────────────────────────────────────────────────\n\nexport function CavosAuthModal({\n open,\n onClose,\n appName,\n providers = ['google', 'apple', 'email'],\n emailMode = 'magic-link',\n primaryColor = '#0A0908',\n theme = 'light',\n}: CavosAuthModalProps) {\n const {\n login,\n sendMagicLink,\n sendOtp,\n verifyOtp,\n isAuthenticated,\n address,\n walletStatus,\n authError,\n clearAuthError,\n resendDeviceApproval,\n recover,\n } = useCavos();\n const isMobile = useIsMobile();\n\n // Theme-derived values\n const isLight = theme !== 'dark';\n const backgroundColor = isLight ? '#ffffff' : '#111111';\n const textColor = isLight ? '#111111' : '#ffffff';\n const subTextColor = isLight ? 'rgba(0,0,0,0.4)' : 'rgba(255,255,255,0.4)';\n const inputBg = isLight ? '#fff' : 'rgba(255,255,255,0.06)';\n const inputBorder = isLight ? '1px solid rgba(0,0,0,0.12)' : '1px solid rgba(255,255,255,0.12)';\n const errBg = isLight ? 'rgba(239,68,68,0.06)' : 'rgba(239,68,68,0.08)';\n const errColor = isLight ? '#dc2626' : '#f87171';\n const errBorder = isLight ? 'rgba(239,68,68,0.18)' : 'rgba(239,68,68,0.2)';\n const card = lightCard(isMobile, backgroundColor);\n const overlay = baseOverlay(isMobile);\n const handle = mobileHandle();\n const footer = footerBar(textColor);\n const close = closeBtn(textColor);\n const pBtn = providerBtn(textColor);\n\n const [screen, setScreen] = useState<Screen>('select');\n const [email, setEmail] = useState('');\n const [otpCode, setOtpCode] = useState('');\n const [error, setError] = useState('');\n const [busy, setBusy] = useState(false);\n const [deployState, setDeployState] = useState<'loading' | 'done'>('loading');\n const [resendCountdown, setResendCountdown] = useState(0);\n const [deviceResendBusy, setDeviceResendBusy] = useState(false);\n const [recoverCode, setRecoverCode] = useState('');\n const [recoverBusy, setRecoverBusy] = useState(false);\n\n const doneHandledRef = useRef(false);\n const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n // One ref per OTP box for focus management / auto-advance.\n const otpBoxRefs = useRef<Array<HTMLInputElement | null>>([null, null, null, null, null, null]);\n\n // Segmented OTP input helpers: keep `otpCode` (6-digit string) as the single\n // source of truth, drive focus by index, and handle paste/keystrokes cleanly.\n const setOtpDigit = (i: number, raw: string) => {\n const digit = raw.replace(/\\D/g, '').slice(-1);\n setOtpCode(prev => {\n const chars = prev.split('');\n while (chars.length < 6) chars.push('');\n chars[i] = digit;\n const next = chars.join('').slice(0, 6);\n // Auto-advance to the next empty box when a digit is typed.\n if (digit && i < 5) {\n const target = i + 1;\n otpBoxRefs.current[target]?.focus();\n }\n return next;\n });\n };\n\n const onOtpKeyDown = (i: number, e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace' && !otpCode[i] && i > 0) {\n // Empty box + backspace → move focus back instead of clearing nothing.\n otpBoxRefs.current[i - 1]?.focus();\n e.preventDefault();\n } else if (e.key === 'ArrowLeft' && i > 0) {\n otpBoxRefs.current[i - 1]?.focus();\n e.preventDefault();\n } else if (e.key === 'ArrowRight' && i < 5) {\n otpBoxRefs.current[i + 1]?.focus();\n e.preventDefault();\n }\n };\n\n const onOtpPaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n const text = e.clipboardData.getData('text').replace(/\\D/g, '').slice(0, 6);\n if (!text) return;\n e.preventDefault();\n setOtpCode(text);\n // Focus the box after the last pasted digit (or the last box).\n const focusIdx = Math.min(text.length, 5);\n otpBoxRefs.current[focusIdx]?.focus();\n };\n\n useEffect(() => { injectStyles(); }, []);\n\n // When the provider surfaces an unrecoverable connect error (e.g. a failed\n // OAuth callback), drop the user back on the provider-selection screen with\n // the message + a retry, instead of leaving the modal closed with no feedback.\n useEffect(() => {\n if (!authError) return;\n setBusy(false);\n setDeployState('loading');\n if (screen !== 'device-approval') setScreen('select');\n setError(authError);\n // The provider owns the error; once surfaced here it's \"consumed\" by the UI.\n clearAuthError();\n }, [authError, clearAuthError, screen]);\n\n const triggerDone = useCallback((addr: string) => {\n if (doneHandledRef.current) return;\n doneHandledRef.current = true;\n\n setScreen('deploying');\n setDeployState('done');\n\n closeTimerRef.current = setTimeout(() => {\n onClose();\n setScreen('select');\n setDeployState('loading');\n setEmail(''); setOtpCode(''); setError('');\n doneHandledRef.current = false;\n }, 1600);\n // addr unused beyond guarding the transition; keep the param for clarity.\n void addr;\n }, [onClose]);\n\n // Show the \"deploying\" screen whenever a deploy is in progress (e.g. while\n // returning from an OAuth redirect), or once authenticated, then flip to\n // \"done\" when the account is ready.\n useEffect(() => {\n if (!open) return;\n\n if (walletStatus.isDeploying && screen !== 'deploying' && screen !== 'verify') {\n setScreen('deploying');\n setDeployState('loading');\n doneHandledRef.current = false;\n }\n\n if (isAuthenticated && address && walletStatus.isReady) {\n triggerDone(address);\n }\n\n // This device needs approval: show the \"check your email\" screen. Don't\n // override the recover screen — the user navigated there intentionally from\n // device-approval to restore access with their recovery phrase.\n if (walletStatus.awaitingApproval && screen !== 'device-approval' && screen !== 'recover') {\n setScreen('device-approval');\n doneHandledRef.current = false;\n }\n }, [open, isAuthenticated, address, walletStatus.isReady, walletStatus.isDeploying, walletStatus.awaitingApproval, screen, triggerDone]);\n\n useEffect(() => () => {\n if (closeTimerRef.current) clearTimeout(closeTimerRef.current);\n }, []);\n\n const handleClose = () => {\n if (screen === 'deploying') return;\n setScreen('select'); setEmail(''); setOtpCode(''); setError('');\n doneHandledRef.current = false;\n onClose();\n };\n\n const handleOAuth = async (provider: 'google' | 'apple') => {\n setError(''); setBusy(true);\n try {\n await login(provider);\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : 'Authentication failed.';\n setError(msg); setBusy(false);\n }\n };\n\n const handleMagicLinkSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!email) return;\n setError(''); setBusy(true);\n try {\n await sendMagicLink(email);\n setScreen('verify');\n setResendCountdown(60);\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : 'Failed to send magic link.');\n } finally {\n setBusy(false);\n }\n };\n\n const handleOtpRequestSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!email) return;\n setError(''); setBusy(true);\n try {\n await sendOtp(email);\n setOtpCode('');\n setScreen('otp-code');\n setResendCountdown(60);\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : 'Failed to send code.');\n } finally {\n setBusy(false);\n }\n };\n\n const handleOtpVerifySubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!email || otpCode.length !== 6) return;\n setError(''); setBusy(true);\n try {\n await verifyOtp(email, otpCode);\n setScreen('deploying');\n setDeployState('loading');\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : 'Invalid or expired code.');\n setBusy(false);\n }\n };\n\n const handleResend = async () => {\n if (resendCountdown > 0) return;\n setError('');\n try {\n if (emailMode === 'otp') {\n await sendOtp(email);\n setOtpCode('');\n } else {\n await sendMagicLink(email);\n }\n setResendCountdown(60);\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : 'Failed to resend.');\n }\n };\n\n useEffect(() => {\n if (resendCountdown <= 0) return;\n const t = setTimeout(() => setResendCountdown(c => c - 1), 1000);\n return () => clearTimeout(t);\n }, [resendCountdown]);\n\n if (!open) return null;\n\n // ── Device approval (waiting for the owner to approve from another device) ─\n\n const handleDeviceResend = async () => {\n if (resendCountdown > 0 || deviceResendBusy) return;\n setDeviceResendBusy(true);\n setError('');\n try {\n await resendDeviceApproval();\n setResendCountdown(60);\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : 'Failed to resend. Try again.');\n } finally {\n setDeviceResendBusy(false);\n }\n };\n\n if (screen === 'device-approval') {\n // The provider nulls pendingRequestId when the request expires (while the\n // device is still awaiting approval) — that's our signal to switch copy.\n const expired = walletStatus.awaitingApproval && !walletStatus.pendingRequestId;\n return (\n <div style={overlay} data-cavos-theme={theme} role=\"dialog\" aria-modal>\n <div style={{ ...card, position: 'relative' }}>\n {isMobile && <div style={handle} />}\n <button className=\"cavos-close\" style={close} onClick={handleClose} aria-label=\"Close\"><CloseX /></button>\n <div style={{ padding: isMobile ? '28px 24px 32px' : '48px 24px 32px', textAlign: 'center' }}>\n <div style={{ width: 48, height: 48, borderRadius: '50%', margin: '0 auto 16px', background: expired ? 'rgba(239,68,68,0.08)' : 'rgba(59,130,246,0.08)', border: `1px solid ${expired ? 'rgba(239,68,68,0.18)' : 'rgba(59,130,246,0.18)'}`, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={expired ? '#dc2626' : '#3b82f6'} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"5\" y=\"2\" width=\"14\" height=\"20\" rx=\"2.5\" />\n <path d=\"M12 18h.01\" />\n </svg>\n </div>\n <h2 style={{ margin: '0 0 8px', fontSize: '17px', fontWeight: 600, color: textColor, letterSpacing: '-0.02em' }}>\n {expired ? 'Approval link expired' : 'Approve this device'}\n </h2>\n <p style={{ margin: '0 0 20px', fontSize: '13px', color: subTextColor, lineHeight: 1.55 }}>\n {expired\n ? 'The approval link is no longer valid. Request a new one below.'\n : <>For your security, we sent an email to approve this device.{appName ? <> Open it on a device where you're already signed in to your {appName} account.</> : null}</>}\n </p>\n {error && <div style={{ background: errBg, border: `1px solid ${errBorder}`, borderRadius: '10px', padding: '9px 13px', fontSize: '13px', color: errColor, marginBottom: '14px' }}>{error}</div>}\n {expired ? (\n <button className=\"cavos-primary-btn\" style={{ width: '100%', padding: '12px', borderRadius: '12px', border: 'none', background: primaryColor, color: '#fff', fontSize: '14px', fontWeight: 500, cursor: 'pointer', fontFamily: 'inherit', display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '8px', opacity: deviceResendBusy ? 0.65 : 1 }} onClick={handleDeviceResend} disabled={deviceResendBusy}>\n {deviceResendBusy && <Spinner size={15} color=\"#fff\" />}\n {deviceResendBusy ? 'Sending…' : 'Request a new link'}\n </button>\n ) : (\n <div style={{ background: isLight ? 'rgba(0,0,0,0.03)' : 'rgba(255,255,255,0.04)', border: `1px solid ${isLight ? 'rgba(0,0,0,0.06)' : 'rgba(255,255,255,0.06)'}`, borderRadius: '12px', padding: '14px 16px', display: 'flex', alignItems: 'center', gap: 10, justifyContent: 'center', marginBottom: '14px' }}>\n <Spinner size={14} color={subTextColor} />\n <span style={{ fontSize: '12px', color: subTextColor }}>Waiting for approval…</span>\n </div>\n )}\n {!expired && (\n <button className=\"cavos-sub-btn\" style={{ background: 'none', border: 'none', cursor: resendCountdown > 0 ? 'default' : 'pointer', fontSize: '13px', color: subTextColor, width: '100%', textAlign: 'center', padding: 0, fontFamily: 'inherit', transition: 'color 0.15s', opacity: resendCountdown > 0 ? 0.6 : 1 }} onClick={handleDeviceResend} disabled={resendCountdown > 0 || deviceResendBusy}>\n {resendCountdown > 0 ? `Resend email in ${resendCountdown}s` : 'Resend approval email'}\n </button>\n )}\n <button className=\"cavos-sub-btn\" style={{ background: 'none', border: 'none', cursor: 'pointer', fontSize: '13px', color: subTextColor, width: '100%', textAlign: 'center', padding: '14px 0 0', fontFamily: 'inherit', transition: 'color 0.15s' }} onClick={() => { setScreen('recover'); setError(''); }}>\n Sign in with recovery phrase instead\n </button>\n </div>\n <div style={footer}><CavosLogo invert={!isLight} /><span>Secured by Cavos</span></div>\n </div>\n </div>\n );\n }\n\n // ── Recover (lost all devices — restore access with the recovery code) ────\n\n const handleRecoverSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!recoverCode.trim()) return;\n setRecoverBusy(true);\n setError('');\n try {\n await recover(recoverCode);\n // The provider flips to ready; the existing effect drives triggerDone.\n setScreen('deploying');\n setDeployState('loading');\n } catch (e2) {\n setError(e2 instanceof Error ? e2.message : 'Sign-in failed. Check your recovery phrase and try again.');\n setRecoverBusy(false);\n }\n };\n\n if (screen === 'recover') {\n return (\n <div style={overlay} data-cavos-theme={theme} role=\"dialog\" aria-modal onClick={e => { if (e.target === e.currentTarget) handleClose(); }}>\n <div style={{ ...card, position: 'relative' }}>\n {isMobile && <div style={handle} />}\n <button className=\"cavos-close\" style={{ ...close, left: '16px', right: 'auto' }} onClick={() => { setScreen('device-approval'); setError(''); setRecoverCode(''); }} aria-label=\"Back\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\n </button>\n <button className=\"cavos-close\" style={close} onClick={handleClose} aria-label=\"Close\"><CloseX /></button>\n <div style={{ padding: isMobile ? '28px 22px 32px' : '52px 22px 22px' }}>\n <h2 style={{ margin: '0 0 6px', fontSize: '17px', fontWeight: 600, color: textColor, letterSpacing: '-0.02em', textAlign: 'center' }}>Sign in with recovery phrase</h2>\n <p style={{ margin: '0 0 20px', fontSize: '13px', color: subTextColor, textAlign: 'center', lineHeight: 1.5 }}>\n Enter the recovery phrase you saved when you set up this account.\n </p>\n {error && <div style={{ background: errBg, border: `1px solid ${errBorder}`, borderRadius: '10px', padding: '10px 14px', fontSize: '13px', color: errColor, marginBottom: '14px' }}>{error}</div>}\n <form onSubmit={handleRecoverSubmit} style={{ display: 'flex', flexDirection: 'column', gap: '10px' }}>\n <textarea\n className=\"cavos-input-inner\"\n style={{ width: '100%', padding: '12px 14px', border: inputBorder, borderRadius: '12px', fontSize: '14px', color: textColor, background: inputBg, fontFamily: 'inherit', boxSizing: 'border-box', resize: 'vertical', minHeight: 72, lineHeight: 1.5 }}\n placeholder=\"Enter your recovery phrase\"\n value={recoverCode}\n onChange={e => setRecoverCode(e.target.value)}\n required\n disabled={recoverBusy}\n autoFocus\n />\n <button type=\"submit\" className=\"cavos-primary-btn\" style={{ width: '100%', padding: '12px', marginTop: '4px', borderRadius: '12px', border: 'none', background: primaryColor, color: '#fff', fontSize: '14px', fontWeight: 500, cursor: 'pointer', fontFamily: 'inherit', display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '8px', transition: 'opacity 0.15s, transform 0.1s', opacity: recoverBusy ? 0.65 : 1 }} disabled={recoverBusy}>\n {recoverBusy && <Spinner size={15} color=\"#fff\" />}\n {recoverBusy ? 'Restoring access…' : 'Restore access'}\n </button>\n </form>\n </div>\n <div style={footer}><CavosLogo invert={!isLight} /><span>Secured by Cavos</span></div>\n </div>\n </div>\n );\n }\n\n // ── Deploying ─────────────────────────────────────────────────────────────\n\n if (screen === 'deploying') {\n const isDone = deployState === 'done';\n return (\n <div style={overlay} data-cavos-theme={theme} role=\"dialog\" aria-modal>\n <div style={card}>\n {isMobile && <div style={handle} />}\n <div style={{ padding: '52px 28px 44px', display: 'flex', flexDirection: 'column', alignItems: 'center', textAlign: 'center', gap: '16px' }}>\n {isDone ? (\n <div className=\"cavos-check-circle\" style={{ width: 64, height: 64, borderRadius: '50%', background: 'rgba(34,197,94,0.12)', border: '1.5px solid rgba(34,197,94,0.35)', display: 'flex', alignItems: 'center', justifyContent: 'center', animation: 'cavos-ring-glow 1.5s ease-out' }}>\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\">\n <polyline className=\"cavos-check-path\" points=\"20 6 9 17 4 12\" stroke=\"#22c55e\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </div>\n ) : (\n <div style={{ width: 64, height: 64, borderRadius: '50%', background: isLight ? 'rgba(0,0,0,0.04)' : 'rgba(255,255,255,0.04)', border: `1.5px solid ${isLight ? 'rgba(0,0,0,0.08)' : 'rgba(255,255,255,0.08)'}`, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <Spinner size={26} color={isLight ? 'rgba(0,0,0,0.4)' : 'rgba(255,255,255,0.6)'} />\n </div>\n )}\n <div>\n <h2 style={{ margin: 0, fontSize: '17px', fontWeight: 600, color: textColor, letterSpacing: '-0.02em' }}>\n {isDone ? \"You're all set\" : 'Setting up your account'}\n </h2>\n <p style={{ margin: '6px 0 0', fontSize: '13px', color: subTextColor }}>\n {isDone ? 'Your account is ready' : 'This only takes a moment…'}\n </p>\n </div>\n </div>\n <div style={footer}><CavosLogo invert={!isLight} /><span>Secured by Cavos</span></div>\n </div>\n </div>\n );\n }\n\n // ── Check your inbox ───────────────────────────────────────────────────────\n\n if (screen === 'verify') {\n return (\n <div style={overlay} data-cavos-theme={theme} role=\"dialog\" aria-modal onClick={e => { if (e.target === e.currentTarget) handleClose(); }}>\n <div style={{ ...card, position: 'relative' }}>\n {isMobile && <div style={handle} />}\n <button className=\"cavos-close\" style={close} onClick={handleClose} aria-label=\"Close\"><CloseX /></button>\n <div style={{ padding: isMobile ? '28px 24px 32px' : '40px 24px 24px', textAlign: 'center' }}>\n <div style={{ width: 48, height: 48, borderRadius: '50%', margin: '0 auto 16px', background: 'rgba(34,197,94,0.08)', border: '1px solid rgba(34,197,94,0.18)', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#22c55e\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\"/>\n </svg>\n </div>\n <h2 style={{ margin: '0 0 8px', fontSize: '17px', fontWeight: 600, color: textColor, letterSpacing: '-0.02em' }}>Check your inbox</h2>\n <p style={{ margin: '0 0 22px', fontSize: '13px', color: subTextColor, lineHeight: 1.55 }}>\n We sent a sign-in link to <strong style={{ color: textColor, fontWeight: 500 }}>{email}</strong>.<br />Open it on this device to continue.\n </p>\n {error && <div style={{ background: errBg, border: `1px solid ${errBorder}`, borderRadius: '10px', padding: '9px 13px', fontSize: '13px', color: errColor, marginBottom: '14px' }}>{error}</div>}\n <button className=\"cavos-primary-btn\" style={{ width: '100%', padding: '12px', borderRadius: '12px', border: 'none', background: resendCountdown > 0 ? (isLight ? 'rgba(0,0,0,0.06)' : 'rgba(255,255,255,0.08)') : primaryColor, color: resendCountdown > 0 ? subTextColor : '#fff', fontSize: '14px', fontWeight: 500, cursor: resendCountdown > 0 ? 'default' : 'pointer', fontFamily: 'inherit', transition: 'opacity 0.15s', marginBottom: '8px' }} onClick={handleResend} disabled={resendCountdown > 0}>\n {resendCountdown > 0 ? `Resend in ${resendCountdown}s` : 'Resend link'}\n </button>\n <button className=\"cavos-sub-btn\" style={{ background: 'none', border: 'none', cursor: 'pointer', fontSize: '13px', color: subTextColor, width: '100%', textAlign: 'center', padding: '8px 0 0', fontFamily: 'inherit', transition: 'color 0.15s' }} onClick={() => { setScreen('magic-link'); setError(''); }}>\n Use a different email\n </button>\n </div>\n <div style={footer}><CavosLogo invert={!isLight} /><span>Secured by Cavos</span></div>\n </div>\n </div>\n );\n }\n\n // ── OTP code entry ─────────────────────────────────────────────────────────\n\n if (screen === 'otp-code') {\n return (\n <div style={overlay} data-cavos-theme={theme} role=\"dialog\" aria-modal onClick={e => { if (e.target === e.currentTarget) handleClose(); }}>\n <div style={{ ...card, position: 'relative' }}>\n {isMobile && <div style={handle} />}\n <button className=\"cavos-close\" style={{ ...close, left: '16px', right: 'auto' }} onClick={() => { setScreen('magic-link'); setError(''); setOtpCode(''); }} aria-label=\"Back\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\n </button>\n <button className=\"cavos-close\" style={close} onClick={handleClose} aria-label=\"Close\"><CloseX /></button>\n <div style={{ padding: isMobile ? '28px 22px 32px' : '52px 22px 22px', textAlign: 'center' }}>\n <h2 style={{ margin: '0 0 8px', fontSize: '17px', fontWeight: 600, color: textColor, letterSpacing: '-0.02em' }}>Enter your code</h2>\n <p style={{ margin: '0 0 20px', fontSize: '13px', color: subTextColor, lineHeight: 1.5 }}>\n We sent a 6-digit code to <strong style={{ color: textColor, fontWeight: 500 }}>{email}</strong>.\n </p>\n {error && <div style={{ background: errBg, border: `1px solid ${errBorder}`, borderRadius: '10px', padding: '10px 14px', fontSize: '13px', color: errColor, marginBottom: '14px', textAlign: 'left' }}>{error}</div>}\n <form onSubmit={handleOtpVerifySubmit} style={{ display: 'flex', flexDirection: 'column', gap: '16px' }}>\n <div style={{ display: 'flex', gap: '8px', justifyContent: 'center' }} onPaste={onOtpPaste}>\n {[0, 1, 2, 3, 4, 5].map(i => (\n <input\n key={i}\n ref={el => { otpBoxRefs.current[i] = el; }}\n className={`cavos-input-inner cavos-otp-box ${otpCode[i] ? 'cavos-otp-box-filled' : ''}`}\n style={{\n width: '44px',\n height: '52px',\n padding: 0,\n border: inputBorder,\n borderRadius: '12px',\n fontSize: '22px',\n fontWeight: 600,\n color: textColor,\n background: inputBg,\n fontFamily: 'inherit',\n boxSizing: 'border-box',\n textAlign: 'center',\n }}\n type=\"text\"\n inputMode=\"numeric\"\n autoComplete={i === 0 ? 'one-time-code' : 'off'}\n maxLength={1}\n value={otpCode[i] ?? ''}\n onChange={e => setOtpDigit(i, e.target.value)}\n onKeyDown={e => onOtpKeyDown(i, e)}\n onFocus={e => e.target.select()}\n disabled={busy}\n autoFocus={i === 0}\n />\n ))}\n </div>\n <button type=\"submit\" className=\"cavos-primary-btn\" style={{ width: '100%', padding: '12px', marginTop: '4px', borderRadius: '12px', border: 'none', background: primaryColor, color: '#fff', fontSize: '14px', fontWeight: 500, cursor: 'pointer', fontFamily: 'inherit', display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '8px', transition: 'opacity 0.15s, transform 0.1s', opacity: busy || otpCode.length !== 6 ? 0.65 : 1 }} disabled={busy || otpCode.length !== 6}>\n {busy && <Spinner size={15} color=\"#fff\" />}\n {busy ? 'Verifying…' : 'Continue'}\n </button>\n </form>\n <button className=\"cavos-primary-btn\" style={{ width: '100%', padding: '12px', borderRadius: '12px', border: 'none', background: resendCountdown > 0 ? (isLight ? 'rgba(0,0,0,0.06)' : 'rgba(255,255,255,0.08)') : 'transparent', color: resendCountdown > 0 ? subTextColor : primaryColor, fontSize: '14px', fontWeight: 500, cursor: resendCountdown > 0 ? 'default' : 'pointer', fontFamily: 'inherit', transition: 'opacity 0.15s', marginTop: '8px' }} onClick={handleResend} disabled={resendCountdown > 0 || busy}>\n {resendCountdown > 0 ? `Resend in ${resendCountdown}s` : 'Resend code'}\n </button>\n <button className=\"cavos-sub-btn\" style={{ background: 'none', border: 'none', cursor: 'pointer', fontSize: '13px', color: subTextColor, width: '100%', textAlign: 'center', padding: '8px 0 0', fontFamily: 'inherit', transition: 'color 0.15s' }} onClick={() => { setScreen('magic-link'); setError(''); setOtpCode(''); }}>\n Use a different email\n </button>\n </div>\n <div style={footer}><CavosLogo invert={!isLight} /><span>Secured by Cavos</span></div>\n </div>\n </div>\n );\n }\n\n // ── Email form ─────────────────────────────────────────────────────────────\n\n if (screen === 'magic-link') {\n const isOtp = emailMode === 'otp';\n return (\n <div style={overlay} data-cavos-theme={theme} role=\"dialog\" aria-modal onClick={e => { if (e.target === e.currentTarget) handleClose(); }}>\n <div style={{ ...card, position: 'relative' }}>\n {isMobile && <div style={handle} />}\n <button className=\"cavos-close\" style={{ ...close, left: '16px', right: 'auto' }} onClick={() => { setScreen('select'); setError(''); }} aria-label=\"Back\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\n </button>\n <button className=\"cavos-close\" style={close} onClick={handleClose} aria-label=\"Close\"><CloseX /></button>\n <div style={{ padding: isMobile ? '28px 22px 32px' : '52px 22px 22px' }}>\n <h2 style={{ margin: '0 0 6px', fontSize: '17px', fontWeight: 600, color: textColor, letterSpacing: '-0.02em', textAlign: 'center' }}>Sign in with email</h2>\n <p style={{ margin: '0 0 20px', fontSize: '13px', color: subTextColor, textAlign: 'center', lineHeight: 1.5 }}>\n {isOtp ? \"We'll send a secure sign-in code to your inbox.\" : \"We'll send a secure sign-in link to your inbox.\"}\n </p>\n {error && <div style={{ background: errBg, border: `1px solid ${errBorder}`, borderRadius: '10px', padding: '10px 14px', fontSize: '13px', color: errColor, marginBottom: '14px' }}>{error}</div>}\n <form onSubmit={isOtp ? handleOtpRequestSubmit : handleMagicLinkSubmit} style={{ display: 'flex', flexDirection: 'column', gap: '10px' }}>\n <input className=\"cavos-input-inner\" style={{ width: '100%', padding: '12px 14px', border: inputBorder, borderRadius: '12px', fontSize: '14px', color: textColor, background: inputBg, fontFamily: 'inherit', boxSizing: 'border-box', transition: 'border-color 0.15s' }} type=\"email\" placeholder=\"your@email.com\" value={email} onChange={e => setEmail(e.target.value)} required disabled={busy} autoFocus />\n <button type=\"submit\" className=\"cavos-primary-btn\" style={{ width: '100%', padding: '12px', marginTop: '4px', borderRadius: '12px', border: 'none', background: primaryColor, color: '#fff', fontSize: '14px', fontWeight: 500, cursor: 'pointer', fontFamily: 'inherit', display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '8px', transition: 'opacity 0.15s, transform 0.1s', opacity: busy ? 0.65 : 1 }} disabled={busy}>\n {busy && <Spinner size={15} color=\"#fff\" />}\n {busy ? 'Sending…' : (isOtp ? 'Send code' : 'Send magic link')}\n </button>\n </form>\n </div>\n <div style={footer}><CavosLogo invert={!isLight} /><span>Secured by Cavos</span></div>\n </div>\n </div>\n );\n }\n\n // ── Provider selection ─────────────────────────────────────────────────────\n\n const showEmail = providers.includes('email');\n const showGoogle = providers.includes('google');\n const showApple = providers.includes('apple');\n const hasSocial = showGoogle || showApple;\n // Absolute-positioned icon so the label stays optically centered (matches the\n // Privy/Clerk full-width button look) instead of shifting when text changes.\n // No background box — the brand logos render clean, like native sign-in buttons.\n const btnIcon = (icon: React.ReactNode, busyIcon: React.ReactNode, color: string) => (\n <span style={{ position: 'absolute', left: '16px', width: 20, height: 20, display: 'flex', alignItems: 'center', justifyContent: 'center', color, flexShrink: 0 }}>\n {busy ? busyIcon : icon}\n </span>\n );\n\n return (\n <div style={overlay} data-cavos-theme={theme} role=\"dialog\" aria-modal onClick={e => { if (e.target === e.currentTarget) handleClose(); }}>\n <div style={{ ...card, position: 'relative' }}>\n {isMobile && <div style={handle} />}\n <button className=\"cavos-close\" style={close} onClick={handleClose} aria-label=\"Close\"><CloseX /></button>\n\n <div style={{ padding: isMobile ? '24px 20px 32px' : '40px 24px 24px' }}>\n <h2 style={{ margin: '0 0 22px', fontSize: '17px', fontWeight: 600, color: textColor, letterSpacing: '-0.02em', textAlign: 'center' }}>\n {appName ? `Sign in to ${appName}` : 'Log in or sign up'}\n </h2>\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: '10px' }}>\n {showGoogle && (\n <button className=\"cavos-provider\" style={{ ...pBtn, ...(busy ? { opacity: 0.55, cursor: 'not-allowed' } : {}) }} onClick={() => handleOAuth('google')} disabled={busy}>\n {btnIcon(<GoogleIcon />, <Spinner size={14} color=\"#888\" />, '#4285F4')}\n <span>Continue with Google</span>\n </button>\n )}\n\n {showApple && (\n <button className=\"cavos-provider\" style={{ ...pBtn, ...(busy ? { opacity: 0.55, cursor: 'not-allowed' } : {}) }} onClick={() => handleOAuth('apple')} disabled={busy}>\n {btnIcon(<AppleIcon />, <Spinner size={14} color={isLight ? '#111' : '#fff'} />, isLight ? '#111' : '#fff')}\n <span>Continue with Apple</span>\n </button>\n )}\n\n {showEmail && hasSocial && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px', margin: '6px 0 2px' }}>\n <span className=\"cavos-divider-line\" style={{ background: isLight ? 'rgba(0,0,0,0.08)' : 'rgba(255,255,255,0.08)' }} />\n <span style={{ fontSize: '12px', color: subTextColor, textTransform: 'uppercase', letterSpacing: '0.05em' }}>or</span>\n <span className=\"cavos-divider-line\" style={{ background: isLight ? 'rgba(0,0,0,0.08)' : 'rgba(255,255,255,0.08)' }} />\n </div>\n )}\n\n {showEmail && (\n <button className=\"cavos-provider\" style={{ ...pBtn, cursor: busy ? 'not-allowed' : 'pointer' }} onClick={() => setScreen('magic-link')} disabled={busy}>\n {btnIcon(<EmailIcon />, <Spinner size={14} color={subTextColor} />, subTextColor)}\n <span>Continue with email</span>\n </button>\n )}\n </div>\n\n {error && <div style={{ marginTop: '14px', background: errBg, border: `1px solid ${errBorder}`, borderRadius: '10px', padding: '9px 13px', fontSize: '13px', color: errColor }}>{error}</div>}\n\n <p style={{ margin: '18px 0 0', fontSize: '11px', color: subTextColor, textAlign: 'center', lineHeight: 1.55 }}>\n By continuing you agree to the{' '}\n <a href=\"https://cavos.xyz/user-privacy\" target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: isLight ? 'rgba(0,0,0,0.45)' : 'rgba(255,255,255,0.45)', textDecoration: 'underline' }}>Privacy Policy</a>\n{' & '}\n <a href=\"https://cavos.xyz/user-terms\" target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: isLight ? 'rgba(0,0,0,0.45)' : 'rgba(255,255,255,0.45)', textDecoration: 'underline' }}>Terms</a>.\n </p>\n </div>\n\n <div style={footer}><CavosLogo invert={!isLight} /><span>Secured by Cavos</span></div>\n </div>\n </div>\n );\n}\n\n// ─── useCavosAuth hook ────────────────────────────────────────────────────────\n\nexport function useCavosAuth() {\n const { openModal, closeModal, isAuthenticated, address, user, walletStatus, logout } = useCavos();\n return { openModal, closeModal, isAuthenticated, address, user, walletStatus, logout };\n}\n","'use client';\n\nimport {\n createContext,\n useContext,\n useEffect,\n useState,\n useCallback,\n useRef,\n type ReactNode,\n} from 'react';\nimport { Cavos } from '../Cavos';\nimport type { Chain, NetworkEnv, CavosWallet } from '../Cavos';\nimport { CavosSolana } from '../chains/solana/CavosSolana';\nimport type { SolanaNetwork } from '../chains/solana/constants';\nimport { CavosAuth } from '../auth/CavosAuth';\nimport type { Identity } from '../auth/AuthProvider';\nimport type { ChainCall } from '../chains/ChainAdapter';\nimport { HttpRecoveryClient } from '../recovery/HttpRecoveryClient';\nimport { generateRecoveryCode } from '../recovery/BackupSigner';\nimport { CavosAuthModal } from './CavosAuthModal';\n\nexport interface CavosConfig {\n /** Cavos App ID from the dashboard. */\n appId?: string;\n /** Target chain. Defaults to 'starknet'. */\n chain?: Chain;\n /** Environment: 'testnet' (sepolia/devnet) or 'mainnet'. */\n network: NetworkEnv;\n /** Per-app salt so the same user has distinct wallets per app. */\n appSalt: string;\n /** Cavos paymaster API key (sponsors deploy + execute). Required for Starknet. */\n paymasterApiKey?: string;\n /** Override the Cavos auth backend (self-hosted / staging). */\n authBackendUrl?: string;\n /** Override the chain RPC. */\n rpcUrl?: string;\n}\n\nexport interface CavosModalConfig {\n appName?: string;\n appLogo?: string;\n providers?: ('google' | 'apple' | 'email')[];\n /** How the built-in email provider authenticates. Defaults to magic link. */\n emailMode?: 'magic-link' | 'otp';\n primaryColor?: string;\n /** 'light' (default) or 'dark'. */\n theme?: 'light' | 'dark';\n onSuccess?: (address: string) => void;\n}\n\n/** Minimal wallet-status surface the React layer (and modal) needs. */\nexport interface WalletStatus {\n /** True while the device-signer account is being deployed. */\n isDeploying: boolean;\n /** True once deployed and this device is an authorized signer. */\n isReady: boolean;\n /** True if this device still needs approval to operate the wallet. */\n needsDeviceApproval: boolean;\n /** True while waiting for the owner to approve this device from another device. */\n awaitingApproval: boolean;\n /** The pending device-addition request id, when awaitingApproval. */\n pendingRequestId: string | null;\n}\n\nexport interface UserInfo {\n userId: string;\n email?: string;\n provider?: string;\n}\n\nexport interface CavosContextValue {\n /** Open / close the built-in auth modal. */\n openModal: () => void;\n closeModal: () => void;\n isAuthenticated: boolean;\n user: UserInfo | null;\n /** The active chain ('starknet' | 'solana'). */\n chain: Chain;\n /**\n * The raw connected wallet, discriminated by `wallet.chain`. Use this for\n * chain-native calls (e.g. Solana `wallet.execute(amount, dest)`); narrow on\n * `wallet.chain` first. Null until connected.\n */\n wallet: CavosWallet | null;\n address: string | null;\n walletStatus: WalletStatus;\n isLoading: boolean;\n /** Last unrecoverable auth/connect error surfaced to the UI (e.g. a failed\n * OAuth callback). Null while things are healthy. Cleared on a new attempt. */\n authError: string | null;\n /** Clear `authError` (e.g. when the user starts a new login attempt). */\n clearAuthError: () => void;\n /** OAuth social login — opens the provider's hosted flow. */\n login: (provider: 'google' | 'apple') => Promise<void>;\n /** Send a passwordless magic-link email. */\n sendMagicLink: (email: string) => Promise<void>;\n /** Send an email OTP code. */\n sendOtp: (email: string) => Promise<void>;\n /** Verify an email OTP / complete a magic link and deploy the wallet. */\n verifyOtp: (email: string, code: string) => Promise<void>;\n /** Resolve identity from an OAuth callback (?auth_data=…) and deploy. */\n handleCallback: (authData: string) => Promise<void>;\n /** Execute a sponsored (gasless) multicall, signed by the device key. */\n execute: (calls: ChainCall[]) => Promise<{ transactionHash: string }>;\n /** Authorize another device signer on this wallet (sponsored add_signer). */\n addSigner: (pubkey: { x: bigint; y: bigint }) => Promise<{ transactionHash: string }>;\n /** Re-request the device-approval email for the current pending request. */\n resendDeviceApproval: () => Promise<void>;\n /**\n * Register a backup signer derived from `code` on the current account\n * (gasless). The code is generated by the kit and shown to the user once.\n * Resolves with the code so the caller can display it.\n */\n setupRecovery: () => Promise<string>;\n /**\n * Recover access after losing every device. Requires the recovery code. Runs\n * the full Cavos.recover flow and brings the provider to a ready state.\n */\n recover: (code: string) => Promise<void>;\n logout: () => void;\n}\n\nconst CavosContext = createContext<CavosContextValue | null>(null);\n\nexport interface CavosProviderProps {\n config: CavosConfig;\n modal?: CavosModalConfig;\n children: ReactNode;\n}\n\nconst INITIAL_STATUS: WalletStatus = {\n isDeploying: false,\n isReady: false,\n needsDeviceApproval: false,\n awaitingApproval: false,\n pendingRequestId: null,\n};\n\n/**\n * Drop-in Cavos provider. Wrap your app once; descendants call `useCavos()`.\n *\n * <CavosProvider config={{ network: 'sepolia', appSalt, paymasterApiKey }}\n * modal={{ appName: 'My App', theme: 'dark', emailMode: 'otp' }}>\n * <App />\n * </CavosProvider>\n *\n * Behind the scenes: login (social / email) resolves a stable identity, the kit\n * deploys a device-signer smart account gaslessly, and `execute()` submits\n * gasless multicalls signed silently by the browser's device key.\n */\nexport function CavosProvider({ config, modal, children }: CavosProviderProps) {\n const [auth] = useState(\n () => new CavosAuth({ appId: config.appId, backendUrl: config.authBackendUrl }),\n );\n const [cavos, setCavos] = useState<CavosWallet | null>(null);\n const [identity, setIdentity] = useState<Identity | null>(null);\n const [walletStatus, setWalletStatus] = useState<WalletStatus>(INITIAL_STATUS);\n const [isLoading, setIsLoading] = useState(false);\n const [authError, setAuthError] = useState<string | null>(null);\n const [modalOpen, setModalOpen] = useState(false);\n /** App name/logo fetched from the backend; overrides manual modal props when present. */\n const [branding, setBranding] = useState<{ appName?: string; appLogo?: string }>({});\n\n // Keep the latest config for callbacks that run after async gaps.\n const configRef = useRef(config);\n useEffect(() => {\n configRef.current = config;\n }, [config]);\n\n // Fetch app branding (name, logo) from the backend so the modal shows the\n // integrating app's identity without manual props.\n useEffect(() => {\n if (!config.appId || typeof window === 'undefined') return;\n const base = config.authBackendUrl ?? 'https://cavos.xyz';\n fetch(`${base}/api/oauth/firebase/app-branding?app_id=${encodeURIComponent(config.appId)}`)\n .then((r) => (r.ok ? r.json() : null))\n .then((d) => {\n if (d?.name) setBranding((b) => ({ ...b, appName: d.name }));\n if (d?.logo_url) setBranding((b) => ({ ...b, appLogo: d.logo_url }));\n })\n .catch(() => {});\n }, [config.appId, config.authBackendUrl]);\n\n const openModal = useCallback(() => setModalOpen(true), []);\n const closeModal = useCallback(() => setModalOpen(false), []);\n const clearAuthError = useCallback(() => setAuthError(null), []);\n\n // Re-request the device-approval email for the current pending request. The\n // backend dedups within its TTL; calling again re-sends the owner email so the\n // user can recover from a lost/spam-filtered message.\n const resendDeviceApproval = useCallback(async () => {\n if (!identity || !cavos || cavos.chain !== 'starknet' || !cavos.pendingRequestId) return;\n const backendUrl = configRef.current.authBackendUrl ?? 'https://cavos.xyz';\n if (!configRef.current.appId) return;\n const recovery = new HttpRecoveryClient({ baseUrl: backendUrl, appId: configRef.current.appId });\n await recovery.requestDeviceAddition({\n userId: identity.userId,\n accountAddress: cavos.address,\n newSigner: cavos.publicKey,\n ...(identity.email ? { email: identity.email } : {}),\n });\n }, [identity, cavos]);\n\n // Bring the wallet online for an identity: Cavos.connect deploys if needed.\n const connect = useCallback(async (id: Identity): Promise<CavosWallet> => {\n setWalletStatus({ ...INITIAL_STATUS, isDeploying: true });\n const c = await Cavos.connect({\n chain: configRef.current.chain ?? 'starknet',\n network: configRef.current.network,\n identity: id,\n appSalt: configRef.current.appSalt,\n ...(configRef.current.paymasterApiKey ? { paymasterApiKey: configRef.current.paymasterApiKey } : {}),\n ...(configRef.current.appId ? { appId: configRef.current.appId } : {}),\n ...(configRef.current.authBackendUrl ? { backendUrl: configRef.current.authBackendUrl } : {}),\n ...(configRef.current.rpcUrl ? { rpcUrl: configRef.current.rpcUrl } : {}),\n });\n setCavos(c);\n setIdentity(id);\n // Only Starknet wallets surface a pending device-addition request id.\n const pendingRequestId = c.chain === 'starknet' ? c.pendingRequestId : null;\n setWalletStatus({\n isDeploying: false,\n isReady: c.status === 'ready',\n needsDeviceApproval: c.status === 'needs-device-approval',\n awaitingApproval: c.status === 'needs-device-approval' && !!pendingRequestId,\n pendingRequestId,\n });\n modal?.onSuccess?.(c.address);\n return c;\n }, [modal]);\n\n // On mount: if we're returning from OAuth (?auth_data=…), finish the login.\n // Open the modal immediately so the user sees the \"deploying\" state while the\n // wallet is being brought online — it flips to \"done\" once `isReady`.\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const params = new URLSearchParams(window.location.search);\n const authData = params.get('auth_data') || params.get('zk_auth_data');\n if (!authData) return;\n setModalOpen(true);\n setWalletStatus({ ...INITIAL_STATUS, isDeploying: true });\n let cancelled = false;\n (async () => {\n setIsLoading(true);\n try {\n await handleCallback(authData);\n if (!cancelled) window.history.replaceState({}, document.title, window.location.pathname);\n } catch (e) {\n console.error('[CavosProvider] OAuth callback error:', e);\n if (!cancelled) {\n // Surface the failure instead of closing the modal silently: the user\n // sees an actionable error with a retry, rather than the modal vanishing.\n const msg = e instanceof Error ? e.message : 'Sign-in failed. Please try again.';\n setAuthError(msg);\n setWalletStatus(INITIAL_STATUS);\n }\n } finally {\n if (!cancelled) setIsLoading(false);\n }\n })();\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleCallback = useCallback(async (authData: string) => {\n const id = await auth.handleCallback(authData);\n await connect(id);\n }, [auth, connect]);\n\n const login = useCallback(async (provider: 'google' | 'apple') => {\n if (typeof window === 'undefined') throw new Error('OAuth requires a browser');\n setAuthError(null);\n const url = await (provider === 'google'\n ? auth.getGoogleOAuthUrl(window.location.origin + window.location.pathname)\n : auth.getAppleOAuthUrl(window.location.origin + window.location.pathname));\n window.location.href = url;\n }, [auth]);\n\n const sendMagicLink = useCallback(async (email: string) => {\n await auth.sendMagicLink(email);\n }, [auth]);\n\n const sendOtp = useCallback(async (email: string) => {\n await auth.sendOtp(email);\n }, [auth]);\n\n const verifyOtp = useCallback(async (email: string, code: string) => {\n setAuthError(null);\n const id = await auth.verifyOtp(email, code);\n await connect(id);\n }, [auth, connect]);\n\n const execute = useCallback(async (calls: ChainCall[]) => {\n if (!cavos) throw new Error('Not logged in');\n if (cavos.chain !== 'starknet') {\n throw new Error(\n \"kit: useCavos().execute(calls) is Starknet-only. On Solana use the `wallet` handle: wallet.execute(amount, dest).\",\n );\n }\n return cavos.execute(calls);\n }, [cavos]);\n\n const addSigner = useCallback(\n async (pubkey: { x: bigint; y: bigint }) => {\n if (!cavos) throw new Error('Not logged in');\n if (cavos.chain !== 'starknet') {\n throw new Error('kit: addSigner via useCavos() is Starknet-only; use the `wallet` handle on Solana.');\n }\n return cavos.addSigner(pubkey);\n },\n [cavos],\n );\n\n // Generate a recovery code and register its derived backup signer on-chain.\n // The code is returned so the UI can display it once — the kit never persists\n // it and the backend never sees it.\n const setupRecovery = useCallback(async (): Promise<string> => {\n if (!cavos) throw new Error('Not logged in');\n const code = generateRecoveryCode();\n // Both chains expose setupRecovery(code) on the wallet handle.\n await cavos.setupRecovery(code);\n return code;\n }, [cavos]);\n\n // Recover access after losing every device. The caller passes the recovery\n // code; the backup key it derives authorises adding this new device. Brings\n // the provider straight to a ready state. Works on both chains.\n const recover = useCallback(async (code: string) => {\n if (!identity) throw new Error('Sign in first so we know which account to recover.');\n setAuthError(null);\n setWalletStatus({ ...INITIAL_STATUS, isDeploying: true });\n try {\n const chain = configRef.current.chain ?? 'starknet';\n const c: CavosWallet =\n chain === 'solana'\n ? await CavosSolana.recover({\n code,\n identity,\n network: (configRef.current.network === 'mainnet'\n ? 'solana-mainnet'\n : 'solana-devnet') as SolanaNetwork,\n appSalt: configRef.current.appSalt,\n ...(configRef.current.appId ? { appId: configRef.current.appId } : {}),\n ...(configRef.current.authBackendUrl ? { backendUrl: configRef.current.authBackendUrl } : {}),\n ...(configRef.current.rpcUrl ? { rpcUrl: configRef.current.rpcUrl } : {}),\n })\n : await Cavos.recover({\n code,\n identity,\n network: configRef.current.network,\n appSalt: configRef.current.appSalt,\n paymasterApiKey: configRef.current.paymasterApiKey ?? '',\n ...(configRef.current.appId ? { appId: configRef.current.appId } : {}),\n ...(configRef.current.authBackendUrl ? { backendUrl: configRef.current.authBackendUrl } : {}),\n ...(configRef.current.rpcUrl ? { rpcUrl: configRef.current.rpcUrl } : {}),\n });\n setCavos(c);\n setWalletStatus({ ...INITIAL_STATUS, isReady: true });\n modal?.onSuccess?.(c.address);\n } catch (e) {\n const msg = e instanceof Error ? e.message : 'Recovery failed. Check your code and try again.';\n setAuthError(msg);\n setWalletStatus(INITIAL_STATUS);\n throw e;\n }\n }, [identity, modal]);\n\n // Poll the pending device-addition request while this device is awaiting the\n // owner's approval. Once the owner approves (status === 'approved'), the new\n // signer is authorized on-chain, so reconnecting flips the device to \"ready\"\n // automatically — the requester no longer has to sign out and back in.\n useEffect(() => {\n if (!walletStatus.awaitingApproval || !walletStatus.pendingRequestId || !identity) return;\n if (!configRef.current.appId) return;\n const backendUrl = configRef.current.authBackendUrl ?? 'https://cavos.xyz';\n const recovery = new HttpRecoveryClient({ baseUrl: backendUrl, appId: configRef.current.appId });\n const requestId = walletStatus.pendingRequestId;\n let cancelled = false;\n const tick = async () => {\n try {\n const r = await recovery.getPendingRequest(requestId);\n if (cancelled || !r) return;\n if (r.status === 'expired') {\n // Surface expiry so the modal can offer \"request a new one\".\n setWalletStatus((s) => ({ ...s, pendingRequestId: null }));\n return;\n }\n if (r.status === 'approved') {\n // The owner added this device's signer on-chain — reconnect to flip\n // to \"ready\" without making the user log in again.\n await connect(identity);\n }\n } catch {\n /* transient network errors are fine; the next tick retries */\n }\n };\n const interval = setInterval(tick, 4000);\n return () => {\n cancelled = true;\n clearInterval(interval);\n };\n }, [walletStatus.awaitingApproval, walletStatus.pendingRequestId, identity, connect]);\n\n const logout = useCallback(() => {\n setCavos(null);\n setIdentity(null);\n setWalletStatus(INITIAL_STATUS);\n setAuthError(null);\n }, []);\n\n const value: CavosContextValue = {\n openModal,\n closeModal,\n isAuthenticated: !!cavos,\n user: identity\n ? { userId: identity.userId, email: identity.email, provider: identity.provider }\n : null,\n chain: config.chain ?? 'starknet',\n wallet: cavos,\n address: cavos?.address ?? null,\n walletStatus,\n isLoading,\n authError,\n clearAuthError,\n login,\n sendMagicLink,\n sendOtp,\n verifyOtp,\n handleCallback,\n execute,\n addSigner,\n resendDeviceApproval,\n setupRecovery,\n recover,\n logout,\n };\n\n return (\n <CavosContext.Provider value={value}>\n {children}\n {modal !== undefined && (\n <CavosAuthModal\n open={modalOpen}\n onClose={closeModal}\n appName={branding.appName ?? modal.appName}\n appLogo={branding.appLogo ?? modal.appLogo}\n providers={modal.providers}\n emailMode={modal.emailMode}\n primaryColor={modal.primaryColor}\n theme={modal.theme}\n />\n )}\n </CavosContext.Provider>\n );\n}\n\nexport function useCavos(): CavosContextValue {\n const ctx = useContext(CavosContext);\n if (!ctx) throw new Error('useCavos must be used within a CavosProvider');\n return ctx;\n}\n"]}