@lydianpay/lydianconnect 1.1.0 → 1.1.1

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.cjs CHANGED
@@ -357,8 +357,8 @@ function evmChainIds(req) {
357
357
  return Number.isFinite(n) && n > 0 ? [n] : void 0;
358
358
  }
359
359
 
360
- // src/connectors/walletconnect/wallet-links.generated.ts
361
- var GENERATED_WALLET_LINKS = {
360
+ // src/connectors/walletconnect/wallet-links.ts
361
+ var WALLET_LINKS = {
362
362
  metamask: { "native": "metamask://", "scheme": "metamask://wc", "universal": "https://metamask.app.link/wc", "store": { "ios": "https://apps.apple.com/us/app/metamask/id1438144202", "android": "https://play.google.com/store/apps/details?id=io.metamask" } },
363
363
  trust: { "native": "trust://", "scheme": "trust://wc", "universal": "https://link.trustwallet.com/wc", "store": { "ios": "https://apps.apple.com/app/apple-store/id1288339409", "android": "https://play.google.com/store/apps/details?id=com.wallet.crypto.trustapp" } },
364
364
  rainbow: { "native": "rainbow://", "scheme": "rainbow://wc", "universal": "https://rnbwapp.com/wc", "store": { "ios": "https://apps.apple.com/app/apple-store/id1457119021?pt=119997837&ct=wc&mt=8", "android": "https://play.google.com/store/apps/details?id=me.rainbow&referrer=utm_source%3Dwc%26utm_medium%3Dconnector%26utm_campaign%3Dwc" } },
@@ -368,8 +368,8 @@ var GENERATED_WALLET_LINKS = {
368
368
  blockchaincom: { "native": "blockchain-wallet://", "scheme": "blockchain-wallet://wc", "universal": "https://login.blockchain.com/app/wc", "store": { "ios": "https://apps.apple.com/us/app/blockchain-bitcoin-wallet/id493253309", "android": "https://play.google.com/store/apps/details?id=piuk.blockchain.android" } },
369
369
  exodus: { "native": "exodus://", "scheme": "exodus://wc", "universal": "https://exodus.com/m/wc", "store": { "ios": "https://apps.apple.com/us/app/exodus-crypto-bitcoin-wallet/id1414384820", "android": "https://play.google.com/store/apps/details?id=exodusmovement.exodus&hl=en&gl=US" } },
370
370
  phantom: { "store": { "ios": "https://apps.apple.com/us/app/phantom-crypto-wallet/id1598432977", "android": "https://play.google.com/store/apps/details?id=app.phantom&hl=en" } },
371
- okx: { "native": "okex://main", "scheme": "okex://main/wc", "universal": "https://www.okx.com/download?appendQuery=true&deeplink=okx://web3/wallet/walletConnect/wc", "store": { "ios": "https://apps.apple.com/us/app/okx-buy-bitcoin-eth-crypto/id1327268470", "android": "https://play.google.com/store/apps/details?id=com.okinc.okex.gp" } },
372
- cryptocom: { "native": "dfw://", "scheme": "dfw://wc", "universal": "https://wallet.crypto.com/deeplink/wc", "store": { "ios": "https://apps.apple.com/US/app/id1512048310?mt=8", "android": "https://play.google.com/store/apps/details?id=com.defi.wallet" } },
371
+ okx: { "native": "okxwallet://main", "scheme": "okxwallet://main/wc", "store": { "ios": "https://apps.apple.com/us/app/okx-buy-bitcoin-eth-crypto/id1327268470", "android": "https://play.google.com/store/apps/details?id=com.okinc.okex.gp" } },
372
+ cryptocom: { "native": "cryptowallet://", "scheme": "cryptowallet://wc", "store": { "ios": "https://apps.apple.com/US/app/id1512048310?mt=8", "android": "https://play.google.com/store/apps/details?id=com.defi.wallet" } },
373
373
  argent: { "native": "argent://app/", "scheme": "argent://app/wc", "universal": "https://www.argent.xyz/app/wc", "store": { "ios": "https://apps.apple.com/us/app/argent-defi-in-a-tap/id1358741926", "android": "https://play.google.com/store/apps/details?id=im.argent.contractwalletclient&hl=en&gl=US&pli=1" } },
374
374
  safepal: { "native": "safepalwallet://", "scheme": "safepalwallet://wc", "universal": "https://link.safepal.io/wc", "store": { "ios": "https://apps.apple.com/app/safepal-wallet/id1548297139", "android": "https://play.google.com/store/apps/details?id=io.safepal.wallet" } },
375
375
  imtoken: { "native": "imtokenv2://", "scheme": "imtokenv2://wc", "store": { "ios": "https://apps.apple.com/us/app/imtoken2/id1384798940", "android": "https://play.google.com/store/apps/details?id=im.token.app" } },
@@ -385,7 +385,7 @@ var GENERATED_WALLET_LINKS = {
385
385
  };
386
386
 
387
387
  // src/connectors/walletconnect/registry.ts
388
- var DEFAULT_WALLET_LINKS = GENERATED_WALLET_LINKS;
388
+ var DEFAULT_WALLET_LINKS = WALLET_LINKS;
389
389
 
390
390
  // src/connectors/walletconnect/deeplink.ts
391
391
  function isMobile() {
@@ -400,24 +400,20 @@ function buildLink(base, uri) {
400
400
  }
401
401
  function openWallet(link, uri) {
402
402
  if (typeof document === "undefined") return;
403
- if (link.universal) {
404
- openHref(buildLink(link.universal, uri), true);
405
- } else if (link.scheme) {
406
- openHref(buildLink(link.scheme, uri), false);
403
+ if (link.scheme) {
404
+ openHref(buildLink(link.scheme, uri));
405
+ } else if (link.universal) {
406
+ openHref(buildLink(link.universal, uri));
407
407
  }
408
408
  }
409
409
  function openWalletApp(link) {
410
410
  if (typeof document === "undefined") return;
411
411
  if (!link.native) return;
412
- openHref(link.native, false);
412
+ openHref(link.native);
413
413
  }
414
414
  function openHref(href, newContext) {
415
415
  const a = document.createElement("a");
416
416
  a.href = href;
417
- if (newContext) {
418
- a.target = "_blank";
419
- a.rel = "noopener noreferrer";
420
- }
421
417
  a.style.display = "none";
422
418
  document.body.appendChild(a);
423
419
  a.click();
@@ -525,7 +521,13 @@ var WalletConnectConnector = class extends BaseConnector {
525
521
  if (link) {
526
522
  openWallet(link, warm.uri);
527
523
  void detectAppOpen(this.options.openTimeoutMs ?? 2e3).then((opened) => {
528
- if (!opened) this.emit({ type: "wallet_open_failed", walletId: req.walletId, uri: warm.uri });
524
+ if (!opened)
525
+ this.emit({
526
+ type: "wallet_open_failed",
527
+ walletId: req.walletId,
528
+ uri: warm.uri,
529
+ store: link.store
530
+ });
529
531
  });
530
532
  }
531
533
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/manager.ts","../src/core/namespace.ts","../src/core/connector.ts","../src/core/app.ts","../src/connectors/metamask/connector.ts","../src/connectors/coinbase/connector.ts","../src/connectors/walletconnect/wallet-links.generated.ts","../src/connectors/walletconnect/registry.ts","../src/connectors/walletconnect/deeplink.ts","../src/connectors/walletconnect/connector.ts","../src/core/lydian-connect.ts"],"names":["WALLET_ID","toCaip","SignClient","getSdkError"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Connector, ConnectRequest } from './connector';\nimport type { Connection, LydianConnectEvent, LydianConnectEventHandler } 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 /** SDK connector if one claims this walletId, else the fallback. The host app is oblivious. */\n private resolve(walletId: string): Connector {\n return this.byWallet.get(walletId) ?? this.fallback;\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n if (!this.started) await this.init();\n const connection = await this.resolve(req.walletId).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 async disconnect(walletId?: string): Promise<void> {\n if (walletId) {\n await this.connections.get(walletId)?.disconnect().catch(() => {});\n this.connections.delete(walletId);\n return;\n }\n await Promise.allSettled([...this.connections.values()].map((c) => c.disconnect()));\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// Sensible defaults for an EVM payment flow. Internalized so the host app\n// never hand-builds a namespace — it only chooses a chain.\nconst DEFAULT_EVM_METHODS = [\n 'eth_sendTransaction',\n 'personal_sign',\n 'eth_signTypedData_v4',\n 'wallet_switchEthereumChain',\n];\nconst DEFAULT_EVM_EVENTS = ['chainChanged', 'accountsChanged'];\n\n/**\n * Build a CAIP namespace from a chain id.\n * EVM-only for now: a number maps to `eip155:<n>`, and a CAIP-2 string must be\n * `eip155:<reference>`. Non-EVM namespaces (e.g. `solana:…`) would branch here\n * with their own methods/events when that support is added; until then we throw\n * rather than silently apply EVM defaults to a chain that can't use them.\n */\nexport function buildNamespace(chainId: number | string): CaipNamespace {\n const caip = typeof chainId === 'number' ? `eip155:${chainId}` : chainId;\n const [name, reference] = caip.split(':');\n if (name !== 'eip155' || !reference || !/^\\d+$/.test(reference) || Number(reference) <= 0) {\n throw new Error(\n `Unsupported chain \"${caip}\". lydianconnect is EVM-only for now — pass a positive number or an \"eip155:<id>\" string.`,\n );\n }\n return {\n name,\n value: { chains: [caip], methods: DEFAULT_EVM_METHODS, events: DEFAULT_EVM_EVENTS },\n };\n}\n","import type {\n CaipNamespace,\n Connection,\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/**\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 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\nexport abstract class BaseConnector implements Connector {\n abstract readonly type: ConnectorType;\n readonly walletIds: readonly string[] = [];\n\n private handlers = new Set<LydianConnectEventHandler>();\n\n abstract isAvailable(walletId: string): boolean | Promise<boolean>;\n abstract connect(req: ConnectRequest): Promise<Connection>;\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 protected emit(event: LydianConnectEvent): void {\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","import type { MetaMaskSDK as MetaMaskSDKType, MetaMaskSDKOptions } from '@metamask/sdk';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { Connection } from '../../core/types';\nimport { type AppConfig, deriveUrl } from '../../core/app';\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 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({ type: 'chainChanged', walletId: WALLET_ID, chainId: toCaip(String(hex)) });\n });\n provider.on('accountsChanged', (accounts) => {\n const account = Array.isArray(accounts) ? (accounts[0] as string | undefined) : undefined;\n if (account) this.emit({ type: 'accountsChanged', walletId: WALLET_ID, account });\n else this.emit({ type: 'disconnect', walletId: WALLET_ID });\n });\n provider.on('disconnect', () => this.emit({ type: 'disconnect', walletId: WALLET_ID }));\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const provider = await this.getProvider();\n const accounts = await provider.request<string[]>({ method: 'eth_requestAccounts' });\n const account = accounts?.[0];\n if (!account) throw new Error('MetaMask returned no account');\n await this.ensureChain(provider, req);\n const chainId = toCaip(await provider.request<string>({ method: 'eth_chainId' }));\n return this.toConnection(provider, account, chainId);\n }\n\n async restore(): Promise<Connection[]> {\n const provider = await this.getProvider().catch(() => null);\n if (!provider) return [];\n const accounts = await provider.request<string[]>({ method: 'eth_accounts' }).catch(() => []);\n const account = accounts?.[0];\n if (!account) return [];\n const chainId = toCaip(\n await provider.request<string>({ method: 'eth_chainId' }).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 /** Best-effort switch to the requested chain; leaves the wallet as-is if it's unknown to it. */\n private async ensureChain(provider: MetaMaskProvider, req: ConnectRequest): Promise<void> {\n const wanted = req.namespace.value.chains?.[0]; // \"eip155:137\"\n const wantedNum = wanted ? Number(wanted.split(':')[1]) : NaN;\n if (!Number.isFinite(wantedNum) || wantedNum <= 0) return;\n const current = parseInt(\n (await provider.request<string>({ method: 'eth_chainId' }).catch(() => '0x0')) ?? '0x0',\n 16,\n );\n if (current === wantedNum) return;\n await provider\n .request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: `0x${wantedNum.toString(16)}` }],\n })\n .catch(() => {\n /* chain not added to the wallet — the caller's chainChanged will reflect reality */\n });\n }\n\n private toConnection(provider: MetaMaskProvider, account: string, chainId: string): 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>({ method: args.method, params: args.params as never })) 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\nfunction toCaip(hexChainId: string | null | undefined): string {\n if (!hexChainId) return 'eip155:1';\n const num = hexChainId.startsWith('0x') ? parseInt(hexChainId, 16) : Number(hexChainId);\n return `eip155:${Number.isFinite(num) ? num : 1}`;\n}\n","import type { CoinbaseWalletSDK as CoinbaseWalletSDKType } from '@coinbase/wallet-sdk';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { Connection } from '../../core/types';\nimport type { AppConfig } from '../../core/app';\n\ntype CoinbaseProvider = NonNullable<ReturnType<CoinbaseWalletSDKType['makeWeb3Provider']>>;\ntype RequestArgs = Parameters<CoinbaseProvider['request']>[0];\n\n/** Coinbase v4's provider.request is non-generic and returns unknown; wrap + cast. */\nfunction rpc<T>(provider: CoinbaseProvider, method: string, params?: unknown): Promise<T> {\n return provider.request({ method, params } as unknown as RequestArgs) as Promise<T>;\n}\n\nconst WALLET_ID = 'coinbase';\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 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({ type: 'chainChanged', walletId: WALLET_ID, chainId: toCaip(String(hex)) });\n });\n provider.on('accountsChanged', (accounts) => {\n const account = Array.isArray(accounts) ? (accounts[0] as string | undefined) : undefined;\n if (account) this.emit({ type: 'accountsChanged', walletId: WALLET_ID, account });\n else this.emit({ type: 'disconnect', walletId: WALLET_ID });\n });\n provider.on('disconnect', () => this.emit({ type: 'disconnect', walletId: WALLET_ID }));\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\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 this.ensureChain(provider, req);\n const chainId = toCaip(await rpc<string>(provider, 'eth_chainId'));\n return this.toConnection(provider, account, chainId);\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(() => [] as string[]);\n const account = accounts?.[0];\n if (!account) return [];\n const chainId = toCaip(await rpc<string>(provider, 'eth_chainId').catch(() => '0x1'));\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 async ensureChain(provider: CoinbaseProvider, req: ConnectRequest): Promise<void> {\n const wanted = req.namespace.value.chains?.[0];\n const wantedNum = wanted ? Number(wanted.split(':')[1]) : NaN;\n if (!Number.isFinite(wantedNum) || wantedNum <= 0) return;\n const current = parseInt(\n (await rpc<string>(provider, 'eth_chainId').catch(() => '0x0')) ?? '0x0',\n 16,\n );\n if (current === wantedNum) return;\n await rpc(provider, 'wallet_switchEthereumChain', [{ chainId: `0x${wantedNum.toString(16)}` }]).catch(\n () => {},\n );\n }\n\n private toConnection(provider: CoinbaseProvider, account: string, chainId: string): 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\nfunction toCaip(hexChainId: string | null | undefined): string {\n if (!hexChainId) return 'eip155:1';\n const num = hexChainId.startsWith('0x') ? parseInt(hexChainId, 16) : Number(hexChainId);\n return `eip155:${Number.isFinite(num) ? num : 1}`;\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","// AUTO-GENERATED by scripts/build-wallet-links.mjs — do not edit by hand.\n// Refresh: WC_PROJECT_ID=<projectId> node scripts/build-wallet-links.mjs\n// Source: WalletConnect explorer API (explorer-api.walletconnect.com/v3/wallets)\nimport type { WalletLink } from './registry';\n\nexport const GENERATED_WALLET_LINKS: Record<string, WalletLink> = {\n metamask: {\"native\":\"metamask://\",\"scheme\":\"metamask://wc\",\"universal\":\"https://metamask.app.link/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/metamask/id1438144202\",\"android\":\"https://play.google.com/store/apps/details?id=io.metamask\"}},\n trust: {\"native\":\"trust://\",\"scheme\":\"trust://wc\",\"universal\":\"https://link.trustwallet.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/apple-store/id1288339409\",\"android\":\"https://play.google.com/store/apps/details?id=com.wallet.crypto.trustapp\"}},\n rainbow: {\"native\":\"rainbow://\",\"scheme\":\"rainbow://wc\",\"universal\":\"https://rnbwapp.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/apple-store/id1457119021?pt=119997837&ct=wc&mt=8\",\"android\":\"https://play.google.com/store/apps/details?id=me.rainbow&referrer=utm_source%3Dwc%26utm_medium%3Dconnector%26utm_campaign%3Dwc\"}},\n coinbase: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/base-formerly-coinbase-wallet/id1278383455\"}},\n zerion: {\"native\":\"zerion://\",\"scheme\":\"zerion://wc\",\"universal\":\"https://wallet.zerion.io/wc/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/id1456732565\",\"android\":\"https://play.google.com/store/apps/details?id=io.zerion.android&hl=en&gl=US\"}},\n tokenpocket: {\"native\":\"tpoutside://\",\"scheme\":\"tpoutside://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/tp-wallet/id6444625622?l=en\",\"android\":\"https://play.google.com/store/apps/details?id=vip.mytokenpocket\"}},\n blockchaincom: {\"native\":\"blockchain-wallet://\",\"scheme\":\"blockchain-wallet://wc\",\"universal\":\"https://login.blockchain.com/app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/blockchain-bitcoin-wallet/id493253309\",\"android\":\"https://play.google.com/store/apps/details?id=piuk.blockchain.android\"}},\n exodus: {\"native\":\"exodus://\",\"scheme\":\"exodus://wc\",\"universal\":\"https://exodus.com/m/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/exodus-crypto-bitcoin-wallet/id1414384820\",\"android\":\"https://play.google.com/store/apps/details?id=exodusmovement.exodus&hl=en&gl=US\"}},\n phantom: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/phantom-crypto-wallet/id1598432977\",\"android\":\"https://play.google.com/store/apps/details?id=app.phantom&hl=en\"}},\n okx: {\"native\":\"okex://main\",\"scheme\":\"okex://main/wc\",\"universal\":\"https://www.okx.com/download?appendQuery=true&deeplink=okx://web3/wallet/walletConnect/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/okx-buy-bitcoin-eth-crypto/id1327268470\",\"android\":\"https://play.google.com/store/apps/details?id=com.okinc.okex.gp\"}},\n cryptocom: {\"native\":\"dfw://\",\"scheme\":\"dfw://wc\",\"universal\":\"https://wallet.crypto.com/deeplink/wc\",\"store\":{\"ios\":\"https://apps.apple.com/US/app/id1512048310?mt=8\",\"android\":\"https://play.google.com/store/apps/details?id=com.defi.wallet\"}},\n argent: {\"native\":\"argent://app/\",\"scheme\":\"argent://app/wc\",\"universal\":\"https://www.argent.xyz/app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/argent-defi-in-a-tap/id1358741926\",\"android\":\"https://play.google.com/store/apps/details?id=im.argent.contractwalletclient&hl=en&gl=US&pli=1\"}},\n safepal: {\"native\":\"safepalwallet://\",\"scheme\":\"safepalwallet://wc\",\"universal\":\"https://link.safepal.io/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/safepal-wallet/id1548297139\",\"android\":\"https://play.google.com/store/apps/details?id=io.safepal.wallet\"}},\n imtoken: {\"native\":\"imtokenv2://\",\"scheme\":\"imtokenv2://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/imtoken2/id1384798940\",\"android\":\"https://play.google.com/store/apps/details?id=im.token.app\"}},\n ronin: {\"native\":\"roninwallet://\",\"scheme\":\"roninwallet://wc\",\"universal\":\"https://wallet.roninchain.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/ronin-wallet/id1592675001\",\"android\":\"https://play.google.com/store/apps/details?id=com.skymavis.genesis\"}},\n coin98: {\"native\":\"coin98://\",\"scheme\":\"coin98://wc\",\"universal\":\"https://coin98.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/vn/app/coin98-wallet/id1561969966\",\"android\":\"https://play.google.com/store/apps/details?id=coin98.crypto.finance.media&hl=vi&gl=US\"}},\n bitkeep: {\"native\":\"bitkeep://\",\"scheme\":\"bitkeep://wc\",\"universal\":\"https://bkapp.vip/wc\",\"store\":{\"ios\":\"https://web3.bitget.com/en/wallet-download?type=0\",\"android\":\"https://web3.bitget.com/en/wallet-download?type=0\"}},\n \"1inch\": {\"native\":\"oneinch://open/nobodywilleveruseit\",\"scheme\":\"oneinch://open/nobodywilleveruseit/wc\",\"universal\":\"https://wallet.1inch.io/app/nobodywilleveruseit/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/1inch-defi-wallet/id1546049391\",\"android\":\"https://play.google.com/store/apps/details?id=io.oneinch.android\"}},\n ledgerlive: {\"native\":\"ledgerlive://\",\"scheme\":\"ledgerlive://wc\",\"store\":{\"ios\":\"https://itunes.apple.com/app/id1361671700\",\"android\":\"https://play.google.com/store/apps/details?id=com.ledger.live\"}},\n atomic: {\"native\":\"atomicwallet://\",\"scheme\":\"atomicwallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/atomic-wallet/id1478257827\",\"android\":\"https://play.google.com/store/apps/details?id=io.atomicwallet\"}},\n alpha: {\"native\":\"awallet://\",\"scheme\":\"awallet://wc\",\"universal\":\"https://aw.app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/alphawallet-eth-wallet/id1358230430\",\"android\":\"https://play.google.com/store/apps/details?id=io.stormbird.wallet\"}},\n math: {\"native\":\"mathwallet://\",\"scheme\":\"mathwallet://wc\",\"universal\":\"https://www.mathwallet.org/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/mathwallet5/id1582612388\",\"android\":\"https://play.google.com/store/apps/details?id=com.mathwallet.android\"}},\n bitpay: {\"native\":\"bitpay://\",\"scheme\":\"bitpay://wc\",\"universal\":\"https://link.bitpay.com/wc\",\"store\":{\"ios\":\"https://bitpay.onelink.me/Cenw/ejjaw7bs\",\"android\":\"https://bitpay.onelink.me/Cenw/ejjaw7bs\"}},\n};\n","import { GENERATED_WALLET_LINKS } from './wallet-links.generated';\n\nexport interface WalletLink {\n /** App scheme used to foreground the wallet — without the `wc` suffix; may include a path (e.g. \"okex://main\"). */\n native?: string;\n /** Custom scheme deep link incl. the `wc` path; we append `?uri=`. e.g. \"metamask://wc\". */\n scheme?: string;\n /** Universal/applink incl. the `wc` path, preferred on mobile (OS falls back to the store). */\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> = GENERATED_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?.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 * Fire from WITHIN a user gesture. Universal link first (OS shows the App Store\n * if the wallet isn't installed) opened in a throwaway context so the checkout\n * page is never replaced in history; custom scheme as the fallback.\n */\nexport function openWallet(link: WalletLink, uri: string): void {\n if (typeof document === 'undefined') return;\n if (link.universal) {\n openHref(buildLink(link.universal, uri), true);\n } else if (link.scheme) {\n openHref(buildLink(link.scheme, uri), false);\n }\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 } from '@walletconnect/utils';\nimport type { SessionTypes } from '@walletconnect/types';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { CaipNamespace, Connection } from '../../core/types';\nimport { type AppConfig, deriveUrl } from '../../core/app';\nimport { DEFAULT_WALLET_LINKS, type WalletLink } from './registry';\nimport { detectAppOpen, isMobile, openWallet, openWalletApp } from './deeplink';\n\nconst STORAGE_KEY = 'lydianconnect.wc.topics'; // walletId -> session topic\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 private warm: { topic: string; uri: string } | null = null;\n private warming: Promise<void> | null = null;\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 const chainId =\n typeof data === 'string' && data.includes(':') ? data : `eip155:${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 /** Pre-create a pairing so connect() can deep-link synchronously within the gesture. */\n private async warmup(): Promise<void> {\n if (this.warm) return;\n if (this.warming) return this.warming;\n this.warming = (async () => {\n const client = await this.getClient();\n const { topic, uri } = await client.core.pairing.create();\n this.warm = { topic, uri };\n this.warming = null;\n })();\n return this.warming;\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const client = await this.getClient();\n\n const reused = this.tryReuse(client, req);\n if (reused) return reused;\n\n if (!this.warm) await this.warmup(); // cold path loses the gesture, but the QR/URI is still emitted\n const warm = this.warm;\n this.warm = null;\n if (!warm) throw new Error('Failed to create WalletConnect pairing');\n\n this.emit({ type: 'display_uri', walletId: req.walletId, uri: warm.uri });\n\n if (isMobile()) {\n const link = this.links[req.walletId];\n if (link) {\n openWallet(link, warm.uri); // synchronous — preserves connect()'s click gesture\n void detectAppOpen(this.options.openTimeoutMs ?? 2000).then((opened) => {\n if (!opened) this.emit({ type: 'wallet_open_failed', walletId: req.walletId, uri: warm.uri });\n });\n }\n }\n\n const { approval } = await client.connect({\n pairingTopic: warm.topic,\n optionalNamespaces: { [req.namespace.name]: req.namespace.value },\n });\n\n const session = await withSignal(approval(), req.signal, () => {\n void client.core.pairing.disconnect({ topic: warm.topic }).catch(() => {});\n });\n\n void this.warmup(); // re-arm for the next connection\n\n const connection = this.toConnection(client, req.walletId, session, req.namespace);\n this.topics.set(req.walletId, session.topic);\n this.persist();\n return connection;\n }\n\n async restore(): Promise<Connection[]> {\n const client = await this.getClient();\n const out: Connection[] = [];\n for (const [walletId, topic] of [...this.topics]) {\n const session = this.liveSession(client, topic);\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\n .getAll()\n .map((s) => client.disconnect({ topic: s.topic, reason: getSdkError('USER_DISCONNECTED') })),\n );\n }\n this.topics.clear();\n this.persist();\n this.warm = null;\n }\n\n // --- helpers ---\n\n private tryReuse(client: SignClient, req: ConnectRequest): Connection | null {\n const topic = this.topics.get(req.walletId);\n if (!topic) return null;\n const session = this.liveSession(client, topic);\n if (!session) {\n this.topics.delete(req.walletId);\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 ?? []).map((a) => a.split(':')[2]).find((a): a is string => !!a) ?? '';\n const chainId =\n ns?.chains?.[0] ??\n (ns?.accounts?.[0] ? ns.accounts[0].split(':').slice(0, 2).join(':') : `${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.disconnect({ topic, reason: getSdkError('USER_DISCONNECTED') }).catch(() => {});\n this.topics.delete(walletId);\n this.persist();\n this.emit({ type: 'disconnect', walletId });\n },\n };\n }\n\n private liveSession(client: SignClient, topic: string): SessionTypes.Struct | undefined {\n try {\n return client.session.get(topic);\n } catch {\n return undefined;\n }\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) 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 { name, value: { chains: v.chains, methods: v.methods, events: v.events } };\n}\n\nfunction withSignal<T>(\n promise: Promise<T>,\n signal: AbortSignal | undefined,\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 (v) => {\n signal.removeEventListener('abort', abortHandler);\n resolve(v);\n },\n (e) => {\n signal.removeEventListener('abort', abortHandler);\n reject(e);\n },\n );\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} from './types';\nimport { MetaMaskConnector } from '../connectors/metamask/connector';\nimport { CoinbaseConnector } from '../connectors/coinbase/connector';\nimport { WalletConnectConnector } from '../connectors/walletconnect/connector';\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 return [\n new MetaMaskConnector(app),\n new CoinbaseConnector(app),\n new WalletConnectConnector(app, { projectId: config.walletConnectProjectId }),\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('connect() requires a chainId (a number like 137 or an \"eip155:<id>\" string)');\n }\n return this.manager.connect({\n walletId: input.walletId,\n namespace: buildNamespace(input.chainId),\n signal: input.signal,\n });\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","../src/core/connector.ts","../src/core/app.ts","../src/connectors/metamask/connector.ts","../src/connectors/coinbase/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":["WALLET_ID","toCaip","SignClient","getSdkError"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Connector, ConnectRequest } from './connector';\nimport type { Connection, LydianConnectEvent, LydianConnectEventHandler } 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 /** SDK connector if one claims this walletId, else the fallback. The host app is oblivious. */\n private resolve(walletId: string): Connector {\n return this.byWallet.get(walletId) ?? this.fallback;\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n if (!this.started) await this.init();\n const connection = await this.resolve(req.walletId).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 async disconnect(walletId?: string): Promise<void> {\n if (walletId) {\n await this.connections.get(walletId)?.disconnect().catch(() => {});\n this.connections.delete(walletId);\n return;\n }\n await Promise.allSettled([...this.connections.values()].map((c) => c.disconnect()));\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// Sensible defaults for an EVM payment flow. Internalized so the host app\n// never hand-builds a namespace — it only chooses a chain.\nconst DEFAULT_EVM_METHODS = [\n 'eth_sendTransaction',\n 'personal_sign',\n 'eth_signTypedData_v4',\n 'wallet_switchEthereumChain',\n];\nconst DEFAULT_EVM_EVENTS = ['chainChanged', 'accountsChanged'];\n\n/**\n * Build a CAIP namespace from a chain id.\n * EVM-only for now: a number maps to `eip155:<n>`, and a CAIP-2 string must be\n * `eip155:<reference>`. Non-EVM namespaces (e.g. `solana:…`) would branch here\n * with their own methods/events when that support is added; until then we throw\n * rather than silently apply EVM defaults to a chain that can't use them.\n */\nexport function buildNamespace(chainId: number | string): CaipNamespace {\n const caip = typeof chainId === 'number' ? `eip155:${chainId}` : chainId;\n const [name, reference] = caip.split(':');\n if (name !== 'eip155' || !reference || !/^\\d+$/.test(reference) || Number(reference) <= 0) {\n throw new Error(\n `Unsupported chain \"${caip}\". lydianconnect is EVM-only for now — pass a positive number or an \"eip155:<id>\" string.`,\n );\n }\n return {\n name,\n value: { chains: [caip], methods: DEFAULT_EVM_METHODS, events: DEFAULT_EVM_EVENTS },\n };\n}\n","import type {\n CaipNamespace,\n Connection,\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/**\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 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\nexport abstract class BaseConnector implements Connector {\n abstract readonly type: ConnectorType;\n readonly walletIds: readonly string[] = [];\n\n private handlers = new Set<LydianConnectEventHandler>();\n\n abstract isAvailable(walletId: string): boolean | Promise<boolean>;\n abstract connect(req: ConnectRequest): Promise<Connection>;\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 protected emit(event: LydianConnectEvent): void {\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","import type { MetaMaskSDK as MetaMaskSDKType, MetaMaskSDKOptions } from '@metamask/sdk';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { Connection } from '../../core/types';\nimport { type AppConfig, deriveUrl } from '../../core/app';\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 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({ type: 'chainChanged', walletId: WALLET_ID, chainId: toCaip(String(hex)) });\n });\n provider.on('accountsChanged', (accounts) => {\n const account = Array.isArray(accounts) ? (accounts[0] as string | undefined) : undefined;\n if (account) this.emit({ type: 'accountsChanged', walletId: WALLET_ID, account });\n else this.emit({ type: 'disconnect', walletId: WALLET_ID });\n });\n provider.on('disconnect', () => this.emit({ type: 'disconnect', walletId: WALLET_ID }));\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const provider = await this.getProvider();\n const accounts = await provider.request<string[]>({ method: 'eth_requestAccounts' });\n const account = accounts?.[0];\n if (!account) throw new Error('MetaMask returned no account');\n await this.ensureChain(provider, req);\n const chainId = toCaip(await provider.request<string>({ method: 'eth_chainId' }));\n return this.toConnection(provider, account, chainId);\n }\n\n async restore(): Promise<Connection[]> {\n const provider = await this.getProvider().catch(() => null);\n if (!provider) return [];\n const accounts = await provider.request<string[]>({ method: 'eth_accounts' }).catch(() => []);\n const account = accounts?.[0];\n if (!account) return [];\n const chainId = toCaip(\n await provider.request<string>({ method: 'eth_chainId' }).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 /** Best-effort switch to the requested chain; leaves the wallet as-is if it's unknown to it. */\n private async ensureChain(provider: MetaMaskProvider, req: ConnectRequest): Promise<void> {\n const wanted = req.namespace.value.chains?.[0]; // \"eip155:137\"\n const wantedNum = wanted ? Number(wanted.split(':')[1]) : NaN;\n if (!Number.isFinite(wantedNum) || wantedNum <= 0) return;\n const current = parseInt(\n (await provider.request<string>({ method: 'eth_chainId' }).catch(() => '0x0')) ?? '0x0',\n 16,\n );\n if (current === wantedNum) return;\n await provider\n .request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: `0x${wantedNum.toString(16)}` }],\n })\n .catch(() => {\n /* chain not added to the wallet — the caller's chainChanged will reflect reality */\n });\n }\n\n private toConnection(provider: MetaMaskProvider, account: string, chainId: string): 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>({ method: args.method, params: args.params as never })) 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\nfunction toCaip(hexChainId: string | null | undefined): string {\n if (!hexChainId) return 'eip155:1';\n const num = hexChainId.startsWith('0x') ? parseInt(hexChainId, 16) : Number(hexChainId);\n return `eip155:${Number.isFinite(num) ? num : 1}`;\n}\n","import type { CoinbaseWalletSDK as CoinbaseWalletSDKType } from '@coinbase/wallet-sdk';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { Connection } from '../../core/types';\nimport type { AppConfig } from '../../core/app';\n\ntype CoinbaseProvider = NonNullable<ReturnType<CoinbaseWalletSDKType['makeWeb3Provider']>>;\ntype RequestArgs = Parameters<CoinbaseProvider['request']>[0];\n\n/** Coinbase v4's provider.request is non-generic and returns unknown; wrap + cast. */\nfunction rpc<T>(provider: CoinbaseProvider, method: string, params?: unknown): Promise<T> {\n return provider.request({ method, params } as unknown as RequestArgs) as Promise<T>;\n}\n\nconst WALLET_ID = 'coinbase';\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 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({ type: 'chainChanged', walletId: WALLET_ID, chainId: toCaip(String(hex)) });\n });\n provider.on('accountsChanged', (accounts) => {\n const account = Array.isArray(accounts) ? (accounts[0] as string | undefined) : undefined;\n if (account) this.emit({ type: 'accountsChanged', walletId: WALLET_ID, account });\n else this.emit({ type: 'disconnect', walletId: WALLET_ID });\n });\n provider.on('disconnect', () => this.emit({ type: 'disconnect', walletId: WALLET_ID }));\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\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 this.ensureChain(provider, req);\n const chainId = toCaip(await rpc<string>(provider, 'eth_chainId'));\n return this.toConnection(provider, account, chainId);\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(() => [] as string[]);\n const account = accounts?.[0];\n if (!account) return [];\n const chainId = toCaip(await rpc<string>(provider, 'eth_chainId').catch(() => '0x1'));\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 async ensureChain(provider: CoinbaseProvider, req: ConnectRequest): Promise<void> {\n const wanted = req.namespace.value.chains?.[0];\n const wantedNum = wanted ? Number(wanted.split(':')[1]) : NaN;\n if (!Number.isFinite(wantedNum) || wantedNum <= 0) return;\n const current = parseInt(\n (await rpc<string>(provider, 'eth_chainId').catch(() => '0x0')) ?? '0x0',\n 16,\n );\n if (current === wantedNum) return;\n await rpc(provider, 'wallet_switchEthereumChain', [{ chainId: `0x${wantedNum.toString(16)}` }]).catch(\n () => {},\n );\n }\n\n private toConnection(provider: CoinbaseProvider, account: string, chainId: string): 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\nfunction toCaip(hexChainId: string | null | undefined): string {\n if (!hexChainId) return 'eip155:1';\n const num = hexChainId.startsWith('0x') ? parseInt(hexChainId, 16) : Number(hexChainId);\n return `eip155:${Number.isFinite(num) ? num : 1}`;\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","// 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: {\"native\":\"metamask://\",\"scheme\":\"metamask://wc\",\"universal\":\"https://metamask.app.link/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/metamask/id1438144202\",\"android\":\"https://play.google.com/store/apps/details?id=io.metamask\"}},\n trust: {\"native\":\"trust://\",\"scheme\":\"trust://wc\",\"universal\":\"https://link.trustwallet.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/apple-store/id1288339409\",\"android\":\"https://play.google.com/store/apps/details?id=com.wallet.crypto.trustapp\"}},\n rainbow: {\"native\":\"rainbow://\",\"scheme\":\"rainbow://wc\",\"universal\":\"https://rnbwapp.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/apple-store/id1457119021?pt=119997837&ct=wc&mt=8\",\"android\":\"https://play.google.com/store/apps/details?id=me.rainbow&referrer=utm_source%3Dwc%26utm_medium%3Dconnector%26utm_campaign%3Dwc\"}},\n coinbase: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/base-formerly-coinbase-wallet/id1278383455\"}},\n zerion: {\"native\":\"zerion://\",\"scheme\":\"zerion://wc\",\"universal\":\"https://wallet.zerion.io/wc/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/id1456732565\",\"android\":\"https://play.google.com/store/apps/details?id=io.zerion.android&hl=en&gl=US\"}},\n tokenpocket: {\"native\":\"tpoutside://\",\"scheme\":\"tpoutside://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/tp-wallet/id6444625622?l=en\",\"android\":\"https://play.google.com/store/apps/details?id=vip.mytokenpocket\"}},\n blockchaincom: {\"native\":\"blockchain-wallet://\",\"scheme\":\"blockchain-wallet://wc\",\"universal\":\"https://login.blockchain.com/app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/blockchain-bitcoin-wallet/id493253309\",\"android\":\"https://play.google.com/store/apps/details?id=piuk.blockchain.android\"}},\n exodus: {\"native\":\"exodus://\",\"scheme\":\"exodus://wc\",\"universal\":\"https://exodus.com/m/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/exodus-crypto-bitcoin-wallet/id1414384820\",\"android\":\"https://play.google.com/store/apps/details?id=exodusmovement.exodus&hl=en&gl=US\"}},\n phantom: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/phantom-crypto-wallet/id1598432977\",\"android\":\"https://play.google.com/store/apps/details?id=app.phantom&hl=en\"}},\n okx: {\"native\":\"okxwallet://main\",\"scheme\":\"okxwallet://main/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/okx-buy-bitcoin-eth-crypto/id1327268470\",\"android\":\"https://play.google.com/store/apps/details?id=com.okinc.okex.gp\"}},\n cryptocom: {\"native\":\"cryptowallet://\",\"scheme\":\"cryptowallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/US/app/id1512048310?mt=8\",\"android\":\"https://play.google.com/store/apps/details?id=com.defi.wallet\"}},\n argent: {\"native\":\"argent://app/\",\"scheme\":\"argent://app/wc\",\"universal\":\"https://www.argent.xyz/app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/argent-defi-in-a-tap/id1358741926\",\"android\":\"https://play.google.com/store/apps/details?id=im.argent.contractwalletclient&hl=en&gl=US&pli=1\"}},\n safepal: {\"native\":\"safepalwallet://\",\"scheme\":\"safepalwallet://wc\",\"universal\":\"https://link.safepal.io/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/safepal-wallet/id1548297139\",\"android\":\"https://play.google.com/store/apps/details?id=io.safepal.wallet\"}},\n imtoken: {\"native\":\"imtokenv2://\",\"scheme\":\"imtokenv2://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/imtoken2/id1384798940\",\"android\":\"https://play.google.com/store/apps/details?id=im.token.app\"}},\n ronin: {\"native\":\"roninwallet://\",\"scheme\":\"roninwallet://wc\",\"universal\":\"https://wallet.roninchain.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/ronin-wallet/id1592675001\",\"android\":\"https://play.google.com/store/apps/details?id=com.skymavis.genesis\"}},\n coin98: {\"native\":\"coin98://\",\"scheme\":\"coin98://wc\",\"universal\":\"https://coin98.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/vn/app/coin98-wallet/id1561969966\",\"android\":\"https://play.google.com/store/apps/details?id=coin98.crypto.finance.media&hl=vi&gl=US\"}},\n bitkeep: {\"native\":\"bitkeep://\",\"scheme\":\"bitkeep://wc\",\"universal\":\"https://bkapp.vip/wc\",\"store\":{\"ios\":\"https://web3.bitget.com/en/wallet-download?type=0\",\"android\":\"https://web3.bitget.com/en/wallet-download?type=0\"}},\n \"1inch\": {\"native\":\"oneinch://open/nobodywilleveruseit\",\"scheme\":\"oneinch://open/nobodywilleveruseit/wc\",\"universal\":\"https://wallet.1inch.io/app/nobodywilleveruseit/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/1inch-defi-wallet/id1546049391\",\"android\":\"https://play.google.com/store/apps/details?id=io.oneinch.android\"}},\n ledgerlive: {\"native\":\"ledgerlive://\",\"scheme\":\"ledgerlive://wc\",\"store\":{\"ios\":\"https://itunes.apple.com/app/id1361671700\",\"android\":\"https://play.google.com/store/apps/details?id=com.ledger.live\"}},\n atomic: {\"native\":\"atomicwallet://\",\"scheme\":\"atomicwallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/atomic-wallet/id1478257827\",\"android\":\"https://play.google.com/store/apps/details?id=io.atomicwallet\"}},\n alpha: {\"native\":\"awallet://\",\"scheme\":\"awallet://wc\",\"universal\":\"https://aw.app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/alphawallet-eth-wallet/id1358230430\",\"android\":\"https://play.google.com/store/apps/details?id=io.stormbird.wallet\"}},\n math: {\"native\":\"mathwallet://\",\"scheme\":\"mathwallet://wc\",\"universal\":\"https://www.mathwallet.org/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/mathwallet5/id1582612388\",\"android\":\"https://play.google.com/store/apps/details?id=com.mathwallet.android\"}},\n bitpay: {\"native\":\"bitpay://\",\"scheme\":\"bitpay://wc\",\"universal\":\"https://link.bitpay.com/wc\",\"store\":{\"ios\":\"https://bitpay.onelink.me/Cenw/ejjaw7bs\",\"android\":\"https://bitpay.onelink.me/Cenw/ejjaw7bs\"}},\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?.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 * Open the wallet for a WalletConnect pairing on mobile. Custom scheme first, in\n * the SAME TAB — that reliably foregrounds an installed app and, unlike a\n * _blank/popup navigation, is NOT suppressed once the click gesture has been lost\n * (which it has by the time connect() reaches here, after the async pairing setup).\n * Universal link is only a fallback for the rare wallet with no custom scheme.\n * The not-installed case is handled by the connector via detectAppOpen().\n */\nexport function openWallet(link: WalletLink, uri: string): void {\n if (typeof document === 'undefined') return;\n if (link.scheme) {\n openHref(buildLink(link.scheme, uri), false);\n } else if (link.universal) {\n openHref(buildLink(link.universal, uri), false);\n }\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 } from '@walletconnect/utils';\nimport type { SessionTypes } from '@walletconnect/types';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { CaipNamespace, Connection } from '../../core/types';\nimport { type AppConfig, deriveUrl } from '../../core/app';\nimport { DEFAULT_WALLET_LINKS, type WalletLink } from './registry';\nimport { detectAppOpen, isMobile, openWallet, openWalletApp } from './deeplink';\n\nconst STORAGE_KEY = 'lydianconnect.wc.topics'; // walletId -> session topic\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 private warm: { topic: string; uri: string } | null = null;\n private warming: Promise<void> | null = null;\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 const chainId =\n typeof data === 'string' && data.includes(':') ? data : `eip155:${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 /** Pre-create a pairing so connect() can deep-link synchronously within the gesture. */\n private async warmup(): Promise<void> {\n if (this.warm) return;\n if (this.warming) return this.warming;\n this.warming = (async () => {\n const client = await this.getClient();\n const { topic, uri } = await client.core.pairing.create();\n this.warm = { topic, uri };\n this.warming = null;\n })();\n return this.warming;\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const client = await this.getClient();\n\n const reused = this.tryReuse(client, req);\n if (reused) return reused;\n\n if (!this.warm) await this.warmup(); // cold path loses the gesture, but the QR/URI is still emitted\n const warm = this.warm;\n this.warm = null;\n if (!warm) throw new Error('Failed to create WalletConnect pairing');\n\n this.emit({ type: 'display_uri', walletId: req.walletId, uri: warm.uri });\n\n if (isMobile()) {\n const link = this.links[req.walletId];\n if (link) {\n openWallet(link, warm.uri); // synchronous — preserves connect()'s click gesture\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: warm.uri,\n store: link.store,\n });\n });\n }\n }\n\n const { approval } = await client.connect({\n pairingTopic: warm.topic,\n optionalNamespaces: { [req.namespace.name]: req.namespace.value },\n });\n\n const session = await withSignal(approval(), req.signal, () => {\n void client.core.pairing.disconnect({ topic: warm.topic }).catch(() => {});\n });\n\n void this.warmup(); // re-arm for the next connection\n\n const connection = this.toConnection(client, req.walletId, session, req.namespace);\n this.topics.set(req.walletId, session.topic);\n this.persist();\n return connection;\n }\n\n async restore(): Promise<Connection[]> {\n const client = await this.getClient();\n const out: Connection[] = [];\n for (const [walletId, topic] of [...this.topics]) {\n const session = this.liveSession(client, topic);\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\n .getAll()\n .map((s) => client.disconnect({ topic: s.topic, reason: getSdkError('USER_DISCONNECTED') })),\n );\n }\n this.topics.clear();\n this.persist();\n this.warm = null;\n }\n\n // --- helpers ---\n\n private tryReuse(client: SignClient, req: ConnectRequest): Connection | null {\n const topic = this.topics.get(req.walletId);\n if (!topic) return null;\n const session = this.liveSession(client, topic);\n if (!session) {\n this.topics.delete(req.walletId);\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 ?? []).map((a) => a.split(':')[2]).find((a): a is string => !!a) ?? '';\n const chainId =\n ns?.chains?.[0] ??\n (ns?.accounts?.[0] ? ns.accounts[0].split(':').slice(0, 2).join(':') : `${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.disconnect({ topic, reason: getSdkError('USER_DISCONNECTED') }).catch(() => {});\n this.topics.delete(walletId);\n this.persist();\n this.emit({ type: 'disconnect', walletId });\n },\n };\n }\n\n private liveSession(client: SignClient, topic: string): SessionTypes.Struct | undefined {\n try {\n return client.session.get(topic);\n } catch {\n return undefined;\n }\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) 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 { name, value: { chains: v.chains, methods: v.methods, events: v.events } };\n}\n\nfunction withSignal<T>(\n promise: Promise<T>,\n signal: AbortSignal | undefined,\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 (v) => {\n signal.removeEventListener('abort', abortHandler);\n resolve(v);\n },\n (e) => {\n signal.removeEventListener('abort', abortHandler);\n reject(e);\n },\n );\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} from './types';\nimport { MetaMaskConnector } from '../connectors/metamask/connector';\nimport { CoinbaseConnector } from '../connectors/coinbase/connector';\nimport { WalletConnectConnector } from '../connectors/walletconnect/connector';\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 return [\n new MetaMaskConnector(app),\n new CoinbaseConnector(app),\n new WalletConnectConnector(app, { projectId: config.walletConnectProjectId }),\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('connect() requires a chainId (a number like 137 or an \"eip155:<id>\" string)');\n }\n return this.manager.connect({\n walletId: input.walletId,\n namespace: buildNamespace(input.chainId),\n signal: input.signal,\n });\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"]}
package/dist/index.d.cts CHANGED
@@ -80,11 +80,16 @@ type LydianConnectEvent =
80
80
  walletId: string;
81
81
  account: string;
82
82
  }
83
- /** Deep-link was fired but the page stayed visible — wallet likely not installed. */
83
+ /** Deep-link was fired but the page stayed visible — wallet likely not installed.
84
+ * `store` carries the app-store links (when known) so the host can offer an install CTA. */
84
85
  | {
85
86
  type: 'wallet_open_failed';
86
87
  walletId: string;
87
88
  uri: string;
89
+ store?: {
90
+ ios?: string;
91
+ android?: string;
92
+ };
88
93
  };
89
94
  type LydianConnectEventHandler = (event: LydianConnectEvent) => void;
90
95
 
package/dist/index.d.ts CHANGED
@@ -80,11 +80,16 @@ type LydianConnectEvent =
80
80
  walletId: string;
81
81
  account: string;
82
82
  }
83
- /** Deep-link was fired but the page stayed visible — wallet likely not installed. */
83
+ /** Deep-link was fired but the page stayed visible — wallet likely not installed.
84
+ * `store` carries the app-store links (when known) so the host can offer an install CTA. */
84
85
  | {
85
86
  type: 'wallet_open_failed';
86
87
  walletId: string;
87
88
  uri: string;
89
+ store?: {
90
+ ios?: string;
91
+ android?: string;
92
+ };
88
93
  };
89
94
  type LydianConnectEventHandler = (event: LydianConnectEvent) => void;
90
95
 
package/dist/index.js CHANGED
@@ -351,8 +351,8 @@ function evmChainIds(req) {
351
351
  return Number.isFinite(n) && n > 0 ? [n] : void 0;
352
352
  }
353
353
 
354
- // src/connectors/walletconnect/wallet-links.generated.ts
355
- var GENERATED_WALLET_LINKS = {
354
+ // src/connectors/walletconnect/wallet-links.ts
355
+ var WALLET_LINKS = {
356
356
  metamask: { "native": "metamask://", "scheme": "metamask://wc", "universal": "https://metamask.app.link/wc", "store": { "ios": "https://apps.apple.com/us/app/metamask/id1438144202", "android": "https://play.google.com/store/apps/details?id=io.metamask" } },
357
357
  trust: { "native": "trust://", "scheme": "trust://wc", "universal": "https://link.trustwallet.com/wc", "store": { "ios": "https://apps.apple.com/app/apple-store/id1288339409", "android": "https://play.google.com/store/apps/details?id=com.wallet.crypto.trustapp" } },
358
358
  rainbow: { "native": "rainbow://", "scheme": "rainbow://wc", "universal": "https://rnbwapp.com/wc", "store": { "ios": "https://apps.apple.com/app/apple-store/id1457119021?pt=119997837&ct=wc&mt=8", "android": "https://play.google.com/store/apps/details?id=me.rainbow&referrer=utm_source%3Dwc%26utm_medium%3Dconnector%26utm_campaign%3Dwc" } },
@@ -362,8 +362,8 @@ var GENERATED_WALLET_LINKS = {
362
362
  blockchaincom: { "native": "blockchain-wallet://", "scheme": "blockchain-wallet://wc", "universal": "https://login.blockchain.com/app/wc", "store": { "ios": "https://apps.apple.com/us/app/blockchain-bitcoin-wallet/id493253309", "android": "https://play.google.com/store/apps/details?id=piuk.blockchain.android" } },
363
363
  exodus: { "native": "exodus://", "scheme": "exodus://wc", "universal": "https://exodus.com/m/wc", "store": { "ios": "https://apps.apple.com/us/app/exodus-crypto-bitcoin-wallet/id1414384820", "android": "https://play.google.com/store/apps/details?id=exodusmovement.exodus&hl=en&gl=US" } },
364
364
  phantom: { "store": { "ios": "https://apps.apple.com/us/app/phantom-crypto-wallet/id1598432977", "android": "https://play.google.com/store/apps/details?id=app.phantom&hl=en" } },
365
- okx: { "native": "okex://main", "scheme": "okex://main/wc", "universal": "https://www.okx.com/download?appendQuery=true&deeplink=okx://web3/wallet/walletConnect/wc", "store": { "ios": "https://apps.apple.com/us/app/okx-buy-bitcoin-eth-crypto/id1327268470", "android": "https://play.google.com/store/apps/details?id=com.okinc.okex.gp" } },
366
- cryptocom: { "native": "dfw://", "scheme": "dfw://wc", "universal": "https://wallet.crypto.com/deeplink/wc", "store": { "ios": "https://apps.apple.com/US/app/id1512048310?mt=8", "android": "https://play.google.com/store/apps/details?id=com.defi.wallet" } },
365
+ okx: { "native": "okxwallet://main", "scheme": "okxwallet://main/wc", "store": { "ios": "https://apps.apple.com/us/app/okx-buy-bitcoin-eth-crypto/id1327268470", "android": "https://play.google.com/store/apps/details?id=com.okinc.okex.gp" } },
366
+ cryptocom: { "native": "cryptowallet://", "scheme": "cryptowallet://wc", "store": { "ios": "https://apps.apple.com/US/app/id1512048310?mt=8", "android": "https://play.google.com/store/apps/details?id=com.defi.wallet" } },
367
367
  argent: { "native": "argent://app/", "scheme": "argent://app/wc", "universal": "https://www.argent.xyz/app/wc", "store": { "ios": "https://apps.apple.com/us/app/argent-defi-in-a-tap/id1358741926", "android": "https://play.google.com/store/apps/details?id=im.argent.contractwalletclient&hl=en&gl=US&pli=1" } },
368
368
  safepal: { "native": "safepalwallet://", "scheme": "safepalwallet://wc", "universal": "https://link.safepal.io/wc", "store": { "ios": "https://apps.apple.com/app/safepal-wallet/id1548297139", "android": "https://play.google.com/store/apps/details?id=io.safepal.wallet" } },
369
369
  imtoken: { "native": "imtokenv2://", "scheme": "imtokenv2://wc", "store": { "ios": "https://apps.apple.com/us/app/imtoken2/id1384798940", "android": "https://play.google.com/store/apps/details?id=im.token.app" } },
@@ -379,7 +379,7 @@ var GENERATED_WALLET_LINKS = {
379
379
  };
380
380
 
381
381
  // src/connectors/walletconnect/registry.ts
382
- var DEFAULT_WALLET_LINKS = GENERATED_WALLET_LINKS;
382
+ var DEFAULT_WALLET_LINKS = WALLET_LINKS;
383
383
 
384
384
  // src/connectors/walletconnect/deeplink.ts
385
385
  function isMobile() {
@@ -394,24 +394,20 @@ function buildLink(base, uri) {
394
394
  }
395
395
  function openWallet(link, uri) {
396
396
  if (typeof document === "undefined") return;
397
- if (link.universal) {
398
- openHref(buildLink(link.universal, uri), true);
399
- } else if (link.scheme) {
400
- openHref(buildLink(link.scheme, uri), false);
397
+ if (link.scheme) {
398
+ openHref(buildLink(link.scheme, uri));
399
+ } else if (link.universal) {
400
+ openHref(buildLink(link.universal, uri));
401
401
  }
402
402
  }
403
403
  function openWalletApp(link) {
404
404
  if (typeof document === "undefined") return;
405
405
  if (!link.native) return;
406
- openHref(link.native, false);
406
+ openHref(link.native);
407
407
  }
408
408
  function openHref(href, newContext) {
409
409
  const a = document.createElement("a");
410
410
  a.href = href;
411
- if (newContext) {
412
- a.target = "_blank";
413
- a.rel = "noopener noreferrer";
414
- }
415
411
  a.style.display = "none";
416
412
  document.body.appendChild(a);
417
413
  a.click();
@@ -519,7 +515,13 @@ var WalletConnectConnector = class extends BaseConnector {
519
515
  if (link) {
520
516
  openWallet(link, warm.uri);
521
517
  void detectAppOpen(this.options.openTimeoutMs ?? 2e3).then((opened) => {
522
- if (!opened) this.emit({ type: "wallet_open_failed", walletId: req.walletId, uri: warm.uri });
518
+ if (!opened)
519
+ this.emit({
520
+ type: "wallet_open_failed",
521
+ walletId: req.walletId,
522
+ uri: warm.uri,
523
+ store: link.store
524
+ });
523
525
  });
524
526
  }
525
527
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/manager.ts","../src/core/namespace.ts","../src/core/connector.ts","../src/core/app.ts","../src/connectors/metamask/connector.ts","../src/connectors/coinbase/connector.ts","../src/connectors/walletconnect/wallet-links.generated.ts","../src/connectors/walletconnect/registry.ts","../src/connectors/walletconnect/deeplink.ts","../src/connectors/walletconnect/connector.ts","../src/core/lydian-connect.ts"],"names":["WALLET_ID","toCaip"],"mappings":"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","file":"index.js","sourcesContent":["import type { Connector, ConnectRequest } from './connector';\nimport type { Connection, LydianConnectEvent, LydianConnectEventHandler } 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 /** SDK connector if one claims this walletId, else the fallback. The host app is oblivious. */\n private resolve(walletId: string): Connector {\n return this.byWallet.get(walletId) ?? this.fallback;\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n if (!this.started) await this.init();\n const connection = await this.resolve(req.walletId).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 async disconnect(walletId?: string): Promise<void> {\n if (walletId) {\n await this.connections.get(walletId)?.disconnect().catch(() => {});\n this.connections.delete(walletId);\n return;\n }\n await Promise.allSettled([...this.connections.values()].map((c) => c.disconnect()));\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// Sensible defaults for an EVM payment flow. Internalized so the host app\n// never hand-builds a namespace — it only chooses a chain.\nconst DEFAULT_EVM_METHODS = [\n 'eth_sendTransaction',\n 'personal_sign',\n 'eth_signTypedData_v4',\n 'wallet_switchEthereumChain',\n];\nconst DEFAULT_EVM_EVENTS = ['chainChanged', 'accountsChanged'];\n\n/**\n * Build a CAIP namespace from a chain id.\n * EVM-only for now: a number maps to `eip155:<n>`, and a CAIP-2 string must be\n * `eip155:<reference>`. Non-EVM namespaces (e.g. `solana:…`) would branch here\n * with their own methods/events when that support is added; until then we throw\n * rather than silently apply EVM defaults to a chain that can't use them.\n */\nexport function buildNamespace(chainId: number | string): CaipNamespace {\n const caip = typeof chainId === 'number' ? `eip155:${chainId}` : chainId;\n const [name, reference] = caip.split(':');\n if (name !== 'eip155' || !reference || !/^\\d+$/.test(reference) || Number(reference) <= 0) {\n throw new Error(\n `Unsupported chain \"${caip}\". lydianconnect is EVM-only for now — pass a positive number or an \"eip155:<id>\" string.`,\n );\n }\n return {\n name,\n value: { chains: [caip], methods: DEFAULT_EVM_METHODS, events: DEFAULT_EVM_EVENTS },\n };\n}\n","import type {\n CaipNamespace,\n Connection,\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/**\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 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\nexport abstract class BaseConnector implements Connector {\n abstract readonly type: ConnectorType;\n readonly walletIds: readonly string[] = [];\n\n private handlers = new Set<LydianConnectEventHandler>();\n\n abstract isAvailable(walletId: string): boolean | Promise<boolean>;\n abstract connect(req: ConnectRequest): Promise<Connection>;\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 protected emit(event: LydianConnectEvent): void {\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","import type { MetaMaskSDK as MetaMaskSDKType, MetaMaskSDKOptions } from '@metamask/sdk';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { Connection } from '../../core/types';\nimport { type AppConfig, deriveUrl } from '../../core/app';\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 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({ type: 'chainChanged', walletId: WALLET_ID, chainId: toCaip(String(hex)) });\n });\n provider.on('accountsChanged', (accounts) => {\n const account = Array.isArray(accounts) ? (accounts[0] as string | undefined) : undefined;\n if (account) this.emit({ type: 'accountsChanged', walletId: WALLET_ID, account });\n else this.emit({ type: 'disconnect', walletId: WALLET_ID });\n });\n provider.on('disconnect', () => this.emit({ type: 'disconnect', walletId: WALLET_ID }));\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const provider = await this.getProvider();\n const accounts = await provider.request<string[]>({ method: 'eth_requestAccounts' });\n const account = accounts?.[0];\n if (!account) throw new Error('MetaMask returned no account');\n await this.ensureChain(provider, req);\n const chainId = toCaip(await provider.request<string>({ method: 'eth_chainId' }));\n return this.toConnection(provider, account, chainId);\n }\n\n async restore(): Promise<Connection[]> {\n const provider = await this.getProvider().catch(() => null);\n if (!provider) return [];\n const accounts = await provider.request<string[]>({ method: 'eth_accounts' }).catch(() => []);\n const account = accounts?.[0];\n if (!account) return [];\n const chainId = toCaip(\n await provider.request<string>({ method: 'eth_chainId' }).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 /** Best-effort switch to the requested chain; leaves the wallet as-is if it's unknown to it. */\n private async ensureChain(provider: MetaMaskProvider, req: ConnectRequest): Promise<void> {\n const wanted = req.namespace.value.chains?.[0]; // \"eip155:137\"\n const wantedNum = wanted ? Number(wanted.split(':')[1]) : NaN;\n if (!Number.isFinite(wantedNum) || wantedNum <= 0) return;\n const current = parseInt(\n (await provider.request<string>({ method: 'eth_chainId' }).catch(() => '0x0')) ?? '0x0',\n 16,\n );\n if (current === wantedNum) return;\n await provider\n .request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: `0x${wantedNum.toString(16)}` }],\n })\n .catch(() => {\n /* chain not added to the wallet — the caller's chainChanged will reflect reality */\n });\n }\n\n private toConnection(provider: MetaMaskProvider, account: string, chainId: string): 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>({ method: args.method, params: args.params as never })) 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\nfunction toCaip(hexChainId: string | null | undefined): string {\n if (!hexChainId) return 'eip155:1';\n const num = hexChainId.startsWith('0x') ? parseInt(hexChainId, 16) : Number(hexChainId);\n return `eip155:${Number.isFinite(num) ? num : 1}`;\n}\n","import type { CoinbaseWalletSDK as CoinbaseWalletSDKType } from '@coinbase/wallet-sdk';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { Connection } from '../../core/types';\nimport type { AppConfig } from '../../core/app';\n\ntype CoinbaseProvider = NonNullable<ReturnType<CoinbaseWalletSDKType['makeWeb3Provider']>>;\ntype RequestArgs = Parameters<CoinbaseProvider['request']>[0];\n\n/** Coinbase v4's provider.request is non-generic and returns unknown; wrap + cast. */\nfunction rpc<T>(provider: CoinbaseProvider, method: string, params?: unknown): Promise<T> {\n return provider.request({ method, params } as unknown as RequestArgs) as Promise<T>;\n}\n\nconst WALLET_ID = 'coinbase';\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 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({ type: 'chainChanged', walletId: WALLET_ID, chainId: toCaip(String(hex)) });\n });\n provider.on('accountsChanged', (accounts) => {\n const account = Array.isArray(accounts) ? (accounts[0] as string | undefined) : undefined;\n if (account) this.emit({ type: 'accountsChanged', walletId: WALLET_ID, account });\n else this.emit({ type: 'disconnect', walletId: WALLET_ID });\n });\n provider.on('disconnect', () => this.emit({ type: 'disconnect', walletId: WALLET_ID }));\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\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 this.ensureChain(provider, req);\n const chainId = toCaip(await rpc<string>(provider, 'eth_chainId'));\n return this.toConnection(provider, account, chainId);\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(() => [] as string[]);\n const account = accounts?.[0];\n if (!account) return [];\n const chainId = toCaip(await rpc<string>(provider, 'eth_chainId').catch(() => '0x1'));\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 async ensureChain(provider: CoinbaseProvider, req: ConnectRequest): Promise<void> {\n const wanted = req.namespace.value.chains?.[0];\n const wantedNum = wanted ? Number(wanted.split(':')[1]) : NaN;\n if (!Number.isFinite(wantedNum) || wantedNum <= 0) return;\n const current = parseInt(\n (await rpc<string>(provider, 'eth_chainId').catch(() => '0x0')) ?? '0x0',\n 16,\n );\n if (current === wantedNum) return;\n await rpc(provider, 'wallet_switchEthereumChain', [{ chainId: `0x${wantedNum.toString(16)}` }]).catch(\n () => {},\n );\n }\n\n private toConnection(provider: CoinbaseProvider, account: string, chainId: string): 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\nfunction toCaip(hexChainId: string | null | undefined): string {\n if (!hexChainId) return 'eip155:1';\n const num = hexChainId.startsWith('0x') ? parseInt(hexChainId, 16) : Number(hexChainId);\n return `eip155:${Number.isFinite(num) ? num : 1}`;\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","// AUTO-GENERATED by scripts/build-wallet-links.mjs — do not edit by hand.\n// Refresh: WC_PROJECT_ID=<projectId> node scripts/build-wallet-links.mjs\n// Source: WalletConnect explorer API (explorer-api.walletconnect.com/v3/wallets)\nimport type { WalletLink } from './registry';\n\nexport const GENERATED_WALLET_LINKS: Record<string, WalletLink> = {\n metamask: {\"native\":\"metamask://\",\"scheme\":\"metamask://wc\",\"universal\":\"https://metamask.app.link/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/metamask/id1438144202\",\"android\":\"https://play.google.com/store/apps/details?id=io.metamask\"}},\n trust: {\"native\":\"trust://\",\"scheme\":\"trust://wc\",\"universal\":\"https://link.trustwallet.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/apple-store/id1288339409\",\"android\":\"https://play.google.com/store/apps/details?id=com.wallet.crypto.trustapp\"}},\n rainbow: {\"native\":\"rainbow://\",\"scheme\":\"rainbow://wc\",\"universal\":\"https://rnbwapp.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/apple-store/id1457119021?pt=119997837&ct=wc&mt=8\",\"android\":\"https://play.google.com/store/apps/details?id=me.rainbow&referrer=utm_source%3Dwc%26utm_medium%3Dconnector%26utm_campaign%3Dwc\"}},\n coinbase: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/base-formerly-coinbase-wallet/id1278383455\"}},\n zerion: {\"native\":\"zerion://\",\"scheme\":\"zerion://wc\",\"universal\":\"https://wallet.zerion.io/wc/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/id1456732565\",\"android\":\"https://play.google.com/store/apps/details?id=io.zerion.android&hl=en&gl=US\"}},\n tokenpocket: {\"native\":\"tpoutside://\",\"scheme\":\"tpoutside://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/tp-wallet/id6444625622?l=en\",\"android\":\"https://play.google.com/store/apps/details?id=vip.mytokenpocket\"}},\n blockchaincom: {\"native\":\"blockchain-wallet://\",\"scheme\":\"blockchain-wallet://wc\",\"universal\":\"https://login.blockchain.com/app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/blockchain-bitcoin-wallet/id493253309\",\"android\":\"https://play.google.com/store/apps/details?id=piuk.blockchain.android\"}},\n exodus: {\"native\":\"exodus://\",\"scheme\":\"exodus://wc\",\"universal\":\"https://exodus.com/m/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/exodus-crypto-bitcoin-wallet/id1414384820\",\"android\":\"https://play.google.com/store/apps/details?id=exodusmovement.exodus&hl=en&gl=US\"}},\n phantom: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/phantom-crypto-wallet/id1598432977\",\"android\":\"https://play.google.com/store/apps/details?id=app.phantom&hl=en\"}},\n okx: {\"native\":\"okex://main\",\"scheme\":\"okex://main/wc\",\"universal\":\"https://www.okx.com/download?appendQuery=true&deeplink=okx://web3/wallet/walletConnect/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/okx-buy-bitcoin-eth-crypto/id1327268470\",\"android\":\"https://play.google.com/store/apps/details?id=com.okinc.okex.gp\"}},\n cryptocom: {\"native\":\"dfw://\",\"scheme\":\"dfw://wc\",\"universal\":\"https://wallet.crypto.com/deeplink/wc\",\"store\":{\"ios\":\"https://apps.apple.com/US/app/id1512048310?mt=8\",\"android\":\"https://play.google.com/store/apps/details?id=com.defi.wallet\"}},\n argent: {\"native\":\"argent://app/\",\"scheme\":\"argent://app/wc\",\"universal\":\"https://www.argent.xyz/app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/argent-defi-in-a-tap/id1358741926\",\"android\":\"https://play.google.com/store/apps/details?id=im.argent.contractwalletclient&hl=en&gl=US&pli=1\"}},\n safepal: {\"native\":\"safepalwallet://\",\"scheme\":\"safepalwallet://wc\",\"universal\":\"https://link.safepal.io/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/safepal-wallet/id1548297139\",\"android\":\"https://play.google.com/store/apps/details?id=io.safepal.wallet\"}},\n imtoken: {\"native\":\"imtokenv2://\",\"scheme\":\"imtokenv2://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/imtoken2/id1384798940\",\"android\":\"https://play.google.com/store/apps/details?id=im.token.app\"}},\n ronin: {\"native\":\"roninwallet://\",\"scheme\":\"roninwallet://wc\",\"universal\":\"https://wallet.roninchain.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/ronin-wallet/id1592675001\",\"android\":\"https://play.google.com/store/apps/details?id=com.skymavis.genesis\"}},\n coin98: {\"native\":\"coin98://\",\"scheme\":\"coin98://wc\",\"universal\":\"https://coin98.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/vn/app/coin98-wallet/id1561969966\",\"android\":\"https://play.google.com/store/apps/details?id=coin98.crypto.finance.media&hl=vi&gl=US\"}},\n bitkeep: {\"native\":\"bitkeep://\",\"scheme\":\"bitkeep://wc\",\"universal\":\"https://bkapp.vip/wc\",\"store\":{\"ios\":\"https://web3.bitget.com/en/wallet-download?type=0\",\"android\":\"https://web3.bitget.com/en/wallet-download?type=0\"}},\n \"1inch\": {\"native\":\"oneinch://open/nobodywilleveruseit\",\"scheme\":\"oneinch://open/nobodywilleveruseit/wc\",\"universal\":\"https://wallet.1inch.io/app/nobodywilleveruseit/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/1inch-defi-wallet/id1546049391\",\"android\":\"https://play.google.com/store/apps/details?id=io.oneinch.android\"}},\n ledgerlive: {\"native\":\"ledgerlive://\",\"scheme\":\"ledgerlive://wc\",\"store\":{\"ios\":\"https://itunes.apple.com/app/id1361671700\",\"android\":\"https://play.google.com/store/apps/details?id=com.ledger.live\"}},\n atomic: {\"native\":\"atomicwallet://\",\"scheme\":\"atomicwallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/atomic-wallet/id1478257827\",\"android\":\"https://play.google.com/store/apps/details?id=io.atomicwallet\"}},\n alpha: {\"native\":\"awallet://\",\"scheme\":\"awallet://wc\",\"universal\":\"https://aw.app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/alphawallet-eth-wallet/id1358230430\",\"android\":\"https://play.google.com/store/apps/details?id=io.stormbird.wallet\"}},\n math: {\"native\":\"mathwallet://\",\"scheme\":\"mathwallet://wc\",\"universal\":\"https://www.mathwallet.org/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/mathwallet5/id1582612388\",\"android\":\"https://play.google.com/store/apps/details?id=com.mathwallet.android\"}},\n bitpay: {\"native\":\"bitpay://\",\"scheme\":\"bitpay://wc\",\"universal\":\"https://link.bitpay.com/wc\",\"store\":{\"ios\":\"https://bitpay.onelink.me/Cenw/ejjaw7bs\",\"android\":\"https://bitpay.onelink.me/Cenw/ejjaw7bs\"}},\n};\n","import { GENERATED_WALLET_LINKS } from './wallet-links.generated';\n\nexport interface WalletLink {\n /** App scheme used to foreground the wallet — without the `wc` suffix; may include a path (e.g. \"okex://main\"). */\n native?: string;\n /** Custom scheme deep link incl. the `wc` path; we append `?uri=`. e.g. \"metamask://wc\". */\n scheme?: string;\n /** Universal/applink incl. the `wc` path, preferred on mobile (OS falls back to the store). */\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> = GENERATED_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?.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 * Fire from WITHIN a user gesture. Universal link first (OS shows the App Store\n * if the wallet isn't installed) opened in a throwaway context so the checkout\n * page is never replaced in history; custom scheme as the fallback.\n */\nexport function openWallet(link: WalletLink, uri: string): void {\n if (typeof document === 'undefined') return;\n if (link.universal) {\n openHref(buildLink(link.universal, uri), true);\n } else if (link.scheme) {\n openHref(buildLink(link.scheme, uri), false);\n }\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 } from '@walletconnect/utils';\nimport type { SessionTypes } from '@walletconnect/types';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { CaipNamespace, Connection } from '../../core/types';\nimport { type AppConfig, deriveUrl } from '../../core/app';\nimport { DEFAULT_WALLET_LINKS, type WalletLink } from './registry';\nimport { detectAppOpen, isMobile, openWallet, openWalletApp } from './deeplink';\n\nconst STORAGE_KEY = 'lydianconnect.wc.topics'; // walletId -> session topic\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 private warm: { topic: string; uri: string } | null = null;\n private warming: Promise<void> | null = null;\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 const chainId =\n typeof data === 'string' && data.includes(':') ? data : `eip155:${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 /** Pre-create a pairing so connect() can deep-link synchronously within the gesture. */\n private async warmup(): Promise<void> {\n if (this.warm) return;\n if (this.warming) return this.warming;\n this.warming = (async () => {\n const client = await this.getClient();\n const { topic, uri } = await client.core.pairing.create();\n this.warm = { topic, uri };\n this.warming = null;\n })();\n return this.warming;\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const client = await this.getClient();\n\n const reused = this.tryReuse(client, req);\n if (reused) return reused;\n\n if (!this.warm) await this.warmup(); // cold path loses the gesture, but the QR/URI is still emitted\n const warm = this.warm;\n this.warm = null;\n if (!warm) throw new Error('Failed to create WalletConnect pairing');\n\n this.emit({ type: 'display_uri', walletId: req.walletId, uri: warm.uri });\n\n if (isMobile()) {\n const link = this.links[req.walletId];\n if (link) {\n openWallet(link, warm.uri); // synchronous — preserves connect()'s click gesture\n void detectAppOpen(this.options.openTimeoutMs ?? 2000).then((opened) => {\n if (!opened) this.emit({ type: 'wallet_open_failed', walletId: req.walletId, uri: warm.uri });\n });\n }\n }\n\n const { approval } = await client.connect({\n pairingTopic: warm.topic,\n optionalNamespaces: { [req.namespace.name]: req.namespace.value },\n });\n\n const session = await withSignal(approval(), req.signal, () => {\n void client.core.pairing.disconnect({ topic: warm.topic }).catch(() => {});\n });\n\n void this.warmup(); // re-arm for the next connection\n\n const connection = this.toConnection(client, req.walletId, session, req.namespace);\n this.topics.set(req.walletId, session.topic);\n this.persist();\n return connection;\n }\n\n async restore(): Promise<Connection[]> {\n const client = await this.getClient();\n const out: Connection[] = [];\n for (const [walletId, topic] of [...this.topics]) {\n const session = this.liveSession(client, topic);\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\n .getAll()\n .map((s) => client.disconnect({ topic: s.topic, reason: getSdkError('USER_DISCONNECTED') })),\n );\n }\n this.topics.clear();\n this.persist();\n this.warm = null;\n }\n\n // --- helpers ---\n\n private tryReuse(client: SignClient, req: ConnectRequest): Connection | null {\n const topic = this.topics.get(req.walletId);\n if (!topic) return null;\n const session = this.liveSession(client, topic);\n if (!session) {\n this.topics.delete(req.walletId);\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 ?? []).map((a) => a.split(':')[2]).find((a): a is string => !!a) ?? '';\n const chainId =\n ns?.chains?.[0] ??\n (ns?.accounts?.[0] ? ns.accounts[0].split(':').slice(0, 2).join(':') : `${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.disconnect({ topic, reason: getSdkError('USER_DISCONNECTED') }).catch(() => {});\n this.topics.delete(walletId);\n this.persist();\n this.emit({ type: 'disconnect', walletId });\n },\n };\n }\n\n private liveSession(client: SignClient, topic: string): SessionTypes.Struct | undefined {\n try {\n return client.session.get(topic);\n } catch {\n return undefined;\n }\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) 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 { name, value: { chains: v.chains, methods: v.methods, events: v.events } };\n}\n\nfunction withSignal<T>(\n promise: Promise<T>,\n signal: AbortSignal | undefined,\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 (v) => {\n signal.removeEventListener('abort', abortHandler);\n resolve(v);\n },\n (e) => {\n signal.removeEventListener('abort', abortHandler);\n reject(e);\n },\n );\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} from './types';\nimport { MetaMaskConnector } from '../connectors/metamask/connector';\nimport { CoinbaseConnector } from '../connectors/coinbase/connector';\nimport { WalletConnectConnector } from '../connectors/walletconnect/connector';\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 return [\n new MetaMaskConnector(app),\n new CoinbaseConnector(app),\n new WalletConnectConnector(app, { projectId: config.walletConnectProjectId }),\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('connect() requires a chainId (a number like 137 or an \"eip155:<id>\" string)');\n }\n return this.manager.connect({\n walletId: input.walletId,\n namespace: buildNamespace(input.chainId),\n signal: input.signal,\n });\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","../src/core/connector.ts","../src/core/app.ts","../src/connectors/metamask/connector.ts","../src/connectors/coinbase/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":["WALLET_ID","toCaip"],"mappings":"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","file":"index.js","sourcesContent":["import type { Connector, ConnectRequest } from './connector';\nimport type { Connection, LydianConnectEvent, LydianConnectEventHandler } 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 /** SDK connector if one claims this walletId, else the fallback. The host app is oblivious. */\n private resolve(walletId: string): Connector {\n return this.byWallet.get(walletId) ?? this.fallback;\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n if (!this.started) await this.init();\n const connection = await this.resolve(req.walletId).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 async disconnect(walletId?: string): Promise<void> {\n if (walletId) {\n await this.connections.get(walletId)?.disconnect().catch(() => {});\n this.connections.delete(walletId);\n return;\n }\n await Promise.allSettled([...this.connections.values()].map((c) => c.disconnect()));\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// Sensible defaults for an EVM payment flow. Internalized so the host app\n// never hand-builds a namespace — it only chooses a chain.\nconst DEFAULT_EVM_METHODS = [\n 'eth_sendTransaction',\n 'personal_sign',\n 'eth_signTypedData_v4',\n 'wallet_switchEthereumChain',\n];\nconst DEFAULT_EVM_EVENTS = ['chainChanged', 'accountsChanged'];\n\n/**\n * Build a CAIP namespace from a chain id.\n * EVM-only for now: a number maps to `eip155:<n>`, and a CAIP-2 string must be\n * `eip155:<reference>`. Non-EVM namespaces (e.g. `solana:…`) would branch here\n * with their own methods/events when that support is added; until then we throw\n * rather than silently apply EVM defaults to a chain that can't use them.\n */\nexport function buildNamespace(chainId: number | string): CaipNamespace {\n const caip = typeof chainId === 'number' ? `eip155:${chainId}` : chainId;\n const [name, reference] = caip.split(':');\n if (name !== 'eip155' || !reference || !/^\\d+$/.test(reference) || Number(reference) <= 0) {\n throw new Error(\n `Unsupported chain \"${caip}\". lydianconnect is EVM-only for now — pass a positive number or an \"eip155:<id>\" string.`,\n );\n }\n return {\n name,\n value: { chains: [caip], methods: DEFAULT_EVM_METHODS, events: DEFAULT_EVM_EVENTS },\n };\n}\n","import type {\n CaipNamespace,\n Connection,\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/**\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 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\nexport abstract class BaseConnector implements Connector {\n abstract readonly type: ConnectorType;\n readonly walletIds: readonly string[] = [];\n\n private handlers = new Set<LydianConnectEventHandler>();\n\n abstract isAvailable(walletId: string): boolean | Promise<boolean>;\n abstract connect(req: ConnectRequest): Promise<Connection>;\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 protected emit(event: LydianConnectEvent): void {\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","import type { MetaMaskSDK as MetaMaskSDKType, MetaMaskSDKOptions } from '@metamask/sdk';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { Connection } from '../../core/types';\nimport { type AppConfig, deriveUrl } from '../../core/app';\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 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({ type: 'chainChanged', walletId: WALLET_ID, chainId: toCaip(String(hex)) });\n });\n provider.on('accountsChanged', (accounts) => {\n const account = Array.isArray(accounts) ? (accounts[0] as string | undefined) : undefined;\n if (account) this.emit({ type: 'accountsChanged', walletId: WALLET_ID, account });\n else this.emit({ type: 'disconnect', walletId: WALLET_ID });\n });\n provider.on('disconnect', () => this.emit({ type: 'disconnect', walletId: WALLET_ID }));\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const provider = await this.getProvider();\n const accounts = await provider.request<string[]>({ method: 'eth_requestAccounts' });\n const account = accounts?.[0];\n if (!account) throw new Error('MetaMask returned no account');\n await this.ensureChain(provider, req);\n const chainId = toCaip(await provider.request<string>({ method: 'eth_chainId' }));\n return this.toConnection(provider, account, chainId);\n }\n\n async restore(): Promise<Connection[]> {\n const provider = await this.getProvider().catch(() => null);\n if (!provider) return [];\n const accounts = await provider.request<string[]>({ method: 'eth_accounts' }).catch(() => []);\n const account = accounts?.[0];\n if (!account) return [];\n const chainId = toCaip(\n await provider.request<string>({ method: 'eth_chainId' }).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 /** Best-effort switch to the requested chain; leaves the wallet as-is if it's unknown to it. */\n private async ensureChain(provider: MetaMaskProvider, req: ConnectRequest): Promise<void> {\n const wanted = req.namespace.value.chains?.[0]; // \"eip155:137\"\n const wantedNum = wanted ? Number(wanted.split(':')[1]) : NaN;\n if (!Number.isFinite(wantedNum) || wantedNum <= 0) return;\n const current = parseInt(\n (await provider.request<string>({ method: 'eth_chainId' }).catch(() => '0x0')) ?? '0x0',\n 16,\n );\n if (current === wantedNum) return;\n await provider\n .request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: `0x${wantedNum.toString(16)}` }],\n })\n .catch(() => {\n /* chain not added to the wallet — the caller's chainChanged will reflect reality */\n });\n }\n\n private toConnection(provider: MetaMaskProvider, account: string, chainId: string): 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>({ method: args.method, params: args.params as never })) 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\nfunction toCaip(hexChainId: string | null | undefined): string {\n if (!hexChainId) return 'eip155:1';\n const num = hexChainId.startsWith('0x') ? parseInt(hexChainId, 16) : Number(hexChainId);\n return `eip155:${Number.isFinite(num) ? num : 1}`;\n}\n","import type { CoinbaseWalletSDK as CoinbaseWalletSDKType } from '@coinbase/wallet-sdk';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { Connection } from '../../core/types';\nimport type { AppConfig } from '../../core/app';\n\ntype CoinbaseProvider = NonNullable<ReturnType<CoinbaseWalletSDKType['makeWeb3Provider']>>;\ntype RequestArgs = Parameters<CoinbaseProvider['request']>[0];\n\n/** Coinbase v4's provider.request is non-generic and returns unknown; wrap + cast. */\nfunction rpc<T>(provider: CoinbaseProvider, method: string, params?: unknown): Promise<T> {\n return provider.request({ method, params } as unknown as RequestArgs) as Promise<T>;\n}\n\nconst WALLET_ID = 'coinbase';\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 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({ type: 'chainChanged', walletId: WALLET_ID, chainId: toCaip(String(hex)) });\n });\n provider.on('accountsChanged', (accounts) => {\n const account = Array.isArray(accounts) ? (accounts[0] as string | undefined) : undefined;\n if (account) this.emit({ type: 'accountsChanged', walletId: WALLET_ID, account });\n else this.emit({ type: 'disconnect', walletId: WALLET_ID });\n });\n provider.on('disconnect', () => this.emit({ type: 'disconnect', walletId: WALLET_ID }));\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\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 this.ensureChain(provider, req);\n const chainId = toCaip(await rpc<string>(provider, 'eth_chainId'));\n return this.toConnection(provider, account, chainId);\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(() => [] as string[]);\n const account = accounts?.[0];\n if (!account) return [];\n const chainId = toCaip(await rpc<string>(provider, 'eth_chainId').catch(() => '0x1'));\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 async ensureChain(provider: CoinbaseProvider, req: ConnectRequest): Promise<void> {\n const wanted = req.namespace.value.chains?.[0];\n const wantedNum = wanted ? Number(wanted.split(':')[1]) : NaN;\n if (!Number.isFinite(wantedNum) || wantedNum <= 0) return;\n const current = parseInt(\n (await rpc<string>(provider, 'eth_chainId').catch(() => '0x0')) ?? '0x0',\n 16,\n );\n if (current === wantedNum) return;\n await rpc(provider, 'wallet_switchEthereumChain', [{ chainId: `0x${wantedNum.toString(16)}` }]).catch(\n () => {},\n );\n }\n\n private toConnection(provider: CoinbaseProvider, account: string, chainId: string): 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\nfunction toCaip(hexChainId: string | null | undefined): string {\n if (!hexChainId) return 'eip155:1';\n const num = hexChainId.startsWith('0x') ? parseInt(hexChainId, 16) : Number(hexChainId);\n return `eip155:${Number.isFinite(num) ? num : 1}`;\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","// 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: {\"native\":\"metamask://\",\"scheme\":\"metamask://wc\",\"universal\":\"https://metamask.app.link/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/metamask/id1438144202\",\"android\":\"https://play.google.com/store/apps/details?id=io.metamask\"}},\n trust: {\"native\":\"trust://\",\"scheme\":\"trust://wc\",\"universal\":\"https://link.trustwallet.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/apple-store/id1288339409\",\"android\":\"https://play.google.com/store/apps/details?id=com.wallet.crypto.trustapp\"}},\n rainbow: {\"native\":\"rainbow://\",\"scheme\":\"rainbow://wc\",\"universal\":\"https://rnbwapp.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/apple-store/id1457119021?pt=119997837&ct=wc&mt=8\",\"android\":\"https://play.google.com/store/apps/details?id=me.rainbow&referrer=utm_source%3Dwc%26utm_medium%3Dconnector%26utm_campaign%3Dwc\"}},\n coinbase: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/base-formerly-coinbase-wallet/id1278383455\"}},\n zerion: {\"native\":\"zerion://\",\"scheme\":\"zerion://wc\",\"universal\":\"https://wallet.zerion.io/wc/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/id1456732565\",\"android\":\"https://play.google.com/store/apps/details?id=io.zerion.android&hl=en&gl=US\"}},\n tokenpocket: {\"native\":\"tpoutside://\",\"scheme\":\"tpoutside://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/tp-wallet/id6444625622?l=en\",\"android\":\"https://play.google.com/store/apps/details?id=vip.mytokenpocket\"}},\n blockchaincom: {\"native\":\"blockchain-wallet://\",\"scheme\":\"blockchain-wallet://wc\",\"universal\":\"https://login.blockchain.com/app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/blockchain-bitcoin-wallet/id493253309\",\"android\":\"https://play.google.com/store/apps/details?id=piuk.blockchain.android\"}},\n exodus: {\"native\":\"exodus://\",\"scheme\":\"exodus://wc\",\"universal\":\"https://exodus.com/m/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/exodus-crypto-bitcoin-wallet/id1414384820\",\"android\":\"https://play.google.com/store/apps/details?id=exodusmovement.exodus&hl=en&gl=US\"}},\n phantom: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/phantom-crypto-wallet/id1598432977\",\"android\":\"https://play.google.com/store/apps/details?id=app.phantom&hl=en\"}},\n okx: {\"native\":\"okxwallet://main\",\"scheme\":\"okxwallet://main/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/okx-buy-bitcoin-eth-crypto/id1327268470\",\"android\":\"https://play.google.com/store/apps/details?id=com.okinc.okex.gp\"}},\n cryptocom: {\"native\":\"cryptowallet://\",\"scheme\":\"cryptowallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/US/app/id1512048310?mt=8\",\"android\":\"https://play.google.com/store/apps/details?id=com.defi.wallet\"}},\n argent: {\"native\":\"argent://app/\",\"scheme\":\"argent://app/wc\",\"universal\":\"https://www.argent.xyz/app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/argent-defi-in-a-tap/id1358741926\",\"android\":\"https://play.google.com/store/apps/details?id=im.argent.contractwalletclient&hl=en&gl=US&pli=1\"}},\n safepal: {\"native\":\"safepalwallet://\",\"scheme\":\"safepalwallet://wc\",\"universal\":\"https://link.safepal.io/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/safepal-wallet/id1548297139\",\"android\":\"https://play.google.com/store/apps/details?id=io.safepal.wallet\"}},\n imtoken: {\"native\":\"imtokenv2://\",\"scheme\":\"imtokenv2://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/imtoken2/id1384798940\",\"android\":\"https://play.google.com/store/apps/details?id=im.token.app\"}},\n ronin: {\"native\":\"roninwallet://\",\"scheme\":\"roninwallet://wc\",\"universal\":\"https://wallet.roninchain.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/ronin-wallet/id1592675001\",\"android\":\"https://play.google.com/store/apps/details?id=com.skymavis.genesis\"}},\n coin98: {\"native\":\"coin98://\",\"scheme\":\"coin98://wc\",\"universal\":\"https://coin98.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/vn/app/coin98-wallet/id1561969966\",\"android\":\"https://play.google.com/store/apps/details?id=coin98.crypto.finance.media&hl=vi&gl=US\"}},\n bitkeep: {\"native\":\"bitkeep://\",\"scheme\":\"bitkeep://wc\",\"universal\":\"https://bkapp.vip/wc\",\"store\":{\"ios\":\"https://web3.bitget.com/en/wallet-download?type=0\",\"android\":\"https://web3.bitget.com/en/wallet-download?type=0\"}},\n \"1inch\": {\"native\":\"oneinch://open/nobodywilleveruseit\",\"scheme\":\"oneinch://open/nobodywilleveruseit/wc\",\"universal\":\"https://wallet.1inch.io/app/nobodywilleveruseit/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/1inch-defi-wallet/id1546049391\",\"android\":\"https://play.google.com/store/apps/details?id=io.oneinch.android\"}},\n ledgerlive: {\"native\":\"ledgerlive://\",\"scheme\":\"ledgerlive://wc\",\"store\":{\"ios\":\"https://itunes.apple.com/app/id1361671700\",\"android\":\"https://play.google.com/store/apps/details?id=com.ledger.live\"}},\n atomic: {\"native\":\"atomicwallet://\",\"scheme\":\"atomicwallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/atomic-wallet/id1478257827\",\"android\":\"https://play.google.com/store/apps/details?id=io.atomicwallet\"}},\n alpha: {\"native\":\"awallet://\",\"scheme\":\"awallet://wc\",\"universal\":\"https://aw.app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/alphawallet-eth-wallet/id1358230430\",\"android\":\"https://play.google.com/store/apps/details?id=io.stormbird.wallet\"}},\n math: {\"native\":\"mathwallet://\",\"scheme\":\"mathwallet://wc\",\"universal\":\"https://www.mathwallet.org/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/mathwallet5/id1582612388\",\"android\":\"https://play.google.com/store/apps/details?id=com.mathwallet.android\"}},\n bitpay: {\"native\":\"bitpay://\",\"scheme\":\"bitpay://wc\",\"universal\":\"https://link.bitpay.com/wc\",\"store\":{\"ios\":\"https://bitpay.onelink.me/Cenw/ejjaw7bs\",\"android\":\"https://bitpay.onelink.me/Cenw/ejjaw7bs\"}},\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?.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 * Open the wallet for a WalletConnect pairing on mobile. Custom scheme first, in\n * the SAME TAB — that reliably foregrounds an installed app and, unlike a\n * _blank/popup navigation, is NOT suppressed once the click gesture has been lost\n * (which it has by the time connect() reaches here, after the async pairing setup).\n * Universal link is only a fallback for the rare wallet with no custom scheme.\n * The not-installed case is handled by the connector via detectAppOpen().\n */\nexport function openWallet(link: WalletLink, uri: string): void {\n if (typeof document === 'undefined') return;\n if (link.scheme) {\n openHref(buildLink(link.scheme, uri), false);\n } else if (link.universal) {\n openHref(buildLink(link.universal, uri), false);\n }\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 } from '@walletconnect/utils';\nimport type { SessionTypes } from '@walletconnect/types';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { CaipNamespace, Connection } from '../../core/types';\nimport { type AppConfig, deriveUrl } from '../../core/app';\nimport { DEFAULT_WALLET_LINKS, type WalletLink } from './registry';\nimport { detectAppOpen, isMobile, openWallet, openWalletApp } from './deeplink';\n\nconst STORAGE_KEY = 'lydianconnect.wc.topics'; // walletId -> session topic\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 private warm: { topic: string; uri: string } | null = null;\n private warming: Promise<void> | null = null;\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 const chainId =\n typeof data === 'string' && data.includes(':') ? data : `eip155:${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 /** Pre-create a pairing so connect() can deep-link synchronously within the gesture. */\n private async warmup(): Promise<void> {\n if (this.warm) return;\n if (this.warming) return this.warming;\n this.warming = (async () => {\n const client = await this.getClient();\n const { topic, uri } = await client.core.pairing.create();\n this.warm = { topic, uri };\n this.warming = null;\n })();\n return this.warming;\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const client = await this.getClient();\n\n const reused = this.tryReuse(client, req);\n if (reused) return reused;\n\n if (!this.warm) await this.warmup(); // cold path loses the gesture, but the QR/URI is still emitted\n const warm = this.warm;\n this.warm = null;\n if (!warm) throw new Error('Failed to create WalletConnect pairing');\n\n this.emit({ type: 'display_uri', walletId: req.walletId, uri: warm.uri });\n\n if (isMobile()) {\n const link = this.links[req.walletId];\n if (link) {\n openWallet(link, warm.uri); // synchronous — preserves connect()'s click gesture\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: warm.uri,\n store: link.store,\n });\n });\n }\n }\n\n const { approval } = await client.connect({\n pairingTopic: warm.topic,\n optionalNamespaces: { [req.namespace.name]: req.namespace.value },\n });\n\n const session = await withSignal(approval(), req.signal, () => {\n void client.core.pairing.disconnect({ topic: warm.topic }).catch(() => {});\n });\n\n void this.warmup(); // re-arm for the next connection\n\n const connection = this.toConnection(client, req.walletId, session, req.namespace);\n this.topics.set(req.walletId, session.topic);\n this.persist();\n return connection;\n }\n\n async restore(): Promise<Connection[]> {\n const client = await this.getClient();\n const out: Connection[] = [];\n for (const [walletId, topic] of [...this.topics]) {\n const session = this.liveSession(client, topic);\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\n .getAll()\n .map((s) => client.disconnect({ topic: s.topic, reason: getSdkError('USER_DISCONNECTED') })),\n );\n }\n this.topics.clear();\n this.persist();\n this.warm = null;\n }\n\n // --- helpers ---\n\n private tryReuse(client: SignClient, req: ConnectRequest): Connection | null {\n const topic = this.topics.get(req.walletId);\n if (!topic) return null;\n const session = this.liveSession(client, topic);\n if (!session) {\n this.topics.delete(req.walletId);\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 ?? []).map((a) => a.split(':')[2]).find((a): a is string => !!a) ?? '';\n const chainId =\n ns?.chains?.[0] ??\n (ns?.accounts?.[0] ? ns.accounts[0].split(':').slice(0, 2).join(':') : `${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.disconnect({ topic, reason: getSdkError('USER_DISCONNECTED') }).catch(() => {});\n this.topics.delete(walletId);\n this.persist();\n this.emit({ type: 'disconnect', walletId });\n },\n };\n }\n\n private liveSession(client: SignClient, topic: string): SessionTypes.Struct | undefined {\n try {\n return client.session.get(topic);\n } catch {\n return undefined;\n }\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) 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 { name, value: { chains: v.chains, methods: v.methods, events: v.events } };\n}\n\nfunction withSignal<T>(\n promise: Promise<T>,\n signal: AbortSignal | undefined,\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 (v) => {\n signal.removeEventListener('abort', abortHandler);\n resolve(v);\n },\n (e) => {\n signal.removeEventListener('abort', abortHandler);\n reject(e);\n },\n );\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} from './types';\nimport { MetaMaskConnector } from '../connectors/metamask/connector';\nimport { CoinbaseConnector } from '../connectors/coinbase/connector';\nimport { WalletConnectConnector } from '../connectors/walletconnect/connector';\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 return [\n new MetaMaskConnector(app),\n new CoinbaseConnector(app),\n new WalletConnectConnector(app, { projectId: config.walletConnectProjectId }),\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('connect() requires a chainId (a number like 137 or an \"eip155:<id>\" string)');\n }\n return this.manager.connect({\n walletId: input.walletId,\n namespace: buildNamespace(input.chainId),\n signal: input.signal,\n });\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lydianpay/lydianconnect",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "Wallet connection library for Lydian — native wallet SDKs with WalletConnect fallback, behind one uniform API.",
5
5
  "type": "module",
6
6
  "license": "MIT",