@lydianpay/lydianconnect 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -227,6 +227,9 @@ var MetaMaskConnector = class extends BaseConnector {
227
227
  account,
228
228
  chainId,
229
229
  request: async (args) => await provider.request({ method: args.method, params: args.params }),
230
+ openWallet: () => {
231
+ },
232
+ // MetaMask SDK foregrounds the wallet on request
230
233
  disconnect: async () => {
231
234
  await this.sdk?.terminate();
232
235
  this.provider = null;
@@ -330,6 +333,9 @@ var CoinbaseConnector = class extends BaseConnector {
330
333
  account,
331
334
  chainId,
332
335
  request: (args) => rpc(provider, args.method, args.params),
336
+ openWallet: () => {
337
+ },
338
+ // Coinbase SDK foregrounds the wallet on request
333
339
  disconnect: async () => {
334
340
  await provider.disconnect().catch(() => {
335
341
  });
@@ -353,39 +359,33 @@ function evmChainIds(req) {
353
359
 
354
360
  // src/connectors/walletconnect/wallet-links.generated.ts
355
361
  var GENERATED_WALLET_LINKS = {
356
- 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
- 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
- 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
+ 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
+ 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
+ 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" } },
359
365
  coinbase: { "store": { "ios": "https://apps.apple.com/us/app/base-formerly-coinbase-wallet/id1278383455" } },
360
- 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" } },
361
- tokenpocket: { "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" } },
362
- blockchaincom: { "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
- 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" } },
366
+ 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" } },
367
+ 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" } },
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
+ 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
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" } },
365
- okx: { "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: { "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" } },
367
- argent: { "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
- safepal: { "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
- imtoken: { "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" } },
370
- ronin: { "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" } },
371
- 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" } },
372
- 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" } },
373
- "1inch": { "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" } },
374
- ledgerlive: { "scheme": "ledgerlive://wc", "store": { "ios": "https://itunes.apple.com/app/id1361671700", "android": "https://play.google.com/store/apps/details?id=com.ledger.live" } },
375
- atomic: { "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" } },
376
- alpha: { "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" } },
377
- math: { "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" } },
378
- 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" } }
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" } },
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
+ 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
+ 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" } },
376
+ 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" } },
377
+ 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" } },
378
+ 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" } },
379
+ "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" } },
380
+ 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" } },
381
+ 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" } },
382
+ 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" } },
383
+ 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" } },
384
+ 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" } }
379
385
  };
380
386
 
381
387
  // src/connectors/walletconnect/registry.ts
382
- var MANUAL_WALLET_LINKS = {
383
- infinity: { scheme: "infinity://wc" }
384
- };
385
- var DEFAULT_WALLET_LINKS = {
386
- ...MANUAL_WALLET_LINKS,
387
- ...GENERATED_WALLET_LINKS
388
- };
388
+ var DEFAULT_WALLET_LINKS = GENERATED_WALLET_LINKS;
389
389
 
390
390
  // src/connectors/walletconnect/deeplink.ts
391
391
  function isMobile() {
@@ -406,6 +406,11 @@ function openWallet(link, uri) {
406
406
  openHref(buildLink(link.scheme, uri), false);
407
407
  }
408
408
  }
409
+ function openWalletApp(link) {
410
+ if (typeof document === "undefined") return;
411
+ if (!link.native) return;
412
+ openHref(link.native, false);
413
+ }
409
414
  function openHref(href, newContext) {
410
415
  const a = document.createElement("a");
411
416
  a.href = href;
@@ -592,6 +597,11 @@ var WalletConnectConnector = class extends BaseConnector {
592
597
  chainId,
593
598
  request: { method: args.method, params: args.params }
594
599
  }),
600
+ openWallet: () => {
601
+ if (!isMobile()) return;
602
+ const link = this.links[walletId];
603
+ if (link) openWalletApp(link);
604
+ },
595
605
  disconnect: async () => {
596
606
  await client.disconnect({ topic, reason: utils.getSdkError("USER_DISCONNECTED") }).catch(() => {
597
607
  });
@@ -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 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 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: {\"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: {\"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: {\"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: {\"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: {\"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: {\"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: {\"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: {\"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: {\"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: {\"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: {\"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: {\"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: {\"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: {\"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: {\"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\": {\"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: {\"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: {\"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: {\"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: {\"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: {\"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 /** 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\n/**\n * Wallets absent from the WalletConnect explorer registry, maintained by hand.\n * Generated entries (below) take precedence if a wallet later appears upstream.\n */\nconst MANUAL_WALLET_LINKS: Record<string, WalletLink> = {\n infinity: { scheme: 'infinity://wc' },\n};\n\nexport const DEFAULT_WALLET_LINKS: Record<string, WalletLink> = {\n ...MANUAL_WALLET_LINKS,\n ...GENERATED_WALLET_LINKS,\n};\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\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 } 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 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.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"]}
package/dist/index.d.cts CHANGED
@@ -34,6 +34,12 @@ interface Connection {
34
34
  method: string;
35
35
  params?: unknown;
36
36
  }): Promise<T>;
37
+ /**
38
+ * Bring the wallet app to the foreground (mobile) — call right before a request
39
+ * the user must approve. No-op for native-SDK wallets (their SDK foregrounds the
40
+ * wallet itself) and on desktop.
41
+ */
42
+ openWallet(): void;
37
43
  disconnect(): Promise<void>;
38
44
  }
39
45
  /**
package/dist/index.d.ts CHANGED
@@ -34,6 +34,12 @@ interface Connection {
34
34
  method: string;
35
35
  params?: unknown;
36
36
  }): Promise<T>;
37
+ /**
38
+ * Bring the wallet app to the foreground (mobile) — call right before a request
39
+ * the user must approve. No-op for native-SDK wallets (their SDK foregrounds the
40
+ * wallet itself) and on desktop.
41
+ */
42
+ openWallet(): void;
37
43
  disconnect(): Promise<void>;
38
44
  }
