{"version":3,"sources":["../src/registry/HttpWalletRegistry.ts","../src/signing.ts","../src/recovery/SocialRecoveryCredential.ts","../src/chains/starknet/constants.ts","../src/chains/starknet/keys.ts","../src/chains/stellar/WebCryptoControlKey.ts","../src/secret/dek.ts","../src/secret/derive.ts","../src/secret/wrap.ts","../src/secret/idbWrapStore.ts","../src/secret/legacy.ts","../src/vault/protocol.ts","../src/vault/VaultClient.ts","../src/registry/PasskeyWrapStore.ts","../src/secret/factor.ts","../src/secret/DeviceSecret.ts","../src/secret/passkeyWrap.ts","../src/secret/PasskeyDekPort.ts","../src/recovery/EnclaveDekPort.ts","../src/secret/addressIndex.ts","../src/secret/nativeAccount.ts"],"names":["Buffer","sha256","tx","ed25519","StrKey","IDB_NAME","IDB_STORE","hasIndexedDB","idbGet","idbPut","openDb","PublicKey","CallData","randomBytes","hkdf","deviceFactor"],"mappings":"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","file":"chunk-TLAPAQBY.mjs","sourcesContent":["import type { DevicePublicKey } from \"../signer/DeviceSigner\";\nimport type { WalletRegistry, RegisteredWallet, RegisterResult } 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  /** Optional Cavos console environment. Omitted means production. */\n  environment?: \"development\" | \"production\";\n  /** Network the wallet lives on (e.g. \"sepolia\"). */\n  network: string;\n  /**\n   * The provider id_token from login (Google / Apple / Cavos). The registry\n   * decides who owns an address, so it authenticates the end user, not just the\n   * public app id. Read fresh on each call; these tokens expire.\n   */\n  authToken: () => string | null;\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`) — the persistent,\n * cross-device source of truth for `user_id -> wallet`. The backend stores\n * authorized device signers in `wallet_devices`; the registry maps a backend\n * `userId` (the OAuth `sub`) onto that single wallet row.\n */\nexport class HttpWalletRegistry implements WalletRegistry {\n  constructor(private readonly opts: HttpWalletRegistryOptions) {}\n\n  async lookup(userId: string): Promise<RegisteredWallet | null> {\n    // The registry authenticates the end user. Calling without a login token\n    // produces `Invalid user token` 401s — and after OAuth, a silent reconnect\n    // of the previous localStorage identity can race the callback exchange and\n    // hit exactly that. Skip the fetch; resolveAddress already falls back to\n    // the address cache when lookup throws.\n    if (!this.opts.authToken()) {\n      throw new Error(\"registry lookup skipped: no login token\");\n    }\n\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    if (this.opts.environment) url.searchParams.set(\"environment\", this.opts.environment);\n\n    const res = await fetch(url, { headers: this.headers() });\n    if (!res.ok) {\n      const body = await res.text().catch(() => \"\");\n      throw new Error(\n        `registry lookup failed: ${res.status}${body ? ` ${body}` : \"\"}`,\n      );\n    }\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 {\n      address: data.address,\n      devices,\n    };\n  }\n\n  async register(params: {\n    userId: string;\n    address: string;\n    initialSigner: DevicePublicKey;\n  }): Promise<RegisterResult> {\n    const res = await fetch(new URL(\"/api/wallets\", this.opts.baseUrl), {\n      method: \"POST\",\n      headers: this.headers(),\n      body: JSON.stringify({\n        app_id: this.opts.appId,\n        ...(this.opts.environment ? { environment: this.opts.environment } : {}),\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    // 409: another device claimed this identity's row first. Its address is the\n    // real one — adopt it rather than insisting on the one we computed.\n    if (res.status === 409) {\n      const data = await res.json().catch(() => ({}));\n      if (!data.address) throw new Error(\"registry register conflicted without an address\");\n      return { address: data.address, conflict: true };\n    }\n    if (!res.ok) {\n      const t = await res.text().catch(() => \"\");\n      throw new Error(`registry register failed: ${res.status} ${t}`);\n    }\n    return { address: params.address, conflict: false };\n  }\n\n  private headers(): Record<string, string> {\n    const token = this.opts.authToken();\n    return {\n      \"Content-Type\": \"application/json\",\n      ...(token ? { Authorization: `Bearer ${token}` } : {}),\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  async removeDevice?(params: {\n    userId: string;\n    address: string;\n    signer: DevicePublicKey;\n  }): Promise<void> {\n    // Same as `addDevice`: the removal confirm endpoint deletes the mirrored\n    // `wallet_devices` row once the on-chain remove_signer has been submitted.\n    void params;\n  }\n}\n","/**\n * Off-chain message signing + sign-without-submit types, shared across chains.\n *\n * `signMessage` signs an arbitrary message off-chain (no transaction, no gas,\n * no state change) so a third party can verify the wallet owner endorsed it —\n * the canonical primitive for Sign-In-with-X, off-chain auth, and attestations.\n *\n * `signTransaction` signs a chain-native transaction WITHOUT submitting it,\n * returning the signed artifact a relayer/backend can broadcast later.\n */\n\nimport type { TypedData } from \"starknet\";\nimport { utf8ToBytes } from \"./crypto/encoding\";\n\n/** Curve a signature was produced with. Determines how a verifier checks it. */\nexport type SignatureCurve = \"secp256r1\" | \"ed25519\" | \"stark\";\n\n/**\n * Result of `wallet.signMessage(message)`. The signature is over the SNIP-12\n * typed-data hash for Starknet (stark curve) and over `prefixedMessageBytes`\n * for the Ed25519 keys of Solana and Stellar. `publicKey` is the string a verifier needs to confirm ownership:\n *  - Starknet: the stark public key (hex) the account was deployed with.\n *  - Solana: the system-account address (ed25519).\n *  - Stellar: the `G…` control address (ed25519).\n *\n * Check `curve` to know which verification path to use.\n */\nexport interface MessageSignature {\n  /** Chain-native signature bytes (64 bytes: stark r‖s, or ed25519). */\n  signature: Uint8Array;\n  /** Verifier input: the key/address that owns this wallet's signing authority. */\n  publicKey: string;\n  /** Curve used to produce the signature. */\n  curve: SignatureCurve;\n  /** The SNIP-12 typed data that was signed (Starknet). */\n  typedData?: TypedData;\n}\n\n/**\n * A transaction signed but NOT submitted. The concrete shape is chain-specific\n * — narrow on `chain` to read the fields.\n *\n * <Callout-minded note>: every variant is **single-use and binds to on-chain\n * state** (Starknet nonce + resourceBounds, Stellar sequence number, Solana\n * on-chain nonce). If any other transaction from the same account is submitted\n * first, this signature becomes invalid. Broadcast promptly.\n */\nexport type SignedTransaction =\n  | StarknetSignedTransaction\n  | StellarSignedTransaction\n  | SolanaSignedTransaction;\n\n/** Starknet invoke, signed by the account key (2-felt stark signature), not broadcast. */\nexport interface StarknetSignedTransaction {\n  chain: \"starknet\";\n  /** Hex-encoded calldata felts of the built invoke. */\n  calldata: string[];\n  /** The stark signature as hex strings: `[r, s]`. */\n  signature: string[];\n  /** Account nonce the signature binds to. */\n  nonce: string;\n  /** Resource bounds the signature binds to (L1/L2 gas). */\n  resourceBounds: {\n    l1Gas: { maxAmount: string; maxPricePerUnit: string };\n    l2Gas: { maxAmount: string; maxPricePerUnit: string };\n  };\n  /** Transaction version (hex). */\n  version: string;\n}\n\n/** Stellar classic transaction, signed by the ed25519 control key, as base64 XDR. */\nexport interface StellarSignedTransaction {\n  chain: \"stellar\";\n  /** Base64-encoded signed inner Transaction envelope (fee-bumpable by a relayer). */\n  xdr: string;\n}\n\n/**\n * Solana device signature over the serialized transaction message. The spend\n * key is the native Ed25519 of the system account.\n */\nexport interface SolanaSignedTransaction {\n  chain: \"solana\";\n  /** Serialized Solana message the spend key signed. */\n  message: Uint8Array;\n  /** 64-byte Ed25519 signature. */\n  signature: Uint8Array;\n  /** 32-byte Ed25519 public key. */\n  publicKey: Uint8Array;\n}\n\n/** Prefix scheme for off-chain messages, mirroring EIP-191 / Solana's convention. */\nexport const CAVOS_MESSAGE_PREFIX = \"Cavos Signed Message:\\n\";\n\n/** Build the prefixed message bytes an Ed25519 chain signs for `signMessage`.\n *  Format: `CAVOS_MESSAGE_PREFIX` + ASCII decimal length + `\\n` + message. */\nexport function prefixedMessageBytes(message: Uint8Array): Uint8Array {\n  const len = String(message.length);\n  const parts = [\n    utf8ToBytes(CAVOS_MESSAGE_PREFIX),\n    utf8ToBytes(len),\n    utf8ToBytes(\"\\n\"),\n    message,\n  ];\n  const total = parts.reduce((n, p) => n + p.length, 0);\n  const out = new Uint8Array(total);\n  let offset = 0;\n  for (const p of parts) {\n    out.set(p, offset);\n    offset += p.length;\n  }\n  return out;\n}\n","import { sha256 } from \"@noble/hashes/sha256\";\nimport { Buffer } from \"buffer\";\nimport { utf8ToBytes } from \"../crypto/encoding\";\n\n/**\n * A fresh provider token plus its non-secret fingerprint. The fingerprint is\n * sent to the control plane to reserve a single recovery session; the token\n * itself is sent only through the attested encrypted channel.\n */\nexport type SocialRecoveryProvider = \"google\" | \"apple\" | \"email\";\n\n/** The `iss` of the tokens the recovery enclave itself issues for email login. */\nexport const ENCLAVE_EMAIL_ISSUER = \"https://enclave.cavos.xyz\";\n\nexport interface SocialRecoveryCredential {\n  idToken: string;\n  tokenFingerprint: string;\n  /**\n   * Which provider signed this token, read from its `iss`.\n   *\n   * The control plane needs it to pick the policy the enclave verifies\n   * against, and cannot read it itself: the token only reaches the enclave,\n   * encrypted, after the session already exists. Reading it here is not a\n   * security check — the enclave verifies the signature, issuer and audience\n   * against the sealed policy, and a wrong answer here produces a policy the\n   * token cannot verify against rather than one that wrongly accepts it.\n   */\n  provider: SocialRecoveryProvider;\n  /**\n   * The secret whose hash this login sent as the `nonce` (see\n   * `auth/loginBinding`). The enclave requires it beside every token; it\n   * travels only inside the job encrypted to the enclave.\n   */\n  noncePreimage?: string;\n}\n\nexport function createSocialRecoveryCredential(\n  idToken: string,\n  noncePreimage?: string,\n): SocialRecoveryCredential {\n  if (idToken.split(\".\").length !== 3) {\n    throw new Error(\"kit/auth: malformed social recovery credential\");\n  }\n  return {\n    idToken,\n    tokenFingerprint: toBase64Url(sha256(utf8ToBytes(idToken))),\n    provider: socialRecoveryProvider(idToken),\n    ...(noncePreimage ? { noncePreimage } : {}),\n  };\n}\n\n/** The provider that issued `idToken`, by its `iss` claim. */\nexport function socialRecoveryProvider(\n  idToken: string,\n): SocialRecoveryProvider {\n  const issuer = readIssuer(idToken);\n  if (!isSocialRecoveryIssuer(issuer)) {\n    throw new Error(\n      `kit/auth: no social recovery provider issues tokens for \"${issuer}\"`,\n    );\n  }\n  if (issuer === \"https://appleid.apple.com\") return \"apple\";\n  if (issuer === ENCLAVE_EMAIL_ISSUER) return \"email\";\n  return \"google\";\n}\n\n/**\n * The `iss` of an unverified token.\n *\n * Deliberately no signature check. Nothing downstream trusts this value: it\n * selects which policy to ask for, and the enclave then verifies the token\n * against that policy in full.\n */\nexport function readTokenSubject(idToken: string): string {\n  const subject = readPayload(idToken).sub;\n  if (typeof subject !== \"string\" || !subject || subject.length > 256) {\n    throw new Error(\"kit/auth: social recovery credential has no subject\");\n  }\n  return subject;\n}\n\nfunction readIssuer(idToken: string): unknown {\n  return readPayload(idToken).iss;\n}\n\nfunction readPayload(idToken: string): { iss?: unknown; sub?: unknown } {\n  const payload = idToken.split(\".\")[1];\n  if (!payload) throw new Error(\"kit/auth: malformed social recovery credential\");\n  const padded = payload.replace(/-/g, \"+\").replace(/_/g, \"/\");\n  try {\n    return JSON.parse(Buffer.from(padded, \"base64\").toString(\"utf8\"));\n  } catch {\n    throw new Error(\"kit/auth: malformed social recovery credential\");\n  }\n}\n\n/** Only provider-signed tokens the recovery enclave accepts. */\nexport function isSocialRecoveryIssuer(issuer: unknown): issuer is string {\n  return (\n    issuer === \"https://accounts.google.com\" ||\n    issuer === \"accounts.google.com\" ||\n    issuer === \"https://appleid.apple.com\" ||\n    issuer === ENCLAVE_EMAIL_ISSUER\n  );\n}\n\nfunction toBase64Url(bytes: Uint8Array): string {\n  return Buffer.from(bytes)\n    .toString(\"base64\")\n    .replace(/\\+/g, \"-\")\n    .replace(/\\//g, \"_\")\n    .replace(/=+$/, \"\");\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/** 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 * OpenZeppelin `AccountUpgradeable` v3.0.0 class hash (Scarb 2.13.1,\n * `--release`), declared on mainnet and Sepolia. Pinned forever: the account\n * address derives from it, and `ensureEnclave` clears the local wrap when the\n * derived address differs from the registered one. Later implementation changes go through the account's\n * `upgrade`, which keeps the address.\n */\nexport const OZ_ACCOUNT_CLASS_HASH =\n  \"0x01d1777db36cdd06dd62cfde77b1b6ae06412af95d57a13dc40ac77b8a702381\";\n","import { CallData, ec, hash } from \"starknet\";\nimport { OZ_ACCOUNT_CLASS_HASH } from \"./constants\";\n\n/** Stark private key (hex, `0x`-prefixed) ground from a 32-byte seed with the standard EIP-2645 rejection sampling. */\nexport function starkKeyFromSeed(seed: Uint8Array): string {\n  return `0x${ec.starkCurve.grindKey(seed)}`;\n}\n\n/** Stark public key (hex) of a private key. It is the OZ account's constructor argument and its deploy salt. */\nexport function starkPublicKey(privateKey: string): string {\n  return ec.starkCurve.getStarkKey(privateKey);\n}\n\n/** OZ account address, unpadded lowercase hex as `calculateContractAddressFromHash` returns it. The registry stores this exact form. */\nexport function starknetAddressFromPublicKey(publicKey: string): string {\n  return hash.calculateContractAddressFromHash(\n    publicKey,\n    OZ_ACCOUNT_CLASS_HASH,\n    CallData.compile({ publicKey }),\n    0,\n  );\n}\n\nexport function starknetAddressFromSeed(seed: Uint8Array): string {\n  return starknetAddressFromPublicKey(starkPublicKey(starkKeyFromSeed(seed)));\n}\n","import { StrKey, TransactionBuilder, type FeeBumpTransaction, type Transaction } from \"@stellar/stellar-sdk\";\nimport { ed25519 } from \"@noble/curves/ed25519\";\nimport { sha256 } from \"@noble/hashes/sha256\";\nimport { prefixedMessageBytes } from \"../../signing\";\n\n/**\n * Non-extractable Ed25519 control key for classic-G Stellar accounts.\n *\n * In the browser, keys are persisted in IndexedDB so returning sessions can\n * load them without re-unwrapping the on-chain envelope. The private key\n * material never leaves WebCrypto — `crypto.subtle.exportKey(\"raw\", privateKey)`\n * will throw because `extractable: false`. XSS on the integrator page can still\n * sign while the tab is open (same risk model as Starknet), but it cannot\n * exfiltrate the spending key.\n *\n * In Node (tests / CLI), IndexedDB is unavailable. The `fromCryptoKey` static\n * method lets callers construct an instance from an already-imported CryptoKey\n * for use in tests without mocking IDB.\n */\n\nconst IDB_NAME = \"cavos-kit-stellar-control\";\nconst IDB_STORE = \"control-keys\";\n\n/**\n * The control-key signing capability used by CavosStellar. It signs whole\n * transactions, auth preimages and prefixed messages — never raw bytes — so a\n * signer that sits behind a policy can see what it is signing.\n */\nexport interface ControlKey {\n  /** Stellar `G…` address of the control public key. */\n  publicAddress(): string;\n  /** The raw 32-byte Ed25519 public key. */\n  publicKeyRaw(): Uint8Array;\n  signTransaction(xdr: string, networkPassphrase: string): Promise<Uint8Array>;\n  signAuthEntry(preimageXdr: Uint8Array): Promise<Uint8Array>;\n  /** Signs `prefixedMessageBytes(message)`. */\n  signMessage(message: Uint8Array): Promise<Uint8Array>;\n}\n\n/** A control key whose private half is in this process. */\nexport abstract class LocalControlKey implements ControlKey {\n  abstract publicAddress(): string;\n  abstract publicKeyRaw(): Uint8Array;\n  abstract sign(data: Uint8Array): Promise<Uint8Array>;\n\n  signTransaction(xdr: string, networkPassphrase: string): Promise<Uint8Array> {\n    return this.sign(new Uint8Array(TransactionBuilder.fromXDR(xdr, networkPassphrase).hash()));\n  }\n\n  signAuthEntry(preimageXdr: Uint8Array): Promise<Uint8Array> {\n    return this.sign(sha256(preimageXdr));\n  }\n\n  signMessage(message: Uint8Array): Promise<Uint8Array> {\n    return this.sign(prefixedMessageBytes(message));\n  }\n}\n\nexport interface WebCryptoControlKeyOptions {\n  /** Storage key for this account's control key (e.g. the `G…` address). */\n  keyId: string;\n}\n\ninterface StoredControlKey {\n  privateKey: CryptoKey;\n  publicRaw: Uint8Array;\n}\n\n/**\n * WebCrypto-backed non-extractable Ed25519 control key.\n *\n * Use `create` or `importFromSeed` for first-time setup, `load` for returning\n * sessions. For Node/test environments without IndexedDB, use `fromCryptoKey`\n * to construct directly from an in-memory CryptoKey.\n */\nexport class WebCryptoControlKey extends LocalControlKey {\n  private constructor(\n    private readonly privateKey: CryptoKey,\n    private readonly publicRaw: Uint8Array,\n    readonly keyId: string | undefined,\n  ) {\n    super();\n  }\n\n  /**\n   * Construct directly from an already-imported CryptoKey (for tests / Node).\n   * No IndexedDB interaction — the key lives only in memory.\n   */\n  static fromCryptoKey(privateKey: CryptoKey, publicRaw: Uint8Array): WebCryptoControlKey {\n    return new WebCryptoControlKey(privateKey, publicRaw, undefined);\n  }\n\n  /**\n   * Generate a fresh control key. In the browser, persists to IndexedDB; in\n   * Node, returns an in-memory instance (throws if `keyId` is specified but\n   * IndexedDB is unavailable).\n   */\n  static async create(opts?: WebCryptoControlKeyOptions): Promise<WebCryptoControlKey> {\n    assertSubtle();\n    const pair = await crypto.subtle.generateKey(\n      { name: \"Ed25519\" },\n      false,\n      [\"sign\", \"verify\"],\n    );\n    const publicRaw = new Uint8Array(\n      await crypto.subtle.exportKey(\"raw\", pair.publicKey),\n    );\n    if (opts?.keyId && hasIndexedDB()) {\n      await idbPut(opts.keyId, { privateKey: pair.privateKey, publicRaw });\n    }\n    return new WebCryptoControlKey(pair.privateKey, publicRaw, opts?.keyId);\n  }\n\n  async persist(keyId: string): Promise<void> {\n    if (!hasIndexedDB()) return;\n    await idbPut(keyId, { privateKey: this.privateKey, publicRaw: this.publicRaw });\n  }\n\n  /**\n   * Import a control key from a raw 32-byte Ed25519 seed. The seed is imported\n   * with `extractable: false`, so after this call the caller should wipe the\n   * seed from JS memory — it can never be exported from WebCrypto.\n   *\n   * In the browser, persists to IndexedDB; in Node, returns an in-memory\n   * instance.\n   */\n  static async importFromSeed(\n    seed: Uint8Array,\n    opts?: WebCryptoControlKeyOptions,\n  ): Promise<WebCryptoControlKey> {\n    assertSubtle();\n    if (seed.length !== 32) {\n      throw new Error(\"kit/stellar: control seed must be 32 bytes\");\n    }\n    const pkcs8 = wrapEd25519SeedAsPkcs8(seed);\n    const privateKey = await crypto.subtle.importKey(\n      \"pkcs8\",\n      toBufferSource(pkcs8),\n      { name: \"Ed25519\" },\n      false,\n      [\"sign\"],\n    );\n    const publicRaw = await deriveEd25519PublicKey(seed);\n    if (opts?.keyId && hasIndexedDB()) {\n      await idbPut(opts.keyId, { privateKey, publicRaw });\n    }\n    return new WebCryptoControlKey(privateKey, publicRaw, opts?.keyId);\n  }\n\n  /**\n   * Load an existing control key from IndexedDB, or `null` if none exists.\n   * In Node (no IndexedDB), always returns `null`.\n   */\n  static async load(opts: WebCryptoControlKeyOptions): Promise<WebCryptoControlKey | null> {\n    if (!hasIndexedDB()) return null;\n    const rec = await idbGet(opts.keyId);\n    if (!rec) return null;\n    return new WebCryptoControlKey(rec.privateKey, rec.publicRaw, opts.keyId);\n  }\n\n  static async remove(keyId: string): Promise<void> {\n    if (!hasIndexedDB()) return;\n    const db = await openDb();\n    await tx(db, \"readwrite\", (store) => store.delete(keyId));\n    db.close();\n  }\n\n  publicAddress(): string {\n    return StrKey.encodeEd25519PublicKey(Buffer.from(this.publicRaw));\n  }\n\n  publicKeyRaw(): Uint8Array {\n    return this.publicRaw;\n  }\n\n  async sign(data: Uint8Array): Promise<Uint8Array> {\n    const sig = await crypto.subtle.sign(\n      { name: \"Ed25519\" },\n      this.privateKey,\n      toBufferSource(data),\n    );\n    return new Uint8Array(sig);\n  }\n\n  /**\n   * Attempt to export the private key. This WILL throw if the key was imported\n   * with `extractable: false` (which it always should be). Exposed only for\n   * tests that want to verify the non-extractable guarantee.\n   */\n  async tryExportPrivateKey(): Promise<Uint8Array> {\n    const raw = await crypto.subtle.exportKey(\"raw\", this.privateKey);\n    return new Uint8Array(raw);\n  }\n}\n\nfunction assertSubtle(): void {\n  if (typeof crypto === \"undefined\" || typeof crypto.subtle === \"undefined\") {\n    throw new Error(\n      \"Cavos: WebCrypto is unavailable. Control keys require a secure context — use HTTPS, or http://localhost.\",\n    );\n  }\n}\n\nfunction hasIndexedDB(): boolean {\n  return typeof indexedDB !== \"undefined\";\n}\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: StoredControlKey): 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<StoredControlKey | null> {\n  const db = await openDb();\n  const result = await tx(db, \"readonly\", (store) => store.get(keyId));\n  db.close();\n  return (result as StoredControlKey) ?? 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\n/**\n * Wrap a 32-byte Ed25519 seed in PKCS#8 ASN.1 format for WebCrypto import.\n * Structure: SEQUENCE { version, AlgorithmIdentifier { Ed25519 }, OCTET STRING { seed } }\n */\nfunction wrapEd25519SeedAsPkcs8(seed: Uint8Array): Uint8Array {\n  const prefix = new Uint8Array([\n    0x30, 0x2e,\n    0x02, 0x01, 0x00,\n    0x30, 0x05,\n    0x06, 0x03, 0x2b, 0x65, 0x70,\n    0x04, 0x22,\n    0x04, 0x20,\n  ]);\n  const pkcs8 = new Uint8Array(prefix.length + seed.length);\n  pkcs8.set(prefix);\n  pkcs8.set(seed, prefix.length);\n  return pkcs8;\n}\n\n/** Derive the 32-byte Ed25519 public key from a 32-byte seed using noble. */\nfunction deriveEd25519PublicKey(seed: Uint8Array): Uint8Array {\n  return ed25519.getPublicKey(seed);\n}\n\n/**\n * Ensure a Uint8Array is backed by a plain ArrayBuffer for WebCrypto APIs.\n * TypeScript's strict BufferSource typing rejects Uint8Array<ArrayBufferLike>\n * (which may be SharedArrayBuffer). Copying creates a fresh ArrayBuffer-backed\n * view that satisfies the BufferSource constraint.\n */\nfunction toBufferSource(data: Uint8Array): ArrayBuffer {\n  return Uint8Array.from(data).buffer;\n}\n\n/**\n * Wrap a stellar-sdk Keypair as a ControlKey. Useful for tests that bypass\n * `connect()` and construct the wallet directly. The underlying Keypair IS\n * extractable (unlike a proper WebCryptoControlKey), so this should only be\n * used in tests.\n */\nexport class KeypairControlKey extends LocalControlKey {\n  constructor(private readonly keypair: { publicKey(): string; sign(data: Buffer): Buffer }) {\n    super();\n  }\n\n  publicAddress(): string {\n    return this.keypair.publicKey();\n  }\n\n  publicKeyRaw(): Uint8Array {\n    return StrKey.decodeEd25519PublicKey(this.keypair.publicKey());\n  }\n\n  async sign(data: Uint8Array): Promise<Uint8Array> {\n    const sig = this.keypair.sign(Buffer.from(data));\n    return new Uint8Array(sig);\n  }\n}\n\n/** Sign a Stellar transaction with the control key and attach the signature. */\nexport async function signTransactionWithControlKey(\n  tx: Transaction | FeeBumpTransaction,\n  controlKey: ControlKey,\n): Promise<void> {\n  const sig = await controlKey.signTransaction(tx.toXDR(), tx.networkPassphrase);\n  tx.addSignature(controlKey.publicAddress(), Buffer.from(sig).toString(\"base64\"));\n}\n\n/** A signing callback for `authorizeEntry`. */\nexport function createSorobanSigner(\n  controlKey: ControlKey,\n): (preimage: { toXDR(): Buffer }) => Promise<{ signature: Uint8Array; publicKey: string }> {\n  return async (preimage) => {\n    const signature = await controlKey.signAuthEntry(new Uint8Array(preimage.toXDR()));\n    return { signature, publicKey: controlKey.publicAddress() };\n  };\n}\n","import { randomBytes } from \"@noble/hashes/utils\";\n\ndeclare const masterDekBrand: unique symbol;\ndeclare const ed25519SeedBrand: unique symbol;\n\n/** 32-byte account secret. Lives in the sealed record. Never a spend key by itself. */\nexport type MasterDEK = Uint8Array & { readonly [masterDekBrand]: \"MasterDEK\" };\n\n/** 32-byte Ed25519 seed for one chain. HKDF of a MasterDEK. Import then zeroize. */\nexport type Ed25519Seed = Uint8Array & { readonly [ed25519SeedBrand]: \"Ed25519Seed\" };\n\nexport function parseMasterDEK(bytes: Uint8Array): MasterDEK {\n  if (bytes.length !== 32) {\n    throw new Error(\"kit/secret: MasterDEK must be 32 bytes\");\n  }\n  return bytes.slice() as MasterDEK;\n}\n\nexport function parseEd25519Seed(bytes: Uint8Array): Ed25519Seed {\n  if (bytes.length !== 32) {\n    throw new Error(\"kit/secret: Ed25519Seed must be 32 bytes\");\n  }\n  return bytes.slice() as Ed25519Seed;\n}\n\nexport function generateMasterDEK(): MasterDEK {\n  return parseMasterDEK(randomBytes(32));\n}\n\nexport function zeroize(secret: Uint8Array): void {\n  secret.fill(0);\n}\n","import { ed25519 } from \"@noble/curves/ed25519\";\nimport { hkdf } from \"@noble/hashes/hkdf\";\nimport { sha256 } from \"@noble/hashes/sha256\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport { StrKey } from \"@stellar/stellar-sdk\";\nimport { starknetAddressFromSeed } from \"../chains/starknet/keys\";\nimport { utf8ToBytes } from \"../crypto/encoding\";\nimport { parseMasterDEK, parseEd25519Seed, type MasterDEK, type Ed25519Seed } from \"./dek\";\n\nexport type NativeChain = \"solana\" | \"stellar\" | \"starknet\";\n\ndeclare const appSaltBrand: unique symbol;\nexport type AppSalt = Uint8Array & { readonly [appSaltBrand]: \"AppSalt\" };\n\nexport const HKDF_SOLANA = \"cavos-ed25519-solana-v1\";\nexport const HKDF_STELLAR = \"cavos-ed25519-stellar-v1\";\nexport const HKDF_STARKNET = \"cavos-stark-starknet-v1\";\n\nexport function parseAppSalt(salt: string | Uint8Array): AppSalt {\n  if (typeof salt === \"string\") {\n    if (!salt) throw new Error(\"kit/secret: appSalt is empty\");\n    return sha256(utf8ToBytes(salt)) as AppSalt;\n  }\n  if (salt.length !== 32) throw new Error(\"kit/secret: appSalt must be 32 bytes\");\n  return salt.slice() as AppSalt;\n}\n\nconst HKDF_INFO: Record<NativeChain, string> = {\n  solana: HKDF_SOLANA,\n  stellar: HKDF_STELLAR,\n  starknet: HKDF_STARKNET,\n};\n\nexport function deriveSeed(dek: MasterDEK, chain: NativeChain, appSalt: AppSalt): Ed25519Seed {\n  return parseEd25519Seed(hkdf(sha256, dek, appSalt, HKDF_INFO[chain], 32));\n}\n\n/** MasterDEK from a synced passkey PRF. Same credential + app → same DEK, no server wrap. */\nexport const HKDF_PASSKEY_DEK = \"cavos-master-dek-passkey-v1\";\n\nexport function masterDekFromPasskey(prf: Uint8Array, appSalt: AppSalt): MasterDEK {\n  if (prf.length < 32) throw new Error(\"kit/secret: passkey PRF output too short\");\n  return parseMasterDEK(hkdf(sha256, prf, appSalt, HKDF_PASSKEY_DEK, 32));\n}\n\nexport function solanaAddressFromSeed(seed: Ed25519Seed): string {\n  return new PublicKey(ed25519.getPublicKey(seed)).toBase58();\n}\n\nexport function stellarAddressFromSeed(seed: Ed25519Seed): string {\n  return StrKey.encodeEd25519PublicKey(Buffer.from(ed25519.getPublicKey(seed)));\n}\n\nexport function nativeAddress(dek: MasterDEK, chain: NativeChain, appSalt: AppSalt): string {\n  const seed = deriveSeed(dek, chain, appSalt);\n  try {\n    if (chain === \"solana\") return solanaAddressFromSeed(seed);\n    if (chain === \"stellar\") return stellarAddressFromSeed(seed);\n    return starknetAddressFromSeed(seed);\n  } finally {\n    seed.fill(0);\n  }\n}\n","import { eciesUnwrapDEK, eciesWrapDEK } from \"../chains/stellar/envelope\";\nimport { parseMasterDEK, type MasterDEK } from \"./dek\";\n\ndeclare const wrappedDekBrand: unique symbol;\n\n/** ECIES blob. ephPubCompressed(33) || nonce(12) || AES-GCM(DEK). */\nexport type WrappedDEK = Uint8Array & { readonly [wrappedDekBrand]: \"WrappedDEK\" };\n\nexport function parseWrappedDEK(bytes: Uint8Array): WrappedDEK {\n  if (bytes.length < 33 + 12 + 16) {\n    throw new Error(\"kit/secret: WrappedDEK is too short\");\n  }\n  return bytes.slice() as WrappedDEK;\n}\n\nexport function wrapDekToSec1(dek: MasterDEK, recipientPubSec1: Uint8Array): WrappedDEK {\n  return parseWrappedDEK(eciesWrapDEK(dek, recipientPubSec1));\n}\n\nexport function unwrapDekFromScalar(blob: WrappedDEK, recipientPrivScalar: Uint8Array): MasterDEK {\n  return parseMasterDEK(eciesUnwrapDEK(blob, recipientPrivScalar));\n}\n","import { parseWrappedDEK, type WrappedDEK } from \"./wrap\";\nimport type { WrapStore } from \"./DeviceSecret\";\n\nconst IDB_NAME = \"cavos-kit-dek-wrap\";\nconst IDB_STORE = \"wraps\";\n\nexport function idbWrapStore(scope?: string): WrapStore {\n  const key = (userId: string) => (scope ? `${scope}|${userId}` : userId);\n  return {\n    async get(userId) {\n      if (!hasIndexedDB()) return null;\n      const raw = await idbGet(key(userId));\n      return raw ? parseWrappedDEK(raw) : null;\n    },\n    async put(userId, wrap) {\n      if (!hasIndexedDB()) return;\n      await idbPut(key(userId), wrap);\n    },\n    async clear(userId) {\n      if (!hasIndexedDB()) return;\n      await idbDel(key(userId));\n    },\n  };\n}\n\nfunction hasIndexedDB(): boolean {\n  return typeof indexedDB !== \"undefined\";\n}\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\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\nasync function idbGet(userId: string): Promise<Uint8Array | null> {\n  const db = await openDb();\n  const result = await tx(db, \"readonly\", (store) => store.get(userId));\n  db.close();\n  return (result as Uint8Array) ?? null;\n}\n\nasync function idbPut(userId: string, wrap: WrappedDEK): Promise<void> {\n  const db = await openDb();\n  await tx(db, \"readwrite\", (store) => store.put(wrap, userId));\n  db.close();\n}\n\nasync function idbDel(userId: string): Promise<void> {\n  const db = await openDb();\n  await tx(db, \"readwrite\", (store) => store.delete(userId));\n  db.close();\n}\n","import { WebCryptoControlKey } from \"../chains/stellar/WebCryptoControlKey\";\nimport { WebCryptoDeviceUnwrapKey } from \"../chains/stellar/WebCryptoDeviceUnwrapKey\";\nimport { parseMasterDEK, zeroize } from \"./dek\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport { StrKey } from \"@stellar/stellar-sdk\";\nimport { nativeAddress, parseAppSalt, type NativeChain } from \"./derive\";\nimport { idbWrapStore } from \"./idbWrapStore\";\n\n/**\n * Before the vault, the kit kept the spend key, the device unwrap key and the\n * wrapped DEK in the app's own storage, where any script on the page can use\n * them. Once the vault holds the same account, those copies are only risk.\n * Each is deleted only when it provably opens the address the vault returned;\n * a copy for any other address may be the only way into funds, so it stays.\n */\nexport async function dropLegacyCopies(\n  chain: NativeChain,\n  userId: string,\n  appSalt: string,\n  vaultAddress: string,\n): Promise<void> {\n  if (typeof indexedDB === \"undefined\") return;\n\n  const keyId = `${chain}:${userId}:${appSalt}`;\n  const control = await WebCryptoControlKey.load({ keyId });\n  if (control && addressOf(chain, control.publicKeyRaw()) === vaultAddress) {\n    await WebCryptoControlKey.remove(keyId);\n  }\n\n  const unwrapKeyId = `${userId}:${appSalt}`;\n  const unwrap = await WebCryptoDeviceUnwrapKey.load({ keyId: unwrapKeyId });\n  const store = idbWrapStore();\n  const wrap = await store.get(userId);\n  if (!unwrap || !wrap) return;\n  const dek = parseMasterDEK(await unwrap.unwrap(wrap));\n  try {\n    if (nativeAddress(dek, chain, parseAppSalt(appSalt)) !== vaultAddress) return;\n  } finally {\n    zeroize(dek);\n  }\n  await WebCryptoDeviceUnwrapKey.remove(unwrapKeyId);\n  await store.clear(userId);\n}\n\nfunction addressOf(chain: NativeChain, publicKey: Uint8Array): string {\n  return chain === \"solana\" ? new PublicKey(publicKey).toBase58() : StrKey.encodeEd25519PublicKey(Buffer.from(publicKey));\n}\n","import type { Call, InvocationsSignerDetails, TypedData } from \"starknet\";\nimport type { PrivacyStatus, PrivacySubmission } from \"../chains/starknet/privacy/session\";\nimport type { SocialRecoveryCredential } from \"../recovery/SocialRecoveryCredential\";\n\nexport const VAULT_READY = \"cavos-vault:ready\";\nexport const VAULT_HELLO = \"cavos-vault:hello\";\nexport const POPUP_READY = \"cavos-vault:popup-ready\";\nexport const POPUP_RESULT = \"cavos-vault:popup-result\";\n\nexport type VaultChain = \"solana\" | \"stellar\" | \"starknet\";\nexport type RecoveryMode = \"enclave\" | \"passkey\" | \"none\";\n\nexport interface ConnectParams {\n  chain: VaultChain;\n  network: string;\n  environment?: \"development\" | \"production\";\n  appSalt: string;\n  userId: string;\n  userName?: string;\n  recovery: RecoveryMode;\n  credential?: SocialRecoveryCredential;\n  authToken?: string | null;\n}\n\nexport interface ConnectResult {\n  handle: string;\n  address: string;\n  /**\n   * Null when this browser holds no key for the account yet. Ed25519 raw bytes\n   * on Solana and Stellar; the 32-byte stark public key on Starknet.\n   */\n  publicKey: Uint8Array | null;\n  isNewAccount: boolean;\n  /** A passkey the user added can restore this account on a new device. */\n  passkey: boolean;\n}\n\nexport interface VaultMethods {\n  connect(params: ConnectParams): ConnectResult;\n  signSolanaTransaction(params: { handle: string; message: Uint8Array }): Uint8Array;\n  signStellarTransaction(params: { handle: string; xdr: string; networkPassphrase: string }): Uint8Array;\n  signStellarAuthEntry(params: { handle: string; preimage: Uint8Array }): Uint8Array;\n  signMessage(params: { handle: string; message: Uint8Array }): Uint8Array;\n  signStarknetTypedData(params: { handle: string; typedData: TypedData; accountAddress: string }): string[];\n  signStarknetInvoke(params: { handle: string; calls: Call[]; details: InvocationsSignerDetails }): string[];\n  /** The pool, prover, discovery and relay come from the app's Cavos settings. The page names none of them. */\n  privacyStatus(params: { handle: string; token?: string }): PrivacyStatus;\n  /** Decimal string of base units. Only the sum leaves the vault, never a note. */\n  privacyBalance(params: { handle: string; token: string }): string;\n  privacyRegister(params: { handle: string; paymasterApiKey: string }): PrivacySubmission;\n  privacyDeposit(params: { handle: string; token: string; amount: string; paymasterApiKey: string }): PrivacySubmission;\n  privacyTransfer(params: {\n    handle: string;\n    token: string;\n    recipient: string;\n    amount: string;\n    paymasterApiKey: string;\n  }): PrivacySubmission;\n  privacyWithdraw(params: {\n    handle: string;\n    token: string;\n    recipient: string;\n    amount: string;\n    paymasterApiKey: string;\n  }): PrivacySubmission;\n  forget(params: { userId: string; appSalt: string }): void;\n  /** Create a passkey that can restore the connected account on another device. */\n  enrollPasskey(params: {\n    userId: string;\n    appSalt: string;\n    userName?: string;\n    environment?: \"development\" | \"production\";\n    authToken?: string | null;\n  }): void;\n}\n\nexport type VaultMethod = keyof VaultMethods;\nexport type VaultParams<M extends VaultMethod> = Parameters<VaultMethods[M]>[0];\nexport type VaultResult<M extends VaultMethod> = ReturnType<VaultMethods[M]>;\n\nexport type VaultRequest = { [M in VaultMethod]: { id: number; method: M; params: VaultParams<M> } }[VaultMethod];\n\nexport type VaultReply =\n  | { id: number; ok: true; result: unknown }\n  | { id: number; ok: false; error: string };\n\nexport interface VaultEvent {\n  event: \"show\" | \"hide\";\n}\n\n/** The Cavos window is the fallback for passkeys some browsers refuse inside a cross-site frame. */\nexport type PopupIntent = { kind: \"passkey\"; userId: string; userName: string; create: boolean; credentialId?: Uint8Array };\n\nexport type PopupResult = { secret: Uint8Array; credentialId?: Uint8Array } | { error: string };\n","import { PublicKey } from \"@solana/web3.js\";\nimport { StrKey } from \"@stellar/stellar-sdk\";\nimport {\n  CallData,\n  SignerInterface,\n  num,\n  type Call,\n  type DeclareSignerDetails,\n  type DeployAccountSignerDetails,\n  type InvocationsSignerDetails,\n  type Signature,\n  type TypedData,\n} from \"starknet\";\nimport type { AuthProvider, Identity } from \"../auth/AuthProvider\";\nimport type { PrivacyOperations } from \"../chains/starknet/privacy/session\";\nimport type { ControlKey } from \"../chains/stellar/WebCryptoControlKey\";\nimport type { SocialRecoveryCredential } from \"../recovery/SocialRecoveryCredential\";\nimport type { Ed25519SpendSigner } from \"../signer/Ed25519SpendSigner\";\nimport { bytesToBigInt } from \"../crypto/encoding\";\nimport type { NativeChain } from \"../secret/derive\";\nimport { dropLegacyCopies } from \"../secret/legacy\";\nimport {\n  VAULT_HELLO,\n  VAULT_READY,\n  type ConnectParams,\n  type ConnectResult,\n  type VaultEvent,\n  type VaultMethod,\n  type VaultParams,\n  type VaultReply,\n  type VaultResult,\n} from \"./protocol\";\n\nexport const DEFAULT_VAULT_URL = \"https://vault.cavos.xyz/vault\";\n\nconst LOAD_TIMEOUT_MS = 15_000;\n\nexport interface VaultClientOptions {\n  appId: string;\n  url?: string;\n}\n\n/**\n * The app's side of the vault. Keys live in the vault's origin; this only\n * asks for signatures, and the vault decides whether to ask the user.\n */\nexport class VaultClient {\n  private static readonly attached = new Map<string, VaultClient>();\n  private nextId = 1;\n  private readonly pending = new Map<number, { resolve(value: unknown): void; reject(error: Error): void }>();\n\n  private constructor(private readonly port: Promise<MessagePort>) {\n    // A load failure reaches callers through `call`; this listener has none.\n    port.then((p) => {\n      p.onmessage = ({ data }: MessageEvent<VaultReply>) => this.settle(data);\n    }, () => undefined);\n  }\n\n  /** One iframe per vault URL and app, shared by every wallet on the page. */\n  static attach(opts: VaultClientOptions): VaultClient {\n    const url = opts.url ?? DEFAULT_VAULT_URL;\n    const key = `${url}|${opts.appId}`;\n    let client = VaultClient.attached.get(key);\n    if (!client) {\n      const port = mountIframe(url, opts.appId);\n      const created = new VaultClient(port);\n      VaultClient.attached.set(key, created);\n      // A vault that failed to load must not be the one every later call\n      // gets: forget it, so the next attach mounts a fresh iframe.\n      port.catch(() => {\n        if (VaultClient.attached.get(key) === created) VaultClient.attached.delete(key);\n      });\n      client = created;\n    }\n    return client;\n  }\n\n  /** Talk to a host over an existing port. For tests and custom transports. */\n  static fromPort(port: MessagePort): VaultClient {\n    return new VaultClient(Promise.resolve(port));\n  }\n\n  async connectSolana(params: Omit<ConnectParams, \"chain\">): Promise<{\n    address: string;\n    isNewAccount: boolean;\n    spend: Ed25519SpendSigner | null;\n    passkey: boolean;\n  }> {\n    const result = await this.call(\"connect\", { ...params, chain: \"solana\" });\n    return {\n      address: result.address,\n      isNewAccount: result.isNewAccount,\n      spend: this.solanaSigner(result),\n      passkey: result.passkey === true,\n    };\n  }\n\n  async connectStellar(params: Omit<ConnectParams, \"chain\">): Promise<{\n    address: string;\n    isNewAccount: boolean;\n    control?: ControlKey;\n    passkey: boolean;\n  }> {\n    const result = await this.call(\"connect\", { ...params, chain: \"stellar\" });\n    return {\n      address: result.address,\n      isNewAccount: result.isNewAccount,\n      control: this.stellarSigner(result),\n      passkey: result.passkey === true,\n    };\n  }\n\n  /** `paymasterApiKey` is what the vault hands the relay for private transfers. */\n  async connectStarknet(\n    params: Omit<ConnectParams, \"chain\">,\n    paymasterApiKey?: string,\n  ): Promise<{\n    address: string;\n    isNewAccount: boolean;\n    signer: SignerInterface | null;\n    passkey: boolean;\n    privacy: PrivacyOperations | null;\n  }> {\n    const result = await this.call(\"connect\", { ...params, chain: \"starknet\" });\n    return {\n      address: result.address,\n      isNewAccount: result.isNewAccount,\n      signer: this.starknetSigner(result),\n      passkey: result.passkey === true,\n      privacy: result.publicKey ? this.starknetPrivacy(result.handle, paymasterApiKey ?? \"\") : null,\n    };\n  }\n\n  forget(userId: string, appSalt: string): Promise<void> {\n    return this.call(\"forget\", { userId, appSalt });\n  }\n\n  /** Create a passkey, in the vault's own origin, that can restore the connected account on another device. */\n  enrollPasskey(params: VaultParams<\"enrollPasskey\">): Promise<void> {\n    return this.call(\"enrollPasskey\", params);\n  }\n\n  private solanaSigner({ handle, publicKey }: ConnectResult): Ed25519SpendSigner | null {\n    if (!publicKey) return null;\n    return {\n      address: () => new PublicKey(publicKey).toBase58(),\n      publicKeyRaw: () => publicKey,\n      signTransaction: (message) => this.call(\"signSolanaTransaction\", { handle, message }),\n      signMessage: (message) => this.call(\"signMessage\", { handle, message }),\n    };\n  }\n\n  private starknetPrivacy(handle: string, paymasterApiKey: string): PrivacyOperations {\n    return {\n      status: (token) => this.call(\"privacyStatus\", { handle, ...(token === undefined ? {} : { token }) }),\n      balance: async (token) => BigInt(await this.call(\"privacyBalance\", { handle, token })),\n      register: () => this.call(\"privacyRegister\", { handle, paymasterApiKey }),\n      deposit: (token, amount) => this.call(\"privacyDeposit\", { handle, token, amount: amount.toString(), paymasterApiKey }),\n      transfer: (token, recipient, amount) =>\n        this.call(\"privacyTransfer\", { handle, token, recipient, amount: amount.toString(), paymasterApiKey }),\n      withdraw: (token, recipient, amount) =>\n        this.call(\"privacyWithdraw\", { handle, token, recipient, amount: amount.toString(), paymasterApiKey }),\n    };\n  }\n\n  private starknetSigner({ handle, publicKey }: ConnectResult): SignerInterface | null {\n    if (!publicKey) return null;\n    return new VaultStarknetSigner(\n      num.toHex(bytesToBigInt(publicKey)),\n      (typedData, accountAddress) => this.call(\"signStarknetTypedData\", { handle, typedData, accountAddress }),\n      (calls, details) => this.call(\"signStarknetInvoke\", { handle, calls, details }),\n    );\n  }\n\n  private stellarSigner({ handle, publicKey }: ConnectResult): ControlKey | undefined {\n    if (!publicKey) return undefined;\n    return {\n      publicAddress: () => StrKey.encodeEd25519PublicKey(Buffer.from(publicKey)),\n      publicKeyRaw: () => publicKey,\n      signTransaction: (xdr, networkPassphrase) => this.call(\"signStellarTransaction\", { handle, xdr, networkPassphrase }),\n      signAuthEntry: (preimage) => this.call(\"signStellarAuthEntry\", { handle, preimage }),\n      signMessage: (message) => this.call(\"signMessage\", { handle, message }),\n    };\n  }\n\n  private async call<M extends VaultMethod>(method: M, params: VaultParams<M>): Promise<VaultResult<M>> {\n    const port = await this.port;\n    const id = this.nextId++;\n    return new Promise((resolve, reject) => {\n      this.pending.set(id, { resolve: resolve as (value: unknown) => void, reject });\n      port.postMessage({ id, method, params });\n    });\n  }\n\n  private settle(reply: VaultReply | VaultEvent): void {\n    if (\"event\" in reply) return;\n    const waiter = this.pending.get(reply.id);\n    if (!waiter) return;\n    this.pending.delete(reply.id);\n    if (reply.ok) waiter.resolve(reply.result);\n    else waiter.reject(new Error(reply.error));\n  }\n}\n\n/**\n * A starknet.js signer that never sees a key. It hands the vault what is being\n * signed, typed data or calls, and the vault computes the hash itself.\n */\nclass VaultStarknetSigner extends SignerInterface {\n  constructor(\n    private readonly publicKey: string,\n    private readonly signTypedData: (typedData: TypedData, accountAddress: string) => Promise<string[]>,\n    private readonly signInvoke: (calls: Call[], details: InvocationsSignerDetails) => Promise<string[]>,\n  ) {\n    super();\n  }\n\n  async getPubKey(): Promise<string> {\n    return this.publicKey;\n  }\n\n  signMessage(typedData: TypedData, accountAddress: string): Promise<Signature> {\n    return this.signTypedData(typedData, accountAddress);\n  }\n\n  signTransaction(transactions: Call[], details: InvocationsSignerDetails): Promise<Signature> {\n    const calls = transactions.map((call) => ({ ...call, calldata: CallData.toCalldata(call.calldata) }));\n    return this.signInvoke(calls, details);\n  }\n\n  async signDeployAccountTransaction(_details: DeployAccountSignerDetails): Promise<Signature> {\n    throw new Error(\"kit/vault: deploy-account signing is not supported; Cavos deploys through the paymaster\");\n  }\n\n  async signDeclareTransaction(_details: DeclareSignerDetails): Promise<Signature> {\n    throw new Error(\"kit/vault: declaring classes is not supported\");\n  }\n}\n\n/** Connect through the vault, then retire any copy of the same keys this page stored before it. */\nexport async function connectThroughVault<R extends { address: string; spend?: unknown; control?: unknown; signer?: unknown }>(\n  chain: NativeChain,\n  identity: Identity,\n  appSalt: string,\n  connect: () => Promise<R>,\n): Promise<R> {\n  const result = await connect();\n  if (result.spend || result.control || result.signer) {\n    await dropLegacyCopies(chain, identity.userId, appSalt, result.address).catch(() => undefined);\n  }\n  return result;\n}\n\nexport function vaultConnectParams(input: {\n  identity: Identity;\n  appSalt: string;\n  network: string;\n  environment?: \"development\" | \"production\";\n  auth?: AuthProvider;\n  credential?: SocialRecoveryCredential;\n  socialRecovery?: unknown;\n  passkey?: unknown;\n}): Omit<ConnectParams, \"chain\"> {\n  return {\n    network: input.network,\n    ...(input.environment ? { environment: input.environment } : {}),\n    appSalt: input.appSalt,\n    userId: input.identity.userId,\n    ...(input.identity.email ? { userName: input.identity.email } : {}),\n    recovery: input.socialRecovery ? \"enclave\" : input.passkey ? \"passkey\" : \"none\",\n    ...(input.credential ? { credential: input.credential } : {}),\n    authToken: input.auth?.getAuthToken?.() ?? null,\n  };\n}\n\nfunction mountIframe(url: string, appId: string): Promise<MessagePort> {\n  if (typeof document === \"undefined\") {\n    return Promise.reject(new Error(\"kit/vault: the vault needs a browser\"));\n  }\n  const origin = new URL(url).origin;\n  const iframe = document.createElement(\"iframe\");\n  iframe.src = url;\n  // aria-label, not title: Safari shows a title as a tooltip over the whole page.\n  iframe.setAttribute(\"aria-label\", \"Cavos\");\n  iframe.allow = `publickey-credentials-get ${origin}; publickey-credentials-create ${origin}`;\n  iframe.style.cssText =\n    \"display:none;position:fixed;inset:0;width:100%;height:100%;border:0;z-index:2147483647;background:transparent;color-scheme:normal\";\n  document.body.append(iframe);\n\n  return new Promise((resolve, reject) => {\n    const timeout = setTimeout(() => {\n      window.removeEventListener(\"message\", onReady);\n      reject(new Error(`kit/vault: ${origin} did not load`));\n    }, LOAD_TIMEOUT_MS);\n\n    const onReady = (event: MessageEvent) => {\n      if (event.source !== iframe.contentWindow || event.origin !== origin || event.data?.type !== VAULT_READY) return;\n      window.removeEventListener(\"message\", onReady);\n      const channel = new MessageChannel();\n      channel.port1.onmessage = ({ data }: MessageEvent<VaultReply>) => {\n        clearTimeout(timeout);\n        if (data.id !== 0) return;\n        if (!data.ok) {\n          reject(new Error(data.error));\n          return;\n        }\n        channel.port1.onmessage = null;\n        channel.port1.addEventListener(\"message\", ({ data: message }: MessageEvent<VaultEvent>) => {\n          if (message && \"event\" in message) iframe.style.display = message.event === \"show\" ? \"block\" : \"none\";\n        });\n        channel.port1.start();\n        resolve(channel.port1);\n      };\n      iframe.contentWindow?.postMessage({ type: VAULT_HELLO, appId }, origin, [channel.port2]);\n    };\n    window.addEventListener(\"message\", onReady);\n  });\n}\n","import { base64UrlToBytes, bytesToBase64Url } from \"../crypto/encoding\";\n\n/** One passkey's encrypted copy of the DEK, and the passkey it opens with. */\nexport interface StoredPasskeyWrap {\n  credentialId: Uint8Array;\n  wrap: Uint8Array;\n}\n\n/** Where passkey wraps live. They are ciphertext: the store never sees what they protect. */\nexport interface PasskeyWrapStore {\n  list(userId: string): Promise<StoredPasskeyWrap[]>;\n  save(userId: string, entry: StoredPasskeyWrap): Promise<void>;\n}\n\nexport interface HttpPasskeyWrapStoreOptions {\n  baseUrl: string;\n  appId: string;\n  environment?: \"development\" | \"production\";\n  /** The login's id_token. Read fresh on each call; these tokens expire. */\n  authToken: () => string | null;\n}\n\n/** `/api/passkey-wraps` on the Cavos backend, authenticated as the end user. */\nexport class HttpPasskeyWrapStore implements PasskeyWrapStore {\n  constructor(private readonly opts: HttpPasskeyWrapStoreOptions) {}\n\n  async list(userId: string): Promise<StoredPasskeyWrap[]> {\n    const url = new URL(\"/api/passkey-wraps\", this.opts.baseUrl);\n    url.searchParams.set(\"app_id\", this.opts.appId);\n    url.searchParams.set(\"user_social_id\", userId);\n    if (this.opts.environment) url.searchParams.set(\"environment\", this.opts.environment);\n    const res = await fetch(url, { headers: this.headers() });\n    if (!res.ok) throw new Error(`passkey wraps lookup failed: ${res.status}`);\n    const { wraps } = (await res.json()) as { wraps: { credential_id: string; wrapped_dek: string }[] };\n    return wraps.map((row) => ({\n      credentialId: base64UrlToBytes(row.credential_id),\n      wrap: base64UrlToBytes(row.wrapped_dek),\n    }));\n  }\n\n  async save(userId: string, entry: StoredPasskeyWrap): Promise<void> {\n    const res = await fetch(new URL(\"/api/passkey-wraps\", this.opts.baseUrl), {\n      method: \"POST\",\n      headers: this.headers(),\n      body: JSON.stringify({\n        app_id: this.opts.appId,\n        ...(this.opts.environment ? { environment: this.opts.environment } : {}),\n        user_social_id: userId,\n        credential_id: bytesToBase64Url(entry.credentialId),\n        wrapped_dek: bytesToBase64Url(entry.wrap),\n      }),\n    });\n    if (!res.ok) throw new Error(`passkey wrap save failed: ${res.status}`);\n  }\n\n  private headers(): Record<string, string> {\n    const token = this.opts.authToken();\n    return {\n      \"Content-Type\": \"application/json\",\n      ...(token ? { Authorization: `Bearer ${token}` } : {}),\n    };\n  }\n}\n","import type { DeviceUnwrapKey } from \"../chains/stellar/DeviceUnwrapKey\";\nimport { parseMasterDEK } from \"./dek\";\nimport { wrapDekToSec1 } from \"./wrap\";\nimport type { DeviceFactor } from \"./DeviceSecret\";\n\nexport function deviceFactorFromUnwrapKey(key: DeviceUnwrapKey): DeviceFactor {\n  return {\n    publicKeySec1: () => key.publicKeySec1(),\n    unwrap: async (blob) => parseMasterDEK(await key.unwrap(blob)),\n    wrap: (dek) => wrapDekToSec1(dek, key.publicKeySec1()),\n  };\n}\n","import type { SocialRecoveryCredential } from \"../recovery/SocialRecoveryCredential\";\nimport { generateMasterDEK, zeroize, type MasterDEK } from \"./dek\";\nimport {\n  nativeAddress,\n  type AppSalt,\n  type NativeChain,\n} from \"./derive\";\nimport { parseWrappedDEK, type WrappedDEK } from \"./wrap\";\n\n/** New device, no local wrap, and nothing that can restore one. */\nexport const NO_WRAP_SOURCE = \"kit/secret: this device has no local key and no recovery wrap\";\n\nexport interface DeviceFactor {\n  publicKeySec1(): Uint8Array;\n  unwrap(blob: WrappedDEK): Promise<MasterDEK>;\n  wrap(dek: MasterDEK): WrappedDEK;\n}\n\nexport interface WrapStore {\n  get(userId: string): Promise<WrappedDEK | null>;\n  put(userId: string, wrap: WrappedDEK): Promise<void>;\n  clear(userId: string): Promise<void>;\n}\n\nexport interface AddressIndex {\n  lookup(userId: string, chain: NativeChain): Promise<string | null>;\n  claim(\n    userId: string,\n    chain: NativeChain,\n    address: string,\n  ): Promise<{ address: string; existing: boolean }>;\n}\n\nexport interface EnclaveDekPort {\n  lookupDek(params: {\n    credential: SocialRecoveryCredential;\n  }): Promise<{ address: string } | null>;\n  enrollDek(params: {\n    address: string;\n    credential: SocialRecoveryCredential;\n    dek: MasterDEK;\n  }): Promise<{ kind: \"enrolled\" } | { kind: \"already-enrolled\"; address: string }>;\n  wrapDekToFactor(params: {\n    address: string;\n    credential: SocialRecoveryCredential;\n    recipientSec1: Uint8Array;\n  }): Promise<WrappedDEK>;\n  /**\n   * Passkey path: the DEK is HKDF of the PRF, not a random secret stored on\n   * the server. When this returns a DEK, ensure derives the address from it.\n   */\n  mintDek?(params: {\n    credential: SocialRecoveryCredential;\n  }): Promise<MasterDEK | null>;\n  /**\n   * Restore the DEK of an account that already exists, from a factor that\n   * holds a copy (a passkey). Ensure still checks it derives the address.\n   */\n  restoreDek?(params: {\n    credential: SocialRecoveryCredential;\n  }): Promise<MasterDEK>;\n}\n\nexport type ReadySecret = {\n  kind: \"ready\";\n  wrap: WrappedDEK;\n  addresses: Partial<Record<NativeChain, string>>;\n};\n\nexport type EnclaveEnsureInput = {\n  userId: string;\n  appSalt: AppSalt;\n  chains: readonly NativeChain[];\n  factor: DeviceFactor;\n  recovery: EnclaveDekPort;\n  registry: AddressIndex;\n  store: WrapStore;\n  credential: SocialRecoveryCredential;\n};\n\nconst inFlight = new Map<string, Promise<ReadySecret>>();\n\nfunction isMissingEnrollment(error: unknown): boolean {\n  const message = error instanceof Error ? error.message : String(error);\n  return (\n    message.includes(\"not_enrolled\") ||\n    message.includes(\"nothing to recover\")\n  );\n}\n\nexport async function ensureEnclave(input: EnclaveEnsureInput): Promise<ReadySecret> {\n  if (input.chains.length === 0) throw new Error(\"kit/secret: ensure needs a chain\");\n  const key = `${input.userId}:${input.chains.join(\",\")}`;\n  const pending = inFlight.get(key);\n  if (pending) return pending;\n  const work = runEnsure(input).finally(() => inFlight.delete(key));\n  inFlight.set(key, work);\n  return work;\n}\n\nasync function runEnsure(input: EnclaveEnsureInput): Promise<ReadySecret> {\n  const { userId, appSalt, chains, factor, recovery, registry, store, credential } = input;\n  const primary = chains[0];\n\n  let wrap = await store.get(userId);\n  let dek: MasterDEK | null = null;\n  if (wrap) {\n    try {\n      dek = await factor.unwrap(wrap);\n    } catch {\n      // Salt change or a wrap from another factor: this device cannot open it.\n      wrap = null;\n      await store.clear(userId);\n    }\n  }\n  const registered = await lookupAny(registry, userId, chains);\n\n  if (dek && registered) {\n    const derived = nativeAddress(dek, registered.chain, appSalt);\n    if (derived !== registered.address) {\n      zeroize(dek);\n      dek = null;\n      wrap = null;\n      await store.clear(userId);\n    }\n  }\n\n  if (dek && registered) {\n    // A previous connect may have claimed the address and then failed to\n    // seal. This device still spends from IndexedDB; a new phone cannot,\n    // because recover finds nothing in the enclave. Seal every time we have\n    // the DEK — enroll is idempotent once the wrap is there.\n    return sealLocalDek(dek);\n  }\n\n  if (!dek && registered) {\n    const minted = recovery.restoreDek\n      ? await recovery.restoreDek({ credential })\n      : await recovery.mintDek?.({ credential });\n    if (minted) {\n      const derived = nativeAddress(minted, registered.chain, appSalt);\n      if (derived === registered.address) {\n        wrap = factor.wrap(minted);\n        await store.put(userId, wrap);\n        return sealLocalDek(minted);\n      }\n      zeroize(minted);\n    }\n    try {\n      return await recoverAt(registered.address, false);\n    } catch (error) {\n      if (isMissingEnrollment(error)) {\n        throw new Error(\n          \"kit/secret: this wallet has no sealed recovery. Open it once on the device that created it.\",\n        );\n      }\n      throw error;\n    }\n  }\n\n  if (!dek) {\n    const found = await recovery.lookupDek({ credential });\n    if (found) return recoverAt(found.address, true);\n    dek = (await recovery.mintDek?.({ credential })) ?? generateMasterDEK();\n    wrap = factor.wrap(dek);\n    await store.put(userId, wrap);\n  }\n\n  const address = nativeAddress(dek, primary, appSalt);\n  const claimed = await registry.claim(userId, primary, address);\n  if (claimed.address !== address) {\n    zeroize(dek);\n    return recoverAt(claimed.address, false);\n  }\n\n  const enrolled = await recovery.enrollDek({ address, credential, dek });\n  if (enrolled.kind === \"already-enrolled\") {\n    if (enrolled.address !== address) {\n      zeroize(dek);\n      return recoverAt(enrolled.address, true);\n    }\n    await claimAll(registry, userId, chains, dek, appSalt);\n    return finish(store, userId, wrap ?? factor.wrap(dek), dek, chains, appSalt);\n  }\n\n  await claimAll(registry, userId, chains, dek, appSalt);\n  return finish(store, userId, wrap ?? factor.wrap(dek), dek, chains, appSalt);\n\n  async function sealLocalDek(current: MasterDEK): Promise<ReadySecret> {\n    const local = nativeAddress(current, primary, appSalt);\n    const sealed = await recovery.enrollDek({\n      address: local,\n      credential,\n      dek: current,\n    });\n    if (sealed.kind === \"already-enrolled\" && sealed.address !== local) {\n      zeroize(current);\n      return recoverAt(sealed.address, true);\n    }\n    await claimAll(registry, userId, chains, current, appSalt);\n    return finish(store, userId, wrap ?? factor.wrap(current), current, chains, appSalt);\n  }\n\n  async function recoverAt(target: string, sealThisChain: boolean): Promise<ReadySecret> {\n    wrap = await recovery.wrapDekToFactor({\n      address: target,\n      credential,\n      recipientSec1: factor.publicKeySec1(),\n    });\n    await store.put(userId, wrap);\n    dek = await factor.unwrap(wrap);\n    await claimAll(registry, userId, chains, dek, appSalt);\n    if (sealThisChain) {\n      const local = nativeAddress(dek, primary, appSalt);\n      await recovery.enrollDek({ address: local, credential, dek });\n    }\n    return finish(store, userId, wrap, dek, chains, appSalt);\n  }\n}\n\nasync function lookupAny(\n  registry: AddressIndex,\n  userId: string,\n  chains: readonly NativeChain[],\n): Promise<{ chain: NativeChain; address: string } | null> {\n  for (const chain of chains) {\n    const address = await registry.lookup(userId, chain);\n    if (address) return { chain, address };\n  }\n  return null;\n}\n\nasync function claimAll(\n  registry: AddressIndex,\n  userId: string,\n  chains: readonly NativeChain[],\n  dek: MasterDEK,\n  appSalt: AppSalt,\n): Promise<void> {\n  for (const chain of chains) {\n    const address = nativeAddress(dek, chain, appSalt);\n    const claimed = await registry.claim(userId, chain, address);\n    if (claimed.address !== address) {\n      throw new Error(\"kit/secret: registry already holds a different address\");\n    }\n  }\n}\n\nasync function finish(\n  store: WrapStore,\n  userId: string,\n  wrap: WrappedDEK,\n  dek: MasterDEK,\n  chains: readonly NativeChain[],\n  appSalt: AppSalt,\n): Promise<ReadySecret> {\n  const addresses: ReadySecret[\"addresses\"] = {};\n  for (const chain of chains) {\n    addresses[chain] = nativeAddress(dek, chain, appSalt);\n  }\n  zeroize(dek);\n  await store.put(userId, wrap);\n  return { kind: \"ready\", wrap: parseWrappedDEK(wrap), addresses };\n}\n","import { gcm } from \"@noble/ciphers/aes\";\nimport { hkdf } from \"@noble/hashes/hkdf\";\nimport { sha256 } from \"@noble/hashes/sha256\";\nimport { randomBytes } from \"@noble/hashes/utils\";\nimport { utf8ToBytes } from \"../crypto/encoding\";\nimport { parseMasterDEK, zeroize, type MasterDEK } from \"./dek\";\n\n/**\n * A MasterDEK encrypted under a key only the passkey can produce: the PRF\n * output, stretched by HKDF. Cavos stores it and cannot open it.\n *\n * Layout: version(1) || nonce(12) || AES-GCM(kek, dek)(32 + 16).\n */\nexport type PasskeyWrap = Uint8Array & { readonly __brand: \"PasskeyWrap\" };\n\nconst VERSION = 0x01;\nconst NONCE_LEN = 12;\nconst WRAP_LEN = 1 + NONCE_LEN + 32 + 16;\nconst INFO = \"cavos-passkey-dek-wrap-v1\";\n\n/** Whose DEK this is. Bound into the ciphertext, so a wrap moved to another user or app does not open. */\nexport interface WrapOwner {\n  appId: string;\n  userId: string;\n}\n\nexport function wrapDek(dek: MasterDEK, prf: Uint8Array, owner: WrapOwner): PasskeyWrap {\n  const kek = deriveKek(prf);\n  try {\n    const nonce = randomBytes(NONCE_LEN);\n    const sealed = gcm(kek, nonce, aad(owner)).encrypt(dek);\n    const wrap = new Uint8Array(WRAP_LEN);\n    wrap[0] = VERSION;\n    wrap.set(nonce, 1);\n    wrap.set(sealed, 1 + NONCE_LEN);\n    return wrap as PasskeyWrap;\n  } finally {\n    zeroize(kek);\n  }\n}\n\n/** Throws when the wrap is malformed, from another owner, or sealed under another passkey. */\nexport function unwrapDek(wrap: Uint8Array, prf: Uint8Array, owner: WrapOwner): MasterDEK {\n  if (wrap.length !== WRAP_LEN || wrap[0] !== VERSION) {\n    throw new Error(\"kit/secret: unknown passkey wrap format\");\n  }\n  const kek = deriveKek(prf);\n  try {\n    const nonce = wrap.subarray(1, 1 + NONCE_LEN);\n    return parseMasterDEK(gcm(kek, nonce, aad(owner)).decrypt(wrap.subarray(1 + NONCE_LEN)));\n  } finally {\n    zeroize(kek);\n  }\n}\n\nfunction deriveKek(prf: Uint8Array): Uint8Array {\n  if (prf.length < 32) throw new Error(\"kit/secret: passkey PRF output too short\");\n  return hkdf(sha256, prf, undefined, INFO, 32);\n}\n\nfunction aad({ appId, userId }: WrapOwner): Uint8Array {\n  return utf8ToBytes(`${appId}:${userId}`);\n}\n","import type { PasskeyWrapStore } from \"../registry/PasskeyWrapStore\";\nimport type { PasskeyEnrollParams, PasskeyPrfProvider } from \"../signer/PasskeyProvider\";\nimport { zeroize, type MasterDEK } from \"./dek\";\nimport { NO_WRAP_SOURCE, type EnclaveDekPort } from \"./DeviceSecret\";\nimport { unwrapDek, wrapDek, type WrapOwner } from \"./passkeyWrap\";\n\nexport const PASSKEY_DOES_NOT_OPEN = \"kit/secret: this passkey does not hold this wallet's key\";\n\nexport interface PasskeyRecovery {\n  passkey: PasskeyPrfProvider;\n  wraps: PasskeyWrapStore;\n  owner: WrapOwner;\n}\n\n/**\n * A passkey restores an account; it never creates one. A new account gets a\n * random DEK like any other, and each passkey the user adds stores a copy of\n * it encrypted under its PRF.\n */\nexport function toPasskeyDekPort(input: PasskeyRecovery): EnclaveDekPort {\n  return {\n    async lookupDek() {\n      return null;\n    },\n    async enrollDek() {\n      return { kind: \"enrolled\" };\n    },\n    async restoreDek() {\n      const stored = await input.wraps.list(input.owner.userId);\n      // No passkey was ever added: do not ask for one.\n      if (stored.length === 0) throw new Error(NO_WRAP_SOURCE);\n      const prf = await passkeySecret(input.passkey, stored.length === 1 ? stored[0].credentialId : undefined);\n      try {\n        // With several passkeys, the one that opens is the one the user chose.\n        for (const { wrap } of stored) {\n          try {\n            return unwrapDek(wrap, prf, input.owner);\n          } catch {\n            // Sealed under another passkey.\n          }\n        }\n        throw new Error(PASSKEY_DOES_NOT_OPEN);\n      } finally {\n        zeroize(prf);\n      }\n    },\n    async wrapDekToFactor() {\n      throw new Error(PASSKEY_DOES_NOT_OPEN);\n    },\n  };\n}\n\n/** Create a passkey and store the DEK encrypted under it. */\nexport async function addPasskey(\n  input: PasskeyRecovery & { dek: MasterDEK; user: PasskeyEnrollParams },\n): Promise<void> {\n  const enrolled = await input.passkey.enroll(input.user);\n  // Many authenticators create the credential without evaluating the PRF.\n  const prf = enrolled.secret ?? (await input.passkey.getSecret(enrolled.credentialId));\n  try {\n    await input.wraps.save(input.owner.userId, {\n      credentialId: enrolled.credentialId,\n      wrap: wrapDek(input.dek, prf, input.owner),\n    });\n  } finally {\n    zeroize(prf);\n  }\n}\n\nasync function passkeySecret(passkey: PasskeyPrfProvider, credentialId?: Uint8Array): Promise<Uint8Array> {\n  try {\n    return await passkey.getSecret(credentialId);\n  } catch (error) {\n    // Declining leaves the device signed in without the key, like a login with no passkey.\n    if (isDeclined(error)) throw new Error(NO_WRAP_SOURCE);\n    throw error;\n  }\n}\n\nfunction isDeclined(error: unknown): boolean {\n  if (typeof DOMException !== \"undefined\" && error instanceof DOMException && error.name === \"NotAllowedError\") {\n    return true;\n  }\n  const message = error instanceof Error ? error.message : String(error);\n  return message.includes(\"cancelled\");\n}\n","import { base64UrlToBytes } from \"../crypto/encoding\";\nimport { readTokenSubject } from \"./SocialRecoveryCredential\";\nimport type { EnclaveDekPort } from \"../secret/DeviceSecret\";\nimport { parseWrappedDEK } from \"../secret/wrap\";\nimport type { SocialRecoveryClient } from \"./SocialRecoveryClient\";\n\nexport function toEnclaveDekPort(\n  client: Pick<SocialRecoveryClient, \"enroll\" | \"recover\" | \"lookupDekEnrollment\">,\n): EnclaveDekPort {\n  return {\n    async lookupDek(params) {\n      const subject = readTokenSubject(params.credential.idToken);\n      try {\n        const row = await client.lookupDekEnrollment({\n          provider: params.credential.provider,\n          subject,\n          idToken: params.credential.idToken,\n        });\n        return row ? { address: row.wallet_address } : null;\n      } catch {\n        // Production still answers this GET with wallet_address only. A miss\n        // is not a failed login: this device mints or uses its local wrap.\n        return null;\n      }\n    },\n    async enrollDek(params) {\n      const { result } = await client.enroll({\n        walletAddress: params.address,\n        credential: params.credential,\n        dek: params.dek,\n      });\n      if (result.result !== \"confirmed\") return { kind: \"enrolled\" };\n      // The wallet already had a record, and the enclave has now said whether\n      // it seals this DEK. A mismatch must not lock the user out of a wallet\n      // this device can still spend from, but it must not pass silently either:\n      // it means a lost device would not be recoverable.\n      if (result.dek_matches !== true) {\n        console.error(\n          \"[cavos] the recovery record for this wallet does not hold its key; recovery is not protecting it.\",\n        );\n      }\n      return { kind: \"already-enrolled\", address: params.address };\n    },\n    async wrapDekToFactor(params) {\n      const { result } = await client.recover({\n        walletAddress: params.address,\n        credential: params.credential,\n        authorizations: [],\n        recipientPublicSec1: params.recipientSec1,\n      });\n      const wrapped = result.stellar_device_wrap_b64;\n      if (typeof wrapped !== \"string\" || !wrapped) {\n        throw new Error(\"kit/secret: enclave returned no device wrap\");\n      }\n      return parseWrappedDEK(base64UrlToBytes(wrapped));\n    },\n  };\n}\n","import type { WalletRegistry } from \"../registry/WalletRegistry\";\nimport type { AddressIndex } from \"./DeviceSecret\";\n\nconst PLACEHOLDER_SIGNER = { x: 0n, y: 0n };\n\nexport function addressIndexFromRegistry(registry: WalletRegistry): AddressIndex {\n  return {\n    async lookup(userId) {\n      const row = await registry.lookup(userId);\n      return row?.address ?? null;\n    },\n    async claim(userId, _chain, address) {\n      const result = await registry.register({\n        userId,\n        address,\n        initialSigner: PLACEHOLDER_SIGNER,\n      });\n      return { address: result.address, existing: result.conflict };\n    },\n  };\n}\n","import type { Identity } from \"../auth/AuthProvider\";\nimport { toEnclaveDekPort } from \"../recovery/EnclaveDekPort\";\nimport type { SocialRecoveryClient } from \"../recovery/SocialRecoveryClient\";\nimport type { SocialRecoveryCredential } from \"../recovery/SocialRecoveryCredential\";\nimport type { WalletRegistry } from \"../registry/WalletRegistry\";\nimport { WebCryptoDeviceUnwrapKey } from \"../chains/stellar/WebCryptoDeviceUnwrapKey\";\nimport { HttpPasskeyWrapStore, type PasskeyWrapStore } from \"../registry/PasskeyWrapStore\";\nimport type { PasskeyPrfProvider } from \"../signer/PasskeyProvider\";\nimport { addressIndexFromRegistry } from \"./addressIndex\";\nimport { deriveSeed, parseAppSalt, type NativeChain } from \"./derive\";\nimport { ensureEnclave, NO_WRAP_SOURCE } from \"./DeviceSecret\";\nimport type { DeviceFactor, EnclaveDekPort, WrapStore } from \"./DeviceSecret\";\nimport { deviceFactorFromUnwrapKey } from \"./factor\";\nimport { idbWrapStore } from \"./idbWrapStore\";\nimport { toPasskeyDekPort } from \"./PasskeyDekPort\";\nimport { zeroize, type Ed25519Seed } from \"./dek\";\nimport type { Ed25519SpendSigner } from \"../signer/Ed25519SpendSigner\";\n\nexport interface ResolveNativeInput<S extends { address(): string } = Ed25519SpendSigner> {\n  chain: NativeChain;\n  identity: Identity;\n  appSalt: string;\n  registry: WalletRegistry;\n  credential?: SocialRecoveryCredential;\n  socialRecovery?: SocialRecoveryClient;\n  recovery?: EnclaveDekPort;\n  /** Restores a registered account on a new device, from a passkey the user added. Needs `passkeyWraps` and `appId`. */\n  passkey?: PasskeyPrfProvider;\n  passkeyWraps?: PasskeyWrapStore;\n  appId?: string;\n  factor?: DeviceFactor;\n  store?: WrapStore;\n  importSpend?: (seed: Ed25519Seed, keyId: string) => Promise<S>;\n  loadPersisted?: (keyId: string) => Promise<S | null>;\n  /**\n   * Prefixes every stored key. The vault passes the app id, so one app can\n   * never load another app's keys from the same browser storage.\n   */\n  keyScope?: string;\n}\n\nconst PASSKEY_CREDENTIAL: SocialRecoveryCredential = {\n  idToken: \"a.b.c\",\n  tokenFingerprint: \"passkey\",\n  provider: \"google\",\n};\n\nexport { NO_WRAP_SOURCE };\n\nfunction localOnlyDekPort(): EnclaveDekPort {\n  return {\n    async lookupDek() {\n      return null;\n    },\n    async enrollDek() {\n      return { kind: \"enrolled\" };\n    },\n    async mintDek() {\n      return null;\n    },\n    async wrapDekToFactor() {\n      throw new Error(NO_WRAP_SOURCE);\n    },\n  };\n}\n\nexport async function resolveNative<S extends { address(): string } = Ed25519SpendSigner>(\n  input: ResolveNativeInput<S>,\n): Promise<{ address: string; spend: S | null; isNewAccount: boolean }> {\n  const appSalt = parseAppSalt(input.appSalt);\n  const scoped = (id: string) => (input.keyScope ? `${input.keyScope}|${id}` : id);\n  const keyId = scoped(`${input.chain}:${input.identity.userId}:${input.appSalt}`);\n  const factor = async (): Promise<DeviceFactor> =>\n    input.factor ??\n    deviceFactorFromUnwrapKey(\n      await WebCryptoDeviceUnwrapKey.loadOrCreate({\n        keyId: scoped(`${input.identity.userId}:${input.appSalt}`),\n      }),\n    );\n  const ensure = async (deviceFactor: DeviceFactor) =>\n    ensureEnclave({\n      userId: input.identity.userId,\n      appSalt,\n      chains: [input.chain],\n      factor: deviceFactor,\n      recovery: input.recovery ?? dekPort(input),\n      registry: addressIndexFromRegistry(input.registry),\n      store: input.store ?? idbWrapStore(input.keyScope),\n      credential: recoveryCredential(input),\n    });\n\n  const loaded = input.loadPersisted ? await input.loadPersisted(keyId) : null;\n  if (loaded) {\n    // A wallet created before this app used the enclave (on passkeys, or with\n    // the host off) was never sealed, so a new device would find nothing to\n    // recover. Seal it while this login's proof is fresh. Enroll is idempotent,\n    // and hardening must never break a wallet that already signs here.\n    //\n    // Not awaited: on a wallet that is already sealed this is an enclave\n    // session, a job and a registry claim per chain — about 3.5s of a login\n    // that needs none of it to sign.\n    if (input.credential && (input.socialRecovery || input.recovery)) {\n      void factor().then(ensure).catch((error: unknown) =>\n        console.warn(`[cavos] could not seal this wallet for recovery: ${error instanceof Error ? error.message : error}`),\n      );\n    }\n    return { address: loaded.address(), spend: loaded, isNewAccount: false };\n  }\n\n  const deviceFactor = await factor();\n  let existing = false;\n  try {\n    existing = Boolean(await input.registry.lookup(input.identity.userId));\n  } catch {\n    existing = false;\n  }\n  let ready;\n  try {\n    ready = await ensure(deviceFactor);\n  } catch (error) {\n    const registered = await input.registry.lookup(input.identity.userId);\n    if (\n      registered &&\n      error instanceof Error &&\n      error.message === NO_WRAP_SOURCE\n    ) {\n      return { address: registered.address, spend: null, isNewAccount: false };\n    }\n    throw error;\n  }\n  const address = ready.addresses[input.chain];\n  if (!address) throw new Error(`kit/${input.chain}: native connect derived no address`);\n  const dek = await deviceFactor.unwrap(ready.wrap);\n  const seed = deriveSeed(dek, input.chain, appSalt);\n  zeroize(dek);\n  try {\n    if (!input.importSpend) {\n      throw new Error(`kit/${input.chain}: native connect needs importSpend`);\n    }\n    const spend = await input.importSpend(seed, keyId);\n    if (spend.address() !== address) {\n      throw new Error(`kit/${input.chain}: spend key does not match the derived address`);\n    }\n    return { address, spend, isNewAccount: !existing };\n  } finally {\n    zeroize(seed);\n  }\n}\n\n/** The passkey fields of a native connect, with the Cavos backend's wrap store. Empty without a passkey or app. */\nexport function passkeyRestoreInput(opts: {\n  passkey?: PasskeyPrfProvider;\n  appId?: string;\n  backendUrl: string;\n  environment?: \"development\" | \"production\";\n  authToken: () => string | null;\n}): Pick<ResolveNativeInput, \"passkey\" | \"passkeyWraps\" | \"appId\"> {\n  if (!opts.passkey || !opts.appId) return {};\n  return {\n    passkey: opts.passkey,\n    appId: opts.appId,\n    passkeyWraps: new HttpPasskeyWrapStore({\n      baseUrl: opts.backendUrl,\n      appId: opts.appId,\n      ...(opts.environment ? { environment: opts.environment } : {}),\n      authToken: opts.authToken,\n    }),\n  };\n}\n\nfunction recoveryCredential(input: ResolveNativeInput<{ address(): string }>): SocialRecoveryCredential {\n  if (input.credential) return input.credential;\n  if (input.passkey && !input.socialRecovery && !input.recovery) return PASSKEY_CREDENTIAL;\n  if (!input.socialRecovery && !input.recovery) return PASSKEY_CREDENTIAL;\n  throw new Error(\n    `kit/${input.chain}: this wallet is protected by recovery. Sign in again with Google, Apple or an email code to continue.`,\n  );\n}\n\nfunction dekPort(input: ResolveNativeInput<{ address(): string }>): EnclaveDekPort {\n  if (input.recovery) return input.recovery;\n  if (input.socialRecovery) return toEnclaveDekPort(input.socialRecovery);\n  if (input.passkey) {\n    if (!input.passkeyWraps || !input.appId) {\n      throw new Error(`kit/${input.chain}: passkey restore needs an appId`);\n    }\n    return toPasskeyDekPort({\n      passkey: input.passkey,\n      wraps: input.passkeyWraps,\n      owner: { appId: input.appId, userId: input.identity.userId },\n    });\n  }\n  return localOnlyDekPort();\n}\n"]}