@swype-org/deposit 0.3.16 → 0.3.20
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/README.md +31 -0
- package/dist/{chunk-WD6DVQHT.js → chunk-VMXCXXVN.js} +202 -23
- package/dist/chunk-VMXCXXVN.js.map +1 -0
- package/dist/index.cjs +200 -20
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +39 -3
- package/dist/index.d.ts +39 -3
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +313 -20
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +34 -3
- package/dist/react.d.ts +34 -3
- package/dist/react.js +119 -4
- package/dist/react.js.map +1 -1
- package/dist/{types-DYsZwNXq.d.cts → types-Ds07N2zN.d.cts} +44 -1
- package/dist/{types-DYsZwNXq.d.ts → types-Ds07N2zN.d.ts} +44 -1
- package/package.json +6 -3
- package/dist/chunk-WD6DVQHT.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/walletBridge/discover.ts","../src/walletBridge/protocol.ts","../src/walletBridge/rpcHost.ts","../src/messages.ts","../src/iframe.ts","../src/signer.ts","../src/validation.ts","../src/checkout.ts"],"names":[],"mappings":"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","file":"chunk-VMXCXXVN.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\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' };\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","import { createWalletDiscoverer } from './walletBridge/discover.ts';\nimport { attachRpcHost, type RpcHostHandle } from './walletBridge/rpcHost.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`;\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 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\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 (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 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 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 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 },\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 { 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 * 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<boolean> | 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, { 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 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 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<boolean>;\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 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<boolean>;\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<boolean>((resolve) =>\n setTimeout(() => resolve(false), 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 );\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) {\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 true when the iframe posts `blink:iframe-ready`, false on\n * timeout. `cancel()` settles the promise as false 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<boolean>; cancel: () => void } {\n let finish: (ready: boolean) => void = () => {};\n\n const promise = new Promise<boolean>((resolve) => {\n const handler = (event: MessageEvent) => {\n if (event.origin !== this.hostedOrigin) return;\n if (event.source !== iframeHandle.contentWindow) return;\n if (parseIframeReady(event.data)) {\n finish(true);\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(false);\n }, timeoutMs);\n\n let settled = false;\n finish = (ready: boolean) => {\n if (settled) return;\n settled = true;\n window.removeEventListener('message', handler);\n clearTimeout(timeout);\n resolve(ready);\n };\n });\n\n return { promise, cancel: () => finish(false) };\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"]}
|
package/dist/index.cjs
CHANGED
|
@@ -526,15 +526,19 @@ var STYLES = `
|
|
|
526
526
|
[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}
|
|
527
527
|
@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}}
|
|
528
528
|
`;
|
|
529
|
-
function createIframe(url, containerElement) {
|
|
529
|
+
function createIframe(url, containerElement, options) {
|
|
530
530
|
ensureStyles();
|
|
531
531
|
let closed = false;
|
|
532
|
+
let hidden = options?.hidden === true;
|
|
532
533
|
let closeCallback = null;
|
|
533
534
|
const overlay = document.createElement("div");
|
|
534
535
|
overlay.setAttribute("data-blink-overlay", "");
|
|
535
536
|
if (shouldUseMobileSheetLayout()) {
|
|
536
537
|
overlay.setAttribute("data-blink-mobile-sheet", "");
|
|
537
538
|
}
|
|
539
|
+
if (hidden) {
|
|
540
|
+
overlay.style.display = "none";
|
|
541
|
+
}
|
|
538
542
|
const container = document.createElement("div");
|
|
539
543
|
container.setAttribute("data-blink-container", "");
|
|
540
544
|
const iframe = document.createElement("iframe");
|
|
@@ -560,8 +564,8 @@ function createIframe(url, containerElement) {
|
|
|
560
564
|
};
|
|
561
565
|
attachBridge();
|
|
562
566
|
iframe.addEventListener("load", attachBridge);
|
|
563
|
-
|
|
564
|
-
|
|
567
|
+
let savedOverflow = "";
|
|
568
|
+
let scrollLocked = false;
|
|
565
569
|
const onBackdropClick = (event) => {
|
|
566
570
|
if (event.target === overlay) triggerClose();
|
|
567
571
|
};
|
|
@@ -571,15 +575,29 @@ function createIframe(url, containerElement) {
|
|
|
571
575
|
const onTouchMove = (event) => {
|
|
572
576
|
if (event.target === overlay) event.preventDefault();
|
|
573
577
|
};
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
578
|
+
function lockScroll() {
|
|
579
|
+
if (scrollLocked) return;
|
|
580
|
+
scrollLocked = true;
|
|
581
|
+
savedOverflow = document.body.style.overflow;
|
|
582
|
+
document.body.style.overflow = "hidden";
|
|
583
|
+
}
|
|
584
|
+
function attachDismissalListeners() {
|
|
585
|
+
overlay.addEventListener("click", onBackdropClick);
|
|
586
|
+
overlay.addEventListener("touchmove", onTouchMove, { passive: false });
|
|
587
|
+
document.addEventListener("keydown", onKeyDown);
|
|
588
|
+
}
|
|
589
|
+
if (!hidden) {
|
|
590
|
+
lockScroll();
|
|
591
|
+
attachDismissalListeners();
|
|
592
|
+
}
|
|
577
593
|
function removeListeners() {
|
|
578
594
|
overlay.removeEventListener("click", onBackdropClick);
|
|
579
595
|
overlay.removeEventListener("touchmove", onTouchMove);
|
|
580
596
|
document.removeEventListener("keydown", onKeyDown);
|
|
581
597
|
}
|
|
582
598
|
function unlockScroll() {
|
|
599
|
+
if (!scrollLocked) return;
|
|
600
|
+
scrollLocked = false;
|
|
583
601
|
document.body.style.overflow = savedOverflow;
|
|
584
602
|
}
|
|
585
603
|
function triggerClose() {
|
|
@@ -617,6 +635,21 @@ function createIframe(url, containerElement) {
|
|
|
617
635
|
isClosed() {
|
|
618
636
|
return closed;
|
|
619
637
|
},
|
|
638
|
+
isHidden() {
|
|
639
|
+
return hidden;
|
|
640
|
+
},
|
|
641
|
+
reveal() {
|
|
642
|
+
if (closed || !hidden) return;
|
|
643
|
+
hidden = false;
|
|
644
|
+
if (shouldUseMobileSheetLayout()) {
|
|
645
|
+
overlay.setAttribute("data-blink-mobile-sheet", "");
|
|
646
|
+
} else {
|
|
647
|
+
overlay.removeAttribute("data-blink-mobile-sheet");
|
|
648
|
+
}
|
|
649
|
+
overlay.style.display = "";
|
|
650
|
+
lockScroll();
|
|
651
|
+
attachDismissalListeners();
|
|
652
|
+
},
|
|
620
653
|
onClose(callback) {
|
|
621
654
|
closeCallback = callback;
|
|
622
655
|
},
|
|
@@ -788,6 +821,13 @@ function buildSignerRequest(request, webviewBaseUrl) {
|
|
|
788
821
|
|
|
789
822
|
// src/checkout.ts
|
|
790
823
|
var DEFAULT_WEBVIEW_BASE_URL = "https://pay.blink.cash";
|
|
824
|
+
var SANDBOX_WEBVIEW_BASE_URL = "https://pay-sandbox.blink.cash";
|
|
825
|
+
var IFRAME_READY_TIMEOUT_MS = 2e3;
|
|
826
|
+
var WARM_IFRAME_READY_TIMEOUT_MS = 6e4;
|
|
827
|
+
function resolveWebviewBaseUrl(config) {
|
|
828
|
+
if (config.webviewBaseUrl) return config.webviewBaseUrl;
|
|
829
|
+
return config.environment === "sandbox" ? SANDBOX_WEBVIEW_BASE_URL : DEFAULT_WEBVIEW_BASE_URL;
|
|
830
|
+
}
|
|
791
831
|
var Deposit = class {
|
|
792
832
|
config;
|
|
793
833
|
iframe = null;
|
|
@@ -800,6 +840,9 @@ var Deposit = class {
|
|
|
800
840
|
_error = null;
|
|
801
841
|
flowTimer = null;
|
|
802
842
|
lastSignerResponse = null;
|
|
843
|
+
warmIframe = null;
|
|
844
|
+
warmIframeReady = null;
|
|
845
|
+
warmIframeReadyCancel = null;
|
|
803
846
|
listeners = {
|
|
804
847
|
complete: /* @__PURE__ */ new Set(),
|
|
805
848
|
error: /* @__PURE__ */ new Set(),
|
|
@@ -830,6 +873,93 @@ var Deposit = class {
|
|
|
830
873
|
this.log("Deposit instance created", {
|
|
831
874
|
signer: typeof config.signer === "string" ? config.signer : "<function>"
|
|
832
875
|
});
|
|
876
|
+
if (config.preload !== false) {
|
|
877
|
+
this.schedulePreload();
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
/**
|
|
881
|
+
* Warm up the hosted payment flow in a hidden iframe so `requestDeposit`
|
|
882
|
+
* opens an already-loaded page (JS bundle, auth session restore, and —
|
|
883
|
+
* when {@link DepositConfig.merchantId} is set — merchant config prefetch
|
|
884
|
+
* all happen in the background).
|
|
885
|
+
*
|
|
886
|
+
* Runs automatically after construction unless `preload: false`; call it
|
|
887
|
+
* manually to control the timing (e.g. on deposit-button hover). No-op
|
|
888
|
+
* when a warm iframe already exists or a deposit flow is active.
|
|
889
|
+
*/
|
|
890
|
+
preload() {
|
|
891
|
+
if (this.destroyed || this.isActive) return;
|
|
892
|
+
if (this.warmIframe && !this.warmIframe.isClosed()) return;
|
|
893
|
+
if (typeof document === "undefined" || typeof window === "undefined") return;
|
|
894
|
+
const webviewBaseUrl = resolveWebviewBaseUrl(this.config);
|
|
895
|
+
this.hostedOrigin = this.config.hostedFlowOrigin ?? new URL(webviewBaseUrl).origin;
|
|
896
|
+
const preloadUrl = this.buildPreloadUrl(webviewBaseUrl);
|
|
897
|
+
const iframe = createIframe(preloadUrl, this.config.containerElement, { hidden: true });
|
|
898
|
+
const ready = this.waitForIframeReady(iframe, WARM_IFRAME_READY_TIMEOUT_MS);
|
|
899
|
+
this.warmIframe = iframe;
|
|
900
|
+
this.warmIframeReady = ready.promise;
|
|
901
|
+
this.warmIframeReadyCancel = ready.cancel;
|
|
902
|
+
this.log("Warm-up iframe created", { url: preloadUrl });
|
|
903
|
+
}
|
|
904
|
+
// Defer the automatic warm-up until the host page has finished its own
|
|
905
|
+
// load and the main thread is idle — constructing a Deposit instance must
|
|
906
|
+
// never slow the merchant page down.
|
|
907
|
+
schedulePreload() {
|
|
908
|
+
if (typeof window === "undefined" || typeof document === "undefined") return;
|
|
909
|
+
const start = () => {
|
|
910
|
+
if (!this.destroyed && !this.isActive) this.preload();
|
|
911
|
+
};
|
|
912
|
+
const whenIdle = () => {
|
|
913
|
+
const w = window;
|
|
914
|
+
if (typeof w.requestIdleCallback === "function") {
|
|
915
|
+
w.requestIdleCallback(start, { timeout: 3e3 });
|
|
916
|
+
} else {
|
|
917
|
+
setTimeout(start, 250);
|
|
918
|
+
}
|
|
919
|
+
};
|
|
920
|
+
if (document.readyState === "complete") {
|
|
921
|
+
whenIdle();
|
|
922
|
+
} else {
|
|
923
|
+
window.addEventListener("load", whenIdle, { once: true });
|
|
924
|
+
}
|
|
925
|
+
}
|
|
926
|
+
buildPreloadUrl(webviewBaseUrl) {
|
|
927
|
+
const preloadUrl = new URL(webviewBaseUrl);
|
|
928
|
+
preloadUrl.searchParams.set("preload", "true");
|
|
929
|
+
if (this.config.merchantId) {
|
|
930
|
+
preloadUrl.searchParams.set("merchantId", this.config.merchantId);
|
|
931
|
+
}
|
|
932
|
+
this.applyFullWidgetParam(preloadUrl);
|
|
933
|
+
return preloadUrl.toString();
|
|
934
|
+
}
|
|
935
|
+
/**
|
|
936
|
+
* Detach the warm iframe for use by a starting flow. Returns null (and
|
|
937
|
+
* cleans up) when there is none or it was closed in the meantime.
|
|
938
|
+
*/
|
|
939
|
+
takeWarmIframe() {
|
|
940
|
+
const iframe = this.warmIframe;
|
|
941
|
+
const ready = this.warmIframeReady;
|
|
942
|
+
const cancelReady = this.warmIframeReadyCancel ?? (() => {
|
|
943
|
+
});
|
|
944
|
+
this.warmIframe = null;
|
|
945
|
+
this.warmIframeReady = null;
|
|
946
|
+
this.warmIframeReadyCancel = null;
|
|
947
|
+
if (!iframe || !ready) return null;
|
|
948
|
+
if (iframe.isClosed()) {
|
|
949
|
+
cancelReady();
|
|
950
|
+
iframe.destroy();
|
|
951
|
+
return null;
|
|
952
|
+
}
|
|
953
|
+
return { iframe, ready, cancelReady };
|
|
954
|
+
}
|
|
955
|
+
discardWarmIframe() {
|
|
956
|
+
this.warmIframeReadyCancel?.();
|
|
957
|
+
this.warmIframeReadyCancel = null;
|
|
958
|
+
this.warmIframeReady = null;
|
|
959
|
+
if (this.warmIframe) {
|
|
960
|
+
this.warmIframe.destroy();
|
|
961
|
+
this.warmIframe = null;
|
|
962
|
+
}
|
|
833
963
|
}
|
|
834
964
|
/**
|
|
835
965
|
* Open the hosted payment flow for the given deposit.
|
|
@@ -917,9 +1047,10 @@ var Deposit = class {
|
|
|
917
1047
|
/** Tear down the instance and release all resources. */
|
|
918
1048
|
destroy() {
|
|
919
1049
|
this.log("destroy() called");
|
|
1050
|
+
this.destroyed = true;
|
|
920
1051
|
this.cleanup();
|
|
1052
|
+
this.discardWarmIframe();
|
|
921
1053
|
this.setStatus("idle");
|
|
922
|
-
this.destroyed = true;
|
|
923
1054
|
for (const set of Object.values(this.listeners)) {
|
|
924
1055
|
set.clear();
|
|
925
1056
|
}
|
|
@@ -933,6 +1064,17 @@ var Deposit = class {
|
|
|
933
1064
|
console.debug(`[BlinkDeposit] ${message}`);
|
|
934
1065
|
}
|
|
935
1066
|
}
|
|
1067
|
+
/**
|
|
1068
|
+
* Appends `enableFullWidget=false` to the hosted-flow URL when the merchant
|
|
1069
|
+
* integration disables the full widget. Absence of the param means enabled
|
|
1070
|
+
* (the default) — the hosted flow ANDs this with the merchant's backend
|
|
1071
|
+
* config, so the full widget renders only when both allow it.
|
|
1072
|
+
*/
|
|
1073
|
+
applyFullWidgetParam(url) {
|
|
1074
|
+
if (this.config.enableFullWidget === false) {
|
|
1075
|
+
url.searchParams.set("enableFullWidget", "false");
|
|
1076
|
+
}
|
|
1077
|
+
}
|
|
936
1078
|
setStatus(status) {
|
|
937
1079
|
if (this._status === status) return;
|
|
938
1080
|
this.log(`Status: ${this._status} \u2192 ${status}`);
|
|
@@ -941,15 +1083,35 @@ var Deposit = class {
|
|
|
941
1083
|
}
|
|
942
1084
|
async runSignerFlow(request, requestId, onComplete, onError) {
|
|
943
1085
|
try {
|
|
944
|
-
const webviewBaseUrl = this.config
|
|
1086
|
+
const webviewBaseUrl = resolveWebviewBaseUrl(this.config);
|
|
945
1087
|
this.hostedOrigin = this.config.hostedFlowOrigin ?? new URL(webviewBaseUrl).origin;
|
|
946
1088
|
this.log("Calling signer", {
|
|
947
1089
|
signer: typeof this.config.signer === "string" ? this.config.signer : "<function>"
|
|
948
1090
|
});
|
|
949
1091
|
const signerRequest = buildSignerRequest(request, webviewBaseUrl);
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
const
|
|
1092
|
+
let preloadIframe;
|
|
1093
|
+
let iframeReadyPromise;
|
|
1094
|
+
const warm = this.takeWarmIframe();
|
|
1095
|
+
if (warm) {
|
|
1096
|
+
warm.iframe.reveal();
|
|
1097
|
+
preloadIframe = warm.iframe;
|
|
1098
|
+
iframeReadyPromise = Promise.race([
|
|
1099
|
+
warm.ready,
|
|
1100
|
+
new Promise(
|
|
1101
|
+
(resolve) => setTimeout(() => resolve(false), IFRAME_READY_TIMEOUT_MS)
|
|
1102
|
+
)
|
|
1103
|
+
]).then((ready) => {
|
|
1104
|
+
warm.cancelReady();
|
|
1105
|
+
return ready;
|
|
1106
|
+
});
|
|
1107
|
+
this.log("Reusing warm preload iframe");
|
|
1108
|
+
} else {
|
|
1109
|
+
preloadIframe = createIframe(
|
|
1110
|
+
this.buildPreloadUrl(webviewBaseUrl),
|
|
1111
|
+
this.config.containerElement
|
|
1112
|
+
);
|
|
1113
|
+
iframeReadyPromise = this.waitForIframeReady(preloadIframe).promise;
|
|
1114
|
+
}
|
|
953
1115
|
this.iframe = preloadIframe;
|
|
954
1116
|
preloadIframe.onClose(() => {
|
|
955
1117
|
onError(
|
|
@@ -966,7 +1128,6 @@ var Deposit = class {
|
|
|
966
1128
|
signerRequest,
|
|
967
1129
|
this.config.signerTimeoutMs
|
|
968
1130
|
);
|
|
969
|
-
const iframeReadyPromise = this.waitForIframeReady(preloadIframe);
|
|
970
1131
|
const [signerResponse, iframeReady] = await Promise.all([
|
|
971
1132
|
signerPromise,
|
|
972
1133
|
iframeReadyPromise
|
|
@@ -998,6 +1159,7 @@ var Deposit = class {
|
|
|
998
1159
|
hostedUrl.searchParams.set("merchantId", signerResponse.merchantId);
|
|
999
1160
|
hostedUrl.searchParams.set("payload", signerResponse.payload);
|
|
1000
1161
|
hostedUrl.searchParams.set("signature", signerResponse.signature);
|
|
1162
|
+
this.applyFullWidgetParam(hostedUrl);
|
|
1001
1163
|
const targetUrl = hostedUrl.toString();
|
|
1002
1164
|
const iframeHandle = createIframe(targetUrl, this.config.containerElement);
|
|
1003
1165
|
this.iframe = iframeHandle;
|
|
@@ -1030,24 +1192,38 @@ var Deposit = class {
|
|
|
1030
1192
|
}
|
|
1031
1193
|
}
|
|
1032
1194
|
}
|
|
1033
|
-
|
|
1034
|
-
|
|
1195
|
+
/**
|
|
1196
|
+
* Resolves true when the iframe posts `blink:iframe-ready`, false on
|
|
1197
|
+
* timeout. `cancel()` settles the promise as false immediately and releases
|
|
1198
|
+
* the listener + timer — used to reap the generous warm-up wait once it no
|
|
1199
|
+
* longer matters (warm iframe consumed or discarded).
|
|
1200
|
+
*/
|
|
1201
|
+
waitForIframeReady(iframeHandle, timeoutMs = IFRAME_READY_TIMEOUT_MS) {
|
|
1202
|
+
let finish = () => {
|
|
1203
|
+
};
|
|
1204
|
+
const promise = new Promise((resolve) => {
|
|
1035
1205
|
const handler = (event) => {
|
|
1036
1206
|
if (event.origin !== this.hostedOrigin) return;
|
|
1037
1207
|
if (event.source !== iframeHandle.contentWindow) return;
|
|
1038
1208
|
if (parseIframeReady(event.data)) {
|
|
1039
|
-
|
|
1040
|
-
clearTimeout(timeout);
|
|
1041
|
-
resolve(true);
|
|
1209
|
+
finish(true);
|
|
1042
1210
|
}
|
|
1043
1211
|
};
|
|
1044
1212
|
window.addEventListener("message", handler);
|
|
1045
1213
|
const timeout = setTimeout(() => {
|
|
1046
|
-
window.removeEventListener("message", handler);
|
|
1047
1214
|
this.log("Iframe ready timeout \u2014 falling back to URL params");
|
|
1048
|
-
|
|
1049
|
-
},
|
|
1215
|
+
finish(false);
|
|
1216
|
+
}, timeoutMs);
|
|
1217
|
+
let settled = false;
|
|
1218
|
+
finish = (ready) => {
|
|
1219
|
+
if (settled) return;
|
|
1220
|
+
settled = true;
|
|
1221
|
+
window.removeEventListener("message", handler);
|
|
1222
|
+
clearTimeout(timeout);
|
|
1223
|
+
resolve(ready);
|
|
1224
|
+
};
|
|
1050
1225
|
});
|
|
1226
|
+
return { promise, cancel: () => finish(false) };
|
|
1051
1227
|
}
|
|
1052
1228
|
startMessageListener(iframeHandle, onComplete) {
|
|
1053
1229
|
const handler = (event) => {
|
|
@@ -1107,6 +1283,9 @@ var Deposit = class {
|
|
|
1107
1283
|
}
|
|
1108
1284
|
this.hostedOrigin = null;
|
|
1109
1285
|
this.lastSignerResponse = null;
|
|
1286
|
+
if (!this.destroyed && this.config.preload !== false) {
|
|
1287
|
+
this.schedulePreload();
|
|
1288
|
+
}
|
|
1110
1289
|
}
|
|
1111
1290
|
emit(event, ...args) {
|
|
1112
1291
|
for (const handler of this.listeners[event]) {
|
|
@@ -1129,6 +1308,7 @@ exports.CheckoutError = CheckoutError;
|
|
|
1129
1308
|
exports.DEFAULT_WEBVIEW_BASE_URL = DEFAULT_WEBVIEW_BASE_URL;
|
|
1130
1309
|
exports.Deposit = Deposit;
|
|
1131
1310
|
exports.DepositError = DepositError;
|
|
1311
|
+
exports.SANDBOX_WEBVIEW_BASE_URL = SANDBOX_WEBVIEW_BASE_URL;
|
|
1132
1312
|
exports.VERSION = VERSION;
|
|
1133
1313
|
exports.attachRpcHost = attachRpcHost;
|
|
1134
1314
|
exports.createWalletDiscoverer = createWalletDiscoverer;
|