@swype-org/deposit 0.3.22 → 0.3.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/react.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { c as DepositConfig, D as DepositStatus, a as DepositResult, b as DepositError, d as DepositRequest } from './types-iQf3f-_m.cjs';
2
- export { k as getDisplayMessage } from './types-iQf3f-_m.cjs';
1
+ import { c as DepositConfig, D as DepositStatus, a as DepositResult, b as DepositError, d as DepositRequest } from './types-BjnQ2ux2.cjs';
2
+ export { k as getDisplayMessage } from './types-BjnQ2ux2.cjs';
3
3
  import { ReactElement } from 'react';
4
4
 
5
5
  interface BlinkDepositButtonProps {
package/dist/react.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { c as DepositConfig, D as DepositStatus, a as DepositResult, b as DepositError, d as DepositRequest } from './types-iQf3f-_m.js';
2
- export { k as getDisplayMessage } from './types-iQf3f-_m.js';
1
+ import { c as DepositConfig, D as DepositStatus, a as DepositResult, b as DepositError, d as DepositRequest } from './types-BjnQ2ux2.js';
2
+ export { k as getDisplayMessage } from './types-BjnQ2ux2.js';
3
3
  import { ReactElement } from 'react';
4
4
 
5
5
  interface BlinkDepositButtonProps {
package/dist/react.js CHANGED
@@ -1,5 +1,5 @@
1
- import { Deposit, getDisplayMessage } from './chunk-NZ7DOPZ5.js';
2
- export { DepositError, getDisplayMessage } from './chunk-NZ7DOPZ5.js';
1
+ import { Deposit, getDisplayMessage } from './chunk-S3SPMEXQ.js';
2
+ export { DepositError, getDisplayMessage } from './chunk-S3SPMEXQ.js';
3
3
  import { useState, createElement, useRef, useEffect, useCallback } from 'react';
4
4
 
5
5
  function svgToDataUri(svg) {
@@ -109,6 +109,31 @@ interface DepositConfig {
109
109
  * @default 'fluid'
110
110
  */
111
111
  layout?: 'fluid' | 'fixed';
112
+ /**
113
+ * Visual appearance of the hosted payment UI. Nested `{ theme }` object,
114
+ * mirroring Privy's `appearance` config. `theme: 'light'` renders the light
115
+ * palette; `'dark'` renders the dark palette; `'system'` follows the user's
116
+ * OS `prefers-color-scheme`. Passed to the hosted flow as an `appearance`
117
+ * query param and carried through every Blink surface the flow opens
118
+ * (top-level setup tab, wallet authorization pages).
119
+ *
120
+ * When no theme is passed, the default follows the merchant page's own
121
+ * declared `color-scheme`: a page declaring `dark` defaults the flow to
122
+ * dark, a page declaring `light dark` defaults to `system`, and everything
123
+ * else defaults to light. Pass an explicit theme to override the detection
124
+ * (`theme: 'light'` pins light even on a dark page).
125
+ *
126
+ * @example
127
+ * new Deposit({ signer, appearance: { theme: 'dark' } })
128
+ */
129
+ appearance?: {
130
+ /**
131
+ * Color scheme of the hosted UI.
132
+ * @default detected from the merchant page's declared `color-scheme`,
133
+ * falling back to `'light'`
134
+ */
135
+ theme?: 'light' | 'dark' | 'system';
136
+ };
112
137
  /**
113
138
  * Warm up the hosted payment flow in a hidden iframe as soon as the
114
139
  * `Deposit` instance is constructed (deferred until the host page has
@@ -109,6 +109,31 @@ interface DepositConfig {
109
109
  * @default 'fluid'
110
110
  */
111
111
  layout?: 'fluid' | 'fixed';
112
+ /**
113
+ * Visual appearance of the hosted payment UI. Nested `{ theme }` object,
114
+ * mirroring Privy's `appearance` config. `theme: 'light'` renders the light
115
+ * palette; `'dark'` renders the dark palette; `'system'` follows the user's
116
+ * OS `prefers-color-scheme`. Passed to the hosted flow as an `appearance`
117
+ * query param and carried through every Blink surface the flow opens
118
+ * (top-level setup tab, wallet authorization pages).
119
+ *
120
+ * When no theme is passed, the default follows the merchant page's own
121
+ * declared `color-scheme`: a page declaring `dark` defaults the flow to
122
+ * dark, a page declaring `light dark` defaults to `system`, and everything
123
+ * else defaults to light. Pass an explicit theme to override the detection
124
+ * (`theme: 'light'` pins light even on a dark page).
125
+ *
126
+ * @example
127
+ * new Deposit({ signer, appearance: { theme: 'dark' } })
128
+ */
129
+ appearance?: {
130
+ /**
131
+ * Color scheme of the hosted UI.
132
+ * @default detected from the merchant page's declared `color-scheme`,
133
+ * falling back to `'light'`
134
+ */
135
+ theme?: 'light' | 'dark' | 'system';
136
+ };
112
137
  /**
113
138
  * Warm up the hosted payment flow in a hidden iframe as soon as the
114
139
  * `Deposit` instance is constructed (deferred until the host page has
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@swype-org/deposit",
3
- "version": "0.3.22",
3
+ "version": "0.3.26",
4
4
  "description": "Lightweight merchant deposit SDK — open a hosted payment flow, handle completion, zero dependencies",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/walletBridge/discover.ts","../src/walletBridge/protocol.ts","../src/walletBridge/rpcHost.ts","../src/messages.ts","../src/viewportMetrics.ts","../src/iframe.ts","../src/signer.ts","../src/validation.ts","../src/checkout.ts"],"names":[],"mappings":"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","file":"chunk-NZ7DOPZ5.js","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\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};\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","// ── 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 function advertiseWallets(snapshot: RegisteredProvider[]): 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 // 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());\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","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\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 */\nexport function buildViewportMessage(viewportLvh: number, safeAreaBottom: number): ViewportMessage {\n return { type: 'blink:viewport', viewportLvh, safeAreaBottom };\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\nexport function buildSignedPayloadMessage(\n merchantId: string,\n payload: string,\n signature: string,\n): SignedPayloadMessage {\n return {\n type: 'blink:signed-payload',\n merchantId,\n payload,\n signature,\n };\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","import { 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\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\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:normal;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 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 = 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}`;\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 // ── Top-frame wallet bridge ────────────────────────────────────────\n // Discover EIP-6963 wallets in the parent frame (Uniswap, Rainbow,\n // and any other extension that doesn't inject into iframes) and\n // expose them to the SDK over postMessage. Old iframes that don't\n // know about the bridge never send a hello; the host stays silent\n // for them — strict additive behavior.\n const discoverer = createWalletDiscoverer();\n let rpcHostHandle: RpcHostHandle | null = null;\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\n // again on `load` for the cross-origin case.\n attachBridge();\n iframe.addEventListener('load', attachBridge);\n\n function postReveal(): void {\n if (closed) return;\n iframe.contentWindow?.postMessage(buildRevealMessage(), iframeOrigin);\n }\n\n function postViewportMetrics(): void {\n if (closed || !options?.fluid) return;\n const metrics = measureViewportMetrics();\n if (metrics.viewportLvh <= 0) return;\n iframe.contentWindow?.postMessage(\n buildViewportMessage(metrics.viewportLvh, metrics.safeAreaBottom),\n iframeOrigin,\n );\n }\n\n // Keep the hosted flow's sheet geometry anchored to the merchant page's\n // large viewport across rotations and window resizes. rAF-coalesced —\n // iOS fires 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 (options?.fluid) {\n window.addEventListener('resize', onViewportChange);\n window.addEventListener('orientationchange', onViewportChange);\n }\n\n // A visible-from-birth iframe (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 the sheet is sized before first paint even if the URL-param\n // seed went stale during a slow load.\n const onLoadReveal = () => {\n postViewportMetrics();\n if (!hidden) postReveal();\n };\n iframe.addEventListener('load', onLoadReveal);\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 window.removeEventListener('resize', onViewportChange);\n window.removeEventListener('orientationchange', onViewportChange);\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 detachBridge();\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 function detachBridge(): void {\n iframe.removeEventListener('load', attachBridge);\n iframe.removeEventListener('load', onLoadReveal);\n if (rpcHostHandle) {\n rpcHostHandle.detach();\n rpcHostHandle = null;\n }\n discoverer.destroy();\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 postViewportMetrics();\n postReveal();\n },\n\n postReveal(): void {\n postReveal();\n },\n\n downgradeToFixed(): void {\n overlay.removeAttribute('data-blink-fluid');\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 detachBridge();\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\nfunction 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","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 const timeout = timeoutMs ?? DEFAULT_SIGNER_TIMEOUT_MS;\n\n const body: SignerResponse =\n typeof signer === 'function'\n ? await invokeSignerFunction(signer, request, timeout)\n : await invokeSignerUrl(signer, request, timeout);\n\n validateSignerResponse(body);\n return body;\n}\n\nasync function invokeSignerUrl(\n signerUrl: string,\n request: SignerRequest,\n timeoutMs: number,\n): Promise<SignerResponse> {\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 | (Partial<SignerResponse> & { error?: string })\n | null;\n\n if (!response.ok) {\n const detail = body?.error ?? `Signer returned HTTP ${response.status}.`;\n throw new DepositError('SIGNER_REQUEST_FAILED', detail);\n }\n\n return body as SignerResponse;\n}\n\nasync function invokeSignerFunction(\n signer: SignerFunction,\n request: SignerRequest,\n timeoutMs: number,\n): Promise<SignerResponse> {\n return new Promise<SignerResponse>((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 if (!Number.isInteger(request.chainId) || request.chainId <= 0) {\n throw new DepositError('INVALID_REQUEST', 'chainId must be a positive integer.');\n }\n\n if (!isValidAddress(request.address)) {\n throw new DepositError(\n 'INVALID_REQUEST',\n 'address must be a valid EVM (0x-prefixed, 40 hex chars) or Solana (Base58, 32-44 chars) address.',\n );\n }\n\n if (typeof request.token !== 'string' || !isValidTokenAddress(request.token)) {\n throw new DepositError(\n 'INVALID_REQUEST',\n 'token must be a valid EVM (0x-prefixed hex) or Solana (Base58) token address.',\n );\n }\n}\n\nexport function buildSignerRequest(request: DepositRequest, webviewBaseUrl: string): SignerRequest {\n const base: SignerRequest = {\n amount: request.amount,\n chainId: request.chainId,\n address: request.address,\n 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 parseIframeReady,\n buildAckMessage,\n buildSignedPayloadMessage,\n} from './messages.ts';\nimport { createIframe, type IframeHandle } from './iframe.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\ninterface IframeReadyResult {\n ready: boolean;\n fluidCapable: boolean;\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\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 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 };\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 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 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 = createIframe(preloadUrl, this.config.containerElement, {\n hidden: true,\n fluid: this.isFluidLayout(),\n });\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 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', { 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 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 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 /** Close the deposit iframe without waiting for completion. */\n close(): void {\n this.log('close() called');\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 }\n\n /** Fluid is the default; `layout: 'fixed'` opts back into the legacy container. */\n private isFluidLayout(): boolean {\n return 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.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 if (!this.isFluidLayout()) return;\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\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 = createIframe(\n this.buildPreloadUrl(webviewBaseUrl),\n this.config.containerElement,\n { fluid: this.isFluidLayout() },\n );\n iframeReadyPromise = this.waitForIframeReady(preloadIframe).promise;\n }\n this.iframe = preloadIframe;\n\n preloadIframe.onClose(() => {\n onError(\n new DepositError(\n 'DEPOSIT_DISMISSED',\n 'The deposit was dismissed before the transfer completed.',\n ),\n );\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 ),\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 this.applyFullWidgetParam(hostedUrl);\n const targetUrl = hostedUrl.toString();\n\n const iframeHandle = createIframe(targetUrl, this.config.containerElement);\n this.iframe = iframeHandle;\n\n iframeHandle.onClose(() => {\n onError(\n new DepositError(\n 'DEPOSIT_DISMISSED',\n 'The deposit was dismissed before the transfer completed.',\n ),\n );\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 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 };\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/** @deprecated Use {@link Deposit} instead. */\nexport const Checkout = Deposit;\n"]}