39
45
  /**
package/dist/index.js CHANGED
@@ -221,6 +221,9 @@ var MetaMaskConnector = class extends BaseConnector {
221
221
  account,
222
222
  chainId,
223
223
  request: async (args) => await provider.request({ method: args.method, params: args.params }),
224
+ openWallet: () => {
225
+ },
226
+ // MetaMask SDK foregrounds the wallet on request
224
227
  disconnect: async () => {
225
228
  await this.sdk?.terminate();
226
229
  this.provider = null;
@@ -324,6 +327,9 @@ var CoinbaseConnector = class extends BaseConnector {
324
327
  account,
325
328
  chainId,
326
329
  request: (args) => rpc(provider, args.method, args.params),
330
+ openWallet: () => {
331
+ },
332
+ // Coinbase SDK foregrounds the wallet on request
327
333
  disconnect: async () => {
328
334
  await provider.disconnect().catch(() => {
329
335
  });
@@ -347,39 +353,33 @@ function evmChainIds(req) {
347
353
 
348
354
  // src/connectors/walletconnect/wallet-links.generated.ts
349
355
  var GENERATED_WALLET_LINKS = {
350
- 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" } },
351
- 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" } },
352
- 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" } },
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
+ 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
+ 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" } },
353
359
  coinbase: { "store": { "ios": "https://apps.apple.com/us/app/base-formerly-coinbase-wallet/id1278383455" } },
354
- 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" } },
355
- tokenpocket: { "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" } },
356
- blockchaincom: { "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" } },
357
- 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" } },
360
+ 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" } },
361
+ 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" } },
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
+ 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" } },
358
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" } },
359
- okx: { "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" } },
360
- cryptocom: { "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" } },
361
- argent: { "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" } },
362
- safepal: { "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" } },
363
- imtoken: { "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" } },
364
- ronin: { "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" } },
365
- 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" } },
366
- 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" } },
367
- "1inch": { "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" } },
368
- ledgerlive: { "scheme": "ledgerlive://wc", "store": { "ios": "https://itunes.apple.com/app/id1361671700", "android": "https://play.google.com/store/apps/details?id=com.ledger.live" } },
369
- atomic: { "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" } },
370
- alpha: { "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" } },
371
- math: { "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" } },
372
- 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" } }
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" } },
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
+ 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
+ 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" } },
370
+ 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" } },
371
+ 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" } },
372
+ 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" } },
373
+ "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" } },
374
+ 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" } },
375
+ 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" } },
376
+ 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" } },
377
+ 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" } },
378
+ 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" } }
373
379
  };
374
380
 
375
381
  // src/connectors/walletconnect/registry.ts
376
- var MANUAL_WALLET_LINKS = {
377
- infinity: { scheme: "infinity://wc" }
378
- };
379
- var DEFAULT_WALLET_LINKS = {
380
- ...MANUAL_WALLET_LINKS,
381
- ...GENERATED_WALLET_LINKS
382
- };
382
+ var DEFAULT_WALLET_LINKS = GENERATED_WALLET_LINKS;
383
383
 
384
384
  // src/connectors/walletconnect/deeplink.ts
385
385
  function isMobile() {
@@ -400,6 +400,11 @@ function openWallet(link, uri) {
400
400
  openHref(buildLink(link.scheme, uri), false);
401
401
  }
402
402
  }
403
+ function openWalletApp(link) {
404
+ if (typeof document === "undefined") return;
405
+ if (!link.native) return;
406
+ openHref(link.native, false);
407
+ }
403
408
  function openHref(href, newContext) {
404
409
  const a = document.createElement("a");
405
410
  a.href = href;
@@ -586,6 +591,11 @@ var WalletConnectConnector = class extends BaseConnector {
586
591
  chainId,
587
592
  request: { method: args.method, params: args.params }
588
593
  }),
594
+ openWallet: () => {
595
+ if (!isMobile()) return;
596
+ const link = this.links[walletId];
597
+ if (link) openWalletApp(link);
598
+ },
589
599
  disconnect: async () => {
590
600
  await client.disconnect({ topic, reason: getSdkError("USER_DISCONNECTED") }).catch(() => {
591
601
  });
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 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 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: {\"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: {\"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: {\"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: {\"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: {\"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: {\"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: {\"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: {\"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: {\"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: {\"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: {\"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: {\"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: {\"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: {\"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: {\"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\": {\"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: {\"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: {\"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: {\"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: {\"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: {\"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 /** 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\n/**\n * Wallets absent from the WalletConnect explorer registry, maintained by hand.\n * Generated entries (below) take precedence if a wallet later appears upstream.\n */\nconst MANUAL_WALLET_LINKS: Record<string, WalletLink> = {\n infinity: { scheme: 'infinity://wc' },\n};\n\nexport const DEFAULT_WALLET_LINKS: Record<string, WalletLink> = {\n ...MANUAL_WALLET_LINKS,\n ...GENERATED_WALLET_LINKS,\n};\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\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 } 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 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.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":";;;;AAQO,IAAM,iBAAN,MAAqB;AAAA,EAS1B,YAAY,UAAA,EAAyB;AARrC,IAAA,IAAA,CAAQ,QAAA,uBAAe,GAAA,EAAuB;AAG9C,IAAA,IAAA,CAAQ,WAAA,uBAAkB,GAAA,EAAwB;AAClD,IAAA,IAAA,CAAQ,QAAA,uBAAe,GAAA,EAA+B;AACtD,IAAA,IAAA,CAAQ,SAA4B,EAAC;AACrC,IAAA,IAAA,CAAQ,OAAA,GAAU,KAAA;AAGhB,IAAA,MAAM,SAAA,GAAY,WAAW,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,SAAA,CAAU,WAAW,CAAC,CAAA;AACnE,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,+EAAA,EAAkF,UAAU,MAAM,CAAA;AAAA,OACpG;AAAA,IACF;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,UAAU,CAAC,CAAA;AAC3B,IAAA,IAAA,CAAK,GAAA,GAAM,UAAA;AACX,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,MAAA,KAAA,MAAW,MAAM,SAAA,CAAU,SAAA,OAAgB,QAAA,CAAS,GAAA,CAAI,IAAI,SAAS,CAAA;AAAA,IACvE;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAI,KAAK,OAAA,EAAS;AAClB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,KAAA,MAAW,SAAA,IAAa,KAAK,GAAA,EAAK;AAChC,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,EAAA,CAAG,CAAC,UAAU,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA,EAGQ,QAAQ,QAAA,EAA6B;AAC3C,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,QAAQ,KAAK,IAAA,CAAK,QAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,QAAQ,GAAA,EAA0C;AACtD,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,MAAM,KAAK,IAAA,EAAK;AACnC,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAI,QAAQ,CAAA,CAAE,QAAQ,GAAG,CAAA;AAC/D,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,QAAA,EAAU,UAAU,CAAA;AAC7C,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,SAAA,EAAW,UAAU,GAAA,CAAI,QAAA,EAAU,YAAY,CAAA;AACjE,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAA,GAAiC;AACrC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,MAAM,KAAK,IAAA,EAAK;AACnC,IAAA,MAAM,WAAyB,EAAC;AAChC,IAAA,KAAA,MAAW,SAAA,IAAa,KAAK,GAAA,EAAK;AAChC,MAAA,MAAM,KAAA,GAAQ,MAAM,SAAA,CAAU,OAAA,GAAU,KAAA,CAAM,MAAM,EAAkB,CAAA;AACtE,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,QAAA,EAAU,IAAI,CAAA;AACxC,QAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,MACpB;AAAA,IACF;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,IAAI,QAAA,EAA0C;AAC5C,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAAA,EACtC;AAAA,EAEA,MAAM,WAAW,QAAA,EAAkC;AACjD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,IAAA,CAAK,YAAY,GAAA,CAAI,QAAQ,GAAG,UAAA,EAAW,CAAE,MAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AACjE,MAAA,IAAA,CAAK,WAAA,CAAY,OAAO,QAAQ,CAAA;AAChC,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAA,CAAQ,UAAA,CAAW,CAAC,GAAG,KAAK,WAAA,CAAY,MAAA,EAAQ,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,EAAY,CAAC,CAAA;AAClF,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,EACzB;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,KAAK,UAAA,EAAW;AACtB,IAAA,MAAM,OAAA,CAAQ,UAAA,CAAW,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA;AAAA,EACzD;AAAA,EAEA,GAAG,OAAA,EAAgD;AACjD,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,OAAO,CAAA;AACzB,IAAA,OAAO,MAAM,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,OAAO,CAAA;AAAA,EAC3C;AAAA,EAEQ,OAAO,KAAA,EAAiC;AAC9C,IAAA,IAAI,MAAM,IAAA,KAAS,YAAA,OAAmB,WAAA,CAAY,MAAA,CAAO,MAAM,QAAQ,CAAA;AACvE,IAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,EACjB;AAAA,EAEQ,KAAK,KAAA,EAAiC;AAC5C,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,QAAA,EAAU,OAAA,CAAQ,KAAK,CAAA;AAAA,EACpD;AACF,CAAA;;;AC9FA,IAAM,mBAAA,GAAsB;AAAA,EAC1B,qBAAA;AAAA,EACA,eAAA;AAAA,EACA,sBAAA;AAAA,EACA;AACF,CAAA;AACA,IAAM,kBAAA,GAAqB,CAAC,cAAA,EAAgB,iBAAiB,CAAA;AAStD,SAAS,eAAe,OAAA,EAAyC;AACtE,EAAA,MAAM,OAAO,OAAO,OAAA,KAAY,QAAA,GAAW,CAAA,OAAA,EAAU,OAAO,CAAA,CAAA,GAAK,OAAA;AACjE,EAAA,MAAM,CAAC,IAAA,EAAM,SAAS,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AACxC,EAAA,IAAI,IAAA,KAAS,QAAA,IAAY,CAAC,SAAA,IAAa,CAAC,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,IAAK,MAAA,CAAO,SAAS,CAAA,IAAK,CAAA,EAAG;AACzF,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,sBAAsB,IAAI,CAAA,8FAAA;AAAA,KAC5B;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAC,IAAI,CAAA,EAAG,OAAA,EAAS,mBAAA,EAAqB,MAAA,EAAQ,kBAAA;AAAmB,GACpF;AACF;;;ACIO,IAAe,gBAAf,MAAkD;AAAA,EAAlD,WAAA,GAAA;AAEL,IAAA,IAAA,CAAS,YAA+B,EAAC;AAEzC,IAAA,IAAA,CAAQ,QAAA,uBAAe,GAAA,EAA+B;AAAA,EAAA;AAAA,EAKtD,MAAM,OAAA,GAAiC;AACrC,IAAA,OAAO,EAAC;AAAA,EACV;AAAA,EAEA,MAAM,KAAA,GAAuB;AAAA,EAE7B;AAAA,EAEA,GAAG,OAAA,EAAgD;AACjD,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,OAAO,CAAA;AACzB,IAAA,OAAO,MAAM,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,OAAO,CAAA;AAAA,EAC3C;AAAA,EAEU,KAAK,KAAA,EAAiC;AAC9C,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,QAAA,EAAU,OAAA,CAAQ,KAAK,CAAA;AAAA,EACpD;AACF,CAAA;;;AC7CO,SAAS,SAAA,GAAoB;AAClC,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,MAAA,GAAS,EAAA;AAClE;;;ACTA,IAAM,SAAA,GAAY,UAAA;AAEX,IAAM,iBAAA,GAAN,cAAgC,aAAA,CAAc;AAAA,EAQnD,YAAoB,GAAA,EAAgB;AAClC,IAAA,KAAA,EAAM;AADY,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAPpB,IAAA,IAAA,CAAS,IAAA,GAAO,KAAA;AAChB,IAAA,IAAA,CAAS,SAAA,GAAY,CAAC,SAAS,CAAA;AAE/B,IAAA,IAAA,CAAQ,GAAA,GAA8B,IAAA;AACtC,IAAA,IAAA,CAAQ,QAAA,GAAoC,IAAA;AAC5C,IAAA,IAAA,CAAQ,cAAA,GAAiB,KAAA;AAAA,EAIzB;AAAA,EAEA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAc,WAAA,GAAyC;AACrD,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,OAAO,IAAA,CAAK,QAAA;AAC/B,IAAA,MAAM,EAAE,WAAA,EAAY,GAAI,MAAM,OAAO,eAAe,CAAA;AACpD,IAAA,MAAM,YAAA,GAAmD;AAAA,MACvD,IAAA,EAAM,KAAK,GAAA,CAAI,OAAA;AAAA,MACf,KAAK,SAAA,EAAU;AAAA,MACf,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,EAAE,SAAS,IAAA,CAAK,GAAA,CAAI,IAAA,EAAK,GAAI;AAAC,KACpD;AACA,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAY,EAAE,cAAc,CAAA;AAC5C,IAAA,MAAM,IAAI,IAAA,EAAK;AACf,IAAA,MAAM,QAAA,GAAW,IAAI,WAAA,EAAY;AACjC,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAC9D,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,WAAW,QAAQ,CAAA;AACxB,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,WAAW,QAAA,EAAkC;AACnD,IAAA,IAAI,KAAK,cAAA,EAAgB;AACzB,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,IAAA,QAAA,CAAS,EAAA,CAAG,cAAA,EAAgB,CAAC,GAAA,KAAQ;AACnC,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,cAAA,EAAgB,QAAA,EAAU,SAAA,EAAW,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,GAAG,CAAC,CAAA,EAAG,CAAA;AAAA,IACvF,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,EAAA,CAAG,iBAAA,EAAmB,CAAC,QAAA,KAAa;AAC3C,MAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAK,QAAA,CAAS,CAAC,CAAA,GAA2B,MAAA;AAChF,MAAA,IAAI,OAAA,OAAc,IAAA,CAAK,EAAE,MAAM,iBAAA,EAAmB,QAAA,EAAU,SAAA,EAAW,OAAA,EAAS,CAAA;AAAA,gBACtE,IAAA,CAAK,EAAE,MAAM,YAAA,EAAc,QAAA,EAAU,WAAW,CAAA;AAAA,IAC5D,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,EAAA,CAAG,YAAA,EAAc,MAAM,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,EAAc,QAAA,EAAU,SAAA,EAAW,CAAC,CAAA;AAAA,EACxF;AAAA,EAEA,MAAM,QAAQ,GAAA,EAA0C;AACtD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AACxC,IAAA,MAAM,WAAW,MAAM,QAAA,CAAS,QAAkB,EAAE,MAAA,EAAQ,uBAAuB,CAAA;AACnF,IAAA,MAAM,OAAA,GAAU,WAAW,CAAC,CAAA;AAC5B,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAC5D,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,QAAA,EAAU,GAAG,CAAA;AACpC,IAAA,MAAM,OAAA,GAAU,OAAO,MAAM,QAAA,CAAS,QAAgB,EAAE,MAAA,EAAQ,aAAA,EAAe,CAAC,CAAA;AAChF,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EACrD;AAAA,EAEA,MAAM,OAAA,GAAiC;AACrC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,aAAY,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC1D,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AACvB,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,OAAA,CAAkB,EAAE,MAAA,EAAQ,cAAA,EAAgB,CAAA,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5F,IAAA,MAAM,OAAA,GAAU,WAAW,CAAC,CAAA;AAC5B,IAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAC;AACtB,IAAA,MAAM,OAAA,GAAU,MAAA;AAAA,MACd,MAAM,QAAA,CAAS,OAAA,CAAgB,EAAE,MAAA,EAAQ,eAAe,CAAA,CAAE,KAAA,CAAM,MAAM,KAAK;AAAA,KAC7E;AACA,IAAA,OAAO,CAAC,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,EACvD;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,IAAA,CAAK,KAAK,SAAA,EAAU;AAC1B,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AAAA,EACxB;AAAA;AAAA,EAGA,MAAc,WAAA,CAAY,QAAA,EAA4B,GAAA,EAAoC;AACxF,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,SAAA,CAAU,KAAA,CAAM,SAAS,CAAC,CAAA;AAC7C,IAAA,MAAM,SAAA,GAAY,SAAS,MAAA,CAAO,MAAA,CAAO,MAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,GAAA;AAC1D,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,IAAK,aAAa,CAAA,EAAG;AACnD,IAAA,MAAM,OAAA,GAAU,QAAA;AAAA,MACb,MAAM,QAAA,CAAS,OAAA,CAAgB,EAAE,MAAA,EAAQ,aAAA,EAAe,CAAA,CAAE,KAAA,CAAM,MAAM,KAAK,CAAA,IAAM,KAAA;AAAA,MAClF;AAAA,KACF;AACA,IAAA,IAAI,YAAY,SAAA,EAAW;AAC3B,IAAA,MAAM,SACH,OAAA,CAAQ;AAAA,MACP,MAAA,EAAQ,4BAAA;AAAA,MACR,MAAA,EAAQ,CAAC,EAAE,OAAA,EAAS,CAAA,EAAA,EAAK,UAAU,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,KACpD,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,IAEb,CAAC,CAAA;AAAA,EACL;AAAA,EAEQ,YAAA,CAAa,QAAA,EAA4B,OAAA,EAAiB,OAAA,EAA6B;AAC7F,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,SAAA;AAAA,MACV,OAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA,EAAS,OAAU,IAAA,KAChB,MAAM,QAAA,CAAS,OAAA,CAAW,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,MAAA,EAAQ,IAAA,CAAK,QAAiB,CAAA;AAAA,MAClF,YAAY,MAAM;AAAA,MAAC,CAAA;AAAA;AAAA,MACnB,YAAY,YAAY;AACtB,QAAA,MAAM,IAAA,CAAK,KAAK,SAAA,EAAU;AAC1B,QAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,QAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,QAAA,IAAA,CAAK,KAAK,EAAE,IAAA,EAAM,YAAA,EAAc,QAAA,EAAU,WAAW,CAAA;AAAA,MACvD;AAAA,KACF;AAAA,EACF;AACF,CAAA;AAEA,SAAS,OAAO,UAAA,EAA+C;AAC7D,EAAA,IAAI,CAAC,YAAY,OAAO,UAAA;AACxB,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA,GAAI,SAAS,UAAA,EAAY,EAAE,CAAA,GAAI,MAAA,CAAO,UAAU,CAAA;AACtF,EAAA,OAAO,UAAU,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,GAAI,MAAM,CAAC,CAAA,CAAA;AACjD;;;ACvHA,SAAS,GAAA,CAAO,QAAA,EAA4B,MAAA,EAAgB,MAAA,EAA8B;AACxF,EAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,EAAE,MAAA,EAAQ,QAAkC,CAAA;AACtE;AAEA,IAAMA,UAAAA,GAAY,UAAA;AAEX,IAAM,iBAAA,GAAN,cAAgC,aAAA,CAAc;AAAA,EAOnD,YAAoB,GAAA,EAAgB;AAClC,IAAA,KAAA,EAAM;AADY,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AANpB,IAAA,IAAA,CAAS,IAAA,GAAO,KAAA;AAChB,IAAA,IAAA,CAAS,SAAA,GAAY,CAACA,UAAS,CAAA;AAE/B,IAAA,IAAA,CAAQ,QAAA,GAAoC,IAAA;AAC5C,IAAA,IAAA,CAAQ,cAAA,GAAiB,KAAA;AAAA,EAIzB;AAAA,EAEA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAc,YAAY,WAAA,EAAmD;AAC3E,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,OAAO,IAAA,CAAK,QAAA;AAC/B,IAAA,MAAM,EAAE,iBAAA,EAAkB,GAAI,MAAM,OAAO,sBAAsB,CAAA;AACjE,IAAA,MAAM,GAAA,GAAM,IAAI,iBAAA,CAAkB;AAAA,MAChC,OAAA,EAAS,KAAK,GAAA,CAAI,OAAA;AAAA,MAClB,UAAA,EAAY,KAAK,GAAA,CAAI,IAAA;AAAA,MACrB;AAAA;AAAA,KACD,CAAA;AACD,IAAA,MAAM,QAAA,GAAW,IAAI,gBAAA,EAAiB;AACtC,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,WAAW,QAAQ,CAAA;AACxB,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,WAAW,QAAA,EAAkC;AACnD,IAAA,IAAI,KAAK,cAAA,EAAgB;AACzB,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,IAAA,QAAA,CAAS,EAAA,CAAG,cAAA,EAAgB,CAAC,GAAA,KAAQ;AACnC,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,cAAA,EAAgB,QAAA,EAAUA,UAAAA,EAAW,OAAA,EAASC,OAAAA,CAAO,MAAA,CAAO,GAAG,CAAC,CAAA,EAAG,CAAA;AAAA,IACvF,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,EAAA,CAAG,iBAAA,EAAmB,CAAC,QAAA,KAAa;AAC3C,MAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAK,QAAA,CAAS,CAAC,CAAA,GAA2B,MAAA;AAChF,MAAA,IAAI,OAAA,OAAc,IAAA,CAAK,EAAE,MAAM,iBAAA,EAAmB,QAAA,EAAUD,UAAAA,EAAW,OAAA,EAAS,CAAA;AAAA,gBACtE,IAAA,CAAK,EAAE,MAAM,YAAA,EAAc,QAAA,EAAUA,YAAW,CAAA;AAAA,IAC5D,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,EAAA,CAAG,YAAA,EAAc,MAAM,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,EAAc,QAAA,EAAUA,UAAAA,EAAW,CAAC,CAAA;AAAA,EACxF;AAAA,EAEA,MAAM,QAAQ,GAAA,EAA0C;AACtD,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,WAAA,CAAY,WAAA,CAAY,GAAG,CAAC,CAAA;AACxD,IAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAc,QAAA,EAAU,qBAAqB,CAAA;AACpE,IAAA,MAAM,OAAA,GAAU,WAAW,CAAC,CAAA;AAC5B,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,MAAM,qCAAqC,CAAA;AACnE,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,QAAA,EAAU,GAAG,CAAA;AACpC,IAAA,MAAM,UAAUC,OAAAA,CAAO,MAAM,GAAA,CAAY,QAAA,EAAU,aAAa,CAAC,CAAA;AACjE,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EACrD;AAAA,EAEA,MAAM,OAAA,GAAiC;AACrC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,aAAY,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC1D,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AACvB,IAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAc,QAAA,EAAU,cAAc,CAAA,CAAE,KAAA,CAAM,MAAM,EAAc,CAAA;AACzF,IAAA,MAAM,OAAA,GAAU,WAAW,CAAC,CAAA;AAC5B,IAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAC;AACtB,IAAA,MAAM,OAAA,GAAUA,OAAAA,CAAO,MAAM,GAAA,CAAY,QAAA,EAAU,aAAa,CAAA,CAAE,KAAA,CAAM,MAAM,KAAK,CAAC,CAAA;AACpF,IAAA,OAAO,CAAC,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,EACvD;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,IAAA,CAAK,QAAA,EAAU,UAAA,EAAW,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAChD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AAAA,EACxB;AAAA,EAEA,MAAc,WAAA,CAAY,QAAA,EAA4B,GAAA,EAAoC;AACxF,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,SAAA,CAAU,KAAA,CAAM,SAAS,CAAC,CAAA;AAC7C,IAAA,MAAM,SAAA,GAAY,SAAS,MAAA,CAAO,MAAA,CAAO,MAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,GAAA;AAC1D,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,IAAK,aAAa,CAAA,EAAG;AACnD,IAAA,MAAM,OAAA,GAAU,QAAA;AAAA,MACb,MAAM,IAAY,QAAA,EAAU,aAAa,EAAE,KAAA,CAAM,MAAM,KAAK,CAAA,IAAM,KAAA;AAAA,MACnE;AAAA,KACF;AACA,IAAA,IAAI,YAAY,SAAA,EAAW;AAC3B,IAAA,MAAM,GAAA,CAAI,QAAA,EAAU,4BAAA,EAA8B,CAAC,EAAE,OAAA,EAAS,CAAA,EAAA,EAAK,SAAA,CAAU,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,KAAA;AAAA,MAC9F,MAAM;AAAA,MAAC;AAAA,KACT;AAAA,EACF;AAAA,EAEQ,YAAA,CAAa,QAAA,EAA4B,OAAA,EAAiB,OAAA,EAA6B;AAC7F,IAAA,OAAO;AAAA,MACL,QAAA,EAAUD,UAAAA;AAAA,MACV,OAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA,EAAS,CAAI,IAAA,KACX,GAAA,CAAO,UAAU,IAAA,CAAK,MAAA,EAAQ,KAAK,MAAM,CAAA;AAAA,MAC3C,YAAY,MAAM;AAAA,MAAC,CAAA;AAAA;AAAA,MACnB,YAAY,YAAY;AACtB,QAAA,MAAM,QAAA,CAAS,UAAA,EAAW,CAAE,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAC1C,QAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,QAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,QAAA,IAAA,CAAK,KAAK,EAAE,IAAA,EAAM,YAAA,EAAc,QAAA,EAAUA,YAAW,CAAA;AAAA,MACvD;AAAA,KACF;AAAA,EACF;AACF,CAAA;AAEA,SAASC,QAAO,UAAA,EAA+C;AAC7D,EAAA,IAAI,CAAC,YAAY,OAAO,UAAA;AACxB,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA,GAAI,SAAS,UAAA,EAAY,EAAE,CAAA,GAAI,MAAA,CAAO,UAAU,CAAA;AACtF,EAAA,OAAO,UAAU,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,GAAI,MAAM,CAAC,CAAA,CAAA;AACjD;AAGA,SAAS,YAAY,GAAA,EAA2C;AAC9D,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,SAAA,CAAU,KAAA,CAAM,SAAS,CAAC,CAAA;AAC7C,EAAA,MAAM,CAAA,GAAI,SAAS,MAAA,CAAO,MAAA,CAAO,MAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,GAAA;AAClD,EAAA,OAAO,MAAA,CAAO,SAAS,CAAC,CAAA,IAAK,IAAI,CAAA,GAAI,CAAC,CAAC,CAAA,GAAI,MAAA;AAC7C;;;AC1HO,IAAM,sBAAA,GAAqD;AAAA,EAChE,QAAA,EAAU,EAAC,QAAA,EAAS,aAAA,EAAc,UAAS,eAAA,EAAgB,WAAA,EAAY,8BAAA,EAA+B,OAAA,EAAQ,EAAC,KAAA,EAAM,qDAAA,EAAsD,SAAA,EAAU,6DAA2D,EAAC;AAAA,EACjP,KAAA,EAAO,EAAC,QAAA,EAAS,UAAA,EAAW,UAAS,YAAA,EAAa,WAAA,EAAY,iCAAA,EAAkC,OAAA,EAAQ,EAAC,KAAA,EAAM,qDAAA,EAAsD,SAAA,EAAU,4EAA0E,EAAC;AAAA,EAC1P,OAAA,EAAS,EAAC,QAAA,EAAS,YAAA,EAAa,UAAS,cAAA,EAAe,WAAA,EAAY,wBAAA,EAAyB,OAAA,EAAQ,EAAC,KAAA,EAAM,6EAAA,EAA8E,SAAA,EAAU,kIAAgI,EAAC;AAAA,EACrU,UAAU,EAAC,OAAA,EAAQ,EAAC,KAAA,EAAM,4EAA0E,EAAC;AAAA,EACrG,MAAA,EAAQ,EAAC,QAAA,EAAS,WAAA,EAAY,UAAS,aAAA,EAAc,WAAA,EAAY,gCAAA,EAAiC,OAAA,EAAQ,EAAC,KAAA,EAAM,yCAAA,EAA0C,SAAA,EAAU,+EAA6E,EAAC;AAAA,EACnP,WAAA,EAAa,EAAC,QAAA,EAAS,cAAA,EAAe,QAAA,EAAS,gBAAA,EAAiB,OAAA,EAAQ,EAAC,KAAA,EAAM,2DAAA,EAA4D,SAAA,EAAU,iEAAA,EAAiE,EAAC;AAAA,EACvN,aAAA,EAAe,EAAC,QAAA,EAAS,sBAAA,EAAuB,UAAS,wBAAA,EAAyB,WAAA,EAAY,qCAAA,EAAsC,OAAA,EAAQ,EAAC,KAAA,EAAM,qEAAA,EAAsE,SAAA,EAAU,yEAAuE,EAAC;AAAA,EAC3S,MAAA,EAAQ,EAAC,QAAA,EAAS,WAAA,EAAY,UAAS,aAAA,EAAc,WAAA,EAAY,yBAAA,EAA0B,OAAA,EAAQ,EAAC,KAAA,EAAM,yEAAA,EAA0E,SAAA,EAAU,mFAAiF,EAAC;AAAA,EAChR,OAAA,EAAS,EAAC,OAAA,EAAQ,EAAC,OAAM,kEAAA,EAAmE,SAAA,EAAU,mEAAiE,EAAC;AAAA,EACxK,GAAA,EAAK,EAAC,QAAA,EAAS,aAAA,EAAc,UAAS,gBAAA,EAAiB,WAAA,EAAY,2FAAA,EAA4F,OAAA,EAAQ,EAAC,KAAA,EAAM,uEAAA,EAAwE,SAAA,EAAU,mEAAiE,EAAC;AAAA,EAClU,SAAA,EAAW,EAAC,QAAA,EAAS,QAAA,EAAS,UAAS,UAAA,EAAW,WAAA,EAAY,uCAAA,EAAwC,OAAA,EAAQ,EAAC,KAAA,EAAM,iDAAA,EAAkD,SAAA,EAAU,iEAA+D,EAAC;AAAA,EACjP,MAAA,EAAQ,EAAC,QAAA,EAAS,eAAA,EAAgB,UAAS,iBAAA,EAAkB,WAAA,EAAY,+BAAA,EAAgC,OAAA,EAAQ,EAAC,KAAA,EAAM,iEAAA,EAAkE,SAAA,EAAU,kGAAgG,EAAC;AAAA,EACrS,OAAA,EAAS,EAAC,QAAA,EAAS,kBAAA,EAAmB,UAAS,oBAAA,EAAqB,WAAA,EAAY,4BAAA,EAA6B,OAAA,EAAQ,EAAC,KAAA,EAAM,wDAAA,EAAyD,SAAA,EAAU,mEAAiE,EAAC;AAAA,EACjQ,OAAA,EAAS,EAAC,QAAA,EAAS,cAAA,EAAe,QAAA,EAAS,gBAAA,EAAiB,OAAA,EAAQ,EAAC,KAAA,EAAM,qDAAA,EAAsD,SAAA,EAAU,4DAAA,EAA4D,EAAC;AAAA,EACxM,KAAA,EAAO,EAAC,QAAA,EAAS,gBAAA,EAAiB,UAAS,kBAAA,EAAmB,WAAA,EAAY,kCAAA,EAAmC,OAAA,EAAQ,EAAC,KAAA,EAAM,yDAAA,EAA0D,SAAA,EAAU,sEAAoE,EAAC;AAAA,EACrQ,MAAA,EAAQ,EAAC,QAAA,EAAS,WAAA,EAAY,UAAS,aAAA,EAAc,WAAA,EAAY,uBAAA,EAAwB,OAAA,EAAQ,EAAC,KAAA,EAAM,0DAAA,EAA2D,SAAA,EAAU,yFAAuF,EAAC;AAAA,EACrQ,OAAA,EAAS,EAAC,QAAA,EAAS,YAAA,EAAa,UAAS,cAAA,EAAe,WAAA,EAAY,sBAAA,EAAuB,OAAA,EAAQ,EAAC,KAAA,EAAM,mDAAA,EAAoD,SAAA,EAAU,qDAAmD,EAAC;AAAA,EAC5N,OAAA,EAAS,EAAC,QAAA,EAAS,oCAAA,EAAqC,UAAS,uCAAA,EAAwC,WAAA,EAAY,oDAAA,EAAqD,OAAA,EAAQ,EAAC,KAAA,EAAM,8DAAA,EAA+D,SAAA,EAAU,oEAAkE,EAAC;AAAA,EACrU,UAAA,EAAY,EAAC,QAAA,EAAS,eAAA,EAAgB,QAAA,EAAS,iBAAA,EAAkB,OAAA,EAAQ,EAAC,KAAA,EAAM,2CAAA,EAA4C,SAAA,EAAU,+DAAA,EAA+D,EAAC;AAAA,EACtM,MAAA,EAAQ,EAAC,QAAA,EAAS,iBAAA,EAAkB,QAAA,EAAS,mBAAA,EAAoB,OAAA,EAAQ,EAAC,KAAA,EAAM,0DAAA,EAA2D,SAAA,EAAU,+DAAA,EAA+D,EAAC;AAAA,EACrN,KAAA,EAAO,EAAC,QAAA,EAAS,YAAA,EAAa,UAAS,cAAA,EAAe,WAAA,EAAY,mBAAA,EAAoB,OAAA,EAAQ,EAAC,KAAA,EAAM,mEAAA,EAAoE,SAAA,EAAU,qEAAmE,EAAC;AAAA,EACvP,IAAA,EAAM,EAAC,QAAA,EAAS,eAAA,EAAgB,UAAS,iBAAA,EAAkB,WAAA,EAAY,+BAAA,EAAgC,OAAA,EAAQ,EAAC,KAAA,EAAM,wDAAA,EAAyD,SAAA,EAAU,wEAAsE,EAAC;AAAA,EAChQ,MAAA,EAAQ,EAAC,QAAA,EAAS,WAAA,EAAY,UAAS,aAAA,EAAc,WAAA,EAAY,4BAAA,EAA6B,OAAA,EAAQ,EAAC,KAAA,EAAM,yCAAA,EAA0C,SAAA,EAAU,2CAAyC;AAC5M,CAAA;;;AChBO,IAAM,oBAAA,GAAmD,sBAAA;;;ACXzD,SAAS,QAAA,GAAoB;AAClC,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,EAAa,OAAO,KAAA;AAC7C,EAAA,MAAM,EAAA,GAAK,UAAU,SAAA,IAAa,EAAA;AAClC,EAAA,MAAM,YAAA,GACH,SAAA,CAAuD,aAAA,EAAe,MAAA,IAAU,KAAA;AACnF,EAAA,OAAO,2BAAA,CAA4B,IAAA,CAAK,EAAE,CAAA,IAAK,YAAA;AACjD;AAEA,SAAS,SAAA,CAAU,MAAc,GAAA,EAAqB;AACpD,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAG,IAAI,GAAA,GAAM,GAAA;AACvC,EAAA,OAAO,GAAG,IAAI,CAAA,EAAG,GAAG,CAAA,IAAA,EAAO,kBAAA,CAAmB,GAAG,CAAC,CAAA,CAAA;AACpD;AAOO,SAAS,UAAA,CAAW,MAAkB,GAAA,EAAmB;AAC9D,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,EAAA,IAAI,KAAK,SAAA,EAAW;AAClB,IAAA,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,SAAA,EAAW,GAAG,GAAG,IAAI,CAAA;AAAA,EAC/C,CAAA,MAAA,IAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,MAAA,EAAQ,GAAG,GAAG,KAAK,CAAA;AAAA,EAC7C;AACF;AAMO,SAAS,cAAc,IAAA,EAAwB;AACpD,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,EAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAClB,EAAA,QAAA,CAAS,IAAA,CAAK,QAAQ,KAAK,CAAA;AAC7B;AAEA,SAAS,QAAA,CAAS,MAAc,UAAA,EAA2B;AACzD,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,EAAA,CAAA,CAAE,IAAA,GAAO,IAAA;AACT,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,CAAA,CAAE,MAAA,GAAS,QAAA;AACX,IAAA,CAAA,CAAE,GAAA,GAAM,qBAAA;AAAA,EACV;AACA,EAAA,CAAA,CAAE,MAAM,OAAA,GAAU,MAAA;AAClB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,EAAA,CAAA,CAAE,KAAA,EAAM;AACR,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC7B;AAGO,SAAS,cAAc,SAAA,EAAqC;AACjE,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,OAAA,CAAQ,QAAQ,KAAK,CAAA;AACjE,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,IAAI,IAAA,GAAO,KAAA;AACX,IAAA,MAAM,MAAA,GAAS,CAAC,MAAA,KAAoB;AAClC,MAAA,IAAI,IAAA,EAAM;AACV,MAAA,IAAA,GAAO,IAAA;AACP,MAAA,QAAA,CAAS,mBAAA,CAAoB,oBAAoB,YAAY,CAAA;AAC7D,MAAA,MAAA,CAAO,mBAAA,CAAoB,YAAY,UAAU,CAAA;AACjD,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,IAChB,CAAA;AACA,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,IAAI,QAAA,CAAS,MAAA,EAAQ,MAAA,CAAO,IAAI,CAAA;AAAA,IAClC,CAAA;AACA,IAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,IAAI,CAAA;AACpC,IAAA,QAAA,CAAS,gBAAA,CAAiB,oBAAoB,YAAY,CAAA;AAC1D,IAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,UAAU,CAAA;AAC9C,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,MAAA,CAAO,KAAK,GAAG,SAAS,CAAA;AAAA,EACzD,CAAC,CAAA;AACH;;;AChEA,IAAM,WAAA,GAAc,yBAAA;AASb,IAAM,sBAAA,GAAN,cAAqC,aAAA,CAAc;AAAA,EAUxD,WAAA,CACU,KACA,OAAA,EACR;AACA,IAAA,KAAA,EAAM;AAHE,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAXV,IAAA,IAAA,CAAS,IAAA,GAAO,eAAA;AAChB,IAAA,IAAA,CAAS,YAA+B,EAAC;AAEzC;AAAA,IAAA,IAAA,CAAQ,MAAA,GAA4B,IAAA;AAEpC,IAAA,IAAA,CAAQ,MAAA,uBAAa,GAAA,EAAoB;AACzC,IAAA,IAAA,CAAQ,IAAA,GAA8C,IAAA;AACtD,IAAA,IAAA,CAAQ,OAAA,GAAgC,IAAA;AAOtC,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,GAAG,oBAAA,EAAsB,GAAI,OAAA,CAAQ,WAAA,IAAe,EAAC,EAAG;AAAA,EACzE;AAAA,EAEA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAc,SAAA,GAAiC;AAC7C,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,OAAO,IAAA,CAAK,MAAA;AAC7B,IAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,IAAA,CAAK;AAAA,MACnC,SAAA,EAAW,KAAK,OAAA,CAAQ,SAAA;AAAA,MACxB,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,KAAK,GAAA,CAAI,OAAA;AAAA,QACf,WAAA,EAAa,IAAA,CAAK,GAAA,CAAI,WAAA,IAAe,KAAK,GAAA,CAAI,OAAA;AAAA,QAC9C,KAAK,SAAA,EAAU;AAAA,QACf,KAAA,EAAO,KAAK,GAAA,CAAI,IAAA,GAAO,CAAC,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,GAAI;AAAC,OAC5C;AAAA,MACA,QAAA,EAAU,KAAK,OAAA,CAAQ;AAAA,KACxB,CAAA;AAED,IAAA,MAAA,CAAO,EAAA,CAAG,gBAAA,EAAkB,CAAC,EAAE,OAAM,KAAM;AACzC,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAC1C,MAAA,IAAI,CAAC,QAAA,EAAU;AACf,MAAA,IAAA,CAAK,MAAA,CAAO,OAAO,QAAQ,CAAA;AAC3B,MAAA,IAAA,CAAK,OAAA,EAAQ;AACb,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,EAAc,UAAU,CAAA;AAAA,IAC5C,CAAC,CAAA;AAED,IAAA,MAAA,CAAO,GAAG,eAAA,EAAiB,CAAC,EAAE,KAAA,EAAO,QAAO,KAAM;AAChD,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAC1C,MAAA,IAAI,CAAC,QAAA,EAAU;AACf,MAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAK,GAAI,MAAA,CAAO,KAAA;AAC9B,MAAA,IAAI,SAAS,cAAA,EAAgB;AAC3B,QAAA,MAAM,OAAA,GACJ,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,GAAI,IAAA,GAAO,CAAA,OAAA,EAAU,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA;AAChF,QAAA,IAAA,CAAK,KAAK,EAAE,IAAA,EAAM,cAAA,EAAgB,QAAA,EAAU,SAAS,CAAA;AAAA,MACvD,CAAA,MAAA,IAAW,SAAS,iBAAA,IAAqB,KAAA,CAAM,QAAQ,IAAI,CAAA,IAAK,IAAA,CAAK,CAAC,CAAA,EAAG;AACvE,QAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,EAAE,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,IAAK,EAAA;AACpD,QAAA,IAAI,OAAA,OAAc,IAAA,CAAK,EAAE,MAAM,iBAAA,EAAmB,QAAA,EAAU,SAAS,CAAA;AAAA,MACvE;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,IAAA,EAAK;AACV,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAc,MAAA,GAAwB;AACpC,IAAA,IAAI,KAAK,IAAA,EAAM;AACf,IAAA,IAAI,IAAA,CAAK,OAAA,EAAS,OAAO,IAAA,CAAK,OAAA;AAC9B,IAAA,IAAA,CAAK,WAAW,YAAY;AAC1B,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,EAAU;AACpC,MAAA,MAAM,EAAE,OAAO,GAAA,EAAI,GAAI,MAAM,MAAA,CAAO,IAAA,CAAK,QAAQ,MAAA,EAAO;AACxD,MAAA,IAAA,CAAK,IAAA,GAAO,EAAE,KAAA,EAAO,GAAA,EAAI;AACzB,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,IACjB,CAAA,GAAG;AACH,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,MAAM,QAAQ,GAAA,EAA0C;AACtD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,EAAU;AAEpC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,GAAG,CAAA;AACxC,IAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAM,MAAM,KAAK,MAAA,EAAO;AAClC,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAEnE,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,aAAA,EAAe,QAAA,EAAU,IAAI,QAAA,EAAU,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,CAAA;AAExE,IAAA,IAAI,UAAS,EAAG;AACd,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACpC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,UAAA,CAAW,IAAA,EAAM,KAAK,GAAG,CAAA;AACzB,QAAA,KAAK,aAAA,CAAc,KAAK,OAAA,CAAQ,aAAA,IAAiB,GAAI,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,KAAW;AACtE,UAAA,IAAI,CAAC,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,oBAAA,EAAsB,QAAA,EAAU,GAAA,CAAI,QAAA,EAAU,GAAA,EAAK,IAAA,CAAK,KAAK,CAAA;AAAA,QAC9F,CAAC,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAO,OAAA,CAAQ;AAAA,MACxC,cAAc,IAAA,CAAK,KAAA;AAAA,MACnB,kBAAA,EAAoB,EAAE,CAAC,GAAA,CAAI,UAAU,IAAI,GAAG,GAAA,CAAI,SAAA,CAAU,KAAA;AAAM,KACjE,CAAA;AAED,IAAA,MAAM,UAAU,MAAM,UAAA,CAAW,UAAS,EAAG,GAAA,CAAI,QAAQ,MAAM;AAC7D,MAAA,KAAK,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAAA,IAC3E,CAAC,CAAA;AAED,IAAA,KAAK,KAAK,MAAA,EAAO;AAEjB,IAAA,MAAM,UAAA,GAAa,KAAK,YAAA,CAAa,MAAA,EAAQ,IAAI,QAAA,EAAU,OAAA,EAAS,IAAI,SAAS,CAAA;AACjF,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,QAAA,EAAU,QAAQ,KAAK,CAAA;AAC3C,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAA,GAAiC;AACrC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,EAAU;AACpC,IAAA,MAAM,MAAoB,EAAC;AAC3B,IAAA,KAAA,MAAW,CAAC,UAAU,KAAK,CAAA,IAAK,CAAC,GAAG,IAAA,CAAK,MAAM,CAAA,EAAG;AAChD,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAC9C,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,IAAA,CAAK,MAAA,CAAO,OAAO,QAAQ,CAAA;AAC3B,QAAA;AAAA,MACF;AACA,MAAA,MAAM,EAAA,GAAK,eAAe,OAAO,CAAA;AACjC,MAAA,IAAI,EAAA,MAAQ,IAAA,CAAK,IAAA,CAAK,aAAa,MAAA,EAAQ,QAAA,EAAU,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,IACnE;AACA,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,OAAA,CAAQ,UAAA;AAAA,QACZ,OAAO,OAAA,CACJ,MAAA,GACA,GAAA,CAAI,CAAC,MAAM,MAAA,CAAO,UAAA,CAAW,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,YAAY,mBAAmB,CAAA,EAAG,CAAC;AAAA,OAC/F;AAAA,IACF;AACA,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAClB,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA;AAAA,EAIQ,QAAA,CAAS,QAAoB,GAAA,EAAwC;AAC3E,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,QAAQ,CAAA;AAC1C,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAC9C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AAC/B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,UAAA,CAAW,GAAA,CAAI,UAAU,IAAI,CAAA;AAChD,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,SAAA,CAAU,KAAA,CAAM,SAAS,CAAC,CAAA;AAC7C,IAAA,IAAI,CAAC,MAAO,MAAA,IAAU,CAAC,GAAG,MAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,EAAI,OAAO,IAAA;AAC5D,IAAA,OAAO,KAAK,YAAA,CAAa,MAAA,EAAQ,IAAI,QAAA,EAAU,OAAA,EAAS,IAAI,SAAS,CAAA;AAAA,EACvE;AAAA,EAEQ,YAAA,CACN,MAAA,EACA,QAAA,EACA,OAAA,EACA,SAAA,EACY;AACZ,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,UAAA,CAAW,SAAA,CAAU,IAAI,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAA,CACH,IAAI,QAAA,IAAY,IAAI,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAmB,CAAC,CAAC,CAAC,CAAA,IAAK,EAAA;AACpF,IAAA,MAAM,OAAA,GACJ,EAAA,EAAI,MAAA,GAAS,CAAC,CAAA,KACb,IAAI,QAAA,GAAW,CAAC,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS,CAAC,EAAE,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAAI,CAAA,EAAG,SAAA,CAAU,IAAI,CAAA,EAAA,CAAA,CAAA;AAC1F,IAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA,EAAS,CAAI,IAAA,KACX,MAAA,CAAO,OAAA,CAAW;AAAA,QAChB,KAAA;AAAA,QACA,OAAA;AAAA,QACA,SAAS,EAAE,MAAA,EAAQ,KAAK,MAAA,EAAQ,MAAA,EAAQ,KAAK,MAAA;AAAgB,OAC9D,CAAA;AAAA,MACH,YAAY,MAAM;AAChB,QAAA,IAAI,CAAC,UAAS,EAAG;AACjB,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAChC,QAAA,IAAI,IAAA,gBAAoB,IAAI,CAAA;AAAA,MAC9B,CAAA;AAAA,MACA,YAAY,YAAY;AACtB,QAAA,MAAM,MAAA,CAAO,UAAA,CAAW,EAAE,KAAA,EAAO,MAAA,EAAQ,WAAA,CAAY,mBAAmB,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAC3F,QAAA,IAAA,CAAK,MAAA,CAAO,OAAO,QAAQ,CAAA;AAC3B,QAAA,IAAA,CAAK,OAAA,EAAQ;AACb,QAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,EAAc,UAAU,CAAA;AAAA,MAC5C;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,WAAA,CAAY,QAAoB,KAAA,EAAgD;AACtF,IAAA,IAAI;AACF,MAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AAAA,IACjC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,eAAe,KAAA,EAA8B;AACnD,IAAA,KAAA,MAAW,CAAC,UAAU,CAAC,CAAA,IAAK,KAAK,MAAA,EAAQ,IAAI,CAAA,KAAM,KAAA,EAAO,OAAO,QAAA;AACjE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,OAAA,GAAgB;AACtB,IAAA,IAAI;AACF,MAAA,YAAA,CAAa,OAAA,CAAQ,aAAa,IAAA,CAAK,SAAA,CAAU,CAAC,GAAG,IAAA,CAAK,MAAM,CAAC,CAAC,CAAA;AAAA,IACpE,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEQ,IAAA,GAAa;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,OAAA,CAAQ,WAAW,CAAA;AAC5C,MAAA,IAAI,GAAA,OAAU,MAAA,GAAS,IAAI,IAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAA4B,CAAA;AAAA,IAC3E,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACF,CAAA;AAEA,SAAS,eAAe,OAAA,EAAoD;AAC1E,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,UAAU,EAAE,CAAC,CAAA;AAC9C,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA;AACjC,EAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,EAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,OAAA,EAAS,CAAA,CAAE,OAAA,EAAS,MAAA,EAAQ,CAAA,CAAE,QAAO,EAAE;AACnF;AAEA,SAAS,UAAA,CACP,OAAA,EACA,MAAA,EACA,OAAA,EACY;AACZ,EAAA,IAAI,CAAC,QAAQ,OAAO,OAAA;AACpB,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,OAAA,EAAQ;AACR,IAAA,OAAO,QAAQ,MAAA,CAAO,IAAI,YAAA,CAAa,SAAA,EAAW,YAAY,CAAC,CAAA;AAAA,EACjE;AACA,EAAA,OAAO,IAAI,OAAA,CAAW,CAAC,OAAA,EAAS,MAAA,KAAW;AACzC,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,OAAA,EAAQ;AACR,MAAA,MAAA,CAAO,IAAI,YAAA,CAAa,SAAA,EAAW,YAAY,CAAC,CAAA;AAAA,IAClD,CAAA;AACA,IAAA,MAAA,CAAO,iBAAiB,OAAA,EAAS,YAAA,EAAc,EAAE,IAAA,EAAM,MAAM,CAAA;AAC7D,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,CAAC,CAAA,KAAM;AACL,QAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,YAAY,CAAA;AAChD,QAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,MACX,CAAA;AAAA,MACA,CAAC,CAAA,KAAM;AACL,QAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,YAAY,CAAA;AAChD,QAAA,MAAA,CAAO,CAAC,CAAA;AAAA,MACV;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH;;;ACtQA,SAAS,iBAAiB,MAAA,EAA0C;AAClE,EAAA,MAAM,GAAA,GAAiB;AAAA,IACrB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,aAAa,MAAA,CAAO;AAAA,GACtB;AACA,EAAA,OAAO;AAAA,IACL,IAAI,kBAAkB,GAAG,CAAA;AAAA,IACzB,IAAI,kBAAkB,GAAG,CAAA;AAAA,IACzB,IAAI,sBAAA,CAAuB,GAAA,EAAK,EAAE,SAAA,EAAW,MAAA,CAAO,wBAAwB;AAAA,GAC9E;AACF;AAOO,IAAM,gBAAN,MAAoB;AAAA,EAGzB,YAAY,MAAA,EAA6B;AACvC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,cAAA,CAAe,gBAAA,CAAiB,MAAM,CAAC,CAAA;AAAA,EAC5D;AAAA,EAEA,IAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,EAAK;AAAA,EAC3B;AAAA,EAEA,MAAM,QAAQ,KAAA,EAA0C;AACtD,IAAA,IAAI,KAAA,CAAM,OAAA,KAAY,MAAA,IAAa,KAAA,CAAM,YAAY,IAAA,EAAM;AACzD,MAAA,MAAM,IAAI,MAAM,6EAA6E,CAAA;AAAA,IAC/F;AACA,IAAA,OAAO,IAAA,CAAK,QAAQ,OAAA,CAAQ;AAAA,MAC1B,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,SAAA,EAAW,cAAA,CAAe,KAAA,CAAM,OAAO,CAAA;AAAA,MACvC,QAAQ,KAAA,CAAM;AAAA,KACf,CAAA;AAAA,EACH;AAAA,EAEA,OAAA,GAAiC;AAC/B,IAAA,OAAO,IAAA,CAAK,QAAQ,OAAA,EAAQ;AAAA,EAC9B;AAAA,EAEA,WAAW,QAAA,EAAkC;AAC3C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,QAAQ,CAAA;AAAA,EACzC;AAAA,EAEA,KAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EAC5B;AAAA,EAEA,IAAI,QAAA,EAA0C;AAC5C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AAAA,EAClC;AAAA,EAEA,GAAG,OAAA,EAAgD;AACjD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,OAAO,CAAA;AAAA,EAChC;AACF","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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lydianpay/lydianconnect",
3
- "version": "1.0.1",
3
+ "version": "1.1.0",
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",