@lydianpay/lydianconnect 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/manager.ts","../src/core/namespace.ts","../node_modules/@lydianpay/lydianconnect-catalog/src/index.ts","../src/core/connector.ts","../src/core/app.ts","../src/connectors/eip155/chain.ts","../src/core/abort.ts","../src/connectors/metamask/connector.ts","../src/connectors/coinbase/connector.ts","../src/connectors/injected/connector.ts","../src/connectors/walletconnect/wallet-links.ts","../src/connectors/walletconnect/registry.ts","../src/connectors/walletconnect/deeplink.ts","../src/connectors/walletconnect/connector.ts","../src/core/lydian-connect.ts"],"names":["rpc","WALLET_ID","rpcFor"],"mappings":"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","file":"index.js","sourcesContent":["import type { Connector, ConnectRequest } from \"./connector\";\nimport type {\n Connection,\n LydianConnectEvent,\n LydianConnectEventHandler,\n OpenWalletInput,\n} from \"./types\";\n\n/**\n * Routing engine: takes a flat list of connectors, auto-detects the fallback\n * (the connector with no claimed walletIds), routes each walletId to its\n * connector, and forwards events. Internal — the host app uses `LydianConnect`.\n */\nexport class ConnectManager {\n private byWallet = new Map<string, Connector>();\n private fallback: Connector;\n private all: Connector[];\n private connections = new Map<string, Connection>();\n private handlers = new Set<LydianConnectEventHandler>();\n private unsubs: Array<() => void> = [];\n private started = false;\n\n constructor(connectors: Connector[]) {\n const fallbacks = connectors.filter((c) => c.walletIds.length === 0);\n if (fallbacks.length !== 1) {\n throw new Error(\n `LydianConnect requires exactly one fallback connector (empty walletIds); found ${fallbacks.length}`,\n );\n }\n this.fallback = fallbacks[0]!;\n this.all = connectors;\n for (const connector of connectors) {\n for (const id of connector.walletIds) this.byWallet.set(id, connector);\n }\n }\n\n /** Wire connector event forwarding, once. */\n async init(): Promise<void> {\n if (this.started) return;\n this.started = true;\n for (const connector of this.all) {\n this.unsubs.push(connector.on((event) => this.handle(event)));\n }\n }\n\n /**\n * The connector claiming this walletId if it serves the requested namespace\n * AND is currently available, else the fallback. So an EVM-only SDK connector\n * is bypassed to WalletConnect for a non-EVM chain, and the injected connector\n * is bypassed when the wallet's extension hasn't announced a provider. The host\n * app is oblivious. SDK connectors report `isAvailable` synchronously as `true`,\n * so this only awaits for connectors that actually probe (e.g. injected).\n */\n private async resolve(\n walletId: string,\n namespaceName: string,\n ): Promise<Connector> {\n const claimed = this.byWallet.get(walletId);\n if (\n claimed &&\n claimed.servesNamespace(namespaceName) &&\n (await claimed.isAvailable(walletId))\n )\n return claimed;\n return this.fallback;\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n if (!this.started) await this.init();\n const connector = await this.resolve(req.walletId, req.namespace.name);\n const connection = await connector.connect(req);\n this.connections.set(req.walletId, connection);\n this.emit({ type: \"connect\", walletId: req.walletId, connection });\n return connection;\n }\n\n async restore(): Promise<Connection[]> {\n if (!this.started) await this.init();\n const restored: Connection[] = [];\n for (const connector of this.all) {\n const conns = await connector.restore().catch(() => [] as Connection[]);\n for (const conn of conns) {\n this.connections.set(conn.walletId, conn);\n restored.push(conn);\n }\n }\n return restored;\n }\n\n get(walletId: string): Connection | undefined {\n return this.connections.get(walletId);\n }\n\n /**\n * Fire a wallet's deep link. Goes straight to the fallback: it is the only\n * connector that owns a link table, and the only one that emits the\n * `display_uri` a host is responding to when it calls this.\n */\n openWallet(input: OpenWalletInput): boolean {\n return this.fallback.openWallet?.(input) ?? false;\n }\n\n async disconnect(walletId?: string): Promise<void> {\n if (walletId) {\n await this.connections\n .get(walletId)\n ?.disconnect()\n .catch(() => {});\n this.connections.delete(walletId);\n return;\n }\n await Promise.allSettled(\n [...this.connections.values()].map((c) => c.disconnect()),\n );\n this.connections.clear();\n }\n\n async reset(): Promise<void> {\n await this.disconnect();\n await Promise.allSettled(this.all.map((c) => c.reset()));\n }\n\n on(handler: LydianConnectEventHandler): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n private handle(event: LydianConnectEvent): void {\n if (event.type === \"disconnect\") this.connections.delete(event.walletId);\n this.emit(event);\n }\n\n private emit(event: LydianConnectEvent): void {\n for (const handler of this.handlers) handler(event);\n }\n}\n","import type { CaipNamespace } from \"./types\";\n\n// Per-namespace method/event sets. A bare number is always EVM (back-compat).\n// tron/ton are intentionally absent — not WalletConnect-reachable, so they're\n// payment-by-QR only and must not negotiate a wallet session here.\nconst NAMESPACE_DEFAULTS: Record<\n string,\n { methods: string[]; events: string[] }\n> = {\n eip155: {\n methods: [\n \"eth_sendTransaction\",\n \"personal_sign\",\n \"eth_signTypedData_v4\",\n \"wallet_switchEthereumChain\",\n ],\n events: [\"chainChanged\", \"accountsChanged\"],\n },\n solana: {\n methods: [\n \"solana_signTransaction\",\n \"solana_signMessage\",\n \"solana_signAndSendTransaction\",\n ],\n events: [],\n },\n bip122: {\n methods: [\"sendTransfer\", \"signMessage\", \"signPsbt\", \"getAccountAddresses\"],\n events: [\"bip122_addressesChanged\"],\n },\n};\n\n/**\n * Build a CAIP namespace from a chain id.\n * A number maps to `eip155:<n>` (the EVM back-compat path); a CAIP-2 string\n * `<namespace>:<reference>` is honored if the namespace is one we connect.\n * Unsupported namespaces (e.g. `tron:`, `ton:`) throw rather than silently\n * applying defaults to a chain we can't negotiate a session for.\n */\nexport function buildNamespace(chainId: number | string): CaipNamespace {\n const caip = typeof chainId === \"number\" ? `eip155:${chainId}` : chainId;\n const [name, reference] = caip.split(\":\");\n const defaults = name ? NAMESPACE_DEFAULTS[name] : undefined;\n if (!name || !defaults || !reference) {\n throw new Error(\n `Unsupported chain \"${caip}\". lydianconnect connects ${Object.keys(NAMESPACE_DEFAULTS).join(\", \")} — ` +\n `pass a number (EVM) or a \"<namespace>:<reference>\" CAIP-2 id.`,\n );\n }\n // eip155 references are positive integers; non-EVM references are opaque ids.\n if (\n name === \"eip155\" &&\n !(/^\\d+$/.test(reference) && Number(reference) > 0)\n ) {\n throw new Error(\n `Invalid eip155 chain \"${caip}\" — the reference must be a positive integer.`,\n );\n }\n return {\n name,\n value: {\n chains: [caip],\n methods: defaults.methods,\n events: defaults.events,\n },\n };\n}\n","/** CAIP-2 namespace families a wallet can connect on. */\nexport type WalletNamespace = 'eip155' | 'solana' | 'bip122' | 'tron' | 'ton';\n\nexport interface WalletCatalogEntry {\n id: string;\n name: string;\n iconUrl: string;\n namespaces: readonly WalletNamespace[];\n /**\n * EIP-6963 rdns of the wallet's browser extension, present only when the\n * wallet ships one that announces an injected EVM (eip155) provider.\n * Consumers match the announced provider by this rdns to open the extension\n * on desktop; absent means no (known/verified) extension. See {@link EXTENSIONS}.\n */\n rdns?: string;\n /** Web-store URL for the browser extension — for an \"Install {wallet}\" affordance. */\n extensionUrl?: string;\n}\n\nconst ICON_BASE = 'https://wallet-assets.lydian.com/wallets';\n\ninterface WalletDef {\n id: string;\n name: string;\n namespaces: readonly WalletNamespace[];\n}\n\nconst WALLETS: readonly WalletDef[] = [\n { id: 'metamask', name: 'MetaMask', namespaces: ['eip155'] },\n { id: 'trust', name: 'Trust', namespaces: ['eip155', 'solana'] },\n { id: 'rainbow', name: 'Rainbow', namespaces: ['eip155'] },\n { id: 'coinbase', name: 'Coinbase', namespaces: ['eip155', 'solana'] },\n { id: 'zerion', name: 'Zerion', namespaces: ['eip155'] },\n { id: 'tokenpocket', name: 'Token Pocket', namespaces: ['eip155', 'solana'] },\n { id: 'blockchaincom', name: 'Blockchain.com', namespaces: ['bip122', 'eip155', 'solana'] },\n { id: 'exodus', name: 'Exodus', namespaces: ['eip155', 'solana'] },\n { id: 'phantom', name: 'Phantom', namespaces: ['bip122', 'eip155', 'solana'] },\n { id: 'okx', name: 'OKX', namespaces: ['bip122', 'eip155', 'solana'] },\n { id: 'cryptocom', name: 'Crypto.com', namespaces: ['bip122', 'eip155', 'solana'] },\n { id: 'argent', name: 'Argent', namespaces: ['eip155'] },\n { id: 'safepal', name: 'SafePal', namespaces: ['eip155', 'solana', 'ton'] },\n { id: 'imtoken', name: 'imToken', namespaces: ['eip155'] },\n { id: 'ronin', name: 'Ronin', namespaces: ['eip155'] },\n { id: 'coin98', name: 'Coin98', namespaces: ['eip155', 'solana'] },\n { id: 'bitkeep', name: 'Bitget Wallet', namespaces: ['eip155', 'solana'] },\n { id: '1inch', name: '1inch', namespaces: ['eip155', 'solana'] },\n { id: 'ledgerlive', name: 'Ledger Live', namespaces: ['bip122', 'eip155', 'solana'] },\n { id: 'atomic', name: 'Atomic', namespaces: ['bip122', 'eip155', 'solana'] },\n { id: 'alpha', name: 'Alpha', namespaces: ['eip155'] },\n { id: 'math', name: 'Math', namespaces: ['eip155', 'solana'] },\n { id: 'bitpay', name: 'BitPay', namespaces: ['eip155'] },\n { id: 'rabby', name: 'Rabby', namespaces: ['eip155'] },\n { id: 'bybit', name: 'Bybit', namespaces: ['eip155', 'solana'] },\n { id: 'binance', name: 'Binance', namespaces: ['eip155', 'solana'] },\n { id: 'gate', name: 'Gate Wallet', namespaces: ['eip155'] },\n { id: 'core', name: 'Core', namespaces: ['eip155', 'solana'] },\n { id: 'backpack', name: 'Backpack', namespaces: ['eip155', 'solana'] },\n { id: 'frontier', name: 'Frontier', namespaces: ['eip155'] },\n { id: 'onekey', name: 'OneKey', namespaces: ['eip155'] },\n { id: 'kraken', name: 'Kraken', namespaces: ['eip155', 'solana'] },\n { id: 'uniswap', name: 'Uniswap Wallet', namespaces: ['eip155'] },\n { id: 'omni', name: 'Omni', namespaces: ['eip155'] },\n { id: 'mew', name: 'MEW Wallet', namespaces: ['eip155'] },\n { id: 'foxwallet', name: 'FoxWallet', namespaces: ['eip155'] },\n { id: 'nova', name: 'Nova Wallet', namespaces: ['eip155'] },\n { id: 'subwallet', name: 'SubWallet', namespaces: ['eip155'] },\n { id: 'safe', name: 'Safe', namespaces: ['eip155'] },\n { id: 'robinhood', name: 'Robinhood Wallet', namespaces: ['eip155'] },\n { id: 'tangem', name: 'Tangem', namespaces: ['eip155', 'solana'] },\n { id: 'trezor', name: 'Trezor', namespaces: ['bip122', 'eip155', 'solana'] },\n { id: 'kucoin', name: 'KuCoin', namespaces: ['eip155', 'solana'] },\n { id: 'jupiter', name: 'Jupiter', namespaces: ['solana'] },\n { id: 'zengo', name: 'Zengo', namespaces: ['eip155'] },\n { id: 'bitcoincom', name: 'Bitcoin.com', namespaces: ['eip155'] },\n { id: 'keplr', name: 'Keplr', namespaces: ['eip155'] },\n { id: 'cake', name: 'Cake Wallet', namespaces: ['eip155', 'solana'] },\n { id: 'unstoppable', name: 'Unstoppable', namespaces: ['eip155'] },\n { id: 'bifrost', name: 'Bifrost', namespaces: ['bip122', 'eip155'] },\n { id: 'pintu', name: 'Pintu', namespaces: ['eip155'] },\n { id: 'hot', name: 'HOT Wallet', namespaces: ['eip155', 'solana'] },\n { id: 'arculus', name: 'Arculus', namespaces: ['bip122', 'eip155', 'solana'] },\n];\n\n/**\n * Browser-extension metadata, keyed by wallet id. An entry means the wallet\n * ships a browser extension that announces an injected EVM (eip155) provider via\n * EIP-6963, matched by `rdns`. Hand-maintained (like the deep-link registry in\n * `@lydianpay/lydianconnect`): rdns values are self-attested per EIP-6963, so\n * each is corroborated against the wallet's own docs / the WalletConnect explorer\n * before being added — a wrong rdns silently breaks matching. Only wallets whose\n * `namespaces` include `eip155` belong here.\n */\nconst EXTENSIONS: Readonly<Record<string, { rdns: string; extensionUrl: string }>> = {\n metamask: {\n rdns: 'io.metamask',\n extensionUrl:\n 'https://chromewebstore.google.com/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn',\n },\n trust: {\n rdns: 'com.trustwallet.app',\n extensionUrl:\n 'https://chromewebstore.google.com/detail/trust-wallet/egjidjbpglichdcondbcbdnbeeppgdph',\n },\n rabby: {\n rdns: 'io.rabby',\n extensionUrl:\n 'https://chromewebstore.google.com/detail/rabby-wallet/acmacodkjbdgmoleebolmdjonilkdbch',\n },\n okx: {\n // Legacy \"okex\" brand retained in the extension's rdns after the 2022 rebrand.\n rdns: 'com.okex.wallet',\n extensionUrl:\n 'https://chromewebstore.google.com/detail/okx-wallet/mcohilncbfahbmgdjkbpemcciiolgcge',\n },\n phantom: {\n rdns: 'app.phantom',\n extensionUrl:\n 'https://chromewebstore.google.com/detail/phantom/bfnaelmomeimhlpmgjnjophhpkkoljpa',\n },\n zerion: {\n rdns: 'io.zerion',\n extensionUrl:\n 'https://chromewebstore.google.com/detail/zerion-wallet-crypto-defi/klghhnkeealcohjjanjjdaeeggmfmlpl',\n },\n rainbow: {\n rdns: 'me.rainbow',\n extensionUrl:\n 'https://chromewebstore.google.com/detail/rainbow/opfgelmcmbiajamepnmloijbpoleiama',\n },\n};\n\nexport const WALLET_CATALOG: readonly WalletCatalogEntry[] = WALLETS.map((w) => ({\n ...w,\n iconUrl: `${ICON_BASE}/${w.id}.png`,\n ...(EXTENSIONS[w.id] ?? {}),\n}));\n\nexport type MutableWalletCatalogEntry = Omit<WalletCatalogEntry, 'namespaces'> & {\n namespaces: WalletNamespace[];\n};\n\nexport function getWalletCatalog(): MutableWalletCatalogEntry[] {\n return WALLET_CATALOG.map((w) => ({ ...w, namespaces: [...w.namespaces] }));\n}\n\nexport function walletName(id: string): string | undefined {\n return WALLET_CATALOG.find((w) => w.id === id)?.name;\n}\n","import type {\n CaipNamespace,\n Connection,\n OpenWalletInput,\n ConnectorType,\n LydianConnectEvent,\n LydianConnectEventHandler,\n} from \"./types\";\n\nexport interface ConnectRequest {\n walletId: string;\n namespace: CaipNamespace;\n /** Cancel a pending connection (replaces the host app's manual cancel plumbing). */\n signal?: AbortSignal;\n}\n\n/** The CAIP-2 chain a request targets, e.g. \"eip155:137\". */\nexport function requestedChain(req: ConnectRequest): string | undefined {\n return req.namespace.value.chains?.[0];\n}\n\n/**\n * Internal contract every connector implements. The host app never sees this —\n * it only ever touches {@link LydianConnect} and the {@link Connection} handle.\n */\nexport interface Connector {\n readonly type: ConnectorType;\n /**\n * Wallet ids this connector natively serves. The WalletConnect fallback\n * returns an empty list and claims any wallet not served by another connector.\n */\n readonly walletIds: readonly string[];\n /** Namespace families this connector can connect on. The WalletConnect\n * fallback serves all; SDK connectors restrict to what their SDK speaks. */\n servesNamespace(namespaceName: string): boolean;\n isAvailable(walletId: string): boolean | Promise<boolean>;\n connect(req: ConnectRequest): Promise<Connection>;\n /** Rebuild Connections for still-live sessions — the reconnect-on-reload case. */\n restore(): Promise<Connection[]>;\n /** Tear down everything this connector owns. */\n reset(): Promise<void>;\n on(handler: LydianConnectEventHandler): () => void;\n /**\n * Foreground the wallet app, optionally handing it a pairing to approve.\n * Only the WalletConnect fallback implements this — an SDK drives its own\n * app-opening, and an extension has no app to open.\n */\n openWallet?(input: OpenWalletInput): boolean;\n}\n\nexport abstract class BaseConnector implements Connector {\n abstract readonly type: ConnectorType;\n readonly walletIds: readonly string[] = [];\n\n private handlers = new Set<LydianConnectEventHandler>();\n /** Depth of in-flight connects; see {@link duringConnect}. */\n private connecting = 0;\n\n abstract isAvailable(walletId: string): boolean | Promise<boolean>;\n abstract connect(req: ConnectRequest): Promise<Connection>;\n\n servesNamespace(_namespaceName: string): boolean {\n return true;\n }\n\n async restore(): Promise<Connection[]> {\n return [];\n }\n\n async reset(): Promise<void> {\n /* no-op by default */\n }\n\n on(handler: LydianConnectEventHandler): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n /**\n * Run a connect with its handshake events suppressed.\n *\n * A connector that binds provider listeners before requesting accounts sees the\n * wallet's own setup traffic — an initial `chainChanged`, and another when\n * `ensureChain` switches. Forwarding those makes the host believe the user moved\n * networks mid-connect. Nothing is lost by dropping them: connect() reads the\n * authoritative account and chain when it settles, and only changes made after\n * that are the user's.\n */\n protected async duringConnect<T>(run: () => Promise<T>): Promise<T> {\n this.connecting++;\n try {\n return await run();\n } finally {\n this.connecting--;\n }\n }\n\n protected emit(event: LydianConnectEvent): void {\n if (\n this.connecting > 0 &&\n (event.type === \"chainChanged\" || event.type === \"accountsChanged\")\n ) {\n return;\n }\n for (const handler of this.handlers) handler(event);\n }\n}\n","/** Shared app identity passed to every connector; mapped to each SDK's own shape internally. */\nexport interface AppConfig {\n /** Display name shown in the wallet's connect prompt. */\n appName: string;\n /** Optional icon shown in the wallet's connect prompt. */\n icon?: string;\n /** Optional description; defaults to appName. */\n description?: string;\n}\n\n/**\n * The dapp URL, derived from the page origin at connect-time (always client-side).\n * Returns '' during SSR — connectors only read this when initializing their SDK,\n * which never happens on the server.\n */\nexport function deriveUrl(): string {\n return typeof window !== \"undefined\" ? window.location.origin : \"\";\n}\n","/** Shared EVM logic for the EIP-1193 connectors. */\n\n/**\n * Sized from measurement: MetaMask answers `eth_chainId` from a local cache\n * refreshed only when the provider processes `chainChanged`, which arrived ~700ms\n * after `wallet_switchEthereumChain` resolved. The timeout is several times that\n * for headroom on a phone; the interval is cheap because each read is a cache\n * lookup rather than a round-trip. Only paid in full when the wallet never moves.\n */\nconst CHAIN_SETTLE = { timeoutMs: 4000, intervalMs: 100 };\n\n/**\n * The one call every EIP-1193 provider can make, narrowed to a plain function so\n * three unrelated provider types can share the logic here. Each connector adapts\n * its own provider to this shape.\n *\n * Takes the same `{ method, params }` object EIP-1193's own `request` does — and\n * that `Connection.request` exposes — so there is a single call shape everywhere\n * and the adapters stay close to pass-throughs.\n */\nexport type EvmRpc = (args: {\n method: string;\n params?: unknown[] | Record<string, unknown>;\n}) => Promise<unknown>;\n\n/** Normalize a wallet's chain id (hex or decimal) to CAIP-2. */\nexport function toCaip(chainId: string | null | undefined): string {\n if (!chainId) return \"eip155:1\";\n const num = chainId.startsWith(\"0x\")\n ? parseInt(chainId, 16)\n : Number(chainId);\n return `eip155:${Number.isFinite(num) ? num : 1}`;\n}\n\nasync function currentChain(rpc: EvmRpc): Promise<string> {\n const raw = await rpc({ method: \"eth_chainId\" }).catch(() => null);\n return toCaip(typeof raw === \"string\" ? raw : null);\n}\n\n/** Re-read until the wallet reports `chainId`, or the deadline passes. */\nasync function settleChain({\n rpc,\n chainId,\n timeoutMs,\n intervalMs,\n}: {\n rpc: EvmRpc;\n chainId: string;\n timeoutMs: number;\n intervalMs: number;\n}): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n for (;;) {\n const actual = await currentChain(rpc);\n if (actual === chainId || Date.now() >= deadline) return;\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n}\n\n/**\n * Best-effort switch to the requested chain; leaves the wallet as-is if it's\n * unknown to it. After a switch the wallet accepts, WAITS for its reported chain\n * to catch up — the acknowledgement is not proof the chain has changed yet, and\n * a caller reading `eth_chainId` immediately would still see the old one.\n */\nexport async function ensureChain({\n rpc,\n chainId,\n timeoutMs = CHAIN_SETTLE.timeoutMs,\n intervalMs = CHAIN_SETTLE.intervalMs,\n}: {\n rpc: EvmRpc;\n chainId: string | undefined; // \"eip155:137\"\n timeoutMs?: number;\n intervalMs?: number;\n}): Promise<void> {\n const chainNumber = chainId ? Number(chainId.split(\":\")[1]) : NaN;\n if (!Number.isFinite(chainNumber) || chainNumber <= 0) return;\n const requested = `eip155:${chainNumber}`;\n if ((await currentChain(rpc)) === requested) return;\n\n const switched = await rpc({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: `0x${chainNumber.toString(16)}` }],\n }).then(\n () => true,\n // Chain not added to the wallet, or the user declined — the caller's\n // chainChanged will reflect reality. No settle: the chain isn't moving.\n () => false,\n );\n if (switched) {\n await settleChain({ rpc, chainId: requested, timeoutMs, intervalMs });\n }\n}\n","/**\n * Reject a pending promise when the caller's signal aborts (the user cancelled).\n *\n * The underlying wallet request usually cannot be cancelled — the wallet has\n * already been asked. What this settles is *our* promise, so the host app's\n * cancel actually returns control instead of leaving a connect pending forever,\n * to resolve later into a UI that has moved on.\n *\n * `onAbort` runs before the rejection, for cleanup the caller owns (tearing down\n * a pairing, say).\n */\nexport function withSignal<T>(\n promise: Promise<T>,\n signal?: AbortSignal,\n onAbort?: () => void,\n): Promise<T> {\n if (!signal) return promise;\n if (signal.aborted) {\n onAbort?.();\n return Promise.reject(new DOMException(\"Aborted\", \"AbortError\"));\n }\n return new Promise<T>((resolve, reject) => {\n const abortHandler = () => {\n onAbort?.();\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n };\n signal.addEventListener(\"abort\", abortHandler, { once: true });\n promise.then(\n (value) => {\n signal.removeEventListener(\"abort\", abortHandler);\n resolve(value);\n },\n (error) => {\n signal.removeEventListener(\"abort\", abortHandler);\n reject(error);\n },\n );\n });\n}\n","import type {\n MetaMaskSDK as MetaMaskSDKType,\n MetaMaskSDKOptions,\n} from \"@metamask/sdk\";\nimport {\n BaseConnector,\n type ConnectRequest,\n requestedChain,\n} from \"../../core/connector\";\nimport type { Connection } from \"../../core/types\";\nimport { type AppConfig, deriveUrl } from \"../../core/app\";\nimport { type EvmRpc, ensureChain, toCaip } from \"../eip155/chain\";\nimport { withSignal } from \"../../core/abort\";\n\n/** The provider type MetaMaskSDK.getProvider() returns, without depending on a named export. */\ntype MetaMaskProvider = NonNullable<ReturnType<MetaMaskSDKType[\"getProvider\"]>>;\n\nconst WALLET_ID = \"metamask\";\n\nexport class MetaMaskConnector extends BaseConnector {\n readonly type = \"sdk\" as const;\n readonly walletIds = [WALLET_ID] as const;\n\n private sdk: MetaMaskSDKType | null = null;\n private provider: MetaMaskProvider | null = null;\n private listenersBound = false;\n\n constructor(private app: AppConfig) {\n super();\n }\n\n isAvailable(): boolean {\n return true; // SDK covers desktop (extension) and mobile (deep-link) itself\n }\n\n servesNamespace(name: string): boolean {\n return name === \"eip155\"; // MetaMask SDK speaks EVM only\n }\n\n private async getProvider(): Promise<MetaMaskProvider> {\n if (this.provider) return this.provider;\n const { MetaMaskSDK } = await import(\"@metamask/sdk\"); // value import — code-split, loaded on demand\n const dappMetadata: MetaMaskSDKOptions[\"dappMetadata\"] = {\n name: this.app.appName,\n url: deriveUrl(),\n ...(this.app.icon ? { iconUrl: this.app.icon } : {}),\n };\n const sdk = new MetaMaskSDK({ dappMetadata });\n await sdk.init();\n const provider = sdk.getProvider();\n if (!provider) throw new Error(\"MetaMask provider unavailable\");\n this.sdk = sdk;\n this.provider = provider;\n this.bindEvents(provider);\n return provider;\n }\n\n private bindEvents(provider: MetaMaskProvider): void {\n if (this.listenersBound) return;\n this.listenersBound = true;\n provider.on(\"chainChanged\", (hex) => {\n this.emit({\n type: \"chainChanged\",\n walletId: WALLET_ID,\n chainId: toCaip(String(hex)),\n });\n });\n provider.on(\"accountsChanged\", (accounts) => {\n const account = Array.isArray(accounts)\n ? (accounts[0] as string | undefined)\n : undefined;\n if (account)\n this.emit({ type: \"accountsChanged\", walletId: WALLET_ID, account });\n else this.emit({ type: \"disconnect\", walletId: WALLET_ID });\n });\n provider.on(\"disconnect\", () =>\n this.emit({ type: \"disconnect\", walletId: WALLET_ID }),\n );\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n // Listeners are bound in getProvider(); see BaseConnector.duringConnect.\n return this.duringConnect(async () => {\n const provider = await this.getProvider();\n // The SDK cannot withdraw the prompt, but the host's cancel must still\n // settle this promise.\n const accounts = await withSignal(\n provider.request<string[]>({ method: \"eth_requestAccounts\" }),\n req.signal,\n );\n const account = accounts?.[0];\n if (!account) throw new Error(\"MetaMask returned no account\");\n await ensureChain({\n rpc: rpcFor(provider),\n chainId: requestedChain(req),\n });\n const chainId = toCaip(\n await provider.request<string>({ method: \"eth_chainId\" }),\n );\n return this.toConnection(provider, account, chainId);\n });\n }\n\n async restore(): Promise<Connection[]> {\n const provider = await this.getProvider().catch(() => null);\n if (!provider) return [];\n const accounts = await provider\n .request<string[]>({ method: \"eth_accounts\" })\n .catch(() => []);\n const account = accounts?.[0];\n if (!account) return [];\n const chainId = toCaip(\n await provider\n .request<string>({ method: \"eth_chainId\" })\n .catch(() => \"0x1\"),\n );\n return [this.toConnection(provider, account, chainId)];\n }\n\n async reset(): Promise<void> {\n await this.sdk?.terminate();\n this.provider = null;\n this.listenersBound = false;\n }\n\n private toConnection(\n provider: MetaMaskProvider,\n account: string,\n chainId: string,\n ): Connection {\n return {\n walletId: WALLET_ID,\n account,\n chainId,\n request: async <T>(args: { method: string; params?: unknown }) =>\n (await provider.request<T>({\n method: args.method,\n params: args.params as never,\n })) as T,\n openWallet: () => {}, // MetaMask SDK foregrounds the wallet on request\n disconnect: async () => {\n await this.sdk?.terminate();\n this.provider = null;\n this.listenersBound = false;\n this.emit({ type: \"disconnect\", walletId: WALLET_ID });\n },\n };\n }\n}\n\n/** Adapt the SDK provider to the plain call shape the shared chain logic takes. */\nfunction rpcFor(provider: MetaMaskProvider): EvmRpc {\n return (args) => provider.request(args);\n}\n","import type { CoinbaseWalletSDK as CoinbaseWalletSDKType } from \"@coinbase/wallet-sdk\";\nimport {\n BaseConnector,\n type ConnectRequest,\n requestedChain,\n} from \"../../core/connector\";\nimport type { Connection } from \"../../core/types\";\nimport type { AppConfig } from \"../../core/app\";\nimport { type EvmRpc, ensureChain, toCaip } from \"../eip155/chain\";\n\ntype CoinbaseProvider = NonNullable<\n ReturnType<CoinbaseWalletSDKType[\"makeWeb3Provider\"]>\n>;\ntype RequestArgs = Parameters<CoinbaseProvider[\"request\"]>[0];\n\nconst WALLET_ID = \"coinbase\";\n\n/** Coinbase v4's provider.request is non-generic and returns unknown; wrap + cast. */\nfunction rpc<T>(\n provider: CoinbaseProvider,\n method: string,\n params?: unknown,\n): Promise<T> {\n return provider.request({\n method,\n params,\n } as unknown as RequestArgs) as Promise<T>;\n}\n\nexport class CoinbaseConnector extends BaseConnector {\n readonly type = \"sdk\" as const;\n readonly walletIds = [WALLET_ID] as const;\n\n private provider: CoinbaseProvider | null = null;\n private listenersBound = false;\n\n constructor(private app: AppConfig) {\n super();\n }\n\n isAvailable(): boolean {\n return true; // SDK covers extension + mobile deep-link itself\n }\n\n servesNamespace(name: string): boolean {\n return name === \"eip155\"; // Coinbase Wallet SDK provider speaks EVM only\n }\n\n private async getProvider(appChainIds?: number[]): Promise<CoinbaseProvider> {\n if (this.provider) return this.provider;\n const { CoinbaseWalletSDK } = await import(\"@coinbase/wallet-sdk\"); // lazy — code-split\n const sdk = new CoinbaseWalletSDK({\n appName: this.app.appName,\n appLogoUrl: this.app.icon,\n appChainIds, // one-time SDK-init hint; ensureChain enforces the actual chain per connect\n });\n const provider = sdk.makeWeb3Provider();\n this.provider = provider;\n this.bindEvents(provider);\n return provider;\n }\n\n private bindEvents(provider: CoinbaseProvider): void {\n if (this.listenersBound) return;\n this.listenersBound = true;\n provider.on(\"chainChanged\", (hex) => {\n this.emit({\n type: \"chainChanged\",\n walletId: WALLET_ID,\n chainId: toCaip(String(hex)),\n });\n });\n provider.on(\"accountsChanged\", (accounts) => {\n const account = Array.isArray(accounts)\n ? (accounts[0] as string | undefined)\n : undefined;\n if (account)\n this.emit({ type: \"accountsChanged\", walletId: WALLET_ID, account });\n else this.emit({ type: \"disconnect\", walletId: WALLET_ID });\n });\n provider.on(\"disconnect\", () =>\n this.emit({ type: \"disconnect\", walletId: WALLET_ID }),\n );\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n // Listeners are bound in getProvider(); see BaseConnector.duringConnect.\n return this.duringConnect(async () => {\n const provider = await this.getProvider(evmChainIds(req));\n const accounts = await rpc<string[]>(provider, \"eth_requestAccounts\");\n const account = accounts?.[0];\n if (!account) throw new Error(\"Coinbase Wallet returned no account\");\n await ensureChain({\n rpc: rpcFor(provider),\n chainId: requestedChain(req),\n });\n const chainId = toCaip(await rpc<string>(provider, \"eth_chainId\"));\n return this.toConnection(provider, account, chainId);\n });\n }\n\n async restore(): Promise<Connection[]> {\n const provider = await this.getProvider().catch(() => null);\n if (!provider) return [];\n const accounts = await rpc<string[]>(provider, \"eth_accounts\").catch(\n () => [] as string[],\n );\n const account = accounts?.[0];\n if (!account) return [];\n const chainId = toCaip(\n await rpc<string>(provider, \"eth_chainId\").catch(() => \"0x1\"),\n );\n return [this.toConnection(provider, account, chainId)];\n }\n\n async reset(): Promise<void> {\n await this.provider?.disconnect().catch(() => {});\n this.provider = null;\n this.listenersBound = false;\n }\n\n private toConnection(\n provider: CoinbaseProvider,\n account: string,\n chainId: string,\n ): Connection {\n return {\n walletId: WALLET_ID,\n account,\n chainId,\n request: <T>(args: { method: string; params?: unknown }) =>\n rpc<T>(provider, args.method, args.params),\n openWallet: () => {}, // Coinbase SDK foregrounds the wallet on request\n disconnect: async () => {\n await provider.disconnect().catch(() => {});\n this.provider = null;\n this.listenersBound = false;\n this.emit({ type: \"disconnect\", walletId: WALLET_ID });\n },\n };\n }\n}\n\n/** Adapt the SDK provider to the plain call shape the shared chain logic takes. */\nfunction rpcFor(provider: CoinbaseProvider): EvmRpc {\n return ({ method, params }) => rpc(provider, method, params);\n}\n\n/** The numeric EVM chain id the connect targets, for Coinbase's appChainIds hint. */\nfunction evmChainIds(req: ConnectRequest): number[] | undefined {\n const wanted = req.namespace.value.chains?.[0];\n const n = wanted ? Number(wanted.split(\":\")[1]) : NaN;\n return Number.isFinite(n) && n > 0 ? [n] : undefined;\n}\n","import {\n BaseConnector,\n type ConnectRequest,\n requestedChain,\n} from \"../../core/connector\";\nimport type { Connection } from \"../../core/types\";\nimport { type EvmRpc, ensureChain, toCaip } from \"../eip155/chain\";\nimport { withSignal } from \"../../core/abort\";\n\n/** The slice of an EIP-1193 provider we depend on. */\ninterface Eip1193Provider {\n request<T = unknown>(args: { method: string; params?: unknown }): Promise<T>;\n on(event: string, listener: (...args: unknown[]) => void): void;\n}\n\n/** EIP-6963 provider info (the fields we read). */\ninterface Eip6963ProviderInfo {\n uuid: string;\n name: string;\n icon: string;\n rdns: string;\n}\n\ninterface Eip6963ProviderDetail {\n info: Eip6963ProviderInfo;\n provider: Eip1193Provider;\n}\n\n/** How long to wait for a late `announceProvider` after re-requesting discovery. */\nconst DISCOVERY_WAIT_MS = 100;\n\n/**\n * Connects a wallet's browser EXTENSION via its injected EIP-1193 provider,\n * discovered through EIP-6963 (Multi Injected Provider Discovery). A page cannot\n * \"open\" an extension directly; `eth_requestAccounts` triggers the extension's\n * own popup, which is the effective equivalent.\n *\n * Claims the wallet ids handed to it (those with an `rdns` in the catalog, minus\n * the ones a dedicated SDK connector already serves). It's availability-gated by\n * {@link ConnectManager}: when the extension hasn't announced a provider,\n * {@link isAvailable} is false and the manager falls back to WalletConnect (QR),\n * so the host app never branches on whether the extension is present.\n *\n * EVM-only: EIP-6963 announces `eip155` providers, so {@link servesNamespace}\n * restricts to `eip155` and non-EVM chains route to the fallback.\n */\nexport class InjectedConnector extends BaseConnector {\n readonly type = \"injected\" as const;\n readonly walletIds: readonly string[];\n\n /** rdns -> the provider it announced. Populated by EIP-6963 discovery. */\n private discovered = new Map<string, Eip6963ProviderDetail>();\n /**\n * Providers we've already attached listeners to. Bind once and keep for the\n * page's life (never remove) so a reconnect doesn't stack duplicate listeners.\n * EIP-6963 announces exactly one provider per rdns, so a given provider maps to\n * a single walletId — closing over walletId in bindEvents is safe.\n */\n private bound = new WeakSet<Eip1193Provider>();\n private listening = false;\n\n constructor(private rdnsByWallet: Readonly<Record<string, string>>) {\n super();\n this.walletIds = Object.keys(rdnsByWallet);\n this.startDiscovery();\n }\n\n /** Listen for provider announcements, then ask installed extensions to announce. */\n private startDiscovery(): void {\n if (this.listening || typeof window === \"undefined\") return;\n this.listening = true;\n window.addEventListener(\"eip6963:announceProvider\", (event: Event) => {\n const detail = (event as CustomEvent<Eip6963ProviderDetail>).detail;\n if (detail?.info?.rdns && detail.provider)\n this.discovered.set(detail.info.rdns, detail);\n });\n window.dispatchEvent(new Event(\"eip6963:requestProvider\"));\n }\n\n servesNamespace(name: string): boolean {\n return name === \"eip155\"; // EIP-6963 announces EVM (eip155) injected providers\n }\n\n /** Available iff the wallet's extension has announced an injected provider. */\n async isAvailable(walletId: string): Promise<boolean> {\n if (typeof window === \"undefined\") return false;\n const rdns = this.rdnsByWallet[walletId];\n if (!rdns) return false;\n if (this.discovered.has(rdns)) return true;\n // Extension may have injected after our first request — re-ask and give it a beat.\n window.dispatchEvent(new Event(\"eip6963:requestProvider\"));\n await new Promise((resolve) => setTimeout(resolve, DISCOVERY_WAIT_MS));\n return this.discovered.has(rdns);\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const provider = this.providerFor(req.walletId);\n if (!provider)\n throw new Error(`No injected provider announced for \"${req.walletId}\"`);\n const accounts = await withSignal(\n provider.request<string[]>({ method: \"eth_requestAccounts\" }), // triggers the extension popup\n req.signal,\n );\n const account = accounts?.[0];\n if (!account)\n throw new Error(`${req.walletId} extension returned no account`);\n await ensureChain({ rpc: rpcFor(provider), chainId: requestedChain(req) });\n const chainId = toCaip(\n await provider.request<string>({ method: \"eth_chainId\" }),\n );\n this.bindEvents(provider, req.walletId);\n return this.toConnection(provider, req.walletId, account, chainId);\n }\n\n async restore(): Promise<Connection[]> {\n if (typeof window === \"undefined\") return [];\n if (this.discovered.size === 0) {\n window.dispatchEvent(new Event(\"eip6963:requestProvider\"));\n await new Promise((resolve) => setTimeout(resolve, DISCOVERY_WAIT_MS));\n }\n const out: Connection[] = [];\n for (const walletId of this.walletIds) {\n const provider = this.providerFor(walletId);\n if (!provider) continue;\n const accounts = await provider\n .request<string[]>({ method: \"eth_accounts\" })\n .catch(() => [] as string[]);\n const account = accounts?.[0];\n if (!account) continue;\n const chainId = toCaip(\n await provider\n .request<string>({ method: \"eth_chainId\" })\n .catch(() => \"0x1\"),\n );\n this.bindEvents(provider, walletId);\n out.push(this.toConnection(provider, walletId, account, chainId));\n }\n return out;\n }\n\n private providerFor(walletId: string): Eip1193Provider | undefined {\n const rdns = this.rdnsByWallet[walletId];\n return rdns ? this.discovered.get(rdns)?.provider : undefined;\n }\n\n private bindEvents(provider: Eip1193Provider, walletId: string): void {\n if (this.bound.has(provider)) return;\n this.bound.add(provider);\n provider.on(\"chainChanged\", (hex) => {\n this.emit({\n type: \"chainChanged\",\n walletId,\n chainId: toCaip(String(hex)),\n });\n });\n provider.on(\"accountsChanged\", (accounts) => {\n const account = Array.isArray(accounts)\n ? (accounts[0] as string | undefined)\n : undefined;\n if (account) this.emit({ type: \"accountsChanged\", walletId, account });\n else this.emit({ type: \"disconnect\", walletId });\n });\n provider.on(\"disconnect\", () =>\n this.emit({ type: \"disconnect\", walletId }),\n );\n }\n\n private toConnection(\n provider: Eip1193Provider,\n walletId: string,\n account: string,\n chainId: string,\n ): Connection {\n return {\n walletId,\n account,\n chainId,\n request: async <T>(args: { method: string; params?: unknown }) =>\n (await provider.request<T>({\n method: args.method,\n params: args.params,\n })) as T,\n openWallet: () => {}, // the extension foregrounds its own popup on request\n disconnect: async () => {\n await provider\n .request({\n method: \"wallet_revokePermissions\",\n params: [{ eth_accounts: {} }],\n })\n .catch(() => {\n /* not all extensions implement revoke; dropping our handle is enough */\n });\n this.emit({ type: \"disconnect\", walletId });\n },\n };\n }\n}\n\n/** Adapt the injected provider to the plain call shape the shared chain logic takes. */\nfunction rpcFor(provider: Eip1193Provider): EvmRpc {\n return (args) => provider.request(args);\n}\n","// Wallet deep-link registry — hand-maintained.\n// Originally seeded from the WalletConnect explorer API; edit entries directly now.\n// Per entry: native = bare app scheme (foreground only); scheme = WC connect deep\n// link (we append `?uri=`); universal = fallback only; store = not-installed links.\nimport type { WalletLink } from \"./registry\";\n\nexport const WALLET_LINKS: Record<string, WalletLink> = {\n metamask: {\n native: \"metamask://\",\n scheme: \"metamask://wc\",\n universal: \"https://metamask.app.link/wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/metamask/id1438144202\",\n android: \"https://play.google.com/store/apps/details?id=io.metamask\",\n },\n },\n trust: {\n native: \"trust://\",\n scheme: \"trust://wc\",\n universal: \"https://link.trustwallet.com/wc\",\n store: {\n ios: \"https://apps.apple.com/app/apple-store/id1288339409\",\n android:\n \"https://play.google.com/store/apps/details?id=com.wallet.crypto.trustapp\",\n },\n },\n rainbow: {\n native: \"rainbow://\",\n scheme: \"rainbow://wc\",\n universal: \"https://rnbwapp.com/wc\",\n store: {\n ios: \"https://apps.apple.com/app/apple-store/id1457119021?pt=119997837&ct=wc&mt=8\",\n android:\n \"https://play.google.com/store/apps/details?id=me.rainbow&referrer=utm_source%3Dwc%26utm_medium%3Dconnector%26utm_campaign%3Dwc\",\n },\n },\n coinbase: {\n store: {\n ios: \"https://apps.apple.com/us/app/base-formerly-coinbase-wallet/id1278383455\",\n },\n },\n zerion: {\n native: \"zerion://\",\n scheme: \"zerion://wc\",\n universal: \"https://wallet.zerion.io/wc/wc\",\n store: {\n ios: \"https://apps.apple.com/app/id1456732565\",\n android:\n \"https://play.google.com/store/apps/details?id=io.zerion.android&hl=en&gl=US\",\n },\n },\n tokenpocket: {\n native: \"tpoutside://\",\n scheme: \"tpoutside://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/tp-wallet/id6444625622?l=en\",\n android:\n \"https://play.google.com/store/apps/details?id=vip.mytokenpocket\",\n },\n },\n blockchaincom: {\n native: \"blockchain-wallet://\",\n scheme: \"blockchain-wallet://wc\",\n universal: \"https://login.blockchain.com/app/wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/blockchain-bitcoin-wallet/id493253309\",\n android:\n \"https://play.google.com/store/apps/details?id=piuk.blockchain.android\",\n },\n },\n exodus: {\n native: \"exodus://\",\n scheme: \"exodus://wc\",\n universal: \"https://exodus.com/m/wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/exodus-crypto-bitcoin-wallet/id1414384820\",\n android:\n \"https://play.google.com/store/apps/details?id=exodusmovement.exodus&hl=en&gl=US\",\n },\n },\n phantom: {\n store: {\n ios: \"https://apps.apple.com/us/app/phantom-crypto-wallet/id1598432977\",\n android:\n \"https://play.google.com/store/apps/details?id=app.phantom&hl=en\",\n },\n },\n okx: {\n native: \"okxwallet://main\",\n scheme: \"okxwallet://main/wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/okx-buy-bitcoin-eth-crypto/id1327268470\",\n android:\n \"https://play.google.com/store/apps/details?id=com.okinc.okex.gp\",\n },\n },\n cryptocom: {\n native: \"cryptowallet://\",\n scheme: \"cryptowallet://wc\",\n store: {\n ios: \"https://apps.apple.com/US/app/id1512048310?mt=8\",\n android: \"https://play.google.com/store/apps/details?id=com.defi.wallet\",\n },\n },\n argent: {\n native: \"argent://app/\",\n scheme: \"argent://app/wc\",\n universal: \"https://www.argent.xyz/app/wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/argent-defi-in-a-tap/id1358741926\",\n android:\n \"https://play.google.com/store/apps/details?id=im.argent.contractwalletclient&hl=en&gl=US&pli=1\",\n },\n },\n safepal: {\n native: \"safepalwallet://\",\n scheme: \"safepalwallet://wc\",\n universal: \"https://link.safepal.io/wc\",\n store: {\n ios: \"https://apps.apple.com/app/safepal-wallet/id1548297139\",\n android:\n \"https://play.google.com/store/apps/details?id=io.safepal.wallet\",\n },\n },\n imtoken: {\n native: \"imtokenv2://\",\n scheme: \"imtokenv2://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/imtoken2/id1384798940\",\n android: \"https://play.google.com/store/apps/details?id=im.token.app\",\n },\n },\n ronin: {\n native: \"roninwallet://\",\n scheme: \"roninwallet://wc\",\n universal: \"https://wallet.roninchain.com/wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/ronin-wallet/id1592675001\",\n android:\n \"https://play.google.com/store/apps/details?id=com.skymavis.genesis\",\n },\n },\n coin98: {\n native: \"coin98://\",\n scheme: \"coin98://wc\",\n universal: \"https://coin98.com/wc\",\n store: {\n ios: \"https://apps.apple.com/vn/app/coin98-wallet/id1561969966\",\n android:\n \"https://play.google.com/store/apps/details?id=coin98.crypto.finance.media&hl=vi&gl=US\",\n },\n },\n bitkeep: {\n native: \"bitkeep://\",\n scheme: \"bitkeep://wc\",\n universal: \"https://bkapp.vip/wc\",\n store: {\n ios: \"https://web3.bitget.com/en/wallet-download?type=0\",\n android: \"https://web3.bitget.com/en/wallet-download?type=0\",\n },\n },\n \"1inch\": {\n native: \"oneinch://open/nobodywilleveruseit\",\n scheme: \"oneinch://open/nobodywilleveruseit/wc\",\n universal: \"https://wallet.1inch.io/app/nobodywilleveruseit/wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/1inch-defi-wallet/id1546049391\",\n android:\n \"https://play.google.com/store/apps/details?id=io.oneinch.android\",\n },\n },\n ledgerlive: {\n native: \"ledgerlive://\",\n scheme: \"ledgerlive://wc\",\n store: {\n ios: \"https://itunes.apple.com/app/id1361671700\",\n android: \"https://play.google.com/store/apps/details?id=com.ledger.live\",\n },\n },\n atomic: {\n native: \"atomicwallet://\",\n scheme: \"atomicwallet://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/atomic-wallet/id1478257827\",\n android: \"https://play.google.com/store/apps/details?id=io.atomicwallet\",\n },\n },\n alpha: {\n native: \"awallet://\",\n scheme: \"awallet://wc\",\n universal: \"https://aw.app/wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/alphawallet-eth-wallet/id1358230430\",\n android:\n \"https://play.google.com/store/apps/details?id=io.stormbird.wallet\",\n },\n },\n math: {\n native: \"mathwallet://\",\n scheme: \"mathwallet://wc\",\n universal: \"https://www.mathwallet.org/wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/mathwallet5/id1582612388\",\n android:\n \"https://play.google.com/store/apps/details?id=com.mathwallet.android\",\n },\n },\n bitpay: {\n native: \"bitpay://\",\n scheme: \"bitpay://wc\",\n universal: \"https://link.bitpay.com/wc\",\n store: {\n ios: \"https://bitpay.onelink.me/Cenw/ejjaw7bs\",\n android: \"https://bitpay.onelink.me/Cenw/ejjaw7bs\",\n },\n },\n rabby: {\n native: \"rabby://\",\n scheme: \"rabby://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/rabby-wallet-crypto-evm/id6474381673\",\n android:\n \"https://play.google.com/store/apps/details?id=com.debank.rabbymobile\",\n },\n },\n // Bybit's WC deep link nests the uri inside a targetUrl wrapper (bybitapp://open/route?targetUrl=by://web3/walletconnect/wc?uri=...), which the `${scheme}?uri=` builder can't express — QR/scan connect only.\n bybit: {\n store: {\n ios: \"https://apps.apple.com/us/app/bybit-buy-trade-crypto/id1488296980\",\n android: \"https://play.google.com/store/apps/details?id=com.bybit.app\",\n },\n },\n binance: {\n native: \"bnc://app.binance.com/cedefi/\",\n scheme: \"bnc://app.binance.com/cedefi/wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/id1436799971\",\n android: \"https://play.google.com/store/apps/details?id=com.binance.dev\",\n },\n },\n gate: {\n native: \"gtweb3wallet://\",\n scheme: \"gtweb3wallet://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/gate-io-buy-bitcoin-crypto/id1294998195\",\n android:\n \"https://play.google.com/store/apps/details?id=com.gateio.gateio\",\n },\n },\n // Core: `core://` scheme not corroborated to 2 sources — QR/scan connect only.\n core: {\n store: {\n ios: \"https://apps.apple.com/us/app/core-wallet/id6443685999\",\n android: \"https://play.google.com/store/apps/details?id=com.avaxwallet\",\n },\n },\n // Backpack: `backpack://` scheme not corroborated to 2 sources — QR/scan connect only.\n backpack: {\n store: {\n ios: \"https://apps.apple.com/us/app/backpack-wallet-exchange/id6445964121\",\n android:\n \"https://play.google.com/store/apps/details?id=app.backpack.mobile\",\n },\n },\n frontier: {\n native: \"frontier://\",\n scheme: \"frontier://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/frontier-crypto-defi-wallet/id1482380988\",\n android:\n \"https://play.google.com/store/apps/details?id=com.frontierwallet\",\n },\n },\n onekey: {\n native: \"onekey-wallet://\",\n scheme: \"onekey-wallet://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/onekey-open-source-wallet/id1609559473\",\n android:\n \"https://play.google.com/store/apps/details?id=so.onekey.app.wallet\",\n },\n },\n kraken: {\n native: \"krakenwallet://\",\n scheme: \"krakenwallet://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/kraken-wallet/id1626327149\",\n android:\n \"https://play.google.com/store/apps/details?id=com.kraken.superwallet\",\n },\n },\n uniswap: {\n native: \"uniswap://\",\n scheme: \"uniswap://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/uniswap-crypto-nft-wallet/id6443944476\",\n android:\n \"https://play.google.com/store/apps/details?id=com.uniswap.mobile\",\n },\n },\n omni: {\n native: \"omni://\",\n scheme: \"omni://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/omni-web3-wallet/id1569375204\",\n android:\n \"https://play.google.com/store/apps/details?id=fi.steakwallet.app\",\n },\n },\n mew: {\n universal: \"https://mewwallet.com/wc\",\n store: {\n ios: \"https://apps.apple.com/app/id1464614025\",\n android:\n \"https://play.google.com/store/apps/details?id=com.myetherwallet.mewwallet\",\n },\n },\n foxwallet: {\n native: \"foxwallet://\",\n scheme: \"foxwallet://wc\",\n universal: \"https://link.foxwallet.com/wc\",\n store: {\n ios: \"https://apps.apple.com/app/foxwallet-crypto-web3/id1590983231\",\n android:\n \"https://play.google.com/store/apps/details?id=com.foxwallet.play\",\n },\n },\n nova: {\n native: \"novawallet://\",\n scheme: \"novawallet://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/nova-polkadot-wallet/id1597119355\",\n android:\n \"https://play.google.com/store/apps/details?id=io.novafoundation.nova.market\",\n },\n },\n subwallet: {\n native: \"subwallet://\",\n scheme: \"subwallet://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/subwallet-polkadot-wallet/id1633050285\",\n android:\n \"https://play.google.com/store/apps/details?id=app.subwallet.mobile\",\n },\n },\n safe: {\n native: \"safe://\",\n scheme: \"safe://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/safe-mobile/id6748754793\",\n android:\n \"https://play.google.com/store/apps/details?id=global.safe.mobileapp\",\n },\n },\n robinhood: {\n native: \"robinhood-wallet://\",\n scheme: \"robinhood-wallet://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/robinhood-wallet-swap-crypto/id1634080733\",\n android:\n \"https://play.google.com/store/apps/details?id=com.robinhood.gateway\",\n },\n },\n tangem: {\n native: \"tangem://\",\n scheme: \"tangem://wc\",\n store: {\n ios: \"https://apps.apple.com/app/tangem/id1354868448\",\n android:\n \"https://play.google.com/store/apps/details?id=com.tangem.wallet\",\n },\n },\n // Trezor Suite: WalletConnect pairing is QR/paste-into-Suite (no corroborated custom scheme) — QR connect only.\n trezor: {\n store: {\n ios: \"https://apps.apple.com/us/app/trezor-suite/id1631884497\",\n android: \"https://play.google.com/store/apps/details?id=io.trezor.suite\",\n },\n },\n kucoin: {\n native: \"kucoin://\",\n scheme: \"kucoin:///wallet/walletConnect\",\n store: {\n ios: \"https://apps.apple.com/app/kucoin-buy-bitcoin-crypto/id1378956601\",\n android: \"https://play.google.com/store/apps/details?id=com.kubi.kucoin\",\n },\n },\n // Jupiter (Solana): no corroborated WC deep-link scheme — QR connect only.\n jupiter: {\n store: {\n ios: \"https://apps.apple.com/us/app/jupiter-solana-swap-wallet/id6484069059\",\n android:\n \"https://play.google.com/store/apps/details?id=ag.jup.jupiter.android\",\n },\n },\n zengo: {\n native: \"zengo://get.zengo.com/\",\n scheme: \"zengo://get.zengo.com/wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/zengo-crypto-bitcoin-wallet/id1440147115\",\n android: \"https://play.google.com/store/apps/details?id=com.zengo.wallet\",\n },\n },\n // Bitcoin.com Wallet: no corroborated WC deep-link scheme — QR connect only.\n bitcoincom: {\n store: {\n ios: \"https://apps.apple.com/us/app/bitcoin-wallet-by-bitcoin-com/id1252903728\",\n android:\n \"https://play.google.com/store/apps/details?id=com.bitcoin.mwallet\",\n },\n },\n keplr: {\n native: \"keplrwallet://\",\n scheme: \"keplrwallet://wcV2\",\n store: {\n ios: \"https://apps.apple.com/us/app/keplr-wallet/id1567851089\",\n android:\n \"https://play.google.com/store/apps/details?id=com.chainapsis.keplr\",\n },\n },\n cake: {\n native: \"cakewallet://\",\n scheme: \"cakewallet://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/cake-wallet/id1334702542\",\n android:\n \"https://play.google.com/store/apps/details?id=com.cakewallet.cake_wallet\",\n },\n },\n unstoppable: {\n native: \"unstoppable.money://\",\n scheme: \"unstoppable.money://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/unstoppable-crypto-wallet/id1447619907\",\n android:\n \"https://play.google.com/store/apps/details?id=io.horizontalsystems.bankwallet\",\n },\n },\n bifrost: {\n native: \"bifrostwallet://\",\n scheme: \"bifrostwallet://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/bifrost-wallet/id1577198351\",\n android:\n \"https://play.google.com/store/apps/details?id=com.bifrostwallet.app\",\n },\n },\n pintu: {\n native: \"pintu://web3wallet\",\n scheme: \"pintu://web3wallet/wc\",\n store: {\n ios: \"https://apps.apple.com/id/app/pintu-buy-invest-crypto/id1494119678\",\n android: \"https://play.google.com/store/apps/details?id=com.valar.pintu\",\n },\n },\n hot: {\n native: \"hotwallet://\",\n scheme: \"hotwallet://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/hot-wallet/id6740916148\",\n android:\n \"https://play.google.com/store/apps/details?id=app.herewallet.hot\",\n },\n },\n arculus: {\n native: \"arculuswc://\",\n scheme: \"arculuswc://wc\",\n universal: \"https://gw.arculus.co/app/wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/arculus-wallet/id1575425801\",\n android:\n \"https://play.google.com/store/apps/details?id=co.arculus.wallet.android\",\n },\n },\n};\n","import { WALLET_LINKS } from \"./wallet-links\";\n\nexport interface WalletLink {\n /** App scheme used to foreground the wallet — without the `wc` suffix; may include a path (e.g. \"okxwallet://main\"). */\n native?: string;\n /** Custom scheme deep link incl. the `wc` path; we append `?uri=`. e.g. \"metamask://wc\". Preferred on mobile (same-tab). */\n scheme?: string;\n /** Universal/applink incl. the `wc` path. Fallback only — used when no `scheme` exists. */\n universal?: string;\n /** App store links — used for the \"wallet not installed\" fallback. */\n store?: { ios?: string; android?: string };\n}\n\nexport const DEFAULT_WALLET_LINKS: Record<string, WalletLink> = WALLET_LINKS;\n","import type { WalletLink } from \"./registry\";\n\nexport function isMobile(): boolean {\n if (typeof navigator === \"undefined\") return false;\n const ua = navigator.userAgent || \"\";\n const uaDataMobile =\n (navigator as { userAgentData?: { mobile?: boolean } }).userAgentData\n ?.mobile ?? false;\n return /iPhone|iPad|iPod|Android/i.test(ua) || uaDataMobile;\n}\n\nfunction buildLink(base: string, uri: string): string {\n const sep = base.includes(\"?\") ? \"&\" : \"?\";\n return `${base}${sep}uri=${encodeURIComponent(uri)}`;\n}\n\n/**\n * Whether a pairing can actually be handed to this wallet. Several catalog\n * entries carry only `native` or `store`, which cannot take a URI — telling the\n * host otherwise gets it to render a button that does nothing.\n */\nexport function canOpen(link: WalletLink | undefined): boolean {\n return !!(link?.scheme || link?.universal);\n}\n\n/**\n * Open the wallet for a WalletConnect pairing, in the SAME TAB. Returns whether\n * a link was fired. See CLAUDE.md for why the caller must offer a button (the\n * gesture) and why `\"universal\"` is never chosen automatically.\n */\nexport function openWallet(\n link: WalletLink,\n uri: string,\n via: \"scheme\" | \"universal\" = \"scheme\",\n): boolean {\n if (typeof document === \"undefined\") return false;\n const base =\n via === \"universal\" ? link.universal : (link.scheme ?? link.universal);\n if (!base) return false;\n openHref(buildLink(base, uri), false);\n return true;\n}\n\n/**\n * Bring the wallet app to the foreground (no WC URI) — for an approval the user\n * must return to the wallet for. Uses the bare `native` scheme; call within a gesture.\n */\nexport function openWalletApp(link: WalletLink): void {\n if (typeof document === \"undefined\") return;\n if (!link.native) return;\n openHref(link.native, false);\n}\n\nfunction openHref(href: string, newContext: boolean): void {\n const a = document.createElement(\"a\");\n a.href = href;\n if (newContext) {\n a.target = \"_blank\";\n a.rel = \"noopener noreferrer\";\n }\n a.style.display = \"none\";\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n}\n\n/** Resolves true if the page was backgrounded (wallet likely opened) within the window. */\nexport function detectAppOpen(timeoutMs: number): Promise<boolean> {\n if (typeof document === \"undefined\") return Promise.resolve(false);\n return new Promise((resolve) => {\n let done = false;\n const finish = (opened: boolean) => {\n if (done) return;\n done = true;\n document.removeEventListener(\"visibilitychange\", onVisibility);\n window.removeEventListener(\"pagehide\", onPageHide);\n clearTimeout(timer);\n resolve(opened);\n };\n const onVisibility = () => {\n if (document.hidden) finish(true);\n };\n const onPageHide = () => finish(true);\n document.addEventListener(\"visibilitychange\", onVisibility);\n window.addEventListener(\"pagehide\", onPageHide);\n const timer = setTimeout(() => finish(false), timeoutMs);\n });\n}\n","import SignClient from \"@walletconnect/sign-client\";\nimport { getSdkError, parseUri } from \"@walletconnect/utils\";\nimport type { SessionTypes } from \"@walletconnect/types\";\nimport { BaseConnector, type ConnectRequest } from \"../../core/connector\";\nimport type {\n CaipNamespace,\n Connection,\n OpenWalletInput,\n} from \"../../core/types\";\nimport { type AppConfig, deriveUrl } from \"../../core/app\";\nimport { withSignal } from \"../../core/abort\";\nimport { DEFAULT_WALLET_LINKS, type WalletLink } from \"./registry\";\nimport {\n canOpen,\n detectAppOpen,\n isMobile,\n openWallet as openWalletLink,\n openWalletApp,\n} from \"./deeplink\";\n\nconst STORAGE_KEY = \"lydianconnect.wc.topics\"; // walletId -> session topic\n\n/**\n * How long to wait for a stored session's peer to answer a ping before treating\n * it as dead. Generous enough for a phone on a slow network, far short of the\n * five-minute proposal expiry a wrongly-reused session would otherwise cost.\n */\nconst PING_TIMEOUT_MS = 3000;\n\nexport interface WalletConnectOptions {\n projectId: string;\n relayUrl?: string;\n walletLinks?: Record<string, WalletLink>;\n openTimeoutMs?: number;\n}\n\nexport class WalletConnectConnector extends BaseConnector {\n readonly type = \"walletconnect\" as const;\n readonly walletIds: readonly string[] = []; // claims any wallet not served by an SDK connector\n\n private client: SignClient | null = null;\n private links: Record<string, WalletLink>;\n private topics = new Map<string, string>();\n /** walletId -> pairing URI of the connect currently awaiting approval, so a\n * host-driven open button can fire without the host tracking the URI itself. */\n private pending = new Map<string, string>();\n\n constructor(\n private app: AppConfig,\n private options: WalletConnectOptions,\n ) {\n super();\n this.links = { ...DEFAULT_WALLET_LINKS, ...(options.walletLinks ?? {}) };\n }\n\n isAvailable(): boolean {\n return true;\n }\n\n private async getClient(): Promise<SignClient> {\n if (this.client) return this.client;\n const client = await SignClient.init({\n projectId: this.options.projectId,\n metadata: {\n name: this.app.appName,\n description: this.app.description ?? this.app.appName,\n url: deriveUrl(),\n icons: this.app.icon ? [this.app.icon] : [],\n },\n relayUrl: this.options.relayUrl,\n });\n\n client.on(\"session_delete\", ({ topic }) => {\n const walletId = this.walletForTopic(topic);\n if (!walletId) return;\n this.topics.delete(walletId);\n this.persist();\n this.emit({ type: \"disconnect\", walletId });\n });\n\n client.on(\"session_event\", ({ topic, params }) => {\n const walletId = this.walletForTopic(topic);\n if (!walletId) return;\n const { name, data } = params.event;\n if (name === \"chainChanged\") {\n // params.chainId is the CAIP-2 chain the event is scoped to; prefix the\n // bare value with its namespace rather than assuming eip155.\n const ns = params.chainId.split(\":\")[0] ?? \"eip155\";\n const chainId =\n typeof data === \"string\" && data.includes(\":\")\n ? data\n : `${ns}:${String(data)}`;\n this.emit({ type: \"chainChanged\", walletId, chainId });\n } else if (name === \"accountsChanged\" && Array.isArray(data) && data[0]) {\n const account = String(data[0]).split(\":\").pop() ?? \"\";\n if (account) this.emit({ type: \"accountsChanged\", walletId, account });\n }\n });\n\n this.client = client;\n this.load();\n return client;\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const client = await this.getClient();\n\n const reused = await this.tryReuse(client, req);\n if (reused) return reused;\n\n // sign-client v2 folds `requiredNamespaces` into optionalNamespaces and\n // sends `requiredNamespaces: {}`, so this is not honored as \"required\" and\n // changing it back and forth achieves nothing. toConnection() verifying the\n // approved chains is what makes that safe.\n const { uri, approval } = await client.connect({\n requiredNamespaces: { [req.namespace.name]: req.namespace.value },\n });\n if (!uri) throw new Error(\"WalletConnect did not return a pairing URI\");\n\n const link = isMobile() ? this.links[req.walletId] : undefined;\n // Emit before opening anything: when the automatic deep link below is\n // suppressed, this event is all that stands between the user and a spinner.\n this.emit({\n type: \"display_uri\",\n walletId: req.walletId,\n uri,\n deepLink: canOpen(link),\n });\n\n // `link` may exist yet carry no scheme or universal — nothing to fire, and\n // no failure to report either.\n if (link && canOpen(link)) {\n this.pending.set(req.walletId, uri);\n openWalletLink(link, uri);\n void detectAppOpen(this.options.openTimeoutMs ?? 2000).then((opened) => {\n if (!opened)\n this.emit({\n type: \"wallet_open_failed\",\n walletId: req.walletId,\n uri,\n store: link.store,\n });\n });\n }\n\n const pairingTopic = parseUri(uri).topic;\n const session = await withSignal(approval(), req.signal, () => {\n void client.core.pairing\n .disconnect({ topic: pairingTopic })\n .catch(() => {});\n }).finally(() => this.pending.delete(req.walletId));\n\n const connection = this.toConnection(\n client,\n req.walletId,\n session,\n req.namespace,\n );\n this.topics.set(req.walletId, session.topic);\n this.persist();\n return connection;\n }\n\n /**\n * Fire a wallet's deep link on demand. The host calls this from a real click,\n * which is the one context a mobile browser reliably allows a scheme\n * navigation from — see the note on {@link openWallet}.\n */\n openWallet(input: OpenWalletInput): boolean {\n const link = this.links[input.walletId];\n if (!link) return false;\n const uri = input.uri ?? this.pending.get(input.walletId);\n // No URI: nothing to hand over, so just foreground the app. `via` has no\n // meaning here — there is no pairing link to build either way.\n if (!uri) {\n openWalletApp(link);\n return !!link.native;\n }\n return openWalletLink(link, uri, input.via ?? \"scheme\");\n }\n\n async restore(): Promise<Connection[]> {\n const client = await this.getClient();\n // One round-trip for all wallets rather than N in series.\n const checked = await Promise.all(\n [...this.topics].map(\n async ([walletId, topic]) =>\n [walletId, await this.liveSession(client, topic)] as const,\n ),\n );\n const out: Connection[] = [];\n for (const [walletId, session] of checked) {\n if (!session) {\n this.topics.delete(walletId);\n continue;\n }\n const ns = firstNamespace(session);\n if (ns) out.push(this.toConnection(client, walletId, session, ns));\n }\n this.persist();\n return out;\n }\n\n async reset(): Promise<void> {\n const client = this.client;\n if (client) {\n await Promise.allSettled(\n client.session.getAll().map((s) =>\n client.disconnect({\n topic: s.topic,\n reason: getSdkError(\"USER_DISCONNECTED\"),\n }),\n ),\n );\n }\n this.topics.clear();\n this.pending.clear();\n this.persist();\n }\n\n // --- helpers ---\n\n private async tryReuse(\n client: SignClient,\n req: ConnectRequest,\n ): Promise<Connection | null> {\n const topic = this.topics.get(req.walletId);\n if (!topic) return null;\n const session = await this.liveSession(client, topic);\n if (!session) {\n this.topics.delete(req.walletId);\n this.persist();\n return null;\n }\n const ns = session.namespaces[req.namespace.name];\n const wanted = req.namespace.value.chains?.[0];\n if (!ns || (wanted && !ns.chains?.includes(wanted))) return null;\n return this.toConnection(client, req.walletId, session, req.namespace);\n }\n\n private toConnection(\n client: SignClient,\n walletId: string,\n session: SessionTypes.Struct,\n namespace: CaipNamespace,\n ): Connection {\n const ns = session.namespaces[namespace.name];\n const account =\n (ns?.accounts ?? [])\n .map((a) => a.split(\":\")[2])\n .find((a): a is string => !!a) ?? \"\";\n // What the wallet actually granted, in its own order. `chains` is optional\n // per CAIP-25 and some wallets send it empty, so fall back on length rather\n // than nullishness — otherwise the chain below is fabricated as mainnet and\n // pinned into every request.\n const approved = ns?.chains?.length\n ? ns.chains\n : (ns?.accounts ?? []).map((a) => a.split(\":\").slice(0, 2).join(\":\"));\n const wanted = namespace.value.chains?.[0];\n // Prefer the chain we asked for whenever it was approved. Taking chains[0]\n // instead — as this used to — hands back whichever chain the wallet happened\n // to list first, and since that id is pinned into every request below, the\n // payment would be signed on it.\n const chainId =\n wanted && approved.includes(wanted)\n ? wanted\n : (approved[0] ?? `${namespace.name}:1`);\n const topic = session.topic;\n return {\n walletId,\n account,\n chainId,\n request: <T>(args: { method: string; params?: unknown }) =>\n client.request<T>({\n topic,\n chainId,\n request: { method: args.method, params: args.params as never },\n }),\n openWallet: () => {\n if (!isMobile()) return;\n const link = this.links[walletId];\n if (link) openWalletApp(link);\n },\n disconnect: async () => {\n await client\n .disconnect({ topic, reason: getSdkError(\"USER_DISCONNECTED\") })\n .catch(() => {});\n this.topics.delete(walletId);\n this.persist();\n this.emit({ type: \"disconnect\", walletId });\n },\n };\n }\n\n /**\n * A stored session the wallet is still on the other end of. The local record\n * is not evidence — it survives the user clearing the dApp inside their\n * wallet — and reusing a dead one returns a Connection that looks healthy\n * while every request hangs. So the peer has to answer for it.\n */\n private async liveSession(\n client: SignClient,\n topic: string,\n ): Promise<SessionTypes.Struct | undefined> {\n let session: SessionTypes.Struct;\n try {\n session = client.session.get(topic);\n } catch {\n return undefined;\n }\n let timer: ReturnType<typeof setTimeout> | undefined;\n const alive = await Promise.race([\n client\n .ping({ topic })\n .then(() => true)\n .catch(() => false),\n new Promise<boolean>((resolve) => {\n timer = setTimeout(() => resolve(false), PING_TIMEOUT_MS);\n }),\n ]).finally(() => clearTimeout(timer));\n return alive ? session : undefined;\n }\n\n private walletForTopic(topic: string): string | null {\n for (const [walletId, t] of this.topics) if (t === topic) return walletId;\n return null;\n }\n\n private persist(): void {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify([...this.topics]));\n } catch {\n /* SSR / no storage */\n }\n }\n\n private load(): void {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (raw)\n this.topics = new Map(JSON.parse(raw) as Array<[string, string]>);\n } catch {\n /* SSR / no storage */\n }\n }\n}\n\nfunction firstNamespace(session: SessionTypes.Struct): CaipNamespace | null {\n const name = Object.keys(session.namespaces)[0];\n if (!name) return null;\n const v = session.namespaces[name];\n if (!v) return null;\n return {\n name,\n value: { chains: v.chains, methods: v.methods, events: v.events },\n };\n}\n","import { ConnectManager } from \"./manager\";\nimport { buildNamespace } from \"./namespace\";\nimport type { Connector } from \"./connector\";\nimport type { AppConfig } from \"./app\";\nimport type {\n ConnectInput,\n Connection,\n LydianConnectConfig,\n LydianConnectEventHandler,\n OpenWalletInput,\n} from \"./types\";\nimport { WALLET_CATALOG } from \"@lydianpay/lydianconnect-catalog\";\nimport { MetaMaskConnector } from \"../connectors/metamask/connector\";\nimport { CoinbaseConnector } from \"../connectors/coinbase/connector\";\nimport { InjectedConnector } from \"../connectors/injected/connector\";\nimport { WalletConnectConnector } from \"../connectors/walletconnect/connector\";\n\n/**\n * catalog walletId -> EIP-6963 rdns, for every wallet that ships a browser\n * extension (has an `rdns`) on an EVM chain, EXCEPT those a dedicated SDK\n * connector already serves — the injected connector must not double-claim them.\n */\nfunction injectedRdnsMap(\n sdkServed: ReadonlySet<string>,\n): Record<string, string> {\n const map: Record<string, string> = {};\n for (const w of WALLET_CATALOG) {\n if (w.rdns && w.namespaces.includes(\"eip155\") && !sdkServed.has(w.id))\n map[w.id] = w.rdns;\n }\n return map;\n}\n\n/**\n * The library-owned connector set. Adding a new wallet SDK is a change HERE —\n * consumers get it on `npm update` with no code change. SDK code stays\n * code-split (lazy `import()` inside each connector), so registering a\n * connector adds ~nothing to the host app's initial bundle.\n */\nfunction createConnectors(config: LydianConnectConfig): Connector[] {\n const app: AppConfig = {\n appName: config.appName,\n icon: config.icon,\n description: config.description,\n };\n const sdk = [new MetaMaskConnector(app), new CoinbaseConnector(app)];\n const sdkServed = new Set(sdk.flatMap((c) => c.walletIds));\n return [\n ...sdk,\n new InjectedConnector(injectedRdnsMap(sdkServed)),\n new WalletConnectConnector(app, {\n projectId: config.walletConnectProjectId,\n }),\n ];\n}\n\n/**\n * The single surface the host app touches. Hand it a flat config; it owns the\n * connectors and routes each wallet to its native SDK (or the WalletConnect\n * fallback), returning a uniform {@link Connection} either way.\n */\nexport class LydianConnect {\n private manager: ConnectManager;\n\n constructor(config: LydianConnectConfig) {\n this.manager = new ConnectManager(createConnectors(config));\n }\n\n init(): Promise<void> {\n return this.manager.init();\n }\n\n async connect(input: ConnectInput): Promise<Connection> {\n if (input.chainId === undefined || input.chainId === null) {\n throw new Error(\n 'connect() requires a chainId (a number like 137 or an \"eip155:<id>\" string)',\n );\n }\n return this.manager.connect({\n walletId: input.walletId,\n namespace: buildNamespace(input.chainId),\n signal: input.signal,\n });\n }\n\n /**\n * Open a wallet app, optionally handing it the pairing URI from `display_uri`.\n *\n * Call this from a real click handler. A mobile browser will suppress the same\n * navigation issued automatically after an async step, which is why the\n * `display_uri` event reports `deepLink` — that is the library asking the host\n * for a button to put this behind.\n *\n * Returns whether a link was fired. `false` means nothing is known for this\n * wallet on this device; show the QR code instead.\n */\n openWallet(input: OpenWalletInput): boolean {\n return this.manager.openWallet(input);\n }\n\n restore(): Promise<Connection[]> {\n return this.manager.restore();\n }\n\n disconnect(walletId?: string): Promise<void> {\n return this.manager.disconnect(walletId);\n }\n\n reset(): Promise<void> {\n return this.manager.reset();\n }\n\n get(walletId: string): Connection | undefined {\n return this.manager.get(walletId);\n }\n\n on(handler: LydianConnectEventHandler): () => void {\n return this.manager.on(handler);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/core/manager.ts","../src/core/namespace.ts","../node_modules/@lydianpay/lydianconnect-catalog/src/index.ts","../src/core/connector.ts","../src/core/app.ts","../src/connectors/eip155/chain.ts","../src/core/abort.ts","../src/connectors/metamask/connector.ts","../src/connectors/coinbase/connector.ts","../src/connectors/injected/connector.ts","../src/connectors/walletconnect/wallet-links.ts","../src/connectors/walletconnect/registry.ts","../src/connectors/walletconnect/deeplink.ts","../src/connectors/walletconnect/connector.ts","../src/core/lydian-connect.ts"],"names":["rpc","WALLET_ID","rpcFor"],"mappings":"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","file":"index.js","sourcesContent":["import type { Connector, ConnectRequest } from \"./connector\";\nimport type {\n Connection,\n LydianConnectEvent,\n LydianConnectEventHandler,\n OpenWalletInput,\n} from \"./types\";\n\n/**\n * Routing engine: takes a flat list of connectors, auto-detects the fallback\n * (the connector with no claimed walletIds), routes each walletId to its\n * connector, and forwards events. Internal — the host app uses `LydianConnect`.\n */\nexport class ConnectManager {\n private byWallet = new Map<string, Connector>();\n private fallback: Connector;\n private all: Connector[];\n private connections = new Map<string, Connection>();\n private handlers = new Set<LydianConnectEventHandler>();\n private unsubs: Array<() => void> = [];\n private started = false;\n\n constructor(connectors: Connector[]) {\n const fallbacks = connectors.filter((c) => c.walletIds.length === 0);\n if (fallbacks.length !== 1) {\n throw new Error(\n `LydianConnect requires exactly one fallback connector (empty walletIds); found ${fallbacks.length}`,\n );\n }\n this.fallback = fallbacks[0]!;\n this.all = connectors;\n for (const connector of connectors) {\n for (const id of connector.walletIds) this.byWallet.set(id, connector);\n }\n }\n\n /** Wire connector event forwarding, once. */\n async init(): Promise<void> {\n if (this.started) return;\n this.started = true;\n for (const connector of this.all) {\n this.unsubs.push(connector.on((event) => this.handle(event)));\n }\n }\n\n /**\n * The connector claiming this walletId if it serves the requested namespace\n * AND is currently available, else the fallback. So an EVM-only SDK connector\n * is bypassed to WalletConnect for a non-EVM chain, and the injected connector\n * is bypassed when the wallet's extension hasn't announced a provider. The host\n * app is oblivious. SDK connectors report `isAvailable` synchronously as `true`,\n * so this only awaits for connectors that actually probe (e.g. injected).\n */\n private async resolve(\n walletId: string,\n namespaceName: string,\n ): Promise<Connector> {\n const claimed = this.byWallet.get(walletId);\n if (\n claimed &&\n claimed.servesNamespace(namespaceName) &&\n (await claimed.isAvailable(walletId))\n )\n return claimed;\n return this.fallback;\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n if (!this.started) await this.init();\n const connector = await this.resolve(req.walletId, req.namespace.name);\n const connection = await connector.connect(req);\n this.connections.set(req.walletId, connection);\n this.emit({ type: \"connect\", walletId: req.walletId, connection });\n return connection;\n }\n\n async restore(): Promise<Connection[]> {\n if (!this.started) await this.init();\n const restored: Connection[] = [];\n for (const connector of this.all) {\n const conns = await connector.restore().catch(() => [] as Connection[]);\n for (const conn of conns) {\n this.connections.set(conn.walletId, conn);\n restored.push(conn);\n }\n }\n return restored;\n }\n\n get(walletId: string): Connection | undefined {\n return this.connections.get(walletId);\n }\n\n /**\n * Fire a wallet's deep link. Goes straight to the fallback: it is the only\n * connector that owns a link table, and the only one that emits the\n * `display_uri` a host is responding to when it calls this.\n */\n openWallet(input: OpenWalletInput): boolean {\n return this.fallback.openWallet?.(input) ?? false;\n }\n\n async disconnect(walletId?: string): Promise<void> {\n if (walletId) {\n await this.connections\n .get(walletId)\n ?.disconnect()\n .catch(() => {});\n this.connections.delete(walletId);\n return;\n }\n await Promise.allSettled(\n [...this.connections.values()].map((c) => c.disconnect()),\n );\n this.connections.clear();\n }\n\n async reset(): Promise<void> {\n await this.disconnect();\n await Promise.allSettled(this.all.map((c) => c.reset()));\n }\n\n on(handler: LydianConnectEventHandler): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n private handle(event: LydianConnectEvent): void {\n if (event.type === \"disconnect\") this.connections.delete(event.walletId);\n this.emit(event);\n }\n\n private emit(event: LydianConnectEvent): void {\n for (const handler of this.handlers) handler(event);\n }\n}\n","import type { CaipNamespace } from \"./types\";\n\n// Per-namespace method/event sets. A bare number is always EVM (back-compat).\n// tron/ton are intentionally absent — not WalletConnect-reachable, so they're\n// payment-by-QR only and must not negotiate a wallet session here.\nconst NAMESPACE_DEFAULTS: Record<\n string,\n { methods: string[]; events: string[] }\n> = {\n eip155: {\n methods: [\n \"eth_sendTransaction\",\n \"personal_sign\",\n \"eth_signTypedData_v4\",\n \"wallet_switchEthereumChain\",\n ],\n events: [\"chainChanged\", \"accountsChanged\"],\n },\n solana: {\n methods: [\n \"solana_signTransaction\",\n \"solana_signMessage\",\n \"solana_signAndSendTransaction\",\n ],\n events: [],\n },\n bip122: {\n methods: [\"sendTransfer\", \"signMessage\", \"signPsbt\", \"getAccountAddresses\"],\n events: [\"bip122_addressesChanged\"],\n },\n};\n\n/**\n * Build a CAIP namespace from a chain id.\n * A number maps to `eip155:<n>` (the EVM back-compat path); a CAIP-2 string\n * `<namespace>:<reference>` is honored if the namespace is one we connect.\n * Unsupported namespaces (e.g. `tron:`, `ton:`) throw rather than silently\n * applying defaults to a chain we can't negotiate a session for.\n */\nexport function buildNamespace(chainId: number | string): CaipNamespace {\n const caip = typeof chainId === \"number\" ? `eip155:${chainId}` : chainId;\n const [name, reference] = caip.split(\":\");\n const defaults = name ? NAMESPACE_DEFAULTS[name] : undefined;\n if (!name || !defaults || !reference) {\n throw new Error(\n `Unsupported chain \"${caip}\". lydianconnect connects ${Object.keys(NAMESPACE_DEFAULTS).join(\", \")} — ` +\n `pass a number (EVM) or a \"<namespace>:<reference>\" CAIP-2 id.`,\n );\n }\n // eip155 references are positive integers; non-EVM references are opaque ids.\n if (\n name === \"eip155\" &&\n !(/^\\d+$/.test(reference) && Number(reference) > 0)\n ) {\n throw new Error(\n `Invalid eip155 chain \"${caip}\" — the reference must be a positive integer.`,\n );\n }\n return {\n name,\n value: {\n chains: [caip],\n methods: defaults.methods,\n events: defaults.events,\n },\n };\n}\n","/** CAIP-2 namespace families a wallet can connect on. */\nexport type WalletNamespace = 'eip155' | 'solana' | 'bip122' | 'tron' | 'ton';\n\nexport interface WalletCatalogEntry {\n id: string;\n name: string;\n iconUrl: string;\n namespaces: readonly WalletNamespace[];\n /**\n * EIP-6963 rdns of the wallet's browser extension, present only when the\n * wallet ships one that announces an injected EVM (eip155) provider.\n * Consumers match the announced provider by this rdns to open the extension\n * on desktop; absent means no (known/verified) extension. See {@link EXTENSIONS}.\n */\n rdns?: string;\n /** Web-store URL for the browser extension — for an \"Install {wallet}\" affordance. */\n extensionUrl?: string;\n}\n\nconst ICON_BASE = 'https://wallet-assets.lydian.com/wallets';\n\ninterface WalletDef {\n id: string;\n name: string;\n namespaces: readonly WalletNamespace[];\n}\n\nconst WALLETS: readonly WalletDef[] = [\n { id: 'metamask', name: 'MetaMask', namespaces: ['eip155'] },\n { id: 'trust', name: 'Trust', namespaces: ['eip155', 'solana'] },\n { id: 'rainbow', name: 'Rainbow', namespaces: ['eip155'] },\n { id: 'coinbase', name: 'Coinbase', namespaces: ['eip155', 'solana'] },\n { id: 'zerion', name: 'Zerion', namespaces: ['eip155'] },\n { id: 'tokenpocket', name: 'Token Pocket', namespaces: ['eip155', 'solana'] },\n { id: 'blockchaincom', name: 'Blockchain.com', namespaces: ['bip122', 'eip155', 'solana'] },\n { id: 'exodus', name: 'Exodus', namespaces: ['eip155', 'solana'] },\n { id: 'phantom', name: 'Phantom', namespaces: ['bip122', 'eip155', 'solana'] },\n { id: 'okx', name: 'OKX', namespaces: ['bip122', 'eip155', 'solana'] },\n { id: 'cryptocom', name: 'Crypto.com', namespaces: ['bip122', 'eip155', 'solana'] },\n { id: 'argent', name: 'Argent', namespaces: ['eip155'] },\n { id: 'safepal', name: 'SafePal', namespaces: ['eip155', 'solana', 'ton'] },\n { id: 'imtoken', name: 'imToken', namespaces: ['eip155'] },\n { id: 'ronin', name: 'Ronin', namespaces: ['eip155'] },\n { id: 'coin98', name: 'Coin98', namespaces: ['eip155', 'solana'] },\n { id: 'bitkeep', name: 'Bitget Wallet', namespaces: ['eip155', 'solana'] },\n { id: '1inch', name: '1inch', namespaces: ['eip155', 'solana'] },\n { id: 'ledgerlive', name: 'Ledger Live', namespaces: ['bip122', 'eip155', 'solana'] },\n { id: 'atomic', name: 'Atomic', namespaces: ['bip122', 'eip155', 'solana'] },\n { id: 'alpha', name: 'Alpha', namespaces: ['eip155'] },\n { id: 'math', name: 'Math', namespaces: ['eip155', 'solana'] },\n { id: 'bitpay', name: 'BitPay', namespaces: ['eip155'] },\n { id: 'rabby', name: 'Rabby', namespaces: ['eip155'] },\n { id: 'bybit', name: 'Bybit', namespaces: ['eip155', 'solana'] },\n { id: 'binance', name: 'Binance', namespaces: ['eip155', 'solana'] },\n { id: 'gate', name: 'Gate Wallet', namespaces: ['eip155'] },\n { id: 'core', name: 'Core', namespaces: ['eip155', 'solana'] },\n { id: 'backpack', name: 'Backpack', namespaces: ['eip155', 'solana'] },\n { id: 'frontier', name: 'Frontier', namespaces: ['eip155'] },\n { id: 'onekey', name: 'OneKey', namespaces: ['eip155'] },\n { id: 'kraken', name: 'Kraken', namespaces: ['eip155', 'solana'] },\n { id: 'uniswap', name: 'Uniswap Wallet', namespaces: ['eip155'] },\n { id: 'omni', name: 'Omni', namespaces: ['eip155'] },\n { id: 'mew', name: 'MEW Wallet', namespaces: ['eip155'] },\n { id: 'foxwallet', name: 'FoxWallet', namespaces: ['eip155'] },\n { id: 'nova', name: 'Nova Wallet', namespaces: ['eip155'] },\n { id: 'subwallet', name: 'SubWallet', namespaces: ['eip155'] },\n { id: 'safe', name: 'Safe', namespaces: ['eip155'] },\n { id: 'robinhood', name: 'Robinhood Wallet', namespaces: ['eip155'] },\n { id: 'tangem', name: 'Tangem', namespaces: ['eip155', 'solana'] },\n { id: 'trezor', name: 'Trezor', namespaces: ['bip122', 'eip155', 'solana'] },\n { id: 'kucoin', name: 'KuCoin', namespaces: ['eip155', 'solana'] },\n { id: 'jupiter', name: 'Jupiter', namespaces: ['solana'] },\n { id: 'zengo', name: 'Zengo', namespaces: ['eip155'] },\n { id: 'bitcoincom', name: 'Bitcoin.com', namespaces: ['eip155'] },\n { id: 'keplr', name: 'Keplr', namespaces: ['eip155'] },\n { id: 'cake', name: 'Cake Wallet', namespaces: ['eip155', 'solana'] },\n { id: 'unstoppable', name: 'Unstoppable', namespaces: ['eip155'] },\n { id: 'bifrost', name: 'Bifrost', namespaces: ['bip122', 'eip155'] },\n { id: 'pintu', name: 'Pintu', namespaces: ['eip155'] },\n { id: 'hot', name: 'HOT Wallet', namespaces: ['eip155', 'solana'] },\n { id: 'arculus', name: 'Arculus', namespaces: ['bip122', 'eip155', 'solana'] },\n];\n\n/**\n * Browser-extension metadata, keyed by wallet id. An entry means the wallet\n * ships a browser extension that announces an injected EVM (eip155) provider via\n * EIP-6963, matched by `rdns`. Hand-maintained (like the deep-link registry in\n * `@lydianpay/lydianconnect`): rdns values are self-attested per EIP-6963, so\n * each is corroborated against the wallet's own docs / the WalletConnect explorer\n * before being added — a wrong rdns silently breaks matching. Only wallets whose\n * `namespaces` include `eip155` belong here.\n */\nconst EXTENSIONS: Readonly<Record<string, { rdns: string; extensionUrl: string }>> = {\n metamask: {\n rdns: 'io.metamask',\n extensionUrl:\n 'https://chromewebstore.google.com/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn',\n },\n trust: {\n rdns: 'com.trustwallet.app',\n extensionUrl:\n 'https://chromewebstore.google.com/detail/trust-wallet/egjidjbpglichdcondbcbdnbeeppgdph',\n },\n rabby: {\n rdns: 'io.rabby',\n extensionUrl:\n 'https://chromewebstore.google.com/detail/rabby-wallet/acmacodkjbdgmoleebolmdjonilkdbch',\n },\n okx: {\n // Legacy \"okex\" brand retained in the extension's rdns after the 2022 rebrand.\n rdns: 'com.okex.wallet',\n extensionUrl:\n 'https://chromewebstore.google.com/detail/okx-wallet/mcohilncbfahbmgdjkbpemcciiolgcge',\n },\n phantom: {\n rdns: 'app.phantom',\n extensionUrl:\n 'https://chromewebstore.google.com/detail/phantom/bfnaelmomeimhlpmgjnjophhpkkoljpa',\n },\n zerion: {\n rdns: 'io.zerion',\n extensionUrl:\n 'https://chromewebstore.google.com/detail/zerion-wallet-crypto-defi/klghhnkeealcohjjanjjdaeeggmfmlpl',\n },\n rainbow: {\n rdns: 'me.rainbow',\n extensionUrl:\n 'https://chromewebstore.google.com/detail/rainbow/opfgelmcmbiajamepnmloijbpoleiama',\n },\n};\n\nexport const WALLET_CATALOG: readonly WalletCatalogEntry[] = WALLETS.map((w) => ({\n ...w,\n iconUrl: `${ICON_BASE}/${w.id}.png`,\n ...(EXTENSIONS[w.id] ?? {}),\n}));\n\nexport type MutableWalletCatalogEntry = Omit<WalletCatalogEntry, 'namespaces'> & {\n namespaces: WalletNamespace[];\n};\n\nexport function getWalletCatalog(): MutableWalletCatalogEntry[] {\n return WALLET_CATALOG.map((w) => ({ ...w, namespaces: [...w.namespaces] }));\n}\n\nexport function walletName(id: string): string | undefined {\n return WALLET_CATALOG.find((w) => w.id === id)?.name;\n}\n","import type {\n CaipNamespace,\n Connection,\n OpenWalletInput,\n ConnectorType,\n LydianConnectEvent,\n LydianConnectEventHandler,\n} from \"./types\";\n\nexport interface ConnectRequest {\n walletId: string;\n namespace: CaipNamespace;\n /** Cancel a pending connection (replaces the host app's manual cancel plumbing). */\n signal?: AbortSignal;\n}\n\n/** The CAIP-2 chain a request targets, e.g. \"eip155:137\". */\nexport function requestedChain(req: ConnectRequest): string | undefined {\n return req.namespace.value.chains?.[0];\n}\n\n/**\n * Internal contract every connector implements. The host app never sees this —\n * it only ever touches {@link LydianConnect} and the {@link Connection} handle.\n */\nexport interface Connector {\n readonly type: ConnectorType;\n /**\n * Wallet ids this connector natively serves. The WalletConnect fallback\n * returns an empty list and claims any wallet not served by another connector.\n */\n readonly walletIds: readonly string[];\n /** Namespace families this connector can connect on. The WalletConnect\n * fallback serves all; SDK connectors restrict to what their SDK speaks. */\n servesNamespace(namespaceName: string): boolean;\n isAvailable(walletId: string): boolean | Promise<boolean>;\n connect(req: ConnectRequest): Promise<Connection>;\n /** Rebuild Connections for still-live sessions — the reconnect-on-reload case. */\n restore(): Promise<Connection[]>;\n /** Tear down everything this connector owns. */\n reset(): Promise<void>;\n on(handler: LydianConnectEventHandler): () => void;\n /**\n * Foreground the wallet app, optionally handing it a pairing to approve.\n * Only the WalletConnect fallback implements this — an SDK drives its own\n * app-opening, and an extension has no app to open.\n */\n openWallet?(input: OpenWalletInput): boolean;\n}\n\nexport abstract class BaseConnector implements Connector {\n abstract readonly type: ConnectorType;\n readonly walletIds: readonly string[] = [];\n\n private handlers = new Set<LydianConnectEventHandler>();\n /** Depth of in-flight connects; see {@link duringConnect}. */\n private connecting = 0;\n\n abstract isAvailable(walletId: string): boolean | Promise<boolean>;\n abstract connect(req: ConnectRequest): Promise<Connection>;\n\n servesNamespace(_namespaceName: string): boolean {\n return true;\n }\n\n async restore(): Promise<Connection[]> {\n return [];\n }\n\n async reset(): Promise<void> {\n /* no-op by default */\n }\n\n on(handler: LydianConnectEventHandler): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n /**\n * Run a connect with its handshake events suppressed.\n *\n * A connector that binds provider listeners before requesting accounts sees the\n * wallet's own setup traffic — an initial `chainChanged`, and another when\n * `ensureChain` switches. Forwarding those makes the host believe the user moved\n * networks mid-connect. Nothing is lost by dropping them: connect() reads the\n * authoritative account and chain when it settles, and only changes made after\n * that are the user's.\n */\n protected async duringConnect<T>(run: () => Promise<T>): Promise<T> {\n this.connecting++;\n try {\n return await run();\n } finally {\n this.connecting--;\n }\n }\n\n protected emit(event: LydianConnectEvent): void {\n if (\n this.connecting > 0 &&\n (event.type === \"chainChanged\" || event.type === \"accountsChanged\")\n ) {\n return;\n }\n for (const handler of this.handlers) handler(event);\n }\n}\n","/** Shared app identity passed to every connector; mapped to each SDK's own shape internally. */\nexport interface AppConfig {\n /** Display name shown in the wallet's connect prompt. */\n appName: string;\n /** Optional icon shown in the wallet's connect prompt. */\n icon?: string;\n /** Optional description; defaults to appName. */\n description?: string;\n}\n\n/**\n * The dapp URL, derived from the page origin at connect-time (always client-side).\n * Returns '' during SSR — connectors only read this when initializing their SDK,\n * which never happens on the server.\n */\nexport function deriveUrl(): string {\n return typeof window !== \"undefined\" ? window.location.origin : \"\";\n}\n\n/**\n * Return link wallets can use to send the user back after a deep-link approval.\n * Query/hash are excluded so checkout data is not exposed through WalletConnect\n * metadata. Returns '' during SSR, like deriveUrl().\n */\nexport function deriveRedirectUrl(): string {\n if (typeof window === \"undefined\") return \"\";\n return window.location.origin + window.location.pathname;\n}\n","/** Shared EVM logic for the EIP-1193 connectors. */\n\n/**\n * Sized from measurement: MetaMask answers `eth_chainId` from a local cache\n * refreshed only when the provider processes `chainChanged`, which arrived ~700ms\n * after `wallet_switchEthereumChain` resolved. The timeout is several times that\n * for headroom on a phone; the interval is cheap because each read is a cache\n * lookup rather than a round-trip. Only paid in full when the wallet never moves.\n */\nconst CHAIN_SETTLE = { timeoutMs: 4000, intervalMs: 100 };\n\n/**\n * The one call every EIP-1193 provider can make, narrowed to a plain function so\n * three unrelated provider types can share the logic here. Each connector adapts\n * its own provider to this shape.\n *\n * Takes the same `{ method, params }` object EIP-1193's own `request` does — and\n * that `Connection.request` exposes — so there is a single call shape everywhere\n * and the adapters stay close to pass-throughs.\n */\nexport type EvmRpc = (args: {\n method: string;\n params?: unknown[] | Record<string, unknown>;\n}) => Promise<unknown>;\n\n/** Normalize a wallet's chain id (hex or decimal) to CAIP-2. */\nexport function toCaip(chainId: string | null | undefined): string {\n if (!chainId) return \"eip155:1\";\n const num = chainId.startsWith(\"0x\")\n ? parseInt(chainId, 16)\n : Number(chainId);\n return `eip155:${Number.isFinite(num) ? num : 1}`;\n}\n\nasync function currentChain(rpc: EvmRpc): Promise<string> {\n const raw = await rpc({ method: \"eth_chainId\" }).catch(() => null);\n return toCaip(typeof raw === \"string\" ? raw : null);\n}\n\n/** Re-read until the wallet reports `chainId`, or the deadline passes. */\nasync function settleChain({\n rpc,\n chainId,\n timeoutMs,\n intervalMs,\n}: {\n rpc: EvmRpc;\n chainId: string;\n timeoutMs: number;\n intervalMs: number;\n}): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n for (;;) {\n const actual = await currentChain(rpc);\n if (actual === chainId || Date.now() >= deadline) return;\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n}\n\n/**\n * Best-effort switch to the requested chain; leaves the wallet as-is if it's\n * unknown to it. After a switch the wallet accepts, WAITS for its reported chain\n * to catch up — the acknowledgement is not proof the chain has changed yet, and\n * a caller reading `eth_chainId` immediately would still see the old one.\n */\nexport async function ensureChain({\n rpc,\n chainId,\n timeoutMs = CHAIN_SETTLE.timeoutMs,\n intervalMs = CHAIN_SETTLE.intervalMs,\n}: {\n rpc: EvmRpc;\n chainId: string | undefined; // \"eip155:137\"\n timeoutMs?: number;\n intervalMs?: number;\n}): Promise<void> {\n const chainNumber = chainId ? Number(chainId.split(\":\")[1]) : NaN;\n if (!Number.isFinite(chainNumber) || chainNumber <= 0) return;\n const requested = `eip155:${chainNumber}`;\n if ((await currentChain(rpc)) === requested) return;\n\n const switched = await rpc({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId: `0x${chainNumber.toString(16)}` }],\n }).then(\n () => true,\n // Chain not added to the wallet, or the user declined — the caller's\n // chainChanged will reflect reality. No settle: the chain isn't moving.\n () => false,\n );\n if (switched) {\n await settleChain({ rpc, chainId: requested, timeoutMs, intervalMs });\n }\n}\n","/**\n * Reject a pending promise when the caller's signal aborts (the user cancelled).\n *\n * The underlying wallet request usually cannot be cancelled — the wallet has\n * already been asked. What this settles is *our* promise, so the host app's\n * cancel actually returns control instead of leaving a connect pending forever,\n * to resolve later into a UI that has moved on.\n *\n * `onAbort` runs before the rejection, for cleanup the caller owns (tearing down\n * a pairing, say).\n */\nexport function withSignal<T>(\n promise: Promise<T>,\n signal?: AbortSignal,\n onAbort?: () => void,\n): Promise<T> {\n if (!signal) return promise;\n if (signal.aborted) {\n onAbort?.();\n return Promise.reject(new DOMException(\"Aborted\", \"AbortError\"));\n }\n return new Promise<T>((resolve, reject) => {\n const abortHandler = () => {\n onAbort?.();\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n };\n signal.addEventListener(\"abort\", abortHandler, { once: true });\n promise.then(\n (value) => {\n signal.removeEventListener(\"abort\", abortHandler);\n resolve(value);\n },\n (error) => {\n signal.removeEventListener(\"abort\", abortHandler);\n reject(error);\n },\n );\n });\n}\n","import type {\n MetaMaskSDK as MetaMaskSDKType,\n MetaMaskSDKOptions,\n} from \"@metamask/sdk\";\nimport {\n BaseConnector,\n type ConnectRequest,\n requestedChain,\n} from \"../../core/connector\";\nimport type { Connection } from \"../../core/types\";\nimport { type AppConfig, deriveUrl } from \"../../core/app\";\nimport { type EvmRpc, ensureChain, toCaip } from \"../eip155/chain\";\nimport { withSignal } from \"../../core/abort\";\n\n/** The provider type MetaMaskSDK.getProvider() returns, without depending on a named export. */\ntype MetaMaskProvider = NonNullable<ReturnType<MetaMaskSDKType[\"getProvider\"]>>;\n\nconst WALLET_ID = \"metamask\";\n\nexport class MetaMaskConnector extends BaseConnector {\n readonly type = \"sdk\" as const;\n readonly walletIds = [WALLET_ID] as const;\n\n private sdk: MetaMaskSDKType | null = null;\n private provider: MetaMaskProvider | null = null;\n private listenersBound = false;\n\n constructor(private app: AppConfig) {\n super();\n }\n\n isAvailable(): boolean {\n return true; // SDK covers desktop (extension) and mobile (deep-link) itself\n }\n\n servesNamespace(name: string): boolean {\n return name === \"eip155\"; // MetaMask SDK speaks EVM only\n }\n\n private async getProvider(): Promise<MetaMaskProvider> {\n if (this.provider) return this.provider;\n const { MetaMaskSDK } = await import(\"@metamask/sdk\"); // value import — code-split, loaded on demand\n const dappMetadata: MetaMaskSDKOptions[\"dappMetadata\"] = {\n name: this.app.appName,\n url: deriveUrl(),\n ...(this.app.icon ? { iconUrl: this.app.icon } : {}),\n };\n const sdk = new MetaMaskSDK({ dappMetadata });\n await sdk.init();\n const provider = sdk.getProvider();\n if (!provider) throw new Error(\"MetaMask provider unavailable\");\n this.sdk = sdk;\n this.provider = provider;\n this.bindEvents(provider);\n return provider;\n }\n\n private bindEvents(provider: MetaMaskProvider): void {\n if (this.listenersBound) return;\n this.listenersBound = true;\n provider.on(\"chainChanged\", (hex) => {\n this.emit({\n type: \"chainChanged\",\n walletId: WALLET_ID,\n chainId: toCaip(String(hex)),\n });\n });\n provider.on(\"accountsChanged\", (accounts) => {\n const account = Array.isArray(accounts)\n ? (accounts[0] as string | undefined)\n : undefined;\n if (account)\n this.emit({ type: \"accountsChanged\", walletId: WALLET_ID, account });\n else this.emit({ type: \"disconnect\", walletId: WALLET_ID });\n });\n provider.on(\"disconnect\", () =>\n this.emit({ type: \"disconnect\", walletId: WALLET_ID }),\n );\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n // Listeners are bound in getProvider(); see BaseConnector.duringConnect.\n return this.duringConnect(async () => {\n const provider = await this.getProvider();\n // The SDK cannot withdraw the prompt, but the host's cancel must still\n // settle this promise.\n const accounts = await withSignal(\n provider.request<string[]>({ method: \"eth_requestAccounts\" }),\n req.signal,\n );\n const account = accounts?.[0];\n if (!account) throw new Error(\"MetaMask returned no account\");\n await ensureChain({\n rpc: rpcFor(provider),\n chainId: requestedChain(req),\n });\n const chainId = toCaip(\n await provider.request<string>({ method: \"eth_chainId\" }),\n );\n return this.toConnection(provider, account, chainId);\n });\n }\n\n async restore(): Promise<Connection[]> {\n const provider = await this.getProvider().catch(() => null);\n if (!provider) return [];\n const accounts = await provider\n .request<string[]>({ method: \"eth_accounts\" })\n .catch(() => []);\n const account = accounts?.[0];\n if (!account) return [];\n const chainId = toCaip(\n await provider\n .request<string>({ method: \"eth_chainId\" })\n .catch(() => \"0x1\"),\n );\n return [this.toConnection(provider, account, chainId)];\n }\n\n async reset(): Promise<void> {\n await this.sdk?.terminate();\n this.provider = null;\n this.listenersBound = false;\n }\n\n private toConnection(\n provider: MetaMaskProvider,\n account: string,\n chainId: string,\n ): Connection {\n return {\n walletId: WALLET_ID,\n account,\n chainId,\n request: async <T>(args: { method: string; params?: unknown }) =>\n (await provider.request<T>({\n method: args.method,\n params: args.params as never,\n })) as T,\n openWallet: () => {}, // MetaMask SDK foregrounds the wallet on request\n disconnect: async () => {\n await this.sdk?.terminate();\n this.provider = null;\n this.listenersBound = false;\n this.emit({ type: \"disconnect\", walletId: WALLET_ID });\n },\n };\n }\n}\n\n/** Adapt the SDK provider to the plain call shape the shared chain logic takes. */\nfunction rpcFor(provider: MetaMaskProvider): EvmRpc {\n return (args) => provider.request(args);\n}\n","import type { CoinbaseWalletSDK as CoinbaseWalletSDKType } from \"@coinbase/wallet-sdk\";\nimport {\n BaseConnector,\n type ConnectRequest,\n requestedChain,\n} from \"../../core/connector\";\nimport type { Connection } from \"../../core/types\";\nimport type { AppConfig } from \"../../core/app\";\nimport { type EvmRpc, ensureChain, toCaip } from \"../eip155/chain\";\n\ntype CoinbaseProvider = NonNullable<\n ReturnType<CoinbaseWalletSDKType[\"makeWeb3Provider\"]>\n>;\ntype RequestArgs = Parameters<CoinbaseProvider[\"request\"]>[0];\n\nconst WALLET_ID = \"coinbase\";\n\n/** Coinbase v4's provider.request is non-generic and returns unknown; wrap + cast. */\nfunction rpc<T>(\n provider: CoinbaseProvider,\n method: string,\n params?: unknown,\n): Promise<T> {\n return provider.request({\n method,\n params,\n } as unknown as RequestArgs) as Promise<T>;\n}\n\nexport class CoinbaseConnector extends BaseConnector {\n readonly type = \"sdk\" as const;\n readonly walletIds = [WALLET_ID] as const;\n\n private provider: CoinbaseProvider | null = null;\n private listenersBound = false;\n\n constructor(private app: AppConfig) {\n super();\n }\n\n isAvailable(): boolean {\n return true; // SDK covers extension + mobile deep-link itself\n }\n\n servesNamespace(name: string): boolean {\n return name === \"eip155\"; // Coinbase Wallet SDK provider speaks EVM only\n }\n\n private async getProvider(appChainIds?: number[]): Promise<CoinbaseProvider> {\n if (this.provider) return this.provider;\n const { CoinbaseWalletSDK } = await import(\"@coinbase/wallet-sdk\"); // lazy — code-split\n const sdk = new CoinbaseWalletSDK({\n appName: this.app.appName,\n appLogoUrl: this.app.icon,\n appChainIds, // one-time SDK-init hint; ensureChain enforces the actual chain per connect\n });\n const provider = sdk.makeWeb3Provider();\n this.provider = provider;\n this.bindEvents(provider);\n return provider;\n }\n\n private bindEvents(provider: CoinbaseProvider): void {\n if (this.listenersBound) return;\n this.listenersBound = true;\n provider.on(\"chainChanged\", (hex) => {\n this.emit({\n type: \"chainChanged\",\n walletId: WALLET_ID,\n chainId: toCaip(String(hex)),\n });\n });\n provider.on(\"accountsChanged\", (accounts) => {\n const account = Array.isArray(accounts)\n ? (accounts[0] as string | undefined)\n : undefined;\n if (account)\n this.emit({ type: \"accountsChanged\", walletId: WALLET_ID, account });\n else this.emit({ type: \"disconnect\", walletId: WALLET_ID });\n });\n provider.on(\"disconnect\", () =>\n this.emit({ type: \"disconnect\", walletId: WALLET_ID }),\n );\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n // Listeners are bound in getProvider(); see BaseConnector.duringConnect.\n return this.duringConnect(async () => {\n const provider = await this.getProvider(evmChainIds(req));\n const accounts = await rpc<string[]>(provider, \"eth_requestAccounts\");\n const account = accounts?.[0];\n if (!account) throw new Error(\"Coinbase Wallet returned no account\");\n await ensureChain({\n rpc: rpcFor(provider),\n chainId: requestedChain(req),\n });\n const chainId = toCaip(await rpc<string>(provider, \"eth_chainId\"));\n return this.toConnection(provider, account, chainId);\n });\n }\n\n async restore(): Promise<Connection[]> {\n const provider = await this.getProvider().catch(() => null);\n if (!provider) return [];\n const accounts = await rpc<string[]>(provider, \"eth_accounts\").catch(\n () => [] as string[],\n );\n const account = accounts?.[0];\n if (!account) return [];\n const chainId = toCaip(\n await rpc<string>(provider, \"eth_chainId\").catch(() => \"0x1\"),\n );\n return [this.toConnection(provider, account, chainId)];\n }\n\n async reset(): Promise<void> {\n await this.provider?.disconnect().catch(() => {});\n this.provider = null;\n this.listenersBound = false;\n }\n\n private toConnection(\n provider: CoinbaseProvider,\n account: string,\n chainId: string,\n ): Connection {\n return {\n walletId: WALLET_ID,\n account,\n chainId,\n request: <T>(args: { method: string; params?: unknown }) =>\n rpc<T>(provider, args.method, args.params),\n openWallet: () => {}, // Coinbase SDK foregrounds the wallet on request\n disconnect: async () => {\n await provider.disconnect().catch(() => {});\n this.provider = null;\n this.listenersBound = false;\n this.emit({ type: \"disconnect\", walletId: WALLET_ID });\n },\n };\n }\n}\n\n/** Adapt the SDK provider to the plain call shape the shared chain logic takes. */\nfunction rpcFor(provider: CoinbaseProvider): EvmRpc {\n return ({ method, params }) => rpc(provider, method, params);\n}\n\n/** The numeric EVM chain id the connect targets, for Coinbase's appChainIds hint. */\nfunction evmChainIds(req: ConnectRequest): number[] | undefined {\n const wanted = req.namespace.value.chains?.[0];\n const n = wanted ? Number(wanted.split(\":\")[1]) : NaN;\n return Number.isFinite(n) && n > 0 ? [n] : undefined;\n}\n","import {\n BaseConnector,\n type ConnectRequest,\n requestedChain,\n} from \"../../core/connector\";\nimport type { Connection } from \"../../core/types\";\nimport { type EvmRpc, ensureChain, toCaip } from \"../eip155/chain\";\nimport { withSignal } from \"../../core/abort\";\n\n/** The slice of an EIP-1193 provider we depend on. */\ninterface Eip1193Provider {\n request<T = unknown>(args: { method: string; params?: unknown }): Promise<T>;\n on(event: string, listener: (...args: unknown[]) => void): void;\n}\n\n/** EIP-6963 provider info (the fields we read). */\ninterface Eip6963ProviderInfo {\n uuid: string;\n name: string;\n icon: string;\n rdns: string;\n}\n\ninterface Eip6963ProviderDetail {\n info: Eip6963ProviderInfo;\n provider: Eip1193Provider;\n}\n\n/** How long to wait for a late `announceProvider` after re-requesting discovery. */\nconst DISCOVERY_WAIT_MS = 100;\n\n/**\n * Connects a wallet's browser EXTENSION via its injected EIP-1193 provider,\n * discovered through EIP-6963 (Multi Injected Provider Discovery). A page cannot\n * \"open\" an extension directly; `eth_requestAccounts` triggers the extension's\n * own popup, which is the effective equivalent.\n *\n * Claims the wallet ids handed to it (those with an `rdns` in the catalog, minus\n * the ones a dedicated SDK connector already serves). It's availability-gated by\n * {@link ConnectManager}: when the extension hasn't announced a provider,\n * {@link isAvailable} is false and the manager falls back to WalletConnect (QR),\n * so the host app never branches on whether the extension is present.\n *\n * EVM-only: EIP-6963 announces `eip155` providers, so {@link servesNamespace}\n * restricts to `eip155` and non-EVM chains route to the fallback.\n */\nexport class InjectedConnector extends BaseConnector {\n readonly type = \"injected\" as const;\n readonly walletIds: readonly string[];\n\n /** rdns -> the provider it announced. Populated by EIP-6963 discovery. */\n private discovered = new Map<string, Eip6963ProviderDetail>();\n /**\n * Providers we've already attached listeners to. Bind once and keep for the\n * page's life (never remove) so a reconnect doesn't stack duplicate listeners.\n * EIP-6963 announces exactly one provider per rdns, so a given provider maps to\n * a single walletId — closing over walletId in bindEvents is safe.\n */\n private bound = new WeakSet<Eip1193Provider>();\n private listening = false;\n\n constructor(private rdnsByWallet: Readonly<Record<string, string>>) {\n super();\n this.walletIds = Object.keys(rdnsByWallet);\n this.startDiscovery();\n }\n\n /** Listen for provider announcements, then ask installed extensions to announce. */\n private startDiscovery(): void {\n if (this.listening || typeof window === \"undefined\") return;\n this.listening = true;\n window.addEventListener(\"eip6963:announceProvider\", (event: Event) => {\n const detail = (event as CustomEvent<Eip6963ProviderDetail>).detail;\n if (detail?.info?.rdns && detail.provider)\n this.discovered.set(detail.info.rdns, detail);\n });\n window.dispatchEvent(new Event(\"eip6963:requestProvider\"));\n }\n\n servesNamespace(name: string): boolean {\n return name === \"eip155\"; // EIP-6963 announces EVM (eip155) injected providers\n }\n\n /** Available iff the wallet's extension has announced an injected provider. */\n async isAvailable(walletId: string): Promise<boolean> {\n if (typeof window === \"undefined\") return false;\n const rdns = this.rdnsByWallet[walletId];\n if (!rdns) return false;\n if (this.discovered.has(rdns)) return true;\n // Extension may have injected after our first request — re-ask and give it a beat.\n window.dispatchEvent(new Event(\"eip6963:requestProvider\"));\n await new Promise((resolve) => setTimeout(resolve, DISCOVERY_WAIT_MS));\n return this.discovered.has(rdns);\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const provider = this.providerFor(req.walletId);\n if (!provider)\n throw new Error(`No injected provider announced for \"${req.walletId}\"`);\n const accounts = await withSignal(\n provider.request<string[]>({ method: \"eth_requestAccounts\" }), // triggers the extension popup\n req.signal,\n );\n const account = accounts?.[0];\n if (!account)\n throw new Error(`${req.walletId} extension returned no account`);\n await ensureChain({ rpc: rpcFor(provider), chainId: requestedChain(req) });\n const chainId = toCaip(\n await provider.request<string>({ method: \"eth_chainId\" }),\n );\n this.bindEvents(provider, req.walletId);\n return this.toConnection(provider, req.walletId, account, chainId);\n }\n\n async restore(): Promise<Connection[]> {\n if (typeof window === \"undefined\") return [];\n if (this.discovered.size === 0) {\n window.dispatchEvent(new Event(\"eip6963:requestProvider\"));\n await new Promise((resolve) => setTimeout(resolve, DISCOVERY_WAIT_MS));\n }\n const out: Connection[] = [];\n for (const walletId of this.walletIds) {\n const provider = this.providerFor(walletId);\n if (!provider) continue;\n const accounts = await provider\n .request<string[]>({ method: \"eth_accounts\" })\n .catch(() => [] as string[]);\n const account = accounts?.[0];\n if (!account) continue;\n const chainId = toCaip(\n await provider\n .request<string>({ method: \"eth_chainId\" })\n .catch(() => \"0x1\"),\n );\n this.bindEvents(provider, walletId);\n out.push(this.toConnection(provider, walletId, account, chainId));\n }\n return out;\n }\n\n private providerFor(walletId: string): Eip1193Provider | undefined {\n const rdns = this.rdnsByWallet[walletId];\n return rdns ? this.discovered.get(rdns)?.provider : undefined;\n }\n\n private bindEvents(provider: Eip1193Provider, walletId: string): void {\n if (this.bound.has(provider)) return;\n this.bound.add(provider);\n provider.on(\"chainChanged\", (hex) => {\n this.emit({\n type: \"chainChanged\",\n walletId,\n chainId: toCaip(String(hex)),\n });\n });\n provider.on(\"accountsChanged\", (accounts) => {\n const account = Array.isArray(accounts)\n ? (accounts[0] as string | undefined)\n : undefined;\n if (account) this.emit({ type: \"accountsChanged\", walletId, account });\n else this.emit({ type: \"disconnect\", walletId });\n });\n provider.on(\"disconnect\", () =>\n this.emit({ type: \"disconnect\", walletId }),\n );\n }\n\n private toConnection(\n provider: Eip1193Provider,\n walletId: string,\n account: string,\n chainId: string,\n ): Connection {\n return {\n walletId,\n account,\n chainId,\n request: async <T>(args: { method: string; params?: unknown }) =>\n (await provider.request<T>({\n method: args.method,\n params: args.params,\n })) as T,\n openWallet: () => {}, // the extension foregrounds its own popup on request\n disconnect: async () => {\n await provider\n .request({\n method: \"wallet_revokePermissions\",\n params: [{ eth_accounts: {} }],\n })\n .catch(() => {\n /* not all extensions implement revoke; dropping our handle is enough */\n });\n this.emit({ type: \"disconnect\", walletId });\n },\n };\n }\n}\n\n/** Adapt the injected provider to the plain call shape the shared chain logic takes. */\nfunction rpcFor(provider: Eip1193Provider): EvmRpc {\n return (args) => provider.request(args);\n}\n","// Wallet deep-link registry — hand-maintained.\n// Originally seeded from the WalletConnect explorer API; edit entries directly now.\n// Per entry: native = bare app scheme (foreground only); scheme = WC connect deep\n// link (we append `?uri=`); universal = fallback only; store = not-installed links.\nimport type { WalletLink } from \"./registry\";\n\nexport const WALLET_LINKS: Record<string, WalletLink> = {\n metamask: {\n native: \"metamask://\",\n scheme: \"metamask://wc\",\n universal: \"https://metamask.app.link/wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/metamask/id1438144202\",\n android: \"https://play.google.com/store/apps/details?id=io.metamask\",\n },\n },\n trust: {\n native: \"trust://\",\n scheme: \"trust://wc\",\n universal: \"https://link.trustwallet.com/wc\",\n store: {\n ios: \"https://apps.apple.com/app/apple-store/id1288339409\",\n android:\n \"https://play.google.com/store/apps/details?id=com.wallet.crypto.trustapp\",\n },\n },\n rainbow: {\n native: \"rainbow://\",\n scheme: \"rainbow://wc\",\n universal: \"https://rnbwapp.com/wc\",\n store: {\n ios: \"https://apps.apple.com/app/apple-store/id1457119021?pt=119997837&ct=wc&mt=8\",\n android:\n \"https://play.google.com/store/apps/details?id=me.rainbow&referrer=utm_source%3Dwc%26utm_medium%3Dconnector%26utm_campaign%3Dwc\",\n },\n },\n coinbase: {\n store: {\n ios: \"https://apps.apple.com/us/app/base-formerly-coinbase-wallet/id1278383455\",\n },\n },\n zerion: {\n native: \"zerion://\",\n scheme: \"zerion://wc\",\n universal: \"https://wallet.zerion.io/wc/wc\",\n store: {\n ios: \"https://apps.apple.com/app/id1456732565\",\n android:\n \"https://play.google.com/store/apps/details?id=io.zerion.android&hl=en&gl=US\",\n },\n },\n tokenpocket: {\n native: \"tpoutside://\",\n scheme: \"tpoutside://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/tp-wallet/id6444625622?l=en\",\n android:\n \"https://play.google.com/store/apps/details?id=vip.mytokenpocket\",\n },\n },\n blockchaincom: {\n native: \"blockchain-wallet://\",\n scheme: \"blockchain-wallet://wc\",\n universal: \"https://login.blockchain.com/app/wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/blockchain-bitcoin-wallet/id493253309\",\n android:\n \"https://play.google.com/store/apps/details?id=piuk.blockchain.android\",\n },\n },\n exodus: {\n native: \"exodus://\",\n scheme: \"exodus://wc\",\n universal: \"https://exodus.com/m/wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/exodus-crypto-bitcoin-wallet/id1414384820\",\n android:\n \"https://play.google.com/store/apps/details?id=exodusmovement.exodus&hl=en&gl=US\",\n },\n },\n phantom: {\n store: {\n ios: \"https://apps.apple.com/us/app/phantom-crypto-wallet/id1598432977\",\n android:\n \"https://play.google.com/store/apps/details?id=app.phantom&hl=en\",\n },\n },\n okx: {\n native: \"okxwallet://main\",\n scheme: \"okxwallet://main/wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/okx-buy-bitcoin-eth-crypto/id1327268470\",\n android:\n \"https://play.google.com/store/apps/details?id=com.okinc.okex.gp\",\n },\n },\n cryptocom: {\n native: \"cryptowallet://\",\n scheme: \"cryptowallet://wc\",\n store: {\n ios: \"https://apps.apple.com/US/app/id1512048310?mt=8\",\n android: \"https://play.google.com/store/apps/details?id=com.defi.wallet\",\n },\n },\n argent: {\n native: \"argent://app/\",\n scheme: \"argent://app/wc\",\n universal: \"https://www.argent.xyz/app/wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/argent-defi-in-a-tap/id1358741926\",\n android:\n \"https://play.google.com/store/apps/details?id=im.argent.contractwalletclient&hl=en&gl=US&pli=1\",\n },\n },\n safepal: {\n native: \"safepalwallet://\",\n scheme: \"safepalwallet://wc\",\n universal: \"https://link.safepal.io/wc\",\n store: {\n ios: \"https://apps.apple.com/app/safepal-wallet/id1548297139\",\n android:\n \"https://play.google.com/store/apps/details?id=io.safepal.wallet\",\n },\n },\n imtoken: {\n native: \"imtokenv2://\",\n scheme: \"imtokenv2://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/imtoken2/id1384798940\",\n android: \"https://play.google.com/store/apps/details?id=im.token.app\",\n },\n },\n ronin: {\n native: \"roninwallet://\",\n scheme: \"roninwallet://wc\",\n universal: \"https://wallet.roninchain.com/wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/ronin-wallet/id1592675001\",\n android:\n \"https://play.google.com/store/apps/details?id=com.skymavis.genesis\",\n },\n },\n coin98: {\n native: \"coin98://\",\n scheme: \"coin98://wc\",\n universal: \"https://coin98.com/wc\",\n store: {\n ios: \"https://apps.apple.com/vn/app/coin98-wallet/id1561969966\",\n android:\n \"https://play.google.com/store/apps/details?id=coin98.crypto.finance.media&hl=vi&gl=US\",\n },\n },\n bitkeep: {\n native: \"bitkeep://\",\n scheme: \"bitkeep://wc\",\n universal: \"https://bkapp.vip/wc\",\n store: {\n ios: \"https://web3.bitget.com/en/wallet-download?type=0\",\n android: \"https://web3.bitget.com/en/wallet-download?type=0\",\n },\n },\n \"1inch\": {\n native: \"oneinch://open/nobodywilleveruseit\",\n scheme: \"oneinch://open/nobodywilleveruseit/wc\",\n universal: \"https://wallet.1inch.io/app/nobodywilleveruseit/wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/1inch-defi-wallet/id1546049391\",\n android:\n \"https://play.google.com/store/apps/details?id=io.oneinch.android\",\n },\n },\n ledgerlive: {\n native: \"ledgerlive://\",\n scheme: \"ledgerlive://wc\",\n store: {\n ios: \"https://itunes.apple.com/app/id1361671700\",\n android: \"https://play.google.com/store/apps/details?id=com.ledger.live\",\n },\n },\n atomic: {\n native: \"atomicwallet://\",\n scheme: \"atomicwallet://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/atomic-wallet/id1478257827\",\n android: \"https://play.google.com/store/apps/details?id=io.atomicwallet\",\n },\n },\n alpha: {\n native: \"awallet://\",\n scheme: \"awallet://wc\",\n universal: \"https://aw.app/wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/alphawallet-eth-wallet/id1358230430\",\n android:\n \"https://play.google.com/store/apps/details?id=io.stormbird.wallet\",\n },\n },\n math: {\n native: \"mathwallet://\",\n scheme: \"mathwallet://wc\",\n universal: \"https://www.mathwallet.org/wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/mathwallet5/id1582612388\",\n android:\n \"https://play.google.com/store/apps/details?id=com.mathwallet.android\",\n },\n },\n bitpay: {\n native: \"bitpay://\",\n scheme: \"bitpay://wc\",\n universal: \"https://link.bitpay.com/wc\",\n store: {\n ios: \"https://bitpay.onelink.me/Cenw/ejjaw7bs\",\n android: \"https://bitpay.onelink.me/Cenw/ejjaw7bs\",\n },\n },\n rabby: {\n native: \"rabby://\",\n scheme: \"rabby://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/rabby-wallet-crypto-evm/id6474381673\",\n android:\n \"https://play.google.com/store/apps/details?id=com.debank.rabbymobile\",\n },\n },\n // Bybit's WC deep link nests the uri inside a targetUrl wrapper (bybitapp://open/route?targetUrl=by://web3/walletconnect/wc?uri=...), which the `${scheme}?uri=` builder can't express — QR/scan connect only.\n bybit: {\n store: {\n ios: \"https://apps.apple.com/us/app/bybit-buy-trade-crypto/id1488296980\",\n android: \"https://play.google.com/store/apps/details?id=com.bybit.app\",\n },\n },\n binance: {\n native: \"bnc://app.binance.com/cedefi/\",\n scheme: \"bnc://app.binance.com/cedefi/wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/id1436799971\",\n android: \"https://play.google.com/store/apps/details?id=com.binance.dev\",\n },\n },\n gate: {\n native: \"gtweb3wallet://\",\n scheme: \"gtweb3wallet://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/gate-io-buy-bitcoin-crypto/id1294998195\",\n android:\n \"https://play.google.com/store/apps/details?id=com.gateio.gateio\",\n },\n },\n // Core: `core://` scheme not corroborated to 2 sources — QR/scan connect only.\n core: {\n store: {\n ios: \"https://apps.apple.com/us/app/core-wallet/id6443685999\",\n android: \"https://play.google.com/store/apps/details?id=com.avaxwallet\",\n },\n },\n // Backpack: `backpack://` scheme not corroborated to 2 sources — QR/scan connect only.\n backpack: {\n store: {\n ios: \"https://apps.apple.com/us/app/backpack-wallet-exchange/id6445964121\",\n android:\n \"https://play.google.com/store/apps/details?id=app.backpack.mobile\",\n },\n },\n frontier: {\n native: \"frontier://\",\n scheme: \"frontier://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/frontier-crypto-defi-wallet/id1482380988\",\n android:\n \"https://play.google.com/store/apps/details?id=com.frontierwallet\",\n },\n },\n onekey: {\n native: \"onekey-wallet://\",\n scheme: \"onekey-wallet://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/onekey-open-source-wallet/id1609559473\",\n android:\n \"https://play.google.com/store/apps/details?id=so.onekey.app.wallet\",\n },\n },\n kraken: {\n native: \"krakenwallet://\",\n scheme: \"krakenwallet://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/kraken-wallet/id1626327149\",\n android:\n \"https://play.google.com/store/apps/details?id=com.kraken.superwallet\",\n },\n },\n uniswap: {\n native: \"uniswap://\",\n scheme: \"uniswap://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/uniswap-crypto-nft-wallet/id6443944476\",\n android:\n \"https://play.google.com/store/apps/details?id=com.uniswap.mobile\",\n },\n },\n omni: {\n native: \"omni://\",\n scheme: \"omni://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/omni-web3-wallet/id1569375204\",\n android:\n \"https://play.google.com/store/apps/details?id=fi.steakwallet.app\",\n },\n },\n mew: {\n universal: \"https://mewwallet.com/wc\",\n store: {\n ios: \"https://apps.apple.com/app/id1464614025\",\n android:\n \"https://play.google.com/store/apps/details?id=com.myetherwallet.mewwallet\",\n },\n },\n foxwallet: {\n native: \"foxwallet://\",\n scheme: \"foxwallet://wc\",\n universal: \"https://link.foxwallet.com/wc\",\n store: {\n ios: \"https://apps.apple.com/app/foxwallet-crypto-web3/id1590983231\",\n android:\n \"https://play.google.com/store/apps/details?id=com.foxwallet.play\",\n },\n },\n nova: {\n native: \"novawallet://\",\n scheme: \"novawallet://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/nova-polkadot-wallet/id1597119355\",\n android:\n \"https://play.google.com/store/apps/details?id=io.novafoundation.nova.market\",\n },\n },\n subwallet: {\n native: \"subwallet://\",\n scheme: \"subwallet://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/subwallet-polkadot-wallet/id1633050285\",\n android:\n \"https://play.google.com/store/apps/details?id=app.subwallet.mobile\",\n },\n },\n safe: {\n native: \"safe://\",\n scheme: \"safe://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/safe-mobile/id6748754793\",\n android:\n \"https://play.google.com/store/apps/details?id=global.safe.mobileapp\",\n },\n },\n robinhood: {\n native: \"robinhood-wallet://\",\n scheme: \"robinhood-wallet://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/robinhood-wallet-swap-crypto/id1634080733\",\n android:\n \"https://play.google.com/store/apps/details?id=com.robinhood.gateway\",\n },\n },\n tangem: {\n native: \"tangem://\",\n scheme: \"tangem://wc\",\n store: {\n ios: \"https://apps.apple.com/app/tangem/id1354868448\",\n android:\n \"https://play.google.com/store/apps/details?id=com.tangem.wallet\",\n },\n },\n // Trezor Suite: WalletConnect pairing is QR/paste-into-Suite (no corroborated custom scheme) — QR connect only.\n trezor: {\n store: {\n ios: \"https://apps.apple.com/us/app/trezor-suite/id1631884497\",\n android: \"https://play.google.com/store/apps/details?id=io.trezor.suite\",\n },\n },\n kucoin: {\n native: \"kucoin://\",\n scheme: \"kucoin:///wallet/walletConnect\",\n store: {\n ios: \"https://apps.apple.com/app/kucoin-buy-bitcoin-crypto/id1378956601\",\n android: \"https://play.google.com/store/apps/details?id=com.kubi.kucoin\",\n },\n },\n // Jupiter (Solana): no corroborated WC deep-link scheme — QR connect only.\n jupiter: {\n store: {\n ios: \"https://apps.apple.com/us/app/jupiter-solana-swap-wallet/id6484069059\",\n android:\n \"https://play.google.com/store/apps/details?id=ag.jup.jupiter.android\",\n },\n },\n zengo: {\n native: \"zengo://get.zengo.com/\",\n scheme: \"zengo://get.zengo.com/wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/zengo-crypto-bitcoin-wallet/id1440147115\",\n android: \"https://play.google.com/store/apps/details?id=com.zengo.wallet\",\n },\n },\n // Bitcoin.com Wallet: no corroborated WC deep-link scheme — QR connect only.\n bitcoincom: {\n store: {\n ios: \"https://apps.apple.com/us/app/bitcoin-wallet-by-bitcoin-com/id1252903728\",\n android:\n \"https://play.google.com/store/apps/details?id=com.bitcoin.mwallet\",\n },\n },\n keplr: {\n native: \"keplrwallet://\",\n scheme: \"keplrwallet://wcV2\",\n store: {\n ios: \"https://apps.apple.com/us/app/keplr-wallet/id1567851089\",\n android:\n \"https://play.google.com/store/apps/details?id=com.chainapsis.keplr\",\n },\n },\n cake: {\n native: \"cakewallet://\",\n scheme: \"cakewallet://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/cake-wallet/id1334702542\",\n android:\n \"https://play.google.com/store/apps/details?id=com.cakewallet.cake_wallet\",\n },\n },\n unstoppable: {\n native: \"unstoppable.money://\",\n scheme: \"unstoppable.money://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/unstoppable-crypto-wallet/id1447619907\",\n android:\n \"https://play.google.com/store/apps/details?id=io.horizontalsystems.bankwallet\",\n },\n },\n bifrost: {\n native: \"bifrostwallet://\",\n scheme: \"bifrostwallet://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/bifrost-wallet/id1577198351\",\n android:\n \"https://play.google.com/store/apps/details?id=com.bifrostwallet.app\",\n },\n },\n pintu: {\n native: \"pintu://web3wallet\",\n scheme: \"pintu://web3wallet/wc\",\n store: {\n ios: \"https://apps.apple.com/id/app/pintu-buy-invest-crypto/id1494119678\",\n android: \"https://play.google.com/store/apps/details?id=com.valar.pintu\",\n },\n },\n hot: {\n native: \"hotwallet://\",\n scheme: \"hotwallet://wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/hot-wallet/id6740916148\",\n android:\n \"https://play.google.com/store/apps/details?id=app.herewallet.hot\",\n },\n },\n arculus: {\n native: \"arculuswc://\",\n scheme: \"arculuswc://wc\",\n universal: \"https://gw.arculus.co/app/wc\",\n store: {\n ios: \"https://apps.apple.com/us/app/arculus-wallet/id1575425801\",\n android:\n \"https://play.google.com/store/apps/details?id=co.arculus.wallet.android\",\n },\n },\n};\n","import { WALLET_LINKS } from \"./wallet-links\";\n\nexport interface WalletLink {\n /** App scheme used to foreground the wallet — without the `wc` suffix; may include a path (e.g. \"okxwallet://main\"). */\n native?: string;\n /** Custom scheme deep link incl. the `wc` path; we append `?uri=`. e.g. \"metamask://wc\". Preferred on mobile (same-tab). */\n scheme?: string;\n /** Universal/applink incl. the `wc` path. Fallback only — used when no `scheme` exists. */\n universal?: string;\n /** App store links — used for the \"wallet not installed\" fallback. */\n store?: { ios?: string; android?: string };\n}\n\nexport const DEFAULT_WALLET_LINKS: Record<string, WalletLink> = WALLET_LINKS;\n","import type { WalletLink } from \"./registry\";\n\nexport function isMobile(): boolean {\n if (typeof navigator === \"undefined\") return false;\n const ua = navigator.userAgent || \"\";\n const uaDataMobile =\n (navigator as { userAgentData?: { mobile?: boolean } }).userAgentData\n ?.mobile ?? false;\n return /iPhone|iPad|iPod|Android/i.test(ua) || uaDataMobile;\n}\n\nfunction buildLink(base: string, uri: string): string {\n const sep = base.includes(\"?\") ? \"&\" : \"?\";\n return `${base}${sep}uri=${encodeURIComponent(uri)}`;\n}\n\n/**\n * Whether a pairing can actually be handed to this wallet. Several catalog\n * entries carry only `native` or `store`, which cannot take a URI — telling the\n * host otherwise gets it to render a button that does nothing.\n */\nexport function canOpen(link: WalletLink | undefined): boolean {\n return !!(link?.scheme || link?.universal);\n}\n\n/**\n * Open the wallet for a WalletConnect pairing, in the SAME TAB. Returns whether\n * a link was fired. See CLAUDE.md for why the caller must offer a button (the\n * gesture) and why `\"universal\"` is never chosen automatically.\n */\nexport function openWallet(\n link: WalletLink,\n uri: string,\n via: \"scheme\" | \"universal\" = \"scheme\",\n): boolean {\n if (typeof document === \"undefined\") return false;\n const base =\n via === \"universal\" ? link.universal : (link.scheme ?? link.universal);\n if (!base) return false;\n openHref(buildLink(base, uri), false);\n return true;\n}\n\n/**\n * Bring the wallet app to the foreground (no WC URI) — for an approval the user\n * must return to the wallet for. Uses the bare `native` scheme; call within a gesture.\n */\nexport function openWalletApp(link: WalletLink): void {\n if (typeof document === \"undefined\") return;\n if (!link.native) return;\n openHref(link.native, false);\n}\n\nfunction openHref(href: string, newContext: boolean): void {\n const a = document.createElement(\"a\");\n a.href = href;\n if (newContext) {\n a.target = \"_blank\";\n a.rel = \"noopener noreferrer\";\n }\n a.style.display = \"none\";\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n}\n\n/** Resolves true if the page was backgrounded (wallet likely opened) within the window. */\nexport function detectAppOpen(timeoutMs: number): Promise<boolean> {\n if (typeof document === \"undefined\") return Promise.resolve(false);\n return new Promise((resolve) => {\n let done = false;\n const finish = (opened: boolean) => {\n if (done) return;\n done = true;\n document.removeEventListener(\"visibilitychange\", onVisibility);\n window.removeEventListener(\"pagehide\", onPageHide);\n clearTimeout(timer);\n resolve(opened);\n };\n const onVisibility = () => {\n if (document.hidden) finish(true);\n };\n const onPageHide = () => finish(true);\n document.addEventListener(\"visibilitychange\", onVisibility);\n window.addEventListener(\"pagehide\", onPageHide);\n const timer = setTimeout(() => finish(false), timeoutMs);\n });\n}\n","import SignClient from \"@walletconnect/sign-client\";\nimport { getSdkError, parseUri } from \"@walletconnect/utils\";\nimport type { SessionTypes } from \"@walletconnect/types\";\nimport { BaseConnector, type ConnectRequest } from \"../../core/connector\";\nimport type {\n CaipNamespace,\n Connection,\n OpenWalletInput,\n} from \"../../core/types\";\nimport { type AppConfig, deriveRedirectUrl, deriveUrl } from \"../../core/app\";\nimport { withSignal } from \"../../core/abort\";\nimport { DEFAULT_WALLET_LINKS, type WalletLink } from \"./registry\";\nimport {\n canOpen,\n detectAppOpen,\n isMobile,\n openWallet as openWalletLink,\n openWalletApp,\n} from \"./deeplink\";\n\nconst STORAGE_KEY = \"lydianconnect.wc.topics\"; // walletId -> session topic\n\n/**\n * How long to wait for a stored session's peer to answer a ping before treating\n * it as dead. Generous enough for a phone on a slow network, far short of the\n * five-minute proposal expiry a wrongly-reused session would otherwise cost.\n */\nconst PING_TIMEOUT_MS = 3000;\n\nexport interface WalletConnectOptions {\n projectId: string;\n relayUrl?: string;\n walletLinks?: Record<string, WalletLink>;\n openTimeoutMs?: number;\n}\n\nexport class WalletConnectConnector extends BaseConnector {\n readonly type = \"walletconnect\" as const;\n readonly walletIds: readonly string[] = []; // claims any wallet not served by an SDK connector\n\n private client: SignClient | null = null;\n private links: Record<string, WalletLink>;\n private topics = new Map<string, string>();\n /** walletId -> pairing URI of the connect currently awaiting approval, so a\n * host-driven open button can fire without the host tracking the URI itself. */\n private pending = new Map<string, string>();\n\n constructor(\n private app: AppConfig,\n private options: WalletConnectOptions,\n ) {\n super();\n this.links = { ...DEFAULT_WALLET_LINKS, ...(options.walletLinks ?? {}) };\n }\n\n isAvailable(): boolean {\n return true;\n }\n\n private async getClient(): Promise<SignClient> {\n if (this.client) return this.client;\n const redirectUrl = deriveRedirectUrl();\n const client = await SignClient.init({\n projectId: this.options.projectId,\n metadata: {\n name: this.app.appName,\n description: this.app.description ?? this.app.appName,\n url: deriveUrl(),\n icons: this.app.icon ? [this.app.icon] : [],\n // Wallets may use this to return the user after deep-link approvals.\n ...(redirectUrl ? { redirect: { universal: redirectUrl } } : {}),\n },\n relayUrl: this.options.relayUrl,\n });\n\n client.on(\"session_delete\", ({ topic }) => {\n const walletId = this.walletForTopic(topic);\n if (!walletId) return;\n this.topics.delete(walletId);\n this.persist();\n this.emit({ type: \"disconnect\", walletId });\n });\n\n client.on(\"session_event\", ({ topic, params }) => {\n const walletId = this.walletForTopic(topic);\n if (!walletId) return;\n const { name, data } = params.event;\n if (name === \"chainChanged\") {\n // params.chainId is the CAIP-2 chain the event is scoped to; prefix the\n // bare value with its namespace rather than assuming eip155.\n const ns = params.chainId.split(\":\")[0] ?? \"eip155\";\n const chainId =\n typeof data === \"string\" && data.includes(\":\")\n ? data\n : `${ns}:${String(data)}`;\n this.emit({ type: \"chainChanged\", walletId, chainId });\n } else if (name === \"accountsChanged\" && Array.isArray(data) && data[0]) {\n const account = String(data[0]).split(\":\").pop() ?? \"\";\n if (account) this.emit({ type: \"accountsChanged\", walletId, account });\n }\n });\n\n this.client = client;\n this.load();\n return client;\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const client = await this.getClient();\n\n const reused = await this.tryReuse(client, req);\n if (reused) return reused;\n\n // sign-client v2 folds `requiredNamespaces` into optionalNamespaces and\n // sends `requiredNamespaces: {}`, so this is not honored as \"required\" and\n // changing it back and forth achieves nothing. toConnection() verifying the\n // approved chains is what makes that safe.\n const { uri, approval } = await client.connect({\n requiredNamespaces: { [req.namespace.name]: req.namespace.value },\n });\n if (!uri) throw new Error(\"WalletConnect did not return a pairing URI\");\n\n const link = isMobile() ? this.links[req.walletId] : undefined;\n // Emit before opening anything: when the automatic deep link below is\n // suppressed, this event is all that stands between the user and a spinner.\n this.emit({\n type: \"display_uri\",\n walletId: req.walletId,\n uri,\n deepLink: canOpen(link),\n });\n\n // `link` may exist yet carry no scheme or universal — nothing to fire, and\n // no failure to report either.\n if (link && canOpen(link)) {\n this.pending.set(req.walletId, uri);\n openWalletLink(link, uri);\n void detectAppOpen(this.options.openTimeoutMs ?? 2000).then((opened) => {\n if (!opened)\n this.emit({\n type: \"wallet_open_failed\",\n walletId: req.walletId,\n uri,\n store: link.store,\n });\n });\n }\n\n const pairingTopic = parseUri(uri).topic;\n const session = await withSignal(approval(), req.signal, () => {\n void client.core.pairing\n .disconnect({ topic: pairingTopic })\n .catch(() => {});\n }).finally(() => this.pending.delete(req.walletId));\n\n const connection = this.toConnection(\n client,\n req.walletId,\n session,\n req.namespace,\n );\n this.topics.set(req.walletId, session.topic);\n this.persist();\n return connection;\n }\n\n /**\n * Fire a wallet's deep link on demand. The host calls this from a real click,\n * which is the one context a mobile browser reliably allows a scheme\n * navigation from — see the note on {@link openWallet}.\n */\n openWallet(input: OpenWalletInput): boolean {\n const link = this.links[input.walletId];\n if (!link) return false;\n const uri = input.uri ?? this.pending.get(input.walletId);\n // No URI: nothing to hand over, so just foreground the app. `via` has no\n // meaning here — there is no pairing link to build either way.\n if (!uri) {\n openWalletApp(link);\n return !!link.native;\n }\n return openWalletLink(link, uri, input.via ?? \"scheme\");\n }\n\n async restore(): Promise<Connection[]> {\n const client = await this.getClient();\n // One round-trip for all wallets rather than N in series.\n const checked = await Promise.all(\n [...this.topics].map(\n async ([walletId, topic]) =>\n [walletId, await this.liveSession(client, topic)] as const,\n ),\n );\n const out: Connection[] = [];\n for (const [walletId, session] of checked) {\n if (!session) {\n this.topics.delete(walletId);\n continue;\n }\n const ns = firstNamespace(session);\n if (ns) out.push(this.toConnection(client, walletId, session, ns));\n }\n this.persist();\n return out;\n }\n\n async reset(): Promise<void> {\n const client = this.client;\n if (client) {\n await Promise.allSettled(\n client.session.getAll().map((s) =>\n client.disconnect({\n topic: s.topic,\n reason: getSdkError(\"USER_DISCONNECTED\"),\n }),\n ),\n );\n }\n this.topics.clear();\n this.pending.clear();\n this.persist();\n }\n\n // --- helpers ---\n\n private async tryReuse(\n client: SignClient,\n req: ConnectRequest,\n ): Promise<Connection | null> {\n const topic = this.topics.get(req.walletId);\n if (!topic) return null;\n const session = await this.liveSession(client, topic);\n if (!session) {\n this.topics.delete(req.walletId);\n this.persist();\n return null;\n }\n const ns = session.namespaces[req.namespace.name];\n const wanted = req.namespace.value.chains?.[0];\n if (!ns || (wanted && !ns.chains?.includes(wanted))) return null;\n return this.toConnection(client, req.walletId, session, req.namespace);\n }\n\n private toConnection(\n client: SignClient,\n walletId: string,\n session: SessionTypes.Struct,\n namespace: CaipNamespace,\n ): Connection {\n const ns = session.namespaces[namespace.name];\n const account =\n (ns?.accounts ?? [])\n .map((a) => a.split(\":\")[2])\n .find((a): a is string => !!a) ?? \"\";\n // What the wallet actually granted, in its own order. `chains` is optional\n // per CAIP-25 and some wallets send it empty, so fall back on length rather\n // than nullishness — otherwise the chain below is fabricated as mainnet and\n // pinned into every request.\n const approved = ns?.chains?.length\n ? ns.chains\n : (ns?.accounts ?? []).map((a) => a.split(\":\").slice(0, 2).join(\":\"));\n const wanted = namespace.value.chains?.[0];\n // Prefer the chain we asked for whenever it was approved. Taking chains[0]\n // instead — as this used to — hands back whichever chain the wallet happened\n // to list first, and since that id is pinned into every request below, the\n // payment would be signed on it.\n const chainId =\n wanted && approved.includes(wanted)\n ? wanted\n : (approved[0] ?? `${namespace.name}:1`);\n const topic = session.topic;\n return {\n walletId,\n account,\n chainId,\n request: <T>(args: { method: string; params?: unknown }) =>\n client.request<T>({\n topic,\n chainId,\n request: { method: args.method, params: args.params as never },\n }),\n openWallet: () => {\n if (!isMobile()) return;\n const link = this.links[walletId];\n if (link) openWalletApp(link);\n },\n disconnect: async () => {\n await client\n .disconnect({ topic, reason: getSdkError(\"USER_DISCONNECTED\") })\n .catch(() => {});\n this.topics.delete(walletId);\n this.persist();\n this.emit({ type: \"disconnect\", walletId });\n },\n };\n }\n\n /**\n * A stored session the wallet is still on the other end of. The local record\n * is not evidence — it survives the user clearing the dApp inside their\n * wallet — and reusing a dead one returns a Connection that looks healthy\n * while every request hangs. So the peer has to answer for it.\n */\n private async liveSession(\n client: SignClient,\n topic: string,\n ): Promise<SessionTypes.Struct | undefined> {\n let session: SessionTypes.Struct;\n try {\n session = client.session.get(topic);\n } catch {\n return undefined;\n }\n let timer: ReturnType<typeof setTimeout> | undefined;\n const alive = await Promise.race([\n client\n .ping({ topic })\n .then(() => true)\n .catch(() => false),\n new Promise<boolean>((resolve) => {\n timer = setTimeout(() => resolve(false), PING_TIMEOUT_MS);\n }),\n ]).finally(() => clearTimeout(timer));\n return alive ? session : undefined;\n }\n\n private walletForTopic(topic: string): string | null {\n for (const [walletId, t] of this.topics) if (t === topic) return walletId;\n return null;\n }\n\n private persist(): void {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify([...this.topics]));\n } catch {\n /* SSR / no storage */\n }\n }\n\n private load(): void {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (raw)\n this.topics = new Map(JSON.parse(raw) as Array<[string, string]>);\n } catch {\n /* SSR / no storage */\n }\n }\n}\n\nfunction firstNamespace(session: SessionTypes.Struct): CaipNamespace | null {\n const name = Object.keys(session.namespaces)[0];\n if (!name) return null;\n const v = session.namespaces[name];\n if (!v) return null;\n return {\n name,\n value: { chains: v.chains, methods: v.methods, events: v.events },\n };\n}\n","import { ConnectManager } from \"./manager\";\nimport { buildNamespace } from \"./namespace\";\nimport type { Connector } from \"./connector\";\nimport type { AppConfig } from \"./app\";\nimport type {\n ConnectInput,\n Connection,\n LydianConnectConfig,\n LydianConnectEventHandler,\n OpenWalletInput,\n} from \"./types\";\nimport { WALLET_CATALOG } from \"@lydianpay/lydianconnect-catalog\";\nimport { MetaMaskConnector } from \"../connectors/metamask/connector\";\nimport { CoinbaseConnector } from \"../connectors/coinbase/connector\";\nimport { InjectedConnector } from \"../connectors/injected/connector\";\nimport { WalletConnectConnector } from \"../connectors/walletconnect/connector\";\n\n/**\n * catalog walletId -> EIP-6963 rdns, for every wallet that ships a browser\n * extension (has an `rdns`) on an EVM chain, EXCEPT those a dedicated SDK\n * connector already serves — the injected connector must not double-claim them.\n */\nfunction injectedRdnsMap(\n sdkServed: ReadonlySet<string>,\n): Record<string, string> {\n const map: Record<string, string> = {};\n for (const w of WALLET_CATALOG) {\n if (w.rdns && w.namespaces.includes(\"eip155\") && !sdkServed.has(w.id))\n map[w.id] = w.rdns;\n }\n return map;\n}\n\n/**\n * The library-owned connector set. Adding a new wallet SDK is a change HERE —\n * consumers get it on `npm update` with no code change. SDK code stays\n * code-split (lazy `import()` inside each connector), so registering a\n * connector adds ~nothing to the host app's initial bundle.\n */\nfunction createConnectors(config: LydianConnectConfig): Connector[] {\n const app: AppConfig = {\n appName: config.appName,\n icon: config.icon,\n description: config.description,\n };\n const sdk = [new MetaMaskConnector(app), new CoinbaseConnector(app)];\n const sdkServed = new Set(sdk.flatMap((c) => c.walletIds));\n return [\n ...sdk,\n new InjectedConnector(injectedRdnsMap(sdkServed)),\n new WalletConnectConnector(app, {\n projectId: config.walletConnectProjectId,\n }),\n ];\n}\n\n/**\n * The single surface the host app touches. Hand it a flat config; it owns the\n * connectors and routes each wallet to its native SDK (or the WalletConnect\n * fallback), returning a uniform {@link Connection} either way.\n */\nexport class LydianConnect {\n private manager: ConnectManager;\n\n constructor(config: LydianConnectConfig) {\n this.manager = new ConnectManager(createConnectors(config));\n }\n\n init(): Promise<void> {\n return this.manager.init();\n }\n\n async connect(input: ConnectInput): Promise<Connection> {\n if (input.chainId === undefined || input.chainId === null) {\n throw new Error(\n 'connect() requires a chainId (a number like 137 or an \"eip155:<id>\" string)',\n );\n }\n return this.manager.connect({\n walletId: input.walletId,\n namespace: buildNamespace(input.chainId),\n signal: input.signal,\n });\n }\n\n /**\n * Open a wallet app, optionally handing it the pairing URI from `display_uri`.\n *\n * Call this from a real click handler. A mobile browser will suppress the same\n * navigation issued automatically after an async step, which is why the\n * `display_uri` event reports `deepLink` — that is the library asking the host\n * for a button to put this behind.\n *\n * Returns whether a link was fired. `false` means nothing is known for this\n * wallet on this device; show the QR code instead.\n */\n openWallet(input: OpenWalletInput): boolean {\n return this.manager.openWallet(input);\n }\n\n restore(): Promise<Connection[]> {\n return this.manager.restore();\n }\n\n disconnect(walletId?: string): Promise<void> {\n return this.manager.disconnect(walletId);\n }\n\n reset(): Promise<void> {\n return this.manager.reset();\n }\n\n get(walletId: string): Connection | undefined {\n return this.manager.get(walletId);\n }\n\n on(handler: LydianConnectEventHandler): () => void {\n return this.manager.on(handler);\n }\n}\n"]}