@accesly/core 1.4.1 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/index.cjs +40 -0
- package/dist/api/index.cjs.map +1 -1
- package/dist/api/index.d.cts +66 -1
- package/dist/api/index.d.ts +66 -1
- package/dist/api/index.js +40 -0
- package/dist/api/index.js.map +1 -1
- package/dist/index.cjs +40 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/crypto/random.ts","../src/crypto/aesgcm.ts","../src/crypto/keypair.ts","../src/crypto/shamir.ts","../src/crypto/zeroize.ts","../src/mpc/split.ts","../src/mpc/combine.ts","../src/crypto/kdf.ts","../src/crypto/recoveryKey.ts","../src/crypto/x25519.ts","../src/crypto/sessionFragment.ts","../src/crypto/hash.ts","../src/auth/cognito.ts","../src/auth/session.ts","../src/auth/tokens.ts","../src/api/errors.ts","../src/errors/format.ts","../src/api/client.ts","../src/api/endpoints.ts","../src/webauthn/register.ts","../src/webauthn/verify.ts","../src/webauthn/storage.ts","../src/stellar/loadSdk.ts","../src/stellar/builder.ts","../src/stellar/signer.ts","../src/stellar/contractAddress.ts","../src/stellar/horizon.ts","../src/stellar/sorobanAuth.ts","../src/stellar/format.ts","../src/index.ts"],"names":["gcm","ed25519","sha256","hkdf","pbkdf2","x25519","nobleSha256","CognitoUserPool","CognitoUserAttribute","AuthenticationDetails","CognitoRefreshToken","CognitoUser","asBufferSource","base64ToBytes"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Cryptographically secure randomness.\n *\n * Wraps the platform CSPRNG (`crypto.getRandomValues`) so tests can inject a\n * deterministic source. Production code should never see the override.\n *\n * The Web Crypto API is available in Node 20+, modern browsers, and React Native\n * (via react-native-quick-crypto or polyfill). No fallback is provided — failing\n * loud is better than silently using a weaker source.\n */\n\ntype RandomSource = (length: number) => Uint8Array;\n\nconst platformSource: RandomSource = (length: number): Uint8Array => {\n if (typeof globalThis.crypto?.getRandomValues !== 'function') {\n throw new Error(\n 'crypto.getRandomValues is not available in this environment. ' +\n 'Accesly requires Node 20+ or a modern browser/React Native runtime.',\n );\n }\n const out = new Uint8Array(length);\n globalThis.crypto.getRandomValues(out);\n return out;\n};\n\nlet currentSource: RandomSource = platformSource;\n\n/**\n * Returns `length` cryptographically random bytes.\n */\nexport function getRandomBytes(length: number): Uint8Array {\n if (!Number.isInteger(length) || length < 0 || length > 65_536) {\n throw new RangeError(`getRandomBytes: length must be 0..65536, got ${length}`);\n }\n return currentSource(length);\n}\n\n/**\n * Test-only: replace the randomness source with a deterministic one.\n * Returns a restore function.\n *\n * Never call this from production code. Tests use it for property-based and\n * reproducible scenarios.\n */\nexport function __setRandomSourceForTests(source: RandomSource): () => void {\n const previous = currentSource;\n currentSource = source;\n return () => {\n currentSource = previous;\n };\n}\n","/**\n * AES-256-GCM authenticated encryption.\n *\n * Wraps `@noble/ciphers/aes`. The auth tag is appended to the ciphertext, as\n * is standard for AEAD APIs (and what the backend openapi spec assumes for\n * `EncryptedFragment.ciphertext`).\n *\n * Nonce reuse with the same key is catastrophic for AES-GCM. We generate a\n * fresh 96-bit nonce on every encrypt and never expose a \"nonce override\"\n * parameter to consumers.\n */\n\nimport { gcm } from '@noble/ciphers/aes';\nimport { getRandomBytes } from './random.js';\n\nexport const AES_KEY_LENGTH = 32; // 256 bits\nexport const AES_GCM_NONCE_LENGTH = 12; // 96 bits, recommended by NIST SP 800-38D\nexport const AES_GCM_TAG_LENGTH = 16; // 128 bits\n\nexport interface EncryptedEnvelope {\n /** Random 12-byte nonce used for this encryption. */\n readonly nonce: Uint8Array;\n /** AES-GCM ciphertext with the 16-byte auth tag appended. */\n readonly ciphertext: Uint8Array;\n /** Optional additional authenticated data, kept for round-tripping. */\n readonly aad?: Uint8Array;\n}\n\n/**\n * Encrypts `plaintext` with `key` and optional `aad`. The returned envelope\n * contains a fresh nonce and ciphertext with the auth tag appended.\n */\nexport function encryptAesGcm(\n plaintext: Uint8Array,\n key: Uint8Array,\n aad?: Uint8Array,\n): EncryptedEnvelope {\n assertKeyLength(key);\n const nonce = getRandomBytes(AES_GCM_NONCE_LENGTH);\n const cipher = gcm(key, nonce, aad);\n const ciphertext = cipher.encrypt(plaintext);\n return aad !== undefined ? { nonce, ciphertext, aad } : { nonce, ciphertext };\n}\n\n/**\n * Decrypts the envelope. Throws if the auth tag does not validate or if the\n * key/nonce/aad does not match what was used for encryption.\n *\n * The returned plaintext is a fresh buffer; the caller is responsible for\n * zeroizing it after use if sensitive.\n */\nexport function decryptAesGcm(envelope: EncryptedEnvelope, key: Uint8Array): Uint8Array {\n assertKeyLength(key);\n if (envelope.nonce.length !== AES_GCM_NONCE_LENGTH) {\n throw new RangeError(\n `decryptAesGcm: nonce must be ${AES_GCM_NONCE_LENGTH} bytes, got ${envelope.nonce.length}`,\n );\n }\n if (envelope.ciphertext.length < AES_GCM_TAG_LENGTH) {\n throw new RangeError(\n `decryptAesGcm: ciphertext too short to contain auth tag (${envelope.ciphertext.length} bytes)`,\n );\n }\n const cipher = gcm(key, envelope.nonce, envelope.aad);\n return cipher.decrypt(envelope.ciphertext);\n}\n\nfunction assertKeyLength(key: Uint8Array): void {\n if (key.length !== AES_KEY_LENGTH) {\n throw new RangeError(`AES-256-GCM key must be ${AES_KEY_LENGTH} bytes, got ${key.length}`);\n }\n}\n","/**\n * Ed25519 keypair generation, signing and verification.\n *\n * Thin wrapper over `@noble/curves/ed25519`. The seed (32-byte private scalar\n * input) is what we keep in memory during signing — callers must zeroize after\n * use. This file is allow-listed in `audit-no-custody.mjs` to use `ed25519.sign`.\n */\n\nimport { ed25519 } from '@noble/curves/ed25519';\nimport { getRandomBytes } from './random.js';\n\n/**\n * Length, in bytes, of a raw ed25519 private seed.\n */\nexport const ED25519_SEED_LENGTH = 32;\n\n/**\n * Length, in bytes, of a raw ed25519 public key.\n */\nexport const ED25519_PUBLIC_KEY_LENGTH = 32;\n\n/**\n * Length, in bytes, of an ed25519 signature.\n */\nexport const ED25519_SIGNATURE_LENGTH = 64;\n\nexport interface Ed25519Keypair {\n /** 32-byte raw private seed. Treat as secret; zeroize after use. */\n readonly privateSeed: Uint8Array;\n /** 32-byte raw public key derived from the seed. */\n readonly publicKey: Uint8Array;\n}\n\n/**\n * Generates a new ed25519 keypair from CSPRNG bytes.\n */\nexport function generateKeypair(): Ed25519Keypair {\n const privateSeed = getRandomBytes(ED25519_SEED_LENGTH);\n const publicKey = ed25519.getPublicKey(privateSeed);\n return { privateSeed, publicKey };\n}\n\n/**\n * Derives the public key from a raw ed25519 seed without exposing the seed.\n *\n * Throws if `seed` is not exactly 32 bytes.\n */\nexport function publicKeyFromSeed(seed: Uint8Array): Uint8Array {\n if (seed.length !== ED25519_SEED_LENGTH) {\n throw new RangeError(\n `publicKeyFromSeed: seed must be ${ED25519_SEED_LENGTH} bytes, got ${seed.length}`,\n );\n }\n return ed25519.getPublicKey(seed);\n}\n\n/**\n * Signs `message` with the ed25519 seed.\n *\n * The caller is responsible for zeroizing `privateSeed` after the call.\n * The signature is non-malleable and 64 bytes long.\n */\nexport function signEd25519(message: Uint8Array, privateSeed: Uint8Array): Uint8Array {\n if (privateSeed.length !== ED25519_SEED_LENGTH) {\n throw new RangeError(\n `signEd25519: privateSeed must be ${ED25519_SEED_LENGTH} bytes, got ${privateSeed.length}`,\n );\n }\n return ed25519.sign(message, privateSeed);\n}\n\n/**\n * Verifies an ed25519 signature.\n *\n * Returns `false` (never throws) on malformed inputs or mismatched length —\n * cryptographic primitives must be hard to misuse.\n */\nexport function verifyEd25519(\n signature: Uint8Array,\n message: Uint8Array,\n publicKey: Uint8Array,\n): boolean {\n if (signature.length !== ED25519_SIGNATURE_LENGTH) return false;\n if (publicKey.length !== ED25519_PUBLIC_KEY_LENGTH) return false;\n try {\n return ed25519.verify(signature, message, publicKey);\n } catch {\n return false;\n }\n}\n","/**\n * Shamir Secret Sharing over GF(256), byte-wise.\n *\n * Each byte of the secret is split independently using a random polynomial of\n * degree `threshold - 1` over the Galois field GF(2^8) with reducing polynomial\n * 0x11b (the AES field). Reconstruction is Lagrange interpolation evaluated at\n * x = 0 using any `threshold` shares.\n *\n * References:\n * - Adi Shamir, \"How to Share a Secret\" (1979)\n * - SLIP-0039 (https://github.com/satoshilabs/slips/blob/master/slip-0039.md)\n * — uses GF(256) the same way.\n *\n * This file is allow-listed in `audit-no-custody.mjs`: the function names\n * `splitSecret`, `shamirCombine`, and `shamirCombine` are reserved to this\n * module + `packages/core/src/mpc/{split,combine}.ts`.\n */\n\nimport { getRandomBytes } from './random.js';\n\n/* ------------------------------------------------------------------------ */\n/* GF(256) arithmetic */\n/* ------------------------------------------------------------------------ */\n\n/**\n * EXP[i] = 0x03^i over GF(256), with i in [0, 510].\n * The duplicated upper half lets `gfMul` add log values without a modulo.\n */\nconst EXP = new Uint8Array(512);\n\n/**\n * LOG[x] = log_{0x03}(x) over GF(256), with x in [1, 255].\n * LOG[0] is undefined (logarithm of zero); callers must guard explicitly.\n */\nconst LOG = new Uint8Array(256);\n\n(function buildTables(): void {\n let x = 1;\n for (let i = 0; i < 255; i += 1) {\n EXP[i] = x;\n LOG[x] = i;\n // Multiply x by the generator 0x03 = (x + 1).\n let next = x ^ ((x << 1) & 0xff);\n if (x & 0x80) next ^= 0x1b; // reduce modulo 0x11b\n x = next;\n }\n for (let i = 255; i < 510; i += 1) {\n EXP[i] = EXP[i - 255] ?? 0;\n }\n})();\n\n/** Multiplication in GF(256). */\nfunction gfMul(a: number, b: number): number {\n if (a === 0 || b === 0) return 0;\n // a, b in [1, 255] => LOG[a], LOG[b] in [0, 254] => sum in [0, 508] within EXP table size.\n return EXP[LOG[a]! + LOG[b]!]!;\n}\n\n/** Division in GF(256). Returns 0 when numerator is 0; throws on zero denominator. */\nfunction gfDiv(numerator: number, denominator: number): number {\n if (denominator === 0) {\n throw new Error('shamir: division by zero in GF(256)');\n }\n if (numerator === 0) return 0;\n // LOG[num] - LOG[den] could be negative; +255 keeps the index non-negative.\n return EXP[LOG[numerator]! + 255 - LOG[denominator]!]!;\n}\n\n/** Evaluate polynomial `coeffs` at `x` using Horner's method, over GF(256). */\nfunction evaluatePolynomial(coeffs: Uint8Array, x: number): number {\n let result = coeffs[coeffs.length - 1]!;\n for (let i = coeffs.length - 2; i >= 0; i -= 1) {\n result = gfMul(result, x) ^ coeffs[i]!;\n }\n return result;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Public API */\n/* ------------------------------------------------------------------------ */\n\n/**\n * A single Shamir share.\n *\n * `index` is the x-coordinate (1..255). `data[i]` is the y-coordinate of the\n * i-th byte's polynomial evaluated at `index`. Two shares are equal iff their\n * (index, data) pairs are equal.\n */\nexport interface ShamirShare {\n readonly index: number;\n readonly data: Uint8Array;\n}\n\nexport const SHAMIR_MAX_SHARES = 255;\n\n/**\n * Splits `secret` into `totalShares` shares of which any `threshold` suffice\n * to reconstruct.\n *\n * `threshold` must be in [2, 255]. `totalShares` must be in [threshold, 255].\n * `secret` may be of any length >= 1.\n *\n * Memory: the random coefficients are zeroed after each byte. The returned\n * shares are heap-allocated; the caller is responsible for clearing them once\n * they are no longer needed (e.g. once encrypted to envelopes).\n */\nexport function splitSecret(\n secret: Uint8Array,\n threshold: number,\n totalShares: number,\n): ShamirShare[] {\n if (secret.length === 0) {\n throw new RangeError('splitSecret: secret must be non-empty');\n }\n if (!Number.isInteger(threshold) || threshold < 2 || threshold > SHAMIR_MAX_SHARES) {\n throw new RangeError(`splitSecret: threshold must be in [2, 255], got ${threshold}`);\n }\n if (\n !Number.isInteger(totalShares) ||\n totalShares < threshold ||\n totalShares > SHAMIR_MAX_SHARES\n ) {\n throw new RangeError(\n `splitSecret: totalShares must be in [${threshold}, 255], got ${totalShares}`,\n );\n }\n\n // Pre-allocate one Uint8Array per share for the y-coordinates.\n const shares: ShamirShare[] = [];\n for (let i = 0; i < totalShares; i += 1) {\n shares.push({ index: i + 1, data: new Uint8Array(secret.length) });\n }\n\n // For each byte of the secret, generate a random polynomial of degree\n // `threshold - 1` whose constant term is the secret byte, and evaluate it\n // at x = 1..totalShares.\n const coeffs = new Uint8Array(threshold);\n for (let byteIdx = 0; byteIdx < secret.length; byteIdx += 1) {\n coeffs[0] = secret[byteIdx]!;\n const rand = getRandomBytes(threshold - 1);\n coeffs.set(rand, 1);\n for (let s = 0; s < totalShares; s += 1) {\n shares[s]!.data[byteIdx] = evaluatePolynomial(coeffs, shares[s]!.index);\n }\n coeffs.fill(0); // zeroize between bytes\n rand.fill(0);\n }\n\n return shares;\n}\n\n/**\n * Reconstructs the original secret from `shares`. Returns whatever number of\n * bytes was the original secret length.\n *\n * Caller MUST provide exactly `threshold` shares of the original split. Fewer\n * yields a wrong but indistinguishable value (a defining property of Shamir);\n * more is redundant. Duplicate or zero-indexed shares throw.\n */\nexport function shamirCombine(shares: readonly ShamirShare[]): Uint8Array {\n if (shares.length === 0) {\n throw new RangeError('shamirCombine: at least 1 share required');\n }\n const length = shares[0]!.data.length;\n const seenIndexes = new Set<number>();\n for (const share of shares) {\n if (share.index < 1 || share.index > SHAMIR_MAX_SHARES) {\n throw new RangeError(`shamirCombine: share index out of range: ${share.index}`);\n }\n if (share.data.length !== length) {\n throw new RangeError(\n `shamirCombine: all shares must have the same length (${length}), got ${share.data.length}`,\n );\n }\n if (seenIndexes.has(share.index)) {\n throw new Error(`shamirCombine: duplicate share index ${share.index}`);\n }\n seenIndexes.add(share.index);\n }\n\n // Precompute the Lagrange basis at x = 0 for each share.\n // L_i(0) = prod_{j != i} (x_j) / (x_j XOR x_i) [subtraction == XOR in char 2]\n const lagrange = new Uint8Array(shares.length);\n for (let i = 0; i < shares.length; i += 1) {\n let numerator = 1;\n let denominator = 1;\n for (let j = 0; j < shares.length; j += 1) {\n if (i === j) continue;\n numerator = gfMul(numerator, shares[j]!.index);\n denominator = gfMul(denominator, shares[j]!.index ^ shares[i]!.index);\n }\n lagrange[i] = gfDiv(numerator, denominator);\n }\n\n const result = new Uint8Array(length);\n for (let byteIdx = 0; byteIdx < length; byteIdx += 1) {\n let acc = 0;\n for (let i = 0; i < shares.length; i += 1) {\n acc ^= gfMul(shares[i]!.data[byteIdx]!, lagrange[i]!);\n }\n result[byteIdx] = acc;\n }\n return result;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Wire encoding for a single share */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Encodes a share as a flat Uint8Array `[index, ...data]`. Useful for storing\n * or transmitting a single fragment as one binary blob.\n */\nexport function encodeShare(share: ShamirShare): Uint8Array {\n if (share.index < 1 || share.index > SHAMIR_MAX_SHARES) {\n throw new RangeError(`encodeShare: index out of range: ${share.index}`);\n }\n const out = new Uint8Array(share.data.length + 1);\n out[0] = share.index;\n out.set(share.data, 1);\n return out;\n}\n\n/**\n * Decodes a flat share blob produced by `encodeShare`.\n */\nexport function decodeShare(encoded: Uint8Array): ShamirShare {\n if (encoded.length < 2) {\n throw new RangeError(`decodeShare: encoded share too short (${encoded.length} bytes)`);\n }\n const index = encoded[0]!;\n if (index < 1 || index > SHAMIR_MAX_SHARES) {\n throw new RangeError(`decodeShare: index out of range: ${index}`);\n }\n return { index, data: encoded.slice(1) };\n}\n","/**\n * Defensive memory zeroing for sensitive buffers.\n *\n * JavaScript does not guarantee that a freed buffer will be wiped from the\n * heap — V8 may keep a copy in young generation until the next GC, JIT'd code\n * may hold register copies, etc. `zeroize` is therefore best-effort. It does:\n * 1. Overwrite the buffer with zeros (immediate).\n * 2. Make any future accidental use of the buffer return zeros instead of\n * the original secret.\n *\n * Always pair sensitive operations with `withZeroize` so the cleanup happens\n * even on thrown errors.\n */\n\n/**\n * Overwrites a buffer with zeros in place. No-op on undefined/null.\n *\n * Note: views into the same underlying ArrayBuffer are also zeroed.\n */\nexport function zeroize(buf: Uint8Array | undefined | null): void {\n if (!buf) return;\n buf.fill(0);\n}\n\n/**\n * Runs `fn` and then zeroizes every buffer in `secrets`, including on throw.\n * Returns whatever `fn` returns.\n *\n * Use this around any code that derives intermediate secret material so that a\n * thrown error cannot leave the secret alive in memory.\n *\n * @example\n * const signature = withZeroize([reconstructedSeed, fragmentF2Plain], () => {\n * return sign(message, reconstructedSeed);\n * });\n */\nexport function withZeroize<T>(\n secrets: ReadonlyArray<Uint8Array | undefined | null>,\n fn: () => T,\n): T {\n try {\n return fn();\n } finally {\n for (const buf of secrets) zeroize(buf);\n }\n}\n\n/**\n * Async variant of `withZeroize`.\n */\nexport async function withZeroizeAsync<T>(\n secrets: ReadonlyArray<Uint8Array | undefined | null>,\n fn: () => Promise<T>,\n): Promise<T> {\n try {\n return await fn();\n } finally {\n for (const buf of secrets) zeroize(buf);\n }\n}\n","/**\n * MPC split — generate a fresh ed25519 keypair, split the seed with Shamir\n * (2-of-3), encrypt each fragment under a caller-supplied key, and zeroize all\n * intermediate secret state.\n *\n * Allow-listed in `audit-no-custody.mjs` to use `splitSecret`.\n *\n * Hito 2 leaves \"where the encryption keys come from\" to the caller. Hito 4 will\n * wire WebAuthn PRF + email PBKDF2 derivations on top of this primitive.\n */\n\nimport { sha256 } from '@noble/hashes/sha2';\nimport { encryptAesGcm, type EncryptedEnvelope } from '../crypto/aesgcm.js';\nimport { generateKeypair } from '../crypto/keypair.js';\nimport { encodeShare, splitSecret } from '../crypto/shamir.js';\nimport { withZeroize, zeroize } from '../crypto/zeroize.js';\n\n/** Total number of shares produced. */\nexport const TOTAL_FRAGMENTS = 3;\n/** Number of shares required to reconstruct the seed. */\nexport const RECONSTRUCT_THRESHOLD = 2;\n\n/**\n * A 3-tuple of distinct AES-256-GCM encryption keys, one per fragment.\n * The caller derives these from device material, server material, and email\n * recovery material respectively (see Hito 4 for the actual derivations).\n */\nexport type FragmentEncryptionKeys = readonly [\n /** Key used to encrypt fragment F1 (device-bound). */\n Uint8Array,\n /** Key used to encrypt fragment F2 (server-stored). */\n Uint8Array,\n /** Key used to encrypt fragment F3 (email-recovery-bound). */\n Uint8Array,\n];\n\nexport interface CreateWalletParams {\n /** UTF-8 encoded user identifier (typically an email address). */\n readonly emailBytes: Uint8Array;\n /** High-entropy salt for the email commitment (32 bytes recommended). */\n readonly emailSalt: Uint8Array;\n /** Three distinct AES-256-GCM keys, one per fragment. */\n readonly encryptionKeys: FragmentEncryptionKeys;\n /**\n * Optional additional authenticated data bound to each fragment envelope.\n * If provided, the same AAD must be supplied at decrypt time. Useful for\n * binding a fragment to an appId / user-sub claim.\n */\n readonly fragmentAad?: Uint8Array;\n}\n\n/** Three encrypted fragments in F1/F2/F3 order. */\nexport type EncryptedFragments = readonly [EncryptedEnvelope, EncryptedEnvelope, EncryptedEnvelope];\n\nexport interface CreateWalletResult {\n /** Raw ed25519 public key (32 bytes). Send to the backend. */\n readonly publicKey: Uint8Array;\n /** SHA-256(email || salt). 32 bytes. Send to the backend. */\n readonly emailCommitment: Uint8Array;\n /** Encrypted fragments. F1 stays on device; F2 and F3 go to the backend. */\n readonly encryptedFragments: EncryptedFragments;\n}\n\n/**\n * Generates a fresh wallet keypair, splits the seed 2-of-3, encrypts each\n * fragment, and returns only what is safe to leak outside the secure context.\n *\n * Zeroization:\n * - The ed25519 seed is zeroed before return.\n * - Plain Shamir shares are zeroed after encryption.\n * - Intermediate share encodings are zeroed after encryption.\n *\n * Throws if any of the three encryption keys is not 32 bytes.\n */\nexport function createWallet(params: CreateWalletParams): CreateWalletResult {\n if (params.emailBytes.length === 0) {\n throw new RangeError('createWallet: emailBytes must be non-empty');\n }\n if (params.emailSalt.length === 0) {\n throw new RangeError('createWallet: emailSalt must be non-empty');\n }\n // assertKeyLength is performed by encryptAesGcm; nothing else to validate here.\n\n const keypair = generateKeypair();\n\n return withZeroize([keypair.privateSeed], () => {\n const shares = splitSecret(keypair.privateSeed, RECONSTRUCT_THRESHOLD, TOTAL_FRAGMENTS);\n if (shares.length !== TOTAL_FRAGMENTS) {\n // Defense-in-depth: splitSecret guarantees this but it's cheap to assert.\n throw new Error(`createWallet: expected ${TOTAL_FRAGMENTS} shares, got ${shares.length}`);\n }\n\n const encryptedFragments = shares.map((share, idx) => {\n const encoded = encodeShare(share);\n try {\n return encryptAesGcm(encoded, params.encryptionKeys[idx]!, params.fragmentAad);\n } finally {\n zeroize(encoded);\n zeroize(share.data);\n }\n }) as unknown as [EncryptedEnvelope, EncryptedEnvelope, EncryptedEnvelope];\n\n const commitInput = concat(params.emailBytes, params.emailSalt);\n const emailCommitment = sha256(commitInput);\n zeroize(commitInput);\n\n return {\n publicKey: keypair.publicKey,\n emailCommitment,\n encryptedFragments,\n } satisfies CreateWalletResult;\n });\n}\n\nfunction concat(a: Uint8Array, b: Uint8Array): Uint8Array {\n const out = new Uint8Array(a.length + b.length);\n out.set(a, 0);\n out.set(b, a.length);\n return out;\n}\n","/**\n * MPC combine — given any two of the three encrypted fragments and the\n * corresponding decryption keys, decrypt, run Shamir interpolation, and return\n * the reconstructed ed25519 seed plus its public key.\n *\n * Allow-listed in `audit-no-custody.mjs` to use `shamirCombine`.\n *\n * The returned `privateSeed` is hot — the caller MUST zeroize it as soon as\n * the signature it was reconstructed for is produced. Use `withZeroize` from\n * `@accesly/core/crypto` for that.\n */\n\nimport { decryptAesGcm, type EncryptedEnvelope } from '../crypto/aesgcm.js';\nimport { ED25519_SEED_LENGTH, publicKeyFromSeed } from '../crypto/keypair.js';\nimport { decodeShare, shamirCombine, type ShamirShare } from '../crypto/shamir.js';\nimport { zeroize } from '../crypto/zeroize.js';\n\n/** An encrypted fragment with the AES-GCM key needed to decrypt it. */\nexport interface EncryptedFragmentInput {\n readonly envelope: EncryptedEnvelope;\n readonly key: Uint8Array;\n}\n\nexport interface ReconstructKeyParams {\n /**\n * Exactly two encrypted fragments. Order does not matter (the Shamir index\n * is encoded inside each decrypted share blob).\n */\n readonly fragments: readonly [EncryptedFragmentInput, EncryptedFragmentInput];\n}\n\nexport interface ReconstructKeyResult {\n /** Reconstructed 32-byte ed25519 seed. CALLER MUST ZEROIZE. */\n readonly privateSeed: Uint8Array;\n /** 32-byte ed25519 public key, derived from the seed for convenience. */\n readonly publicKey: Uint8Array;\n}\n\n/**\n * Reconstructs the ed25519 seed from two fragments. Throws if:\n * - any AES-GCM auth tag fails to validate,\n * - the two decoded shares carry the same Shamir index,\n * - any decoded share has unexpected length (not 33: 1 byte index + 32 seed).\n */\nexport function reconstructKey(params: ReconstructKeyParams): ReconstructKeyResult {\n const [fragA, fragB] = params.fragments;\n const decodedA = decryptAesGcm(fragA.envelope, fragA.key);\n const decodedB = decryptAesGcm(fragB.envelope, fragB.key);\n\n let shareA: ShamirShare | undefined;\n let shareB: ShamirShare | undefined;\n let combined: Uint8Array | undefined;\n try {\n shareA = decodeShare(decodedA);\n shareB = decodeShare(decodedB);\n if (shareA.data.length !== 32) {\n throw new RangeError(\n `reconstructKey: expected 32-byte share payload, got ${shareA.data.length}`,\n );\n }\n if (shareB.data.length !== 32) {\n throw new RangeError(\n `reconstructKey: expected 32-byte share payload, got ${shareB.data.length}`,\n );\n }\n combined = shamirCombine([shareA, shareB]);\n if (combined.length !== 32) {\n throw new RangeError(\n `reconstructKey: combined seed has unexpected length ${combined.length}`,\n );\n }\n const publicKey = publicKeyFromSeed(combined);\n return { privateSeed: combined, publicKey };\n } catch (err) {\n // On any failure, ensure no partial seed material leaks out.\n if (combined) zeroize(combined);\n throw err;\n } finally {\n // Always wipe the plaintext share payloads, even on success.\n zeroize(decodedA);\n zeroize(decodedB);\n if (shareA) zeroize(shareA.data);\n if (shareB) zeroize(shareB.data);\n }\n}\n\nexport interface ReconstructFromPlainParams {\n /** Plain (already-decrypted) F1 — encoded share, includes the 1-byte index. */\n readonly fragmentF1Plain: Uint8Array;\n /** Encrypted F2 envelope as returned by the backend `/fragments/2`. */\n readonly fragmentF2: EncryptedFragmentInput;\n}\n\n/**\n * Variant of `reconstructKey` for the common signing flow: F1 has already\n * been decrypted on-device (via WebAuthn PRF) while F2 still needs the\n * backend-supplied session key. Avoids a wasteful \"encrypt-then-decrypt-F1\"\n * round trip.\n *\n * Allow-listed in `audit-no-custody.mjs` to use `shamirCombine`.\n */\nexport function reconstructFromPlainAndEncrypted(\n params: ReconstructFromPlainParams,\n): ReconstructKeyResult {\n const decodedF2 = decryptAesGcm(params.fragmentF2.envelope, params.fragmentF2.key);\n let shareA: ShamirShare | undefined;\n let shareB: ShamirShare | undefined;\n let combined: Uint8Array | undefined;\n try {\n shareA = decodeShare(params.fragmentF1Plain);\n shareB = decodeShare(decodedF2);\n if (shareA.data.length !== ED25519_SEED_LENGTH || shareB.data.length !== ED25519_SEED_LENGTH) {\n throw new RangeError(\n `reconstructFromPlainAndEncrypted: expected ${ED25519_SEED_LENGTH}-byte share payload`,\n );\n }\n combined = shamirCombine([shareA, shareB]);\n const publicKey = publicKeyFromSeed(combined);\n return { privateSeed: combined, publicKey };\n } catch (err) {\n if (combined) zeroize(combined);\n throw err;\n } finally {\n zeroize(decodedF2);\n if (shareA) zeroize(shareA.data);\n if (shareB) zeroize(shareB.data);\n }\n}\n","/**\n * Key derivation functions.\n *\n * - HKDF-SHA-256 for deriving session/encryption keys from high-entropy inputs\n * (e.g. ECDH shared secrets, raw seeds).\n * - PBKDF2-SHA-256 for deriving keys from low-entropy inputs (passwords, email\n * addresses). Default iteration count follows OWASP 2023 guidance (600k).\n */\n\nimport { hkdf } from '@noble/hashes/hkdf';\nimport { pbkdf2 } from '@noble/hashes/pbkdf2';\nimport { sha256 } from '@noble/hashes/sha2';\n\n/**\n * OWASP 2023 recommendation for PBKDF2-HMAC-SHA-256 iterations.\n * @see https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html\n */\nexport const PBKDF2_DEFAULT_ITERATIONS = 600_000;\n\n/**\n * HKDF-Extract-and-Expand with SHA-256.\n *\n * `ikm` should be high-entropy material. For password-derived keys, use\n * `pbkdf2Sha256` instead.\n */\nexport function hkdfSha256(\n ikm: Uint8Array,\n salt: Uint8Array,\n info: Uint8Array,\n length: number,\n): Uint8Array {\n if (length <= 0 || length > 8160) {\n // RFC 5869: HKDF max output is 255 * HashLen = 255 * 32 = 8160 for SHA-256.\n throw new RangeError(`hkdfSha256: length must be 1..8160, got ${length}`);\n }\n return hkdf(sha256, ikm, salt, info, length);\n}\n\nexport interface Pbkdf2Options {\n /** Number of iterations. Defaults to PBKDF2_DEFAULT_ITERATIONS (600k). */\n readonly iterations?: number;\n /** Output length in bytes. Defaults to 32 (256 bits). */\n readonly length?: number;\n}\n\n/**\n * PBKDF2-HMAC-SHA-256.\n *\n * Use for low-entropy inputs such as emails or passphrases. The default\n * configuration (600k iterations, 32-byte output) follows OWASP 2023.\n *\n * `password` is a Uint8Array (not a string) so the caller can zeroize it\n * after derivation. Strings can be converted via `new TextEncoder().encode`.\n */\nexport function pbkdf2Sha256(\n password: Uint8Array,\n salt: Uint8Array,\n options: Pbkdf2Options = {},\n): Uint8Array {\n const iterations = options.iterations ?? PBKDF2_DEFAULT_ITERATIONS;\n const length = options.length ?? 32;\n if (iterations < 1 || !Number.isInteger(iterations)) {\n throw new RangeError(`pbkdf2Sha256: iterations must be a positive integer`);\n }\n if (length < 1 || length > 1024) {\n throw new RangeError(`pbkdf2Sha256: length must be 1..1024, got ${length}`);\n }\n return pbkdf2(sha256, password, salt, { c: iterations, dkLen: length });\n}\n","/**\n * Recovery key derivation para Recovery v2 (2026-06-15).\n *\n * El flujo:\n * 1. Al `createWallet`, el SDK genera un `recoverySalt` aleatorio (32 bytes).\n * 2. Deriva `recoveryKey = PBKDF2-SHA256(password, recoverySalt, 600k iter)`\n * usando el password de Cognito que el usuario acaba de ingresar.\n * 3. Cifra `F3` con `recoveryKey` (AES-GCM) y envía `{F3_enc, recoverySalt}`\n * al backend.\n * 4. Al recuperar (otra device): user mete email → OTP → password.\n * - Backend libera `F3_enc + recoverySalt`.\n * - SDK deriva `recoveryKey` con el mismo password + salt.\n * - SDK descifra `F3` → reconstruye seed con F2+F3 → registra new passkey\n * → firma `rotate_signer` con la seed reconstruida.\n *\n * **Garantía no-custodial:** el backend nunca tiene el password de Cognito\n * en plano (Cognito guarda un SRP verifier, no el password). Por lo tanto\n * el backend no puede derivar `recoveryKey` y no puede descifrar `F3`.\n *\n * Ver SDKAccesly/docs/Plan_Final_v1.md §5 (Fase 1).\n */\n\nimport { sha256 } from '@noble/hashes/sha2';\nimport { pbkdf2Sha256, PBKDF2_DEFAULT_ITERATIONS } from './kdf.js';\nimport { getRandomBytes } from './random.js';\nimport { zeroize } from './zeroize.js';\n\n/**\n * Calcula `sha256(email.toLowerCase().trim())` y devuelve 32 bytes.\n *\n * El backend lo usa como índice en el GSI `by-email-hash` de\n * `user_fragments` para resolver Recovery v2 sin exponer el email en\n * plano más allá de Cognito (que ya lo tiene).\n */\nexport function emailHashBytes(email: string): Uint8Array {\n const normalized = email.toLowerCase().trim();\n return sha256(new TextEncoder().encode(normalized));\n}\n\n/** Largo del salt en bytes. Coincide con `emailSalt` del flujo de createWallet. */\nexport const RECOVERY_SALT_BYTES = 32;\n\n/** Largo de la `recoveryKey` derivada. Suficiente para AES-256-GCM. */\nexport const RECOVERY_KEY_BYTES = 32;\n\nexport interface DeriveRecoveryKeyParams {\n /**\n * Password en plano. **Solo vive en cliente.** Después de la derivación\n * el caller debe zero-izar el buffer del password con `zeroize`.\n *\n * Si el caller solo tiene un `string`, debe codificarlo a `Uint8Array`\n * vía `new TextEncoder().encode(password)` ANTES de pasarlo aquí —\n * los `string` JS son inmutables y no se pueden zeroizar.\n */\n readonly password: Uint8Array;\n /**\n * Salt de recovery (32 bytes). En `createWallet` se genera con\n * `generateRecoverySalt()`. En recovery se recibe del backend junto con\n * el `fragmentF3Encrypted`.\n */\n readonly salt: Uint8Array;\n /**\n * Iteraciones PBKDF2. Default 600k (OWASP 2023). Solo pasar override\n * para tests; producción debe usar el default.\n */\n readonly iterations?: number;\n}\n\n/**\n * Genera un salt aleatorio de 32 bytes para recovery key.\n *\n * Llamado una sola vez en `createWallet`. El salt viaja al backend junto con\n * `fragmentF3Encrypted` y se usa para re-derivar la misma key durante recovery.\n */\nexport function generateRecoverySalt(): Uint8Array {\n return getRandomBytes(RECOVERY_SALT_BYTES);\n}\n\n/**\n * Deriva una `recoveryKey` AES-256 desde el password de Cognito + salt.\n *\n * Determinista: misma `(password, salt)` → misma key.\n *\n * **Importante para no-custodia:** el caller es responsable de:\n * - zeroizar `params.password` después de llamar esta función.\n * - zeroizar el `Uint8Array` devuelto después de usarlo para AES-GCM\n * (encrypt o decrypt).\n *\n * @throws RangeError si `salt.length !== RECOVERY_SALT_BYTES`.\n */\nexport function deriveRecoveryKey(params: DeriveRecoveryKeyParams): Uint8Array {\n if (params.salt.length !== RECOVERY_SALT_BYTES) {\n throw new RangeError(\n `deriveRecoveryKey: salt must be ${RECOVERY_SALT_BYTES} bytes, got ${params.salt.length}`,\n );\n }\n if (params.password.length === 0) {\n throw new RangeError('deriveRecoveryKey: password must be non-empty');\n }\n const iterations = params.iterations ?? PBKDF2_DEFAULT_ITERATIONS;\n return pbkdf2Sha256(params.password, params.salt, {\n iterations,\n length: RECOVERY_KEY_BYTES,\n });\n}\n\n/**\n * Helper conveniente: deriva una `recoveryKey` desde un password string +\n * salt, codificando + zeroizando el buffer del password en el camino.\n *\n * **Cuidado:** strings JS son inmutables; no podemos zeroizar el string\n * original que el caller pasó. Para no-custodia estricta el caller debe\n * usar `deriveRecoveryKey` directamente con un buffer y zeroizarlo.\n *\n * Este helper se ofrece para integradores que aceptan el trade-off de UX\n * vs. estricta higiene de memoria.\n */\nexport function deriveRecoveryKeyFromPasswordString(\n password: string,\n salt: Uint8Array,\n iterations?: number,\n): Uint8Array {\n const buffer = new TextEncoder().encode(password);\n try {\n return deriveRecoveryKey({\n password: buffer,\n salt,\n ...(iterations !== undefined ? { iterations } : {}),\n });\n } finally {\n zeroize(buffer);\n }\n}\n","/**\n * X25519 elliptic-curve Diffie-Hellman.\n *\n * Used for the session-key exchange with the Accesly backend when retrieving\n * F2: the SDK posts its ephemeral X25519 public key, the backend replies with\n * an envelope encrypted under a key derived from the shared secret.\n *\n * Built on `@noble/curves/ed25519` which exports `x25519` from the same file.\n * The shared secret is NOT a key on its own — always pass it through HKDF.\n */\n\nimport { x25519 } from '@noble/curves/ed25519';\nimport { getRandomBytes } from './random.js';\n\nexport const X25519_PRIVATE_KEY_LENGTH = 32;\nexport const X25519_PUBLIC_KEY_LENGTH = 32;\nexport const X25519_SHARED_SECRET_LENGTH = 32;\n\nexport interface X25519Keypair {\n /** 32-byte raw private scalar. Treat as secret; zeroize after use. */\n readonly privateKey: Uint8Array;\n /** 32-byte X25519 public key. */\n readonly publicKey: Uint8Array;\n}\n\n/**\n * Generates an ephemeral X25519 keypair from CSPRNG bytes.\n *\n * The standard X25519 private-key clamping is applied internally by noble.\n */\nexport function generateX25519Keypair(): X25519Keypair {\n const privateKey = getRandomBytes(X25519_PRIVATE_KEY_LENGTH);\n const publicKey = x25519.getPublicKey(privateKey);\n return { privateKey, publicKey };\n}\n\n/**\n * Derives the X25519 public key from a raw private scalar.\n */\nexport function x25519PublicKey(privateKey: Uint8Array): Uint8Array {\n if (privateKey.length !== X25519_PRIVATE_KEY_LENGTH) {\n throw new RangeError(\n `x25519PublicKey: privateKey must be ${X25519_PRIVATE_KEY_LENGTH} bytes, got ${privateKey.length}`,\n );\n }\n return x25519.getPublicKey(privateKey);\n}\n\n/**\n * Computes the X25519 shared secret. Always pipe the result through HKDF before\n * using as an encryption/MAC key.\n *\n * Throws on malformed inputs. Does NOT reject all-zero output (which can occur\n * with adversarial public keys); the caller's HKDF step provides domain\n * separation that mitigates this in practice.\n */\nexport function x25519Ecdh(privateKey: Uint8Array, theirPublicKey: Uint8Array): Uint8Array {\n if (privateKey.length !== X25519_PRIVATE_KEY_LENGTH) {\n throw new RangeError(\n `x25519Ecdh: privateKey must be ${X25519_PRIVATE_KEY_LENGTH} bytes, got ${privateKey.length}`,\n );\n }\n if (theirPublicKey.length !== X25519_PUBLIC_KEY_LENGTH) {\n throw new RangeError(\n `x25519Ecdh: theirPublicKey must be ${X25519_PUBLIC_KEY_LENGTH} bytes, got ${theirPublicKey.length}`,\n );\n }\n return x25519.getSharedSecret(privateKey, theirPublicKey);\n}\n","/**\n * Unwrap the session-wrapped F2 envelope returned by `POST /fragments/2`.\n *\n * The backend wraps F2 in a per-request session layer (X25519 ECDH +\n * HKDF-SHA256 → AES-256-GCM). The SDK undoes this layer here and recovers\n * the EncryptedFragment that the SDK itself stored at createWallet time —\n * which still needs to be decrypted with the F2 derivation key the caller\n * derived from user credentials (out of scope of this helper).\n *\n * Backend reference:\n * CloudServices-accesly/lambdas/shared/src/session-keys.ts\n * info = \"accesly:getFragment2:v1\"\n * salt = empty\n * AES-256-GCM, 12-byte nonce, 16-byte tag returned separately.\n */\n\nimport { gcm } from '@noble/ciphers/aes';\n\nimport { hkdfSha256 } from './kdf.js';\nimport { x25519Ecdh } from './x25519.js';\nimport { zeroize } from './zeroize.js';\n\nconst HKDF_INFO = new TextEncoder().encode('accesly:getFragment2:v1');\nconst HKDF_SALT = new Uint8Array(0);\nconst SESSION_KEY_LENGTH = 32;\n\nexport interface SessionFragment2Response {\n /** Base64 12-byte AES-GCM nonce. */\n readonly nonce: string;\n /** Base64 AES-GCM ciphertext (does NOT include the auth tag). */\n readonly ciphertext: string;\n /** Base64 16-byte AES-GCM auth tag. */\n readonly authTag: string;\n /** Base64 32-byte server X25519 ephemeral public key. */\n readonly serverEphemeralPubkey: string;\n}\n\nexport interface UnwrappedFragment2 {\n /**\n * Raw plaintext bytes the backend wrapped — typically a UTF-8 JSON of the\n * original `EncryptedFragment` envelope (ciphertext + nonce + algo). The\n * caller parses + AES-GCM-decrypts again with its F2 key to get F2 plain.\n */\n readonly plaintext: Uint8Array;\n}\n\n/**\n * Given the backend response and the matching ephemeral X25519 private key\n * the SDK used in the request, decrypts the session layer and returns the\n * inner plaintext (the EncryptedFragment JSON serialized as bytes).\n *\n * Both the client ephemeral private key and the derived session key are\n * zero-ized at the end. The caller MUST NOT reuse `clientEphemeralPrivKey`.\n */\nexport function unwrapSessionFragment2(\n response: SessionFragment2Response,\n clientEphemeralPrivKey: Uint8Array,\n): UnwrappedFragment2 {\n const serverPub = base64ToBytes(response.serverEphemeralPubkey);\n const nonce = base64ToBytes(response.nonce);\n const ciphertext = base64ToBytes(response.ciphertext);\n const authTag = base64ToBytes(response.authTag);\n\n if (serverPub.length !== 32) {\n throw new Error(\n `unwrapSessionFragment2: serverEphemeralPubkey must be 32 bytes, got ${serverPub.length}`,\n );\n }\n if (nonce.length !== 12) {\n throw new Error(`unwrapSessionFragment2: nonce must be 12 bytes, got ${nonce.length}`);\n }\n if (authTag.length !== 16) {\n throw new Error(`unwrapSessionFragment2: authTag must be 16 bytes, got ${authTag.length}`);\n }\n\n const shared = x25519Ecdh(clientEphemeralPrivKey, serverPub);\n const sessionKey = hkdfSha256(shared, HKDF_SALT, HKDF_INFO, SESSION_KEY_LENGTH);\n\n // Noble's AES-GCM expects ciphertext with the auth tag appended.\n const ctWithTag = new Uint8Array(ciphertext.length + authTag.length);\n ctWithTag.set(ciphertext, 0);\n ctWithTag.set(authTag, ciphertext.length);\n\n let plaintext: Uint8Array;\n try {\n plaintext = gcm(sessionKey, nonce).decrypt(ctWithTag);\n } finally {\n zeroize(shared);\n zeroize(sessionKey);\n zeroize(clientEphemeralPrivKey);\n }\n\n return { plaintext };\n}\n\nfunction base64ToBytes(s: string): Uint8Array {\n if (typeof atob === 'function') {\n const bin = atob(s);\n const arr = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i += 1) arr[i] = bin.charCodeAt(i);\n return arr;\n }\n return new Uint8Array(Buffer.from(s, 'base64'));\n}\n","/**\n * Wrappers thin alrededor de SHA-256 para que el integrador no tenga que\n * inventar el suyo con `crypto.subtle.digest()` (que requiere ArrayBuffer\n * tricks por las firmas cambiantes de `lib.dom`) ni importar `@noble/hashes`\n * a mano.\n *\n * Uso:\n * import { sha256, sha256Hex } from '@accesly/core/crypto';\n * const userIdHash = sha256(new TextEncoder().encode(email));\n * const hex = sha256Hex('hello world');\n */\n\nimport { sha256 as nobleSha256 } from '@noble/hashes/sha2';\n\n/**\n * SHA-256 sobre un `Uint8Array`. Síncrono — usa `@noble/hashes` que es JS puro\n * y portable (Node, browser, workers, SSR).\n */\nexport function sha256(data: Uint8Array): Uint8Array {\n return nobleSha256(data);\n}\n\n/**\n * SHA-256 sobre una string UTF-8 (o `Uint8Array`), devuelto como hex lowercase.\n */\nexport function sha256Hex(data: string | Uint8Array): string {\n const bytes = typeof data === 'string' ? new TextEncoder().encode(data) : data;\n const digest = nobleSha256(bytes);\n let out = '';\n for (let i = 0; i < digest.length; i += 1) {\n out += (digest[i] ?? 0).toString(16).padStart(2, '0');\n }\n return out;\n}\n","/**\n * AWS Cognito User Pool authentication via `amazon-cognito-identity-js`.\n *\n * Uses the USER_SRP_AUTH flow (the default for `authenticateUser`): the user\n * password is never sent in clear over the network — SRP exchanges proofs.\n *\n * Cognito SDK API is callback-based; this wrapper exposes promise-returning\n * methods that implement the `AuthClient` interface.\n */\n\nimport {\n AuthenticationDetails,\n CognitoRefreshToken,\n CognitoUser,\n CognitoUserAttribute,\n CognitoUserPool,\n type CognitoUserSession,\n type ISignUpResult,\n} from 'amazon-cognito-identity-js';\nimport type { AuthClient, AuthTokens, SignUpResult } from './types.js';\n\nexport interface CognitoConfig {\n readonly region: string;\n readonly userPoolId: string;\n readonly userPoolClientId: string;\n}\n\nexport class CognitoAuthClient implements AuthClient {\n private readonly pool: CognitoUserPool;\n private readonly region: string;\n private readonly clientId: string;\n\n constructor(config: CognitoConfig) {\n if (!config.region) throw new TypeError('CognitoAuthClient: region is required');\n if (!config.userPoolId) throw new TypeError('CognitoAuthClient: userPoolId is required');\n if (!config.userPoolClientId)\n throw new TypeError('CognitoAuthClient: userPoolClientId is required');\n\n this.region = config.region;\n this.clientId = config.userPoolClientId;\n this.pool = new CognitoUserPool({\n UserPoolId: config.userPoolId,\n ClientId: config.userPoolClientId,\n });\n }\n\n signUp(email: string, password: string): Promise<SignUpResult> {\n return new Promise<SignUpResult>((resolve, reject) => {\n const attrs = [new CognitoUserAttribute({ Name: 'email', Value: email })];\n this.pool.signUp(email, password, attrs, [], (err, result) => {\n if (err) return reject(toError(err));\n const r = result as ISignUpResult | undefined;\n if (!r) return reject(new Error('Cognito signUp returned no result'));\n resolve({ userSub: r.userSub, userConfirmed: r.userConfirmed });\n });\n });\n }\n\n confirmSignUp(email: string, code: string): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const user = this.userFor(email);\n user.confirmRegistration(code, true, (err) => {\n if (err) return reject(toError(err));\n resolve();\n });\n });\n }\n\n resendConfirmationCode(email: string): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const user = this.userFor(email);\n user.resendConfirmationCode((err) => {\n if (err) return reject(toError(err));\n resolve();\n });\n });\n }\n\n signIn(email: string, password: string): Promise<AuthTokens> {\n return new Promise<AuthTokens>((resolve, reject) => {\n const user = this.userFor(email);\n const auth = new AuthenticationDetails({ Username: email, Password: password });\n user.authenticateUser(auth, {\n onSuccess: (session) => resolve(sessionToTokens(session, email)),\n onFailure: (err) => reject(toError(err)),\n });\n });\n }\n\n refreshSession(refreshToken: string, username: string): Promise<AuthTokens> {\n return new Promise<AuthTokens>((resolve, reject) => {\n const user = this.userFor(username);\n const token = new CognitoRefreshToken({ RefreshToken: refreshToken });\n user.refreshSession(token, (err, session) => {\n if (err) return reject(toError(err));\n if (!session) return reject(new Error('Cognito refreshSession returned no session'));\n resolve(sessionToTokens(session, username));\n });\n });\n }\n\n /**\n * Revokes the refresh token at Cognito via the\n * `AWSCognitoIdentityProviderService.RevokeToken` action. Local cache\n * clearing is the caller's responsibility (via `SessionStorage.clear`).\n *\n * `tokenToRevoke` is the refresh token, not the access token: only refresh\n * tokens can be revoked.\n */\n async signOut(tokenToRevoke: string): Promise<void> {\n const url = `https://cognito-idp.${this.region}.amazonaws.com/`;\n const body = JSON.stringify({ Token: tokenToRevoke, ClientId: this.clientId });\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-amz-json-1.1',\n 'X-Amz-Target': 'AWSCognitoIdentityProviderService.RevokeToken',\n },\n body,\n });\n if (!res.ok) {\n let detail = '';\n try {\n detail = await res.text();\n } catch {\n /* ignore */\n }\n throw new Error(`Cognito RevokeToken failed: ${res.status} ${detail}`);\n }\n }\n\n private userFor(username: string): CognitoUser {\n return new CognitoUser({ Username: username, Pool: this.pool });\n }\n}\n\nfunction sessionToTokens(session: CognitoUserSession, username: string): AuthTokens {\n const idTokenPayload = session.getIdToken();\n return {\n idToken: idTokenPayload.getJwtToken(),\n accessToken: session.getAccessToken().getJwtToken(),\n refreshToken: session.getRefreshToken().getToken(),\n expiresAt: idTokenPayload.getExpiration() * 1000,\n username,\n };\n}\n\nfunction toError(err: unknown): Error {\n if (err instanceof Error) return err;\n if (typeof err === 'object' && err !== null) {\n const e = err as { message?: unknown; name?: unknown; code?: unknown };\n const message = typeof e.message === 'string' ? e.message : 'Cognito error';\n const out = new Error(message);\n if (typeof e.name === 'string') out.name = e.name;\n if (typeof e.code === 'string') (out as Error & { code?: string }).code = e.code;\n return out;\n }\n return new Error(String(err));\n}\n","/**\n * Pluggable session storage for `AuthTokens`. The SDK ships two\n * implementations:\n *\n * - `LocalStorageSessionStorage` — persiste en `window.localStorage`.\n * Sobrevive page reloads / cierre de tab; aceptable para apps web first-\n * party que confían en su CSP / XSS posture. Es el **default** del\n * `AcceslyProvider` cuando detecta `window.localStorage` disponible.\n *\n * - `InMemorySessionStorage` — solo vive en memoria. Cualquier reload borra\n * la sesión. Útil para Node/SSR y para apps que quieren forzar re-login en\n * cada pestaña nueva. Es el fallback cuando `localStorage` no existe (SSR,\n * workers, etc.).\n *\n * Apps que quieran otro backend (httpOnly cookie + server session, IndexedDB,\n * Electron safeStorage, native iOS Keychain) implementan la interfaz a mano.\n */\n\nimport type { AuthTokens } from './types.js';\n\nexport interface SessionStorage {\n load(): AuthTokens | null | Promise<AuthTokens | null>;\n save(tokens: AuthTokens): void | Promise<void>;\n clear(): void | Promise<void>;\n}\n\nexport class InMemorySessionStorage implements SessionStorage {\n private tokens: AuthTokens | null = null;\n\n load(): AuthTokens | null {\n return this.tokens;\n }\n\n save(tokens: AuthTokens): void {\n this.tokens = tokens;\n }\n\n clear(): void {\n this.tokens = null;\n }\n}\n\n/**\n * Persiste `AuthTokens` en `window.localStorage`. Sobrevive reloads, cierre\n * de tab y restart del browser. Lectura síncrona (la I/O del storage local es\n * blocking pero rápida — sub-ms para items chicos como un token JWT).\n *\n * **Trade-off:** un XSS en la app puede leer los tokens. Para mitigar:\n * - CSP estricta (`script-src 'self'`, sin `unsafe-inline`).\n * - Marcar el token como short-lived (Cognito default = 1h) + refresh token\n * rotando.\n * - Considerar mover a httpOnly cookie + backend session si el modelo de\n * amenaza lo justifica.\n *\n * Usa el storage key `accesly:session` por default; configurable por si una\n * app sirve múltiples Accesly providers en el mismo origin (raro).\n */\nexport class LocalStorageSessionStorage implements SessionStorage {\n private readonly key: string;\n\n constructor(opts: { key?: string } = {}) {\n this.key = opts.key ?? 'accesly:session';\n }\n\n load(): AuthTokens | null {\n try {\n const raw = globalThis.localStorage?.getItem(this.key);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as Partial<AuthTokens>;\n if (\n typeof parsed.idToken !== 'string' ||\n typeof parsed.expiresAt !== 'number'\n ) {\n return null;\n }\n return parsed as AuthTokens;\n } catch {\n return null;\n }\n }\n\n save(tokens: AuthTokens): void {\n try {\n globalThis.localStorage?.setItem(this.key, JSON.stringify(tokens));\n } catch {\n // Quota exceeded, private mode, disabled — degradar a no-op silencioso.\n // La sesión seguirá funcionando in-memory durante esta tab.\n }\n }\n\n clear(): void {\n try {\n globalThis.localStorage?.removeItem(this.key);\n } catch {\n // no-op\n }\n }\n}\n\n/**\n * Devuelve la implementación de `SessionStorage` por default para el\n * environment actual: `LocalStorageSessionStorage` si `window.localStorage`\n * está disponible (browsers), si no `InMemorySessionStorage` (Node/SSR).\n *\n * Usado por `AcceslyProvider` cuando no se pasa `overrides.sessionStorage`.\n */\nexport function defaultSessionStorage(): SessionStorage {\n try {\n if (typeof globalThis.localStorage !== 'undefined') {\n // Touch-test: algunos browsers (Safari private mode antes de v15)\n // exponen `localStorage` pero lanzan en `setItem`. Si truena, fallback.\n const probeKey = '__accesly_probe__';\n globalThis.localStorage.setItem(probeKey, '1');\n globalThis.localStorage.removeItem(probeKey);\n return new LocalStorageSessionStorage();\n }\n } catch {\n // localStorage existe pero no funciona — fallback.\n }\n return new InMemorySessionStorage();\n}\n","/**\n * Token manager — combines an `AuthClient` and a `SessionStorage` to expose\n * a single `getValidIdToken()` operation that auto-refreshes when the cached\n * idToken is close to expiring.\n *\n * Concurrent calls share the in-flight refresh promise so we never make two\n * refresh round-trips for the same idToken expiry.\n */\n\nimport type { AuthClient, AuthTokens } from './types.js';\nimport type { SessionStorage } from './session.js';\n\nexport interface TokenManagerOptions {\n readonly authClient: AuthClient;\n readonly storage: SessionStorage;\n /** Time before expiry to trigger a refresh. Default: 5 minutes. */\n readonly refreshLeadTimeMs?: number;\n /** Override the wall clock. Tests only. Default: `Date.now`. */\n readonly clock?: () => number;\n}\n\n/**\n * Estado de la sesión Cognito desde la perspectiva del SDK.\n *\n * - `'bootstrapping'` — el provider arrancó pero todavía no terminó de leer\n * el `SessionStorage`. Aplica solo en el primer render (mientras corre el\n * `useEffect` que llama `refreshStatus`). Reemplaza al hack de\n * `setTimeout(200)` que el `AuthGuard` del example tenía que escribir a\n * mano para no patear al user a `/signin` durante el race del bootstrap.\n * - `'anonymous'` — no hay tokens persistidos (o el `SessionStorage` async\n * devolvió `null`). Routear a sign-in.\n * - `'authenticated'` — el `idToken` está vivo (no expirado y dentro del\n * refresh lead-time). El SDK puede llamar endpoints autenticados.\n * - `'expired'` — había tokens pero ya pasó el `expiresAt`. El próximo\n * `getValidIdToken()` intenta refresh; si falla, la sesión queda como\n * `'anonymous'`.\n */\nexport type AuthStatus = 'bootstrapping' | 'anonymous' | 'authenticated' | 'expired';\n\nexport class TokenManager {\n private readonly authClient: AuthClient;\n private readonly storage: SessionStorage;\n private readonly refreshLeadTimeMs: number;\n private readonly clock: () => number;\n private refreshInFlight: Promise<AuthTokens | null> | null = null;\n\n constructor(opts: TokenManagerOptions) {\n this.authClient = opts.authClient;\n this.storage = opts.storage;\n this.refreshLeadTimeMs = opts.refreshLeadTimeMs ?? 5 * 60 * 1000;\n this.clock = opts.clock ?? Date.now;\n }\n\n /**\n * Returns a valid idToken. If the cached token is missing, returns `null`.\n * If the token is close to expiry (or expired), tries to refresh. If the\n * refresh fails, clears the local session and returns `null`.\n */\n async getValidIdToken(): Promise<string | null> {\n const current = await Promise.resolve(this.storage.load());\n if (!current) return null;\n if (this.isExpiredOrSoon(current)) {\n const refreshed = await this.refresh();\n return refreshed?.idToken ?? null;\n }\n return current.idToken;\n }\n\n /**\n * Snapshot of the auth status without triggering a refresh. Useful for UI\n * components that need to decide what to render.\n */\n async getStatus(): Promise<AuthStatus> {\n const current = await Promise.resolve(this.storage.load());\n if (!current) return 'anonymous';\n return this.isExpiredOrSoon(current) ? 'expired' : 'authenticated';\n }\n\n /**\n * Stores the freshly-issued tokens (called by the auth namespace after a\n * successful signIn / refreshSession).\n */\n async setTokens(tokens: AuthTokens): Promise<void> {\n await Promise.resolve(this.storage.save(tokens));\n }\n\n /**\n * Clears local session AND revokes the refresh token at the IdP. If the\n * IdP revoke fails (network), local clear still happens — the user expects\n * \"log out\" to be immediate from their perspective.\n */\n async signOut(): Promise<void> {\n const current = await Promise.resolve(this.storage.load());\n await Promise.resolve(this.storage.clear());\n if (current) {\n try {\n await this.authClient.signOut(current.refreshToken);\n } catch {\n /* swallow — local sign-out succeeded, IdP revoke can be retried */\n }\n }\n }\n\n private isExpiredOrSoon(t: AuthTokens): boolean {\n return this.clock() + this.refreshLeadTimeMs >= t.expiresAt;\n }\n\n /**\n * Refreshes the session. Concurrent callers share the same in-flight\n * promise so we never make two refresh round-trips for the same expiry.\n * On failure, clears the local session.\n */\n private refresh(): Promise<AuthTokens | null> {\n if (this.refreshInFlight) return this.refreshInFlight;\n\n const promise = (async (): Promise<AuthTokens | null> => {\n const current = await Promise.resolve(this.storage.load());\n if (!current) return null;\n try {\n const fresh = await this.authClient.refreshSession(current.refreshToken, current.username);\n await Promise.resolve(this.storage.save(fresh));\n return fresh;\n } catch {\n await Promise.resolve(this.storage.clear());\n return null;\n }\n })();\n\n this.refreshInFlight = promise;\n void promise.finally(() => {\n this.refreshInFlight = null;\n });\n return promise;\n }\n}\n","/**\n * Typed error hierarchy for the Accesly API client.\n *\n * Every error thrown by the API client is a subclass of `AccesslyApiError`,\n * so consumers can do:\n * try { ... } catch (e) {\n * if (e instanceof AuthError) return relogin();\n * if (e instanceof NetworkError) return retryLater();\n * throw e;\n * }\n */\n\nexport interface AccesslyApiErrorOptions {\n readonly status: number;\n readonly code?: string | undefined;\n readonly requestId?: string | undefined;\n readonly cause?: unknown;\n}\n\nexport class AccesslyApiError extends Error {\n readonly status: number;\n readonly code: string;\n readonly requestId: string | undefined;\n override readonly cause: unknown;\n\n constructor(message: string, opts: AccesslyApiErrorOptions) {\n super(message);\n this.name = 'AccesslyApiError';\n this.status = opts.status;\n this.code = opts.code ?? `HTTP_${opts.status}`;\n this.requestId = opts.requestId;\n this.cause = opts.cause;\n }\n}\n\n/** 401 / 403 — caller should re-authenticate (or check appId/permissions). */\nexport class AuthError extends AccesslyApiError {\n constructor(message: string, opts: AccesslyApiErrorOptions) {\n super(message, opts);\n this.name = 'AuthError';\n }\n}\n\n/** 400 / 422 — request body or query was malformed. */\nexport class ValidationError extends AccesslyApiError {\n constructor(message: string, opts: AccesslyApiErrorOptions) {\n super(message, opts);\n this.name = 'ValidationError';\n }\n}\n\n/** 404 — resource does not exist. */\nexport class NotFoundError extends AccesslyApiError {\n constructor(message: string, opts: AccesslyApiErrorOptions) {\n super(message, opts);\n this.name = 'NotFoundError';\n }\n}\n\n/** 429 — caller should back off. */\nexport class RateLimitError extends AccesslyApiError {\n readonly retryAfterSeconds: number | undefined;\n\n constructor(\n message: string,\n opts: AccesslyApiErrorOptions & { retryAfterSeconds?: number | undefined },\n ) {\n super(message, opts);\n this.name = 'RateLimitError';\n this.retryAfterSeconds = opts.retryAfterSeconds;\n }\n}\n\n/** 5xx — server-side problem, the client already exhausted its retries. */\nexport class ServerError extends AccesslyApiError {\n constructor(message: string, opts: AccesslyApiErrorOptions) {\n super(message, opts);\n this.name = 'ServerError';\n }\n}\n\n/** Fetch threw (DNS fail, TLS error, abort, etc.) or response was not parseable. */\nexport class NetworkError extends AccesslyApiError {\n constructor(message: string, opts: Omit<AccesslyApiErrorOptions, 'status'>) {\n super(message, { ...opts, status: 0 });\n this.name = 'NetworkError';\n }\n}\n\n/**\n * Maps an HTTP status code + body to the right error subclass.\n */\nexport function errorForResponse(\n status: number,\n body: unknown,\n requestId: string | undefined,\n): AccesslyApiError {\n const message = extractMessage(body) ?? `HTTP ${status}`;\n const opts: AccesslyApiErrorOptions = { status, code: extractCode(body), requestId };\n if (status === 401 || status === 403) return new AuthError(message, opts);\n if (status === 404) return new NotFoundError(message, opts);\n if (status === 429) {\n return new RateLimitError(message, {\n ...opts,\n retryAfterSeconds: extractRetryAfter(body),\n });\n }\n if (status >= 400 && status < 500) return new ValidationError(message, opts);\n if (status >= 500) return new ServerError(message, opts);\n return new AccesslyApiError(message, opts);\n}\n\nfunction extractMessage(body: unknown): string | undefined {\n if (body && typeof body === 'object') {\n const b = body as { message?: unknown; error?: unknown };\n if (typeof b.message === 'string') return b.message;\n if (typeof b.error === 'string') return b.error;\n }\n return undefined;\n}\n\nfunction extractCode(body: unknown): string | undefined {\n if (body && typeof body === 'object') {\n const b = body as { code?: unknown };\n if (typeof b.code === 'string') return b.code;\n }\n return undefined;\n}\n\nfunction extractRetryAfter(body: unknown): number | undefined {\n if (body && typeof body === 'object') {\n const b = body as { retryAfter?: unknown };\n if (typeof b.retryAfter === 'number' && b.retryAfter >= 0) return b.retryAfter;\n }\n return undefined;\n}\n","/**\n * `formatError(err, opts?)` — convierte cualquier error que produzca el SDK\n * (incluido el browser, WebAuthn, fetch, Cognito) en un mensaje human-readable\n * apto para mostrar al user. Reemplaza el `describeError` que cada integrador\n * escribe a mano en su `lib/errors.ts`.\n *\n * Locale: `'es'` (default) o `'en'`. Monolingüe por ahora — i18n completo\n * (locales adicionales, ICU plural rules) llega en una siguiente release.\n *\n * No reemplaza el `error.name` / `error.message` originales — la app sigue\n * pudiendo inspeccionarlos para telemetry. Esta función produce *solo* el\n * string que vas a renderizar.\n */\n\nimport {\n AccesslyApiError,\n AuthError,\n NetworkError,\n NotFoundError,\n RateLimitError,\n ServerError,\n ValidationError,\n} from '../api/errors.js';\n\nexport type FormatErrorLocale = 'es' | 'en';\n\nexport interface FormatErrorOptions {\n /** `'es'` (default) o `'en'`. */\n readonly locale?: FormatErrorLocale;\n}\n\ninterface Message {\n readonly es: string;\n readonly en: string;\n}\n\nconst MESSAGES = {\n unknown: {\n es: 'Ocurrió un error inesperado.',\n en: 'Something went wrong.',\n },\n auth_expired: {\n es: 'Tu sesión expiró. Volvé a iniciar sesión.',\n en: 'Your session expired. Please sign in again.',\n },\n network: {\n es: 'No se pudo contactar al backend. Revisá tu conexión.',\n en: \"Couldn't reach the backend. Check your connection.\",\n },\n rate_limit: {\n es: 'Demasiadas solicitudes. Esperá unos segundos y volvé a intentar.',\n en: 'Too many requests. Wait a few seconds and try again.',\n },\n not_found: {\n es: 'El recurso solicitado no existe.',\n en: \"Couldn't find that resource.\",\n },\n server: {\n es: 'El servidor tuvo un problema. Intentá de nuevo en un momento.',\n en: 'Server hit a problem. Try again in a moment.',\n },\n webauthn_cancelled: {\n es: 'No se completó la verificación biométrica. Asegurate de tener un passkey activo (Touch ID, Face ID, Windows Hello o llave de seguridad).',\n en: 'Biometric verification was cancelled. Make sure you have an active passkey (Touch ID, Face ID, Windows Hello, or a security key).',\n },\n webauthn_unsupported: {\n es: 'Este navegador o autenticador no soporta WebAuthn PRF. Usá Chrome 116+, Edge 116+ o Safari 18+ con un passkey nativo del sistema.',\n en: 'This browser or authenticator does not support WebAuthn PRF. Use Chrome 116+, Edge 116+ or Safari 18+ with a native OS passkey.',\n },\n no_local_credential: {\n es: 'Este dispositivo no tiene la credencial de tu wallet. Usá Recuperar wallet con tu email y contraseña.',\n en: \"This device doesn't have your wallet credential. Use Recover wallet with your email and password.\",\n },\n not_implemented: {\n es: 'Esta funcionalidad aún no está implementada en el SDK.',\n en: 'This feature is not implemented in the SDK yet.',\n },\n} as const satisfies Record<string, Message>;\n\ntype MessageKey = keyof typeof MESSAGES;\n\nfunction localize(key: MessageKey, locale: FormatErrorLocale): string {\n return MESSAGES[key][locale];\n}\n\n/**\n * Convierte un error en mensaje humano. Trata de matchear el tipo y el shape\n * en este orden:\n *\n * 1. Errores tipados del SDK (`AuthError`, `NetworkError`, ...) → mensaje\n * apropiado de la matriz.\n * 2. Errores conocidos por `error.name` (`NotAllowedError` de WebAuthn,\n * `NotImplementedYetError` de los namespaces stub, etc.).\n * 3. Heurísticas sobre el `error.message` (regex de \"fetch\", \"passkey\",\n * \"credential\", \"PRF\") — fallback razonable para errores no tipados que\n * vienen de dependencias.\n * 4. `error.message` original.\n * 5. `MESSAGES.unknown` para non-Error inputs.\n *\n * @example\n * try { await wallet.bootstrap({ email, password }); }\n * catch (e) { setError(formatError(e)); }\n */\nexport function formatError(\n err: unknown,\n opts: FormatErrorOptions = {},\n): string {\n const locale = opts.locale ?? 'es';\n const t = (k: MessageKey) => localize(k, locale);\n\n // 1. Errores tipados del SDK.\n if (err instanceof RateLimitError) return t('rate_limit');\n if (err instanceof NotFoundError) return t('not_found');\n if (err instanceof AuthError) return t('auth_expired');\n if (err instanceof NetworkError) return t('network');\n if (err instanceof ServerError) return t('server');\n if (err instanceof ValidationError) {\n // Validation errors devuelven contexto útil — preservar el message.\n return err.message || t('unknown');\n }\n if (err instanceof AccesslyApiError) {\n return err.message || t('unknown');\n }\n\n // 2. Errores conocidos por nombre.\n if (err instanceof Error) {\n const name = err.name;\n const msg = err.message ?? '';\n\n if (name === 'NotImplementedYetError') return t('not_implemented');\n\n // Browser WebAuthn cancellation / user-decline.\n if (name === 'NotAllowedError') return t('webauthn_cancelled');\n if (name === 'NotSupportedError') return t('webauthn_unsupported');\n if (name === 'AbortError' && /credentials|webauthn/i.test(msg)) {\n return t('webauthn_cancelled');\n }\n\n // 3. Heurísticas sobre message.\n if (/PRF/i.test(msg) || /no soporta WebAuthn/i.test(msg)) {\n return t('webauthn_unsupported');\n }\n // CredentialRecord chequea ANTES que el cancel heurístico (que también\n // matchearía \"credential\" + \"no\").\n if (/CredentialRecord/i.test(msg)) {\n return t('no_local_credential');\n }\n if (/passkey|credential/i.test(msg) && /no|missing|cancel/i.test(msg)) {\n return t('webauthn_cancelled');\n }\n if (/failed to fetch|networkerror|network request|ENOTFOUND/i.test(msg)) {\n return t('network');\n }\n if (/unauthor/i.test(msg) || /expired/i.test(msg)) {\n return t('auth_expired');\n }\n\n // 4. Fallback al message original.\n return msg || t('unknown');\n }\n\n // 5. Non-Error throws.\n if (typeof err === 'string' && err.trim().length > 0) return err;\n return t('unknown');\n}\n","/**\n * Typed HTTP client for the Accesly backend.\n *\n * - Auto-injects `Authorization: <idToken>` (no `Bearer ` prefix — the backend\n * API Gateway REST v1 + Cognito Authorizer expects the raw JWT, see the\n * handoff doc gotcha).\n * - Retries idempotent requests on 5xx / network errors with exponential\n * backoff + jitter.\n * - Emits structured telemetry events the consumer can hook into.\n */\n\nimport { AccesslyApiError, NetworkError, errorForResponse } from './errors.js';\n\nexport type IdTokenProvider = () => string | null | Promise<string | null>;\n\nexport type TelemetryEvent =\n | { kind: 'request'; method: string; url: string; attempt: number }\n | {\n kind: 'response';\n method: string;\n url: string;\n status: number;\n durationMs: number;\n attempt: number;\n }\n | {\n kind: 'error';\n method: string;\n url: string;\n error: string;\n attempt: number;\n }\n | { kind: 'retry'; method: string; url: string; attempt: number; delayMs: number };\n\nexport type TelemetrySink = (event: TelemetryEvent) => void;\n\nexport interface AccesslyApiClientOptions {\n readonly baseUrl: string;\n /** Returns the current idToken, or null if the caller is anonymous. */\n readonly getIdToken?: IdTokenProvider;\n /** Override the global `fetch`. Tests only. */\n readonly fetchImpl?: typeof fetch;\n /** Max retries for idempotent requests on 5xx / network errors. Default 3. */\n readonly maxRetries?: number;\n /** Request timeout in ms. Default 30_000. */\n readonly timeoutMs?: number;\n /** Telemetry sink. Default no-op. */\n readonly telemetry?: TelemetrySink;\n /**\n * Override the backoff delay calculator (ms by attempt index, 1-based).\n * Tests only. Default: 500 * 2^(attempt-1) ± 20% jitter.\n */\n readonly backoffMs?: (attempt: number) => number;\n}\n\nexport type Json =\n | null\n | boolean\n | number\n | string\n | readonly Json[]\n | { readonly [k: string]: Json };\n\nexport interface RequestOptions {\n readonly headers?: Record<string, string>;\n readonly signal?: AbortSignal;\n readonly query?: Record<string, string | number | boolean | undefined>;\n /** If `false`, the request will NOT be retried. Default `true` for GET. */\n readonly retry?: boolean;\n}\n\n/** HTTP methods the client supports. */\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n\nconst IDEMPOTENT_METHODS: ReadonlySet<HttpMethod> = new Set(['GET']);\n\nexport class AccesslyApiClient {\n private readonly baseUrl: string;\n private readonly getIdToken: IdTokenProvider | undefined;\n private readonly fetchImpl: typeof fetch;\n private readonly maxRetries: number;\n private readonly timeoutMs: number;\n private readonly telemetry: TelemetrySink;\n private readonly backoffMs: (attempt: number) => number;\n\n constructor(opts: AccesslyApiClientOptions) {\n if (!opts.baseUrl) throw new TypeError('AccesslyApiClient: baseUrl is required');\n this.baseUrl = opts.baseUrl.replace(/\\/+$/, '');\n this.getIdToken = opts.getIdToken;\n // `?? fetch` keeps a reference even after globalThis.fetch is reassigned\n // in tests, so users get the fetch they had when constructing the client.\n this.fetchImpl = opts.fetchImpl ?? globalThis.fetch.bind(globalThis);\n this.maxRetries = opts.maxRetries ?? 3;\n this.timeoutMs = opts.timeoutMs ?? 30_000;\n this.telemetry = opts.telemetry ?? (() => undefined);\n this.backoffMs = opts.backoffMs ?? defaultBackoff;\n }\n\n get<T>(path: string, opts?: RequestOptions): Promise<T> {\n return this.request<T>('GET', path, undefined, opts);\n }\n\n post<T>(path: string, body?: Json, opts?: RequestOptions): Promise<T> {\n return this.request<T>('POST', path, body, opts);\n }\n\n put<T>(path: string, body?: Json, opts?: RequestOptions): Promise<T> {\n return this.request<T>('PUT', path, body, opts);\n }\n\n delete<T>(path: string, opts?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', path, undefined, opts);\n }\n\n patch<T>(path: string, body?: Json, opts?: RequestOptions): Promise<T> {\n return this.request<T>('PATCH', path, body, opts);\n }\n\n private async request<T>(\n method: HttpMethod,\n path: string,\n body: Json | undefined,\n opts: RequestOptions | undefined,\n ): Promise<T> {\n const url = this.buildUrl(path, opts?.query);\n const shouldRetry = opts?.retry ?? IDEMPOTENT_METHODS.has(method);\n const idToken = this.getIdToken ? await this.getIdToken() : null;\n\n const headers: Record<string, string> = {\n Accept: 'application/json',\n ...opts?.headers,\n };\n if (body !== undefined) headers['Content-Type'] = 'application/json';\n if (idToken) {\n // NOTE: API Gateway REST v1 + Cognito Authorizer expects the bare JWT,\n // NOT `Bearer <jwt>`. See CloudServices-accesly/docs/Handoff_Fase3.md.\n headers['Authorization'] = idToken;\n }\n\n const init: RequestInit = { method, headers };\n if (body !== undefined) init.body = JSON.stringify(body);\n\n let attempt = 0;\n let lastError: unknown;\n const maxAttempts = shouldRetry ? this.maxRetries + 1 : 1;\n\n while (attempt < maxAttempts) {\n attempt += 1;\n this.telemetry({ kind: 'request', method, url, attempt });\n const startedAt = Date.now();\n const ac = new AbortController();\n const timeoutId = setTimeout(() => ac.abort(), this.timeoutMs);\n const signal = combineSignals(opts?.signal, ac.signal);\n try {\n const res = await this.fetchImpl(url, { ...init, signal });\n const durationMs = Date.now() - startedAt;\n this.telemetry({\n kind: 'response',\n method,\n url,\n status: res.status,\n durationMs,\n attempt,\n });\n clearTimeout(timeoutId);\n\n if (res.status >= 500 && shouldRetry && attempt < maxAttempts) {\n const delay = this.backoffMs(attempt);\n this.telemetry({ kind: 'retry', method, url, attempt, delayMs: delay });\n await sleep(delay);\n continue;\n }\n\n return await this.handleResponse<T>(res);\n } catch (err) {\n clearTimeout(timeoutId);\n if (err instanceof AccesslyApiError) {\n // Already shaped — bubble up without retrying.\n throw err;\n }\n const description = describeError(err);\n this.telemetry({ kind: 'error', method, url, error: description, attempt });\n lastError = err;\n if (shouldRetry && attempt < maxAttempts) {\n const delay = this.backoffMs(attempt);\n this.telemetry({ kind: 'retry', method, url, attempt, delayMs: delay });\n await sleep(delay);\n continue;\n }\n throw new NetworkError(`fetch failed: ${description}`, { cause: err });\n }\n }\n\n // Unreachable, but TS needs an explicit throw.\n throw new NetworkError('retries exhausted', { cause: lastError });\n }\n\n private async handleResponse<T>(res: Response): Promise<T> {\n const requestId =\n res.headers.get('x-amzn-RequestId') ?? res.headers.get('x-request-id') ?? undefined;\n if (res.ok) {\n if (res.status === 204) return undefined as unknown as T;\n const text = await res.text();\n if (text.length === 0) return undefined as unknown as T;\n try {\n return JSON.parse(text) as T;\n } catch (err) {\n throw new NetworkError('response is not valid JSON', { cause: err, requestId });\n }\n }\n // Non-2xx: try to parse a JSON body for the error shape.\n let parsed: unknown;\n try {\n const text = await res.text();\n parsed = text.length > 0 ? JSON.parse(text) : undefined;\n } catch {\n parsed = undefined;\n }\n throw errorForResponse(res.status, parsed, requestId);\n }\n\n private buildUrl(path: string, query?: RequestOptions['query']): string {\n const cleanPath = path.startsWith('/') ? path : `/${path}`;\n const url = new URL(this.baseUrl + cleanPath);\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined) continue;\n url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n }\n}\n\nfunction defaultBackoff(attempt: number): number {\n const base = 500 * 2 ** (attempt - 1);\n const jitter = base * 0.2 * (Math.random() * 2 - 1); // ±20%\n return Math.max(0, Math.floor(base + jitter));\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction describeError(err: unknown): string {\n if (err instanceof Error) return `${err.name}: ${err.message}`;\n return String(err);\n}\n\nfunction combineSignals(a: AbortSignal | undefined, b: AbortSignal): AbortSignal {\n if (!a) return b;\n if (a.aborted) return a;\n if (b.aborted) return b;\n const ac = new AbortController();\n const onAbort = (): void => ac.abort();\n a.addEventListener('abort', onAbort, { once: true });\n b.addEventListener('abort', onAbort, { once: true });\n return ac.signal;\n}\n","/**\n * Typed wrappers for the Accesly backend REST endpoints. One method per\n * route in `CloudServices-accesly/docs/openapi.yaml`.\n *\n * Each wrapper is a one-liner over `AccesslyApiClient` — the value is the\n * typed signature, which makes auto-complete + refactors safe.\n */\n\nimport type {\n CreateWalletRequest,\n CreateWalletResponse,\n FinalizeRecoveryRequest,\n FinalizeRecoveryResponse,\n GetFragment2Request,\n GetFragment2Response,\n GetFragment3Response,\n GetWalletResponse,\n HealthResponse,\n KycStartResponse,\n OrderRequest,\n OrderResponse,\n RecoveryOtpRequestInput,\n RecoveryOtpRequestResponse,\n RecoveryOtpVerifyInput,\n RecoveryOtpVerifyResponse,\n SimulateRotateSignerRequest,\n SimulateRotateSignerResponse,\n SimulateTxRequest,\n SimulateTxResponse,\n SubmitTxRequest,\n SubmitTxResponse,\n WalletActivityResponse,\n WalletBalanceResponse,\n WalletHistoryRequestOptions,\n WalletHistoryResponse,\n} from '../types/api.js';\nimport { NotFoundError } from './errors.js';\nimport type { AccesslyApiClient, Json } from './client.js';\n\nexport class AccesslyEndpoints {\n constructor(private readonly client: AccesslyApiClient) {}\n\n /** Public liveness check. No auth header sent. */\n health(): Promise<HealthResponse> {\n return this.client.get<HealthResponse>('/health');\n }\n\n /** Cognito-auth. Deploys the user's Smart Account on Soroban. */\n createWallet(req: CreateWalletRequest): Promise<CreateWalletResponse> {\n return this.client.post<CreateWalletResponse>('/wallets', req as unknown as Json);\n }\n\n /**\n * Cognito-auth. Returns the user's already-deployed Smart Account metadata,\n * or `null` if the user has not yet completed `POST /wallets`.\n *\n * Idempotent — safe to call at the top of every authenticated session.\n * Cheap on the backend (metadata read, no KMS decrypt).\n */\n async getWallet(): Promise<GetWalletResponse | null> {\n try {\n return await this.client.get<GetWalletResponse>('/wallets');\n } catch (err) {\n if (err instanceof NotFoundError) return null;\n throw err;\n }\n }\n\n /** Cognito-auth. Returns F2 re-encrypted with a per-request session key. */\n getFragment2(req: GetFragment2Request): Promise<GetFragment2Response> {\n return this.client.post<GetFragment2Response>('/fragments/2', req as unknown as Json);\n }\n\n /**\n * Cognito-auth. Simula `XLM_SAC.transfer(from=smartAccount, to, amount)` y\n * devuelve los datos para que el SDK firme la auth entry client-side. NO\n * mueve fondos — solo prepara el material para `submitTx`.\n */\n simulateTx(req: SimulateTxRequest): Promise<SimulateTxResponse> {\n return this.client.post<SimulateTxResponse>('/tx/simulate', req as unknown as Json);\n }\n\n /**\n * Cognito-auth. Recibe la `SorobanAuthorizationEntry` firmada por el SDK +\n * el envelope que `simulateTx` devolvió. El backend re-simula con la firma\n * real, KMS-firma el envelope con `channels-fund` (developer-pays) y envía\n * a Soroban RPC. Devuelve el `txHash` para que la UI pueda mostrar el\n * resultado / link a explorer.\n */\n submitTx(req: SubmitTxRequest): Promise<SubmitTxResponse> {\n return this.client.post<SubmitTxResponse>('/tx/submit', req as unknown as Json);\n }\n\n /** Cognito-auth. Starts a KYC verification with Etherfuse. */\n kycStart(): Promise<KycStartResponse> {\n return this.client.post<KycStartResponse>('/kyc');\n }\n\n /** Cognito-auth. Reads the current user's KYC status. */\n kycStatus(): Promise<KycStartResponse> {\n return this.client.get<KycStartResponse>('/kyc');\n }\n\n /** Cognito-auth. Quote or submit an MXN→USDC onramp order. */\n onramp(req: OrderRequest): Promise<OrderResponse> {\n return this.client.post<OrderResponse>('/onramp', req as unknown as Json);\n }\n\n /** Cognito-auth. Quote or submit a USDC→MXN offramp order. */\n offramp(req: OrderRequest): Promise<OrderResponse> {\n return this.client.post<OrderResponse>('/offramp', req as unknown as Json);\n }\n\n /* ── v1.1.0: read-only wallet data ─────────────────────────────────────── */\n\n /**\n * Anónimo. Balance XLM del Smart Account (vía Soroban RPC, cached ~5s).\n * No requiere JWT — la address en sí es pública on-chain.\n */\n walletBalance(address: string): Promise<WalletBalanceResponse> {\n return this.client.get<WalletBalanceResponse>(\n `/wallets/${encodeURIComponent(address)}/balance`,\n );\n }\n\n /**\n * Anónimo. Últimos eventos on-chain del Smart Account (rotate_signer,\n * transfers, etc.). Cacheado ~15s. `limit` default 20, max 50.\n */\n walletActivity(address: string, limit?: number): Promise<WalletActivityResponse> {\n const qs = limit !== undefined ? `?limit=${encodeURIComponent(String(limit))}` : '';\n return this.client.get<WalletActivityResponse>(\n `/wallets/${encodeURIComponent(address)}/activity${qs}`,\n );\n }\n\n /**\n * Anónimo. Historial completo del wallet — pre-decodificado server-side desde\n * Stellar Expert (que en browser está bloqueado por CORS). Devuelve items\n * tipados: `wallet-created`, `signer-rotated`, `transfer-in`, `transfer-out`.\n *\n * Cursor-based: pasa `saCursor` y/o `txCursor` para paginar atrás. El primer\n * fetch (sin cursors) incluye un evento sintético `wallet-created` desde la\n * metadata del contrato.\n */\n walletHistory(\n address: string,\n opts: WalletHistoryRequestOptions = {},\n ): Promise<WalletHistoryResponse> {\n const params = new URLSearchParams();\n if (opts.smartAccountCursor) params.set('saCursor', opts.smartAccountCursor);\n if (opts.transfersCursor) params.set('txCursor', opts.transfersCursor);\n if (opts.transferScanLimit !== undefined) {\n params.set('scanLimit', String(opts.transferScanLimit));\n }\n const qs = params.toString();\n return this.client.get<WalletHistoryResponse>(\n `/wallets/${encodeURIComponent(address)}/history${qs ? '?' + qs : ''}`,\n );\n }\n\n /* ── Recovery v2 (Fase 1, 2026-06-15) ──────────────────────────────────── */\n\n /**\n * Anónimo. Pide al backend que mande un OTP de 6 dígitos al email.\n *\n * Rate-limited: el backend rechaza con 429 si pediste otro hace menos de\n * 60s o más de 3 en la última hora. Anti-enumeración: la respuesta es 200\n * OK aunque el email no exista.\n */\n requestRecoveryOtp(input: RecoveryOtpRequestInput): Promise<RecoveryOtpRequestResponse> {\n return this.client.post<RecoveryOtpRequestResponse>(\n '/recovery/otp/request',\n input as unknown as Json,\n );\n }\n\n /**\n * Anónimo. Verifica el OTP. Si OK, devuelve un `recoveryJwt` que\n * autoriza los dos endpoints siguientes (`getFragment3`,\n * `finalizeRecovery`) durante 5 min.\n */\n verifyRecoveryOtp(input: RecoveryOtpVerifyInput): Promise<RecoveryOtpVerifyResponse> {\n return this.client.post<RecoveryOtpVerifyResponse>(\n '/recovery/otp/verify',\n input as unknown as Json,\n );\n }\n\n /**\n * Anónimo + header `X-Recovery-Jwt`. Devuelve `{fragmentF3Encrypted,\n * recoverySalt}`. El SDK descifra F3 con la `recoveryKey` derivada\n * client-side (PBKDF2(password, recoverySalt, 600k)).\n */\n getFragment3(recoveryJwt: string): Promise<GetFragment3Response> {\n return this.client.get<GetFragment3Response>('/fragments/3', {\n headers: { 'X-Recovery-Jwt': recoveryJwt },\n });\n }\n\n /**\n * Anónimo + header `X-Recovery-Jwt`. El backend arma + simula la tx\n * `rotate_signer(newOwner, newSecp256r1, newEmailCommit)` contra el Smart\n * Account del usuario y devuelve el material que el SDK necesita para\n * firmar la `SorobanAuthorizationEntry` con la seed VIEJA (reconstruida\n * por Shamir(F2_recovery, F3)) contra la regla `admin-cfg`.\n */\n simulateRotateSigner(\n recoveryJwt: string,\n payload: SimulateRotateSignerRequest,\n ): Promise<SimulateRotateSignerResponse> {\n return this.client.post<SimulateRotateSignerResponse>(\n '/recovery/simulate-rotate-signer',\n payload as unknown as Json,\n {\n headers: { 'X-Recovery-Jwt': recoveryJwt },\n },\n );\n }\n\n /**\n * Anónimo + header `X-Recovery-Jwt`. Submitea la tx `rotate_signer` firmada\n * por el SDK con la seed reconstruida (F2+F3) y persiste las nuevas\n * F1'/F2'/F3' en DDB. Idempotente del lado backend.\n */\n finalizeRecovery(\n recoveryJwt: string,\n payload: FinalizeRecoveryRequest,\n ): Promise<FinalizeRecoveryResponse> {\n return this.client.post<FinalizeRecoveryResponse>(\n '/recovery/finalize',\n payload as unknown as Json,\n {\n headers: { 'X-Recovery-Jwt': recoveryJwt },\n },\n );\n }\n}\n","/**\n * Passkey registration via WebAuthn (`navigator.credentials.create`).\n *\n * Forces:\n * - `userVerification: 'required'` — biometric/PIN must be presented.\n * - `residentKey: 'required'` — credential stored on the authenticator (so\n * sign-in works across browsers / tabs without a server-side username\n * hint).\n * - Algorithm `-7` (ES256, secp256r1).\n * - PRF extension requested with a 32-byte salt. If the authenticator\n * supports PRF, we get back 32 bytes deterministically derived from the\n * passkey + salt — used to encrypt F1.\n */\n\nimport { getRandomBytes } from '../crypto/random.js';\n\n/**\n * Forces a Uint8Array into a fresh ArrayBuffer-backed copy. Works around\n * TS 5.7 strict `BufferSource` typing where `Uint8Array<ArrayBufferLike>` is\n * not assignable to `BufferSource` (`ArrayBuffer | ArrayBufferView`). The\n * runtime behaviour is identical; this is purely a types coercion.\n */\nfunction asBufferSource(bytes: Uint8Array): BufferSource {\n const ab = new ArrayBuffer(bytes.byteLength);\n new Uint8Array(ab).set(bytes);\n return new Uint8Array(ab);\n}\n\nexport interface RegisterPasskeyParams {\n /** WebAuthn relying-party ID — usually the apex domain (e.g. `accesly.xyz`). */\n readonly rpId: string;\n /** Human-readable RP name shown in the OS prompt. */\n readonly rpName: string;\n /** Unique, opaque, per-user ID. Use `SHA-256(email)` or the Cognito sub. */\n readonly userId: Uint8Array;\n /** Username shown in the OS picker (typically the email). */\n readonly userName: string;\n /** Display name shown in the OS picker. Defaults to `userName`. */\n readonly userDisplayName?: string;\n /** 32 bytes used as the PRF salt. Generated if omitted. */\n readonly prfSalt?: Uint8Array;\n /**\n * Test-only: replace `navigator.credentials.create`. Defaults to the\n * platform API.\n */\n readonly credentialsCreate?: typeof navigator.credentials.create;\n}\n\nexport interface RegisterPasskeyResult {\n readonly credentialId: Uint8Array;\n readonly secp256r1Pubkey: Uint8Array;\n readonly prfSalt: Uint8Array;\n readonly prfSupported: boolean;\n /** Non-null iff `prfSupported` is true. Treat as a high-entropy key. */\n readonly prfOutput: Uint8Array | null;\n}\n\n/** Algorithm identifier for ES256 (secp256r1 + SHA-256), per IANA COSE. */\nconst COSE_ALG_ES256 = -7;\n\n/**\n * Registers a new passkey for the user and (when the authenticator supports\n * PRF) returns the 32-byte key derived from the passkey + salt that can be\n * used to encrypt F1.\n *\n * Throws if `navigator.credentials.create` is not available, the user cancels,\n * or the authenticator rejects the request.\n */\nexport async function registerPasskey(\n params: RegisterPasskeyParams,\n): Promise<RegisterPasskeyResult> {\n const credentialsCreate = params.credentialsCreate ?? defaultCredentialsCreate();\n const prfSalt = params.prfSalt ?? getRandomBytes(32);\n if (prfSalt.length !== 32) {\n throw new RangeError(`registerPasskey: prfSalt must be 32 bytes, got ${prfSalt.length}`);\n }\n\n const challenge = getRandomBytes(32);\n\n const publicKey: PublicKeyCredentialCreationOptions = {\n rp: { id: params.rpId, name: params.rpName },\n user: {\n id: asBufferSource(params.userId),\n name: params.userName,\n displayName: params.userDisplayName ?? params.userName,\n },\n challenge: asBufferSource(challenge),\n pubKeyCredParams: [{ type: 'public-key', alg: COSE_ALG_ES256 }],\n authenticatorSelection: {\n residentKey: 'required',\n requireResidentKey: true,\n userVerification: 'required',\n },\n timeout: 60_000,\n attestation: 'none',\n extensions: {\n // Request PRF eval at create time. Some authenticators ignore it at\n // create and only honour it at get; we handle both.\n prf: { eval: { first: asBufferSource(prfSalt) } },\n },\n };\n\n const cred = (await credentialsCreate({ publicKey })) as PublicKeyCredential | null;\n if (!cred) throw new Error('registerPasskey: navigator.credentials.create returned null');\n const attestation = cred.response as AuthenticatorAttestationResponse;\n\n const credentialId = new Uint8Array(cred.rawId as unknown as ArrayBuffer);\n const secp256r1Pubkey = extractSecp256r1Pubkey(attestation);\n\n // PRF result is present iff the authenticator supports the extension AND\n // was happy to evaluate at create time.\n const extResults = (\n cred as PublicKeyCredential & {\n getClientExtensionResults?: () => { prf?: { results?: { first?: ArrayBuffer } } };\n }\n ).getClientExtensionResults?.();\n const prfBuffer = extResults?.prf?.results?.first;\n const prfOutput = prfBuffer ? new Uint8Array(prfBuffer as unknown as ArrayBuffer) : null;\n\n return {\n credentialId,\n secp256r1Pubkey,\n prfSalt,\n prfSupported: prfOutput !== null,\n prfOutput,\n };\n}\n\nfunction defaultCredentialsCreate(): typeof navigator.credentials.create {\n if (typeof navigator === 'undefined' || !navigator.credentials?.create) {\n throw new Error(\n 'WebAuthn is not available in this environment. ' +\n 'Accesly requires a browser that supports navigator.credentials.create.',\n );\n }\n return navigator.credentials.create.bind(navigator.credentials);\n}\n\n/**\n * Extracts the raw 65-byte uncompressed secp256r1 public key from the\n * authenticator's attestation object.\n *\n * Spec: the credential public key is encoded in CBOR/COSE inside\n * attestationObject.authData starting at offset 37 + 16 (rpIdHash + flags +\n * counter + AAGUID) + 2 (credIdLength) + credIdLength.\n *\n * To avoid pulling a CBOR decoder, we use the `getPublicKey()` convenience\n * method exposed by Level-2 WebAuthn (Chrome 85+, Safari 14+), which returns\n * an SPKI DER blob whose last 65 bytes are the uncompressed point.\n */\nfunction extractSecp256r1Pubkey(attestation: AuthenticatorAttestationResponse): Uint8Array {\n const withHelpers = attestation as AuthenticatorAttestationResponse & {\n getPublicKey?: () => ArrayBuffer | null;\n };\n const spki = withHelpers.getPublicKey?.();\n if (!spki) {\n throw new Error(\n 'registerPasskey: authenticator did not expose getPublicKey(); ' +\n 'older browsers without WebAuthn Level-2 are not supported',\n );\n }\n const der = new Uint8Array(spki);\n // Delegate to the normalizer — handles standard 91-byte ES256 SPKI plus\n // a few alternative shapes some authenticators have been observed to\n // return (raw uncompressed point, raw X||Y without prefix, etc).\n try {\n return normalizeSecp256r1Pubkey(der);\n } catch (err) {\n const hexPreview = Array.from(der.slice(0, Math.min(8, der.length)))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n throw new Error(\n `registerPasskey: could not extract secp256r1 pubkey from SPKI ` +\n `(length=${der.length}, first8=0x${hexPreview}). ` +\n `Underlying: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\n/**\n * Coerces any reasonable secp256r1 public-key representation into the\n * canonical 65-byte uncompressed form (`0x04 || X(32) || Y(32)`) that the\n * Accesly backend expects on `POST /wallets`.\n *\n * Accepted inputs:\n * - 65 bytes starting with `0x04` → returned as-is (copied).\n * - 64 bytes (raw `X || Y` without the SEC1 uncompressed prefix) → prepends\n * `0x04`. Some libraries strip the prefix when serialising EC points.\n * - 91 bytes (standard P-256 SPKI from WebAuthn `getPublicKey()`) → extracts\n * the trailing 65-byte uncompressed point.\n *\n * Rejected inputs:\n * - 33 bytes (compressed `0x02|0x03 || X`) → throws; caller must decompress\n * first (we don't pull a curve impl just for this).\n * - Anything else → throws with the observed length.\n *\n * This helper exists to be defensive at the React-hook wire-serialisation\n * step so that wallets don't fail to create due to a small format mismatch\n * between the SDK's `registerPasskey` output and the backend validator.\n */\nexport function normalizeSecp256r1Pubkey(input: Uint8Array): Uint8Array {\n if (input.length === 65 && input[0] === 0x04) {\n return new Uint8Array(input);\n }\n if (input.length === 64) {\n const out = new Uint8Array(65);\n out[0] = 0x04;\n out.set(input, 1);\n return out;\n }\n if (input.length === 91 && input[26] === 0x04) {\n // P-256 SubjectPublicKeyInfo — the uncompressed point sits at offset 26.\n return new Uint8Array(input.subarray(26));\n }\n if (input.length === 33 && (input[0] === 0x02 || input[0] === 0x03)) {\n throw new Error(\n 'normalizeSecp256r1Pubkey: compressed EC point received (prefix ' +\n `0x${input[0].toString(16)}). Decompress to uncompressed form before passing in.`,\n );\n }\n throw new RangeError(\n `normalizeSecp256r1Pubkey: unrecognised format ` +\n `(length=${input.length}, prefix=0x${(input[0] ?? 0).toString(16)}). ` +\n `Expected 65 bytes with 0x04 prefix, 64 bytes raw X||Y, or 91-byte P-256 SPKI.`,\n );\n}\n","/**\n * Passkey verification via WebAuthn (`navigator.credentials.get`).\n *\n * Two use cases:\n * 1. Unlock F1 — re-evaluate the PRF extension with the same salt that was\n * used at registration. Returns the 32-byte PRF output that decrypts the\n * stored F1 envelope.\n * 2. Sign a challenge for SEP-10 — return the raw assertion signature so the\n * caller can submit it to the Stellar anchor.\n */\n\nexport interface UnlockPasskeyParams {\n readonly rpId: string;\n /** Specific credential to use; omit to let the browser pick one. */\n readonly credentialId?: Uint8Array;\n /** 32-byte challenge. Generated if omitted. */\n readonly challenge: Uint8Array;\n /**\n * 32-byte PRF salt — must match what was used at registration to recover\n * the same PRF output.\n */\n readonly prfSalt?: Uint8Array;\n readonly credentialsGet?: typeof navigator.credentials.get;\n}\n\nexport interface UnlockPasskeyResult {\n readonly credentialId: Uint8Array;\n readonly authenticatorData: Uint8Array;\n readonly clientDataJSON: Uint8Array;\n readonly signature: Uint8Array;\n /** Non-null iff PRF was requested AND the authenticator supports it. */\n readonly prfOutput: Uint8Array | null;\n}\n\nfunction asBufferSource(bytes: Uint8Array): BufferSource {\n const ab = new ArrayBuffer(bytes.byteLength);\n new Uint8Array(ab).set(bytes);\n return new Uint8Array(ab);\n}\n\nexport async function unlockPasskey(params: UnlockPasskeyParams): Promise<UnlockPasskeyResult> {\n const credentialsGet = params.credentialsGet ?? defaultCredentialsGet();\n if (params.challenge.length !== 32) {\n throw new RangeError(\n `unlockPasskey: challenge must be 32 bytes, got ${params.challenge.length}`,\n );\n }\n if (params.prfSalt !== undefined && params.prfSalt.length !== 32) {\n throw new RangeError(\n `unlockPasskey: prfSalt must be 32 bytes when provided, got ${params.prfSalt.length}`,\n );\n }\n\n const publicKey: PublicKeyCredentialRequestOptions = {\n rpId: params.rpId,\n challenge: asBufferSource(params.challenge),\n userVerification: 'required',\n timeout: 60_000,\n ...(params.credentialId\n ? {\n allowCredentials: [\n {\n type: 'public-key',\n id: asBufferSource(params.credentialId),\n transports: ['internal', 'hybrid'],\n },\n ],\n }\n : {}),\n ...(params.prfSalt\n ? {\n extensions: {\n prf: { eval: { first: asBufferSource(params.prfSalt) } },\n },\n }\n : {}),\n };\n\n const cred = (await credentialsGet({ publicKey })) as PublicKeyCredential | null;\n if (!cred) throw new Error('unlockPasskey: navigator.credentials.get returned null');\n\n const assertion = cred.response as AuthenticatorAssertionResponse;\n const credentialId = new Uint8Array(cred.rawId as unknown as ArrayBuffer);\n\n const extResults = (\n cred as PublicKeyCredential & {\n getClientExtensionResults?: () => { prf?: { results?: { first?: ArrayBuffer } } };\n }\n ).getClientExtensionResults?.();\n const prfBuffer = extResults?.prf?.results?.first;\n const prfOutput = prfBuffer ? new Uint8Array(prfBuffer as unknown as ArrayBuffer) : null;\n\n return {\n credentialId,\n authenticatorData: new Uint8Array(assertion.authenticatorData as unknown as ArrayBuffer),\n clientDataJSON: new Uint8Array(assertion.clientDataJSON as unknown as ArrayBuffer),\n signature: new Uint8Array(assertion.signature as unknown as ArrayBuffer),\n prfOutput,\n };\n}\n\nfunction defaultCredentialsGet(): typeof navigator.credentials.get {\n if (typeof navigator === 'undefined' || !navigator.credentials?.get) {\n throw new Error(\n 'WebAuthn is not available in this environment. ' +\n 'Accesly requires a browser that supports navigator.credentials.get.',\n );\n }\n return navigator.credentials.get.bind(navigator.credentials);\n}\n","/**\n * Persistent device storage for `CredentialRecord` entries.\n *\n * Default implementation: IndexedDB under DB `accesly` / store `credentials`.\n * Consumers (SSR, React Native, Electron) can pass their own `DeviceStore`\n * implementation to `AcceslyProvider` if they need a different backend.\n */\n\nimport type { CredentialRecord } from './types.js';\n\nexport interface DeviceStore {\n saveCredential(record: CredentialRecord): Promise<void>;\n loadCredential(username: string): Promise<CredentialRecord | null>;\n deleteCredential(username: string): Promise<void>;\n listCredentials(): Promise<readonly CredentialRecord[]>;\n}\n\nconst DB_NAME = 'accesly';\nconst DB_VERSION = 1;\nconst STORE_NAME = 'credentials';\n\n/**\n * In-memory device store. Use for tests, SSR, or apps that intentionally\n * forget credentials between sessions (re-register every time).\n */\nexport class InMemoryDeviceStore implements DeviceStore {\n private readonly entries = new Map<string, CredentialRecord>();\n\n saveCredential(record: CredentialRecord): Promise<void> {\n this.entries.set(record.username, record);\n return Promise.resolve();\n }\n\n loadCredential(username: string): Promise<CredentialRecord | null> {\n return Promise.resolve(this.entries.get(username) ?? null);\n }\n\n deleteCredential(username: string): Promise<void> {\n this.entries.delete(username);\n return Promise.resolve();\n }\n\n listCredentials(): Promise<readonly CredentialRecord[]> {\n return Promise.resolve([...this.entries.values()]);\n }\n}\n\n/**\n * IndexedDB-backed device store. Stable across browser sessions and\n * isolated per origin.\n */\nexport class IndexedDbDeviceStore implements DeviceStore {\n private readonly idbFactory: IDBFactory;\n\n constructor(idbFactory?: IDBFactory) {\n if (idbFactory) {\n this.idbFactory = idbFactory;\n } else if (typeof indexedDB !== 'undefined') {\n this.idbFactory = indexedDB;\n } else {\n throw new Error(\n 'IndexedDbDeviceStore: indexedDB is not available. ' +\n 'Pass a custom IDBFactory or use InMemoryDeviceStore.',\n );\n }\n }\n\n async saveCredential(record: CredentialRecord): Promise<void> {\n const db = await this.openDb();\n try {\n await runTx(db, 'readwrite', (store) => store.put(record));\n } finally {\n db.close();\n }\n }\n\n async loadCredential(username: string): Promise<CredentialRecord | null> {\n const db = await this.openDb();\n try {\n const value = await runTx<CredentialRecord | undefined>(db, 'readonly', (store) =>\n store.get(username),\n );\n return value ?? null;\n } finally {\n db.close();\n }\n }\n\n async deleteCredential(username: string): Promise<void> {\n const db = await this.openDb();\n try {\n await runTx(db, 'readwrite', (store) => store.delete(username));\n } finally {\n db.close();\n }\n }\n\n async listCredentials(): Promise<readonly CredentialRecord[]> {\n const db = await this.openDb();\n try {\n const value = await runTx<CredentialRecord[]>(db, 'readonly', (store) => store.getAll());\n return value;\n } finally {\n db.close();\n }\n }\n\n private openDb(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = this.idbFactory.open(DB_NAME, DB_VERSION);\n req.onupgradeneeded = () => {\n const db = req.result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n db.createObjectStore(STORE_NAME, { keyPath: 'username' });\n }\n };\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error ?? new Error('IndexedDB open failed'));\n });\n }\n}\n\nfunction runTx<T>(\n db: IDBDatabase,\n mode: IDBTransactionMode,\n op: (store: IDBObjectStore) => IDBRequest<T>,\n): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, mode);\n const store = tx.objectStore(STORE_NAME);\n const request = op(store);\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error('IndexedDB request failed'));\n tx.onerror = () => reject(tx.error ?? new Error('IndexedDB transaction failed'));\n });\n}\n","/**\n * Helper that wraps `await import('@stellar/stellar-sdk')` to handle the\n * ESM/CJS interop quirk: some bundlers (Vite, esbuild bundling a UMD entry,\n * Webpack with `esModuleInterop: false`, etc.) end up wrapping the actual\n * module exports inside a `.default` property. Native Node 22 ESM does not,\n * which is why a working unit-test setup can ship a build that breaks in\n * the browser.\n *\n * This helper picks the \"real\" namespace whether it's at the top level\n * (`m.xdr`) or one level down (`m.default.xdr`). Type-erased on purpose —\n * we trust the caller to destructure correctly.\n */\n\n// eslint-disable-next-line @typescript-eslint/consistent-type-imports\ntype StellarSdkModule = typeof import('@stellar/stellar-sdk');\n\nexport async function loadStellarSdk(): Promise<StellarSdkModule> {\n const mod = (await import('@stellar/stellar-sdk')) as unknown as\n | StellarSdkModule\n | { default: StellarSdkModule };\n // Heuristic: if the top-level namespace lacks `xdr` (a known stable export)\n // but `.default` has it, the bundler wrapped the CJS exports.\n if (\n !('xdr' in mod) &&\n (mod as { default?: StellarSdkModule }).default !== undefined &&\n 'xdr' in ((mod as { default: StellarSdkModule }).default as object)\n ) {\n return (mod as { default: StellarSdkModule }).default;\n }\n return mod as StellarSdkModule;\n}\n","/**\n * Stellar transaction builders.\n *\n * `@stellar/stellar-sdk` is lazy-imported so apps that only authenticate\n * (without sending tx) don't pay the ~200 KB bundle cost.\n */\n\nimport { loadStellarSdk } from './loadSdk.js';\n\nexport interface StellarNetworkParams {\n /** Network passphrase. Use `'Test SDF Network ; September 2015'` for testnet. */\n readonly networkPassphrase: string;\n /** Horizon URL — used to fetch the source account's current sequence number. */\n readonly horizonUrl: string;\n /** Base fee in stroops. Defaults to 100 (`BASE_FEE` constant). */\n readonly baseFee?: string;\n}\n\nexport interface BuildPaymentParams {\n readonly network: StellarNetworkParams;\n readonly sourceAddress: string;\n readonly destinationAddress: string;\n /** `'XLM'` for native, otherwise `{ code, issuer }`. */\n readonly asset: 'XLM' | { readonly code: string; readonly issuer: string };\n readonly amount: string;\n readonly memo?: string;\n /** Optional preconditions — e.g. minTime / maxTime for time-bound tx. */\n readonly timeoutSeconds?: number;\n}\n\n/**\n * Builds an unsigned Stellar payment transaction and returns its XDR. The\n * source account's sequence number is fetched fresh from Horizon.\n */\nexport async function buildPaymentTransaction(params: BuildPaymentParams): Promise<string> {\n const sdk = await loadStellarSdk();\n const { Asset, BASE_FEE, Horizon, Memo, Operation, TransactionBuilder } = sdk;\n\n const server = new Horizon.Server(params.network.horizonUrl);\n const sourceAccount = await server.loadAccount(params.sourceAddress);\n\n const asset =\n params.asset === 'XLM' ? Asset.native() : new Asset(params.asset.code, params.asset.issuer);\n\n const builder = new TransactionBuilder(sourceAccount, {\n fee: params.network.baseFee ?? BASE_FEE,\n networkPassphrase: params.network.networkPassphrase,\n })\n .addOperation(\n Operation.payment({\n destination: params.destinationAddress,\n asset,\n amount: params.amount,\n }),\n )\n .setTimeout(params.timeoutSeconds ?? 180);\n\n if (params.memo) builder.addMemo(Memo.text(params.memo));\n\n return builder.build().toXDR();\n}\n\nexport interface BuildContractInvokeParams {\n readonly network: StellarNetworkParams;\n readonly sourceAddress: string;\n readonly contractId: string;\n readonly method: string;\n /**\n * Pre-encoded ScVal arguments. Callers typically use\n * `sdk.nativeToScVal(value, opts)` to build these.\n */\n readonly args: readonly unknown[];\n readonly timeoutSeconds?: number;\n}\n\n/**\n * Builds an unsigned Soroban contract invocation transaction and returns its\n * XDR. Useful for Smart Account custom operations (`upgrade`, `add_signer`,\n * etc.) and for invoking apps the user is integrating with.\n */\nexport async function buildContractInvokeTransaction(\n params: BuildContractInvokeParams,\n): Promise<string> {\n const sdk = await loadStellarSdk();\n const { BASE_FEE, Contract, Horizon, TransactionBuilder } = sdk;\n\n const server = new Horizon.Server(params.network.horizonUrl);\n const sourceAccount = await server.loadAccount(params.sourceAddress);\n\n const contract = new Contract(params.contractId);\n // Cast through `unknown` because the SDK's xdr.ScVal union is wide and\n // we accept whatever the caller pre-built.\n const callArgs = params.args as readonly never[];\n const builder = new TransactionBuilder(sourceAccount, {\n fee: params.network.baseFee ?? BASE_FEE,\n networkPassphrase: params.network.networkPassphrase,\n })\n .addOperation(contract.call(params.method, ...callArgs))\n .setTimeout(params.timeoutSeconds ?? 180);\n\n return builder.build().toXDR();\n}\n","/**\n * Stellar transaction signing.\n *\n * ALLOW-LISTED in `audit-no-custody.mjs` to call `Keypair.fromRawEd25519Seed`.\n *\n * The signer takes a fully-reconstructed ed25519 seed as input and:\n * 1. Wraps the operation in `withZeroizeAsync` so the seed buffer is\n * cleared even on throw.\n * 2. Defensively asserts the seed length is 32 bytes.\n * 3. Optionally verifies the derived public key matches an expected one\n * (anti-foot-gun against the caller passing the wrong seed).\n * 4. Parses the XDR, signs, returns the signed XDR.\n *\n * `@stellar/stellar-sdk` is lazy-imported to keep it out of bundles that\n * never sign.\n */\n\nimport { publicKeyFromSeed, ED25519_SEED_LENGTH } from '../crypto/keypair.js';\nimport { withZeroizeAsync } from '../crypto/zeroize.js';\nimport { loadStellarSdk } from './loadSdk.js';\n\nexport interface SignTransactionParams {\n /** Base64-encoded transaction envelope XDR returned by the builder. */\n readonly transactionXdr: string;\n /**\n * Raw 32-byte ed25519 seed reconstructed via Shamir. WILL BE ZEROED by\n * this function, even on throw. The caller MUST NOT reuse the buffer.\n */\n readonly ed25519Seed: Uint8Array;\n readonly networkPassphrase: string;\n /**\n * Optional sanity check: assert that the public key derived from the seed\n * equals this expected value. Catches \"wrong seed reconstruction\" bugs\n * (e.g. mixed-up fragments) before submitting a tx that would be rejected\n * on-chain anyway.\n */\n readonly expectedPublicKey?: Uint8Array;\n}\n\nexport interface SignTransactionResult {\n /** Base64-encoded signed envelope XDR ready to submit. */\n readonly signedXdr: string;\n /** Public key that produced the signature, for caller verification. */\n readonly publicKey: Uint8Array;\n}\n\n/**\n * Signs `transactionXdr` with `ed25519Seed`. The seed is zeroed on return.\n */\nexport async function signTransaction(\n params: SignTransactionParams,\n): Promise<SignTransactionResult> {\n if (params.ed25519Seed.length !== ED25519_SEED_LENGTH) {\n throw new RangeError(\n `signTransaction: ed25519Seed must be ${ED25519_SEED_LENGTH} bytes, got ${params.ed25519Seed.length}`,\n );\n }\n\n const publicKey = publicKeyFromSeed(params.ed25519Seed);\n if (params.expectedPublicKey) {\n if (params.expectedPublicKey.length !== publicKey.length) {\n throw new RangeError(\n `signTransaction: expectedPublicKey must be ${publicKey.length} bytes, got ${params.expectedPublicKey.length}`,\n );\n }\n if (!bytesEqual(publicKey, params.expectedPublicKey)) {\n throw new Error('signTransaction: derived public key does not match expectedPublicKey');\n }\n }\n\n return withZeroizeAsync([params.ed25519Seed], async () => {\n const sdk = await loadStellarSdk();\n const { Keypair, TransactionBuilder } = sdk;\n\n // `Buffer.from(uint8array)` shares the underlying ArrayBuffer in Node and\n // copies in browser. We pass through a fresh copy so the sdk-internal\n // retention doesn't pin our seed past the zeroize point.\n const seedCopy = new Uint8Array(params.ed25519Seed);\n try {\n // ALLOW-LISTED: Keypair.fromRawEd25519Seed is the only path that takes\n // a raw seed without an intermediate base32 encoding (which would land\n // the secret in a heap string).\n const keypair = Keypair.fromRawEd25519Seed(Buffer.from(seedCopy));\n\n const tx = TransactionBuilder.fromXDR(params.transactionXdr, params.networkPassphrase);\n tx.sign(keypair);\n\n return {\n signedXdr: tx.toEnvelope().toXDR('base64'),\n publicKey,\n } satisfies SignTransactionResult;\n } finally {\n seedCopy.fill(0);\n }\n });\n}\n\nfunction bytesEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i += 1) diff |= (a[i] ?? 0) ^ (b[i] ?? 0);\n return diff === 0;\n}\n","/**\n * Client-side derivation of a Soroban contract address before deployment.\n *\n * Mirrors the algorithm used by Stellar Core (and by the Accesly backend\n * Lambda when invoking `CreateContract`):\n *\n * contractId = sha256(\n * networkId ||\n * ENVELOPE_TYPE_CONTRACT_ID ||\n * HashIdPreimageContractId {\n * networkId,\n * contractIdPreimage: ContractIdPreimageFromAddress { address, salt }\n * }\n * )\n * walletAddress = StrKey.encodeContract(contractId)\n *\n * For Accesly's Smart Account convention:\n * - `address` is the OZ Relayer's `channels-fund` Stellar account\n * - `salt` is `sha256(ownerPubkey)`\n *\n * Determinism: the address is fixed once `(deployerAddress, ownerPubkey)` is\n * fixed, regardless of when the deploy actually settles. Lets the SDK show\n * the address to the user instantly and detect \"ghost wallets\" (record OK\n * locally / on backend but deploy never landed on chain).\n *\n * `@stellar/stellar-sdk` is lazy-imported so apps that never call this\n * helper don't pay the bundle cost. SHA-256 comes from `@noble/hashes`\n * (already a dep) instead of `stellar-sdk.hash` — the latter was renamed\n * away from the top-level namespace in stellar-sdk v15+.\n */\n\nimport { sha256 } from '@noble/hashes/sha2';\nimport { loadStellarSdk } from './loadSdk.js';\n\nexport interface ComputeSmartAccountAddressParams {\n /** 32-byte ed25519 public key of the wallet owner (used as the salt seed). */\n readonly ownerPubkey: Uint8Array;\n /**\n * Stellar G-address of the deployer (the OZ Relayer `channels-fund`\n * account for the target environment). The backend's Lambda uses this\n * exact account when invoking `CreateContract`.\n */\n readonly deployerAddress: string;\n /** e.g. `'Test SDF Network ; September 2015'` for testnet. */\n readonly networkPassphrase: string;\n}\n\n/**\n * Computes the deterministic Soroban contract address that the backend will\n * (or did) deploy the Smart Account at. Same algorithm Stellar Core uses; the\n * returned string is a 56-char `C…` address ready for `Horizon` /\n * `stellar.expert` URLs.\n */\nexport async function computeSmartAccountAddress(\n params: ComputeSmartAccountAddressParams,\n): Promise<string> {\n if (params.ownerPubkey.length !== 32) {\n throw new RangeError(\n `computeSmartAccountAddress: ownerPubkey must be 32 bytes, got ${params.ownerPubkey.length}`,\n );\n }\n if (!params.deployerAddress.startsWith('G') || params.deployerAddress.length !== 56) {\n throw new RangeError(\n `computeSmartAccountAddress: deployerAddress must be a 56-char G-address, got ${params.deployerAddress.length}-char \"${params.deployerAddress.slice(0, 6)}…\"`,\n );\n }\n if (!params.networkPassphrase) {\n throw new RangeError('computeSmartAccountAddress: networkPassphrase is required');\n }\n\n const sdk = await loadStellarSdk();\n const { StrKey, xdr, Address } = sdk;\n\n // SHA-256 from @noble/hashes — stable across browsers and runtimes, and\n // avoids stellar-sdk's `hash()` which was removed from the top-level\n // namespace in v15+.\n const salt = sha256(params.ownerPubkey);\n const networkId = sha256(new TextEncoder().encode(params.networkPassphrase));\n\n // The xdr constructors are TypeScript-typed as `Buffer` but accept any\n // Uint8Array at runtime (the XDR encoder just iterates bytes). The casts\n // here are types-only.\n const preimage = xdr.HashIdPreimage.envelopeTypeContractId(\n new xdr.HashIdPreimageContractId({\n networkId: networkId as unknown as Buffer,\n contractIdPreimage: xdr.ContractIdPreimage.contractIdPreimageFromAddress(\n new xdr.ContractIdPreimageFromAddress({\n address: Address.fromString(params.deployerAddress).toScAddress(),\n salt: salt as unknown as Buffer,\n }),\n ),\n }),\n );\n\n const contractIdHash = sha256(preimage.toXDR());\n return StrKey.encodeContract(contractIdHash as unknown as Buffer);\n}\n","/**\n * Read-only Horizon helpers — fetch balances, recent operations.\n *\n * `@stellar/stellar-sdk` is lazy-imported. These functions don't touch any\n * key material; they're listed under `stellar/` for ergonomic grouping only.\n */\n\nimport { loadStellarSdk } from './loadSdk.js';\n\nexport interface BalanceEntry {\n /** `XLM` for native, otherwise `{code, issuer}` for issued assets. */\n readonly asset: 'XLM' | { readonly code: string; readonly issuer: string };\n /** Human-readable amount (e.g. `'1234.5678901'`). */\n readonly amount: string;\n /** Required reserve for this trustline, in stroops. */\n readonly buyingLiabilities?: string;\n readonly sellingLiabilities?: string;\n}\n\nexport interface OperationEntry {\n readonly id: string;\n readonly type: string;\n readonly createdAt: string;\n readonly hash: string;\n readonly raw: unknown;\n}\n\n/**\n * Fetches the current balances for `accountAddress`. Returns an empty array\n * if the account has not been funded yet (Horizon 404).\n */\nexport async function getBalances(\n horizonUrl: string,\n accountAddress: string,\n): Promise<readonly BalanceEntry[]> {\n const sdk = await loadStellarSdk();\n const server = new sdk.Horizon.Server(horizonUrl);\n try {\n const account = await server.loadAccount(accountAddress);\n return account.balances.map(\n (b: {\n asset_type: string;\n balance: string;\n asset_code?: string;\n asset_issuer?: string;\n buying_liabilities?: string;\n selling_liabilities?: string;\n }) => {\n const asset =\n b.asset_type === 'native'\n ? ('XLM' as const)\n : { code: b.asset_code ?? '', issuer: b.asset_issuer ?? '' };\n return {\n asset,\n amount: b.balance,\n ...(b.buying_liabilities !== undefined\n ? { buyingLiabilities: b.buying_liabilities }\n : {}),\n ...(b.selling_liabilities !== undefined\n ? { sellingLiabilities: b.selling_liabilities }\n : {}),\n } satisfies BalanceEntry;\n },\n );\n } catch (err) {\n if (isNotFound(err)) return [];\n throw err;\n }\n}\n\n/**\n * Fetches the most recent operations for `accountAddress`. `limit` defaults\n * to 10, max 200 (Horizon's hard cap).\n */\nexport async function getRecentOperations(\n horizonUrl: string,\n accountAddress: string,\n limit = 10,\n): Promise<readonly OperationEntry[]> {\n if (limit < 1 || limit > 200) {\n throw new RangeError(`getRecentOperations: limit must be 1..200, got ${limit}`);\n }\n const sdk = await loadStellarSdk();\n const server = new sdk.Horizon.Server(horizonUrl);\n try {\n const page = await server\n .operations()\n .forAccount(accountAddress)\n .order('desc')\n .limit(limit)\n .call();\n return page.records.map(\n (rec: { id: string; type: string; created_at: string; transaction_hash: string }) => ({\n id: rec.id,\n type: rec.type,\n createdAt: rec.created_at,\n hash: rec.transaction_hash,\n raw: rec,\n }),\n );\n } catch (err) {\n if (isNotFound(err)) return [];\n throw err;\n }\n}\n\nfunction isNotFound(err: unknown): boolean {\n if (err && typeof err === 'object') {\n const e = err as { response?: { status?: number } };\n if (e.response?.status === 404) return true;\n }\n return false;\n}\n","/**\n * Soroban CustomAccountInterface auth-entry signer.\n *\n * Esta es la pieza que hace posible mandar XLM (o cualquier SAC asset) desde\n * un Smart Account de Accesly. El Smart Account es un contrato Soroban; sus\n * transfers se autorizan vía `__check_auth(signature_payload, AuthPayload,\n * auth_contexts)`.\n *\n * El SDK hace, en orden:\n * 1. Decodifica `signature_payload` (32 bytes — viene del backend simulate).\n * 2. XDR-codifica `context_rule_ids: Vec<u32>` como ScVal::Vec([U32]).\n * 3. Calcula `auth_digest = sha256(signature_payload || rule_ids_xdr)`.\n * 4. Firma `auth_digest` con la ed25519 seed reconstruida (F1+F2+F3) —\n * ALLOW-LISTED en `audit-no-custody`.\n * 5. Construye el `AuthPayload` ScVal:\n * AuthPayload {\n * signers: { Signer::External(ed25519_verifier, pubkey): sig_bytes },\n * context_rule_ids: [0, ...],\n * }\n * 6. Reemplaza `credentials.address.signature` en la placeholder entry y\n * devuelve el XDR base64 listo para mandar a `/tx/submit`.\n *\n * Referencia Rust:\n * stellar_accounts::smart_account::storage::do_check_auth (OZ v0.7.1)\n * auth_digest = sha256(signature_payload || context_rule_ids.to_xdr())\n *\n * Toda la criptografía respeta la non-custodial guarantee: la seed se\n * zero-iza en cuanto sale del scope, y nadie fuera del device la ve.\n */\n\nimport { sha256 } from '@noble/hashes/sha2';\nimport { signEd25519 } from '../crypto/keypair.js';\nimport { withZeroize } from '../crypto/zeroize.js';\nimport { loadStellarSdk } from './loadSdk.js';\n\nexport interface SignSorobanAuthEntryParams {\n /**\n * Hash de 32 bytes (base64) que el backend devuelve en\n * `simulateTx().signaturePayloadHashBase64`. Es el digest base de Soroban,\n * NO el final que firma el seed (ese se computa aquí).\n */\n readonly signaturePayloadHashBase64: string;\n /**\n * IDs de context rule del Smart Account, alineados por índice con los\n * `auth_contexts` que Soroban host valida. Para un `transfer` desde un\n * Smart Account de Accesly normalmente es `[0]` (regla `biometric-tx`).\n */\n readonly contextRuleIds: readonly number[];\n /**\n * XDR base64 de la `SorobanAuthorizationEntry` placeholder que devuelve\n * el backend. El SDK la usa como template — copia `rootInvocation`,\n * `credentials.address.nonce`, `signatureExpirationLedger`, y solo\n * reemplaza `credentials.address.signature` con el AuthPayload firmado.\n */\n readonly placeholderAuthEntryXdr: string;\n /**\n * Raw 32-byte ed25519 seed reconstruida via Shamir. Se zero-iza\n * automáticamente al salir de esta función — el caller NO debe reusarla.\n */\n readonly ed25519Seed: Uint8Array;\n /**\n * Address del contrato `ed25519-verifier` desplegado en la misma red. Va\n * dentro de `Signer::External(verifier, pubkey)` — el Smart Account\n * compara con la verifier address que tiene en su context rule.\n */\n readonly ed25519VerifierAddress: string;\n /**\n * Pubkey ed25519 raw (32 bytes) del dueño del Smart Account — el\n * `key_data` de la entrada `Signer::External`. Debe matchear lo que el\n * Smart Account tiene almacenado en su context rule.\n */\n readonly ownerPubkey: Uint8Array;\n}\n\nexport interface SignSorobanAuthEntryResult {\n /**\n * XDR base64 de la `SorobanAuthorizationEntry` con la firma del owner\n * dentro del AuthPayload. Esto va directo al body de `/tx/submit`.\n */\n readonly signedAuthEntryXdr: string;\n}\n\n/**\n * Firma la auth entry de un Smart Account para autorizar un único\n * `auth_context` (el caso XLM-transfer MVP).\n */\nexport async function signSorobanAuthEntry(\n params: SignSorobanAuthEntryParams,\n): Promise<SignSorobanAuthEntryResult> {\n const { xdr, Address, nativeToScVal } = await loadStellarSdk();\n\n // 1. Decode signature_payload (32 bytes).\n const signaturePayload = base64ToBytes(params.signaturePayloadHashBase64);\n if (signaturePayload.length !== 32) {\n throw new Error(\n `signSorobanAuthEntry: signature payload must be 32 bytes, got ${signaturePayload.length}`,\n );\n }\n\n if (params.ownerPubkey.length !== 32) {\n throw new Error(\n `signSorobanAuthEntry: ownerPubkey must be 32 bytes, got ${params.ownerPubkey.length}`,\n );\n }\n\n // 2. XDR-encode context_rule_ids: Vec<u32> → ScVal::Vec([U32, ...]).\n // Esto debe matchear EXACTAMENTE `Vec<u32>::to_xdr(env)` del lado contrato.\n const ridScVal = xdr.ScVal.scvVec(params.contextRuleIds.map((id) => xdr.ScVal.scvU32(id)));\n const ridXdrBytes = new Uint8Array(ridScVal.toXDR());\n\n // 3. auth_digest = sha256(signature_payload || ridXdrBytes).\n const preimage = new Uint8Array(signaturePayload.length + ridXdrBytes.length);\n preimage.set(signaturePayload, 0);\n preimage.set(ridXdrBytes, signaturePayload.length);\n const authDigest = sha256(preimage);\n\n // 4. ed25519 sign authDigest. La seed se zero-iza tras este bloque.\n const sigBytes = withZeroize([params.ed25519Seed], () =>\n signEd25519(authDigest, params.ed25519Seed),\n );\n if (sigBytes.length !== 64) {\n throw new Error(`signSorobanAuthEntry: expected 64-byte ed25519 sig, got ${sigBytes.length}`);\n }\n\n // 5. Build Signer::External(Address, Bytes) ScVal. Soroban contracttype\n // enum con payload serializa como ScVal::Vec([Symbol(variant), ...payload]).\n const signerScVal = xdr.ScVal.scvVec([\n xdr.ScVal.scvSymbol('External'),\n Address.fromString(params.ed25519VerifierAddress).toScVal(),\n nativeToScVal(params.ownerPubkey, { type: 'bytes' }),\n ]);\n\n // 6. Build AuthPayload struct:\n // AuthPayload {\n // signers: Map<Signer, Bytes>,\n // context_rule_ids: Vec<u32>,\n // }\n // Soroban serializa structs como ScVal::Map con keys = Symbol del campo,\n // sorted alphabetically (context_rule_ids < signers).\n const authPayloadScVal = xdr.ScVal.scvMap([\n new xdr.ScMapEntry({\n key: xdr.ScVal.scvSymbol('context_rule_ids'),\n val: ridScVal,\n }),\n new xdr.ScMapEntry({\n key: xdr.ScVal.scvSymbol('signers'),\n val: xdr.ScVal.scvMap([\n new xdr.ScMapEntry({\n key: signerScVal,\n val: nativeToScVal(sigBytes, { type: 'bytes' }),\n }),\n ]),\n }),\n ]);\n\n // 7. Parse the placeholder entry, replace credentials.address.signature.\n const entry = xdr.SorobanAuthorizationEntry.fromXDR(params.placeholderAuthEntryXdr, 'base64');\n const credentials = entry.credentials();\n if (credentials.switch().name !== 'sorobanCredentialsAddress') {\n throw new Error(\n `signSorobanAuthEntry: placeholder credentials must be Address variant, got ${credentials.switch().name}`,\n );\n }\n credentials.address().signature(authPayloadScVal);\n\n return { signedAuthEntryXdr: entry.toXDR('base64') };\n}\n\nfunction base64ToBytes(s: string): Uint8Array {\n if (typeof atob === 'function') {\n const bin = atob(s);\n const arr = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i += 1) arr[i] = bin.charCodeAt(i);\n return arr;\n }\n // Node fallback\n return new Uint8Array(Buffer.from(s, 'base64'));\n}\n","/**\n * Helpers puramente client-side para convertir / validar / mostrar valores\n * Stellar comunes que toda app de Accesly necesita.\n *\n * Cero dependencias del `@stellar/stellar-sdk` para que el bundle del integrador\n * no cargue ~200 KB solo por hacer `xlmToStroops(1.5)`.\n */\n\nexport type StellarNetwork = 'testnet' | 'mainnet';\n\n/**\n * Decimales del XLM = 7 (1 XLM = 10_000_000 stroops). Reusado por\n * `xlmToStroops` / `stroopsToXlm` y exportado por si el integrador lo\n * necesita en otra parte.\n */\nexport const XLM_DECIMALS = 7;\n\n/**\n * Convierte una cantidad de XLM expresada como string decimal a stroops como\n * string base-10. Manejo de precisión exacto — no usa `Number` (que pierde\n * precisión arriba de 2^53). Trim de ceros sobrantes; rechaza signos negativos.\n *\n * @example\n * xlmToStroops('1.5') // '15000000'\n * xlmToStroops('0.0000001') // '1'\n * xlmToStroops('100') // '1000000000'\n *\n * @throws Si `xlm` tiene más de 7 decimales (sub-stroop), letra, signo, o\n * forma malformada (varios puntos, vacío, etc.).\n */\nexport function xlmToStroops(xlm: string): string {\n const s = xlm.trim();\n if (!/^\\d+(\\.\\d+)?$/.test(s)) {\n throw new Error(\n `xlmToStroops: invalid number \"${xlm}\" — expected positive decimal`,\n );\n }\n const [whole, frac = ''] = s.split('.');\n if (frac.length > XLM_DECIMALS) {\n throw new Error(\n `xlmToStroops: ${xlm} exceeds 7 decimals (1 stroop = 0.0000001 XLM)`,\n );\n }\n const fracPadded = (frac + '0'.repeat(XLM_DECIMALS)).slice(0, XLM_DECIMALS);\n const combined = `${whole}${fracPadded}`.replace(/^0+(?=\\d)/, '');\n return combined === '' ? '0' : combined;\n}\n\n/**\n * Convierte stroops (string o bigint) a un string decimal de XLM con hasta 7\n * dígitos fraccionarios, sin trailing zeros.\n *\n * @example\n * stroopsToXlm('15000000') // '1.5'\n * stroopsToXlm('1') // '0.0000001'\n * stroopsToXlm('10000000') // '1'\n */\nexport function stroopsToXlm(stroops: string | bigint): string {\n const big = typeof stroops === 'bigint' ? stroops : BigInt(stroops);\n if (big < 0n) {\n throw new Error('stroopsToXlm: negative stroops not supported');\n }\n const factor = 10n ** BigInt(XLM_DECIMALS);\n const whole = big / factor;\n const frac = big % factor;\n if (frac === 0n) return whole.toString();\n const fracStr = frac.toString().padStart(XLM_DECIMALS, '0').replace(/0+$/, '');\n return `${whole.toString()}.${fracStr}`;\n}\n\n/**\n * Valida que una dirección sea G-address (clásica ed25519) o C-address (Soroban\n * contract). 56 caracteres base32 mayúsculos, prefijo G o C.\n *\n * NO valida el checksum interno de StrKey — para eso usá\n * `StrKey.isValidEd25519PublicKey` del stellar-sdk. Esto es defensa rápida\n * client-side suficiente para inputs de UI.\n */\nexport function isValidStellarAddress(s: string): boolean {\n return /^[GC][A-Z2-7]{55}$/.test(s);\n}\n\n/**\n * Versión recortada de una address para mostrar en UI cuando no cabe entera.\n * Por default `head=6` + `…` + `tail=4` — apropiado para C-addresses (56 chars).\n *\n * @example\n * shortAddress('CDAGBAFG7XXBX34OCTR4LBDLMMWPPXJIXI4XT2SPOCYMHX7FJ5WCH557')\n * // 'CDAGBA…H557'\n */\nexport function shortAddress(address: string, head = 6, tail = 4): string {\n if (address.length <= head + tail + 1) return address;\n return `${address.slice(0, head)}…${address.slice(-tail)}`;\n}\n\n/**\n * Link al explorer de Stellar Expert para un contrato (C-address) en la red dada.\n */\nexport function walletExplorerUrl(\n address: string,\n network: StellarNetwork = 'testnet',\n): string {\n return `https://stellar.expert/explorer/${network}/contract/${address}`;\n}\n\n/**\n * Link al explorer de Stellar Expert para una tx en la red dada.\n */\nexport function txExplorerUrl(\n txHash: string,\n network: StellarNetwork = 'testnet',\n): string {\n return `https://stellar.expert/explorer/${network}/tx/${txHash}`;\n}\n\n/**\n * Link al explorer de Stellar Expert para una G-address clásica.\n */\nexport function accountExplorerUrl(\n address: string,\n network: StellarNetwork = 'testnet',\n): string {\n return `https://stellar.expert/explorer/${network}/account/${address}`;\n}\n","/**\n * @accesly/core — framework-agnostic non-custodial wallet primitives for Stellar.\n *\n * Modules:\n * - `@accesly/core/crypto` — keypair, Shamir SSS, AES-GCM, HKDF/PBKDF2, X25519, zeroize\n * - `@accesly/core/mpc` — orchestration of split (create wallet) + combine (reconstruct key)\n * - `@accesly/core/api` — HTTP client and typed wrappers for the Accesly backend\n *\n * NON-CUSTODY GUARANTEE\n * The master key never leaves the device. The SDK generates it client-side, splits with Shamir,\n * encrypts F2 and F3 before sending to the backend, and zeroes memory immediately after signing.\n * See docs/Trust_Model_SDK.md and ADR-006 of the smart contracts repository.\n */\n\nexport const SDK_VERSION = '0.0.0';\n\nexport type Environment = 'dev' | 'staging' | 'prod';\n\nexport interface AcceslyCoreConfig {\n readonly appId: string;\n readonly env: Environment;\n readonly apiUrl?: string;\n}\n\n// Re-export the most commonly used building blocks at the top level. Consumers\n// who want a smaller bundle can import from the sub-paths instead.\nexport {\n createWallet,\n reconstructFromPlainAndEncrypted,\n reconstructKey,\n type CreateWalletParams,\n type CreateWalletResult,\n type EncryptedFragments,\n type EncryptedFragmentInput,\n type FragmentEncryptionKeys,\n type ReconstructFromPlainParams,\n type ReconstructKeyParams,\n type ReconstructKeyResult,\n} from './mpc/index.js';\n\nexport {\n decryptAesGcm,\n deriveRecoveryKey,\n deriveRecoveryKeyFromPasswordString,\n emailHashBytes,\n encryptAesGcm,\n generateKeypair,\n generateRecoverySalt,\n generateX25519Keypair,\n getRandomBytes,\n hkdfSha256,\n pbkdf2Sha256,\n RECOVERY_KEY_BYTES,\n RECOVERY_SALT_BYTES,\n sha256,\n sha256Hex,\n signEd25519,\n unwrapSessionFragment2,\n verifyEd25519,\n withZeroize,\n zeroize,\n type DeriveRecoveryKeyParams,\n type Ed25519Keypair,\n type EncryptedEnvelope,\n type Pbkdf2Options,\n type SessionFragment2Response,\n type UnwrappedFragment2,\n type X25519Keypair,\n} from './crypto/index.js';\n\nexport {\n CognitoAuthClient,\n defaultSessionStorage,\n InMemorySessionStorage,\n LocalStorageSessionStorage,\n TokenManager,\n type AuthClient,\n type AuthStatus,\n type AuthTokens,\n type CognitoConfig,\n type SessionStorage,\n type SignUpResult,\n type TokenManagerOptions,\n} from './auth/index.js';\n\nexport {\n formatError,\n type FormatErrorLocale,\n type FormatErrorOptions,\n} from './errors/index.js';\n\nexport {\n AccesslyApiClient,\n AccesslyApiError,\n AccesslyEndpoints,\n AuthError,\n NetworkError,\n NotFoundError,\n RateLimitError,\n ServerError,\n ValidationError,\n type AccesslyApiClientOptions,\n type IdTokenProvider,\n type TelemetryEvent,\n type TelemetrySink,\n type TransferAsset,\n type WalletActivityEvent,\n type WalletActivityResponse,\n type WalletBalanceResponse,\n type WalletHistoryItem,\n type WalletHistoryRequestOptions,\n type WalletHistoryResponse,\n} from './api/index.js';\n\nexport {\n IndexedDbDeviceStore,\n InMemoryDeviceStore,\n normalizeSecp256r1Pubkey,\n registerPasskey,\n unlockPasskey,\n type CredentialRecord,\n type DeviceStore,\n type PasskeyDescriptor,\n type RegisterPasskeyParams,\n type RegisterPasskeyResult,\n type UnlockPasskeyParams,\n type UnlockPasskeyResult,\n} from './webauthn/index.js';\n\nexport {\n XLM_DECIMALS,\n accountExplorerUrl,\n buildContractInvokeTransaction,\n buildPaymentTransaction,\n computeSmartAccountAddress,\n getBalances,\n getRecentOperations,\n isValidStellarAddress,\n shortAddress,\n signSorobanAuthEntry,\n signTransaction,\n stroopsToXlm,\n txExplorerUrl,\n walletExplorerUrl,\n xlmToStroops,\n type BalanceEntry,\n type BuildContractInvokeParams,\n type BuildPaymentParams,\n type ComputeSmartAccountAddressParams,\n type OperationEntry,\n type SignSorobanAuthEntryParams,\n type StellarNetwork,\n type SignSorobanAuthEntryResult,\n type SignTransactionParams,\n type SignTransactionResult,\n type StellarNetworkParams,\n} from './stellar/index.js';\n\n// Recovery via ZK email + `@accesly/zkemail` se removió en 1.0.0-pre.0 (2026-06-15).\n// El nuevo modelo (OTP-email + password de Cognito) llega en `@accesly/react`\n// como `recovery` namespace en 1.0.0 final.\n// Ver SDKAccesly/docs/Plan_Final_v1.md §5 (Fase 1).\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/crypto/random.ts","../src/crypto/aesgcm.ts","../src/crypto/keypair.ts","../src/crypto/shamir.ts","../src/crypto/zeroize.ts","../src/mpc/split.ts","../src/mpc/combine.ts","../src/crypto/kdf.ts","../src/crypto/recoveryKey.ts","../src/crypto/x25519.ts","../src/crypto/sessionFragment.ts","../src/crypto/hash.ts","../src/auth/cognito.ts","../src/auth/session.ts","../src/auth/tokens.ts","../src/api/errors.ts","../src/errors/format.ts","../src/api/client.ts","../src/api/endpoints.ts","../src/webauthn/register.ts","../src/webauthn/verify.ts","../src/webauthn/storage.ts","../src/stellar/loadSdk.ts","../src/stellar/builder.ts","../src/stellar/signer.ts","../src/stellar/contractAddress.ts","../src/stellar/horizon.ts","../src/stellar/sorobanAuth.ts","../src/stellar/format.ts","../src/index.ts"],"names":["gcm","ed25519","sha256","hkdf","pbkdf2","x25519","nobleSha256","CognitoUserPool","CognitoUserAttribute","AuthenticationDetails","CognitoRefreshToken","CognitoUser","asBufferSource","base64ToBytes"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Cryptographically secure randomness.\n *\n * Wraps the platform CSPRNG (`crypto.getRandomValues`) so tests can inject a\n * deterministic source. Production code should never see the override.\n *\n * The Web Crypto API is available in Node 20+, modern browsers, and React Native\n * (via react-native-quick-crypto or polyfill). No fallback is provided — failing\n * loud is better than silently using a weaker source.\n */\n\ntype RandomSource = (length: number) => Uint8Array;\n\nconst platformSource: RandomSource = (length: number): Uint8Array => {\n if (typeof globalThis.crypto?.getRandomValues !== 'function') {\n throw new Error(\n 'crypto.getRandomValues is not available in this environment. ' +\n 'Accesly requires Node 20+ or a modern browser/React Native runtime.',\n );\n }\n const out = new Uint8Array(length);\n globalThis.crypto.getRandomValues(out);\n return out;\n};\n\nlet currentSource: RandomSource = platformSource;\n\n/**\n * Returns `length` cryptographically random bytes.\n */\nexport function getRandomBytes(length: number): Uint8Array {\n if (!Number.isInteger(length) || length < 0 || length > 65_536) {\n throw new RangeError(`getRandomBytes: length must be 0..65536, got ${length}`);\n }\n return currentSource(length);\n}\n\n/**\n * Test-only: replace the randomness source with a deterministic one.\n * Returns a restore function.\n *\n * Never call this from production code. Tests use it for property-based and\n * reproducible scenarios.\n */\nexport function __setRandomSourceForTests(source: RandomSource): () => void {\n const previous = currentSource;\n currentSource = source;\n return () => {\n currentSource = previous;\n };\n}\n","/**\n * AES-256-GCM authenticated encryption.\n *\n * Wraps `@noble/ciphers/aes`. The auth tag is appended to the ciphertext, as\n * is standard for AEAD APIs (and what the backend openapi spec assumes for\n * `EncryptedFragment.ciphertext`).\n *\n * Nonce reuse with the same key is catastrophic for AES-GCM. We generate a\n * fresh 96-bit nonce on every encrypt and never expose a \"nonce override\"\n * parameter to consumers.\n */\n\nimport { gcm } from '@noble/ciphers/aes';\nimport { getRandomBytes } from './random.js';\n\nexport const AES_KEY_LENGTH = 32; // 256 bits\nexport const AES_GCM_NONCE_LENGTH = 12; // 96 bits, recommended by NIST SP 800-38D\nexport const AES_GCM_TAG_LENGTH = 16; // 128 bits\n\nexport interface EncryptedEnvelope {\n /** Random 12-byte nonce used for this encryption. */\n readonly nonce: Uint8Array;\n /** AES-GCM ciphertext with the 16-byte auth tag appended. */\n readonly ciphertext: Uint8Array;\n /** Optional additional authenticated data, kept for round-tripping. */\n readonly aad?: Uint8Array;\n}\n\n/**\n * Encrypts `plaintext` with `key` and optional `aad`. The returned envelope\n * contains a fresh nonce and ciphertext with the auth tag appended.\n */\nexport function encryptAesGcm(\n plaintext: Uint8Array,\n key: Uint8Array,\n aad?: Uint8Array,\n): EncryptedEnvelope {\n assertKeyLength(key);\n const nonce = getRandomBytes(AES_GCM_NONCE_LENGTH);\n const cipher = gcm(key, nonce, aad);\n const ciphertext = cipher.encrypt(plaintext);\n return aad !== undefined ? { nonce, ciphertext, aad } : { nonce, ciphertext };\n}\n\n/**\n * Decrypts the envelope. Throws if the auth tag does not validate or if the\n * key/nonce/aad does not match what was used for encryption.\n *\n * The returned plaintext is a fresh buffer; the caller is responsible for\n * zeroizing it after use if sensitive.\n */\nexport function decryptAesGcm(envelope: EncryptedEnvelope, key: Uint8Array): Uint8Array {\n assertKeyLength(key);\n if (envelope.nonce.length !== AES_GCM_NONCE_LENGTH) {\n throw new RangeError(\n `decryptAesGcm: nonce must be ${AES_GCM_NONCE_LENGTH} bytes, got ${envelope.nonce.length}`,\n );\n }\n if (envelope.ciphertext.length < AES_GCM_TAG_LENGTH) {\n throw new RangeError(\n `decryptAesGcm: ciphertext too short to contain auth tag (${envelope.ciphertext.length} bytes)`,\n );\n }\n const cipher = gcm(key, envelope.nonce, envelope.aad);\n return cipher.decrypt(envelope.ciphertext);\n}\n\nfunction assertKeyLength(key: Uint8Array): void {\n if (key.length !== AES_KEY_LENGTH) {\n throw new RangeError(`AES-256-GCM key must be ${AES_KEY_LENGTH} bytes, got ${key.length}`);\n }\n}\n","/**\n * Ed25519 keypair generation, signing and verification.\n *\n * Thin wrapper over `@noble/curves/ed25519`. The seed (32-byte private scalar\n * input) is what we keep in memory during signing — callers must zeroize after\n * use. This file is allow-listed in `audit-no-custody.mjs` to use `ed25519.sign`.\n */\n\nimport { ed25519 } from '@noble/curves/ed25519';\nimport { getRandomBytes } from './random.js';\n\n/**\n * Length, in bytes, of a raw ed25519 private seed.\n */\nexport const ED25519_SEED_LENGTH = 32;\n\n/**\n * Length, in bytes, of a raw ed25519 public key.\n */\nexport const ED25519_PUBLIC_KEY_LENGTH = 32;\n\n/**\n * Length, in bytes, of an ed25519 signature.\n */\nexport const ED25519_SIGNATURE_LENGTH = 64;\n\nexport interface Ed25519Keypair {\n /** 32-byte raw private seed. Treat as secret; zeroize after use. */\n readonly privateSeed: Uint8Array;\n /** 32-byte raw public key derived from the seed. */\n readonly publicKey: Uint8Array;\n}\n\n/**\n * Generates a new ed25519 keypair from CSPRNG bytes.\n */\nexport function generateKeypair(): Ed25519Keypair {\n const privateSeed = getRandomBytes(ED25519_SEED_LENGTH);\n const publicKey = ed25519.getPublicKey(privateSeed);\n return { privateSeed, publicKey };\n}\n\n/**\n * Derives the public key from a raw ed25519 seed without exposing the seed.\n *\n * Throws if `seed` is not exactly 32 bytes.\n */\nexport function publicKeyFromSeed(seed: Uint8Array): Uint8Array {\n if (seed.length !== ED25519_SEED_LENGTH) {\n throw new RangeError(\n `publicKeyFromSeed: seed must be ${ED25519_SEED_LENGTH} bytes, got ${seed.length}`,\n );\n }\n return ed25519.getPublicKey(seed);\n}\n\n/**\n * Signs `message` with the ed25519 seed.\n *\n * The caller is responsible for zeroizing `privateSeed` after the call.\n * The signature is non-malleable and 64 bytes long.\n */\nexport function signEd25519(message: Uint8Array, privateSeed: Uint8Array): Uint8Array {\n if (privateSeed.length !== ED25519_SEED_LENGTH) {\n throw new RangeError(\n `signEd25519: privateSeed must be ${ED25519_SEED_LENGTH} bytes, got ${privateSeed.length}`,\n );\n }\n return ed25519.sign(message, privateSeed);\n}\n\n/**\n * Verifies an ed25519 signature.\n *\n * Returns `false` (never throws) on malformed inputs or mismatched length —\n * cryptographic primitives must be hard to misuse.\n */\nexport function verifyEd25519(\n signature: Uint8Array,\n message: Uint8Array,\n publicKey: Uint8Array,\n): boolean {\n if (signature.length !== ED25519_SIGNATURE_LENGTH) return false;\n if (publicKey.length !== ED25519_PUBLIC_KEY_LENGTH) return false;\n try {\n return ed25519.verify(signature, message, publicKey);\n } catch {\n return false;\n }\n}\n","/**\n * Shamir Secret Sharing over GF(256), byte-wise.\n *\n * Each byte of the secret is split independently using a random polynomial of\n * degree `threshold - 1` over the Galois field GF(2^8) with reducing polynomial\n * 0x11b (the AES field). Reconstruction is Lagrange interpolation evaluated at\n * x = 0 using any `threshold` shares.\n *\n * References:\n * - Adi Shamir, \"How to Share a Secret\" (1979)\n * - SLIP-0039 (https://github.com/satoshilabs/slips/blob/master/slip-0039.md)\n * — uses GF(256) the same way.\n *\n * This file is allow-listed in `audit-no-custody.mjs`: the function names\n * `splitSecret`, `shamirCombine`, and `shamirCombine` are reserved to this\n * module + `packages/core/src/mpc/{split,combine}.ts`.\n */\n\nimport { getRandomBytes } from './random.js';\n\n/* ------------------------------------------------------------------------ */\n/* GF(256) arithmetic */\n/* ------------------------------------------------------------------------ */\n\n/**\n * EXP[i] = 0x03^i over GF(256), with i in [0, 510].\n * The duplicated upper half lets `gfMul` add log values without a modulo.\n */\nconst EXP = new Uint8Array(512);\n\n/**\n * LOG[x] = log_{0x03}(x) over GF(256), with x in [1, 255].\n * LOG[0] is undefined (logarithm of zero); callers must guard explicitly.\n */\nconst LOG = new Uint8Array(256);\n\n(function buildTables(): void {\n let x = 1;\n for (let i = 0; i < 255; i += 1) {\n EXP[i] = x;\n LOG[x] = i;\n // Multiply x by the generator 0x03 = (x + 1).\n let next = x ^ ((x << 1) & 0xff);\n if (x & 0x80) next ^= 0x1b; // reduce modulo 0x11b\n x = next;\n }\n for (let i = 255; i < 510; i += 1) {\n EXP[i] = EXP[i - 255] ?? 0;\n }\n})();\n\n/** Multiplication in GF(256). */\nfunction gfMul(a: number, b: number): number {\n if (a === 0 || b === 0) return 0;\n // a, b in [1, 255] => LOG[a], LOG[b] in [0, 254] => sum in [0, 508] within EXP table size.\n return EXP[LOG[a]! + LOG[b]!]!;\n}\n\n/** Division in GF(256). Returns 0 when numerator is 0; throws on zero denominator. */\nfunction gfDiv(numerator: number, denominator: number): number {\n if (denominator === 0) {\n throw new Error('shamir: division by zero in GF(256)');\n }\n if (numerator === 0) return 0;\n // LOG[num] - LOG[den] could be negative; +255 keeps the index non-negative.\n return EXP[LOG[numerator]! + 255 - LOG[denominator]!]!;\n}\n\n/** Evaluate polynomial `coeffs` at `x` using Horner's method, over GF(256). */\nfunction evaluatePolynomial(coeffs: Uint8Array, x: number): number {\n let result = coeffs[coeffs.length - 1]!;\n for (let i = coeffs.length - 2; i >= 0; i -= 1) {\n result = gfMul(result, x) ^ coeffs[i]!;\n }\n return result;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Public API */\n/* ------------------------------------------------------------------------ */\n\n/**\n * A single Shamir share.\n *\n * `index` is the x-coordinate (1..255). `data[i]` is the y-coordinate of the\n * i-th byte's polynomial evaluated at `index`. Two shares are equal iff their\n * (index, data) pairs are equal.\n */\nexport interface ShamirShare {\n readonly index: number;\n readonly data: Uint8Array;\n}\n\nexport const SHAMIR_MAX_SHARES = 255;\n\n/**\n * Splits `secret` into `totalShares` shares of which any `threshold` suffice\n * to reconstruct.\n *\n * `threshold` must be in [2, 255]. `totalShares` must be in [threshold, 255].\n * `secret` may be of any length >= 1.\n *\n * Memory: the random coefficients are zeroed after each byte. The returned\n * shares are heap-allocated; the caller is responsible for clearing them once\n * they are no longer needed (e.g. once encrypted to envelopes).\n */\nexport function splitSecret(\n secret: Uint8Array,\n threshold: number,\n totalShares: number,\n): ShamirShare[] {\n if (secret.length === 0) {\n throw new RangeError('splitSecret: secret must be non-empty');\n }\n if (!Number.isInteger(threshold) || threshold < 2 || threshold > SHAMIR_MAX_SHARES) {\n throw new RangeError(`splitSecret: threshold must be in [2, 255], got ${threshold}`);\n }\n if (\n !Number.isInteger(totalShares) ||\n totalShares < threshold ||\n totalShares > SHAMIR_MAX_SHARES\n ) {\n throw new RangeError(\n `splitSecret: totalShares must be in [${threshold}, 255], got ${totalShares}`,\n );\n }\n\n // Pre-allocate one Uint8Array per share for the y-coordinates.\n const shares: ShamirShare[] = [];\n for (let i = 0; i < totalShares; i += 1) {\n shares.push({ index: i + 1, data: new Uint8Array(secret.length) });\n }\n\n // For each byte of the secret, generate a random polynomial of degree\n // `threshold - 1` whose constant term is the secret byte, and evaluate it\n // at x = 1..totalShares.\n const coeffs = new Uint8Array(threshold);\n for (let byteIdx = 0; byteIdx < secret.length; byteIdx += 1) {\n coeffs[0] = secret[byteIdx]!;\n const rand = getRandomBytes(threshold - 1);\n coeffs.set(rand, 1);\n for (let s = 0; s < totalShares; s += 1) {\n shares[s]!.data[byteIdx] = evaluatePolynomial(coeffs, shares[s]!.index);\n }\n coeffs.fill(0); // zeroize between bytes\n rand.fill(0);\n }\n\n return shares;\n}\n\n/**\n * Reconstructs the original secret from `shares`. Returns whatever number of\n * bytes was the original secret length.\n *\n * Caller MUST provide exactly `threshold` shares of the original split. Fewer\n * yields a wrong but indistinguishable value (a defining property of Shamir);\n * more is redundant. Duplicate or zero-indexed shares throw.\n */\nexport function shamirCombine(shares: readonly ShamirShare[]): Uint8Array {\n if (shares.length === 0) {\n throw new RangeError('shamirCombine: at least 1 share required');\n }\n const length = shares[0]!.data.length;\n const seenIndexes = new Set<number>();\n for (const share of shares) {\n if (share.index < 1 || share.index > SHAMIR_MAX_SHARES) {\n throw new RangeError(`shamirCombine: share index out of range: ${share.index}`);\n }\n if (share.data.length !== length) {\n throw new RangeError(\n `shamirCombine: all shares must have the same length (${length}), got ${share.data.length}`,\n );\n }\n if (seenIndexes.has(share.index)) {\n throw new Error(`shamirCombine: duplicate share index ${share.index}`);\n }\n seenIndexes.add(share.index);\n }\n\n // Precompute the Lagrange basis at x = 0 for each share.\n // L_i(0) = prod_{j != i} (x_j) / (x_j XOR x_i) [subtraction == XOR in char 2]\n const lagrange = new Uint8Array(shares.length);\n for (let i = 0; i < shares.length; i += 1) {\n let numerator = 1;\n let denominator = 1;\n for (let j = 0; j < shares.length; j += 1) {\n if (i === j) continue;\n numerator = gfMul(numerator, shares[j]!.index);\n denominator = gfMul(denominator, shares[j]!.index ^ shares[i]!.index);\n }\n lagrange[i] = gfDiv(numerator, denominator);\n }\n\n const result = new Uint8Array(length);\n for (let byteIdx = 0; byteIdx < length; byteIdx += 1) {\n let acc = 0;\n for (let i = 0; i < shares.length; i += 1) {\n acc ^= gfMul(shares[i]!.data[byteIdx]!, lagrange[i]!);\n }\n result[byteIdx] = acc;\n }\n return result;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Wire encoding for a single share */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Encodes a share as a flat Uint8Array `[index, ...data]`. Useful for storing\n * or transmitting a single fragment as one binary blob.\n */\nexport function encodeShare(share: ShamirShare): Uint8Array {\n if (share.index < 1 || share.index > SHAMIR_MAX_SHARES) {\n throw new RangeError(`encodeShare: index out of range: ${share.index}`);\n }\n const out = new Uint8Array(share.data.length + 1);\n out[0] = share.index;\n out.set(share.data, 1);\n return out;\n}\n\n/**\n * Decodes a flat share blob produced by `encodeShare`.\n */\nexport function decodeShare(encoded: Uint8Array): ShamirShare {\n if (encoded.length < 2) {\n throw new RangeError(`decodeShare: encoded share too short (${encoded.length} bytes)`);\n }\n const index = encoded[0]!;\n if (index < 1 || index > SHAMIR_MAX_SHARES) {\n throw new RangeError(`decodeShare: index out of range: ${index}`);\n }\n return { index, data: encoded.slice(1) };\n}\n","/**\n * Defensive memory zeroing for sensitive buffers.\n *\n * JavaScript does not guarantee that a freed buffer will be wiped from the\n * heap — V8 may keep a copy in young generation until the next GC, JIT'd code\n * may hold register copies, etc. `zeroize` is therefore best-effort. It does:\n * 1. Overwrite the buffer with zeros (immediate).\n * 2. Make any future accidental use of the buffer return zeros instead of\n * the original secret.\n *\n * Always pair sensitive operations with `withZeroize` so the cleanup happens\n * even on thrown errors.\n */\n\n/**\n * Overwrites a buffer with zeros in place. No-op on undefined/null.\n *\n * Note: views into the same underlying ArrayBuffer are also zeroed.\n */\nexport function zeroize(buf: Uint8Array | undefined | null): void {\n if (!buf) return;\n buf.fill(0);\n}\n\n/**\n * Runs `fn` and then zeroizes every buffer in `secrets`, including on throw.\n * Returns whatever `fn` returns.\n *\n * Use this around any code that derives intermediate secret material so that a\n * thrown error cannot leave the secret alive in memory.\n *\n * @example\n * const signature = withZeroize([reconstructedSeed, fragmentF2Plain], () => {\n * return sign(message, reconstructedSeed);\n * });\n */\nexport function withZeroize<T>(\n secrets: ReadonlyArray<Uint8Array | undefined | null>,\n fn: () => T,\n): T {\n try {\n return fn();\n } finally {\n for (const buf of secrets) zeroize(buf);\n }\n}\n\n/**\n * Async variant of `withZeroize`.\n */\nexport async function withZeroizeAsync<T>(\n secrets: ReadonlyArray<Uint8Array | undefined | null>,\n fn: () => Promise<T>,\n): Promise<T> {\n try {\n return await fn();\n } finally {\n for (const buf of secrets) zeroize(buf);\n }\n}\n","/**\n * MPC split — generate a fresh ed25519 keypair, split the seed with Shamir\n * (2-of-3), encrypt each fragment under a caller-supplied key, and zeroize all\n * intermediate secret state.\n *\n * Allow-listed in `audit-no-custody.mjs` to use `splitSecret`.\n *\n * Hito 2 leaves \"where the encryption keys come from\" to the caller. Hito 4 will\n * wire WebAuthn PRF + email PBKDF2 derivations on top of this primitive.\n */\n\nimport { sha256 } from '@noble/hashes/sha2';\nimport { encryptAesGcm, type EncryptedEnvelope } from '../crypto/aesgcm.js';\nimport { generateKeypair } from '../crypto/keypair.js';\nimport { encodeShare, splitSecret } from '../crypto/shamir.js';\nimport { withZeroize, zeroize } from '../crypto/zeroize.js';\n\n/** Total number of shares produced. */\nexport const TOTAL_FRAGMENTS = 3;\n/** Number of shares required to reconstruct the seed. */\nexport const RECONSTRUCT_THRESHOLD = 2;\n\n/**\n * A 3-tuple of distinct AES-256-GCM encryption keys, one per fragment.\n * The caller derives these from device material, server material, and email\n * recovery material respectively (see Hito 4 for the actual derivations).\n */\nexport type FragmentEncryptionKeys = readonly [\n /** Key used to encrypt fragment F1 (device-bound). */\n Uint8Array,\n /** Key used to encrypt fragment F2 (server-stored). */\n Uint8Array,\n /** Key used to encrypt fragment F3 (email-recovery-bound). */\n Uint8Array,\n];\n\nexport interface CreateWalletParams {\n /** UTF-8 encoded user identifier (typically an email address). */\n readonly emailBytes: Uint8Array;\n /** High-entropy salt for the email commitment (32 bytes recommended). */\n readonly emailSalt: Uint8Array;\n /** Three distinct AES-256-GCM keys, one per fragment. */\n readonly encryptionKeys: FragmentEncryptionKeys;\n /**\n * Optional additional authenticated data bound to each fragment envelope.\n * If provided, the same AAD must be supplied at decrypt time. Useful for\n * binding a fragment to an appId / user-sub claim.\n */\n readonly fragmentAad?: Uint8Array;\n}\n\n/** Three encrypted fragments in F1/F2/F3 order. */\nexport type EncryptedFragments = readonly [EncryptedEnvelope, EncryptedEnvelope, EncryptedEnvelope];\n\nexport interface CreateWalletResult {\n /** Raw ed25519 public key (32 bytes). Send to the backend. */\n readonly publicKey: Uint8Array;\n /** SHA-256(email || salt). 32 bytes. Send to the backend. */\n readonly emailCommitment: Uint8Array;\n /** Encrypted fragments. F1 stays on device; F2 and F3 go to the backend. */\n readonly encryptedFragments: EncryptedFragments;\n}\n\n/**\n * Generates a fresh wallet keypair, splits the seed 2-of-3, encrypts each\n * fragment, and returns only what is safe to leak outside the secure context.\n *\n * Zeroization:\n * - The ed25519 seed is zeroed before return.\n * - Plain Shamir shares are zeroed after encryption.\n * - Intermediate share encodings are zeroed after encryption.\n *\n * Throws if any of the three encryption keys is not 32 bytes.\n */\nexport function createWallet(params: CreateWalletParams): CreateWalletResult {\n if (params.emailBytes.length === 0) {\n throw new RangeError('createWallet: emailBytes must be non-empty');\n }\n if (params.emailSalt.length === 0) {\n throw new RangeError('createWallet: emailSalt must be non-empty');\n }\n // assertKeyLength is performed by encryptAesGcm; nothing else to validate here.\n\n const keypair = generateKeypair();\n\n return withZeroize([keypair.privateSeed], () => {\n const shares = splitSecret(keypair.privateSeed, RECONSTRUCT_THRESHOLD, TOTAL_FRAGMENTS);\n if (shares.length !== TOTAL_FRAGMENTS) {\n // Defense-in-depth: splitSecret guarantees this but it's cheap to assert.\n throw new Error(`createWallet: expected ${TOTAL_FRAGMENTS} shares, got ${shares.length}`);\n }\n\n const encryptedFragments = shares.map((share, idx) => {\n const encoded = encodeShare(share);\n try {\n return encryptAesGcm(encoded, params.encryptionKeys[idx]!, params.fragmentAad);\n } finally {\n zeroize(encoded);\n zeroize(share.data);\n }\n }) as unknown as [EncryptedEnvelope, EncryptedEnvelope, EncryptedEnvelope];\n\n const commitInput = concat(params.emailBytes, params.emailSalt);\n const emailCommitment = sha256(commitInput);\n zeroize(commitInput);\n\n return {\n publicKey: keypair.publicKey,\n emailCommitment,\n encryptedFragments,\n } satisfies CreateWalletResult;\n });\n}\n\nfunction concat(a: Uint8Array, b: Uint8Array): Uint8Array {\n const out = new Uint8Array(a.length + b.length);\n out.set(a, 0);\n out.set(b, a.length);\n return out;\n}\n","/**\n * MPC combine — given any two of the three encrypted fragments and the\n * corresponding decryption keys, decrypt, run Shamir interpolation, and return\n * the reconstructed ed25519 seed plus its public key.\n *\n * Allow-listed in `audit-no-custody.mjs` to use `shamirCombine`.\n *\n * The returned `privateSeed` is hot — the caller MUST zeroize it as soon as\n * the signature it was reconstructed for is produced. Use `withZeroize` from\n * `@accesly/core/crypto` for that.\n */\n\nimport { decryptAesGcm, type EncryptedEnvelope } from '../crypto/aesgcm.js';\nimport { ED25519_SEED_LENGTH, publicKeyFromSeed } from '../crypto/keypair.js';\nimport { decodeShare, shamirCombine, type ShamirShare } from '../crypto/shamir.js';\nimport { zeroize } from '../crypto/zeroize.js';\n\n/** An encrypted fragment with the AES-GCM key needed to decrypt it. */\nexport interface EncryptedFragmentInput {\n readonly envelope: EncryptedEnvelope;\n readonly key: Uint8Array;\n}\n\nexport interface ReconstructKeyParams {\n /**\n * Exactly two encrypted fragments. Order does not matter (the Shamir index\n * is encoded inside each decrypted share blob).\n */\n readonly fragments: readonly [EncryptedFragmentInput, EncryptedFragmentInput];\n}\n\nexport interface ReconstructKeyResult {\n /** Reconstructed 32-byte ed25519 seed. CALLER MUST ZEROIZE. */\n readonly privateSeed: Uint8Array;\n /** 32-byte ed25519 public key, derived from the seed for convenience. */\n readonly publicKey: Uint8Array;\n}\n\n/**\n * Reconstructs the ed25519 seed from two fragments. Throws if:\n * - any AES-GCM auth tag fails to validate,\n * - the two decoded shares carry the same Shamir index,\n * - any decoded share has unexpected length (not 33: 1 byte index + 32 seed).\n */\nexport function reconstructKey(params: ReconstructKeyParams): ReconstructKeyResult {\n const [fragA, fragB] = params.fragments;\n const decodedA = decryptAesGcm(fragA.envelope, fragA.key);\n const decodedB = decryptAesGcm(fragB.envelope, fragB.key);\n\n let shareA: ShamirShare | undefined;\n let shareB: ShamirShare | undefined;\n let combined: Uint8Array | undefined;\n try {\n shareA = decodeShare(decodedA);\n shareB = decodeShare(decodedB);\n if (shareA.data.length !== 32) {\n throw new RangeError(\n `reconstructKey: expected 32-byte share payload, got ${shareA.data.length}`,\n );\n }\n if (shareB.data.length !== 32) {\n throw new RangeError(\n `reconstructKey: expected 32-byte share payload, got ${shareB.data.length}`,\n );\n }\n combined = shamirCombine([shareA, shareB]);\n if (combined.length !== 32) {\n throw new RangeError(\n `reconstructKey: combined seed has unexpected length ${combined.length}`,\n );\n }\n const publicKey = publicKeyFromSeed(combined);\n return { privateSeed: combined, publicKey };\n } catch (err) {\n // On any failure, ensure no partial seed material leaks out.\n if (combined) zeroize(combined);\n throw err;\n } finally {\n // Always wipe the plaintext share payloads, even on success.\n zeroize(decodedA);\n zeroize(decodedB);\n if (shareA) zeroize(shareA.data);\n if (shareB) zeroize(shareB.data);\n }\n}\n\nexport interface ReconstructFromPlainParams {\n /** Plain (already-decrypted) F1 — encoded share, includes the 1-byte index. */\n readonly fragmentF1Plain: Uint8Array;\n /** Encrypted F2 envelope as returned by the backend `/fragments/2`. */\n readonly fragmentF2: EncryptedFragmentInput;\n}\n\n/**\n * Variant of `reconstructKey` for the common signing flow: F1 has already\n * been decrypted on-device (via WebAuthn PRF) while F2 still needs the\n * backend-supplied session key. Avoids a wasteful \"encrypt-then-decrypt-F1\"\n * round trip.\n *\n * Allow-listed in `audit-no-custody.mjs` to use `shamirCombine`.\n */\nexport function reconstructFromPlainAndEncrypted(\n params: ReconstructFromPlainParams,\n): ReconstructKeyResult {\n const decodedF2 = decryptAesGcm(params.fragmentF2.envelope, params.fragmentF2.key);\n let shareA: ShamirShare | undefined;\n let shareB: ShamirShare | undefined;\n let combined: Uint8Array | undefined;\n try {\n shareA = decodeShare(params.fragmentF1Plain);\n shareB = decodeShare(decodedF2);\n if (shareA.data.length !== ED25519_SEED_LENGTH || shareB.data.length !== ED25519_SEED_LENGTH) {\n throw new RangeError(\n `reconstructFromPlainAndEncrypted: expected ${ED25519_SEED_LENGTH}-byte share payload`,\n );\n }\n combined = shamirCombine([shareA, shareB]);\n const publicKey = publicKeyFromSeed(combined);\n return { privateSeed: combined, publicKey };\n } catch (err) {\n if (combined) zeroize(combined);\n throw err;\n } finally {\n zeroize(decodedF2);\n if (shareA) zeroize(shareA.data);\n if (shareB) zeroize(shareB.data);\n }\n}\n","/**\n * Key derivation functions.\n *\n * - HKDF-SHA-256 for deriving session/encryption keys from high-entropy inputs\n * (e.g. ECDH shared secrets, raw seeds).\n * - PBKDF2-SHA-256 for deriving keys from low-entropy inputs (passwords, email\n * addresses). Default iteration count follows OWASP 2023 guidance (600k).\n */\n\nimport { hkdf } from '@noble/hashes/hkdf';\nimport { pbkdf2 } from '@noble/hashes/pbkdf2';\nimport { sha256 } from '@noble/hashes/sha2';\n\n/**\n * OWASP 2023 recommendation for PBKDF2-HMAC-SHA-256 iterations.\n * @see https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html\n */\nexport const PBKDF2_DEFAULT_ITERATIONS = 600_000;\n\n/**\n * HKDF-Extract-and-Expand with SHA-256.\n *\n * `ikm` should be high-entropy material. For password-derived keys, use\n * `pbkdf2Sha256` instead.\n */\nexport function hkdfSha256(\n ikm: Uint8Array,\n salt: Uint8Array,\n info: Uint8Array,\n length: number,\n): Uint8Array {\n if (length <= 0 || length > 8160) {\n // RFC 5869: HKDF max output is 255 * HashLen = 255 * 32 = 8160 for SHA-256.\n throw new RangeError(`hkdfSha256: length must be 1..8160, got ${length}`);\n }\n return hkdf(sha256, ikm, salt, info, length);\n}\n\nexport interface Pbkdf2Options {\n /** Number of iterations. Defaults to PBKDF2_DEFAULT_ITERATIONS (600k). */\n readonly iterations?: number;\n /** Output length in bytes. Defaults to 32 (256 bits). */\n readonly length?: number;\n}\n\n/**\n * PBKDF2-HMAC-SHA-256.\n *\n * Use for low-entropy inputs such as emails or passphrases. The default\n * configuration (600k iterations, 32-byte output) follows OWASP 2023.\n *\n * `password` is a Uint8Array (not a string) so the caller can zeroize it\n * after derivation. Strings can be converted via `new TextEncoder().encode`.\n */\nexport function pbkdf2Sha256(\n password: Uint8Array,\n salt: Uint8Array,\n options: Pbkdf2Options = {},\n): Uint8Array {\n const iterations = options.iterations ?? PBKDF2_DEFAULT_ITERATIONS;\n const length = options.length ?? 32;\n if (iterations < 1 || !Number.isInteger(iterations)) {\n throw new RangeError(`pbkdf2Sha256: iterations must be a positive integer`);\n }\n if (length < 1 || length > 1024) {\n throw new RangeError(`pbkdf2Sha256: length must be 1..1024, got ${length}`);\n }\n return pbkdf2(sha256, password, salt, { c: iterations, dkLen: length });\n}\n","/**\n * Recovery key derivation para Recovery v2 (2026-06-15).\n *\n * El flujo:\n * 1. Al `createWallet`, el SDK genera un `recoverySalt` aleatorio (32 bytes).\n * 2. Deriva `recoveryKey = PBKDF2-SHA256(password, recoverySalt, 600k iter)`\n * usando el password de Cognito que el usuario acaba de ingresar.\n * 3. Cifra `F3` con `recoveryKey` (AES-GCM) y envía `{F3_enc, recoverySalt}`\n * al backend.\n * 4. Al recuperar (otra device): user mete email → OTP → password.\n * - Backend libera `F3_enc + recoverySalt`.\n * - SDK deriva `recoveryKey` con el mismo password + salt.\n * - SDK descifra `F3` → reconstruye seed con F2+F3 → registra new passkey\n * → firma `rotate_signer` con la seed reconstruida.\n *\n * **Garantía no-custodial:** el backend nunca tiene el password de Cognito\n * en plano (Cognito guarda un SRP verifier, no el password). Por lo tanto\n * el backend no puede derivar `recoveryKey` y no puede descifrar `F3`.\n *\n * Ver SDKAccesly/docs/Plan_Final_v1.md §5 (Fase 1).\n */\n\nimport { sha256 } from '@noble/hashes/sha2';\nimport { pbkdf2Sha256, PBKDF2_DEFAULT_ITERATIONS } from './kdf.js';\nimport { getRandomBytes } from './random.js';\nimport { zeroize } from './zeroize.js';\n\n/**\n * Calcula `sha256(email.toLowerCase().trim())` y devuelve 32 bytes.\n *\n * El backend lo usa como índice en el GSI `by-email-hash` de\n * `user_fragments` para resolver Recovery v2 sin exponer el email en\n * plano más allá de Cognito (que ya lo tiene).\n */\nexport function emailHashBytes(email: string): Uint8Array {\n const normalized = email.toLowerCase().trim();\n return sha256(new TextEncoder().encode(normalized));\n}\n\n/** Largo del salt en bytes. Coincide con `emailSalt` del flujo de createWallet. */\nexport const RECOVERY_SALT_BYTES = 32;\n\n/** Largo de la `recoveryKey` derivada. Suficiente para AES-256-GCM. */\nexport const RECOVERY_KEY_BYTES = 32;\n\nexport interface DeriveRecoveryKeyParams {\n /**\n * Password en plano. **Solo vive en cliente.** Después de la derivación\n * el caller debe zero-izar el buffer del password con `zeroize`.\n *\n * Si el caller solo tiene un `string`, debe codificarlo a `Uint8Array`\n * vía `new TextEncoder().encode(password)` ANTES de pasarlo aquí —\n * los `string` JS son inmutables y no se pueden zeroizar.\n */\n readonly password: Uint8Array;\n /**\n * Salt de recovery (32 bytes). En `createWallet` se genera con\n * `generateRecoverySalt()`. En recovery se recibe del backend junto con\n * el `fragmentF3Encrypted`.\n */\n readonly salt: Uint8Array;\n /**\n * Iteraciones PBKDF2. Default 600k (OWASP 2023). Solo pasar override\n * para tests; producción debe usar el default.\n */\n readonly iterations?: number;\n}\n\n/**\n * Genera un salt aleatorio de 32 bytes para recovery key.\n *\n * Llamado una sola vez en `createWallet`. El salt viaja al backend junto con\n * `fragmentF3Encrypted` y se usa para re-derivar la misma key durante recovery.\n */\nexport function generateRecoverySalt(): Uint8Array {\n return getRandomBytes(RECOVERY_SALT_BYTES);\n}\n\n/**\n * Deriva una `recoveryKey` AES-256 desde el password de Cognito + salt.\n *\n * Determinista: misma `(password, salt)` → misma key.\n *\n * **Importante para no-custodia:** el caller es responsable de:\n * - zeroizar `params.password` después de llamar esta función.\n * - zeroizar el `Uint8Array` devuelto después de usarlo para AES-GCM\n * (encrypt o decrypt).\n *\n * @throws RangeError si `salt.length !== RECOVERY_SALT_BYTES`.\n */\nexport function deriveRecoveryKey(params: DeriveRecoveryKeyParams): Uint8Array {\n if (params.salt.length !== RECOVERY_SALT_BYTES) {\n throw new RangeError(\n `deriveRecoveryKey: salt must be ${RECOVERY_SALT_BYTES} bytes, got ${params.salt.length}`,\n );\n }\n if (params.password.length === 0) {\n throw new RangeError('deriveRecoveryKey: password must be non-empty');\n }\n const iterations = params.iterations ?? PBKDF2_DEFAULT_ITERATIONS;\n return pbkdf2Sha256(params.password, params.salt, {\n iterations,\n length: RECOVERY_KEY_BYTES,\n });\n}\n\n/**\n * Helper conveniente: deriva una `recoveryKey` desde un password string +\n * salt, codificando + zeroizando el buffer del password en el camino.\n *\n * **Cuidado:** strings JS son inmutables; no podemos zeroizar el string\n * original que el caller pasó. Para no-custodia estricta el caller debe\n * usar `deriveRecoveryKey` directamente con un buffer y zeroizarlo.\n *\n * Este helper se ofrece para integradores que aceptan el trade-off de UX\n * vs. estricta higiene de memoria.\n */\nexport function deriveRecoveryKeyFromPasswordString(\n password: string,\n salt: Uint8Array,\n iterations?: number,\n): Uint8Array {\n const buffer = new TextEncoder().encode(password);\n try {\n return deriveRecoveryKey({\n password: buffer,\n salt,\n ...(iterations !== undefined ? { iterations } : {}),\n });\n } finally {\n zeroize(buffer);\n }\n}\n","/**\n * X25519 elliptic-curve Diffie-Hellman.\n *\n * Used for the session-key exchange with the Accesly backend when retrieving\n * F2: the SDK posts its ephemeral X25519 public key, the backend replies with\n * an envelope encrypted under a key derived from the shared secret.\n *\n * Built on `@noble/curves/ed25519` which exports `x25519` from the same file.\n * The shared secret is NOT a key on its own — always pass it through HKDF.\n */\n\nimport { x25519 } from '@noble/curves/ed25519';\nimport { getRandomBytes } from './random.js';\n\nexport const X25519_PRIVATE_KEY_LENGTH = 32;\nexport const X25519_PUBLIC_KEY_LENGTH = 32;\nexport const X25519_SHARED_SECRET_LENGTH = 32;\n\nexport interface X25519Keypair {\n /** 32-byte raw private scalar. Treat as secret; zeroize after use. */\n readonly privateKey: Uint8Array;\n /** 32-byte X25519 public key. */\n readonly publicKey: Uint8Array;\n}\n\n/**\n * Generates an ephemeral X25519 keypair from CSPRNG bytes.\n *\n * The standard X25519 private-key clamping is applied internally by noble.\n */\nexport function generateX25519Keypair(): X25519Keypair {\n const privateKey = getRandomBytes(X25519_PRIVATE_KEY_LENGTH);\n const publicKey = x25519.getPublicKey(privateKey);\n return { privateKey, publicKey };\n}\n\n/**\n * Derives the X25519 public key from a raw private scalar.\n */\nexport function x25519PublicKey(privateKey: Uint8Array): Uint8Array {\n if (privateKey.length !== X25519_PRIVATE_KEY_LENGTH) {\n throw new RangeError(\n `x25519PublicKey: privateKey must be ${X25519_PRIVATE_KEY_LENGTH} bytes, got ${privateKey.length}`,\n );\n }\n return x25519.getPublicKey(privateKey);\n}\n\n/**\n * Computes the X25519 shared secret. Always pipe the result through HKDF before\n * using as an encryption/MAC key.\n *\n * Throws on malformed inputs. Does NOT reject all-zero output (which can occur\n * with adversarial public keys); the caller's HKDF step provides domain\n * separation that mitigates this in practice.\n */\nexport function x25519Ecdh(privateKey: Uint8Array, theirPublicKey: Uint8Array): Uint8Array {\n if (privateKey.length !== X25519_PRIVATE_KEY_LENGTH) {\n throw new RangeError(\n `x25519Ecdh: privateKey must be ${X25519_PRIVATE_KEY_LENGTH} bytes, got ${privateKey.length}`,\n );\n }\n if (theirPublicKey.length !== X25519_PUBLIC_KEY_LENGTH) {\n throw new RangeError(\n `x25519Ecdh: theirPublicKey must be ${X25519_PUBLIC_KEY_LENGTH} bytes, got ${theirPublicKey.length}`,\n );\n }\n return x25519.getSharedSecret(privateKey, theirPublicKey);\n}\n","/**\n * Unwrap the session-wrapped F2 envelope returned by `POST /fragments/2`.\n *\n * The backend wraps F2 in a per-request session layer (X25519 ECDH +\n * HKDF-SHA256 → AES-256-GCM). The SDK undoes this layer here and recovers\n * the EncryptedFragment that the SDK itself stored at createWallet time —\n * which still needs to be decrypted with the F2 derivation key the caller\n * derived from user credentials (out of scope of this helper).\n *\n * Backend reference:\n * CloudServices-accesly/lambdas/shared/src/session-keys.ts\n * info = \"accesly:getFragment2:v1\"\n * salt = empty\n * AES-256-GCM, 12-byte nonce, 16-byte tag returned separately.\n */\n\nimport { gcm } from '@noble/ciphers/aes';\n\nimport { hkdfSha256 } from './kdf.js';\nimport { x25519Ecdh } from './x25519.js';\nimport { zeroize } from './zeroize.js';\n\nconst HKDF_INFO = new TextEncoder().encode('accesly:getFragment2:v1');\nconst HKDF_SALT = new Uint8Array(0);\nconst SESSION_KEY_LENGTH = 32;\n\nexport interface SessionFragment2Response {\n /** Base64 12-byte AES-GCM nonce. */\n readonly nonce: string;\n /** Base64 AES-GCM ciphertext (does NOT include the auth tag). */\n readonly ciphertext: string;\n /** Base64 16-byte AES-GCM auth tag. */\n readonly authTag: string;\n /** Base64 32-byte server X25519 ephemeral public key. */\n readonly serverEphemeralPubkey: string;\n}\n\nexport interface UnwrappedFragment2 {\n /**\n * Raw plaintext bytes the backend wrapped — typically a UTF-8 JSON of the\n * original `EncryptedFragment` envelope (ciphertext + nonce + algo). The\n * caller parses + AES-GCM-decrypts again with its F2 key to get F2 plain.\n */\n readonly plaintext: Uint8Array;\n}\n\n/**\n * Given the backend response and the matching ephemeral X25519 private key\n * the SDK used in the request, decrypts the session layer and returns the\n * inner plaintext (the EncryptedFragment JSON serialized as bytes).\n *\n * Both the client ephemeral private key and the derived session key are\n * zero-ized at the end. The caller MUST NOT reuse `clientEphemeralPrivKey`.\n */\nexport function unwrapSessionFragment2(\n response: SessionFragment2Response,\n clientEphemeralPrivKey: Uint8Array,\n): UnwrappedFragment2 {\n const serverPub = base64ToBytes(response.serverEphemeralPubkey);\n const nonce = base64ToBytes(response.nonce);\n const ciphertext = base64ToBytes(response.ciphertext);\n const authTag = base64ToBytes(response.authTag);\n\n if (serverPub.length !== 32) {\n throw new Error(\n `unwrapSessionFragment2: serverEphemeralPubkey must be 32 bytes, got ${serverPub.length}`,\n );\n }\n if (nonce.length !== 12) {\n throw new Error(`unwrapSessionFragment2: nonce must be 12 bytes, got ${nonce.length}`);\n }\n if (authTag.length !== 16) {\n throw new Error(`unwrapSessionFragment2: authTag must be 16 bytes, got ${authTag.length}`);\n }\n\n const shared = x25519Ecdh(clientEphemeralPrivKey, serverPub);\n const sessionKey = hkdfSha256(shared, HKDF_SALT, HKDF_INFO, SESSION_KEY_LENGTH);\n\n // Noble's AES-GCM expects ciphertext with the auth tag appended.\n const ctWithTag = new Uint8Array(ciphertext.length + authTag.length);\n ctWithTag.set(ciphertext, 0);\n ctWithTag.set(authTag, ciphertext.length);\n\n let plaintext: Uint8Array;\n try {\n plaintext = gcm(sessionKey, nonce).decrypt(ctWithTag);\n } finally {\n zeroize(shared);\n zeroize(sessionKey);\n zeroize(clientEphemeralPrivKey);\n }\n\n return { plaintext };\n}\n\nfunction base64ToBytes(s: string): Uint8Array {\n if (typeof atob === 'function') {\n const bin = atob(s);\n const arr = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i += 1) arr[i] = bin.charCodeAt(i);\n return arr;\n }\n return new Uint8Array(Buffer.from(s, 'base64'));\n}\n","/**\n * Wrappers thin alrededor de SHA-256 para que el integrador no tenga que\n * inventar el suyo con `crypto.subtle.digest()` (que requiere ArrayBuffer\n * tricks por las firmas cambiantes de `lib.dom`) ni importar `@noble/hashes`\n * a mano.\n *\n * Uso:\n * import { sha256, sha256Hex } from '@accesly/core/crypto';\n * const userIdHash = sha256(new TextEncoder().encode(email));\n * const hex = sha256Hex('hello world');\n */\n\nimport { sha256 as nobleSha256 } from '@noble/hashes/sha2';\n\n/**\n * SHA-256 sobre un `Uint8Array`. Síncrono — usa `@noble/hashes` que es JS puro\n * y portable (Node, browser, workers, SSR).\n */\nexport function sha256(data: Uint8Array): Uint8Array {\n return nobleSha256(data);\n}\n\n/**\n * SHA-256 sobre una string UTF-8 (o `Uint8Array`), devuelto como hex lowercase.\n */\nexport function sha256Hex(data: string | Uint8Array): string {\n const bytes = typeof data === 'string' ? new TextEncoder().encode(data) : data;\n const digest = nobleSha256(bytes);\n let out = '';\n for (let i = 0; i < digest.length; i += 1) {\n out += (digest[i] ?? 0).toString(16).padStart(2, '0');\n }\n return out;\n}\n","/**\n * AWS Cognito User Pool authentication via `amazon-cognito-identity-js`.\n *\n * Uses the USER_SRP_AUTH flow (the default for `authenticateUser`): the user\n * password is never sent in clear over the network — SRP exchanges proofs.\n *\n * Cognito SDK API is callback-based; this wrapper exposes promise-returning\n * methods that implement the `AuthClient` interface.\n */\n\nimport {\n AuthenticationDetails,\n CognitoRefreshToken,\n CognitoUser,\n CognitoUserAttribute,\n CognitoUserPool,\n type CognitoUserSession,\n type ISignUpResult,\n} from 'amazon-cognito-identity-js';\nimport type { AuthClient, AuthTokens, SignUpResult } from './types.js';\n\nexport interface CognitoConfig {\n readonly region: string;\n readonly userPoolId: string;\n readonly userPoolClientId: string;\n}\n\nexport class CognitoAuthClient implements AuthClient {\n private readonly pool: CognitoUserPool;\n private readonly region: string;\n private readonly clientId: string;\n\n constructor(config: CognitoConfig) {\n if (!config.region) throw new TypeError('CognitoAuthClient: region is required');\n if (!config.userPoolId) throw new TypeError('CognitoAuthClient: userPoolId is required');\n if (!config.userPoolClientId)\n throw new TypeError('CognitoAuthClient: userPoolClientId is required');\n\n this.region = config.region;\n this.clientId = config.userPoolClientId;\n this.pool = new CognitoUserPool({\n UserPoolId: config.userPoolId,\n ClientId: config.userPoolClientId,\n });\n }\n\n signUp(email: string, password: string): Promise<SignUpResult> {\n return new Promise<SignUpResult>((resolve, reject) => {\n const attrs = [new CognitoUserAttribute({ Name: 'email', Value: email })];\n this.pool.signUp(email, password, attrs, [], (err, result) => {\n if (err) return reject(toError(err));\n const r = result as ISignUpResult | undefined;\n if (!r) return reject(new Error('Cognito signUp returned no result'));\n resolve({ userSub: r.userSub, userConfirmed: r.userConfirmed });\n });\n });\n }\n\n confirmSignUp(email: string, code: string): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const user = this.userFor(email);\n user.confirmRegistration(code, true, (err) => {\n if (err) return reject(toError(err));\n resolve();\n });\n });\n }\n\n resendConfirmationCode(email: string): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const user = this.userFor(email);\n user.resendConfirmationCode((err) => {\n if (err) return reject(toError(err));\n resolve();\n });\n });\n }\n\n signIn(email: string, password: string): Promise<AuthTokens> {\n return new Promise<AuthTokens>((resolve, reject) => {\n const user = this.userFor(email);\n const auth = new AuthenticationDetails({ Username: email, Password: password });\n user.authenticateUser(auth, {\n onSuccess: (session) => resolve(sessionToTokens(session, email)),\n onFailure: (err) => reject(toError(err)),\n });\n });\n }\n\n refreshSession(refreshToken: string, username: string): Promise<AuthTokens> {\n return new Promise<AuthTokens>((resolve, reject) => {\n const user = this.userFor(username);\n const token = new CognitoRefreshToken({ RefreshToken: refreshToken });\n user.refreshSession(token, (err, session) => {\n if (err) return reject(toError(err));\n if (!session) return reject(new Error('Cognito refreshSession returned no session'));\n resolve(sessionToTokens(session, username));\n });\n });\n }\n\n /**\n * Revokes the refresh token at Cognito via the\n * `AWSCognitoIdentityProviderService.RevokeToken` action. Local cache\n * clearing is the caller's responsibility (via `SessionStorage.clear`).\n *\n * `tokenToRevoke` is the refresh token, not the access token: only refresh\n * tokens can be revoked.\n */\n async signOut(tokenToRevoke: string): Promise<void> {\n const url = `https://cognito-idp.${this.region}.amazonaws.com/`;\n const body = JSON.stringify({ Token: tokenToRevoke, ClientId: this.clientId });\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-amz-json-1.1',\n 'X-Amz-Target': 'AWSCognitoIdentityProviderService.RevokeToken',\n },\n body,\n });\n if (!res.ok) {\n let detail = '';\n try {\n detail = await res.text();\n } catch {\n /* ignore */\n }\n throw new Error(`Cognito RevokeToken failed: ${res.status} ${detail}`);\n }\n }\n\n private userFor(username: string): CognitoUser {\n return new CognitoUser({ Username: username, Pool: this.pool });\n }\n}\n\nfunction sessionToTokens(session: CognitoUserSession, username: string): AuthTokens {\n const idTokenPayload = session.getIdToken();\n return {\n idToken: idTokenPayload.getJwtToken(),\n accessToken: session.getAccessToken().getJwtToken(),\n refreshToken: session.getRefreshToken().getToken(),\n expiresAt: idTokenPayload.getExpiration() * 1000,\n username,\n };\n}\n\nfunction toError(err: unknown): Error {\n if (err instanceof Error) return err;\n if (typeof err === 'object' && err !== null) {\n const e = err as { message?: unknown; name?: unknown; code?: unknown };\n const message = typeof e.message === 'string' ? e.message : 'Cognito error';\n const out = new Error(message);\n if (typeof e.name === 'string') out.name = e.name;\n if (typeof e.code === 'string') (out as Error & { code?: string }).code = e.code;\n return out;\n }\n return new Error(String(err));\n}\n","/**\n * Pluggable session storage for `AuthTokens`. The SDK ships two\n * implementations:\n *\n * - `LocalStorageSessionStorage` — persiste en `window.localStorage`.\n * Sobrevive page reloads / cierre de tab; aceptable para apps web first-\n * party que confían en su CSP / XSS posture. Es el **default** del\n * `AcceslyProvider` cuando detecta `window.localStorage` disponible.\n *\n * - `InMemorySessionStorage` — solo vive en memoria. Cualquier reload borra\n * la sesión. Útil para Node/SSR y para apps que quieren forzar re-login en\n * cada pestaña nueva. Es el fallback cuando `localStorage` no existe (SSR,\n * workers, etc.).\n *\n * Apps que quieran otro backend (httpOnly cookie + server session, IndexedDB,\n * Electron safeStorage, native iOS Keychain) implementan la interfaz a mano.\n */\n\nimport type { AuthTokens } from './types.js';\n\nexport interface SessionStorage {\n load(): AuthTokens | null | Promise<AuthTokens | null>;\n save(tokens: AuthTokens): void | Promise<void>;\n clear(): void | Promise<void>;\n}\n\nexport class InMemorySessionStorage implements SessionStorage {\n private tokens: AuthTokens | null = null;\n\n load(): AuthTokens | null {\n return this.tokens;\n }\n\n save(tokens: AuthTokens): void {\n this.tokens = tokens;\n }\n\n clear(): void {\n this.tokens = null;\n }\n}\n\n/**\n * Persiste `AuthTokens` en `window.localStorage`. Sobrevive reloads, cierre\n * de tab y restart del browser. Lectura síncrona (la I/O del storage local es\n * blocking pero rápida — sub-ms para items chicos como un token JWT).\n *\n * **Trade-off:** un XSS en la app puede leer los tokens. Para mitigar:\n * - CSP estricta (`script-src 'self'`, sin `unsafe-inline`).\n * - Marcar el token como short-lived (Cognito default = 1h) + refresh token\n * rotando.\n * - Considerar mover a httpOnly cookie + backend session si el modelo de\n * amenaza lo justifica.\n *\n * Usa el storage key `accesly:session` por default; configurable por si una\n * app sirve múltiples Accesly providers en el mismo origin (raro).\n */\nexport class LocalStorageSessionStorage implements SessionStorage {\n private readonly key: string;\n\n constructor(opts: { key?: string } = {}) {\n this.key = opts.key ?? 'accesly:session';\n }\n\n load(): AuthTokens | null {\n try {\n const raw = globalThis.localStorage?.getItem(this.key);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as Partial<AuthTokens>;\n if (\n typeof parsed.idToken !== 'string' ||\n typeof parsed.expiresAt !== 'number'\n ) {\n return null;\n }\n return parsed as AuthTokens;\n } catch {\n return null;\n }\n }\n\n save(tokens: AuthTokens): void {\n try {\n globalThis.localStorage?.setItem(this.key, JSON.stringify(tokens));\n } catch {\n // Quota exceeded, private mode, disabled — degradar a no-op silencioso.\n // La sesión seguirá funcionando in-memory durante esta tab.\n }\n }\n\n clear(): void {\n try {\n globalThis.localStorage?.removeItem(this.key);\n } catch {\n // no-op\n }\n }\n}\n\n/**\n * Devuelve la implementación de `SessionStorage` por default para el\n * environment actual: `LocalStorageSessionStorage` si `window.localStorage`\n * está disponible (browsers), si no `InMemorySessionStorage` (Node/SSR).\n *\n * Usado por `AcceslyProvider` cuando no se pasa `overrides.sessionStorage`.\n */\nexport function defaultSessionStorage(): SessionStorage {\n try {\n if (typeof globalThis.localStorage !== 'undefined') {\n // Touch-test: algunos browsers (Safari private mode antes de v15)\n // exponen `localStorage` pero lanzan en `setItem`. Si truena, fallback.\n const probeKey = '__accesly_probe__';\n globalThis.localStorage.setItem(probeKey, '1');\n globalThis.localStorage.removeItem(probeKey);\n return new LocalStorageSessionStorage();\n }\n } catch {\n // localStorage existe pero no funciona — fallback.\n }\n return new InMemorySessionStorage();\n}\n","/**\n * Token manager — combines an `AuthClient` and a `SessionStorage` to expose\n * a single `getValidIdToken()` operation that auto-refreshes when the cached\n * idToken is close to expiring.\n *\n * Concurrent calls share the in-flight refresh promise so we never make two\n * refresh round-trips for the same idToken expiry.\n */\n\nimport type { AuthClient, AuthTokens } from './types.js';\nimport type { SessionStorage } from './session.js';\n\nexport interface TokenManagerOptions {\n readonly authClient: AuthClient;\n readonly storage: SessionStorage;\n /** Time before expiry to trigger a refresh. Default: 5 minutes. */\n readonly refreshLeadTimeMs?: number;\n /** Override the wall clock. Tests only. Default: `Date.now`. */\n readonly clock?: () => number;\n}\n\n/**\n * Estado de la sesión Cognito desde la perspectiva del SDK.\n *\n * - `'bootstrapping'` — el provider arrancó pero todavía no terminó de leer\n * el `SessionStorage`. Aplica solo en el primer render (mientras corre el\n * `useEffect` que llama `refreshStatus`). Reemplaza al hack de\n * `setTimeout(200)` que el `AuthGuard` del example tenía que escribir a\n * mano para no patear al user a `/signin` durante el race del bootstrap.\n * - `'anonymous'` — no hay tokens persistidos (o el `SessionStorage` async\n * devolvió `null`). Routear a sign-in.\n * - `'authenticated'` — el `idToken` está vivo (no expirado y dentro del\n * refresh lead-time). El SDK puede llamar endpoints autenticados.\n * - `'expired'` — había tokens pero ya pasó el `expiresAt`. El próximo\n * `getValidIdToken()` intenta refresh; si falla, la sesión queda como\n * `'anonymous'`.\n */\nexport type AuthStatus = 'bootstrapping' | 'anonymous' | 'authenticated' | 'expired';\n\nexport class TokenManager {\n private readonly authClient: AuthClient;\n private readonly storage: SessionStorage;\n private readonly refreshLeadTimeMs: number;\n private readonly clock: () => number;\n private refreshInFlight: Promise<AuthTokens | null> | null = null;\n\n constructor(opts: TokenManagerOptions) {\n this.authClient = opts.authClient;\n this.storage = opts.storage;\n this.refreshLeadTimeMs = opts.refreshLeadTimeMs ?? 5 * 60 * 1000;\n this.clock = opts.clock ?? Date.now;\n }\n\n /**\n * Returns a valid idToken. If the cached token is missing, returns `null`.\n * If the token is close to expiry (or expired), tries to refresh. If the\n * refresh fails, clears the local session and returns `null`.\n */\n async getValidIdToken(): Promise<string | null> {\n const current = await Promise.resolve(this.storage.load());\n if (!current) return null;\n if (this.isExpiredOrSoon(current)) {\n const refreshed = await this.refresh();\n return refreshed?.idToken ?? null;\n }\n return current.idToken;\n }\n\n /**\n * Snapshot of the auth status without triggering a refresh. Useful for UI\n * components that need to decide what to render.\n */\n async getStatus(): Promise<AuthStatus> {\n const current = await Promise.resolve(this.storage.load());\n if (!current) return 'anonymous';\n return this.isExpiredOrSoon(current) ? 'expired' : 'authenticated';\n }\n\n /**\n * Stores the freshly-issued tokens (called by the auth namespace after a\n * successful signIn / refreshSession).\n */\n async setTokens(tokens: AuthTokens): Promise<void> {\n await Promise.resolve(this.storage.save(tokens));\n }\n\n /**\n * Clears local session AND revokes the refresh token at the IdP. If the\n * IdP revoke fails (network), local clear still happens — the user expects\n * \"log out\" to be immediate from their perspective.\n */\n async signOut(): Promise<void> {\n const current = await Promise.resolve(this.storage.load());\n await Promise.resolve(this.storage.clear());\n if (current) {\n try {\n await this.authClient.signOut(current.refreshToken);\n } catch {\n /* swallow — local sign-out succeeded, IdP revoke can be retried */\n }\n }\n }\n\n private isExpiredOrSoon(t: AuthTokens): boolean {\n return this.clock() + this.refreshLeadTimeMs >= t.expiresAt;\n }\n\n /**\n * Refreshes the session. Concurrent callers share the same in-flight\n * promise so we never make two refresh round-trips for the same expiry.\n * On failure, clears the local session.\n */\n private refresh(): Promise<AuthTokens | null> {\n if (this.refreshInFlight) return this.refreshInFlight;\n\n const promise = (async (): Promise<AuthTokens | null> => {\n const current = await Promise.resolve(this.storage.load());\n if (!current) return null;\n try {\n const fresh = await this.authClient.refreshSession(current.refreshToken, current.username);\n await Promise.resolve(this.storage.save(fresh));\n return fresh;\n } catch {\n await Promise.resolve(this.storage.clear());\n return null;\n }\n })();\n\n this.refreshInFlight = promise;\n void promise.finally(() => {\n this.refreshInFlight = null;\n });\n return promise;\n }\n}\n","/**\n * Typed error hierarchy for the Accesly API client.\n *\n * Every error thrown by the API client is a subclass of `AccesslyApiError`,\n * so consumers can do:\n * try { ... } catch (e) {\n * if (e instanceof AuthError) return relogin();\n * if (e instanceof NetworkError) return retryLater();\n * throw e;\n * }\n */\n\nexport interface AccesslyApiErrorOptions {\n readonly status: number;\n readonly code?: string | undefined;\n readonly requestId?: string | undefined;\n readonly cause?: unknown;\n}\n\nexport class AccesslyApiError extends Error {\n readonly status: number;\n readonly code: string;\n readonly requestId: string | undefined;\n override readonly cause: unknown;\n\n constructor(message: string, opts: AccesslyApiErrorOptions) {\n super(message);\n this.name = 'AccesslyApiError';\n this.status = opts.status;\n this.code = opts.code ?? `HTTP_${opts.status}`;\n this.requestId = opts.requestId;\n this.cause = opts.cause;\n }\n}\n\n/** 401 / 403 — caller should re-authenticate (or check appId/permissions). */\nexport class AuthError extends AccesslyApiError {\n constructor(message: string, opts: AccesslyApiErrorOptions) {\n super(message, opts);\n this.name = 'AuthError';\n }\n}\n\n/** 400 / 422 — request body or query was malformed. */\nexport class ValidationError extends AccesslyApiError {\n constructor(message: string, opts: AccesslyApiErrorOptions) {\n super(message, opts);\n this.name = 'ValidationError';\n }\n}\n\n/** 404 — resource does not exist. */\nexport class NotFoundError extends AccesslyApiError {\n constructor(message: string, opts: AccesslyApiErrorOptions) {\n super(message, opts);\n this.name = 'NotFoundError';\n }\n}\n\n/** 429 — caller should back off. */\nexport class RateLimitError extends AccesslyApiError {\n readonly retryAfterSeconds: number | undefined;\n\n constructor(\n message: string,\n opts: AccesslyApiErrorOptions & { retryAfterSeconds?: number | undefined },\n ) {\n super(message, opts);\n this.name = 'RateLimitError';\n this.retryAfterSeconds = opts.retryAfterSeconds;\n }\n}\n\n/** 5xx — server-side problem, the client already exhausted its retries. */\nexport class ServerError extends AccesslyApiError {\n constructor(message: string, opts: AccesslyApiErrorOptions) {\n super(message, opts);\n this.name = 'ServerError';\n }\n}\n\n/** Fetch threw (DNS fail, TLS error, abort, etc.) or response was not parseable. */\nexport class NetworkError extends AccesslyApiError {\n constructor(message: string, opts: Omit<AccesslyApiErrorOptions, 'status'>) {\n super(message, { ...opts, status: 0 });\n this.name = 'NetworkError';\n }\n}\n\n/**\n * Maps an HTTP status code + body to the right error subclass.\n */\nexport function errorForResponse(\n status: number,\n body: unknown,\n requestId: string | undefined,\n): AccesslyApiError {\n const message = extractMessage(body) ?? `HTTP ${status}`;\n const opts: AccesslyApiErrorOptions = { status, code: extractCode(body), requestId };\n if (status === 401 || status === 403) return new AuthError(message, opts);\n if (status === 404) return new NotFoundError(message, opts);\n if (status === 429) {\n return new RateLimitError(message, {\n ...opts,\n retryAfterSeconds: extractRetryAfter(body),\n });\n }\n if (status >= 400 && status < 500) return new ValidationError(message, opts);\n if (status >= 500) return new ServerError(message, opts);\n return new AccesslyApiError(message, opts);\n}\n\nfunction extractMessage(body: unknown): string | undefined {\n if (body && typeof body === 'object') {\n const b = body as { message?: unknown; error?: unknown };\n if (typeof b.message === 'string') return b.message;\n if (typeof b.error === 'string') return b.error;\n }\n return undefined;\n}\n\nfunction extractCode(body: unknown): string | undefined {\n if (body && typeof body === 'object') {\n const b = body as { code?: unknown };\n if (typeof b.code === 'string') return b.code;\n }\n return undefined;\n}\n\nfunction extractRetryAfter(body: unknown): number | undefined {\n if (body && typeof body === 'object') {\n const b = body as { retryAfter?: unknown };\n if (typeof b.retryAfter === 'number' && b.retryAfter >= 0) return b.retryAfter;\n }\n return undefined;\n}\n","/**\n * `formatError(err, opts?)` — convierte cualquier error que produzca el SDK\n * (incluido el browser, WebAuthn, fetch, Cognito) en un mensaje human-readable\n * apto para mostrar al user. Reemplaza el `describeError` que cada integrador\n * escribe a mano en su `lib/errors.ts`.\n *\n * Locale: `'es'` (default) o `'en'`. Monolingüe por ahora — i18n completo\n * (locales adicionales, ICU plural rules) llega en una siguiente release.\n *\n * No reemplaza el `error.name` / `error.message` originales — la app sigue\n * pudiendo inspeccionarlos para telemetry. Esta función produce *solo* el\n * string que vas a renderizar.\n */\n\nimport {\n AccesslyApiError,\n AuthError,\n NetworkError,\n NotFoundError,\n RateLimitError,\n ServerError,\n ValidationError,\n} from '../api/errors.js';\n\nexport type FormatErrorLocale = 'es' | 'en';\n\nexport interface FormatErrorOptions {\n /** `'es'` (default) o `'en'`. */\n readonly locale?: FormatErrorLocale;\n}\n\ninterface Message {\n readonly es: string;\n readonly en: string;\n}\n\nconst MESSAGES = {\n unknown: {\n es: 'Ocurrió un error inesperado.',\n en: 'Something went wrong.',\n },\n auth_expired: {\n es: 'Tu sesión expiró. Volvé a iniciar sesión.',\n en: 'Your session expired. Please sign in again.',\n },\n network: {\n es: 'No se pudo contactar al backend. Revisá tu conexión.',\n en: \"Couldn't reach the backend. Check your connection.\",\n },\n rate_limit: {\n es: 'Demasiadas solicitudes. Esperá unos segundos y volvé a intentar.',\n en: 'Too many requests. Wait a few seconds and try again.',\n },\n not_found: {\n es: 'El recurso solicitado no existe.',\n en: \"Couldn't find that resource.\",\n },\n server: {\n es: 'El servidor tuvo un problema. Intentá de nuevo en un momento.',\n en: 'Server hit a problem. Try again in a moment.',\n },\n webauthn_cancelled: {\n es: 'No se completó la verificación biométrica. Asegurate de tener un passkey activo (Touch ID, Face ID, Windows Hello o llave de seguridad).',\n en: 'Biometric verification was cancelled. Make sure you have an active passkey (Touch ID, Face ID, Windows Hello, or a security key).',\n },\n webauthn_unsupported: {\n es: 'Este navegador o autenticador no soporta WebAuthn PRF. Usá Chrome 116+, Edge 116+ o Safari 18+ con un passkey nativo del sistema.',\n en: 'This browser or authenticator does not support WebAuthn PRF. Use Chrome 116+, Edge 116+ or Safari 18+ with a native OS passkey.',\n },\n no_local_credential: {\n es: 'Este dispositivo no tiene la credencial de tu wallet. Usá Recuperar wallet con tu email y contraseña.',\n en: \"This device doesn't have your wallet credential. Use Recover wallet with your email and password.\",\n },\n not_implemented: {\n es: 'Esta funcionalidad aún no está implementada en el SDK.',\n en: 'This feature is not implemented in the SDK yet.',\n },\n} as const satisfies Record<string, Message>;\n\ntype MessageKey = keyof typeof MESSAGES;\n\nfunction localize(key: MessageKey, locale: FormatErrorLocale): string {\n return MESSAGES[key][locale];\n}\n\n/**\n * Convierte un error en mensaje humano. Trata de matchear el tipo y el shape\n * en este orden:\n *\n * 1. Errores tipados del SDK (`AuthError`, `NetworkError`, ...) → mensaje\n * apropiado de la matriz.\n * 2. Errores conocidos por `error.name` (`NotAllowedError` de WebAuthn,\n * `NotImplementedYetError` de los namespaces stub, etc.).\n * 3. Heurísticas sobre el `error.message` (regex de \"fetch\", \"passkey\",\n * \"credential\", \"PRF\") — fallback razonable para errores no tipados que\n * vienen de dependencias.\n * 4. `error.message` original.\n * 5. `MESSAGES.unknown` para non-Error inputs.\n *\n * @example\n * try { await wallet.bootstrap({ email, password }); }\n * catch (e) { setError(formatError(e)); }\n */\nexport function formatError(\n err: unknown,\n opts: FormatErrorOptions = {},\n): string {\n const locale = opts.locale ?? 'es';\n const t = (k: MessageKey) => localize(k, locale);\n\n // 1. Errores tipados del SDK.\n if (err instanceof RateLimitError) return t('rate_limit');\n if (err instanceof NotFoundError) return t('not_found');\n if (err instanceof AuthError) return t('auth_expired');\n if (err instanceof NetworkError) return t('network');\n if (err instanceof ServerError) return t('server');\n if (err instanceof ValidationError) {\n // Validation errors devuelven contexto útil — preservar el message.\n return err.message || t('unknown');\n }\n if (err instanceof AccesslyApiError) {\n return err.message || t('unknown');\n }\n\n // 2. Errores conocidos por nombre.\n if (err instanceof Error) {\n const name = err.name;\n const msg = err.message ?? '';\n\n if (name === 'NotImplementedYetError') return t('not_implemented');\n\n // Browser WebAuthn cancellation / user-decline.\n if (name === 'NotAllowedError') return t('webauthn_cancelled');\n if (name === 'NotSupportedError') return t('webauthn_unsupported');\n if (name === 'AbortError' && /credentials|webauthn/i.test(msg)) {\n return t('webauthn_cancelled');\n }\n\n // 3. Heurísticas sobre message.\n if (/PRF/i.test(msg) || /no soporta WebAuthn/i.test(msg)) {\n return t('webauthn_unsupported');\n }\n // CredentialRecord chequea ANTES que el cancel heurístico (que también\n // matchearía \"credential\" + \"no\").\n if (/CredentialRecord/i.test(msg)) {\n return t('no_local_credential');\n }\n if (/passkey|credential/i.test(msg) && /no|missing|cancel/i.test(msg)) {\n return t('webauthn_cancelled');\n }\n if (/failed to fetch|networkerror|network request|ENOTFOUND/i.test(msg)) {\n return t('network');\n }\n if (/unauthor/i.test(msg) || /expired/i.test(msg)) {\n return t('auth_expired');\n }\n\n // 4. Fallback al message original.\n return msg || t('unknown');\n }\n\n // 5. Non-Error throws.\n if (typeof err === 'string' && err.trim().length > 0) return err;\n return t('unknown');\n}\n","/**\n * Typed HTTP client for the Accesly backend.\n *\n * - Auto-injects `Authorization: <idToken>` (no `Bearer ` prefix — the backend\n * API Gateway REST v1 + Cognito Authorizer expects the raw JWT, see the\n * handoff doc gotcha).\n * - Retries idempotent requests on 5xx / network errors with exponential\n * backoff + jitter.\n * - Emits structured telemetry events the consumer can hook into.\n */\n\nimport { AccesslyApiError, NetworkError, errorForResponse } from './errors.js';\n\nexport type IdTokenProvider = () => string | null | Promise<string | null>;\n\nexport type TelemetryEvent =\n | { kind: 'request'; method: string; url: string; attempt: number }\n | {\n kind: 'response';\n method: string;\n url: string;\n status: number;\n durationMs: number;\n attempt: number;\n }\n | {\n kind: 'error';\n method: string;\n url: string;\n error: string;\n attempt: number;\n }\n | { kind: 'retry'; method: string; url: string; attempt: number; delayMs: number };\n\nexport type TelemetrySink = (event: TelemetryEvent) => void;\n\nexport interface AccesslyApiClientOptions {\n readonly baseUrl: string;\n /** Returns the current idToken, or null if the caller is anonymous. */\n readonly getIdToken?: IdTokenProvider;\n /** Override the global `fetch`. Tests only. */\n readonly fetchImpl?: typeof fetch;\n /** Max retries for idempotent requests on 5xx / network errors. Default 3. */\n readonly maxRetries?: number;\n /** Request timeout in ms. Default 30_000. */\n readonly timeoutMs?: number;\n /** Telemetry sink. Default no-op. */\n readonly telemetry?: TelemetrySink;\n /**\n * Override the backoff delay calculator (ms by attempt index, 1-based).\n * Tests only. Default: 500 * 2^(attempt-1) ± 20% jitter.\n */\n readonly backoffMs?: (attempt: number) => number;\n}\n\nexport type Json =\n | null\n | boolean\n | number\n | string\n | readonly Json[]\n | { readonly [k: string]: Json };\n\nexport interface RequestOptions {\n readonly headers?: Record<string, string>;\n readonly signal?: AbortSignal;\n readonly query?: Record<string, string | number | boolean | undefined>;\n /** If `false`, the request will NOT be retried. Default `true` for GET. */\n readonly retry?: boolean;\n}\n\n/** HTTP methods the client supports. */\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n\nconst IDEMPOTENT_METHODS: ReadonlySet<HttpMethod> = new Set(['GET']);\n\nexport class AccesslyApiClient {\n private readonly baseUrl: string;\n private readonly getIdToken: IdTokenProvider | undefined;\n private readonly fetchImpl: typeof fetch;\n private readonly maxRetries: number;\n private readonly timeoutMs: number;\n private readonly telemetry: TelemetrySink;\n private readonly backoffMs: (attempt: number) => number;\n\n constructor(opts: AccesslyApiClientOptions) {\n if (!opts.baseUrl) throw new TypeError('AccesslyApiClient: baseUrl is required');\n this.baseUrl = opts.baseUrl.replace(/\\/+$/, '');\n this.getIdToken = opts.getIdToken;\n // `?? fetch` keeps a reference even after globalThis.fetch is reassigned\n // in tests, so users get the fetch they had when constructing the client.\n this.fetchImpl = opts.fetchImpl ?? globalThis.fetch.bind(globalThis);\n this.maxRetries = opts.maxRetries ?? 3;\n this.timeoutMs = opts.timeoutMs ?? 30_000;\n this.telemetry = opts.telemetry ?? (() => undefined);\n this.backoffMs = opts.backoffMs ?? defaultBackoff;\n }\n\n get<T>(path: string, opts?: RequestOptions): Promise<T> {\n return this.request<T>('GET', path, undefined, opts);\n }\n\n post<T>(path: string, body?: Json, opts?: RequestOptions): Promise<T> {\n return this.request<T>('POST', path, body, opts);\n }\n\n put<T>(path: string, body?: Json, opts?: RequestOptions): Promise<T> {\n return this.request<T>('PUT', path, body, opts);\n }\n\n delete<T>(path: string, opts?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', path, undefined, opts);\n }\n\n patch<T>(path: string, body?: Json, opts?: RequestOptions): Promise<T> {\n return this.request<T>('PATCH', path, body, opts);\n }\n\n private async request<T>(\n method: HttpMethod,\n path: string,\n body: Json | undefined,\n opts: RequestOptions | undefined,\n ): Promise<T> {\n const url = this.buildUrl(path, opts?.query);\n const shouldRetry = opts?.retry ?? IDEMPOTENT_METHODS.has(method);\n const idToken = this.getIdToken ? await this.getIdToken() : null;\n\n const headers: Record<string, string> = {\n Accept: 'application/json',\n ...opts?.headers,\n };\n if (body !== undefined) headers['Content-Type'] = 'application/json';\n if (idToken) {\n // NOTE: API Gateway REST v1 + Cognito Authorizer expects the bare JWT,\n // NOT `Bearer <jwt>`. See CloudServices-accesly/docs/Handoff_Fase3.md.\n headers['Authorization'] = idToken;\n }\n\n const init: RequestInit = { method, headers };\n if (body !== undefined) init.body = JSON.stringify(body);\n\n let attempt = 0;\n let lastError: unknown;\n const maxAttempts = shouldRetry ? this.maxRetries + 1 : 1;\n\n while (attempt < maxAttempts) {\n attempt += 1;\n this.telemetry({ kind: 'request', method, url, attempt });\n const startedAt = Date.now();\n const ac = new AbortController();\n const timeoutId = setTimeout(() => ac.abort(), this.timeoutMs);\n const signal = combineSignals(opts?.signal, ac.signal);\n try {\n const res = await this.fetchImpl(url, { ...init, signal });\n const durationMs = Date.now() - startedAt;\n this.telemetry({\n kind: 'response',\n method,\n url,\n status: res.status,\n durationMs,\n attempt,\n });\n clearTimeout(timeoutId);\n\n if (res.status >= 500 && shouldRetry && attempt < maxAttempts) {\n const delay = this.backoffMs(attempt);\n this.telemetry({ kind: 'retry', method, url, attempt, delayMs: delay });\n await sleep(delay);\n continue;\n }\n\n return await this.handleResponse<T>(res);\n } catch (err) {\n clearTimeout(timeoutId);\n if (err instanceof AccesslyApiError) {\n // Already shaped — bubble up without retrying.\n throw err;\n }\n const description = describeError(err);\n this.telemetry({ kind: 'error', method, url, error: description, attempt });\n lastError = err;\n if (shouldRetry && attempt < maxAttempts) {\n const delay = this.backoffMs(attempt);\n this.telemetry({ kind: 'retry', method, url, attempt, delayMs: delay });\n await sleep(delay);\n continue;\n }\n throw new NetworkError(`fetch failed: ${description}`, { cause: err });\n }\n }\n\n // Unreachable, but TS needs an explicit throw.\n throw new NetworkError('retries exhausted', { cause: lastError });\n }\n\n private async handleResponse<T>(res: Response): Promise<T> {\n const requestId =\n res.headers.get('x-amzn-RequestId') ?? res.headers.get('x-request-id') ?? undefined;\n if (res.ok) {\n if (res.status === 204) return undefined as unknown as T;\n const text = await res.text();\n if (text.length === 0) return undefined as unknown as T;\n try {\n return JSON.parse(text) as T;\n } catch (err) {\n throw new NetworkError('response is not valid JSON', { cause: err, requestId });\n }\n }\n // Non-2xx: try to parse a JSON body for the error shape.\n let parsed: unknown;\n try {\n const text = await res.text();\n parsed = text.length > 0 ? JSON.parse(text) : undefined;\n } catch {\n parsed = undefined;\n }\n throw errorForResponse(res.status, parsed, requestId);\n }\n\n private buildUrl(path: string, query?: RequestOptions['query']): string {\n const cleanPath = path.startsWith('/') ? path : `/${path}`;\n const url = new URL(this.baseUrl + cleanPath);\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined) continue;\n url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n }\n}\n\nfunction defaultBackoff(attempt: number): number {\n const base = 500 * 2 ** (attempt - 1);\n const jitter = base * 0.2 * (Math.random() * 2 - 1); // ±20%\n return Math.max(0, Math.floor(base + jitter));\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction describeError(err: unknown): string {\n if (err instanceof Error) return `${err.name}: ${err.message}`;\n return String(err);\n}\n\nfunction combineSignals(a: AbortSignal | undefined, b: AbortSignal): AbortSignal {\n if (!a) return b;\n if (a.aborted) return a;\n if (b.aborted) return b;\n const ac = new AbortController();\n const onAbort = (): void => ac.abort();\n a.addEventListener('abort', onAbort, { once: true });\n b.addEventListener('abort', onAbort, { once: true });\n return ac.signal;\n}\n","/**\n * Typed wrappers for the Accesly backend REST endpoints. One method per\n * route in `CloudServices-accesly/docs/openapi.yaml`.\n *\n * Each wrapper is a one-liner over `AccesslyApiClient` — the value is the\n * typed signature, which makes auto-complete + refactors safe.\n */\n\nimport type {\n CreateWalletRequest,\n CreateWalletResponse,\n FinalizeRecoveryRequest,\n FinalizeRecoveryResponse,\n GetFragment2Request,\n GetFragment2Response,\n GetFragment3Response,\n GetWalletResponse,\n HealthResponse,\n KycStartResponse,\n OrderRequest,\n OrderResponse,\n RecoveryOtpRequestInput,\n RecoveryOtpRequestResponse,\n RecoveryOtpVerifyInput,\n RecoveryOtpVerifyResponse,\n SimulateRotateSignerRequest,\n SimulateRotateSignerResponse,\n ActivateAssetSimulateRequest,\n SimulateSwapRequest,\n SimulateSwapResponse,\n SimulateTxRequest,\n SimulateTxResponse,\n SubmitTxRequest,\n SubmitTxResponse,\n WalletActivityResponse,\n WalletBalanceResponse,\n WalletHistoryRequestOptions,\n WalletHistoryResponse,\n} from '../types/api.js';\nimport { NotFoundError } from './errors.js';\nimport type { AccesslyApiClient, Json } from './client.js';\n\nexport class AccesslyEndpoints {\n constructor(private readonly client: AccesslyApiClient) {}\n\n /** Public liveness check. No auth header sent. */\n health(): Promise<HealthResponse> {\n return this.client.get<HealthResponse>('/health');\n }\n\n /** Cognito-auth. Deploys the user's Smart Account on Soroban. */\n createWallet(req: CreateWalletRequest): Promise<CreateWalletResponse> {\n return this.client.post<CreateWalletResponse>('/wallets', req as unknown as Json);\n }\n\n /**\n * Cognito-auth. Returns the user's already-deployed Smart Account metadata,\n * or `null` if the user has not yet completed `POST /wallets`.\n *\n * Idempotent — safe to call at the top of every authenticated session.\n * Cheap on the backend (metadata read, no KMS decrypt).\n */\n async getWallet(): Promise<GetWalletResponse | null> {\n try {\n return await this.client.get<GetWalletResponse>('/wallets');\n } catch (err) {\n if (err instanceof NotFoundError) return null;\n throw err;\n }\n }\n\n /** Cognito-auth. Returns F2 re-encrypted with a per-request session key. */\n getFragment2(req: GetFragment2Request): Promise<GetFragment2Response> {\n return this.client.post<GetFragment2Response>('/fragments/2', req as unknown as Json);\n }\n\n /**\n * Cognito-auth. Simula `XLM_SAC.transfer(from=smartAccount, to, amount)` y\n * devuelve los datos para que el SDK firme la auth entry client-side. NO\n * mueve fondos — solo prepara el material para `submitTx`.\n */\n simulateTx(req: SimulateTxRequest): Promise<SimulateTxResponse> {\n return this.client.post<SimulateTxResponse>('/tx/simulate', req as unknown as Json);\n }\n\n /**\n * Cognito-auth. Recibe la `SorobanAuthorizationEntry` firmada por el SDK +\n * el envelope que `simulateTx` devolvió. El backend re-simula con la firma\n * real, KMS-firma el envelope con `channels-fund` (developer-pays) y envía\n * a Soroban RPC. Devuelve el `txHash` para que la UI pueda mostrar el\n * resultado / link a explorer.\n */\n submitTx(req: SubmitTxRequest): Promise<SubmitTxResponse> {\n return this.client.post<SubmitTxResponse>('/tx/submit', req as unknown as Json);\n }\n\n /**\n * Cognito-auth. Simula `smart_account.add_context_rule(...)` para activar un\n * nuevo asset (e.g. USDC) en una wallet ya deployada. Caso típico: wallets\n * pre-1.4 que vienen con rule 0 = XLM solo y necesitan agregar rule N+1\n * para USDC sin re-deployar.\n *\n * Response shape idéntico a `simulateTx` — el SDK firma el `auth_digest` con\n * el mismo passkey contra la regla admin-cfg.\n */\n activateAssetSimulate(\n req: ActivateAssetSimulateRequest,\n ): Promise<SimulateTxResponse> {\n return this.client.post<SimulateTxResponse>(\n '/tx/activate-asset/simulate',\n req as unknown as Json,\n );\n }\n\n /** Cognito-auth. Submit del add_context_rule firmado (mismo shape que submitTx). */\n activateAssetSubmit(req: SubmitTxRequest): Promise<SubmitTxResponse> {\n return this.client.post<SubmitTxResponse>(\n '/tx/activate-asset/submit',\n req as unknown as Json,\n );\n }\n\n /**\n * Cognito-auth. Cotiza un swap XLM↔USDC via Soroswap Aggregator y devuelve\n * el material para que el SDK firme la auth entry contra la regla\n * biometric-tx del asset de entrada.\n */\n swapSimulate(req: SimulateSwapRequest): Promise<SimulateSwapResponse> {\n return this.client.post<SimulateSwapResponse>(\n '/tx/swap/simulate',\n req as unknown as Json,\n );\n }\n\n /** Cognito-auth. Submit del swap firmado (mismo shape que submitTx). */\n swapSubmit(req: SubmitTxRequest): Promise<SubmitTxResponse> {\n return this.client.post<SubmitTxResponse>(\n '/tx/swap/submit',\n req as unknown as Json,\n );\n }\n\n /** Cognito-auth. Starts a KYC verification with Etherfuse. */\n kycStart(): Promise<KycStartResponse> {\n return this.client.post<KycStartResponse>('/kyc');\n }\n\n /** Cognito-auth. Reads the current user's KYC status. */\n kycStatus(): Promise<KycStartResponse> {\n return this.client.get<KycStartResponse>('/kyc');\n }\n\n /** Cognito-auth. Quote or submit an MXN→USDC onramp order. */\n onramp(req: OrderRequest): Promise<OrderResponse> {\n return this.client.post<OrderResponse>('/onramp', req as unknown as Json);\n }\n\n /** Cognito-auth. Quote or submit a USDC→MXN offramp order. */\n offramp(req: OrderRequest): Promise<OrderResponse> {\n return this.client.post<OrderResponse>('/offramp', req as unknown as Json);\n }\n\n /* ── v1.1.0: read-only wallet data ─────────────────────────────────────── */\n\n /**\n * Anónimo. Balance XLM del Smart Account (vía Soroban RPC, cached ~5s).\n * No requiere JWT — la address en sí es pública on-chain.\n */\n walletBalance(address: string): Promise<WalletBalanceResponse> {\n return this.client.get<WalletBalanceResponse>(\n `/wallets/${encodeURIComponent(address)}/balance`,\n );\n }\n\n /**\n * Anónimo. Últimos eventos on-chain del Smart Account (rotate_signer,\n * transfers, etc.). Cacheado ~15s. `limit` default 20, max 50.\n */\n walletActivity(address: string, limit?: number): Promise<WalletActivityResponse> {\n const qs = limit !== undefined ? `?limit=${encodeURIComponent(String(limit))}` : '';\n return this.client.get<WalletActivityResponse>(\n `/wallets/${encodeURIComponent(address)}/activity${qs}`,\n );\n }\n\n /**\n * Anónimo. Historial completo del wallet — pre-decodificado server-side desde\n * Stellar Expert (que en browser está bloqueado por CORS). Devuelve items\n * tipados: `wallet-created`, `signer-rotated`, `transfer-in`, `transfer-out`.\n *\n * Cursor-based: pasa `saCursor` y/o `txCursor` para paginar atrás. El primer\n * fetch (sin cursors) incluye un evento sintético `wallet-created` desde la\n * metadata del contrato.\n */\n walletHistory(\n address: string,\n opts: WalletHistoryRequestOptions = {},\n ): Promise<WalletHistoryResponse> {\n const params = new URLSearchParams();\n if (opts.smartAccountCursor) params.set('saCursor', opts.smartAccountCursor);\n if (opts.transfersCursor) params.set('txCursor', opts.transfersCursor);\n if (opts.transferScanLimit !== undefined) {\n params.set('scanLimit', String(opts.transferScanLimit));\n }\n const qs = params.toString();\n return this.client.get<WalletHistoryResponse>(\n `/wallets/${encodeURIComponent(address)}/history${qs ? '?' + qs : ''}`,\n );\n }\n\n /* ── Recovery v2 (Fase 1, 2026-06-15) ──────────────────────────────────── */\n\n /**\n * Anónimo. Pide al backend que mande un OTP de 6 dígitos al email.\n *\n * Rate-limited: el backend rechaza con 429 si pediste otro hace menos de\n * 60s o más de 3 en la última hora. Anti-enumeración: la respuesta es 200\n * OK aunque el email no exista.\n */\n requestRecoveryOtp(input: RecoveryOtpRequestInput): Promise<RecoveryOtpRequestResponse> {\n return this.client.post<RecoveryOtpRequestResponse>(\n '/recovery/otp/request',\n input as unknown as Json,\n );\n }\n\n /**\n * Anónimo. Verifica el OTP. Si OK, devuelve un `recoveryJwt` que\n * autoriza los dos endpoints siguientes (`getFragment3`,\n * `finalizeRecovery`) durante 5 min.\n */\n verifyRecoveryOtp(input: RecoveryOtpVerifyInput): Promise<RecoveryOtpVerifyResponse> {\n return this.client.post<RecoveryOtpVerifyResponse>(\n '/recovery/otp/verify',\n input as unknown as Json,\n );\n }\n\n /**\n * Anónimo + header `X-Recovery-Jwt`. Devuelve `{fragmentF3Encrypted,\n * recoverySalt}`. El SDK descifra F3 con la `recoveryKey` derivada\n * client-side (PBKDF2(password, recoverySalt, 600k)).\n */\n getFragment3(recoveryJwt: string): Promise<GetFragment3Response> {\n return this.client.get<GetFragment3Response>('/fragments/3', {\n headers: { 'X-Recovery-Jwt': recoveryJwt },\n });\n }\n\n /**\n * Anónimo + header `X-Recovery-Jwt`. El backend arma + simula la tx\n * `rotate_signer(newOwner, newSecp256r1, newEmailCommit)` contra el Smart\n * Account del usuario y devuelve el material que el SDK necesita para\n * firmar la `SorobanAuthorizationEntry` con la seed VIEJA (reconstruida\n * por Shamir(F2_recovery, F3)) contra la regla `admin-cfg`.\n */\n simulateRotateSigner(\n recoveryJwt: string,\n payload: SimulateRotateSignerRequest,\n ): Promise<SimulateRotateSignerResponse> {\n return this.client.post<SimulateRotateSignerResponse>(\n '/recovery/simulate-rotate-signer',\n payload as unknown as Json,\n {\n headers: { 'X-Recovery-Jwt': recoveryJwt },\n },\n );\n }\n\n /**\n * Anónimo + header `X-Recovery-Jwt`. Submitea la tx `rotate_signer` firmada\n * por el SDK con la seed reconstruida (F2+F3) y persiste las nuevas\n * F1'/F2'/F3' en DDB. Idempotente del lado backend.\n */\n finalizeRecovery(\n recoveryJwt: string,\n payload: FinalizeRecoveryRequest,\n ): Promise<FinalizeRecoveryResponse> {\n return this.client.post<FinalizeRecoveryResponse>(\n '/recovery/finalize',\n payload as unknown as Json,\n {\n headers: { 'X-Recovery-Jwt': recoveryJwt },\n },\n );\n }\n}\n","/**\n * Passkey registration via WebAuthn (`navigator.credentials.create`).\n *\n * Forces:\n * - `userVerification: 'required'` — biometric/PIN must be presented.\n * - `residentKey: 'required'` — credential stored on the authenticator (so\n * sign-in works across browsers / tabs without a server-side username\n * hint).\n * - Algorithm `-7` (ES256, secp256r1).\n * - PRF extension requested with a 32-byte salt. If the authenticator\n * supports PRF, we get back 32 bytes deterministically derived from the\n * passkey + salt — used to encrypt F1.\n */\n\nimport { getRandomBytes } from '../crypto/random.js';\n\n/**\n * Forces a Uint8Array into a fresh ArrayBuffer-backed copy. Works around\n * TS 5.7 strict `BufferSource` typing where `Uint8Array<ArrayBufferLike>` is\n * not assignable to `BufferSource` (`ArrayBuffer | ArrayBufferView`). The\n * runtime behaviour is identical; this is purely a types coercion.\n */\nfunction asBufferSource(bytes: Uint8Array): BufferSource {\n const ab = new ArrayBuffer(bytes.byteLength);\n new Uint8Array(ab).set(bytes);\n return new Uint8Array(ab);\n}\n\nexport interface RegisterPasskeyParams {\n /** WebAuthn relying-party ID — usually the apex domain (e.g. `accesly.xyz`). */\n readonly rpId: string;\n /** Human-readable RP name shown in the OS prompt. */\n readonly rpName: string;\n /** Unique, opaque, per-user ID. Use `SHA-256(email)` or the Cognito sub. */\n readonly userId: Uint8Array;\n /** Username shown in the OS picker (typically the email). */\n readonly userName: string;\n /** Display name shown in the OS picker. Defaults to `userName`. */\n readonly userDisplayName?: string;\n /** 32 bytes used as the PRF salt. Generated if omitted. */\n readonly prfSalt?: Uint8Array;\n /**\n * Test-only: replace `navigator.credentials.create`. Defaults to the\n * platform API.\n */\n readonly credentialsCreate?: typeof navigator.credentials.create;\n}\n\nexport interface RegisterPasskeyResult {\n readonly credentialId: Uint8Array;\n readonly secp256r1Pubkey: Uint8Array;\n readonly prfSalt: Uint8Array;\n readonly prfSupported: boolean;\n /** Non-null iff `prfSupported` is true. Treat as a high-entropy key. */\n readonly prfOutput: Uint8Array | null;\n}\n\n/** Algorithm identifier for ES256 (secp256r1 + SHA-256), per IANA COSE. */\nconst COSE_ALG_ES256 = -7;\n\n/**\n * Registers a new passkey for the user and (when the authenticator supports\n * PRF) returns the 32-byte key derived from the passkey + salt that can be\n * used to encrypt F1.\n *\n * Throws if `navigator.credentials.create` is not available, the user cancels,\n * or the authenticator rejects the request.\n */\nexport async function registerPasskey(\n params: RegisterPasskeyParams,\n): Promise<RegisterPasskeyResult> {\n const credentialsCreate = params.credentialsCreate ?? defaultCredentialsCreate();\n const prfSalt = params.prfSalt ?? getRandomBytes(32);\n if (prfSalt.length !== 32) {\n throw new RangeError(`registerPasskey: prfSalt must be 32 bytes, got ${prfSalt.length}`);\n }\n\n const challenge = getRandomBytes(32);\n\n const publicKey: PublicKeyCredentialCreationOptions = {\n rp: { id: params.rpId, name: params.rpName },\n user: {\n id: asBufferSource(params.userId),\n name: params.userName,\n displayName: params.userDisplayName ?? params.userName,\n },\n challenge: asBufferSource(challenge),\n pubKeyCredParams: [{ type: 'public-key', alg: COSE_ALG_ES256 }],\n authenticatorSelection: {\n residentKey: 'required',\n requireResidentKey: true,\n userVerification: 'required',\n },\n timeout: 60_000,\n attestation: 'none',\n extensions: {\n // Request PRF eval at create time. Some authenticators ignore it at\n // create and only honour it at get; we handle both.\n prf: { eval: { first: asBufferSource(prfSalt) } },\n },\n };\n\n const cred = (await credentialsCreate({ publicKey })) as PublicKeyCredential | null;\n if (!cred) throw new Error('registerPasskey: navigator.credentials.create returned null');\n const attestation = cred.response as AuthenticatorAttestationResponse;\n\n const credentialId = new Uint8Array(cred.rawId as unknown as ArrayBuffer);\n const secp256r1Pubkey = extractSecp256r1Pubkey(attestation);\n\n // PRF result is present iff the authenticator supports the extension AND\n // was happy to evaluate at create time.\n const extResults = (\n cred as PublicKeyCredential & {\n getClientExtensionResults?: () => { prf?: { results?: { first?: ArrayBuffer } } };\n }\n ).getClientExtensionResults?.();\n const prfBuffer = extResults?.prf?.results?.first;\n const prfOutput = prfBuffer ? new Uint8Array(prfBuffer as unknown as ArrayBuffer) : null;\n\n return {\n credentialId,\n secp256r1Pubkey,\n prfSalt,\n prfSupported: prfOutput !== null,\n prfOutput,\n };\n}\n\nfunction defaultCredentialsCreate(): typeof navigator.credentials.create {\n if (typeof navigator === 'undefined' || !navigator.credentials?.create) {\n throw new Error(\n 'WebAuthn is not available in this environment. ' +\n 'Accesly requires a browser that supports navigator.credentials.create.',\n );\n }\n return navigator.credentials.create.bind(navigator.credentials);\n}\n\n/**\n * Extracts the raw 65-byte uncompressed secp256r1 public key from the\n * authenticator's attestation object.\n *\n * Spec: the credential public key is encoded in CBOR/COSE inside\n * attestationObject.authData starting at offset 37 + 16 (rpIdHash + flags +\n * counter + AAGUID) + 2 (credIdLength) + credIdLength.\n *\n * To avoid pulling a CBOR decoder, we use the `getPublicKey()` convenience\n * method exposed by Level-2 WebAuthn (Chrome 85+, Safari 14+), which returns\n * an SPKI DER blob whose last 65 bytes are the uncompressed point.\n */\nfunction extractSecp256r1Pubkey(attestation: AuthenticatorAttestationResponse): Uint8Array {\n const withHelpers = attestation as AuthenticatorAttestationResponse & {\n getPublicKey?: () => ArrayBuffer | null;\n };\n const spki = withHelpers.getPublicKey?.();\n if (!spki) {\n throw new Error(\n 'registerPasskey: authenticator did not expose getPublicKey(); ' +\n 'older browsers without WebAuthn Level-2 are not supported',\n );\n }\n const der = new Uint8Array(spki);\n // Delegate to the normalizer — handles standard 91-byte ES256 SPKI plus\n // a few alternative shapes some authenticators have been observed to\n // return (raw uncompressed point, raw X||Y without prefix, etc).\n try {\n return normalizeSecp256r1Pubkey(der);\n } catch (err) {\n const hexPreview = Array.from(der.slice(0, Math.min(8, der.length)))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n throw new Error(\n `registerPasskey: could not extract secp256r1 pubkey from SPKI ` +\n `(length=${der.length}, first8=0x${hexPreview}). ` +\n `Underlying: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\n/**\n * Coerces any reasonable secp256r1 public-key representation into the\n * canonical 65-byte uncompressed form (`0x04 || X(32) || Y(32)`) that the\n * Accesly backend expects on `POST /wallets`.\n *\n * Accepted inputs:\n * - 65 bytes starting with `0x04` → returned as-is (copied).\n * - 64 bytes (raw `X || Y` without the SEC1 uncompressed prefix) → prepends\n * `0x04`. Some libraries strip the prefix when serialising EC points.\n * - 91 bytes (standard P-256 SPKI from WebAuthn `getPublicKey()`) → extracts\n * the trailing 65-byte uncompressed point.\n *\n * Rejected inputs:\n * - 33 bytes (compressed `0x02|0x03 || X`) → throws; caller must decompress\n * first (we don't pull a curve impl just for this).\n * - Anything else → throws with the observed length.\n *\n * This helper exists to be defensive at the React-hook wire-serialisation\n * step so that wallets don't fail to create due to a small format mismatch\n * between the SDK's `registerPasskey` output and the backend validator.\n */\nexport function normalizeSecp256r1Pubkey(input: Uint8Array): Uint8Array {\n if (input.length === 65 && input[0] === 0x04) {\n return new Uint8Array(input);\n }\n if (input.length === 64) {\n const out = new Uint8Array(65);\n out[0] = 0x04;\n out.set(input, 1);\n return out;\n }\n if (input.length === 91 && input[26] === 0x04) {\n // P-256 SubjectPublicKeyInfo — the uncompressed point sits at offset 26.\n return new Uint8Array(input.subarray(26));\n }\n if (input.length === 33 && (input[0] === 0x02 || input[0] === 0x03)) {\n throw new Error(\n 'normalizeSecp256r1Pubkey: compressed EC point received (prefix ' +\n `0x${input[0].toString(16)}). Decompress to uncompressed form before passing in.`,\n );\n }\n throw new RangeError(\n `normalizeSecp256r1Pubkey: unrecognised format ` +\n `(length=${input.length}, prefix=0x${(input[0] ?? 0).toString(16)}). ` +\n `Expected 65 bytes with 0x04 prefix, 64 bytes raw X||Y, or 91-byte P-256 SPKI.`,\n );\n}\n","/**\n * Passkey verification via WebAuthn (`navigator.credentials.get`).\n *\n * Two use cases:\n * 1. Unlock F1 — re-evaluate the PRF extension with the same salt that was\n * used at registration. Returns the 32-byte PRF output that decrypts the\n * stored F1 envelope.\n * 2. Sign a challenge for SEP-10 — return the raw assertion signature so the\n * caller can submit it to the Stellar anchor.\n */\n\nexport interface UnlockPasskeyParams {\n readonly rpId: string;\n /** Specific credential to use; omit to let the browser pick one. */\n readonly credentialId?: Uint8Array;\n /** 32-byte challenge. Generated if omitted. */\n readonly challenge: Uint8Array;\n /**\n * 32-byte PRF salt — must match what was used at registration to recover\n * the same PRF output.\n */\n readonly prfSalt?: Uint8Array;\n readonly credentialsGet?: typeof navigator.credentials.get;\n}\n\nexport interface UnlockPasskeyResult {\n readonly credentialId: Uint8Array;\n readonly authenticatorData: Uint8Array;\n readonly clientDataJSON: Uint8Array;\n readonly signature: Uint8Array;\n /** Non-null iff PRF was requested AND the authenticator supports it. */\n readonly prfOutput: Uint8Array | null;\n}\n\nfunction asBufferSource(bytes: Uint8Array): BufferSource {\n const ab = new ArrayBuffer(bytes.byteLength);\n new Uint8Array(ab).set(bytes);\n return new Uint8Array(ab);\n}\n\nexport async function unlockPasskey(params: UnlockPasskeyParams): Promise<UnlockPasskeyResult> {\n const credentialsGet = params.credentialsGet ?? defaultCredentialsGet();\n if (params.challenge.length !== 32) {\n throw new RangeError(\n `unlockPasskey: challenge must be 32 bytes, got ${params.challenge.length}`,\n );\n }\n if (params.prfSalt !== undefined && params.prfSalt.length !== 32) {\n throw new RangeError(\n `unlockPasskey: prfSalt must be 32 bytes when provided, got ${params.prfSalt.length}`,\n );\n }\n\n const publicKey: PublicKeyCredentialRequestOptions = {\n rpId: params.rpId,\n challenge: asBufferSource(params.challenge),\n userVerification: 'required',\n timeout: 60_000,\n ...(params.credentialId\n ? {\n allowCredentials: [\n {\n type: 'public-key',\n id: asBufferSource(params.credentialId),\n transports: ['internal', 'hybrid'],\n },\n ],\n }\n : {}),\n ...(params.prfSalt\n ? {\n extensions: {\n prf: { eval: { first: asBufferSource(params.prfSalt) } },\n },\n }\n : {}),\n };\n\n const cred = (await credentialsGet({ publicKey })) as PublicKeyCredential | null;\n if (!cred) throw new Error('unlockPasskey: navigator.credentials.get returned null');\n\n const assertion = cred.response as AuthenticatorAssertionResponse;\n const credentialId = new Uint8Array(cred.rawId as unknown as ArrayBuffer);\n\n const extResults = (\n cred as PublicKeyCredential & {\n getClientExtensionResults?: () => { prf?: { results?: { first?: ArrayBuffer } } };\n }\n ).getClientExtensionResults?.();\n const prfBuffer = extResults?.prf?.results?.first;\n const prfOutput = prfBuffer ? new Uint8Array(prfBuffer as unknown as ArrayBuffer) : null;\n\n return {\n credentialId,\n authenticatorData: new Uint8Array(assertion.authenticatorData as unknown as ArrayBuffer),\n clientDataJSON: new Uint8Array(assertion.clientDataJSON as unknown as ArrayBuffer),\n signature: new Uint8Array(assertion.signature as unknown as ArrayBuffer),\n prfOutput,\n };\n}\n\nfunction defaultCredentialsGet(): typeof navigator.credentials.get {\n if (typeof navigator === 'undefined' || !navigator.credentials?.get) {\n throw new Error(\n 'WebAuthn is not available in this environment. ' +\n 'Accesly requires a browser that supports navigator.credentials.get.',\n );\n }\n return navigator.credentials.get.bind(navigator.credentials);\n}\n","/**\n * Persistent device storage for `CredentialRecord` entries.\n *\n * Default implementation: IndexedDB under DB `accesly` / store `credentials`.\n * Consumers (SSR, React Native, Electron) can pass their own `DeviceStore`\n * implementation to `AcceslyProvider` if they need a different backend.\n */\n\nimport type { CredentialRecord } from './types.js';\n\nexport interface DeviceStore {\n saveCredential(record: CredentialRecord): Promise<void>;\n loadCredential(username: string): Promise<CredentialRecord | null>;\n deleteCredential(username: string): Promise<void>;\n listCredentials(): Promise<readonly CredentialRecord[]>;\n}\n\nconst DB_NAME = 'accesly';\nconst DB_VERSION = 1;\nconst STORE_NAME = 'credentials';\n\n/**\n * In-memory device store. Use for tests, SSR, or apps that intentionally\n * forget credentials between sessions (re-register every time).\n */\nexport class InMemoryDeviceStore implements DeviceStore {\n private readonly entries = new Map<string, CredentialRecord>();\n\n saveCredential(record: CredentialRecord): Promise<void> {\n this.entries.set(record.username, record);\n return Promise.resolve();\n }\n\n loadCredential(username: string): Promise<CredentialRecord | null> {\n return Promise.resolve(this.entries.get(username) ?? null);\n }\n\n deleteCredential(username: string): Promise<void> {\n this.entries.delete(username);\n return Promise.resolve();\n }\n\n listCredentials(): Promise<readonly CredentialRecord[]> {\n return Promise.resolve([...this.entries.values()]);\n }\n}\n\n/**\n * IndexedDB-backed device store. Stable across browser sessions and\n * isolated per origin.\n */\nexport class IndexedDbDeviceStore implements DeviceStore {\n private readonly idbFactory: IDBFactory;\n\n constructor(idbFactory?: IDBFactory) {\n if (idbFactory) {\n this.idbFactory = idbFactory;\n } else if (typeof indexedDB !== 'undefined') {\n this.idbFactory = indexedDB;\n } else {\n throw new Error(\n 'IndexedDbDeviceStore: indexedDB is not available. ' +\n 'Pass a custom IDBFactory or use InMemoryDeviceStore.',\n );\n }\n }\n\n async saveCredential(record: CredentialRecord): Promise<void> {\n const db = await this.openDb();\n try {\n await runTx(db, 'readwrite', (store) => store.put(record));\n } finally {\n db.close();\n }\n }\n\n async loadCredential(username: string): Promise<CredentialRecord | null> {\n const db = await this.openDb();\n try {\n const value = await runTx<CredentialRecord | undefined>(db, 'readonly', (store) =>\n store.get(username),\n );\n return value ?? null;\n } finally {\n db.close();\n }\n }\n\n async deleteCredential(username: string): Promise<void> {\n const db = await this.openDb();\n try {\n await runTx(db, 'readwrite', (store) => store.delete(username));\n } finally {\n db.close();\n }\n }\n\n async listCredentials(): Promise<readonly CredentialRecord[]> {\n const db = await this.openDb();\n try {\n const value = await runTx<CredentialRecord[]>(db, 'readonly', (store) => store.getAll());\n return value;\n } finally {\n db.close();\n }\n }\n\n private openDb(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = this.idbFactory.open(DB_NAME, DB_VERSION);\n req.onupgradeneeded = () => {\n const db = req.result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n db.createObjectStore(STORE_NAME, { keyPath: 'username' });\n }\n };\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error ?? new Error('IndexedDB open failed'));\n });\n }\n}\n\nfunction runTx<T>(\n db: IDBDatabase,\n mode: IDBTransactionMode,\n op: (store: IDBObjectStore) => IDBRequest<T>,\n): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, mode);\n const store = tx.objectStore(STORE_NAME);\n const request = op(store);\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error('IndexedDB request failed'));\n tx.onerror = () => reject(tx.error ?? new Error('IndexedDB transaction failed'));\n });\n}\n","/**\n * Helper that wraps `await import('@stellar/stellar-sdk')` to handle the\n * ESM/CJS interop quirk: some bundlers (Vite, esbuild bundling a UMD entry,\n * Webpack with `esModuleInterop: false`, etc.) end up wrapping the actual\n * module exports inside a `.default` property. Native Node 22 ESM does not,\n * which is why a working unit-test setup can ship a build that breaks in\n * the browser.\n *\n * This helper picks the \"real\" namespace whether it's at the top level\n * (`m.xdr`) or one level down (`m.default.xdr`). Type-erased on purpose —\n * we trust the caller to destructure correctly.\n */\n\n// eslint-disable-next-line @typescript-eslint/consistent-type-imports\ntype StellarSdkModule = typeof import('@stellar/stellar-sdk');\n\nexport async function loadStellarSdk(): Promise<StellarSdkModule> {\n const mod = (await import('@stellar/stellar-sdk')) as unknown as\n | StellarSdkModule\n | { default: StellarSdkModule };\n // Heuristic: if the top-level namespace lacks `xdr` (a known stable export)\n // but `.default` has it, the bundler wrapped the CJS exports.\n if (\n !('xdr' in mod) &&\n (mod as { default?: StellarSdkModule }).default !== undefined &&\n 'xdr' in ((mod as { default: StellarSdkModule }).default as object)\n ) {\n return (mod as { default: StellarSdkModule }).default;\n }\n return mod as StellarSdkModule;\n}\n","/**\n * Stellar transaction builders.\n *\n * `@stellar/stellar-sdk` is lazy-imported so apps that only authenticate\n * (without sending tx) don't pay the ~200 KB bundle cost.\n */\n\nimport { loadStellarSdk } from './loadSdk.js';\n\nexport interface StellarNetworkParams {\n /** Network passphrase. Use `'Test SDF Network ; September 2015'` for testnet. */\n readonly networkPassphrase: string;\n /** Horizon URL — used to fetch the source account's current sequence number. */\n readonly horizonUrl: string;\n /** Base fee in stroops. Defaults to 100 (`BASE_FEE` constant). */\n readonly baseFee?: string;\n}\n\nexport interface BuildPaymentParams {\n readonly network: StellarNetworkParams;\n readonly sourceAddress: string;\n readonly destinationAddress: string;\n /** `'XLM'` for native, otherwise `{ code, issuer }`. */\n readonly asset: 'XLM' | { readonly code: string; readonly issuer: string };\n readonly amount: string;\n readonly memo?: string;\n /** Optional preconditions — e.g. minTime / maxTime for time-bound tx. */\n readonly timeoutSeconds?: number;\n}\n\n/**\n * Builds an unsigned Stellar payment transaction and returns its XDR. The\n * source account's sequence number is fetched fresh from Horizon.\n */\nexport async function buildPaymentTransaction(params: BuildPaymentParams): Promise<string> {\n const sdk = await loadStellarSdk();\n const { Asset, BASE_FEE, Horizon, Memo, Operation, TransactionBuilder } = sdk;\n\n const server = new Horizon.Server(params.network.horizonUrl);\n const sourceAccount = await server.loadAccount(params.sourceAddress);\n\n const asset =\n params.asset === 'XLM' ? Asset.native() : new Asset(params.asset.code, params.asset.issuer);\n\n const builder = new TransactionBuilder(sourceAccount, {\n fee: params.network.baseFee ?? BASE_FEE,\n networkPassphrase: params.network.networkPassphrase,\n })\n .addOperation(\n Operation.payment({\n destination: params.destinationAddress,\n asset,\n amount: params.amount,\n }),\n )\n .setTimeout(params.timeoutSeconds ?? 180);\n\n if (params.memo) builder.addMemo(Memo.text(params.memo));\n\n return builder.build().toXDR();\n}\n\nexport interface BuildContractInvokeParams {\n readonly network: StellarNetworkParams;\n readonly sourceAddress: string;\n readonly contractId: string;\n readonly method: string;\n /**\n * Pre-encoded ScVal arguments. Callers typically use\n * `sdk.nativeToScVal(value, opts)` to build these.\n */\n readonly args: readonly unknown[];\n readonly timeoutSeconds?: number;\n}\n\n/**\n * Builds an unsigned Soroban contract invocation transaction and returns its\n * XDR. Useful for Smart Account custom operations (`upgrade`, `add_signer`,\n * etc.) and for invoking apps the user is integrating with.\n */\nexport async function buildContractInvokeTransaction(\n params: BuildContractInvokeParams,\n): Promise<string> {\n const sdk = await loadStellarSdk();\n const { BASE_FEE, Contract, Horizon, TransactionBuilder } = sdk;\n\n const server = new Horizon.Server(params.network.horizonUrl);\n const sourceAccount = await server.loadAccount(params.sourceAddress);\n\n const contract = new Contract(params.contractId);\n // Cast through `unknown` because the SDK's xdr.ScVal union is wide and\n // we accept whatever the caller pre-built.\n const callArgs = params.args as readonly never[];\n const builder = new TransactionBuilder(sourceAccount, {\n fee: params.network.baseFee ?? BASE_FEE,\n networkPassphrase: params.network.networkPassphrase,\n })\n .addOperation(contract.call(params.method, ...callArgs))\n .setTimeout(params.timeoutSeconds ?? 180);\n\n return builder.build().toXDR();\n}\n","/**\n * Stellar transaction signing.\n *\n * ALLOW-LISTED in `audit-no-custody.mjs` to call `Keypair.fromRawEd25519Seed`.\n *\n * The signer takes a fully-reconstructed ed25519 seed as input and:\n * 1. Wraps the operation in `withZeroizeAsync` so the seed buffer is\n * cleared even on throw.\n * 2. Defensively asserts the seed length is 32 bytes.\n * 3. Optionally verifies the derived public key matches an expected one\n * (anti-foot-gun against the caller passing the wrong seed).\n * 4. Parses the XDR, signs, returns the signed XDR.\n *\n * `@stellar/stellar-sdk` is lazy-imported to keep it out of bundles that\n * never sign.\n */\n\nimport { publicKeyFromSeed, ED25519_SEED_LENGTH } from '../crypto/keypair.js';\nimport { withZeroizeAsync } from '../crypto/zeroize.js';\nimport { loadStellarSdk } from './loadSdk.js';\n\nexport interface SignTransactionParams {\n /** Base64-encoded transaction envelope XDR returned by the builder. */\n readonly transactionXdr: string;\n /**\n * Raw 32-byte ed25519 seed reconstructed via Shamir. WILL BE ZEROED by\n * this function, even on throw. The caller MUST NOT reuse the buffer.\n */\n readonly ed25519Seed: Uint8Array;\n readonly networkPassphrase: string;\n /**\n * Optional sanity check: assert that the public key derived from the seed\n * equals this expected value. Catches \"wrong seed reconstruction\" bugs\n * (e.g. mixed-up fragments) before submitting a tx that would be rejected\n * on-chain anyway.\n */\n readonly expectedPublicKey?: Uint8Array;\n}\n\nexport interface SignTransactionResult {\n /** Base64-encoded signed envelope XDR ready to submit. */\n readonly signedXdr: string;\n /** Public key that produced the signature, for caller verification. */\n readonly publicKey: Uint8Array;\n}\n\n/**\n * Signs `transactionXdr` with `ed25519Seed`. The seed is zeroed on return.\n */\nexport async function signTransaction(\n params: SignTransactionParams,\n): Promise<SignTransactionResult> {\n if (params.ed25519Seed.length !== ED25519_SEED_LENGTH) {\n throw new RangeError(\n `signTransaction: ed25519Seed must be ${ED25519_SEED_LENGTH} bytes, got ${params.ed25519Seed.length}`,\n );\n }\n\n const publicKey = publicKeyFromSeed(params.ed25519Seed);\n if (params.expectedPublicKey) {\n if (params.expectedPublicKey.length !== publicKey.length) {\n throw new RangeError(\n `signTransaction: expectedPublicKey must be ${publicKey.length} bytes, got ${params.expectedPublicKey.length}`,\n );\n }\n if (!bytesEqual(publicKey, params.expectedPublicKey)) {\n throw new Error('signTransaction: derived public key does not match expectedPublicKey');\n }\n }\n\n return withZeroizeAsync([params.ed25519Seed], async () => {\n const sdk = await loadStellarSdk();\n const { Keypair, TransactionBuilder } = sdk;\n\n // `Buffer.from(uint8array)` shares the underlying ArrayBuffer in Node and\n // copies in browser. We pass through a fresh copy so the sdk-internal\n // retention doesn't pin our seed past the zeroize point.\n const seedCopy = new Uint8Array(params.ed25519Seed);\n try {\n // ALLOW-LISTED: Keypair.fromRawEd25519Seed is the only path that takes\n // a raw seed without an intermediate base32 encoding (which would land\n // the secret in a heap string).\n const keypair = Keypair.fromRawEd25519Seed(Buffer.from(seedCopy));\n\n const tx = TransactionBuilder.fromXDR(params.transactionXdr, params.networkPassphrase);\n tx.sign(keypair);\n\n return {\n signedXdr: tx.toEnvelope().toXDR('base64'),\n publicKey,\n } satisfies SignTransactionResult;\n } finally {\n seedCopy.fill(0);\n }\n });\n}\n\nfunction bytesEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i += 1) diff |= (a[i] ?? 0) ^ (b[i] ?? 0);\n return diff === 0;\n}\n","/**\n * Client-side derivation of a Soroban contract address before deployment.\n *\n * Mirrors the algorithm used by Stellar Core (and by the Accesly backend\n * Lambda when invoking `CreateContract`):\n *\n * contractId = sha256(\n * networkId ||\n * ENVELOPE_TYPE_CONTRACT_ID ||\n * HashIdPreimageContractId {\n * networkId,\n * contractIdPreimage: ContractIdPreimageFromAddress { address, salt }\n * }\n * )\n * walletAddress = StrKey.encodeContract(contractId)\n *\n * For Accesly's Smart Account convention:\n * - `address` is the OZ Relayer's `channels-fund` Stellar account\n * - `salt` is `sha256(ownerPubkey)`\n *\n * Determinism: the address is fixed once `(deployerAddress, ownerPubkey)` is\n * fixed, regardless of when the deploy actually settles. Lets the SDK show\n * the address to the user instantly and detect \"ghost wallets\" (record OK\n * locally / on backend but deploy never landed on chain).\n *\n * `@stellar/stellar-sdk` is lazy-imported so apps that never call this\n * helper don't pay the bundle cost. SHA-256 comes from `@noble/hashes`\n * (already a dep) instead of `stellar-sdk.hash` — the latter was renamed\n * away from the top-level namespace in stellar-sdk v15+.\n */\n\nimport { sha256 } from '@noble/hashes/sha2';\nimport { loadStellarSdk } from './loadSdk.js';\n\nexport interface ComputeSmartAccountAddressParams {\n /** 32-byte ed25519 public key of the wallet owner (used as the salt seed). */\n readonly ownerPubkey: Uint8Array;\n /**\n * Stellar G-address of the deployer (the OZ Relayer `channels-fund`\n * account for the target environment). The backend's Lambda uses this\n * exact account when invoking `CreateContract`.\n */\n readonly deployerAddress: string;\n /** e.g. `'Test SDF Network ; September 2015'` for testnet. */\n readonly networkPassphrase: string;\n}\n\n/**\n * Computes the deterministic Soroban contract address that the backend will\n * (or did) deploy the Smart Account at. Same algorithm Stellar Core uses; the\n * returned string is a 56-char `C…` address ready for `Horizon` /\n * `stellar.expert` URLs.\n */\nexport async function computeSmartAccountAddress(\n params: ComputeSmartAccountAddressParams,\n): Promise<string> {\n if (params.ownerPubkey.length !== 32) {\n throw new RangeError(\n `computeSmartAccountAddress: ownerPubkey must be 32 bytes, got ${params.ownerPubkey.length}`,\n );\n }\n if (!params.deployerAddress.startsWith('G') || params.deployerAddress.length !== 56) {\n throw new RangeError(\n `computeSmartAccountAddress: deployerAddress must be a 56-char G-address, got ${params.deployerAddress.length}-char \"${params.deployerAddress.slice(0, 6)}…\"`,\n );\n }\n if (!params.networkPassphrase) {\n throw new RangeError('computeSmartAccountAddress: networkPassphrase is required');\n }\n\n const sdk = await loadStellarSdk();\n const { StrKey, xdr, Address } = sdk;\n\n // SHA-256 from @noble/hashes — stable across browsers and runtimes, and\n // avoids stellar-sdk's `hash()` which was removed from the top-level\n // namespace in v15+.\n const salt = sha256(params.ownerPubkey);\n const networkId = sha256(new TextEncoder().encode(params.networkPassphrase));\n\n // The xdr constructors are TypeScript-typed as `Buffer` but accept any\n // Uint8Array at runtime (the XDR encoder just iterates bytes). The casts\n // here are types-only.\n const preimage = xdr.HashIdPreimage.envelopeTypeContractId(\n new xdr.HashIdPreimageContractId({\n networkId: networkId as unknown as Buffer,\n contractIdPreimage: xdr.ContractIdPreimage.contractIdPreimageFromAddress(\n new xdr.ContractIdPreimageFromAddress({\n address: Address.fromString(params.deployerAddress).toScAddress(),\n salt: salt as unknown as Buffer,\n }),\n ),\n }),\n );\n\n const contractIdHash = sha256(preimage.toXDR());\n return StrKey.encodeContract(contractIdHash as unknown as Buffer);\n}\n","/**\n * Read-only Horizon helpers — fetch balances, recent operations.\n *\n * `@stellar/stellar-sdk` is lazy-imported. These functions don't touch any\n * key material; they're listed under `stellar/` for ergonomic grouping only.\n */\n\nimport { loadStellarSdk } from './loadSdk.js';\n\nexport interface BalanceEntry {\n /** `XLM` for native, otherwise `{code, issuer}` for issued assets. */\n readonly asset: 'XLM' | { readonly code: string; readonly issuer: string };\n /** Human-readable amount (e.g. `'1234.5678901'`). */\n readonly amount: string;\n /** Required reserve for this trustline, in stroops. */\n readonly buyingLiabilities?: string;\n readonly sellingLiabilities?: string;\n}\n\nexport interface OperationEntry {\n readonly id: string;\n readonly type: string;\n readonly createdAt: string;\n readonly hash: string;\n readonly raw: unknown;\n}\n\n/**\n * Fetches the current balances for `accountAddress`. Returns an empty array\n * if the account has not been funded yet (Horizon 404).\n */\nexport async function getBalances(\n horizonUrl: string,\n accountAddress: string,\n): Promise<readonly BalanceEntry[]> {\n const sdk = await loadStellarSdk();\n const server = new sdk.Horizon.Server(horizonUrl);\n try {\n const account = await server.loadAccount(accountAddress);\n return account.balances.map(\n (b: {\n asset_type: string;\n balance: string;\n asset_code?: string;\n asset_issuer?: string;\n buying_liabilities?: string;\n selling_liabilities?: string;\n }) => {\n const asset =\n b.asset_type === 'native'\n ? ('XLM' as const)\n : { code: b.asset_code ?? '', issuer: b.asset_issuer ?? '' };\n return {\n asset,\n amount: b.balance,\n ...(b.buying_liabilities !== undefined\n ? { buyingLiabilities: b.buying_liabilities }\n : {}),\n ...(b.selling_liabilities !== undefined\n ? { sellingLiabilities: b.selling_liabilities }\n : {}),\n } satisfies BalanceEntry;\n },\n );\n } catch (err) {\n if (isNotFound(err)) return [];\n throw err;\n }\n}\n\n/**\n * Fetches the most recent operations for `accountAddress`. `limit` defaults\n * to 10, max 200 (Horizon's hard cap).\n */\nexport async function getRecentOperations(\n horizonUrl: string,\n accountAddress: string,\n limit = 10,\n): Promise<readonly OperationEntry[]> {\n if (limit < 1 || limit > 200) {\n throw new RangeError(`getRecentOperations: limit must be 1..200, got ${limit}`);\n }\n const sdk = await loadStellarSdk();\n const server = new sdk.Horizon.Server(horizonUrl);\n try {\n const page = await server\n .operations()\n .forAccount(accountAddress)\n .order('desc')\n .limit(limit)\n .call();\n return page.records.map(\n (rec: { id: string; type: string; created_at: string; transaction_hash: string }) => ({\n id: rec.id,\n type: rec.type,\n createdAt: rec.created_at,\n hash: rec.transaction_hash,\n raw: rec,\n }),\n );\n } catch (err) {\n if (isNotFound(err)) return [];\n throw err;\n }\n}\n\nfunction isNotFound(err: unknown): boolean {\n if (err && typeof err === 'object') {\n const e = err as { response?: { status?: number } };\n if (e.response?.status === 404) return true;\n }\n return false;\n}\n","/**\n * Soroban CustomAccountInterface auth-entry signer.\n *\n * Esta es la pieza que hace posible mandar XLM (o cualquier SAC asset) desde\n * un Smart Account de Accesly. El Smart Account es un contrato Soroban; sus\n * transfers se autorizan vía `__check_auth(signature_payload, AuthPayload,\n * auth_contexts)`.\n *\n * El SDK hace, en orden:\n * 1. Decodifica `signature_payload` (32 bytes — viene del backend simulate).\n * 2. XDR-codifica `context_rule_ids: Vec<u32>` como ScVal::Vec([U32]).\n * 3. Calcula `auth_digest = sha256(signature_payload || rule_ids_xdr)`.\n * 4. Firma `auth_digest` con la ed25519 seed reconstruida (F1+F2+F3) —\n * ALLOW-LISTED en `audit-no-custody`.\n * 5. Construye el `AuthPayload` ScVal:\n * AuthPayload {\n * signers: { Signer::External(ed25519_verifier, pubkey): sig_bytes },\n * context_rule_ids: [0, ...],\n * }\n * 6. Reemplaza `credentials.address.signature` en la placeholder entry y\n * devuelve el XDR base64 listo para mandar a `/tx/submit`.\n *\n * Referencia Rust:\n * stellar_accounts::smart_account::storage::do_check_auth (OZ v0.7.1)\n * auth_digest = sha256(signature_payload || context_rule_ids.to_xdr())\n *\n * Toda la criptografía respeta la non-custodial guarantee: la seed se\n * zero-iza en cuanto sale del scope, y nadie fuera del device la ve.\n */\n\nimport { sha256 } from '@noble/hashes/sha2';\nimport { signEd25519 } from '../crypto/keypair.js';\nimport { withZeroize } from '../crypto/zeroize.js';\nimport { loadStellarSdk } from './loadSdk.js';\n\nexport interface SignSorobanAuthEntryParams {\n /**\n * Hash de 32 bytes (base64) que el backend devuelve en\n * `simulateTx().signaturePayloadHashBase64`. Es el digest base de Soroban,\n * NO el final que firma el seed (ese se computa aquí).\n */\n readonly signaturePayloadHashBase64: string;\n /**\n * IDs de context rule del Smart Account, alineados por índice con los\n * `auth_contexts` que Soroban host valida. Para un `transfer` desde un\n * Smart Account de Accesly normalmente es `[0]` (regla `biometric-tx`).\n */\n readonly contextRuleIds: readonly number[];\n /**\n * XDR base64 de la `SorobanAuthorizationEntry` placeholder que devuelve\n * el backend. El SDK la usa como template — copia `rootInvocation`,\n * `credentials.address.nonce`, `signatureExpirationLedger`, y solo\n * reemplaza `credentials.address.signature` con el AuthPayload firmado.\n */\n readonly placeholderAuthEntryXdr: string;\n /**\n * Raw 32-byte ed25519 seed reconstruida via Shamir. Se zero-iza\n * automáticamente al salir de esta función — el caller NO debe reusarla.\n */\n readonly ed25519Seed: Uint8Array;\n /**\n * Address del contrato `ed25519-verifier` desplegado en la misma red. Va\n * dentro de `Signer::External(verifier, pubkey)` — el Smart Account\n * compara con la verifier address que tiene en su context rule.\n */\n readonly ed25519VerifierAddress: string;\n /**\n * Pubkey ed25519 raw (32 bytes) del dueño del Smart Account — el\n * `key_data` de la entrada `Signer::External`. Debe matchear lo que el\n * Smart Account tiene almacenado en su context rule.\n */\n readonly ownerPubkey: Uint8Array;\n}\n\nexport interface SignSorobanAuthEntryResult {\n /**\n * XDR base64 de la `SorobanAuthorizationEntry` con la firma del owner\n * dentro del AuthPayload. Esto va directo al body de `/tx/submit`.\n */\n readonly signedAuthEntryXdr: string;\n}\n\n/**\n * Firma la auth entry de un Smart Account para autorizar un único\n * `auth_context` (el caso XLM-transfer MVP).\n */\nexport async function signSorobanAuthEntry(\n params: SignSorobanAuthEntryParams,\n): Promise<SignSorobanAuthEntryResult> {\n const { xdr, Address, nativeToScVal } = await loadStellarSdk();\n\n // 1. Decode signature_payload (32 bytes).\n const signaturePayload = base64ToBytes(params.signaturePayloadHashBase64);\n if (signaturePayload.length !== 32) {\n throw new Error(\n `signSorobanAuthEntry: signature payload must be 32 bytes, got ${signaturePayload.length}`,\n );\n }\n\n if (params.ownerPubkey.length !== 32) {\n throw new Error(\n `signSorobanAuthEntry: ownerPubkey must be 32 bytes, got ${params.ownerPubkey.length}`,\n );\n }\n\n // 2. XDR-encode context_rule_ids: Vec<u32> → ScVal::Vec([U32, ...]).\n // Esto debe matchear EXACTAMENTE `Vec<u32>::to_xdr(env)` del lado contrato.\n const ridScVal = xdr.ScVal.scvVec(params.contextRuleIds.map((id) => xdr.ScVal.scvU32(id)));\n const ridXdrBytes = new Uint8Array(ridScVal.toXDR());\n\n // 3. auth_digest = sha256(signature_payload || ridXdrBytes).\n const preimage = new Uint8Array(signaturePayload.length + ridXdrBytes.length);\n preimage.set(signaturePayload, 0);\n preimage.set(ridXdrBytes, signaturePayload.length);\n const authDigest = sha256(preimage);\n\n // 4. ed25519 sign authDigest. La seed se zero-iza tras este bloque.\n const sigBytes = withZeroize([params.ed25519Seed], () =>\n signEd25519(authDigest, params.ed25519Seed),\n );\n if (sigBytes.length !== 64) {\n throw new Error(`signSorobanAuthEntry: expected 64-byte ed25519 sig, got ${sigBytes.length}`);\n }\n\n // 5. Build Signer::External(Address, Bytes) ScVal. Soroban contracttype\n // enum con payload serializa como ScVal::Vec([Symbol(variant), ...payload]).\n const signerScVal = xdr.ScVal.scvVec([\n xdr.ScVal.scvSymbol('External'),\n Address.fromString(params.ed25519VerifierAddress).toScVal(),\n nativeToScVal(params.ownerPubkey, { type: 'bytes' }),\n ]);\n\n // 6. Build AuthPayload struct:\n // AuthPayload {\n // signers: Map<Signer, Bytes>,\n // context_rule_ids: Vec<u32>,\n // }\n // Soroban serializa structs como ScVal::Map con keys = Symbol del campo,\n // sorted alphabetically (context_rule_ids < signers).\n const authPayloadScVal = xdr.ScVal.scvMap([\n new xdr.ScMapEntry({\n key: xdr.ScVal.scvSymbol('context_rule_ids'),\n val: ridScVal,\n }),\n new xdr.ScMapEntry({\n key: xdr.ScVal.scvSymbol('signers'),\n val: xdr.ScVal.scvMap([\n new xdr.ScMapEntry({\n key: signerScVal,\n val: nativeToScVal(sigBytes, { type: 'bytes' }),\n }),\n ]),\n }),\n ]);\n\n // 7. Parse the placeholder entry, replace credentials.address.signature.\n const entry = xdr.SorobanAuthorizationEntry.fromXDR(params.placeholderAuthEntryXdr, 'base64');\n const credentials = entry.credentials();\n if (credentials.switch().name !== 'sorobanCredentialsAddress') {\n throw new Error(\n `signSorobanAuthEntry: placeholder credentials must be Address variant, got ${credentials.switch().name}`,\n );\n }\n credentials.address().signature(authPayloadScVal);\n\n return { signedAuthEntryXdr: entry.toXDR('base64') };\n}\n\nfunction base64ToBytes(s: string): Uint8Array {\n if (typeof atob === 'function') {\n const bin = atob(s);\n const arr = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i += 1) arr[i] = bin.charCodeAt(i);\n return arr;\n }\n // Node fallback\n return new Uint8Array(Buffer.from(s, 'base64'));\n}\n","/**\n * Helpers puramente client-side para convertir / validar / mostrar valores\n * Stellar comunes que toda app de Accesly necesita.\n *\n * Cero dependencias del `@stellar/stellar-sdk` para que el bundle del integrador\n * no cargue ~200 KB solo por hacer `xlmToStroops(1.5)`.\n */\n\nexport type StellarNetwork = 'testnet' | 'mainnet';\n\n/**\n * Decimales del XLM = 7 (1 XLM = 10_000_000 stroops). Reusado por\n * `xlmToStroops` / `stroopsToXlm` y exportado por si el integrador lo\n * necesita en otra parte.\n */\nexport const XLM_DECIMALS = 7;\n\n/**\n * Convierte una cantidad de XLM expresada como string decimal a stroops como\n * string base-10. Manejo de precisión exacto — no usa `Number` (que pierde\n * precisión arriba de 2^53). Trim de ceros sobrantes; rechaza signos negativos.\n *\n * @example\n * xlmToStroops('1.5') // '15000000'\n * xlmToStroops('0.0000001') // '1'\n * xlmToStroops('100') // '1000000000'\n *\n * @throws Si `xlm` tiene más de 7 decimales (sub-stroop), letra, signo, o\n * forma malformada (varios puntos, vacío, etc.).\n */\nexport function xlmToStroops(xlm: string): string {\n const s = xlm.trim();\n if (!/^\\d+(\\.\\d+)?$/.test(s)) {\n throw new Error(\n `xlmToStroops: invalid number \"${xlm}\" — expected positive decimal`,\n );\n }\n const [whole, frac = ''] = s.split('.');\n if (frac.length > XLM_DECIMALS) {\n throw new Error(\n `xlmToStroops: ${xlm} exceeds 7 decimals (1 stroop = 0.0000001 XLM)`,\n );\n }\n const fracPadded = (frac + '0'.repeat(XLM_DECIMALS)).slice(0, XLM_DECIMALS);\n const combined = `${whole}${fracPadded}`.replace(/^0+(?=\\d)/, '');\n return combined === '' ? '0' : combined;\n}\n\n/**\n * Convierte stroops (string o bigint) a un string decimal de XLM con hasta 7\n * dígitos fraccionarios, sin trailing zeros.\n *\n * @example\n * stroopsToXlm('15000000') // '1.5'\n * stroopsToXlm('1') // '0.0000001'\n * stroopsToXlm('10000000') // '1'\n */\nexport function stroopsToXlm(stroops: string | bigint): string {\n const big = typeof stroops === 'bigint' ? stroops : BigInt(stroops);\n if (big < 0n) {\n throw new Error('stroopsToXlm: negative stroops not supported');\n }\n const factor = 10n ** BigInt(XLM_DECIMALS);\n const whole = big / factor;\n const frac = big % factor;\n if (frac === 0n) return whole.toString();\n const fracStr = frac.toString().padStart(XLM_DECIMALS, '0').replace(/0+$/, '');\n return `${whole.toString()}.${fracStr}`;\n}\n\n/**\n * Valida que una dirección sea G-address (clásica ed25519) o C-address (Soroban\n * contract). 56 caracteres base32 mayúsculos, prefijo G o C.\n *\n * NO valida el checksum interno de StrKey — para eso usá\n * `StrKey.isValidEd25519PublicKey` del stellar-sdk. Esto es defensa rápida\n * client-side suficiente para inputs de UI.\n */\nexport function isValidStellarAddress(s: string): boolean {\n return /^[GC][A-Z2-7]{55}$/.test(s);\n}\n\n/**\n * Versión recortada de una address para mostrar en UI cuando no cabe entera.\n * Por default `head=6` + `…` + `tail=4` — apropiado para C-addresses (56 chars).\n *\n * @example\n * shortAddress('CDAGBAFG7XXBX34OCTR4LBDLMMWPPXJIXI4XT2SPOCYMHX7FJ5WCH557')\n * // 'CDAGBA…H557'\n */\nexport function shortAddress(address: string, head = 6, tail = 4): string {\n if (address.length <= head + tail + 1) return address;\n return `${address.slice(0, head)}…${address.slice(-tail)}`;\n}\n\n/**\n * Link al explorer de Stellar Expert para un contrato (C-address) en la red dada.\n */\nexport function walletExplorerUrl(\n address: string,\n network: StellarNetwork = 'testnet',\n): string {\n return `https://stellar.expert/explorer/${network}/contract/${address}`;\n}\n\n/**\n * Link al explorer de Stellar Expert para una tx en la red dada.\n */\nexport function txExplorerUrl(\n txHash: string,\n network: StellarNetwork = 'testnet',\n): string {\n return `https://stellar.expert/explorer/${network}/tx/${txHash}`;\n}\n\n/**\n * Link al explorer de Stellar Expert para una G-address clásica.\n */\nexport function accountExplorerUrl(\n address: string,\n network: StellarNetwork = 'testnet',\n): string {\n return `https://stellar.expert/explorer/${network}/account/${address}`;\n}\n","/**\n * @accesly/core — framework-agnostic non-custodial wallet primitives for Stellar.\n *\n * Modules:\n * - `@accesly/core/crypto` — keypair, Shamir SSS, AES-GCM, HKDF/PBKDF2, X25519, zeroize\n * - `@accesly/core/mpc` — orchestration of split (create wallet) + combine (reconstruct key)\n * - `@accesly/core/api` — HTTP client and typed wrappers for the Accesly backend\n *\n * NON-CUSTODY GUARANTEE\n * The master key never leaves the device. The SDK generates it client-side, splits with Shamir,\n * encrypts F2 and F3 before sending to the backend, and zeroes memory immediately after signing.\n * See docs/Trust_Model_SDK.md and ADR-006 of the smart contracts repository.\n */\n\nexport const SDK_VERSION = '0.0.0';\n\nexport type Environment = 'dev' | 'staging' | 'prod';\n\nexport interface AcceslyCoreConfig {\n readonly appId: string;\n readonly env: Environment;\n readonly apiUrl?: string;\n}\n\n// Re-export the most commonly used building blocks at the top level. Consumers\n// who want a smaller bundle can import from the sub-paths instead.\nexport {\n createWallet,\n reconstructFromPlainAndEncrypted,\n reconstructKey,\n type CreateWalletParams,\n type CreateWalletResult,\n type EncryptedFragments,\n type EncryptedFragmentInput,\n type FragmentEncryptionKeys,\n type ReconstructFromPlainParams,\n type ReconstructKeyParams,\n type ReconstructKeyResult,\n} from './mpc/index.js';\n\nexport {\n decryptAesGcm,\n deriveRecoveryKey,\n deriveRecoveryKeyFromPasswordString,\n emailHashBytes,\n encryptAesGcm,\n generateKeypair,\n generateRecoverySalt,\n generateX25519Keypair,\n getRandomBytes,\n hkdfSha256,\n pbkdf2Sha256,\n RECOVERY_KEY_BYTES,\n RECOVERY_SALT_BYTES,\n sha256,\n sha256Hex,\n signEd25519,\n unwrapSessionFragment2,\n verifyEd25519,\n withZeroize,\n zeroize,\n type DeriveRecoveryKeyParams,\n type Ed25519Keypair,\n type EncryptedEnvelope,\n type Pbkdf2Options,\n type SessionFragment2Response,\n type UnwrappedFragment2,\n type X25519Keypair,\n} from './crypto/index.js';\n\nexport {\n CognitoAuthClient,\n defaultSessionStorage,\n InMemorySessionStorage,\n LocalStorageSessionStorage,\n TokenManager,\n type AuthClient,\n type AuthStatus,\n type AuthTokens,\n type CognitoConfig,\n type SessionStorage,\n type SignUpResult,\n type TokenManagerOptions,\n} from './auth/index.js';\n\nexport {\n formatError,\n type FormatErrorLocale,\n type FormatErrorOptions,\n} from './errors/index.js';\n\nexport {\n AccesslyApiClient,\n AccesslyApiError,\n AccesslyEndpoints,\n AuthError,\n NetworkError,\n NotFoundError,\n RateLimitError,\n ServerError,\n ValidationError,\n type AccesslyApiClientOptions,\n type IdTokenProvider,\n type TelemetryEvent,\n type TelemetrySink,\n type ActivatableAsset,\n type ActivateAssetSimulateRequest,\n type SimulateSwapRequest,\n type SimulateSwapResponse,\n type TransferAsset,\n type WalletActivityEvent,\n type WalletActivityResponse,\n type WalletBalanceResponse,\n type WalletHistoryItem,\n type WalletHistoryRequestOptions,\n type WalletHistoryResponse,\n} from './api/index.js';\n\nexport {\n IndexedDbDeviceStore,\n InMemoryDeviceStore,\n normalizeSecp256r1Pubkey,\n registerPasskey,\n unlockPasskey,\n type CredentialRecord,\n type DeviceStore,\n type PasskeyDescriptor,\n type RegisterPasskeyParams,\n type RegisterPasskeyResult,\n type UnlockPasskeyParams,\n type UnlockPasskeyResult,\n} from './webauthn/index.js';\n\nexport {\n XLM_DECIMALS,\n accountExplorerUrl,\n buildContractInvokeTransaction,\n buildPaymentTransaction,\n computeSmartAccountAddress,\n getBalances,\n getRecentOperations,\n isValidStellarAddress,\n shortAddress,\n signSorobanAuthEntry,\n signTransaction,\n stroopsToXlm,\n txExplorerUrl,\n walletExplorerUrl,\n xlmToStroops,\n type BalanceEntry,\n type BuildContractInvokeParams,\n type BuildPaymentParams,\n type ComputeSmartAccountAddressParams,\n type OperationEntry,\n type SignSorobanAuthEntryParams,\n type StellarNetwork,\n type SignSorobanAuthEntryResult,\n type SignTransactionParams,\n type SignTransactionResult,\n type StellarNetworkParams,\n} from './stellar/index.js';\n\n// Recovery via ZK email + `@accesly/zkemail` se removió en 1.0.0-pre.0 (2026-06-15).\n// El nuevo modelo (OTP-email + password de Cognito) llega en `@accesly/react`\n// como `recovery` namespace en 1.0.0 final.\n// Ver SDKAccesly/docs/Plan_Final_v1.md §5 (Fase 1).\n"]}
|