{"version":3,"sources":["../src/errors.ts","../src/messages.ts","../src/brandParam.ts","../src/balanceParam.ts","../src/minimumDepositParam.ts","../src/walletBridge/discover.ts","../src/walletBridge/protocol.ts","../src/walletBridge/rpcHost.ts","../src/viewportMetrics.ts","../src/iframeCore.ts","../src/iframe.ts","../src/embeddedIframe.ts","../src/signer.ts","../src/validation.ts","../src/checkout.ts","../src/BlinkDepositButton.ts","../src/react.ts"],"names":["useState","createElement","useRef","useEffect","useCallback"],"mappings":"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","file":"react.cjs","sourcesContent":["export type DepositErrorCode =\n  | 'DEPOSIT_DISMISSED'\n  | 'CHECKOUT_DISMISSED'\n  | 'SIGNER_REQUEST_FAILED'\n  | 'SIGNER_NETWORK_ERROR'\n  | 'SIGNER_RESPONSE_INVALID'\n  | 'SIGNER_TIMEOUT'\n  | 'FLOW_TIMEOUT'\n  | 'INVALID_REQUEST'\n  | 'IDENTIFIERS_UNAVAILABLE';\n\n/** @deprecated Use {@link DepositErrorCode} instead. */\nexport type CheckoutErrorCode = DepositErrorCode;\n\n/**\n * Structured error thrown by the deposit SDK.\n *\n * Every error carries a machine-readable {@link code} so merchants can\n * branch on failure mode without parsing message strings.\n */\nexport class DepositError extends Error {\n  readonly code: DepositErrorCode;\n\n  constructor(code: DepositErrorCode, message: string) {\n    super(message);\n    this.name = 'DepositError';\n    this.code = code;\n  }\n}\n\n/** @deprecated Use {@link DepositError} instead. */\nexport const CheckoutError = DepositError;\n/** @deprecated Use {@link DepositError} instead. */\nexport type CheckoutError = DepositError;\n\nconst DISPLAY_MESSAGES: Record<DepositErrorCode, string> = {\n  DEPOSIT_DISMISSED:\n    'The deposit was dismissed before the transfer completed.',\n  CHECKOUT_DISMISSED:\n    'The checkout was dismissed before the transfer completed.',\n  SIGNER_REQUEST_FAILED:\n    'Unable to start the payment. Please try again.',\n  SIGNER_NETWORK_ERROR:\n    'Unable to reach the payment server. Check your connection and try again.',\n  SIGNER_RESPONSE_INVALID:\n    'The payment server returned an unexpected response.',\n  SIGNER_TIMEOUT:\n    'The payment server took too long to respond. Please try again.',\n  FLOW_TIMEOUT:\n    'The payment flow timed out. Please try again.',\n  INVALID_REQUEST:\n    'Invalid payment request. Please check your input.',\n  IDENTIFIERS_UNAVAILABLE:\n    'Unable to identify this device right now. Please try again.',\n};\n\n/**\n * Return a user-friendly display string for a {@link DepositError}.\n *\n * Merchants can show this directly in their UI without maintaining their own\n * copy for each error code.\n */\nexport function getDisplayMessage(error: DepositError): string {\n  return DISPLAY_MESSAGES[error.code] ?? error.message;\n}\n\n// ── Human verification ────────────────────────────────────────────────\n\nexport type VerificationErrorCode =\n  /** This palm already verifies a different account at this merchant. The first binding holds. */\n  | 'ALREADY_VERIFIED_OTHER_ACCOUNT'\n  /** A different palm was scanned for an account that already holds one. */\n  | 'ACCOUNT_ALREADY_VERIFIED'\n  /** The user closed the flow before it finished. */\n  | 'VERIFICATION_DISMISSED'\n  /** The attempt's 30-minute window passed. */\n  | 'VERIFICATION_EXPIRED'\n  /** The user cancelled at the provider. */\n  | 'VERIFICATION_DECLINED'\n  /** The provider could not complete the scan (an expired or replayed code, or an outage). */\n  | 'VERIFICATION_FAILED'\n  /** The provider restricted this human; neither the palm nor the account can be re-verified. */\n  | 'VERIFICATION_REVOKED'\n  /** Not available here: the merchant is not enabled, the feature is switched off, or the hosted page predates it. */\n  | 'VERIFICATION_UNAVAILABLE'\n  | 'SIGNER_REQUEST_FAILED'\n  | 'SIGNER_NETWORK_ERROR'\n  | 'SIGNER_RESPONSE_INVALID'\n  | 'SIGNER_TIMEOUT'\n  | 'FLOW_TIMEOUT'\n  | 'INVALID_REQUEST';\n\n/**\n * Structured error thrown by {@link Verification}. A sibling of\n * {@link DepositError} rather than a subclass: the two flows share signer\n * codes but nothing else, and a merchant branching on `code` should not\n * be able to confuse a dismissed deposit with a dismissed verification.\n */\nexport class VerificationError extends Error {\n  readonly code: VerificationErrorCode;\n\n  constructor(code: VerificationErrorCode, message: string) {\n    super(message);\n    this.name = 'VerificationError';\n    this.code = code;\n  }\n}\n\nconst VERIFICATION_DISPLAY_MESSAGES: Record<VerificationErrorCode, string> = {\n  ALREADY_VERIFIED_OTHER_ACCOUNT: 'You already verified another account.',\n  ACCOUNT_ALREADY_VERIFIED: 'This account is already verified with a different palm.',\n  VERIFICATION_DISMISSED: 'Verification was closed before it finished.',\n  VERIFICATION_EXPIRED: 'The verification request expired. Please start again.',\n  VERIFICATION_DECLINED: 'Verification was cancelled.',\n  VERIFICATION_FAILED: 'We could not finish verifying you. Please try again.',\n  VERIFICATION_REVOKED: 'Verification is not available for this account.',\n  VERIFICATION_UNAVAILABLE: 'Verification is not available right now. Please try again later.',\n  SIGNER_REQUEST_FAILED: 'Unable to start verification. Please try again.',\n  SIGNER_NETWORK_ERROR: 'Unable to reach the server. Check your connection and try again.',\n  SIGNER_RESPONSE_INVALID: 'The server returned an unexpected response.',\n  SIGNER_TIMEOUT: 'The server took too long to respond. Please try again.',\n  FLOW_TIMEOUT: 'Verification timed out. Please try again.',\n  INVALID_REQUEST: 'Invalid verification request.',\n};\n\n/** Return a user-friendly display string for a {@link VerificationError}. */\nexport function getVerificationDisplayMessage(error: VerificationError): string {\n  return VERIFICATION_DISPLAY_MESSAGES[error.code] ?? error.message;\n}\n","import type { TransferSummary } from './types.ts';\n\n// ── Wire message shapes (internal protocol — brand-specific names are OK) ──\n\ninterface TransferCompleteMessage {\n  type: 'blink:transfer-complete';\n  transfer: TransferSummary;\n}\n\ninterface TransferCompleteAckMessage {\n  type: 'blink:transfer-complete-ack';\n  transferId: string;\n}\n\n/**\n * Parse an incoming `MessageEvent.data` value into a validated transfer\n * completion message, or return `null` if it does not match.\n */\nexport function parseTransferComplete(data: unknown): TransferCompleteMessage | null {\n  if (!data || typeof data !== 'object') {\n    return null;\n  }\n\n  const msg = data as Record<string, unknown>;\n  if (msg.type !== 'blink:transfer-complete') {\n    return null;\n  }\n\n  const transfer = msg.transfer;\n  if (!transfer || typeof transfer !== 'object') {\n    return null;\n  }\n\n  const t = transfer as Record<string, unknown>;\n  if (typeof t.id !== 'string' || typeof t.status !== 'string') {\n    return null;\n  }\n\n  return {\n    type: 'blink:transfer-complete',\n    transfer: {\n      id: t.id,\n      status: t.status,\n      amount: parseAmount(t.amount),\n      destinations: parseDestinations(t.destinations),\n    },\n  };\n}\n\nfunction parseAmount(value: unknown): TransferSummary['amount'] {\n  if (!value || typeof value !== 'object') {\n    return undefined;\n  }\n  const a = value as Record<string, unknown>;\n  return {\n    amount: Number(a.amount ?? 0),\n    currency: String(a.currency ?? ''),\n  };\n}\n\nfunction parseDestinations(value: unknown): TransferSummary['destinations'] {\n  if (!Array.isArray(value)) {\n    return undefined;\n  }\n\n  return value\n    .filter((entry): entry is Record<string, unknown> => !!entry && typeof entry === 'object')\n    .map((entry) => ({\n      chainId: String(entry.chainId ?? ''),\n      address: String(entry.address ?? ''),\n      token:\n        entry.token && typeof entry.token === 'object'\n          ? {\n              address: String((entry.token as Record<string, unknown>).address ?? ''),\n              symbol: String((entry.token as Record<string, unknown>).symbol ?? ''),\n            }\n          : undefined,\n    }));\n}\n\n/** Build an ACK message to send back to the hosted flow. */\nexport function buildAckMessage(transferId: string): TransferCompleteAckMessage {\n  return {\n    type: 'blink:transfer-complete-ack',\n    transferId,\n  };\n}\n\n// ── Close request ─────────────────────────────────────────────────────\n\ninterface CloseRequestMessage {\n  type: 'blink:close-request';\n}\n\n/**\n * Parse an incoming `MessageEvent.data` value into a close-request message,\n * or return `null` if it does not match. The hosted flow sends this when\n * the user taps the close / X button inside the iframe.\n */\nexport function parseCloseRequest(data: unknown): CloseRequestMessage | null {\n  if (!data || typeof data !== 'object') {\n    return null;\n  }\n  const msg = data as Record<string, unknown>;\n  if (msg.type !== 'blink:close-request') {\n    return null;\n  }\n  return { type: 'blink:close-request' };\n}\n\n// ── Preload handshake ─────────────────────────────────────────────────\n\ninterface IframeReadyMessage {\n  type: 'blink:iframe-ready';\n  /**\n   * Feature capabilities advertised by the hosted flow. Older webview\n   * deployments omit the field entirely — parsed as an empty list so the\n   * SDK can downgrade features that need cooperation from the iframe\n   * (e.g. `layout-fluid`).\n   */\n  capabilities: string[];\n}\n\nexport function parseIframeReady(data: unknown): IframeReadyMessage | null {\n  if (!data || typeof data !== 'object') {\n    return null;\n  }\n  const msg = data as Record<string, unknown>;\n  if (msg.type !== 'blink:iframe-ready') {\n    return null;\n  }\n  return { type: 'blink:iframe-ready', capabilities: parseCapabilities(msg.capabilities) };\n}\n\nfunction parseCapabilities(value: unknown): string[] {\n  if (!Array.isArray(value)) {\n    return [];\n  }\n  return value.filter((entry): entry is string => typeof entry === 'string');\n}\n\n// ── Reveal (fluid layout) ─────────────────────────────────────────────\n\ninterface RevealMessage {\n  type: 'blink:reveal';\n}\n\n// ── Viewport metrics (fluid layout) ───────────────────────────────────\n\ninterface ViewportMessage {\n  type: 'blink:viewport';\n  /** Merchant page's large-viewport height (100lvh) in CSS px. */\n  viewportLvh: number;\n  /** Merchant page's `env(safe-area-inset-bottom)` in CSS px. */\n  safeAreaBottom: number;\n  /**\n   * Embedded presentation only: the host's height budget for the inline\n   * iframe, in CSS px. Omitted entirely on overlay/fluid loads so the wire\n   * shape older webview deployments see is byte-for-byte what it always was.\n   */\n  embedMaxHeightPx?: number;\n}\n\n/**\n * Build the message that keeps the hosted flow's sheet geometry anchored to\n * the merchant page's *large* viewport. Inside the fluid iframe, `dvh`\n * tracks the current (chrome-dependent) viewport, so without these values\n * the sheet would resize whenever the mobile browser's URL bar collapses or\n * expands — the legacy parent-side sheet (79vh) never did.\n *\n * In embedded presentation it carries `embedMaxHeightPx` as well: there the\n * iframe's own height is a function of its content, so the flow cannot use\n * `dvh` for anything and needs a host-supplied budget to size against.\n */\nexport function buildViewportMessage(\n  viewportLvh: number,\n  safeAreaBottom: number,\n  embedMaxHeightPx?: number,\n): ViewportMessage {\n  return {\n    type: 'blink:viewport',\n    viewportLvh,\n    safeAreaBottom,\n    ...(embedMaxHeightPx === undefined ? {} : { embedMaxHeightPx }),\n  };\n}\n\n// ── Content height (embedded presentation) ────────────────────────────\n\ninterface ContentHeightMessage {\n  type: 'blink:content-height';\n  /** Rendered height of the hosted flow's card, in CSS px. */\n  heightPx: number;\n  /**\n   * Width the flow would like if the host has room, and the width below which\n   * its fixed-width elements start to overflow. Constants from the hosted\n   * flow's design envelope, not measurements — a width derived from the width\n   * the host granted would just echo back, so a panel could never grow.\n   * Absent from older hosted flows that only reported height.\n   */\n  preferredWidthPx?: number;\n  minWidthPx?: number;\n}\n\n/** Upper bound on a reported height — same order as the viewport clamp. */\nconst MAX_CONTENT_HEIGHT_PX = 20_000;\n\n/**\n * Parse the hosted flow's content-height report, or return `null` if it does\n * not match. Sent continuously in embedded presentation (a ResizeObserver on\n * the card) so the host can size the inline iframe element to the flow; the\n * host is a dumb follower here, applying the value without animating it —\n * the SDK's own height transition is what the user sees.\n */\nexport function parseContentHeight(data: unknown): ContentHeightMessage | null {\n  if (!data || typeof data !== 'object') {\n    return null;\n  }\n  const msg = data as Record<string, unknown>;\n  if (msg.type !== 'blink:content-height') {\n    return null;\n  }\n  const raw = msg.heightPx;\n  if (typeof raw !== 'number' || !Number.isFinite(raw)) {\n    return null;\n  }\n  const heightPx = Math.round(raw);\n  if (heightPx <= 0 || heightPx > MAX_CONTENT_HEIGHT_PX) {\n    return null;\n  }\n  return {\n    type: 'blink:content-height',\n    heightPx,\n    ...parseWidthHint('preferredWidthPx', msg.preferredWidthPx),\n    ...parseWidthHint('minWidthPx', msg.minWidthPx),\n  };\n}\n\n/** A width hint is optional: drop anything unusable rather than failing the report. */\nfunction parseWidthHint(key: 'preferredWidthPx' | 'minWidthPx', value: unknown) {\n  if (typeof value !== 'number' || !Number.isFinite(value)) return {};\n  const px = Math.round(value);\n  if (px <= 0 || px > MAX_CONTENT_HEIGHT_PX) return {};\n  return { [key]: px } as Record<string, number>;\n}\n\n/**\n * Build the message that tells the hosted flow its overlay just became (or\n * already is) visible, so it plays the card entry animation. Only meaningful\n * in fluid layout, where the card chrome lives inside the iframe; other\n * webviews ignore it.\n */\nexport function buildRevealMessage(): RevealMessage {\n  return { type: 'blink:reveal' };\n}\n\ninterface SignedPayloadMessage {\n  type: 'blink:signed-payload';\n  merchantId: string;\n  payload: string;\n  signature: string;\n  /**\n   * Display-only merchant balance in USD, already normalized by the host SDK\n   * (`balanceParam.ts`: floored to cents, always two fraction digits —\n   * `\"20.70\"`). An UNSIGNED sibling of the payload: it is not covered by the\n   * signature and the hosted flow re-validates it before display. Omitted\n   * entirely when the merchant passed nothing usable, so the wire shape older\n   * webview deployments see is byte-for-byte what it always was.\n   */\n  balance?: string;\n  /**\n   * Merchant minimum deposit in USD, already normalized by the host SDK\n   * (`minimumDepositParam.ts`: ceiled to cents, always two fraction digits —\n   * `\"10.00\"`). An UNSIGNED sibling of the payload, like `balance`: not\n   * covered by the signature, re-validated by the hosted flow, and omitted\n   * entirely when the merchant passed nothing usable so the wire shape older\n   * webview deployments see is byte-for-byte what it always was.\n   */\n  minimumDeposit?: string;\n}\n\nexport function buildSignedPayloadMessage(\n  merchantId: string,\n  payload: string,\n  signature: string,\n  balance?: string,\n  minimumDeposit?: string,\n): SignedPayloadMessage {\n  return {\n    type: 'blink:signed-payload',\n    merchantId,\n    payload,\n    signature,\n    ...(balance === undefined ? {} : { balance }),\n    ...(minimumDeposit === undefined ? {} : { minimumDeposit }),\n  };\n}\n","// ── Brand color param (host side) ─────────────────────────────────────\n//\n// The encoder half of the `brand` URL param. The decoder, the palette\n// derivation and the contrast gate all live in the hosted flow\n// (`swype-sdk/src/brandColors.ts`) — that is where the colors are actually\n// used, and it re-validates everything it decodes because the URL is\n// host-controlled input on its way into a stylesheet.\n//\n// So the key map below is one table in two packages. Deliberate: this SDK ships\n// to merchants with zero dependencies and cannot import the hosted flow's\n// module, and duplicating five short strings is a better trade than a shared\n// package for them. They ship together with the webview, and the round trip is\n// covered by tests on both sides — but if you add a key here, add it there.\n\n/** Config key → param key. Mirrors `BRAND_PARAM_KEYS` in swype-sdk. */\nexport const BRAND_COLOR_PARAM_KEYS: Record<string, string> = {\n  colorPrimary: 'p',\n  colorBackground: 'bg',\n  colorText: 't',\n  colorDanger: 'd',\n  colorBorder: 'b',\n};\n\n/**\n * Normalizes `#rgb` / `#rrggbb` (any case) to lowercase `#rrggbb`. Returns null\n * for anything else, including 8-digit hex: Blink's card is a solid surface, so\n * alpha has no meaning and is rejected rather than silently flattened.\n */\nexport function normalizeBrandHex(value: unknown): string | null {\n  if (typeof value !== 'string') return null;\n  const hex = value.trim().toLowerCase();\n  if (!/^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/.test(hex)) return null;\n  const digits = hex.slice(1);\n  if (digits.length === 6) return `#${digits}`;\n  return `#${digits[0]}${digits[0]}${digits[1]}${digits[1]}${digits[2]}${digits[2]}`;\n}\n","// ── Merchant balance param (host side) ────────────────────────────────\n//\n// The encoder half of the display-only merchant balance. The decoder lives\n// in the hosted flow (webview-app), which re-validates everything it\n// receives — the postMessage sibling field and the `balance` URL param are\n// both host-controlled input on their way into the deposit header.\n//\n// Validated here as well purely so the merchant sees the complaint in their\n// OWN console (same rationale as `brandParam.ts`): a balance that silently\n// vanishes looks like the SDK ignoring the request. Never forward the\n// merchant's raw value — parse, floor, re-serialize.\n\n/**\n * Exclusive upper bound on an accepted balance, in USD. Mirrors the\n * `MAX_CONTENT_HEIGHT_PX` clamp philosophy in `messages.ts`: a hard cap on\n * merchant-supplied magnitudes, generous enough for any real balance.\n */\nconst MAX_BALANCE_USD = 1e12;\n\n/**\n * Normalizes a merchant-supplied display balance to its canonical wire form,\n * or returns `null` for anything unusable (the caller drops the field).\n *\n * Accepts only a finite number `>= 0` and `< 1e12`. The value is floored to\n * whole cents — a balance never rounds up — and serialized as a plain decimal\n * string with exactly two fraction digits: `20.7` → `\"20.70\"`, `0` → `\"0.00\"`.\n *\n * Flooring detail: `Math.floor(value * 100)` alone is wrong for values whose\n * float64 form sits just under the cent boundary (`0.29 * 100 ===\n * 28.999999999999996`). `toPrecision(15)` strips that representation noise —\n * it lives at significant digit 16–17 — before flooring, so only genuine\n * sub-cent digits are dropped. The cents guard afterwards rejects the one\n * pathological corner where noise-stripping rounds a value within float64\n * noise of the cap up through it (e.g. `999999999999.9999`): dropping it beats\n * emitting a balance at or above the cap.\n */\nexport function normalizeDisplayBalance(value: unknown): string | null {\n  if (typeof value !== 'number' || !Number.isFinite(value)) return null;\n  if (value < 0 || value >= MAX_BALANCE_USD) return null;\n  const cents = Math.floor(Number((value * 100).toPrecision(15)));\n  if (cents < 0 || cents >= MAX_BALANCE_USD * 100) return null;\n  return (cents / 100).toFixed(2);\n}\n","// ── Merchant minimum-deposit param (host side) ────────────────────────\n//\n// The encoder half of the merchant-supplied deposit floor. The decoder lives\n// in the hosted flow (webview-app), which re-validates everything it receives\n// — the postMessage sibling field and the `minDeposit` URL param are both\n// host-controlled input on their way into the amount screen's validation.\n//\n// Validated here as well purely so the merchant sees the complaint in their\n// OWN console (same rationale as `brandParam.ts` / `balanceParam.ts`): a\n// minimum that silently vanishes looks like the SDK ignoring the request.\n// Never forward the merchant's raw value — parse, round, re-serialize.\n//\n// This is a MERCHANT business rule, not a security boundary. It is unsigned\n// (like `balance`), so a determined user can strip it; what they cannot strip\n// is Blink's own per-route floor, which the hosted flow enforces underneath\n// and the server enforces again at quote time. The two compose as a max —\n// see the hosted flow's `resolveMinimumDepositUsd`.\n\n/**\n * Exclusive upper bound on an accepted minimum, in USD. Mirrors the\n * `MAX_BALANCE_USD` clamp philosophy: a hard cap on merchant-supplied\n * magnitudes, generous enough for any real floor and small enough that a\n * fat-fingered `1e18` cannot lock every user out of depositing.\n */\nconst MAX_MINIMUM_DEPOSIT_USD = 1e6;\n\n/**\n * Normalizes a merchant-supplied minimum deposit to its canonical wire form,\n * or returns `null` for anything unusable (the caller drops the field).\n *\n * Accepts only a finite number `> 0` and `< 1e6`, serialized as a plain\n * decimal string with exactly two fraction digits: `10` → `\"10.00\"`, `9.5` →\n * `\"9.50\"`.\n *\n * Sub-cent values round UP, the opposite of `normalizeDisplayBalance`. Each\n * rounds in the direction that cannot misrepresent: a balance floors because\n * it must never advertise money the user does not have, and a minimum ceils\n * because it must never advertise a floor lower than the one being enforced.\n * A `9.991` minimum shown as `$9.99` would reject a $9.99 deposit the screen\n * had just called acceptable.\n *\n * Ceiling detail: `Math.ceil(value * 100)` alone is wrong for values whose\n * float64 form sits just above a cent boundary (`10.00 * 100 ===\n * 1000.0000000000001` for some inputs). `toPrecision(15)` strips that\n * representation noise — it lives at significant digit 16–17 — before\n * ceiling, so only genuine sub-cent digits round up. The cents guard\n * afterwards rejects the corner where noise-stripping pushes a value within\n * float64 noise of the cap up through it.\n */\nexport function normalizeMinimumDeposit(value: unknown): string | null {\n  if (typeof value !== 'number' || !Number.isFinite(value)) return null;\n  if (value <= 0 || value >= MAX_MINIMUM_DEPOSIT_USD) return null;\n  const cents = Math.ceil(Number((value * 100).toPrecision(15)));\n  if (cents <= 0 || cents >= MAX_MINIMUM_DEPOSIT_USD * 100) return null;\n  return (cents / 100).toFixed(2);\n}\n","// ── EIP-6963 Wallet Discoverer (parent-frame) ──────────────────────────\n//\n// Some browser-extension wallets (notably Uniswap and Rainbow) inject\n// `window.ethereum` and dispatch EIP-6963 announcements only into the\n// top-level frame. Inside our cross-origin payment iframe, wagmi's MIPD\n// scan never sees them.\n//\n// This module runs in the parent frame (the merchant page that loads\n// `@swype-org/deposit`). It listens for EIP-6963 announcements, builds a\n// registry of installed providers keyed by their EIP-6963 `info.uuid`,\n// and exposes it for the `rpcHost` to advertise into the iframe.\n//\n// Hand-off contract with the iframe lives in `messages.ts` /\n// `walletBridge/protocol.ts`.\n\nimport type {\n  EIP1193Provider,\n  EIP6963ProviderDetail,\n  EIP6963ProviderInfo,\n} from './protocol.ts';\n\nexport interface RegisteredProvider {\n  info: EIP6963ProviderInfo;\n  provider: EIP1193Provider;\n}\n\nexport interface WalletDiscovererHandle {\n  /** Snapshot of currently-registered providers. */\n  list(): RegisteredProvider[];\n  /** Look up a single provider by EIP-6963 uuid. */\n  get(uuid: string): EIP1193Provider | undefined;\n  /** Subscribe to registry changes. Returns an unsubscribe callback. */\n  subscribe(listener: (snapshot: RegisteredProvider[]) => void): () => void;\n  /**\n   * Re-dispatch `eip6963:requestProvider`. Wallets that wired up after\n   * page load (or after the initial sweep) will re-announce in response.\n   */\n  requestProviders(): void;\n  /** Tear down listeners. After this, `list()` returns `[]`. */\n  destroy(): void;\n}\n\ninterface AnnounceEvent extends Event {\n  detail?: EIP6963ProviderDetail;\n}\n\n/**\n * Start discovering EIP-6963 providers in the current (top-level) frame.\n *\n * Safe to call multiple times — each handle owns its own listeners and\n * registry; calling `destroy()` releases both. In practice, `createIframe`\n * spins one handle per modal open.\n */\nexport function createWalletDiscoverer(): WalletDiscovererHandle {\n  if (typeof window === 'undefined') {\n    return makeNoopHandle();\n  }\n\n  const registry = new Map<string, RegisteredProvider>();\n  const listeners = new Set<(snapshot: RegisteredProvider[]) => void>();\n  let destroyed = false;\n\n  const onAnnounce = (event: Event) => {\n    if (destroyed) return;\n    const detail = (event as AnnounceEvent).detail;\n    if (!isValidProviderDetail(detail)) {\n      // eslint-disable-next-line no-console\n      console.info('[blink-bridge:parent] dropping malformed EIP-6963 announcement', {\n        rawInfo: (event as AnnounceEvent).detail\n          && ((event as AnnounceEvent).detail as { info?: unknown }).info,\n      });\n      return;\n    }\n\n    const existing = registry.get(detail.info.uuid);\n    if (existing && existing.provider === detail.provider) {\n      return;\n    }\n    // eslint-disable-next-line no-console\n    console.info('[blink-bridge:parent] EIP-6963 announceProvider', {\n      rdns: detail.info.rdns,\n      name: detail.info.name,\n      uuid: detail.info.uuid,\n    });\n    registry.set(detail.info.uuid, {\n      info: { ...detail.info },\n      provider: detail.provider,\n    });\n    notify();\n  };\n\n  // EIP-6963 requires the page to listen for announcements *first*, then\n  // dispatch the request. Wallets respond synchronously with their\n  // provider details. Wallets that load late (slow content scripts) will\n  // also auto-announce on their own once they're ready.\n  window.addEventListener('eip6963:announceProvider', onAnnounce);\n  requestProviders();\n\n  // Mirror wagmi's `unstable_shimAsyncInject: 2_000` — a few content\n  // scripts (Uniswap is one) finish wiring up after `DOMContentLoaded`,\n  // so a single sweep can miss them. Re-request a handful of times in\n  // the first few seconds, then stop. Each re-request is cheap (one\n  // CustomEvent dispatch).\n  const RESWEEP_INTERVALS_MS = [500, 1500, 3000, 6000];\n  const reSweepTimers: ReturnType<typeof setTimeout>[] = [];\n  for (const ms of RESWEEP_INTERVALS_MS) {\n    reSweepTimers.push(\n      setTimeout(() => {\n        if (!destroyed) requestProviders();\n      }, ms),\n    );\n  }\n\n  function requestProviders(): void {\n    try {\n      window.dispatchEvent(new Event('eip6963:requestProvider'));\n    } catch {\n      // jsdom older than v22 throws on `new Event()` in some setups —\n      // safe to swallow; real browsers always succeed here.\n    }\n  }\n\n  function notify(): void {\n    const snapshot = list();\n    for (const listener of listeners) {\n      try {\n        listener(snapshot);\n      } catch {\n        // Listener errors must not break the discoverer.\n      }\n    }\n  }\n\n  function list(): RegisteredProvider[] {\n    return [...registry.values()];\n  }\n\n  return {\n    list,\n    get(uuid: string): EIP1193Provider | undefined {\n      return registry.get(uuid)?.provider;\n    },\n    subscribe(listener) {\n      listeners.add(listener);\n      return () => {\n        listeners.delete(listener);\n      };\n    },\n    requestProviders,\n    destroy() {\n      if (destroyed) return;\n      destroyed = true;\n      window.removeEventListener('eip6963:announceProvider', onAnnounce);\n      for (const t of reSweepTimers) clearTimeout(t);\n      registry.clear();\n      listeners.clear();\n    },\n  };\n}\n\nfunction makeNoopHandle(): WalletDiscovererHandle {\n  return {\n    list: () => [],\n    get: () => undefined,\n    subscribe: () => () => {},\n    requestProviders: () => {},\n    destroy: () => {},\n  };\n}\n\nfunction isValidProviderDetail(value: unknown): value is EIP6963ProviderDetail {\n  if (!value || typeof value !== 'object') return false;\n  const detail = value as Record<string, unknown>;\n  const info = detail.info as Record<string, unknown> | undefined;\n  const provider = detail.provider as Record<string, unknown> | undefined;\n  if (!info || !provider) return false;\n  if (typeof info.uuid !== 'string' || info.uuid.length === 0) return false;\n  if (typeof info.name !== 'string') return false;\n  if (typeof info.rdns !== 'string') return false;\n  if (typeof provider.request !== 'function') return false;\n  return true;\n}\n","// ── Wallet Bridge Wire Protocol ────────────────────────────────────────\n//\n// Shared between parent (`deposit-sdk`) and iframe (`swype-sdk`). Both\n// sides define the same shapes locally — there is no runtime import\n// across the postMessage boundary, only structural conformance via\n// `protocolVersion: 1`. Bumping the version to 2 is a breaking change\n// receivers must opt into; v1 receivers silently drop v2 messages and\n// fall through to legacy behavior.\n//\n// New `type` values are additive within the same `protocolVersion`: any\n// peer that doesn't recognize them returns `null` from\n// `parseBridgeMessage` and the sender falls through to its own\n// timeout/fallback path. Only bump the version when we change the wire\n// shape of an existing message.\n\n/** Current wire-protocol version. Bump on breaking changes. */\nexport const BRIDGE_PROTOCOL_VERSION = 1;\n\n// ── EIP-6963 / EIP-1193 (subset we touch) ──────────────────────────────\n\nexport interface EIP6963ProviderInfo {\n  uuid: string;\n  name: string;\n  icon: string;\n  rdns: string;\n}\n\nexport interface EIP1193RequestArgs {\n  method: string;\n  params?: unknown[] | Record<string, unknown>;\n}\n\nexport interface EIP1193Provider {\n  request(args: EIP1193RequestArgs): Promise<unknown>;\n  on?: (event: string, listener: (...args: unknown[]) => void) => unknown;\n  removeListener?: (event: string, listener: (...args: unknown[]) => void) => unknown;\n}\n\nexport interface EIP6963ProviderDetail {\n  info: EIP6963ProviderInfo;\n  provider: EIP1193Provider;\n}\n\n// ── Wire messages (both directions tagged with `type`) ─────────────────\n\n/** Iframe → Parent: handshake, sent once on mount. */\nexport interface BridgeHelloMessage {\n  type: 'blink:bridge-hello';\n  protocolVersion: number;\n}\n\n/** Parent → Iframe: list of installed wallets the iframe can borrow. */\nexport interface WalletsAdvertisedMessage {\n  type: 'blink:wallets-advertised';\n  protocolVersion: number;\n  wallets: AdvertisedWallet[];\n}\n\nexport interface AdvertisedWallet {\n  uuid: string;\n  rdns: string;\n  name: string;\n  icon: string;\n}\n\n/** Iframe → Parent: invoke a JSON-RPC method on a top-frame wallet. */\nexport interface RpcRequestMessage {\n  type: 'blink:rpc-request';\n  protocolVersion: number;\n  uuid: string;\n  id: string;\n  method: string;\n  params?: unknown[] | Record<string, unknown>;\n}\n\n/** Parent → Iframe: result of a previous `RpcRequestMessage`. */\nexport interface RpcResponseMessage {\n  type: 'blink:rpc-response';\n  protocolVersion: number;\n  id: string;\n  result?: unknown;\n  error?: { code: number; message: string; data?: unknown };\n}\n\n/** Parent → Iframe: forwarded EIP-1193 event from a top-frame wallet. */\nexport interface RpcEventMessage {\n  type: 'blink:rpc-event';\n  protocolVersion: number;\n  uuid: string;\n  event: string;\n  args: unknown[];\n}\n\n/**\n * Iframe → Parent: ask \"which advertised wallet has any of these flags\n * (e.g. `isUniswapWallet`) set as a truthy property on its provider?\".\n * Used to disambiguate Reown registry entries that lack `rdns` (e.g.\n * Uniswap, where Reown only ships `injected[].injectedId:\n * 'isUniswapWallet'`). The parent reads `provider[flag]` defensively\n * for each advertised provider and returns the first hit, or null.\n *\n * The parent answers each request once; the response is matched by\n * `id`. Cost is local property reads on already-discovered providers —\n * no network and no cross-frame I/O beyond the postMessage round-trip.\n */\nexport interface ResolveByFlagRequestMessage {\n  type: 'blink:resolve-by-flag';\n  protocolVersion: number;\n  /** Request id, mirrored on the response so the iframe can route it. */\n  id: string;\n  /** Flag names to test in order; first truthy property wins. */\n  flags: string[];\n}\n\n/** Parent → Iframe: result of a previous `ResolveByFlagRequestMessage`. */\nexport interface ResolveByFlagResponseMessage {\n  type: 'blink:resolve-by-flag-response';\n  protocolVersion: number;\n  id: string;\n  /** `null` when no advertised provider had any flag set. */\n  match: ResolveByFlagMatch | null;\n}\n\nexport interface ResolveByFlagMatch {\n  /** EIP-6963 `rdns` of the matched provider. */\n  rdns: string;\n  /** EIP-6963 `uuid` of the matched provider. */\n  uuid: string;\n  /** Which flag matched first (lets the caller log/telemeter). */\n  flag: string;\n}\n\nexport type BridgeMessage =\n  | BridgeHelloMessage\n  | WalletsAdvertisedMessage\n  | RpcRequestMessage\n  | RpcResponseMessage\n  | RpcEventMessage\n  | ResolveByFlagRequestMessage\n  | ResolveByFlagResponseMessage;\n\n// ── JSON-RPC method allowlist ──────────────────────────────────────────\n//\n// Only methods on this list are forwarded to the top-frame provider.\n// Anything else gets a `-32601 Method not allowed` rejection, mirroring\n// the JSON-RPC 2.0 \"Method not found\" error code.\n\nexport const ALLOWED_RPC_METHODS = new Set<string>([\n  // Read\n  'eth_accounts',\n  'eth_blockNumber',\n  'eth_call',\n  'eth_chainId',\n  'eth_estimateGas',\n  'eth_gasPrice',\n  'eth_getBalance',\n  'eth_getCode',\n  'eth_getStorageAt',\n  'eth_getTransactionByHash',\n  'eth_getTransactionCount',\n  'eth_getTransactionReceipt',\n  'net_version',\n  'wallet_getCapabilities',\n  'wallet_getCallsStatus',\n  // Write / sign\n  'eth_requestAccounts',\n  'eth_sendTransaction',\n  'eth_sendRawTransaction',\n  'eth_sign',\n  'personal_sign',\n  'eth_signTypedData',\n  'eth_signTypedData_v3',\n  'eth_signTypedData_v4',\n  'wallet_addEthereumChain',\n  'wallet_switchEthereumChain',\n  'wallet_sendCalls',\n  'wallet_watchAsset',\n  // EIP-2255: lets the SDK revoke the dApp's `eth_accounts` grant before\n  // re-prompting on \"+ Add wallet\" / back-from-setup, so MetaMask shows the\n  // account picker instead of silently reusing the previously-permitted\n  // account. Wallets that don't implement it return method-not-supported,\n  // which the SDK swallows.\n  'wallet_revokePermissions',\n]);\n\n// ── Forwarded EIP-1193 events ──────────────────────────────────────────\n\nexport const FORWARDED_PROVIDER_EVENTS = [\n  'accountsChanged',\n  'chainChanged',\n  'connect',\n  'disconnect',\n  'message',\n] as const;\n\nexport type ForwardedProviderEvent = (typeof FORWARDED_PROVIDER_EVENTS)[number];\n\n// ── Parsers (used by both sides) ───────────────────────────────────────\n\nexport function parseBridgeMessage(data: unknown): BridgeMessage | null {\n  if (!data || typeof data !== 'object') return null;\n  const msg = data as Record<string, unknown>;\n  if (msg.protocolVersion !== BRIDGE_PROTOCOL_VERSION) return null;\n  switch (msg.type) {\n    case 'blink:bridge-hello':\n      return msg as unknown as BridgeHelloMessage;\n    case 'blink:wallets-advertised':\n      return Array.isArray(msg.wallets) ? (msg as unknown as WalletsAdvertisedMessage) : null;\n    case 'blink:rpc-request':\n      if (typeof msg.uuid !== 'string' || typeof msg.id !== 'string' || typeof msg.method !== 'string') {\n        return null;\n      }\n      return msg as unknown as RpcRequestMessage;\n    case 'blink:rpc-response':\n      if (typeof msg.id !== 'string') return null;\n      return msg as unknown as RpcResponseMessage;\n    case 'blink:rpc-event':\n      if (typeof msg.uuid !== 'string' || typeof msg.event !== 'string' || !Array.isArray(msg.args)) {\n        return null;\n      }\n      return msg as unknown as RpcEventMessage;\n    case 'blink:resolve-by-flag':\n      if (typeof msg.id !== 'string' || !Array.isArray(msg.flags)) return null;\n      // Defensive: every flag must be a non-empty string. Reject the\n      // whole message rather than silently filtering to keep the\n      // request/response semantics honest.\n      if (!msg.flags.every((f) => typeof f === 'string' && f.length > 0)) return null;\n      return msg as unknown as ResolveByFlagRequestMessage;\n    case 'blink:resolve-by-flag-response':\n      if (typeof msg.id !== 'string') return null;\n      // `match` may be null or an object with rdns/uuid/flag; the\n      // caller validates the inner shape.\n      if (msg.match !== null && (typeof msg.match !== 'object' || !msg.match)) return null;\n      return msg as unknown as ResolveByFlagResponseMessage;\n    default:\n      return null;\n  }\n}\n","// ── Wallet Bridge RPC Host (parent-frame) ──────────────────────────────\n//\n// Exposes top-frame EIP-1193 providers to the cross-origin iframe over\n// `postMessage`. Built on top of `WalletDiscovererHandle` (the EIP-6963\n// registry) and the wire protocol in `protocol.ts`.\n//\n// Security model:\n//   - Origin-pinned: only `event.origin === iframeOrigin` is honored.\n//   - Source-pinned: only messages whose `event.source === iframeWindow`\n//     are honored (defends against rogue iframes on the same page).\n//   - Method allowlist: anything outside `ALLOWED_RPC_METHODS` rejects\n//     with JSON-RPC `-32601 Method not allowed`. Defense in depth — the\n//     iframe SDK is trusted, but we don't want a future SDK regression\n//     to expose, say, `eth_signTransaction` (offline signing) by accident.\n//\n// Backwards-compat: this host responds to `blink:bridge-hello` with the\n// current advertisement. Old iframes never send the hello and never send\n// `blink:rpc-request`, so the host is silent for them.\n\nimport type { WalletDiscovererHandle, RegisteredProvider } from './discover.ts';\nimport {\n  ALLOWED_RPC_METHODS,\n  BRIDGE_PROTOCOL_VERSION,\n  FORWARDED_PROVIDER_EVENTS,\n  parseBridgeMessage,\n  type AdvertisedWallet,\n  type EIP1193Provider,\n  type ResolveByFlagMatch,\n  type ResolveByFlagResponseMessage,\n  type RpcEventMessage,\n  type RpcResponseMessage,\n  type WalletsAdvertisedMessage,\n  type ForwardedProviderEvent,\n} from './protocol.ts';\n\nexport interface RpcHostHandle {\n  /** Tear down listeners and unsubscribe from all bridged providers. */\n  detach(): void;\n}\n\nexport interface RpcHostOptions {\n  /** Cross-origin iframe window we're talking to. */\n  iframeWindow: Window;\n  /** Origin of the iframe — origin-pin all postMessage send/receive. */\n  iframeOrigin: string;\n  /** Discoverer providing the EIP-6963 provider registry. */\n  discoverer: WalletDiscovererHandle;\n  /** Optional debug logger; defaults to a no-op. */\n  log?: (message: string, data?: Record<string, unknown>) => void;\n}\n\ninterface SubscriptionRecord {\n  provider: EIP1193Provider;\n  listeners: Map<ForwardedProviderEvent, (...args: unknown[]) => void>;\n}\n\n/**\n * Attach an RPC host to the given iframe. Listens on `window` for\n * messages from the iframe and routes allowlisted JSON-RPC calls to the\n * matching top-frame EIP-1193 provider.\n */\nexport function attachRpcHost(options: RpcHostOptions): RpcHostHandle {\n  const { iframeWindow, iframeOrigin, discoverer } = options;\n  const log = options.log ?? noopLog;\n\n  if (typeof window === 'undefined') {\n    return { detach: () => {} };\n  }\n\n  let detached = false;\n  const subscriptions = new Map<string, SubscriptionRecord>();\n  const unsubscribeFromDiscoverer = discoverer.subscribe((snapshot) => {\n    if (detached) return;\n    advertiseWallets(snapshot);\n  });\n\n  function postToIframe(message: object): void {\n    if (detached) return;\n    try {\n      iframeWindow.postMessage(message, iframeOrigin);\n    } catch (err) {\n      log('postMessage to iframe failed', {\n        error: err instanceof Error ? err.message : String(err),\n      });\n    }\n  }\n\n  // Advertised-list fingerprint of the last `blink:wallets-advertised`\n  // post. Wallets re-announce fresh provider instances on EIP-6963\n  // resweeps, which changes the discoverer registry (RPC routing must use\n  // the newest instance) without changing the advertised POJO list — those\n  // must not be re-broadcast, since each one rebuilds the iframe's wagmi\n  // config and can orphan an in-flight connect.\n  let lastAdvertisedKey: string | null = null;\n\n  function advertiseWallets(snapshot: RegisteredProvider[], opts?: { force?: boolean }): void {\n    const wallets: AdvertisedWallet[] = snapshot.map((entry) => ({\n      uuid: entry.info.uuid,\n      rdns: entry.info.rdns,\n      name: entry.info.name,\n      icon: entry.info.icon,\n    }));\n    const key = JSON.stringify(wallets.map((w) => [w.uuid, w.rdns, w.name, w.icon]));\n    // `force` is the bridge-hello handshake ack — the iframe's\n    // `bridgeAvailable` flag depends on it, so it always posts.\n    if (!opts?.force && key === lastAdvertisedKey) {\n      log('skipping identical re-advertisement', { count: wallets.length });\n      return;\n    }\n    lastAdvertisedKey = key;\n    // eslint-disable-next-line no-console\n    console.info('[blink-bridge:parent] advertising wallets', wallets.map((w) => ({\n      rdns: w.rdns,\n      name: w.name,\n    })));\n    const message: WalletsAdvertisedMessage = {\n      type: 'blink:wallets-advertised',\n      protocolVersion: BRIDGE_PROTOCOL_VERSION,\n      wallets,\n    };\n    postToIframe(message);\n  }\n\n  function ensureSubscription(uuid: string, provider: EIP1193Provider): void {\n    if (subscriptions.has(uuid)) return;\n    if (typeof provider.on !== 'function') {\n      // No event support — record an empty subscription so we don't keep\n      // re-checking on every request.\n      subscriptions.set(uuid, { provider, listeners: new Map() });\n      return;\n    }\n    const record: SubscriptionRecord = { provider, listeners: new Map() };\n    for (const event of FORWARDED_PROVIDER_EVENTS) {\n      const listener = (...args: unknown[]) => {\n        const eventMessage: RpcEventMessage = {\n          type: 'blink:rpc-event',\n          protocolVersion: BRIDGE_PROTOCOL_VERSION,\n          uuid,\n          event,\n          args,\n        };\n        postToIframe(eventMessage);\n      };\n      try {\n        provider.on(event, listener);\n        record.listeners.set(event, listener);\n      } catch (err) {\n        log(`provider.on('${event}') threw — skipping that event`, {\n          uuid,\n          error: err instanceof Error ? err.message : String(err),\n        });\n      }\n    }\n    subscriptions.set(uuid, record);\n  }\n\n  function unsubscribeAll(): void {\n    for (const [, record] of subscriptions) {\n      const provider = record.provider;\n      if (typeof provider.removeListener !== 'function') continue;\n      for (const [event, listener] of record.listeners) {\n        try {\n          provider.removeListener(event, listener);\n        } catch {\n          // Provider close may have already cleaned up — safe to ignore.\n        }\n      }\n    }\n    subscriptions.clear();\n  }\n\n  function sendError(id: string, code: number, message: string, data?: unknown): void {\n    const response: RpcResponseMessage = {\n      type: 'blink:rpc-response',\n      protocolVersion: BRIDGE_PROTOCOL_VERSION,\n      id,\n      error: data === undefined ? { code, message } : { code, message, data },\n    };\n    postToIframe(response);\n  }\n\n  function sendResult(id: string, result: unknown): void {\n    const response: RpcResponseMessage = {\n      type: 'blink:rpc-response',\n      protocolVersion: BRIDGE_PROTOCOL_VERSION,\n      id,\n      result,\n    };\n    postToIframe(response);\n  }\n\n  const onMessage = (event: MessageEvent) => {\n    if (detached) return;\n    if (event.source !== iframeWindow) return;\n    if (event.origin !== iframeOrigin) return;\n    const message = parseBridgeMessage(event.data);\n    if (!message) return;\n\n    switch (message.type) {\n      case 'blink:bridge-hello': {\n        // New-protocol iframe is asking \"are you there?\" Reply with the\n        // current registry, even if empty. The iframe uses this to flip\n        // its `bridgeAvailable` flag.\n        advertiseWallets(discoverer.list(), { force: true });\n        // Some wallets only finish wiring up after page load — re-request\n        // EIP-6963 announcements once the iframe is alive too.\n        discoverer.requestProviders();\n        return;\n      }\n      case 'blink:rpc-request': {\n        const { id, uuid, method, params } = message;\n        // eslint-disable-next-line no-console\n        console.info('[blink-bridge:parent] rpc-request', { uuid, method });\n        if (!ALLOWED_RPC_METHODS.has(method)) {\n          log('rejecting non-allowlisted method', { uuid, method });\n          sendError(id, -32601, `Method not allowed: ${method}`);\n          return;\n        }\n        const provider = discoverer.get(uuid);\n        if (!provider) {\n          log('no provider for uuid', { uuid, method });\n          sendError(id, -32602, `Unknown wallet: ${uuid}`);\n          return;\n        }\n        ensureSubscription(uuid, provider);\n        provider\n          .request({ method, params })\n          .then((result) => {\n            // eslint-disable-next-line no-console\n            console.info('[blink-bridge:parent] rpc-result', { uuid, method, ok: true });\n            sendResult(id, result);\n          })\n          .catch((err: unknown) => {\n            const { code, message: errMessage, data } = normalizeProviderError(err);\n            // eslint-disable-next-line no-console\n            console.info('[blink-bridge:parent] rpc-error', { uuid, method, code, message: errMessage });\n            sendError(id, code, errMessage, data);\n          });\n        return;\n      }\n      case 'blink:resolve-by-flag': {\n        const match = resolveByFlag(discoverer.list(), message.flags, log);\n        // eslint-disable-next-line no-console\n        console.info('[blink-bridge:parent] resolveByFlag', {\n          flags: message.flags,\n          match: match ? { rdns: match.rdns, flag: match.flag } : null,\n        });\n        const response: ResolveByFlagResponseMessage = {\n          type: 'blink:resolve-by-flag-response',\n          protocolVersion: BRIDGE_PROTOCOL_VERSION,\n          id: message.id,\n          match,\n        };\n        postToIframe(response);\n        return;\n      }\n      case 'blink:wallets-advertised':\n      case 'blink:rpc-response':\n      case 'blink:rpc-event':\n      case 'blink:resolve-by-flag-response':\n        // These are parent → iframe messages. If we receive them, the\n        // peer is misconfigured — ignore.\n        return;\n    }\n  };\n\n  window.addEventListener('message', onMessage);\n\n  return {\n    detach() {\n      if (detached) return;\n      detached = true;\n      window.removeEventListener('message', onMessage);\n      unsubscribeFromDiscoverer();\n      unsubscribeAll();\n    },\n  };\n}\n\nfunction noopLog(): void {}\n\n/**\n * Walk the registered providers and return the first that has any of\n * the requested flags set as a truthy property (e.g. `isUniswapWallet`,\n * `isRainbow`). Used by the iframe to resolve Reown registry entries\n * that lack `rdns` but ship an `injectedId` flag.\n *\n * Per-provider reads are wrapped in try/catch because some wallets\n * proxy `window.ethereum` and throw on unknown property access.\n */\nfunction resolveByFlag(\n  snapshot: RegisteredProvider[],\n  flags: string[],\n  log: (message: string, data?: Record<string, unknown>) => void,\n): ResolveByFlagMatch | null {\n  for (const flag of flags) {\n    for (const entry of snapshot) {\n      let value: unknown;\n      try {\n        value = (entry.provider as unknown as Record<string, unknown>)[flag];\n      } catch (err) {\n        log('provider threw on flag read — skipping', {\n          rdns: entry.info.rdns,\n          flag,\n          error: err instanceof Error ? err.message : String(err),\n        });\n        continue;\n      }\n      if (value) {\n        return { rdns: entry.info.rdns, uuid: entry.info.uuid, flag };\n      }\n    }\n  }\n  return null;\n}\n\ninterface NormalizedProviderError {\n  code: number;\n  message: string;\n  data?: unknown;\n}\n\n/**\n * Coerce whatever an EIP-1193 provider threw into a JSON-RPC-shaped\n * error. Most wallets already throw `{ code, message, data? }`; we just\n * shape it. Anything else gets a generic -32603 (internal error).\n */\nfunction normalizeProviderError(err: unknown): NormalizedProviderError {\n  if (err && typeof err === 'object') {\n    const e = err as Record<string, unknown>;\n    const code = typeof e.code === 'number' ? e.code : -32603;\n    const message =\n      typeof e.message === 'string'\n        ? e.message\n        : err instanceof Error\n          ? err.message\n          : 'Provider error';\n    const data = 'data' in e ? e.data : undefined;\n    return data === undefined ? { code, message } : { code, message, data };\n  }\n  return { code: -32603, message: typeof err === 'string' ? err : 'Provider error' };\n}\n","// ── Merchant-page viewport metrics for the fluid layout ──────────────\n//\n// The fluid iframe fills the overlay (`position: fixed; inset: 0`), which on\n// iOS tracks the *current* viewport — it shrinks and grows as the browser's\n// collapsible chrome (URL bar) shows and hides. Inside the iframe, `dvh`\n// therefore resolves against that moving target, while the legacy\n// parent-side sheet was sized with `79vh` = 79% of the *large* viewport\n// (chrome hidden) — a constant. Only the merchant page can measure the\n// large viewport and its safe-area inset, so the SDK probes them here and\n// ships them to the hosted flow (URL params at creation, `blink:viewport`\n// messages on resize/orientation change).\n\nexport interface ViewportMetrics {\n  /** Merchant page's large-viewport height (100lvh) in CSS px, rounded. */\n  viewportLvh: number;\n  /** Merchant page's `env(safe-area-inset-bottom)` in CSS px, rounded. */\n  safeAreaBottom: number;\n}\n\n/**\n * Measure via a hidden fixed probe. `100lvh` needs iOS 15.4+/Chrome 108+;\n * on older browsers the declaration is dropped and the probe collapses to\n * zero height, so `window.innerHeight` (the current viewport) is used\n * instead — a degraded but sane basis. Returns zeros outside a DOM.\n */\nexport function measureViewportMetrics(): ViewportMetrics {\n  const unavailable: ViewportMetrics = { viewportLvh: 0, safeAreaBottom: 0 };\n  if (\n    typeof document === 'undefined' ||\n    typeof window === 'undefined' ||\n    typeof window.getComputedStyle !== 'function' ||\n    !document.body\n  ) {\n    return unavailable;\n  }\n\n  // Measurement is a nicety — it must never break the payment flow. Any\n  // DOM surprise (exotic embeds, sandboxed contexts) degrades to zeros,\n  // which callers treat as \"metrics unavailable\".\n  try {\n    const probe = document.createElement('div');\n    probe.style.cssText =\n      'position:fixed;top:0;left:0;width:0;visibility:hidden;pointer-events:none;' +\n      'height:100lvh;padding-bottom:env(safe-area-inset-bottom,0px)';\n    document.body.appendChild(probe);\n\n    let viewportLvh = 0;\n    let safeAreaBottom = 0;\n    try {\n      const computed = window.getComputedStyle(probe);\n      viewportLvh = Math.round(Number.parseFloat(computed.height) || 0);\n      safeAreaBottom = Math.round(Number.parseFloat(computed.paddingBottom) || 0);\n    } finally {\n      probe.remove();\n    }\n\n    if (viewportLvh <= 0) {\n      // `100lvh` needs iOS 15.4+/Chrome 108+; older browsers drop the\n      // declaration and the probe collapses. The current viewport is a\n      // degraded but sane basis there.\n      viewportLvh = Math.round(window.innerHeight || 0);\n    }\n\n    return { viewportLvh, safeAreaBottom };\n  } catch {\n    return unavailable;\n  }\n}\n","// ── Shared frame plumbing (presentation-independent) ──────────────────\n//\n// Everything here is common to every way the hosted flow can be presented:\n// the overlay modal (iframe.ts) and the inline embed (embeddedIframe.ts).\n// It deliberately owns the two things that must never be duplicated:\n//\n//   1. The `allow` attribute. Passkey ceremonies are a WebAuthn correctness\n//      and security invariant — a presenter that forgot a delegation, or\n//      spelled an origin differently, would fail silently at the credential\n//      call. One definition, one place.\n//   2. The wallet-bridge attach/detach lifecycle, whose ordering is not\n//      obvious (attach eagerly for browsers that populate `contentWindow`\n//      synchronously, then again on `load` for the cross-origin case).\n//\n// What is NOT here is presentation: backdrops, scroll locks, dismissal,\n// animations, geometry. Those share nothing between the two modes, which is\n// why this is a shared core with thin presenters rather than one function\n// with a mode flag.\n\nimport { createWalletDiscoverer } from './walletBridge/discover.ts';\nimport { attachRpcHost, type RpcHostHandle } from './walletBridge/rpcHost.ts';\nimport { buildRevealMessage, buildViewportMessage } from './messages.ts';\nimport { measureViewportMetrics } from './viewportMetrics.ts';\n\n/** The iframe element plus the origin every message to it must target. */\nexport interface FrameElement {\n  iframe: HTMLIFrameElement;\n  iframeOrigin: string;\n}\n\n/**\n * Create the hosted-flow iframe with the Permissions-Policy delegations the\n * flow needs. `publickey-credentials-*` are required for passkey signup and\n * login; `clipboard-write` for copying deposit addresses; `web-share` for\n * handing a Blink Boost card to the OS share sheet.\n *\n * `web-share` defaults to `self`, so without the delegation the hosted flow's\n * `navigator.canShare({ files })` answers false inside this frame — not because\n * the device cannot share, but because we never asked. On mobile that silently\n * routed the Boost share down the DESKTOP path: no share sheet, no image, just\n * X's web composer in a new tab. There is no way for the hosted flow to detect\n * the difference, which is why the delegation belongs here rather than a\n * fallback there.\n */\nexport function createFrameElement(url: string): FrameElement {\n  const iframe = document.createElement('iframe');\n  iframe.src = url;\n\n  const iframeOrigin = new URL(url).origin;\n  iframe.allow =\n    `publickey-credentials-get ${iframeOrigin}; publickey-credentials-create ${iframeOrigin}; clipboard-write ${iframeOrigin}; web-share ${iframeOrigin}`;\n\n  return { iframe, iframeOrigin };\n}\n\nexport interface FrameBridges {\n  /**\n   * Post `blink:reveal` so the hosted flow plays its entry animation. Safe\n   * before load — the hosted page buffers the signal — and idempotent.\n   */\n  postReveal(): void;\n  /**\n   * Post the host page's viewport metrics (and, in embedded presentation,\n   * the height budget). No-op when the presenter opted out.\n   */\n  postViewportMetrics(): void;\n  detach(): void;\n}\n\nexport interface AttachFrameBridgesOptions extends FrameElement {\n  /**\n   * Whether this presentation needs viewport metrics at all. The legacy\n   * fixed overlay sizes the iframe itself and ignores them; fluid and\n   * embedded both depend on them.\n   */\n  postViewport: boolean;\n  /**\n   * Embedded presentation: the current height budget, read at post time so a\n   * host that changes it mid-flow is picked up by the next resize.\n   */\n  getEmbedMaxHeightPx?: () => number | undefined;\n  /**\n   * Whether a freshly loaded document should be revealed immediately. A\n   * visible-from-birth frame is \"revealed\" as soon as its document exists; a\n   * hidden warm-up waits for an explicit `reveal()`.\n   */\n  shouldRevealOnLoad: () => boolean;\n}\n\n/**\n * Wire up the top-frame wallet bridge, the reveal/viewport message channel,\n * and the host-viewport listeners for one frame.\n *\n * Wallet bridge: discovers EIP-6963 wallets in this frame (Uniswap, Rainbow,\n * and any other extension that doesn't inject into iframes) and exposes them\n * to the hosted flow over postMessage. Old iframes that don't know about the\n * bridge never send a hello; the host stays silent for them — strictly\n * additive behavior.\n */\nexport function attachFrameBridges(options: AttachFrameBridgesOptions): FrameBridges {\n  const { iframe, iframeOrigin, postViewport, getEmbedMaxHeightPx, shouldRevealOnLoad } = options;\n\n  let detached = false;\n\n  const discoverer = createWalletDiscoverer();\n  let rpcHostHandle: RpcHostHandle | null = null;\n\n  const attachBridge = () => {\n    if (rpcHostHandle) return;\n    if (!iframe.contentWindow) return;\n    rpcHostHandle = attachRpcHost({\n      iframeWindow: iframe.contentWindow,\n      iframeOrigin,\n      discoverer,\n    });\n  };\n  // Try once now (some browsers populate contentWindow eagerly) and again on\n  // `load` for the cross-origin case.\n  attachBridge();\n  iframe.addEventListener('load', attachBridge);\n\n  function postReveal(): void {\n    if (detached) return;\n    iframe.contentWindow?.postMessage(buildRevealMessage(), iframeOrigin);\n  }\n\n  function postViewportMetrics(): void {\n    if (detached || !postViewport) return;\n    const metrics = measureViewportMetrics();\n    if (metrics.viewportLvh <= 0) return;\n    iframe.contentWindow?.postMessage(\n      buildViewportMessage(\n        metrics.viewportLvh,\n        metrics.safeAreaBottom,\n        getEmbedMaxHeightPx?.(),\n      ),\n      iframeOrigin,\n    );\n  }\n\n  // Keep the hosted flow's geometry anchored to the host page's large\n  // viewport across rotations and window resizes. rAF-coalesced — iOS fires\n  // resize storms while the browser chrome animates.\n  let viewportPostScheduled = false;\n  const onViewportChange = () => {\n    if (viewportPostScheduled) return;\n    viewportPostScheduled = true;\n    requestAnimationFrame(() => {\n      viewportPostScheduled = false;\n      postViewportMetrics();\n    });\n  };\n  if (postViewport) {\n    window.addEventListener('resize', onViewportChange);\n    window.addEventListener('orientationchange', onViewportChange);\n  }\n\n  // A visible-from-birth frame (no warm-up) is revealed as soon as its\n  // document exists: post the reveal on load so the hosted flow plays its\n  // entry animation without waiting for an explicit reveal() call. The\n  // hosted page treats blink:reveal as idempotent. Viewport metrics ride\n  // along so geometry is settled before first paint even if the URL-param\n  // seed went stale during a slow load.\n  const onLoadReveal = () => {\n    postViewportMetrics();\n    if (shouldRevealOnLoad()) postReveal();\n  };\n  iframe.addEventListener('load', onLoadReveal);\n\n  return {\n    postReveal,\n    postViewportMetrics,\n    detach(): void {\n      if (detached) return;\n      detached = true;\n      iframe.removeEventListener('load', attachBridge);\n      iframe.removeEventListener('load', onLoadReveal);\n      window.removeEventListener('resize', onViewportChange);\n      window.removeEventListener('orientationchange', onViewportChange);\n      if (rpcHostHandle) {\n        rpcHostHandle.detach();\n        rpcHostHandle = null;\n      }\n      discoverer.destroy();\n    },\n  };\n}\n","import { attachFrameBridges, createFrameElement, type FrameBridges } from './iframeCore.ts';\n\nconst STYLE_ID = 'blink-deposit-styles';\n\nconst CLOSE_DURATION_MS = 280;\nconst MOBILE_SHEET_MAX_VIEWPORT_PX = 640;\nconst MOBILE_SHEET_MAX_SCREEN_PX = 900;\n\n// The iframe's color-scheme must be an explicit `light`, not `normal`: normal\n// resolves to the merchant page's default scheme, so a merchant-declared\n// color-scheme:dark makes Chromium see a scheme mismatch with the light hosted\n// document and paint the cross-origin iframe on an opaque white backplate —\n// solid white over the whole viewport instead of the dim showing the page.\nconst STYLES = `\n@keyframes blink-fade-in{from{opacity:0}to{opacity:1}}\n@keyframes blink-fade-out{from{opacity:1}to{opacity:0}}\n@keyframes blink-slide-up{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}\n@keyframes blink-slide-up-full{from{transform:translateY(100%)}to{transform:translateY(0)}}\n@keyframes blink-slide-down-full{from{transform:translateY(0)}to{transform:translateY(100%)}}\n[data-blink-overlay]{position:fixed;inset:0;background:rgba(0,0,0,.6);display:flex;align-items:center;justify-content:center;z-index:2147483647;animation:blink-fade-in .2s ease-out;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}\n[data-blink-overlay][data-blink-closing]{animation:blink-fade-out ${CLOSE_DURATION_MS}ms ease-in forwards;pointer-events:none}\n[data-blink-overlay][data-blink-mobile-sheet]{align-items:flex-end;touch-action:none;overscroll-behavior:contain}\n[data-blink-container]{width:min(420px,92vw);height:min(600px,85vh);border-radius:24px;overflow:hidden;box-shadow:0 24px 80px rgba(0,0,0,.4);animation:blink-slide-up .25s ease-out;display:flex;flex-direction:column;background:transparent}\n[data-blink-overlay][data-blink-closing] [data-blink-container]{opacity:0;transition:opacity ${CLOSE_DURATION_MS}ms ease-in}\n[data-blink-container] iframe{width:100%;flex:1;border:none;display:block;background:transparent;color-scheme:light;border-radius:inherit}\n[data-blink-overlay][data-blink-mobile-sheet] [data-blink-container]{width:100%;max-width:100%;height:79vh;border-radius:24px 24px 0 0;box-shadow:0 -8px 40px rgba(0,0,0,.25);animation:blink-slide-up-full .35s cubic-bezier(.32,.72,0,1);padding-bottom:env(safe-area-inset-bottom,0px)}\n[data-blink-overlay][data-blink-mobile-sheet][data-blink-closing] [data-blink-container]{opacity:1;animation:blink-slide-down-full ${CLOSE_DURATION_MS}ms ease-in forwards}\n@media(max-width:${MOBILE_SHEET_MAX_VIEWPORT_PX}px){[data-blink-overlay]{align-items:flex-end;touch-action:none;overscroll-behavior:contain}[data-blink-container]{width:100%;max-width:100%;height:79vh;border-radius:24px 24px 0 0;box-shadow:0 -8px 40px rgba(0,0,0,.25);animation:blink-slide-up-full .35s cubic-bezier(.32,.72,0,1);padding-bottom:env(safe-area-inset-bottom,0px)}[data-blink-overlay][data-blink-closing] [data-blink-container]{opacity:1;animation:blink-slide-down-full ${CLOSE_DURATION_MS}ms ease-in forwards}}\n[data-blink-overlay][data-blink-fluid] [data-blink-container],[data-blink-overlay][data-blink-fluid][data-blink-mobile-sheet] [data-blink-container]{width:100%;max-width:100%;height:100%;max-height:100%;border-radius:0;box-shadow:none;animation:none;background:transparent;padding-bottom:0}\n[data-blink-overlay][data-blink-fluid][data-blink-closing] [data-blink-container]{animation:none;transition:none;opacity:1}\n`;\n\nexport interface IframeHandle {\n  readonly contentWindow: Window | null;\n  close(): void;\n  isClosed(): boolean;\n  isHidden(): boolean;\n  /**\n   * Make a `hidden: true` overlay visible: re-evaluates the mobile-sheet\n   * layout for the current viewport, locks body scroll, and attaches the\n   * backdrop/Escape dismissal listeners. No-op when already visible or\n   * closed. The iframe element is never reparented — moving an iframe in the\n   * DOM reloads it, which would throw away the warmed-up document.\n   */\n  reveal(): void;\n  /**\n   * Post `blink:reveal` to the hosted flow so it plays its entry animation\n   * (fluid mode renders the card chrome inside the iframe). Safe to call\n   * before the iframe has loaded — the hosted page buffers the signal, and\n   * `createIframe` re-posts on the iframe `load` event while visible.\n   */\n  postReveal(): void;\n  /**\n   * Revert a fluid overlay to the legacy fixed-size container by removing\n   * `data-blink-fluid` — pure CSS, the iframe is never reparented (moving an\n   * iframe in the DOM reloads it). Used when the hosted flow's ready message\n   * does not advertise the `layout-fluid` capability (an older webview\n   * deployment), so it renders fill-mode into the fixed container as today.\n   */\n  downgradeToFixed(): void;\n  /**\n   * Embedded presentation only: size the inline iframe element to the height\n   * the hosted flow just reported. No-op for the overlay, whose geometry is\n   * viewport-derived and owned by CSS.\n   */\n  applyContentHeight(heightPx: number): void;\n  onClose(callback: () => void): void;\n  destroy(): void;\n}\n\nexport interface CreateIframeOptions {\n  /**\n   * Create the overlay invisible (`display: none`) for background warm-up:\n   * the iframe document loads normally, but there is no backdrop, no body\n   * scroll-lock, and no dismissal listeners until `reveal()` is called.\n   */\n  hidden?: boolean;\n  /**\n   * Full-viewport transparent container: the card/sheet chrome (size, radius,\n   * shadow, entry/exit animations) is rendered by the hosted flow inside the\n   * iframe instead of by this overlay. The dim + blur backdrop stays on the\n   * overlay — an iframe cannot `backdrop-filter` the page behind itself.\n   * Requires a webview that understands `layout=fluid`; pair with\n   * `downgradeToFixed()` when the ready handshake lacks the capability.\n   */\n  fluid?: boolean;\n}\n\n/**\n * Create a modal overlay with a cross-origin iframe pointing to the hosted\n * checkout flow. The iframe has the Permissions-Policy attributes required\n * for WebAuthn passkey ceremonies.\n *\n * The overlay is dismissed when the user clicks the backdrop, presses\n * Escape, or the hosted flow sends a `blink:close-request` postMessage.\n */\nexport function createIframe(\n  url: string,\n  containerElement?: HTMLElement,\n  options?: CreateIframeOptions,\n): IframeHandle {\n  ensureStyles();\n\n  let closed = false;\n  let hidden = options?.hidden === true;\n  let closeCallback: (() => void) | null = null;\n\n  const overlay = document.createElement('div');\n  overlay.setAttribute('data-blink-overlay', '');\n  if (shouldUseMobileSheetLayout()) {\n    overlay.setAttribute('data-blink-mobile-sheet', '');\n  }\n  if (options?.fluid) {\n    overlay.setAttribute('data-blink-fluid', '');\n  }\n  if (hidden) {\n    overlay.style.display = 'none';\n  }\n\n  const container = document.createElement('div');\n  container.setAttribute('data-blink-container', '');\n\n  const { iframe, iframeOrigin } = createFrameElement(url);\n\n  const handle = document.createElement('div');\n\n  container.appendChild(handle);\n  container.appendChild(iframe);\n  overlay.appendChild(container);\n\n  const mountTarget = containerElement ?? document.body;\n  mountTarget.appendChild(overlay);\n\n  const bridges: FrameBridges = attachFrameBridges({\n    iframe,\n    iframeOrigin,\n    // Only fluid needs them: the legacy fixed overlay sizes the iframe itself.\n    postViewport: options?.fluid === true,\n    shouldRevealOnLoad: () => !hidden,\n  });\n\n  let savedOverflow = '';\n  let scrollLocked = false;\n\n  const onBackdropClick = (event: MouseEvent) => {\n    if (event.target === overlay) triggerClose();\n  };\n\n  const onKeyDown = (event: KeyboardEvent) => {\n    if (event.key === 'Escape') triggerClose();\n  };\n\n  const onTouchMove = (event: TouchEvent) => {\n    if (event.target === overlay) event.preventDefault();\n  };\n\n  function lockScroll(): void {\n    if (scrollLocked) return;\n    scrollLocked = true;\n    savedOverflow = document.body.style.overflow;\n    document.body.style.overflow = 'hidden';\n  }\n\n  function attachDismissalListeners(): void {\n    overlay.addEventListener('click', onBackdropClick);\n    overlay.addEventListener('touchmove', onTouchMove, { passive: false });\n    document.addEventListener('keydown', onKeyDown);\n  }\n\n  // Hidden warm-up overlays must not trap Escape/scroll while invisible —\n  // the host page doesn't know they exist yet.\n  if (!hidden) {\n    lockScroll();\n    attachDismissalListeners();\n  }\n\n  function removeListeners(): void {\n    overlay.removeEventListener('click', onBackdropClick);\n    overlay.removeEventListener('touchmove', onTouchMove);\n    document.removeEventListener('keydown', onKeyDown);\n  }\n\n  function unlockScroll(): void {\n    if (!scrollLocked) return;\n    scrollLocked = false;\n    document.body.style.overflow = savedOverflow;\n  }\n\n  function triggerClose(): void {\n    if (closed) return;\n    closed = true;\n    removeListeners();\n    bridges.detach();\n\n    overlay.setAttribute('data-blink-closing', '');\n\n    let removed = false;\n    const removeOverlay = () => {\n      if (removed) return;\n      removed = true;\n      overlay.remove();\n      unlockScroll();\n      closeCallback?.();\n    };\n\n    container.addEventListener('animationend', removeOverlay, { once: true });\n    setTimeout(removeOverlay, CLOSE_DURATION_MS + 50);\n  }\n\n  return {\n    get contentWindow(): Window | null {\n      return iframe.contentWindow;\n    },\n\n    close(): void {\n      triggerClose();\n    },\n\n    isClosed(): boolean {\n      return closed;\n    },\n\n    isHidden(): boolean {\n      return hidden;\n    },\n\n    reveal(): void {\n      if (closed || !hidden) return;\n      hidden = false;\n      // The viewport may have changed (resize/rotation) since the hidden\n      // warm-up overlay was created — re-evaluate the sheet layout now.\n      if (shouldUseMobileSheetLayout()) {\n        overlay.setAttribute('data-blink-mobile-sheet', '');\n      } else {\n        overlay.removeAttribute('data-blink-mobile-sheet');\n      }\n      overlay.style.display = '';\n      lockScroll();\n      attachDismissalListeners();\n      bridges.postViewportMetrics();\n      bridges.postReveal();\n    },\n\n    postReveal(): void {\n      bridges.postReveal();\n    },\n\n    downgradeToFixed(): void {\n      overlay.removeAttribute('data-blink-fluid');\n    },\n\n    applyContentHeight(): void {\n      // The overlay's card is sized by CSS against the viewport; content\n      // height reports are an embedded-only channel and never arrive here.\n    },\n\n    onClose(callback: () => void): void {\n      closeCallback = callback;\n    },\n\n    destroy(): void {\n      closeCallback = null;\n      if (!closed) {\n        closed = true;\n        removeListeners();\n        bridges.detach();\n        overlay.remove();\n        unlockScroll();\n      }\n    },\n  };\n}\n\nfunction ensureStyles(): void {\n  const existingStyle = document.getElementById(STYLE_ID);\n  if (existingStyle) {\n    if (existingStyle.textContent !== STYLES) {\n      existingStyle.textContent = STYLES;\n    }\n    return;\n  }\n  const style = document.createElement('style');\n  style.id = STYLE_ID;\n  style.textContent = STYLES;\n  document.head.appendChild(style);\n}\n\n/**\n * Whether this device should get the mobile bottom sheet rather than the\n * centered desktop card. Narrow viewport, or a coarse pointer on a\n * phone-sized screen.\n *\n * Also the predicate `checkout.ts` uses to decide that an *embedded* flow\n * presents as a normal overlay on mobile — one rule for \"this is a phone\", so\n * the presentation and the sheet chrome inside it can never disagree.\n */\nexport function shouldUseMobileSheetLayout(): boolean {\n  if (typeof window === 'undefined') return false;\n\n  if (window.matchMedia?.(`(max-width: ${MOBILE_SHEET_MAX_VIEWPORT_PX}px)`).matches) {\n    return true;\n  }\n\n  const viewportWidth = window.visualViewport?.width ?? window.innerWidth;\n  if (viewportWidth > 0 && viewportWidth <= MOBILE_SHEET_MAX_VIEWPORT_PX) {\n    return true;\n  }\n\n  const hasCoarsePointer = window.matchMedia?.('(pointer: coarse)').matches ?? false;\n  if (!hasCoarsePointer) {\n    return false;\n  }\n\n  const shortestScreenSide = Math.min(window.screen.width, window.screen.height);\n  return shortestScreenSide > 0 && shortestScreenSide <= MOBILE_SHEET_MAX_SCREEN_PX;\n}\n","// ── Embedded presentation ─────────────────────────────────────────────\n//\n// Mounts the hosted flow INLINE inside a host widget — a payment-method\n// aggregator listing Blink beside Card / Bank / Wallet — instead of as a\n// full-viewport modal.\n//\n// What this deliberately does NOT do, and why:\n//\n//   • No overlay, backdrop, blur, or z-index. There is nothing to dim; the\n//     host's own panel is the surface.\n//   • No body scroll lock. The host already owns page scroll (an aggregator\n//     opening its widget in a dialog has typically locked it), and a second\n//     lock would fight theirs on teardown.\n//   • No backdrop-click or document-level Escape dismissal. Inline, \"the user\n//     pressed Escape\" is the host's event to interpret, not ours — stealing\n//     it would close Blink out from under a host that meant to close its own\n//     dialog. The in-flow close control still posts `blink:close-request`.\n//   • No close animation. There is no card flying out; the host removes the\n//     element or animates its own panel.\n//   • No mobile-sheet heuristic. Inside a host widget the device signals\n//     describe the device, not the slot — a narrow embed on a wide desktop\n//     would otherwise present as a swipeable bottom sheet.\n//\n// Height is the one thing this presenter actively manages: the hosted flow\n// reports its rendered card height and we size the iframe element to match.\n\nimport { attachFrameBridges, createFrameElement, type FrameBridges } from './iframeCore.ts';\nimport type { IframeHandle } from './iframe.ts';\n\nconst EMBED_STYLE_ID = 'blink-deposit-embed-styles';\n\n// Scoped to `[data-blink-embed]` and injected only by this presenter, so a\n// merchant using the overlay never receives embed CSS and an aggregator never\n// receives a `position: fixed; z-index: 2147483647` rule for an overlay that\n// will never exist on their page.\n//\n// `color-scheme: light` is pinned for the same reason as the overlay: left at\n// `normal` it resolves to the host page's scheme, and a host declaring\n// `color-scheme: dark` makes Chromium see a mismatch against the light hosted\n// document and paint an opaque backplate behind the cross-origin iframe.\n//\n// The hidden warm-up state is `visibility: hidden` + a clipped zero-height\n// wrapper, NOT `display: none`: a display:none subtree has no layout at all,\n// so the flow inside could not measure itself and would report a height of\n// zero the moment it was revealed.\nconst EMBED_STYLES = `\n[data-blink-embed]{display:block;width:100%;position:relative}\n[data-blink-embed][data-blink-embed-hidden]{height:0;overflow:hidden;visibility:hidden;pointer-events:none}\n[data-blink-embed] iframe{display:block;width:100%;height:0;border:none;background:transparent;color-scheme:light}\n`;\n\nexport interface CreateEmbeddedIframeOptions {\n  /**\n   * Create the frame invisible for background warm-up: the document loads\n   * normally but occupies no space in the host's layout and cannot be\n   * interacted with until `reveal()`.\n   */\n  hidden?: boolean;\n  /**\n   * Hard cap on the iframe element's height, in CSS px. Reported content\n   * heights are clamped to it, and it rides along on the viewport message as\n   * the basis the flow sizes against.\n   *\n   * A function is re-read on every post, so a budget derived from the host\n   * viewport stays correct across rotation and window resizes. A plain number\n   * is fixed for the life of the frame.\n   */\n  embedMaxHeightPx?: number | (() => number | undefined);\n}\n\n/**\n * Create an inline cross-origin iframe pointing at the hosted flow, mounted\n * into the host's element. Returns the same {@link IframeHandle} shape as the\n * overlay presenter so the `Deposit` lifecycle is presentation-agnostic.\n */\nexport function createEmbeddedIframe(\n  url: string,\n  containerElement: HTMLElement,\n  options?: CreateEmbeddedIframeOptions,\n): IframeHandle {\n  ensureEmbedStyles();\n\n  // The instance holds this node for its whole life and re-warms a fresh\n  // hidden iframe into it after every close. If the host unmounted it (a\n  // `{open && …}` around the slot is the usual cause), everything from here on\n  // renders into an orphan: the first flow works, every later one is blank,\n  // and nothing throws. Say so — a silent blank panel is close to\n  // undiagnosable from the outside.\n  if (!containerElement.isConnected) {\n    console.warn(\n      '[blink] The containerElement passed to Deposit is not in the document. '\n      + 'Embedded mode renders into it for the life of the instance, so it must '\n      + 'be a stable node — render the slot once and hide it with '\n      + '`visibility: hidden` (NOT `display: none`, which removes its layout and '\n      + 'leaves the warming flow unable to measure itself) instead of unmounting '\n      + 'it, or construct a new Deposit against the new node.',\n    );\n  }\n\n  let closed = false;\n  let hidden = options?.hidden === true;\n  let closeCallback: (() => void) | null = null;\n  const readEmbedMaxHeightPx = (): number | undefined =>\n    typeof options?.embedMaxHeightPx === 'function'\n      ? options.embedMaxHeightPx()\n      : options?.embedMaxHeightPx;\n\n  const wrapper = document.createElement('div');\n  wrapper.setAttribute('data-blink-embed', '');\n  if (hidden) {\n    wrapper.setAttribute('data-blink-embed-hidden', '');\n  }\n\n  const { iframe, iframeOrigin } = createFrameElement(url);\n  // The card owns its own internal scroll, and the frame is sized to the\n  // card, so the frame itself must never scroll. Without this a growth\n  // transient (content briefly taller than the last applied height) puts a\n  // root scrollbar in the frame; on Windows/Linux that is ~15px of\n  // layout-consuming width, which rewraps the card and changes the very\n  // height we are converging on. Stripe's embedded checkout sets the same\n  // attribute for the same reason.\n  iframe.setAttribute('scrolling', 'no');\n  // Start at the host's budget rather than the stylesheet's 0. The flow\n  // reports its real height as soon as it paints and this shrinks to fit, but\n  // starting at zero would mean a visible collapsed frame for however long\n  // the document takes to boot — and if a deployment never reports at all,\n  // the budget is a correct, usable height rather than an invisible widget.\n  const initialBudget = readEmbedMaxHeightPx();\n  if (initialBudget !== undefined) {\n    iframe.style.height = `${initialBudget}px`;\n  }\n  wrapper.appendChild(iframe);\n  containerElement.appendChild(wrapper);\n\n  const bridges: FrameBridges = attachFrameBridges({\n    iframe,\n    iframeOrigin,\n    // Embedded always needs them: the flow has no usable viewport of its own,\n    // so the basis it sizes against can only come from here.\n    postViewport: true,\n    getEmbedMaxHeightPx: readEmbedMaxHeightPx,\n    shouldRevealOnLoad: () => !hidden,\n  });\n\n  function teardown(): void {\n    closed = true;\n    bridges.detach();\n    wrapper.remove();\n  }\n\n  return {\n    get contentWindow(): Window | null {\n      return iframe.contentWindow;\n    },\n\n    close(): void {\n      if (closed) return;\n      teardown();\n      closeCallback?.();\n    },\n\n    isClosed(): boolean {\n      return closed;\n    },\n\n    isHidden(): boolean {\n      return hidden;\n    },\n\n    reveal(): void {\n      if (closed || !hidden) return;\n      hidden = false;\n      wrapper.removeAttribute('data-blink-embed-hidden');\n      warnIfContainerNotRendered(containerElement);\n      bridges.postViewportMetrics();\n      bridges.postReveal();\n      // Deliberately no focus() call. Focusing an element inside a\n      // cross-origin iframe makes the outer browser scroll it into view,\n      // which yanks the host's page — and inside a focus-trapped dialog it\n      // fights the host's own focus guards.\n    },\n\n    postReveal(): void {\n      bridges.postReveal();\n    },\n\n    downgradeToFixed(): void {\n      // No-op: the fixed container is overlay geometry. There is nothing for\n      // an inline frame to snap back to, and reintroducing a fixed-size card\n      // here would fight the host's own panel.\n    },\n\n    applyContentHeight(heightPx: number): void {\n      if (closed) return;\n      const budget = readEmbedMaxHeightPx();\n      const capped = budget === undefined ? heightPx : Math.min(heightPx, budget);\n      iframe.style.height = `${Math.max(0, Math.round(capped))}px`;\n    },\n\n    onClose(callback: () => void): void {\n      closeCallback = callback;\n    },\n\n    destroy(): void {\n      closeCallback = null;\n      if (!closed) teardown();\n    },\n  };\n}\n\n/**\n * Warns when the flow is being revealed into a container that has no layout —\n * almost always a host hiding its slot with `display: none` between opens.\n *\n * That subtree has no layout at all, so the flow warming inside it cannot\n * measure itself, and the height it reports on reveal is whatever the browser\n * has: nothing. Whether it recovers comes down to whether the host's own display\n * flip lands before this reveal reaches the frame — closing an entire dialog\n * usually wins that race, a panel's own back button usually loses it, and the\n * loser is a blank box at the budget height with nothing in the host's console.\n *\n * Checked at reveal rather than at mount: warming inside a hidden container is\n * fine and expected (the SDK hides its own wrapper with `visibility`), it is\n * being *revealed* while still unrendered that cannot work.\n *\n * `offsetParent` is null for a `display: none` subtree and for `position: fixed`\n * elements, so the zero-rect check carries the verdict and `offsetParent` only\n * distinguishes the cause.\n */\nfunction warnIfContainerNotRendered(containerElement: HTMLElement): void {\n  // Never let a diagnostic break a reveal: a host may hand us something that is\n  // element-like without being a full HTMLElement, and there is nothing to\n  // measure in a non-DOM environment either.\n  if (typeof containerElement.getBoundingClientRect !== 'function') return;\n  const rect = containerElement.getBoundingClientRect();\n  if (rect.width > 0 || rect.height > 0) return;\n  const display = typeof getComputedStyle === 'function'\n    ? getComputedStyle(containerElement).display\n    : '';\n  console.warn(\n    '[blink] The containerElement has no layout at the moment the flow is '\n    + `revealed${display === 'none' ? ' (display: none)' : ''}. A display:none `\n    + 'subtree cannot be measured, so the flow may report no height and the '\n    + 'panel stays blank at its budget height. Hide the slot with '\n    + '`visibility: hidden` (plus `height: 0; overflow: hidden`) instead of '\n    + '`display: none`, so it keeps its box while it warms up.',\n  );\n}\n\nfunction ensureEmbedStyles(): void {\n  const existingStyle = document.getElementById(EMBED_STYLE_ID);\n  if (existingStyle) {\n    if (existingStyle.textContent !== EMBED_STYLES) {\n      existingStyle.textContent = EMBED_STYLES;\n    }\n    return;\n  }\n  const style = document.createElement('style');\n  style.id = EMBED_STYLE_ID;\n  style.textContent = EMBED_STYLES;\n  document.head.appendChild(style);\n}\n","import { DepositError } from './errors.ts';\nimport type { SignerFunction, SignerRequest, SignerResponse } from './types.ts';\n\nconst DEFAULT_SIGNER_TIMEOUT_MS = 15_000;\n\n/**\n * Invoke the merchant signer and return the validated response.\n *\n * When `signer` is a URL string the SDK performs a `POST` with a JSON body.\n * When `signer` is a function the SDK delegates entirely to it.\n * In both cases a timeout wrapper is applied via `timeoutMs`.\n */\nexport async function callSigner(\n  signer: string | SignerFunction,\n  request: SignerRequest,\n  timeoutMs?: number,\n): Promise<SignerResponse> {\n  return invokeSigner(signer, request, timeoutMs, validateSignerResponse);\n}\n\n/**\n * The transport under {@link callSigner}, generic over the request and\n * response shapes so the human-verification flow — a different signer\n * contract with no `preview` — can share the URL/function dispatch, the\n * timeout and the error mapping without inheriting the deposit validation.\n * Errors are `DepositError`s; a caller with its own error type translates.\n */\nexport async function invokeSigner<TRequest, TResponse>(\n  signer: string | ((request: TRequest) => Promise<TResponse>),\n  request: TRequest,\n  timeoutMs: number | undefined,\n  validate: (body: unknown) => asserts body is TResponse,\n): Promise<TResponse> {\n  const timeout = timeoutMs ?? DEFAULT_SIGNER_TIMEOUT_MS;\n\n  const body: unknown =\n    typeof signer === 'function'\n      ? await invokeSignerFunction(signer, request, timeout)\n      : await invokeSignerUrl(signer, request, timeout);\n\n  validate(body);\n  return body;\n}\n\nasync function invokeSignerUrl<TRequest>(\n  signerUrl: string,\n  request: TRequest,\n  timeoutMs: number,\n): Promise<unknown> {\n  let response: Response;\n  const controller = new AbortController();\n  const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n  try {\n    response = await fetch(signerUrl, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(request),\n      signal: controller.signal,\n    });\n  } catch (err) {\n    if (controller.signal.aborted) {\n      throw new DepositError(\n        'SIGNER_TIMEOUT',\n        `Signer did not respond within ${timeoutMs}ms.`,\n      );\n    }\n    throw new DepositError(\n      'SIGNER_NETWORK_ERROR',\n      'Unable to reach the merchant signer. Check the signer URL and network connectivity.',\n    );\n  } finally {\n    clearTimeout(timer);\n  }\n\n  const body = await response.json().catch(() => null) as\n    | { error?: unknown }\n    | null;\n\n  if (!response.ok) {\n    const detail = typeof body?.error === 'string' ? body.error : `Signer returned HTTP ${response.status}.`;\n    throw new DepositError('SIGNER_REQUEST_FAILED', detail);\n  }\n\n  return body;\n}\n\nasync function invokeSignerFunction<TRequest, TResponse>(\n  signer: (request: TRequest) => Promise<TResponse>,\n  request: TRequest,\n  timeoutMs: number,\n): Promise<TResponse> {\n  return new Promise<TResponse>((resolve, reject) => {\n    const timer = setTimeout(\n      () => reject(new DepositError('SIGNER_TIMEOUT', `Signer did not respond within ${timeoutMs}ms.`)),\n      timeoutMs,\n    );\n\n    signer(request).then(\n      (result) => { clearTimeout(timer); resolve(result); },\n      (err) => {\n        clearTimeout(timer);\n        if (err instanceof DepositError) {\n          reject(err);\n        } else {\n          reject(new DepositError(\n            'SIGNER_REQUEST_FAILED',\n            err instanceof Error ? err.message : 'Signer function threw an error.',\n          ));\n        }\n      },\n    );\n  });\n}\n\nfunction validateSignerResponse(body: unknown): asserts body is SignerResponse {\n  const obj = body as Partial<SignerResponse> | null | undefined;\n  if (\n    !obj ||\n    typeof obj.merchantId !== 'string' ||\n    typeof obj.payload !== 'string' ||\n    typeof obj.signature !== 'string' ||\n    !obj.preview ||\n    typeof obj.preview !== 'object'\n  ) {\n    throw new DepositError(\n      'SIGNER_RESPONSE_INVALID',\n      'Signer response is missing required fields (merchantId, payload, signature, preview).',\n    );\n  }\n}\n","import { DepositError } from './errors.ts';\nimport type { DepositRequest, SignerRequest } from './types.ts';\n\nconst EVM_ADDRESS_RE = /^0x[a-fA-F0-9]{40}$/;\nconst TOKEN_ADDRESS_RE = /^0x[a-fA-F0-9]{1,40}$/;\nconst SOLANA_ADDRESS_RE = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;\n\nfunction isValidAddress(value: string): boolean {\n  return EVM_ADDRESS_RE.test(value) || SOLANA_ADDRESS_RE.test(value);\n}\n\nfunction isValidTokenAddress(value: string): boolean {\n  return TOKEN_ADDRESS_RE.test(value) || SOLANA_ADDRESS_RE.test(value);\n}\n\nexport function validateDepositRequest(request: DepositRequest): void {\n  if (request.amount !== null) {\n    if (typeof request.amount !== 'number' || !Number.isFinite(request.amount) || request.amount <= 0) {\n      throw new DepositError('INVALID_REQUEST', 'amount must be a positive number or null.');\n    }\n  }\n\n  const hasTriple = request.chainId !== undefined || request.address !== undefined || request.token !== undefined;\n  const hasMenu = request.destinations !== undefined;\n  if (hasTriple && hasMenu) {\n    throw new DepositError(\n      'INVALID_REQUEST',\n      'Pass either chainId/address/token or destinations, not both.',\n    );\n  }\n  if (!hasTriple && !hasMenu) {\n    throw new DepositError(\n      'INVALID_REQUEST',\n      'Pass chainId, address and token, or a destinations menu.',\n    );\n  }\n\n  if (hasMenu) {\n    validateDestinations(request.destinations as unknown);\n    return;\n  }\n\n  validateDestination(\n    { chainId: request.chainId, address: request.address, token: request.token },\n    '',\n  );\n}\n\nconst MAX_DESTINATIONS = 10;\n\nfunction validateDestination(\n  destination: { chainId?: unknown; address?: unknown; token?: unknown },\n  label: string,\n): void {\n  if (!Number.isInteger(destination.chainId) || (destination.chainId as number) <= 0) {\n    throw new DepositError('INVALID_REQUEST', `chainId must be a positive integer${label}.`);\n  }\n\n  if (typeof destination.address !== 'string' || !isValidAddress(destination.address)) {\n    throw new DepositError(\n      'INVALID_REQUEST',\n      `address must be a valid EVM (0x-prefixed, 40 hex chars) or Solana/Tron (Base58, 32-44 chars) address${label}.`,\n    );\n  }\n\n  if (typeof destination.token !== 'string' || !isValidTokenAddress(destination.token)) {\n    throw new DepositError(\n      'INVALID_REQUEST',\n      `token must be a valid EVM (0x-prefixed hex) or Base58 token address${label}.`,\n    );\n  }\n}\n\n/**\n * A menu is 1–10 well-formed entries with no two sharing a chain and token\n * (EVM token casing ignored). The hosted flow re-validates the signed payload\n * against the same rules; this pre-check exists so a bad menu fails at the\n * call site, in the merchant's own console, before any network round trip.\n */\nfunction validateDestinations(value: unknown): void {\n  if (!Array.isArray(value) || value.length === 0) {\n    throw new DepositError('INVALID_REQUEST', 'destinations must be a non-empty array.');\n  }\n  if (value.length > MAX_DESTINATIONS) {\n    throw new DepositError('INVALID_REQUEST', `destinations may list at most ${MAX_DESTINATIONS} entries.`);\n  }\n  const seen = new Set<string>();\n  value.forEach((entry, index) => {\n    const label = ` (destinations[${index}])`;\n    if (!entry || typeof entry !== 'object') {\n      throw new DepositError('INVALID_REQUEST', `destinations entries must be objects${label}.`);\n    }\n    validateDestination(entry as { chainId?: unknown; address?: unknown; token?: unknown }, label);\n    const { chainId, token } = entry as { chainId: number; token: string };\n    const key = `${chainId}:${token.startsWith('0x') ? token.toLowerCase() : token}`;\n    if (seen.has(key)) {\n      throw new DepositError('INVALID_REQUEST', 'destinations may not list the same chain and token twice.');\n    }\n    seen.add(key);\n  });\n}\n\nexport function buildSignerRequest(request: DepositRequest, webviewBaseUrl: string): SignerRequest {\n  const base: SignerRequest = {\n    amount: request.amount,\n    ...(request.destinations\n      ? { destinations: request.destinations.map((d) => ({ chainId: d.chainId, address: d.address, token: d.token })) }\n      : { chainId: request.chainId, address: request.address, token: request.token }),\n    callbackScheme: request.callbackScheme ?? null,\n    url: webviewBaseUrl,\n    version: 'v1',\n  };\n\n  if (request.reference) base.reference = request.reference;\n  if (request.metadata && Object.keys(request.metadata).length > 0) {\n    base.metadata = request.metadata;\n  }\n\n  return base;\n}\n","import { DepositError } from './errors.ts';\nimport {\n  parseTransferComplete,\n  parseCloseRequest,\n  parseContentHeight,\n  parseIframeReady,\n  buildAckMessage,\n  buildSignedPayloadMessage,\n} from './messages.ts';\nimport { BRAND_COLOR_PARAM_KEYS, normalizeBrandHex } from './brandParam.ts';\nimport { normalizeDisplayBalance } from './balanceParam.ts';\nimport { normalizeMinimumDeposit } from './minimumDepositParam.ts';\nimport { createIframe, shouldUseMobileSheetLayout, type IframeHandle } from './iframe.ts';\nimport { createEmbeddedIframe } from './embeddedIframe.ts';\nimport { measureViewportMetrics } from './viewportMetrics.ts';\nimport { callSigner } from './signer.ts';\nimport { validateDepositRequest, buildSignerRequest } from './validation.ts';\nimport type { DepositConfig, DepositStatus, DepositRequest, DepositResult, SignerResponse } from './types.ts';\n\nexport const DEFAULT_WEBVIEW_BASE_URL = 'https://pay.blink.cash';\nexport const SANDBOX_WEBVIEW_BASE_URL = 'https://pay-sandbox.blink.cash';\n\n/** How long `requestDeposit` waits for `blink:iframe-ready` before falling back to URL params. */\nconst IFRAME_READY_TIMEOUT_MS = 2_000;\n\n/**\n * How long a background warm-up iframe may take to signal ready. Generous on\n * purpose: the warm-up happens while the user hasn't acted yet, so a slow\n * connection finishing at 10s still produces a fully warmed flow. The strict\n * 2s budget only applies once `requestDeposit` is actually waiting.\n */\nconst WARM_IFRAME_READY_TIMEOUT_MS = 60_000;\n\n/**\n * Capability the hosted flow must advertise on `blink:iframe-ready` for the\n * full-viewport fluid layout (card chrome rendered inside the iframe). A\n * ready message without it means an older webview deployment — the overlay\n * is downgraded to the legacy fixed-size container before payload delivery.\n */\nconst LAYOUT_FLUID_CAPABILITY = 'layout-fluid';\n\n/** Fraction of the host viewport used as the default embedded height budget. */\nconst DEFAULT_EMBED_MAX_HEIGHT_FRACTION = 0.9;\n\ninterface IframeReadyResult {\n  ready: boolean;\n  fluidCapable: boolean;\n}\n\n/**\n * The one dismissal error. Every route out of a flow that isn't completion or a\n * failure produces this: the flow's own close control, the overlay backdrop,\n * Escape, and the host calling {@link Deposit.close} — so an integrator writes a\n * single `DEPOSIT_DISMISSED` branch rather than one per affordance.\n */\nfunction dismissedError(): DepositError {\n  return new DepositError(\n    'DEPOSIT_DISMISSED',\n    'The deposit was dismissed before the transfer completed.',\n  );\n}\n\nconst IFRAME_NOT_READY: IframeReadyResult = { ready: false, fluidCapable: false };\n\n/**\n * Resolves the hosted-flow base URL from config.\n *\n * Precedence: explicit `webviewBaseUrl` > `environment: 'sandbox'` > production default.\n */\nexport function resolveWebviewBaseUrl(\n  config: Pick<DepositConfig, 'webviewBaseUrl' | 'environment'>,\n): string {\n  if (config.webviewBaseUrl) return config.webviewBaseUrl;\n  return config.environment === 'sandbox' ? SANDBOX_WEBVIEW_BASE_URL : DEFAULT_WEBVIEW_BASE_URL;\n}\n\ntype EventMap = {\n  complete: (result: DepositResult) => void;\n  error: (error: DepositError) => void;\n  close: () => void;\n  'status-change': (status: DepositStatus) => void;\n  /**\n   * Embedded presentation only: the hosted flow's rendered height changed and\n   * the inline iframe has already been resized to match. Hosts that size their\n   * own panel around the iframe follow it from here.\n   *\n   * `heightPx` fires on every frame of the flow's own height transition —\n   * apply it directly, with NO CSS transition on the host side, or two\n   * independent animations of the same quantity fight each other and the panel\n   * keeps moving after the content has settled.\n   *\n   * `preferredWidthPx` / `minWidthPx` are constants describing the flow's\n   * design envelope, so a host that wants its panel to fit the flow in both\n   * axes can size the width once rather than guessing.\n   */\n  resize: (info: {\n    heightPx: number;\n    preferredWidthPx?: number;\n    minWidthPx?: number;\n  }) => void;\n};\n\ntype EventName = keyof EventMap;\n\n/**\n * Merchant-facing deposit SDK.\n *\n * Opens a hosted payment flow in a modal iframe, communicates with the\n * merchant's signer backend, and resolves when the user completes payment.\n *\n * The iframe has `publickey-credentials-get` and `publickey-credentials-create`\n * permissions (with explicit origin) so WebAuthn passkey ceremonies work\n * cross-origin, including in Safari.\n *\n * ```ts\n * const deposit = new Deposit({ signer: '/api/sign-payment' });\n * const result = await deposit.requestDeposit({ amount: 50, chainId: 8453, address: '0x...', token: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' });\n * ```\n */\nexport class Deposit {\n  private readonly config: DepositConfig;\n  private iframe: IframeHandle | null = null;\n  private hostedOrigin: string | null = null;\n  private messageListener: ((event: MessageEvent) => void) | null = null;\n  private requestId = 0;\n  private destroyed = false;\n  private _status: DepositStatus = 'idle';\n  private _result: DepositResult | null = null;\n  private _error: DepositError | null = null;\n  private flowTimer: ReturnType<typeof setTimeout> | null = null;\n  private lastSignerResponse: SignerResponse | null = null;\n  private warmIframe: IframeHandle | null = null;\n  private warmIframeReady: Promise<IframeReadyResult> | null = null;\n  private warmIframeReadyCancel: (() => void) | null = null;\n  /** Resolved embedded-vs-overlay decision; see {@link Deposit.isEmbedded}. */\n  private embeddedResolved: boolean | null = null;\n  /**\n   * Settles the in-flight `requestDeposit()` as a dismissal. Non-null exactly\n   * while a flow is in progress, so {@link Deposit.close} can reject the promise\n   * the caller is awaiting instead of tearing the frame down under it.\n   */\n  private dismissActiveFlow: (() => void) | null = null;\n  private listeners: { [K in EventName]: Set<EventMap[K]> } = {\n    complete: new Set(),\n    error: new Set(),\n    close: new Set(),\n    'status-change': new Set(),\n    resize: new Set(),\n  };\n\n  /** Current phase of the deposit flow. */\n  get status(): DepositStatus {\n    return this._status;\n  }\n\n  /** Last successful {@link DepositResult}, available when `status === 'completed'`. */\n  get result(): DepositResult | null {\n    return this._result;\n  }\n\n  /** Last {@link DepositError}, available when `status === 'error'`. */\n  get error(): DepositError | null {\n    return this._error;\n  }\n\n  /** Whether a deposit flow is currently in progress (signer loading or iframe open). */\n  get isActive(): boolean {\n    return this._status === 'signer-loading' || this._status === 'iframe-active';\n  }\n\n  /**\n   * How this instance will actually present: `'embedded'` renders inline in\n   * `containerElement`, `'overlay'` covers the page.\n   *\n   * Not simply an echo of the config — a host that asked for `'embedded'` gets\n   * `'overlay'` on mobile, where a phone-sized method panel cannot hold the\n   * flow (see {@link Deposit.isEmbedded}). Read it when laying out the panel:\n   * on `'overlay'` no `resize` event ever fires, so a panel sized from those\n   * reports would sit empty behind the overlay — collapse or skip it.\n   *\n   * Live until the SDK builds its first (warm-up) frame and fixed from then on,\n   * so re-read it on resize rather than caching it at mount.\n   */\n  get presentation(): 'overlay' | 'embedded' {\n    return this.isEmbedded() ? 'embedded' : 'overlay';\n  }\n\n  constructor(config: DepositConfig) {\n    if (!config.signer || (typeof config.signer !== 'string' && typeof config.signer !== 'function')) {\n      throw new DepositError('INVALID_REQUEST', 'DepositConfig.signer is required (URL string or SignerFunction).');\n    }\n    if (config.presentation === 'embedded') {\n      // Required at construction, not at requestDeposit: the warm-up iframe is\n      // created eagerly and can never be relocated afterwards — moving an\n      // iframe in the DOM reloads it, throwing away the warmed document.\n      if (!config.containerElement) {\n        throw new DepositError(\n          'INVALID_REQUEST',\n          'DepositConfig.containerElement is required when presentation is \"embedded\".',\n        );\n      }\n      if (config.layout === 'fixed') {\n        throw new DepositError(\n          'INVALID_REQUEST',\n          'DepositConfig.layout \"fixed\" is an overlay-only escape hatch and cannot be combined with presentation \"embedded\".',\n        );\n      }\n    }\n    this.config = config;\n    this.log('Deposit instance created', {\n      signer: typeof config.signer === 'string' ? config.signer : '<function>',\n    });\n    if (config.preload !== false) {\n      this.schedulePreload();\n    }\n  }\n\n  /**\n   * Warm up the hosted payment flow in a hidden iframe so `requestDeposit`\n   * opens an already-loaded page (JS bundle, auth session restore, and —\n   * when {@link DepositConfig.merchantId} is set — merchant config prefetch\n   * all happen in the background).\n   *\n   * Runs automatically after construction unless `preload: false`; call it\n   * manually to control the timing (e.g. on deposit-button hover). No-op\n   * when a warm iframe already exists or a deposit flow is active.\n   */\n  preload(): void {\n    if (this.destroyed || this.isActive) return;\n    if (this.warmIframe && !this.warmIframe.isClosed()) return;\n    if (typeof document === 'undefined' || typeof window === 'undefined') return;\n\n    const webviewBaseUrl = resolveWebviewBaseUrl(this.config);\n    this.hostedOrigin = this.config.hostedFlowOrigin ?? new URL(webviewBaseUrl).origin;\n\n    const preloadUrl = this.buildPreloadUrl(webviewBaseUrl);\n    const iframe = this.createPresentedIframe(preloadUrl, { hidden: true });\n    const ready = this.waitForIframeReady(iframe, WARM_IFRAME_READY_TIMEOUT_MS);\n    this.warmIframe = iframe;\n    this.warmIframeReady = ready.promise;\n    this.warmIframeReadyCancel = ready.cancel;\n    this.log('Warm-up iframe created', { url: preloadUrl });\n  }\n\n  // Defer the automatic warm-up until the host page has finished its own\n  // load and the main thread is idle — constructing a Deposit instance must\n  // never slow the merchant page down.\n  private schedulePreload(): void {\n    if (typeof window === 'undefined' || typeof document === 'undefined') return;\n\n    const start = () => {\n      if (!this.destroyed && !this.isActive) this.preload();\n    };\n    const whenIdle = () => {\n      const w = window as Window & {\n        requestIdleCallback?: (cb: () => void, opts?: { timeout: number }) => number;\n      };\n      if (typeof w.requestIdleCallback === 'function') {\n        w.requestIdleCallback(start, { timeout: 3_000 });\n      } else {\n        setTimeout(start, 250);\n      }\n    };\n\n    if (document.readyState === 'complete') {\n      whenIdle();\n    } else {\n      window.addEventListener('load', whenIdle, { once: true });\n    }\n  }\n\n  /**\n   * Whether the flow renders inline in the host's element rather than as an\n   * overlay.\n   *\n   * `presentation: 'embedded'` is a request, not a guarantee: **on mobile the\n   * flow presents as the normal overlay** even for an embedded host. An\n   * aggregator's method panel is a narrow, short column on a phone, and the\n   * flow inside it is a payment journey with a keypad, wallet lists and a QR\n   * code — it needs the screen. The overlay is exactly what a phone user gets\n   * from every other Blink integration, and the host's own dialog stays behind\n   * it. Desktop keeps the inline card, where the panel has room.\n   *\n   * **The decision lives with the frame.** Read live until a frame is built,\n   * then committed for good ({@link Deposit.createPresentedIframe}) — `preload()`\n   * warms a frame from these same predicates and the flow that later adopts it\n   * must agree, because a frame warmed at `layout=embed` handed to the overlay\n   * presenter (or the reverse) is a blank modal. Committing at frame creation\n   * rather than at construction matters: a host that constructs `Deposit` before\n   * layout settles — a widget mounting inside a transition, a background or\n   * prerendered tab — reports a zero-width viewport, and `(max-width: 640px)`\n   * matches at zero, so caching then would lock a desktop user into the overlay\n   * over a viewport that never existed. The warm-up already waits for `load`\n   * plus an idle callback, so by the time it commits the measurement is real.\n   */\n  private isEmbedded(): boolean {\n    if (this.config.presentation !== 'embedded') return false;\n    if (this.embeddedResolved !== null) return this.embeddedResolved;\n    // No device signals to read (SSR, or a viewport that has not been laid out\n    // yet): honour the config, and do not commit — a later call decides.\n    if (typeof window === 'undefined') return true;\n    const viewportWidth = window.visualViewport?.width ?? window.innerWidth;\n    if (!(viewportWidth > 0)) return true;\n    return !shouldUseMobileSheetLayout();\n  }\n\n  /**\n   * The host's height budget for the inline iframe. Explicit config wins;\n   * otherwise most of the host viewport, which keeps a tall flow from\n   * outgrowing the page it is embedded in.\n   */\n  private resolveEmbedMaxHeightPx(): number | undefined {\n    if (this.config.embedMaxHeightPx !== undefined) return this.config.embedMaxHeightPx;\n    if (typeof window === 'undefined') return undefined;\n    const derived = Math.round(window.innerHeight * DEFAULT_EMBED_MAX_HEIGHT_FRACTION);\n    return derived > 0 ? derived : undefined;\n  }\n\n  /** Build the iframe for the configured presentation. */\n  private createPresentedIframe(url: string, options: { hidden?: boolean }): IframeHandle {\n    // Commit the embedded-vs-overlay decision to this instance. Everything\n    // downstream — the layout URL param, the height budget, the presenter, the\n    // mount target — must describe the same frame for the rest of its life.\n    if (this.config.presentation === 'embedded' && this.embeddedResolved === null) {\n      this.embeddedResolved = this.isEmbedded();\n      if (!this.embeddedResolved) {\n        this.log('Mobile device: presenting the embedded flow as an overlay');\n      }\n    }\n    if (this.isEmbedded()) {\n      return createEmbeddedIframe(url, this.config.containerElement!, {\n        hidden: options.hidden,\n        // A getter, not a value: the default is derived from the host\n        // viewport, which changes on rotation and window resize.\n        embedMaxHeightPx: () => this.resolveEmbedMaxHeightPx(),\n      });\n    }\n    return createIframe(url, this.overlayMountTarget(), {\n      hidden: options.hidden,\n      fluid: this.isFluidLayout(),\n    });\n  }\n\n  /**\n   * Where the overlay mounts. `containerElement` means two different things by\n   * presentation: an overlay mount point (`presentation: 'overlay'`) or the\n   * aggregator's inline panel slot (`'embedded'`). When an embedded flow\n   * presents as an overlay on mobile, that slot must NOT be the mount point —\n   * `position: fixed` resolves against the nearest transformed/filtered/\n   * contained ancestor, and an aggregator's animated dialog is exactly that, so\n   * the \"full-screen\" overlay would end up positioned inside their panel.\n   * Falls through to `document.body`.\n   */\n  private overlayMountTarget(): HTMLElement | undefined {\n    return this.config.presentation === 'embedded' ? undefined : this.config.containerElement;\n  }\n\n  private buildPreloadUrl(webviewBaseUrl: string): string {\n    const preloadUrl = new URL(webviewBaseUrl);\n    preloadUrl.searchParams.set('preload', 'true');\n    // Untrusted warm-up hint: lets the hosted flow prefetch the merchant\n    // config and signing key before the signed payload exists. Authorization\n    // still comes exclusively from the signed payload.\n    if (this.config.merchantId) {\n      preloadUrl.searchParams.set('merchantId', this.config.merchantId);\n    }\n    this.applyFullWidgetParam(preloadUrl);\n    this.applyLayoutParam(preloadUrl);\n    this.applyViewportParams(preloadUrl);\n    return preloadUrl.toString();\n  }\n\n  /**\n   * Detach the warm iframe for use by a starting flow. Returns null (and\n   * cleans up) when there is none or it was closed in the meantime.\n   */\n  private takeWarmIframe(): {\n    iframe: IframeHandle;\n    ready: Promise<IframeReadyResult>;\n    cancelReady: () => void;\n  } | null {\n    const iframe = this.warmIframe;\n    const ready = this.warmIframeReady;\n    const cancelReady = this.warmIframeReadyCancel ?? (() => {});\n    this.warmIframe = null;\n    this.warmIframeReady = null;\n    this.warmIframeReadyCancel = null;\n\n    if (!iframe || !ready) return null;\n    if (iframe.isClosed()) {\n      cancelReady();\n      iframe.destroy();\n      return null;\n    }\n    return { iframe, ready, cancelReady };\n  }\n\n  private discardWarmIframe(): void {\n    this.warmIframeReadyCancel?.();\n    this.warmIframeReadyCancel = null;\n    this.warmIframeReady = null;\n    if (this.warmIframe) {\n      this.warmIframe.destroy();\n      this.warmIframe = null;\n    }\n  }\n\n  /**\n   * Open the hosted payment flow for the given deposit.\n   *\n   * The returned Promise resolves when the user completes the payment and\n   * rejects with a {@link DepositError} on failure.\n   */\n  requestDeposit(request: DepositRequest): Promise<DepositResult> {\n    if (this.destroyed) {\n      return Promise.reject(\n        new DepositError('INVALID_REQUEST', 'This Deposit instance has been destroyed.'),\n      );\n    }\n\n    validateDepositRequest(request);\n    this.log('requestDeposit called', request.destinations\n      ? { amount: request.amount, destinations: request.destinations.length }\n      : { amount: request.amount, token: request.token, chainId: request.chainId });\n\n    this.requestId += 1;\n    const currentRequestId = this.requestId;\n\n    this.cleanup();\n\n    this._result = null;\n    this._error = null;\n    this.setStatus('signer-loading');\n\n    return new Promise<DepositResult>((resolve, reject) => {\n      let settled = false;\n      const settle = (fn: () => void) => {\n        if (this.requestId !== currentRequestId || settled) return;\n        settled = true;\n        this.dismissActiveFlow = null;\n        fn();\n      };\n\n      const onComplete = (result: DepositResult) => {\n        settle(() => {\n          if (this.flowTimer) {\n            clearTimeout(this.flowTimer);\n            this.flowTimer = null;\n          }\n          this._result = result;\n          this._error = null;\n          this.setStatus('completed');\n          this.emit('complete', result);\n          resolve(result);\n          this.cleanup();\n        });\n      };\n\n      const onError = (error: DepositError) => {\n        settle(() => {\n          this.cleanup();\n          this._error = error;\n          this.setStatus('error');\n          this.emit('error', error);\n          reject(error);\n        });\n      };\n\n      // How `close()` settles this promise — see {@link Deposit.close}.\n      //\n      // A quiet dismissal: it rejects the caller's promise but does NOT emit\n      // `error` or move `status` to 'error', because the HOST asked for this\n      // (its own back button or dialog chrome) and does not need telling that\n      // its own action ended the flow. `close()` follows with 'idle' + `close`,\n      // which is what it has always reported. The flow's own close control\n      // keeps the full error path: there the dismissal is news to the host.\n      this.dismissActiveFlow = () => {\n        settle(() => {\n          this.cleanup();\n          reject(dismissedError());\n        });\n      };\n\n      if (this.config.flowTimeoutMs != null && this.config.flowTimeoutMs > 0) {\n        this.flowTimer = setTimeout(() => {\n          onError(\n            new DepositError(\n              'FLOW_TIMEOUT',\n              `The payment flow did not complete within ${this.config.flowTimeoutMs}ms.`,\n            ),\n          );\n        }, this.config.flowTimeoutMs);\n      }\n\n      this.runSignerFlow(request, currentRequestId, onComplete, onError);\n    });\n  }\n\n  /** Register an event listener. */\n  on<K extends EventName>(event: K, handler: EventMap[K]): this {\n    this.listeners[event].add(handler);\n    return this;\n  }\n\n  /** Remove a previously registered event listener. */\n  off<K extends EventName>(event: K, handler: EventMap[K]): this {\n    this.listeners[event].delete(handler);\n    return this;\n  }\n\n  /** No-op — retained for API compatibility with the popup-based SDK. */\n  focus(): void {}\n\n  /**\n   * Close the deposit iframe without waiting for completion — the host's own\n   * back button or dialog chrome.\n   *\n   * This **settles a flow in progress** by rejecting its `requestDeposit()`\n   * promise with `DEPOSIT_DISMISSED`, exactly as the flow's own close control\n   * does. It has to: `cleanup()` destroys the frame through `destroy()`, which\n   * drops the handle's close callback on purpose, so without this the caller's\n   * `await` never returns. An aggregator whose back button awaited that promise\n   * to restore its method list was left showing an empty panel — the flow gone,\n   * its own list still not rendered, and no error to explain why.\n   *\n   * The rejection code is the same `DEPOSIT_DISMISSED` the in-flow control\n   * produces, so a host writes one dismissal branch rather than one per\n   * affordance. What it deliberately does not do is report an error: no `error`\n   * event, and `status` lands on 'idle' as it always has, because the host\n   * initiated this. With no flow in progress it is a plain teardown, unchanged.\n   */\n  close(): void {\n    this.log('close() called');\n    const dismiss = this.dismissActiveFlow;\n    this.dismissActiveFlow = null;\n    // Rejects the pending promise and cleans up; `cleanup()` is idempotent, so\n    // the shared tail below still runs the status and event side of close.\n    dismiss?.();\n    this.cleanup();\n    this.setStatus('idle');\n    this.emit('close');\n  }\n\n  /** Tear down the instance and release all resources. */\n  destroy(): void {\n    this.log('destroy() called');\n    // Set before cleanup() so it doesn't schedule a fresh warm-up iframe.\n    this.destroyed = true;\n    this.cleanup();\n    this.discardWarmIframe();\n    this.setStatus('idle');\n    for (const set of Object.values(this.listeners)) {\n      (set as Set<unknown>).clear();\n    }\n  }\n\n  // ── Private ──────────────────────────────────────────────────────────\n\n  private log(message: string, data?: Record<string, unknown>): void {\n    if (!this.config.debug) return;\n    if (data) {\n      console.debug(`[BlinkDeposit] ${message}`, data);\n    } else {\n      console.debug(`[BlinkDeposit] ${message}`);\n    }\n  }\n\n  /**\n   * Appends `enableFullWidget=false` to the hosted-flow URL when the merchant\n   * integration disables the full widget. Absence of the param means enabled\n   * (the default) — the hosted flow ANDs this with the merchant's backend\n   * config, so the full widget renders only when both allow it.\n   */\n  private applyFullWidgetParam(url: URL): void {\n    if (this.config.enableFullWidget === false) {\n      url.searchParams.set('enableFullWidget', 'false');\n    }\n    this.applyAppearanceParam(url);\n  }\n\n  /**\n   * Appends `appearance=dark` (or `appearance=system`) to the hosted-flow URL.\n   * An explicit `appearance: { theme }` config always wins — including\n   * `theme: 'light'`, which pins light regardless of the merchant page. When\n   * the merchant passes no theme, the default follows the merchant page's own\n   * declared color scheme (see {@link detectMerchantColorScheme}) so the flow\n   * doesn't render a light modal on a page that says it is dark. Absence of\n   * the param means light. The hosted flow resolves `system` against the\n   * user's `prefers-color-scheme`. Applied alongside the full-widget param on\n   * every hosted/preload URL.\n   */\n  private applyAppearanceParam(url: URL): void {\n    if (this.config.appearance?.hideDepositTitle === true) {\n      url.searchParams.set('hideDepositTitle', 'true');\n    }\n    const theme = this.config.appearance?.theme ?? detectMerchantColorScheme();\n    if (theme === 'dark' || theme === 'system') {\n      url.searchParams.set('appearance', theme);\n    }\n    this.applyBrandParam(url);\n  }\n\n  /**\n   * Appends the merchant's brand colors as `brand=p-0f62fe.bg-ffffff…`.\n   *\n   * On the URL rather than a message because the hosted flow's loading shell\n   * paints from its entry chunk, hundreds of ms before React mounts: a palette\n   * that arrived by `postMessage` would show Blink's own card color first and\n   * then become the merchant's. Unreserved characters only, so the param costs\n   * ~50 bytes of the URL budget rather than triple that in percent-encoding.\n   *\n   * Validated here purely so the merchant sees the complaint in their OWN\n   * console — the hosted flow re-validates everything it decodes, since the URL\n   * is host-controlled input that ends up in a stylesheet. Silence would be the\n   * worst outcome: a dropped color that nobody is told about looks like the SDK\n   * ignoring the config.\n   */\n  private applyBrandParam(url: URL): void {\n    const variables = this.config.appearance?.variables;\n    if (!variables) return;\n    const accepted: Record<string, string> = {};\n    for (const [key, value] of Object.entries(variables)) {\n      if (value === undefined || value === null) continue;\n      if (!BRAND_COLOR_PARAM_KEYS[key]) {\n        console.error(\n          `[blink] appearance.variables.${key} is not a supported brand color. `\n          + `Supported: ${Object.keys(BRAND_COLOR_PARAM_KEYS).join(', ')}.`,\n        );\n        continue;\n      }\n      const hex = normalizeBrandHex(value);\n      if (!hex) {\n        console.error(\n          `[blink] appearance.variables.${key} must be opaque hex (#rgb or #rrggbb); `\n          + `received ${JSON.stringify(value)}. Ignoring it.`,\n        );\n        continue;\n      }\n      accepted[key] = hex;\n    }\n    const encoded = Object.keys(BRAND_COLOR_PARAM_KEYS)\n      .filter((key) => accepted[key] !== undefined)\n      .map((key) => `${BRAND_COLOR_PARAM_KEYS[key]}-${accepted[key].slice(1)}`)\n      .join('.');\n    if (encoded) url.searchParams.set('brand', encoded);\n  }\n\n  /**\n   * Normalizes the display-only {@link DepositRequest.balance} for the wire,\n   * or returns `undefined` to omit it everywhere — the `blink:signed-payload`\n   * sibling field and the legacy fallback URL param alike. Additive wire\n   * discipline: an unset or rejected balance leaves both channels\n   * byte-for-byte what they always were, and old webviews ignore the field\n   * by construction.\n   *\n   * Validated here purely so the merchant sees the complaint in their OWN\n   * console (same rationale as {@link applyBrandParam}); the hosted flow\n   * re-validates whatever arrives, since both channels are host-controlled\n   * input. A rejected balance never blocks the deposit — the flow proceeds\n   * without the subtitle.\n   */\n  private normalizeRequestBalance(balance: unknown): string | undefined {\n    if (balance === undefined || balance === null) return undefined;\n    const normalized = normalizeDisplayBalance(balance);\n    if (normalized === null) {\n      const received =\n        typeof balance === 'number' ? String(balance) : JSON.stringify(balance) ?? String(balance);\n      console.error(\n        `[blink] balance must be a finite number >= 0 and < 1e12 (USD, display only); `\n        + `received ${received}. Ignoring it.`,\n      );\n      return undefined;\n    }\n    return normalized;\n  }\n\n  /**\n   * Normalizes {@link DepositRequest.minimumDeposit} for the wire, or returns\n   * `undefined` to omit it everywhere. Same additive discipline and same\n   * console-complaint rationale as {@link normalizeRequestBalance}.\n   *\n   * A rejected minimum never blocks the deposit — the flow proceeds on\n   * Blink's own per-route floor, which is the safe direction to fail: the\n   * merchant loses their higher floor, nobody is locked out of depositing.\n   */\n  private normalizeRequestMinimumDeposit(minimumDeposit: unknown): string | undefined {\n    if (minimumDeposit === undefined || minimumDeposit === null) return undefined;\n    const normalized = normalizeMinimumDeposit(minimumDeposit);\n    if (normalized === null) {\n      const received =\n        typeof minimumDeposit === 'number'\n          ? String(minimumDeposit)\n          : JSON.stringify(minimumDeposit) ?? String(minimumDeposit);\n      console.error(\n        `[blink] minimumDeposit must be a finite number > 0 and < 1e6 (USD); `\n        + `received ${received}. Ignoring it.`,\n      );\n      return undefined;\n    }\n    return normalized;\n  }\n\n  /**\n   * Fluid is the default; `layout: 'fixed'` opts back into the legacy\n   * container. Embedded is a separate presentation and never fluid — the\n   * constructor rejects the combination outright.\n   */\n  private isFluidLayout(): boolean {\n    return !this.isEmbedded() && this.config.layout !== 'fixed';\n  }\n\n  /**\n   * Marks the hosted-flow URL as fluid-layout: the iframe spans the full\n   * viewport and the hosted flow renders the card/sheet chrome itself.\n   * Only applied to preload URLs — the URL-param fallback path exists\n   * precisely because the webview never signalled ready, so it cannot be\n   * assumed to understand fluid layout and gets the fixed container.\n   */\n  private applyLayoutParam(url: URL): void {\n    if (this.isEmbedded()) {\n      url.searchParams.set('layout', 'embed');\n      return;\n    }\n    if (this.isFluidLayout()) {\n      url.searchParams.set('layout', 'fluid');\n    }\n  }\n\n  /**\n   * Seeds the merchant page's large-viewport height and safe-area bottom\n   * inset onto the fluid preload URL so the hosted flow can size the sheet\n   * before its JS boots. `blink:viewport` messages keep the values fresh\n   * afterwards (rotation, window resize) — see iframe.ts.\n   */\n  private applyViewportParams(url: URL): void {\n    const embedded = this.isEmbedded();\n    if (!this.isFluidLayout() && !embedded) return;\n    if (embedded) {\n      // The height budget doubles as the sizing basis inside the flow, so it\n      // has to be there before first paint — a late arrival would mean the\n      // loading shell lays out against the wrong reference.\n      const embedMaxHeightPx = this.resolveEmbedMaxHeightPx();\n      if (embedMaxHeightPx !== undefined) {\n        url.searchParams.set('embedMaxHeight', String(embedMaxHeightPx));\n      }\n    }\n    const metrics = measureViewportMetrics();\n    if (metrics.viewportLvh <= 0) return;\n    url.searchParams.set('viewportLvh', String(metrics.viewportLvh));\n    url.searchParams.set('safeAreaBottom', String(metrics.safeAreaBottom));\n  }\n\n  private setStatus(status: DepositStatus): void {\n    if (this._status === status) return;\n    this.log(`Status: ${this._status} → ${status}`);\n    this._status = status;\n    this.emit('status-change', status);\n  }\n\n  private async runSignerFlow(\n    request: DepositRequest,\n    requestId: number,\n    onComplete: (result: DepositResult) => void,\n    onError: (error: DepositError) => void,\n  ): Promise<void> {\n    try {\n      const webviewBaseUrl = resolveWebviewBaseUrl(this.config);\n      this.hostedOrigin = this.config.hostedFlowOrigin ?? new URL(webviewBaseUrl).origin;\n\n      this.log('Calling signer', {\n        signer: typeof this.config.signer === 'string' ? this.config.signer : '<function>',\n      });\n      const signerRequest = buildSignerRequest(request, webviewBaseUrl);\n      // Display-only sibling of the signed payload. Deliberately NOT part of\n      // `signerRequest`: the balance never reaches the merchant's signer and\n      // is never covered by the signature — it rides out-of-band on whichever\n      // delivery channel wins below.\n      const displayBalance = this.normalizeRequestBalance(request.balance);\n      // Same out-of-band treatment as the balance: a merchant business rule,\n      // unsigned, re-validated by the hosted flow, and never sent to the\n      // merchant's signer.\n      const minimumDeposit = this.normalizeRequestMinimumDeposit(request.minimumDeposit);\n\n      // Reuse the background warm-up iframe when one exists — its document\n      // (JS bundle, auth warm-up, merchant prefetches) is already loaded or\n      // loading. Otherwise create the preload iframe now so the bundle at\n      // least loads in parallel with the signer call.\n      let preloadIframe: IframeHandle;\n      let iframeReadyPromise: Promise<IframeReadyResult>;\n\n      const warm = this.takeWarmIframe();\n      if (warm) {\n        warm.iframe.reveal();\n        preloadIframe = warm.iframe;\n        // The warm-up wait is generous (60s); from the moment the user acts\n        // we only give it the regular 2s budget before falling back. Either\n        // way, settle the underlying warm-up wait so its timer and message\n        // listener are released.\n        iframeReadyPromise = Promise.race([\n          warm.ready,\n          new Promise<IframeReadyResult>((resolve) =>\n            setTimeout(() => resolve(IFRAME_NOT_READY), IFRAME_READY_TIMEOUT_MS),\n          ),\n        ]).then((ready) => {\n          warm.cancelReady();\n          return ready;\n        });\n        this.log('Reusing warm preload iframe');\n      } else {\n        preloadIframe = this.createPresentedIframe(this.buildPreloadUrl(webviewBaseUrl), {});\n        iframeReadyPromise = this.waitForIframeReady(preloadIframe).promise;\n      }\n      this.iframe = preloadIframe;\n\n      preloadIframe.onClose(() => {\n        onError(dismissedError());\n        this.cleanup();\n        this.emit('close');\n      });\n\n      // Race: signer call and iframe ready signal in parallel\n      const signerPromise = callSigner(\n        this.config.signer,\n        signerRequest,\n        this.config.signerTimeoutMs,\n      );\n\n      const [signerResponse, iframeReady] = await Promise.all([\n        signerPromise,\n        iframeReadyPromise,\n      ]);\n\n      this.lastSignerResponse = signerResponse;\n      this.log('Signer responded', { merchantId: signerResponse.merchantId });\n\n      if (this.requestId !== requestId || preloadIframe.isClosed()) {\n        this.log('Request superseded or iframe dismissed during signer call');\n        return;\n      }\n\n      if (iframeReady.ready) {\n        // The webview signalled ready but predates fluid layout (no\n        // `layout-fluid` capability): snap the overlay back to the fixed\n        // container so its fill-mode rendering looks exactly like today.\n        if (this.isFluidLayout() && !iframeReady.fluidCapable) {\n          preloadIframe.downgradeToFixed();\n          this.log('Webview lacks layout-fluid capability — downgraded to fixed container');\n        }\n        // New webview supports preloading — deliver payload via postMessage\n        const contentWindow = preloadIframe.contentWindow;\n        if (contentWindow) {\n          contentWindow.postMessage(\n            buildSignedPayloadMessage(\n              signerResponse.merchantId,\n              signerResponse.payload,\n              signerResponse.signature,\n              displayBalance,\n              minimumDeposit,\n            ),\n            this.hostedOrigin!,\n          );\n        }\n        this.startMessageListener(preloadIframe, onComplete);\n        this.setStatus('iframe-active');\n        this.log('Payload delivered via postMessage (preload path)');\n      } else {\n        // Fallback: old webview did not send blink:iframe-ready.\n        // Destroy preload iframe and create a new one with full URL params.\n        preloadIframe.destroy();\n\n        const hostedUrl = new URL(webviewBaseUrl);\n        hostedUrl.searchParams.set('merchantId', signerResponse.merchantId);\n        hostedUrl.searchParams.set('payload', signerResponse.payload);\n        hostedUrl.searchParams.set('signature', signerResponse.signature);\n        if (displayBalance !== undefined) {\n          hostedUrl.searchParams.set('balance', displayBalance);\n        }\n        if (minimumDeposit !== undefined) {\n          hostedUrl.searchParams.set('minDeposit', minimumDeposit);\n        }\n        this.applyFullWidgetParam(hostedUrl);\n        // The overlay's fallback deliberately omits the layout params: a\n        // webview that never signalled ready predates them, so it gets the\n        // legacy fixed container. Embedded has no legacy container to fall\n        // back to, so it keeps its params and renders inline regardless.\n        if (this.isEmbedded()) {\n          this.applyLayoutParam(hostedUrl);\n          this.applyViewportParams(hostedUrl);\n        }\n        const targetUrl = hostedUrl.toString();\n\n        // Stays on the configured presenter. Embedded must never reach\n        // `createIframe` here: that builds a `position: fixed` overlay, and\n        // dropping a full-screen modal over an aggregator's own widget is the\n        // one failure mode worse than the flow simply not starting.\n        const iframeHandle = this.createPresentedIframe(targetUrl, {});\n        this.iframe = iframeHandle;\n\n        iframeHandle.onClose(() => {\n          onError(dismissedError());\n          this.cleanup();\n          this.emit('close');\n        });\n\n        this.startMessageListener(iframeHandle, onComplete);\n        this.setStatus('iframe-active');\n        this.log('Iframe opened with hosted flow (fallback path)', { url: targetUrl });\n      }\n    } catch (err) {\n      if (this.requestId !== requestId) return;\n\n      this.log('Signer flow failed', { error: err instanceof Error ? err.message : String(err) });\n\n      if (err instanceof DepositError) {\n        onError(err);\n      } else {\n        onError(\n          new DepositError(\n            'SIGNER_NETWORK_ERROR',\n            err instanceof Error ? err.message : 'Unknown signer error.',\n          ),\n        );\n      }\n    }\n  }\n\n  /**\n   * Resolves `{ ready: true, ... }` when the iframe posts\n   * `blink:iframe-ready` (with `fluidCapable` reflecting its advertised\n   * capabilities), or `{ ready: false, fluidCapable: false }` on timeout.\n   * `cancel()` settles the promise as not-ready immediately and releases\n   * the listener + timer — used to reap the generous warm-up wait once it no\n   * longer matters (warm iframe consumed or discarded).\n   */\n  private waitForIframeReady(\n    iframeHandle: IframeHandle,\n    timeoutMs: number = IFRAME_READY_TIMEOUT_MS,\n  ): { promise: Promise<IframeReadyResult>; cancel: () => void } {\n    let finish: (result: IframeReadyResult) => void = () => {};\n\n    const promise = new Promise<IframeReadyResult>((resolve) => {\n      const handler = (event: MessageEvent) => {\n        if (event.origin !== this.hostedOrigin) return;\n        if (event.source !== iframeHandle.contentWindow) return;\n        const readyMessage = parseIframeReady(event.data);\n        if (readyMessage) {\n          finish({\n            ready: true,\n            fluidCapable: readyMessage.capabilities.includes(LAYOUT_FLUID_CAPABILITY),\n          });\n        }\n      };\n      window.addEventListener('message', handler);\n\n      const timeout = setTimeout(() => {\n        this.log('Iframe ready timeout — falling back to URL params');\n        finish(IFRAME_NOT_READY);\n      }, timeoutMs);\n\n      let settled = false;\n      finish = (result: IframeReadyResult) => {\n        if (settled) return;\n        settled = true;\n        window.removeEventListener('message', handler);\n        clearTimeout(timeout);\n        resolve(result);\n      };\n    });\n\n    return { promise, cancel: () => finish(IFRAME_NOT_READY) };\n  }\n\n  private startMessageListener(\n    iframeHandle: IframeHandle,\n    onComplete: (result: DepositResult) => void,\n  ): void {\n    const handler = (event: MessageEvent) => {\n      if (this.hostedOrigin && event.origin !== this.hostedOrigin) {\n        return;\n      }\n\n      const contentWindow = iframeHandle.contentWindow;\n      if (event.source && contentWindow && event.source !== contentWindow) {\n        return;\n      }\n\n      if (parseCloseRequest(event.data)) {\n        this.log('Close request received from hosted flow');\n        iframeHandle.close();\n        return;\n      }\n\n      const contentHeight = parseContentHeight(event.data);\n      if (contentHeight) {\n        // Applied without a transition on purpose: the flow animates its own\n        // height, and a second animation here would fight it. Not logged —\n        // this fires on every frame of that animation.\n        iframeHandle.applyContentHeight(contentHeight.heightPx);\n        this.emit('resize', {\n          heightPx: contentHeight.heightPx,\n          ...(contentHeight.preferredWidthPx === undefined\n            ? {}\n            : { preferredWidthPx: contentHeight.preferredWidthPx }),\n          ...(contentHeight.minWidthPx === undefined\n            ? {}\n            : { minWidthPx: contentHeight.minWidthPx }),\n        });\n        return;\n      }\n\n      const message = parseTransferComplete(event.data);\n      if (!message) {\n        return;\n      }\n\n      this.log('Transfer complete received', { transferId: message.transfer.id, status: message.transfer.status });\n\n      if (contentWindow) {\n        try {\n          contentWindow.postMessage(\n            buildAckMessage(message.transfer.id),\n            this.hostedOrigin ?? '*',\n          );\n        } catch {\n          // Cross-origin postMessage can throw in edge cases — safe to swallow.\n        }\n      }\n\n      const depositResult: DepositResult = { transfer: message.transfer };\n      if (this.lastSignerResponse?.preview) {\n        depositResult.idempotencyKey = this.lastSignerResponse.preview.idempotencyKey;\n        depositResult.preview = {\n          amount: this.lastSignerResponse.preview.amount,\n          chainId: this.lastSignerResponse.preview.chainId,\n          address: this.lastSignerResponse.preview.address,\n          token: this.lastSignerResponse.preview.token,\n          ...(this.lastSignerResponse.preview.destinations\n            ? { destinations: this.lastSignerResponse.preview.destinations }\n            : {}),\n        };\n      }\n      onComplete(depositResult);\n    };\n\n    this.messageListener = handler;\n    window.addEventListener('message', handler);\n  }\n\n  private cleanup(): void {\n    if (this.flowTimer) {\n      clearTimeout(this.flowTimer);\n      this.flowTimer = null;\n    }\n\n    if (this.messageListener) {\n      window.removeEventListener('message', this.messageListener);\n      this.messageListener = null;\n    }\n\n    if (this.iframe) {\n      this.iframe.destroy();\n      this.iframe = null;\n    }\n\n    this.hostedOrigin = null;\n    this.lastSignerResponse = null;\n\n    // The flow that owned the iframe is over — warm a fresh one up for the\n    // next deposit. When cleanup() runs at the start of requestDeposit the\n    // deferred callback sees an active flow and skips.\n    if (!this.destroyed && this.config.preload !== false) {\n      this.schedulePreload();\n    }\n  }\n\n  private emit<K extends EventName>(event: K, ...args: Parameters<EventMap[K]>): void {\n    for (const handler of this.listeners[event]) {\n      try {\n        (handler as (...a: unknown[]) => void)(...args);\n      } catch {\n        // Swallow listener errors to avoid breaking the SDK flow.\n      }\n    }\n  }\n}\n\n/**\n * Detects the merchant page's declared color scheme from the used\n * `color-scheme` of the document root, mapping it to the appearance the\n * hosted flow should default to when the merchant config passes no theme:\n *\n * - `dark` (page declares itself dark, e.g. `<meta name=\"color-scheme\"\n *   content=\"dark\">`) → `'dark'`\n * - `light dark` (page adapts to the OS preference) → `'system'`, so the\n *   hosted flow resolves against the same `prefers-color-scheme` the page\n *   itself follows\n * - anything else (`normal`, `light`, `only light`, no browser support,\n *   detection failure) → `null`, keeping the light default\n *\n * Only *declared* schemes are detectable — a page that paints dark colors\n * without declaring `color-scheme` reads as light.\n */\nfunction detectMerchantColorScheme(): 'dark' | 'system' | null {\n  if (typeof window === 'undefined' || typeof document === 'undefined') return null;\n  const root = document.documentElement;\n  if (!root || typeof window.getComputedStyle !== 'function') return null;\n  let value: string;\n  try {\n    value = window.getComputedStyle(root).colorScheme ?? '';\n  } catch {\n    return null;\n  }\n  const tokens = value.toLowerCase().split(/\\s+/);\n  const dark = tokens.includes('dark');\n  const light = tokens.includes('light');\n  if (dark && light) return 'system';\n  if (dark) return 'dark';\n  return null;\n}\n\n/** @deprecated Use {@link Deposit} instead. */\nexport const Checkout = Deposit;\n","import { createElement, useState } from 'react';\nimport type { CSSProperties, ReactElement } from 'react';\n\n// Inline data URIs (no asset pipeline) so the button stays dependency-free on\n// merchant pages. Marks mirror swype-sdk/src/assets/logos.ts.\nfunction svgToDataUri(svg: string): string {\n  return `data:image/svg+xml,${encodeURIComponent(svg)}`;\n}\n\nconst USDC_SVG = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 2000 2000\">\n<path d=\"M1000 2000c554.17 0 1000-445.83 1000-1000S1554.17 0 1000 0 0 445.83 0 1000s445.83 1000 1000 1000z\" fill=\"#2775ca\"/>\n<path d=\"M1275 1158.33c0-145.83-87.5-195.83-262.5-216.66-125-16.67-150-50-150-108.34s41.67-95.83 125-95.83c75 0 116.67 25 137.5 87.5 4.17 12.5 16.67 20.83 29.17 20.83h66.66c16.67 0 29.17-12.5 29.17-29.16v-4.17c-16.67-91.67-91.67-162.5-187.5-170.83v-100c0-16.67-12.5-29.17-33.33-33.34h-62.5c-16.67 0-29.17 12.5-33.34 33.34v95.83c-125 16.67-204.16 100-204.16 204.17 0 137.5 83.33 191.66 258.33 212.5 116.67 20.83 154.17 45.83 154.17 112.5s-58.34 112.5-137.5 112.5c-108.34 0-145.84-45.84-158.34-108.34-4.16-16.66-16.66-25-29.16-25h-70.84c-16.66 0-29.16 12.5-29.16 29.17v4.17c16.66 104.16 83.33 179.16 220.83 200v100c0 16.66 12.5 29.16 33.33 33.33h62.5c16.67 0 29.17-12.5 33.34-33.33v-100c125-20.84 208.33-108.34 208.33-220.84z\" fill=\"#fff\"/>\n<path d=\"M787.5 1595.83c-325-116.66-491.67-479.16-370.83-800 62.5-175 200-308.33 370.83-370.83 16.67-8.33 25-20.83 25-41.67V325c0-16.67-8.33-29.17-25-33.33-4.17 0-12.5 0-16.67 4.16-395.83 125-612.5 545.84-487.5 941.67 75 233.33 254.17 412.5 487.5 487.5 16.67 8.33 33.34 0 37.5-16.67 4.17-4.16 4.17-8.33 4.17-16.66v-58.34c0-12.5-12.5-29.16-25-37.5zM1229.17 295.83c-16.67-8.33-33.34 0-37.5 16.67-4.17 4.17-4.17 8.33-4.17 16.67v58.33c0 16.67 12.5 33.33 25 41.67 325 116.66 491.67 479.16 370.83 800-62.5 175-200 308.33-370.83 370.83-16.67 8.33-25 20.83-25 41.67V1700c0 16.67 8.33 29.17 25 33.33 4.17 0 12.5 0 16.67-4.16 395.83-125 612.5-545.84 487.5-941.67-75-237.5-258.34-416.67-487.5-491.67z\" fill=\"#fff\"/>\n</svg>`;\n\nconst TETHER_SVG = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 800 800\">\n<circle fill=\"#009393\" cx=\"400\" cy=\"400\" r=\"400\"/>\n<path fill=\"#fff\" fill-rule=\"evenodd\" d=\"M400.49,428.59c68.79,0,126.28-11.63,140.33-27.17-11.93-13.18-55.08-23.56-109.88-26.4v32.83c-9.81.51-20.01.76-30.46.76s-20.65-.25-30.48-.76v-32.83c-54.78,2.84-97.95,13.22-109.88,26.4,14.07,15.54,71.57,27.17,140.36,27.17ZM522.71,274.06v45.21h-91.77v31.35c64.46,3.35,112.83,17.13,113.19,33.62v34.38c-.36,16.49-48.73,30.24-113.19,33.6v76.94h-60.93v-76.94c-64.46-3.35-112.81-17.11-113.17-33.6v-34.38c.36-16.49,48.71-30.27,113.17-33.62v-31.35h-91.77v-45.21h244.48ZM242.15,202.11h322.16c7.7,0,14.79,4.05,18.63,10.63l93.85,161.16c4.86,8.36,3.42,18.91-3.52,25.68l-258.34,252.18c-8.38,8.17-21.84,8.17-30.2,0L126.71,399.92c-7.09-6.94-8.43-17.79-3.2-26.19l100.33-161.49c3.91-6.28,10.85-10.12,18.32-10.12Z\"/>\n</svg>`;\n\nconst USDC_LOGO = svgToDataUri(USDC_SVG);\nconst TETHER_LOGO = svgToDataUri(TETHER_SVG);\n\nexport interface BlinkDepositButtonProps {\n  /** Fired when the user taps the button. Hosts typically call `requestDeposit()` here. */\n  onClick: () => void;\n  /** Disables interaction and dims the button. */\n  disabled?: boolean;\n  /** Non-interactive waiting state (e.g. while the signer request is in flight). Dims like disabled. */\n  loading?: boolean;\n}\n\n/**\n * Blink-branded deposit button merchants can drop onto their page instead of\n * building their own: a black pill with a bold \"Deposit stablecoins\" line over\n * an italic \"In a Blink\" line, and overlapping USDC/USDT coin marks on the\n * right. Self-contained — inline styles and data-URI icons, no CSS imports.\n *\n * ```tsx\n * import { BlinkDepositButton, useBlinkDeposit } from '@swype-org/deposit/react';\n *\n * function Checkout() {\n *   const { status, requestDeposit } = useBlinkDeposit({ signer: '/api/sign-payment' });\n *   return (\n *     <BlinkDepositButton\n *       onClick={() => requestDeposit({ amount: 50, chainId: 8453, address: '0x…', token: '0x…' })}\n *       loading={status === 'signer-loading'}\n *     />\n *   );\n * }\n * ```\n */\nexport function BlinkDepositButton({\n  onClick,\n  disabled,\n  loading,\n}: BlinkDepositButtonProps): ReactElement {\n  const [hovered, setHovered] = useState(false);\n  const [pressed, setPressed] = useState(false);\n  const inactive = !!disabled || !!loading;\n\n  return createElement(\n    'button',\n    {\n      type: 'button',\n      onClick,\n      disabled: inactive,\n      onMouseEnter: () => setHovered(true),\n      onMouseLeave: () => {\n        setHovered(false);\n        setPressed(false);\n      },\n      onMouseDown: () => setPressed(true),\n      onMouseUp: () => setPressed(false),\n      style: pillStyle({ hovered, pressed, inactive, loading: !!loading }),\n    },\n    createElement(\n      'span',\n      { style: labelStackStyle },\n      createElement('span', { style: titleStyle }, 'Deposit stablecoins'),\n      createElement('span', { style: subtitleStyle }, 'In a Blink'),\n    ),\n    createElement(\n      'span',\n      { style: coinsStyle },\n      // The left (USDC) coin paints over the right one, against DOM paint order.\n      createElement('img', {\n        src: USDC_LOGO,\n        alt: '',\n        'aria-hidden': 'true',\n        style: { ...coinStyle, marginRight: -8, position: 'relative', zIndex: 1 },\n      }),\n      createElement('img', { src: TETHER_LOGO, alt: '', 'aria-hidden': 'true', style: coinStyle }),\n    ),\n  );\n}\n\nconst pillStyle = (state: {\n  hovered: boolean;\n  pressed: boolean;\n  inactive: boolean;\n  loading: boolean;\n}): CSSProperties => ({\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'space-between',\n  gap: 8,\n  width: '100%',\n  height: 56,\n  padding: '12px 15px 12px 22px',\n  backgroundColor: '#000000',\n  // A faint white film on hover rather than `filter: brightness()` — a\n  // brightness multiply leaves pure black unchanged.\n  backgroundImage:\n    !state.inactive && state.hovered\n      ? 'linear-gradient(rgba(255, 255, 255, 0.12), rgba(255, 255, 255, 0.12))'\n      : undefined,\n  color: '#fafafa',\n  border: 'none',\n  borderRadius: 36,\n  cursor: state.inactive ? (state.loading ? 'progress' : 'not-allowed') : 'pointer',\n  opacity: state.inactive ? 0.72 : 1,\n  boxSizing: 'border-box',\n  // Explicit stack so the button is self-sufficient on any host page.\n  fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n  textAlign: 'left',\n  transform: !state.inactive && state.pressed ? 'scale(0.98)' : undefined,\n  transition: 'background-color 0.15s ease, transform 0.15s ease, opacity 0.15s ease',\n});\n\nconst labelStackStyle: CSSProperties = {\n  display: 'flex',\n  flexDirection: 'column',\n  minWidth: 0,\n};\n\nconst titleStyle: CSSProperties = {\n  fontSize: 16,\n  fontWeight: 700,\n  lineHeight: 'normal',\n  whiteSpace: 'nowrap',\n};\n\nconst subtitleStyle: CSSProperties = {\n  fontSize: 16,\n  fontWeight: 400,\n  fontStyle: 'italic',\n  lineHeight: 'normal',\n  whiteSpace: 'nowrap',\n};\n\nconst coinsStyle: CSSProperties = {\n  display: 'inline-flex',\n  alignItems: 'center',\n  flexShrink: 0,\n  // Scope the front coin's z-index so it can't escape over host page layers.\n  isolation: 'isolate',\n};\n\nconst coinStyle: CSSProperties = {\n  width: 29,\n  height: 29,\n  borderRadius: '50%',\n  objectFit: 'cover',\n  display: 'block',\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { Deposit } from './checkout.ts';\nimport { DepositError, getDisplayMessage } from './errors.ts';\nimport type {\n  DepositConfig,\n  DepositStatus,\n  DepositRequest,\n  DepositResult,\n} from './types.ts';\n\nexport type { DepositConfig, DepositStatus, DepositRequest, DepositResult };\nexport { DepositError, getDisplayMessage };\nexport { BlinkDepositButton } from './BlinkDepositButton.ts';\nexport type { BlinkDepositButtonProps } from './BlinkDepositButton.ts';\n\ninterface UseBlinkDepositReturn {\n  /** Current phase of the deposit flow. */\n  status: DepositStatus;\n  /** Last successful deposit result, or `null`. */\n  result: DepositResult | null;\n  /** Last deposit error, or `null`. */\n  error: DepositError | null;\n  /** User-friendly error message derived from the current error, or `null`. */\n  displayMessage: string | null;\n  /** Whether a deposit flow is currently in progress. */\n  isActive: boolean;\n  /** Start a deposit flow. Opens a modal iframe with the hosted deposit. */\n  requestDeposit: (request: DepositRequest) => Promise<DepositResult>;\n  /** No-op — retained for API compatibility. */\n  focus: () => void;\n  /** Close the deposit iframe and reset to idle. */\n  close: () => void;\n}\n\n/**\n * React hook that wraps the {@link Deposit} class with reactive state.\n *\n * ```tsx\n * import { useBlinkDeposit } from '@swype-org/deposit/react';\n *\n * function DepositButton() {\n *   const { status, result, error, displayMessage, requestDeposit } = useBlinkDeposit({\n *     signer: '/api/sign-payment',\n *   });\n *\n *   return (\n *     <>\n *       <button\n *         onClick={() => requestDeposit({ amount: 50, chainId: 8453, address: '0x...', token: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' })}\n *         disabled={status === 'signer-loading'}\n *       >\n *         {status === 'signer-loading' ? 'Preparing…' : 'Deposit'}\n *       </button>\n *       {error && <p>{displayMessage}</p>}\n *       {result && <p>Transfer {result.transfer.id} complete!</p>}\n *     </>\n *   );\n * }\n * ```\n */\nexport function useBlinkDeposit(config: DepositConfig): UseBlinkDepositReturn {\n  const depositRef = useRef<Deposit | null>(null);\n  const [status, setStatus] = useState<DepositStatus>('idle');\n  const [result, setResult] = useState<DepositResult | null>(null);\n  const [error, setError] = useState<DepositError | null>(null);\n\n  if (!depositRef.current) {\n    depositRef.current = new Deposit(config);\n  }\n\n  useEffect(() => {\n    const deposit = depositRef.current!;\n\n    const onStatusChange = (s: DepositStatus) => setStatus(s);\n    const onComplete = (r: DepositResult) => {\n      setResult(r);\n      setError(null);\n    };\n    const onError = (e: DepositError) => setError(e);\n\n    deposit.on('status-change', onStatusChange);\n    deposit.on('complete', onComplete);\n    deposit.on('error', onError);\n\n    return () => {\n      deposit.off('status-change', onStatusChange);\n      deposit.off('complete', onComplete);\n      deposit.off('error', onError);\n      deposit.destroy();\n      depositRef.current = null;\n    };\n  }, []);\n\n  const requestDeposit = useCallback(\n    (request: DepositRequest) => depositRef.current!.requestDeposit(request),\n    [],\n  );\n\n  const focus = useCallback(() => {}, []);\n  const close = useCallback(() => depositRef.current?.close(), []);\n\n  const displayMessage = error ? getDisplayMessage(error) : null;\n  const isActive = status === 'signer-loading' || status === 'iframe-active';\n\n  return { status, result, error, displayMessage, isActive, requestDeposit, focus, close };\n}\n\n/** @deprecated Use {@link useBlinkDeposit} instead. */\nexport const useBlinkCheckout = useBlinkDeposit;\n\n/** @deprecated Use {@link useBlinkDeposit} instead. */\nexport const useSwypeCheckout = useBlinkDeposit;\n"]}