@lydianpay/lydianconnect 1.1.2 → 1.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -42,9 +42,5 @@ lc.on((event) => {
42
42
 
43
43
  ## Supported wallets
44
44
 
45
- **Native SDK:** MetaMask, Coinbase Wallet.
46
-
47
- **WalletConnect:** Rainbow, Trust Wallet, OKX Wallet, Crypto.com, Phantom, Zerion,
48
- Argent, Ledger, 1inch, SafePal, imToken, TokenPocket, Blockchain.com, Exodus,
49
- Ronin Wallet, Coin98, Bitget Wallet, Infinity Wallet, Atomic Wallet, AlphaWallet,
50
- MathWallet, BitPay — each with native deep-linking.
45
+ The canonical list of supported wallets lives in
46
+ [`@lydianpay/lydianconnect-catalog`](https://www.npmjs.com/package/@lydianpay/lydianconnect-catalog).
package/dist/index.cjs CHANGED
@@ -35,13 +35,19 @@ var ConnectManager = class {
35
35
  this.unsubs.push(connector.on((event) => this.handle(event)));
36
36
  }
37
37
  }
38
- /** SDK connector if one claims this walletId, else the fallback. The host app is oblivious. */
39
- resolve(walletId) {
40
- return this.byWallet.get(walletId) ?? this.fallback;
38
+ /**
39
+ * SDK connector if one claims this walletId AND serves the requested
40
+ * namespace, else the fallback. So an EVM-only SDK connector is bypassed to
41
+ * WalletConnect for a non-EVM chain. The host app is oblivious.
42
+ */
43
+ resolve(walletId, namespaceName) {
44
+ const claimed = this.byWallet.get(walletId);
45
+ if (claimed && claimed.servesNamespace(namespaceName)) return claimed;
46
+ return this.fallback;
41
47
  }
42
48
  async connect(req) {
43
49
  if (!this.started) await this.init();
44
- const connection = await this.resolve(req.walletId).connect(req);
50
+ const connection = await this.resolve(req.walletId, req.namespace.name).connect(req);
45
51
  this.connections.set(req.walletId, connection);
46
52
  this.emit({ type: "connect", walletId: req.walletId, connection });
47
53
  return connection;
@@ -89,24 +95,40 @@ var ConnectManager = class {
89
95
  };
90
96
 
91
97
  // src/core/namespace.ts
92
- var DEFAULT_EVM_METHODS = [
93
- "eth_sendTransaction",
94
- "personal_sign",
95
- "eth_signTypedData_v4",
96
- "wallet_switchEthereumChain"
97
- ];
98
- var DEFAULT_EVM_EVENTS = ["chainChanged", "accountsChanged"];
98
+ var NAMESPACE_DEFAULTS = {
99
+ eip155: {
100
+ methods: [
101
+ "eth_sendTransaction",
102
+ "personal_sign",
103
+ "eth_signTypedData_v4",
104
+ "wallet_switchEthereumChain"
105
+ ],
106
+ events: ["chainChanged", "accountsChanged"]
107
+ },
108
+ solana: {
109
+ methods: ["solana_signTransaction", "solana_signMessage", "solana_signAndSendTransaction"],
110
+ events: []
111
+ },
112
+ bip122: {
113
+ methods: ["sendTransfer", "signMessage", "signPsbt", "getAccountAddresses"],
114
+ events: ["bip122_addressesChanged"]
115
+ }
116
+ };
99
117
  function buildNamespace(chainId) {
100
118
  const caip = typeof chainId === "number" ? `eip155:${chainId}` : chainId;
101
119
  const [name, reference] = caip.split(":");
102
- if (name !== "eip155" || !reference || !/^\d+$/.test(reference) || Number(reference) <= 0) {
120
+ const defaults = name ? NAMESPACE_DEFAULTS[name] : void 0;
121
+ if (!name || !defaults || !reference) {
103
122
  throw new Error(
104
- `Unsupported chain "${caip}". lydianconnect is EVM-only for now \u2014 pass a positive number or an "eip155:<id>" string.`
123
+ `Unsupported chain "${caip}". lydianconnect connects ${Object.keys(NAMESPACE_DEFAULTS).join(", ")} \u2014 pass a number (EVM) or a "<namespace>:<reference>" CAIP-2 id.`
105
124
  );
106
125
  }
126
+ if (name === "eip155" && !(/^\d+$/.test(reference) && Number(reference) > 0)) {
127
+ throw new Error(`Invalid eip155 chain "${caip}" \u2014 the reference must be a positive integer.`);
128
+ }
107
129
  return {
108
130
  name,
109
- value: { chains: [caip], methods: DEFAULT_EVM_METHODS, events: DEFAULT_EVM_EVENTS }
131
+ value: { chains: [caip], methods: defaults.methods, events: defaults.events }
110
132
  };
111
133
  }
112
134
 
@@ -116,6 +138,9 @@ var BaseConnector = class {
116
138
  this.walletIds = [];
117
139
  this.handlers = /* @__PURE__ */ new Set();
118
140
  }
141
+ servesNamespace(_namespaceName) {
142
+ return true;
143
+ }
119
144
  async restore() {
120
145
  return [];
121
146
  }
@@ -150,6 +175,9 @@ var MetaMaskConnector = class extends BaseConnector {
150
175
  isAvailable() {
151
176
  return true;
152
177
  }
178
+ servesNamespace(name) {
179
+ return name === "eip155";
180
+ }
153
181
  async getProvider() {
154
182
  if (this.provider) return this.provider;
155
183
  const { MetaMaskSDK } = await import('@metamask/sdk');
@@ -262,6 +290,9 @@ var CoinbaseConnector = class extends BaseConnector {
262
290
  isAvailable() {
263
291
  return true;
264
292
  }
293
+ servesNamespace(name) {
294
+ return name === "eip155";
295
+ }
265
296
  async getProvider(appChainIds) {
266
297
  if (this.provider) return this.provider;
267
298
  const { CoinbaseWalletSDK } = await import('@coinbase/wallet-sdk');
@@ -381,7 +412,43 @@ var WALLET_LINKS = {
381
412
  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
413
  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
414
  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" } }
415
+ 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" } },
416
+ rabby: { "native": "rabby://", "scheme": "rabby://wc", "store": { "ios": "https://apps.apple.com/us/app/rabby-wallet-crypto-evm/id6474381673", "android": "https://play.google.com/store/apps/details?id=com.debank.rabbymobile" } },
417
+ // Bybit's WC deep link nests the uri inside a targetUrl wrapper (bybitapp://open/route?targetUrl=by://web3/walletconnect/wc?uri=...), which the `${scheme}?uri=` builder can't express — QR/scan connect only.
418
+ bybit: { "store": { "ios": "https://apps.apple.com/us/app/bybit-buy-trade-crypto/id1488296980", "android": "https://play.google.com/store/apps/details?id=com.bybit.app" } },
419
+ binance: { "native": "bnc://app.binance.com/cedefi/", "scheme": "bnc://app.binance.com/cedefi/wc", "store": { "ios": "https://apps.apple.com/us/app/id1436799971", "android": "https://play.google.com/store/apps/details?id=com.binance.dev" } },
420
+ gate: { "native": "gtweb3wallet://", "scheme": "gtweb3wallet://wc", "store": { "ios": "https://apps.apple.com/us/app/gate-io-buy-bitcoin-crypto/id1294998195", "android": "https://play.google.com/store/apps/details?id=com.gateio.gateio" } },
421
+ // Core: `core://` scheme not corroborated to 2 sources — QR/scan connect only.
422
+ core: { "store": { "ios": "https://apps.apple.com/us/app/core-wallet/id6443685999", "android": "https://play.google.com/store/apps/details?id=com.avaxwallet" } },
423
+ // Backpack: `backpack://` scheme not corroborated to 2 sources — QR/scan connect only.
424
+ backpack: { "store": { "ios": "https://apps.apple.com/us/app/backpack-wallet-exchange/id6445964121", "android": "https://play.google.com/store/apps/details?id=app.backpack.mobile" } },
425
+ frontier: { "native": "frontier://", "scheme": "frontier://wc", "store": { "ios": "https://apps.apple.com/us/app/frontier-crypto-defi-wallet/id1482380988", "android": "https://play.google.com/store/apps/details?id=com.frontierwallet" } },
426
+ onekey: { "native": "onekey-wallet://", "scheme": "onekey-wallet://wc", "store": { "ios": "https://apps.apple.com/us/app/onekey-open-source-wallet/id1609559473", "android": "https://play.google.com/store/apps/details?id=so.onekey.app.wallet" } },
427
+ kraken: { "native": "krakenwallet://", "scheme": "krakenwallet://wc", "store": { "ios": "https://apps.apple.com/us/app/kraken-wallet/id1626327149", "android": "https://play.google.com/store/apps/details?id=com.kraken.superwallet" } },
428
+ uniswap: { "native": "uniswap://", "scheme": "uniswap://wc", "store": { "ios": "https://apps.apple.com/us/app/uniswap-crypto-nft-wallet/id6443944476", "android": "https://play.google.com/store/apps/details?id=com.uniswap.mobile" } },
429
+ omni: { "native": "omni://", "scheme": "omni://wc", "store": { "ios": "https://apps.apple.com/us/app/omni-web3-wallet/id1569375204", "android": "https://play.google.com/store/apps/details?id=fi.steakwallet.app" } },
430
+ mew: { "universal": "https://mewwallet.com/wc", "store": { "ios": "https://apps.apple.com/app/id1464614025", "android": "https://play.google.com/store/apps/details?id=com.myetherwallet.mewwallet" } },
431
+ foxwallet: { "native": "foxwallet://", "scheme": "foxwallet://wc", "universal": "https://link.foxwallet.com/wc", "store": { "ios": "https://apps.apple.com/app/foxwallet-crypto-web3/id1590983231", "android": "https://play.google.com/store/apps/details?id=com.foxwallet.play" } },
432
+ nova: { "native": "novawallet://", "scheme": "novawallet://wc", "store": { "ios": "https://apps.apple.com/us/app/nova-polkadot-wallet/id1597119355", "android": "https://play.google.com/store/apps/details?id=io.novafoundation.nova.market" } },
433
+ subwallet: { "native": "subwallet://", "scheme": "subwallet://wc", "store": { "ios": "https://apps.apple.com/us/app/subwallet-polkadot-wallet/id1633050285", "android": "https://play.google.com/store/apps/details?id=app.subwallet.mobile" } },
434
+ safe: { "native": "safe://", "scheme": "safe://wc", "store": { "ios": "https://apps.apple.com/us/app/safe-mobile/id6748754793", "android": "https://play.google.com/store/apps/details?id=global.safe.mobileapp" } },
435
+ robinhood: { "native": "robinhood-wallet://", "scheme": "robinhood-wallet://wc", "store": { "ios": "https://apps.apple.com/us/app/robinhood-wallet-swap-crypto/id1634080733", "android": "https://play.google.com/store/apps/details?id=com.robinhood.gateway" } },
436
+ tangem: { "native": "tangem://", "scheme": "tangem://wc", "store": { "ios": "https://apps.apple.com/app/tangem/id1354868448", "android": "https://play.google.com/store/apps/details?id=com.tangem.wallet" } },
437
+ // Trezor Suite: WalletConnect pairing is QR/paste-into-Suite (no corroborated custom scheme) — QR connect only.
438
+ trezor: { "store": { "ios": "https://apps.apple.com/us/app/trezor-suite/id1631884497", "android": "https://play.google.com/store/apps/details?id=io.trezor.suite" } },
439
+ kucoin: { "native": "kucoin://", "scheme": "kucoin:///wallet/walletConnect", "store": { "ios": "https://apps.apple.com/app/kucoin-buy-bitcoin-crypto/id1378956601", "android": "https://play.google.com/store/apps/details?id=com.kubi.kucoin" } },
440
+ // Jupiter (Solana): no corroborated WC deep-link scheme — QR connect only.
441
+ jupiter: { "store": { "ios": "https://apps.apple.com/us/app/jupiter-solana-swap-wallet/id6484069059", "android": "https://play.google.com/store/apps/details?id=ag.jup.jupiter.android" } },
442
+ zengo: { "native": "zengo://get.zengo.com/", "scheme": "zengo://get.zengo.com/wc", "store": { "ios": "https://apps.apple.com/us/app/zengo-crypto-bitcoin-wallet/id1440147115", "android": "https://play.google.com/store/apps/details?id=com.zengo.wallet" } },
443
+ // Bitcoin.com Wallet: no corroborated WC deep-link scheme — QR connect only.
444
+ bitcoincom: { "store": { "ios": "https://apps.apple.com/us/app/bitcoin-wallet-by-bitcoin-com/id1252903728", "android": "https://play.google.com/store/apps/details?id=com.bitcoin.mwallet" } },
445
+ keplr: { "native": "keplrwallet://", "scheme": "keplrwallet://wcV2", "store": { "ios": "https://apps.apple.com/us/app/keplr-wallet/id1567851089", "android": "https://play.google.com/store/apps/details?id=com.chainapsis.keplr" } },
446
+ cake: { "native": "cakewallet://", "scheme": "cakewallet://wc", "store": { "ios": "https://apps.apple.com/us/app/cake-wallet/id1334702542", "android": "https://play.google.com/store/apps/details?id=com.cakewallet.cake_wallet" } },
447
+ unstoppable: { "native": "unstoppable.money://", "scheme": "unstoppable.money://wc", "store": { "ios": "https://apps.apple.com/us/app/unstoppable-crypto-wallet/id1447619907", "android": "https://play.google.com/store/apps/details?id=io.horizontalsystems.bankwallet" } },
448
+ bifrost: { "native": "bifrostwallet://", "scheme": "bifrostwallet://wc", "store": { "ios": "https://apps.apple.com/us/app/bifrost-wallet/id1577198351", "android": "https://play.google.com/store/apps/details?id=com.bifrostwallet.app" } },
449
+ pintu: { "native": "pintu://web3wallet", "scheme": "pintu://web3wallet/wc", "store": { "ios": "https://apps.apple.com/id/app/pintu-buy-invest-crypto/id1494119678", "android": "https://play.google.com/store/apps/details?id=com.valar.pintu" } },
450
+ hot: { "native": "hotwallet://", "scheme": "hotwallet://wc", "store": { "ios": "https://apps.apple.com/us/app/hot-wallet/id6740916148", "android": "https://play.google.com/store/apps/details?id=app.herewallet.hot" } },
451
+ arculus: { "native": "arculuswc://", "scheme": "arculuswc://wc", "universal": "https://gw.arculus.co/app/wc", "store": { "ios": "https://apps.apple.com/us/app/arculus-wallet/id1575425801", "android": "https://play.google.com/store/apps/details?id=co.arculus.wallet.android" } }
385
452
  };
386
453
 
387
454
  // src/connectors/walletconnect/registry.ts
@@ -482,7 +549,8 @@ var WalletConnectConnector = class extends BaseConnector {
482
549
  if (!walletId) return;
483
550
  const { name, data } = params.event;
484
551
  if (name === "chainChanged") {
485
- const chainId = typeof data === "string" && data.includes(":") ? data : `eip155:${String(data)}`;
552
+ const ns = params.chainId.split(":")[0] ?? "eip155";
553
+ const chainId = typeof data === "string" && data.includes(":") ? data : `${ns}:${String(data)}`;
486
554
  this.emit({ type: "chainChanged", walletId, chainId });
487
555
  } else if (name === "accountsChanged" && Array.isArray(data) && data[0]) {
488
556
  const account = String(data[0]).split(":").pop() ?? "";
@@ -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.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","parseUri","getSdkError"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Connector, ConnectRequest } from './connector';\nimport type { Connection, LydianConnectEvent, LydianConnectEventHandler } from './types';\n\n/**\n * Routing engine: takes a flat list of connectors, auto-detects the fallback\n * (the connector with no claimed walletIds), routes each walletId to its\n * connector, and forwards events. Internal — the host app uses `LydianConnect`.\n */\nexport class ConnectManager {\n private byWallet = new Map<string, Connector>();\n private fallback: Connector;\n private all: Connector[];\n private connections = new Map<string, Connection>();\n private handlers = new Set<LydianConnectEventHandler>();\n private unsubs: Array<() => void> = [];\n private started = false;\n\n constructor(connectors: Connector[]) {\n const fallbacks = connectors.filter((c) => c.walletIds.length === 0);\n if (fallbacks.length !== 1) {\n throw new Error(\n `LydianConnect requires exactly one fallback connector (empty walletIds); found ${fallbacks.length}`,\n );\n }\n this.fallback = fallbacks[0]!;\n this.all = connectors;\n for (const connector of connectors) {\n for (const id of connector.walletIds) this.byWallet.set(id, connector);\n }\n }\n\n /** Wire connector event forwarding, once. */\n async init(): Promise<void> {\n if (this.started) return;\n this.started = true;\n for (const connector of this.all) {\n this.unsubs.push(connector.on((event) => this.handle(event)));\n }\n }\n\n /** SDK connector if one claims this walletId, else the fallback. The host app is oblivious. */\n private resolve(walletId: string): Connector {\n return this.byWallet.get(walletId) ?? this.fallback;\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n if (!this.started) await this.init();\n const connection = await this.resolve(req.walletId).connect(req);\n this.connections.set(req.walletId, connection);\n this.emit({ type: 'connect', walletId: req.walletId, connection });\n return connection;\n }\n\n async restore(): Promise<Connection[]> {\n if (!this.started) await this.init();\n const restored: Connection[] = [];\n for (const connector of this.all) {\n const conns = await connector.restore().catch(() => [] as Connection[]);\n for (const conn of conns) {\n this.connections.set(conn.walletId, conn);\n restored.push(conn);\n }\n }\n return restored;\n }\n\n get(walletId: string): Connection | undefined {\n return this.connections.get(walletId);\n }\n\n async disconnect(walletId?: string): Promise<void> {\n if (walletId) {\n await this.connections.get(walletId)?.disconnect().catch(() => {});\n this.connections.delete(walletId);\n return;\n }\n await Promise.allSettled([...this.connections.values()].map((c) => c.disconnect()));\n this.connections.clear();\n }\n\n async reset(): Promise<void> {\n await this.disconnect();\n await Promise.allSettled(this.all.map((c) => c.reset()));\n }\n\n on(handler: LydianConnectEventHandler): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n private handle(event: LydianConnectEvent): void {\n if (event.type === 'disconnect') this.connections.delete(event.walletId);\n this.emit(event);\n }\n\n private emit(event: LydianConnectEvent): void {\n for (const handler of this.handlers) handler(event);\n }\n}\n","import type { CaipNamespace } from './types';\n\n// Sensible defaults for an EVM payment flow. Internalized so the host app\n// never hand-builds a namespace — it only chooses a chain.\nconst DEFAULT_EVM_METHODS = [\n 'eth_sendTransaction',\n 'personal_sign',\n 'eth_signTypedData_v4',\n 'wallet_switchEthereumChain',\n];\nconst DEFAULT_EVM_EVENTS = ['chainChanged', 'accountsChanged'];\n\n/**\n * Build a CAIP namespace from a chain id.\n * EVM-only for now: a number maps to `eip155:<n>`, and a CAIP-2 string must be\n * `eip155:<reference>`. Non-EVM namespaces (e.g. `solana:…`) would branch here\n * with their own methods/events when that support is added; until then we throw\n * rather than silently apply EVM defaults to a chain that can't use them.\n */\nexport function buildNamespace(chainId: number | string): CaipNamespace {\n const caip = typeof chainId === 'number' ? `eip155:${chainId}` : chainId;\n const [name, reference] = caip.split(':');\n if (name !== 'eip155' || !reference || !/^\\d+$/.test(reference) || Number(reference) <= 0) {\n throw new Error(\n `Unsupported chain \"${caip}\". lydianconnect is EVM-only for now — pass a positive number or an \"eip155:<id>\" string.`,\n );\n }\n return {\n name,\n value: { chains: [caip], methods: DEFAULT_EVM_METHODS, events: DEFAULT_EVM_EVENTS },\n };\n}\n","import type {\n CaipNamespace,\n Connection,\n ConnectorType,\n LydianConnectEvent,\n LydianConnectEventHandler,\n} from './types';\n\nexport interface ConnectRequest {\n walletId: string;\n namespace: CaipNamespace;\n /** Cancel a pending connection (replaces the host app's manual cancel plumbing). */\n signal?: AbortSignal;\n}\n\n/**\n * Internal contract every connector implements. The host app never sees this —\n * it only ever touches {@link LydianConnect} and the {@link Connection} handle.\n */\nexport interface Connector {\n readonly type: ConnectorType;\n /**\n * Wallet ids this connector natively serves. The WalletConnect fallback\n * returns an empty list and claims any wallet not served by another connector.\n */\n readonly walletIds: readonly string[];\n isAvailable(walletId: string): boolean | Promise<boolean>;\n connect(req: ConnectRequest): Promise<Connection>;\n /** Rebuild Connections for still-live sessions — the reconnect-on-reload case. */\n restore(): Promise<Connection[]>;\n /** Tear down everything this connector owns. */\n reset(): Promise<void>;\n on(handler: LydianConnectEventHandler): () => void;\n}\n\nexport abstract class BaseConnector implements Connector {\n abstract readonly type: ConnectorType;\n readonly walletIds: readonly string[] = [];\n\n private handlers = new Set<LydianConnectEventHandler>();\n\n abstract isAvailable(walletId: string): boolean | Promise<boolean>;\n abstract connect(req: ConnectRequest): Promise<Connection>;\n\n async restore(): Promise<Connection[]> {\n return [];\n }\n\n async reset(): Promise<void> {\n /* no-op by default */\n }\n\n on(handler: LydianConnectEventHandler): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n protected emit(event: LydianConnectEvent): void {\n for (const handler of this.handlers) handler(event);\n }\n}\n","/** Shared app identity passed to every connector; mapped to each SDK's own shape internally. */\nexport interface AppConfig {\n /** Display name shown in the wallet's connect prompt. */\n appName: string;\n /** Optional icon shown in the wallet's connect prompt. */\n icon?: string;\n /** Optional description; defaults to appName. */\n description?: string;\n}\n\n/**\n * The dapp URL, derived from the page origin at connect-time (always client-side).\n * Returns '' during SSR — connectors only read this when initializing their SDK,\n * which never happens on the server.\n */\nexport function deriveUrl(): string {\n return typeof window !== 'undefined' ? window.location.origin : '';\n}\n","import type { MetaMaskSDK as MetaMaskSDKType, MetaMaskSDKOptions } from '@metamask/sdk';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { Connection } from '../../core/types';\nimport { type AppConfig, deriveUrl } from '../../core/app';\n\n/** The provider type MetaMaskSDK.getProvider() returns, without depending on a named export. */\ntype MetaMaskProvider = NonNullable<ReturnType<MetaMaskSDKType['getProvider']>>;\n\nconst WALLET_ID = 'metamask';\n\nexport class MetaMaskConnector extends BaseConnector {\n readonly type = 'sdk' as const;\n readonly walletIds = [WALLET_ID] as const;\n\n private sdk: MetaMaskSDKType | null = null;\n private provider: MetaMaskProvider | null = null;\n private listenersBound = false;\n\n constructor(private app: AppConfig) {\n super();\n }\n\n isAvailable(): boolean {\n return true; // SDK covers desktop (extension) and mobile (deep-link) itself\n }\n\n private async getProvider(): Promise<MetaMaskProvider> {\n if (this.provider) return this.provider;\n const { MetaMaskSDK } = await import('@metamask/sdk'); // value import — code-split, loaded on demand\n const dappMetadata: MetaMaskSDKOptions['dappMetadata'] = {\n name: this.app.appName,\n url: deriveUrl(),\n ...(this.app.icon ? { iconUrl: this.app.icon } : {}),\n };\n const sdk = new MetaMaskSDK({ dappMetadata });\n await sdk.init();\n const provider = sdk.getProvider();\n if (!provider) throw new Error('MetaMask provider unavailable');\n this.sdk = sdk;\n this.provider = provider;\n this.bindEvents(provider);\n return provider;\n }\n\n private bindEvents(provider: MetaMaskProvider): void {\n if (this.listenersBound) return;\n this.listenersBound = true;\n provider.on('chainChanged', (hex) => {\n this.emit({ type: 'chainChanged', walletId: WALLET_ID, chainId: toCaip(String(hex)) });\n });\n provider.on('accountsChanged', (accounts) => {\n const account = Array.isArray(accounts) ? (accounts[0] as string | undefined) : undefined;\n if (account) this.emit({ type: 'accountsChanged', walletId: WALLET_ID, account });\n else this.emit({ type: 'disconnect', walletId: WALLET_ID });\n });\n provider.on('disconnect', () => this.emit({ type: 'disconnect', walletId: WALLET_ID }));\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const provider = await this.getProvider();\n const accounts = await provider.request<string[]>({ method: 'eth_requestAccounts' });\n const account = accounts?.[0];\n if (!account) throw new Error('MetaMask returned no account');\n await this.ensureChain(provider, req);\n const chainId = toCaip(await provider.request<string>({ method: 'eth_chainId' }));\n return this.toConnection(provider, account, chainId);\n }\n\n async restore(): Promise<Connection[]> {\n const provider = await this.getProvider().catch(() => null);\n if (!provider) return [];\n const accounts = await provider.request<string[]>({ method: 'eth_accounts' }).catch(() => []);\n const account = accounts?.[0];\n if (!account) return [];\n const chainId = toCaip(\n await provider.request<string>({ method: 'eth_chainId' }).catch(() => '0x1'),\n );\n return [this.toConnection(provider, account, chainId)];\n }\n\n async reset(): Promise<void> {\n await this.sdk?.terminate();\n this.provider = null;\n this.listenersBound = false;\n }\n\n /** Best-effort switch to the requested chain; leaves the wallet as-is if it's unknown to it. */\n private async ensureChain(provider: MetaMaskProvider, req: ConnectRequest): Promise<void> {\n const wanted = req.namespace.value.chains?.[0]; // \"eip155:137\"\n const wantedNum = wanted ? Number(wanted.split(':')[1]) : NaN;\n if (!Number.isFinite(wantedNum) || wantedNum <= 0) return;\n const current = parseInt(\n (await provider.request<string>({ method: 'eth_chainId' }).catch(() => '0x0')) ?? '0x0',\n 16,\n );\n if (current === wantedNum) return;\n await provider\n .request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: `0x${wantedNum.toString(16)}` }],\n })\n .catch(() => {\n /* chain not added to the wallet — the caller's chainChanged will reflect reality */\n });\n }\n\n private toConnection(provider: MetaMaskProvider, account: string, chainId: string): Connection {\n return {\n walletId: WALLET_ID,\n account,\n chainId,\n request: async <T>(args: { method: string; params?: unknown }) =>\n (await provider.request<T>({ method: args.method, params: args.params as never })) as T,\n openWallet: () => {}, // MetaMask SDK foregrounds the wallet on request\n disconnect: async () => {\n await this.sdk?.terminate();\n this.provider = null;\n this.listenersBound = false;\n this.emit({ type: 'disconnect', walletId: WALLET_ID });\n },\n };\n }\n}\n\nfunction toCaip(hexChainId: string | null | undefined): string {\n if (!hexChainId) return 'eip155:1';\n const num = hexChainId.startsWith('0x') ? parseInt(hexChainId, 16) : Number(hexChainId);\n return `eip155:${Number.isFinite(num) ? num : 1}`;\n}\n","import type { CoinbaseWalletSDK as CoinbaseWalletSDKType } from '@coinbase/wallet-sdk';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { Connection } from '../../core/types';\nimport type { AppConfig } from '../../core/app';\n\ntype CoinbaseProvider = NonNullable<ReturnType<CoinbaseWalletSDKType['makeWeb3Provider']>>;\ntype RequestArgs = Parameters<CoinbaseProvider['request']>[0];\n\n/** Coinbase v4's provider.request is non-generic and returns unknown; wrap + cast. */\nfunction rpc<T>(provider: CoinbaseProvider, method: string, params?: unknown): Promise<T> {\n return provider.request({ method, params } as unknown as RequestArgs) as Promise<T>;\n}\n\nconst WALLET_ID = 'coinbase';\n\nexport class CoinbaseConnector extends BaseConnector {\n readonly type = 'sdk' as const;\n readonly walletIds = [WALLET_ID] as const;\n\n private provider: CoinbaseProvider | null = null;\n private listenersBound = false;\n\n constructor(private app: AppConfig) {\n super();\n }\n\n isAvailable(): boolean {\n return true; // SDK covers extension + mobile deep-link itself\n }\n\n private async getProvider(appChainIds?: number[]): Promise<CoinbaseProvider> {\n if (this.provider) return this.provider;\n const { CoinbaseWalletSDK } = await import('@coinbase/wallet-sdk'); // lazy — code-split\n const sdk = new CoinbaseWalletSDK({\n appName: this.app.appName,\n appLogoUrl: this.app.icon,\n appChainIds, // one-time SDK-init hint; ensureChain enforces the actual chain per connect\n });\n const provider = sdk.makeWeb3Provider();\n this.provider = provider;\n this.bindEvents(provider);\n return provider;\n }\n\n private bindEvents(provider: CoinbaseProvider): void {\n if (this.listenersBound) return;\n this.listenersBound = true;\n provider.on('chainChanged', (hex) => {\n this.emit({ type: 'chainChanged', walletId: WALLET_ID, chainId: toCaip(String(hex)) });\n });\n provider.on('accountsChanged', (accounts) => {\n const account = Array.isArray(accounts) ? (accounts[0] as string | undefined) : undefined;\n if (account) this.emit({ type: 'accountsChanged', walletId: WALLET_ID, account });\n else this.emit({ type: 'disconnect', walletId: WALLET_ID });\n });\n provider.on('disconnect', () => this.emit({ type: 'disconnect', walletId: WALLET_ID }));\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const provider = await this.getProvider(evmChainIds(req));\n const accounts = await rpc<string[]>(provider, 'eth_requestAccounts');\n const account = accounts?.[0];\n if (!account) throw new Error('Coinbase Wallet returned no account');\n await this.ensureChain(provider, req);\n const chainId = toCaip(await rpc<string>(provider, 'eth_chainId'));\n return this.toConnection(provider, account, chainId);\n }\n\n async restore(): Promise<Connection[]> {\n const provider = await this.getProvider().catch(() => null);\n if (!provider) return [];\n const accounts = await rpc<string[]>(provider, 'eth_accounts').catch(() => [] as string[]);\n const account = accounts?.[0];\n if (!account) return [];\n const chainId = toCaip(await rpc<string>(provider, 'eth_chainId').catch(() => '0x1'));\n return [this.toConnection(provider, account, chainId)];\n }\n\n async reset(): Promise<void> {\n await this.provider?.disconnect().catch(() => {});\n this.provider = null;\n this.listenersBound = false;\n }\n\n private async ensureChain(provider: CoinbaseProvider, req: ConnectRequest): Promise<void> {\n const wanted = req.namespace.value.chains?.[0];\n const wantedNum = wanted ? Number(wanted.split(':')[1]) : NaN;\n if (!Number.isFinite(wantedNum) || wantedNum <= 0) return;\n const current = parseInt(\n (await rpc<string>(provider, 'eth_chainId').catch(() => '0x0')) ?? '0x0',\n 16,\n );\n if (current === wantedNum) return;\n await rpc(provider, 'wallet_switchEthereumChain', [{ chainId: `0x${wantedNum.toString(16)}` }]).catch(\n () => {},\n );\n }\n\n private toConnection(provider: CoinbaseProvider, account: string, chainId: string): Connection {\n return {\n walletId: WALLET_ID,\n account,\n chainId,\n request: <T>(args: { method: string; params?: unknown }) =>\n rpc<T>(provider, args.method, args.params),\n openWallet: () => {}, // Coinbase SDK foregrounds the wallet on request\n disconnect: async () => {\n await provider.disconnect().catch(() => {});\n this.provider = null;\n this.listenersBound = false;\n this.emit({ type: 'disconnect', walletId: WALLET_ID });\n },\n };\n }\n}\n\nfunction toCaip(hexChainId: string | null | undefined): string {\n if (!hexChainId) return 'eip155:1';\n const num = hexChainId.startsWith('0x') ? parseInt(hexChainId, 16) : Number(hexChainId);\n return `eip155:${Number.isFinite(num) ? num : 1}`;\n}\n\n/** The numeric EVM chain id the connect targets, for Coinbase's appChainIds hint. */\nfunction evmChainIds(req: ConnectRequest): number[] | undefined {\n const wanted = req.namespace.value.chains?.[0];\n const n = wanted ? Number(wanted.split(':')[1]) : NaN;\n return Number.isFinite(n) && n > 0 ? [n] : undefined;\n}\n","// Wallet deep-link registry — hand-maintained.\n// Originally seeded from the WalletConnect explorer API; edit entries directly now.\n// Per entry: native = bare app scheme (foreground only); scheme = WC connect deep\n// link (we append `?uri=`); universal = fallback only; store = not-installed links.\nimport type { WalletLink } from './registry';\n\nexport const WALLET_LINKS: Record<string, WalletLink> = {\n metamask: {\"native\":\"metamask://\",\"scheme\":\"metamask://wc\",\"universal\":\"https://metamask.app.link/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/metamask/id1438144202\",\"android\":\"https://play.google.com/store/apps/details?id=io.metamask\"}},\n trust: {\"native\":\"trust://\",\"scheme\":\"trust://wc\",\"universal\":\"https://link.trustwallet.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/apple-store/id1288339409\",\"android\":\"https://play.google.com/store/apps/details?id=com.wallet.crypto.trustapp\"}},\n rainbow: {\"native\":\"rainbow://\",\"scheme\":\"rainbow://wc\",\"universal\":\"https://rnbwapp.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/apple-store/id1457119021?pt=119997837&ct=wc&mt=8\",\"android\":\"https://play.google.com/store/apps/details?id=me.rainbow&referrer=utm_source%3Dwc%26utm_medium%3Dconnector%26utm_campaign%3Dwc\"}},\n coinbase: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/base-formerly-coinbase-wallet/id1278383455\"}},\n zerion: {\"native\":\"zerion://\",\"scheme\":\"zerion://wc\",\"universal\":\"https://wallet.zerion.io/wc/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/id1456732565\",\"android\":\"https://play.google.com/store/apps/details?id=io.zerion.android&hl=en&gl=US\"}},\n tokenpocket: {\"native\":\"tpoutside://\",\"scheme\":\"tpoutside://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/tp-wallet/id6444625622?l=en\",\"android\":\"https://play.google.com/store/apps/details?id=vip.mytokenpocket\"}},\n blockchaincom: {\"native\":\"blockchain-wallet://\",\"scheme\":\"blockchain-wallet://wc\",\"universal\":\"https://login.blockchain.com/app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/blockchain-bitcoin-wallet/id493253309\",\"android\":\"https://play.google.com/store/apps/details?id=piuk.blockchain.android\"}},\n exodus: {\"native\":\"exodus://\",\"scheme\":\"exodus://wc\",\"universal\":\"https://exodus.com/m/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/exodus-crypto-bitcoin-wallet/id1414384820\",\"android\":\"https://play.google.com/store/apps/details?id=exodusmovement.exodus&hl=en&gl=US\"}},\n phantom: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/phantom-crypto-wallet/id1598432977\",\"android\":\"https://play.google.com/store/apps/details?id=app.phantom&hl=en\"}},\n okx: {\"native\":\"okxwallet://main\",\"scheme\":\"okxwallet://main/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/okx-buy-bitcoin-eth-crypto/id1327268470\",\"android\":\"https://play.google.com/store/apps/details?id=com.okinc.okex.gp\"}},\n cryptocom: {\"native\":\"cryptowallet://\",\"scheme\":\"cryptowallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/US/app/id1512048310?mt=8\",\"android\":\"https://play.google.com/store/apps/details?id=com.defi.wallet\"}},\n argent: {\"native\":\"argent://app/\",\"scheme\":\"argent://app/wc\",\"universal\":\"https://www.argent.xyz/app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/argent-defi-in-a-tap/id1358741926\",\"android\":\"https://play.google.com/store/apps/details?id=im.argent.contractwalletclient&hl=en&gl=US&pli=1\"}},\n safepal: {\"native\":\"safepalwallet://\",\"scheme\":\"safepalwallet://wc\",\"universal\":\"https://link.safepal.io/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/safepal-wallet/id1548297139\",\"android\":\"https://play.google.com/store/apps/details?id=io.safepal.wallet\"}},\n imtoken: {\"native\":\"imtokenv2://\",\"scheme\":\"imtokenv2://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/imtoken2/id1384798940\",\"android\":\"https://play.google.com/store/apps/details?id=im.token.app\"}},\n ronin: {\"native\":\"roninwallet://\",\"scheme\":\"roninwallet://wc\",\"universal\":\"https://wallet.roninchain.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/ronin-wallet/id1592675001\",\"android\":\"https://play.google.com/store/apps/details?id=com.skymavis.genesis\"}},\n coin98: {\"native\":\"coin98://\",\"scheme\":\"coin98://wc\",\"universal\":\"https://coin98.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/vn/app/coin98-wallet/id1561969966\",\"android\":\"https://play.google.com/store/apps/details?id=coin98.crypto.finance.media&hl=vi&gl=US\"}},\n bitkeep: {\"native\":\"bitkeep://\",\"scheme\":\"bitkeep://wc\",\"universal\":\"https://bkapp.vip/wc\",\"store\":{\"ios\":\"https://web3.bitget.com/en/wallet-download?type=0\",\"android\":\"https://web3.bitget.com/en/wallet-download?type=0\"}},\n \"1inch\": {\"native\":\"oneinch://open/nobodywilleveruseit\",\"scheme\":\"oneinch://open/nobodywilleveruseit/wc\",\"universal\":\"https://wallet.1inch.io/app/nobodywilleveruseit/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/1inch-defi-wallet/id1546049391\",\"android\":\"https://play.google.com/store/apps/details?id=io.oneinch.android\"}},\n ledgerlive: {\"native\":\"ledgerlive://\",\"scheme\":\"ledgerlive://wc\",\"store\":{\"ios\":\"https://itunes.apple.com/app/id1361671700\",\"android\":\"https://play.google.com/store/apps/details?id=com.ledger.live\"}},\n atomic: {\"native\":\"atomicwallet://\",\"scheme\":\"atomicwallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/atomic-wallet/id1478257827\",\"android\":\"https://play.google.com/store/apps/details?id=io.atomicwallet\"}},\n alpha: {\"native\":\"awallet://\",\"scheme\":\"awallet://wc\",\"universal\":\"https://aw.app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/alphawallet-eth-wallet/id1358230430\",\"android\":\"https://play.google.com/store/apps/details?id=io.stormbird.wallet\"}},\n math: {\"native\":\"mathwallet://\",\"scheme\":\"mathwallet://wc\",\"universal\":\"https://www.mathwallet.org/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/mathwallet5/id1582612388\",\"android\":\"https://play.google.com/store/apps/details?id=com.mathwallet.android\"}},\n bitpay: {\"native\":\"bitpay://\",\"scheme\":\"bitpay://wc\",\"universal\":\"https://link.bitpay.com/wc\",\"store\":{\"ios\":\"https://bitpay.onelink.me/Cenw/ejjaw7bs\",\"android\":\"https://bitpay.onelink.me/Cenw/ejjaw7bs\"}},\n};\n","import { WALLET_LINKS } from './wallet-links';\n\nexport interface WalletLink {\n /** App scheme used to foreground the wallet — without the `wc` suffix; may include a path (e.g. \"okxwallet://main\"). */\n native?: string;\n /** Custom scheme deep link incl. the `wc` path; we append `?uri=`. e.g. \"metamask://wc\". Preferred on mobile (same-tab). */\n scheme?: string;\n /** Universal/applink incl. the `wc` path. Fallback only — used when no `scheme` exists. */\n universal?: string;\n /** App store links — used for the \"wallet not installed\" fallback. */\n store?: { ios?: string; android?: string };\n}\n\nexport const DEFAULT_WALLET_LINKS: Record<string, WalletLink> = WALLET_LINKS;\n","import type { WalletLink } from './registry';\n\nexport function isMobile(): boolean {\n if (typeof navigator === 'undefined') return false;\n const ua = navigator.userAgent || '';\n const uaDataMobile =\n (navigator as { userAgentData?: { mobile?: boolean } }).userAgentData?.mobile ?? false;\n return /iPhone|iPad|iPod|Android/i.test(ua) || uaDataMobile;\n}\n\nfunction buildLink(base: string, uri: string): string {\n const sep = base.includes('?') ? '&' : '?';\n return `${base}${sep}uri=${encodeURIComponent(uri)}`;\n}\n\n/**\n * Open the wallet for a WalletConnect pairing on mobile. Custom scheme first, in\n * the SAME TAB — that reliably foregrounds an installed app and, unlike a\n * _blank/popup navigation, is NOT suppressed once the click gesture has been lost\n * (which it has by the time connect() reaches here, after the async pairing setup).\n * Universal link is only a fallback for the rare wallet with no custom scheme.\n * The not-installed case is handled by the connector via detectAppOpen().\n */\nexport function openWallet(link: WalletLink, uri: string): void {\n if (typeof document === 'undefined') return;\n if (link.scheme) {\n openHref(buildLink(link.scheme, uri), false);\n } else if (link.universal) {\n openHref(buildLink(link.universal, uri), false);\n }\n}\n\n/**\n * Bring the wallet app to the foreground (no WC URI) — for an approval the user\n * must return to the wallet for. Uses the bare `native` scheme; call within a gesture.\n */\nexport function openWalletApp(link: WalletLink): void {\n if (typeof document === 'undefined') return;\n if (!link.native) return;\n openHref(link.native, false);\n}\n\nfunction openHref(href: string, newContext: boolean): void {\n const a = document.createElement('a');\n a.href = href;\n if (newContext) {\n a.target = '_blank';\n a.rel = 'noopener noreferrer';\n }\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n}\n\n/** Resolves true if the page was backgrounded (wallet likely opened) within the window. */\nexport function detectAppOpen(timeoutMs: number): Promise<boolean> {\n if (typeof document === 'undefined') return Promise.resolve(false);\n return new Promise((resolve) => {\n let done = false;\n const finish = (opened: boolean) => {\n if (done) return;\n done = true;\n document.removeEventListener('visibilitychange', onVisibility);\n window.removeEventListener('pagehide', onPageHide);\n clearTimeout(timer);\n resolve(opened);\n };\n const onVisibility = () => {\n if (document.hidden) finish(true);\n };\n const onPageHide = () => finish(true);\n document.addEventListener('visibilitychange', onVisibility);\n window.addEventListener('pagehide', onPageHide);\n const timer = setTimeout(() => finish(false), timeoutMs);\n });\n}\n","import SignClient from '@walletconnect/sign-client';\nimport { getSdkError, parseUri } 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\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 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 const { uri, approval } = await client.connect({\n requiredNamespaces: { [req.namespace.name]: req.namespace.value },\n });\n if (!uri) throw new Error('WalletConnect did not return a pairing URI');\n\n this.emit({ type: 'display_uri', walletId: req.walletId, uri });\n\n if (isMobile()) {\n const link = this.links[req.walletId];\n if (link) {\n openWallet(link, uri);\n void detectAppOpen(this.options.openTimeoutMs ?? 2000).then((opened) => {\n if (!opened)\n this.emit({\n type: 'wallet_open_failed',\n walletId: req.walletId,\n uri,\n store: link.store,\n });\n });\n }\n }\n\n const pairingTopic = parseUri(uri).topic;\n const session = await withSignal(approval(), req.signal, () => {\n void client.core.pairing.disconnect({ topic: pairingTopic }).catch(() => {});\n });\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 }\n\n // --- helpers ---\n\n private tryReuse(client: SignClient, req: ConnectRequest): Connection | null {\n const topic = this.topics.get(req.walletId);\n if (!topic) return null;\n const session = this.liveSession(client, topic);\n if (!session) {\n this.topics.delete(req.walletId);\n return null;\n }\n const ns = session.namespaces[req.namespace.name];\n const wanted = req.namespace.value.chains?.[0];\n if (!ns || (wanted && !ns.chains?.includes(wanted))) return null;\n return this.toConnection(client, req.walletId, session, req.namespace);\n }\n\n private toConnection(\n client: SignClient,\n walletId: string,\n session: SessionTypes.Struct,\n namespace: CaipNamespace,\n ): Connection {\n const ns = session.namespaces[namespace.name];\n const account =\n (ns?.accounts ?? []).map((a) => a.split(':')[2]).find((a): a is string => !!a) ?? '';\n const chainId =\n ns?.chains?.[0] ??\n (ns?.accounts?.[0] ? ns.accounts[0].split(':').slice(0, 2).join(':') : `${namespace.name}:1`);\n const topic = session.topic;\n return {\n walletId,\n account,\n chainId,\n request: <T>(args: { method: string; params?: unknown }) =>\n client.request<T>({\n topic,\n chainId,\n request: { method: args.method, params: args.params as never },\n }),\n openWallet: () => {\n if (!isMobile()) return;\n const link = this.links[walletId];\n if (link) openWalletApp(link);\n },\n disconnect: async () => {\n await client.disconnect({ topic, reason: getSdkError('USER_DISCONNECTED') }).catch(() => {});\n this.topics.delete(walletId);\n this.persist();\n this.emit({ type: 'disconnect', walletId });\n },\n };\n }\n\n private liveSession(client: SignClient, topic: string): SessionTypes.Struct | undefined {\n try {\n return client.session.get(topic);\n } catch {\n return undefined;\n }\n }\n\n private walletForTopic(topic: string): string | null {\n for (const [walletId, t] of this.topics) if (t === topic) return walletId;\n return null;\n }\n\n private persist(): void {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify([...this.topics]));\n } catch {\n /* SSR / no storage */\n }\n }\n\n private load(): void {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (raw) this.topics = new Map(JSON.parse(raw) as Array<[string, string]>);\n } catch {\n /* SSR / no storage */\n }\n }\n}\n\nfunction firstNamespace(session: SessionTypes.Struct): CaipNamespace | null {\n const name = Object.keys(session.namespaces)[0];\n if (!name) return null;\n const v = session.namespaces[name];\n if (!v) return null;\n return { name, value: { chains: v.chains, methods: v.methods, events: v.events } };\n}\n\nfunction withSignal<T>(\n promise: Promise<T>,\n signal: AbortSignal | undefined,\n onAbort: () => void,\n): Promise<T> {\n if (!signal) return promise;\n if (signal.aborted) {\n onAbort();\n return Promise.reject(new DOMException('Aborted', 'AbortError'));\n }\n return new Promise<T>((resolve, reject) => {\n const abortHandler = () => {\n onAbort();\n reject(new DOMException('Aborted', 'AbortError'));\n };\n signal.addEventListener('abort', abortHandler, { once: true });\n promise.then(\n (v) => {\n signal.removeEventListener('abort', abortHandler);\n resolve(v);\n },\n (e) => {\n signal.removeEventListener('abort', abortHandler);\n reject(e);\n },\n );\n });\n}\n","import { ConnectManager } from './manager';\nimport { buildNamespace } from './namespace';\nimport type { Connector } from './connector';\nimport type { AppConfig } from './app';\nimport type {\n ConnectInput,\n Connection,\n LydianConnectConfig,\n LydianConnectEventHandler,\n} from './types';\nimport { MetaMaskConnector } from '../connectors/metamask/connector';\nimport { CoinbaseConnector } from '../connectors/coinbase/connector';\nimport { WalletConnectConnector } from '../connectors/walletconnect/connector';\n\n/**\n * The library-owned connector set. Adding a new wallet SDK is a change HERE —\n * consumers get it on `npm update` with no code change. SDK code stays\n * code-split (lazy `import()` inside each connector), so registering a\n * connector adds ~nothing to the host app's initial bundle.\n */\nfunction createConnectors(config: LydianConnectConfig): Connector[] {\n const app: AppConfig = {\n appName: config.appName,\n icon: config.icon,\n description: config.description,\n };\n return [\n new MetaMaskConnector(app),\n new CoinbaseConnector(app),\n new WalletConnectConnector(app, { projectId: config.walletConnectProjectId }),\n ];\n}\n\n/**\n * The single surface the host app touches. Hand it a flat config; it owns the\n * connectors and routes each wallet to its native SDK (or the WalletConnect\n * fallback), returning a uniform {@link Connection} either way.\n */\nexport class LydianConnect {\n private manager: ConnectManager;\n\n constructor(config: LydianConnectConfig) {\n this.manager = new ConnectManager(createConnectors(config));\n }\n\n init(): Promise<void> {\n return this.manager.init();\n }\n\n async connect(input: ConnectInput): Promise<Connection> {\n if (input.chainId === undefined || input.chainId === null) {\n throw new Error('connect() requires a chainId (a number like 137 or an \"eip155:<id>\" string)');\n }\n return this.manager.connect({\n walletId: input.walletId,\n namespace: buildNamespace(input.chainId),\n signal: input.signal,\n });\n }\n\n restore(): Promise<Connection[]> {\n return this.manager.restore();\n }\n\n disconnect(walletId?: string): Promise<void> {\n return this.manager.disconnect(walletId);\n }\n\n reset(): Promise<void> {\n return this.manager.reset();\n }\n\n get(walletId: string): Connection | undefined {\n return this.manager.get(walletId);\n }\n\n on(handler: LydianConnectEventHandler): () => void {\n return this.manager.on(handler);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/core/manager.ts","../src/core/namespace.ts","../src/core/connector.ts","../src/core/app.ts","../src/connectors/metamask/connector.ts","../src/connectors/coinbase/connector.ts","../src/connectors/walletconnect/wallet-links.ts","../src/connectors/walletconnect/registry.ts","../src/connectors/walletconnect/deeplink.ts","../src/connectors/walletconnect/connector.ts","../src/core/lydian-connect.ts"],"names":["WALLET_ID","toCaip","SignClient","parseUri","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 /**\n * SDK connector if one claims this walletId AND serves the requested\n * namespace, else the fallback. So an EVM-only SDK connector is bypassed to\n * WalletConnect for a non-EVM chain. The host app is oblivious.\n */\n private resolve(walletId: string, namespaceName: string): Connector {\n const claimed = this.byWallet.get(walletId);\n if (claimed && claimed.servesNamespace(namespaceName)) return claimed;\n return 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, req.namespace.name).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// Per-namespace method/event sets. A bare number is always EVM (back-compat).\n// tron/ton are intentionally absent — not WalletConnect-reachable, so they're\n// payment-by-QR only and must not negotiate a wallet session here.\nconst NAMESPACE_DEFAULTS: Record<string, { methods: string[]; events: string[] }> = {\n eip155: {\n methods: [\n 'eth_sendTransaction',\n 'personal_sign',\n 'eth_signTypedData_v4',\n 'wallet_switchEthereumChain',\n ],\n events: ['chainChanged', 'accountsChanged'],\n },\n solana: {\n methods: ['solana_signTransaction', 'solana_signMessage', 'solana_signAndSendTransaction'],\n events: [],\n },\n bip122: {\n methods: ['sendTransfer', 'signMessage', 'signPsbt', 'getAccountAddresses'],\n events: ['bip122_addressesChanged'],\n },\n};\n\n/**\n * Build a CAIP namespace from a chain id.\n * A number maps to `eip155:<n>` (the EVM back-compat path); a CAIP-2 string\n * `<namespace>:<reference>` is honored if the namespace is one we connect.\n * Unsupported namespaces (e.g. `tron:`, `ton:`) throw rather than silently\n * applying defaults to a chain we can't negotiate a session for.\n */\nexport function buildNamespace(chainId: number | string): CaipNamespace {\n const caip = typeof chainId === 'number' ? `eip155:${chainId}` : chainId;\n const [name, reference] = caip.split(':');\n const defaults = name ? NAMESPACE_DEFAULTS[name] : undefined;\n if (!name || !defaults || !reference) {\n throw new Error(\n `Unsupported chain \"${caip}\". lydianconnect connects ${Object.keys(NAMESPACE_DEFAULTS).join(', ')} — ` +\n `pass a number (EVM) or a \"<namespace>:<reference>\" CAIP-2 id.`,\n );\n }\n // eip155 references are positive integers; non-EVM references are opaque ids.\n if (name === 'eip155' && !(/^\\d+$/.test(reference) && Number(reference) > 0)) {\n throw new Error(`Invalid eip155 chain \"${caip}\" — the reference must be a positive integer.`);\n }\n return {\n name,\n value: { chains: [caip], methods: defaults.methods, events: defaults.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 /** Namespace families this connector can connect on. The WalletConnect\n * fallback serves all; SDK connectors restrict to what their SDK speaks. */\n servesNamespace(namespaceName: string): boolean;\n isAvailable(walletId: string): boolean | Promise<boolean>;\n connect(req: ConnectRequest): Promise<Connection>;\n /** Rebuild Connections for still-live sessions — the reconnect-on-reload case. */\n restore(): Promise<Connection[]>;\n /** Tear down everything this connector owns. */\n reset(): Promise<void>;\n on(handler: LydianConnectEventHandler): () => void;\n}\n\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 servesNamespace(_namespaceName: string): boolean {\n return true;\n }\n\n async restore(): Promise<Connection[]> {\n return [];\n }\n\n async reset(): Promise<void> {\n /* no-op by default */\n }\n\n on(handler: LydianConnectEventHandler): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n 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 servesNamespace(name: string): boolean {\n return name === 'eip155'; // MetaMask SDK speaks EVM only\n }\n\n private async getProvider(): Promise<MetaMaskProvider> {\n if (this.provider) return this.provider;\n const { MetaMaskSDK } = await import('@metamask/sdk'); // value import — code-split, loaded on demand\n const dappMetadata: MetaMaskSDKOptions['dappMetadata'] = {\n name: this.app.appName,\n url: deriveUrl(),\n ...(this.app.icon ? { iconUrl: this.app.icon } : {}),\n };\n const sdk = new MetaMaskSDK({ dappMetadata });\n await sdk.init();\n const provider = sdk.getProvider();\n if (!provider) throw new Error('MetaMask provider unavailable');\n this.sdk = sdk;\n this.provider = provider;\n this.bindEvents(provider);\n return provider;\n }\n\n private bindEvents(provider: MetaMaskProvider): void {\n if (this.listenersBound) return;\n this.listenersBound = true;\n provider.on('chainChanged', (hex) => {\n this.emit({ 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 servesNamespace(name: string): boolean {\n return name === 'eip155'; // Coinbase Wallet SDK provider speaks EVM only\n }\n\n private async getProvider(appChainIds?: number[]): Promise<CoinbaseProvider> {\n if (this.provider) return this.provider;\n const { CoinbaseWalletSDK } = await import('@coinbase/wallet-sdk'); // lazy — code-split\n const sdk = new CoinbaseWalletSDK({\n appName: this.app.appName,\n appLogoUrl: this.app.icon,\n appChainIds, // one-time SDK-init hint; ensureChain enforces the actual chain per connect\n });\n const provider = sdk.makeWeb3Provider();\n this.provider = provider;\n this.bindEvents(provider);\n return provider;\n }\n\n private bindEvents(provider: CoinbaseProvider): void {\n if (this.listenersBound) return;\n this.listenersBound = true;\n provider.on('chainChanged', (hex) => {\n this.emit({ type: 'chainChanged', walletId: WALLET_ID, chainId: toCaip(String(hex)) });\n });\n provider.on('accountsChanged', (accounts) => {\n const account = Array.isArray(accounts) ? (accounts[0] as string | undefined) : undefined;\n if (account) this.emit({ type: 'accountsChanged', walletId: WALLET_ID, account });\n else this.emit({ type: 'disconnect', walletId: WALLET_ID });\n });\n provider.on('disconnect', () => this.emit({ type: 'disconnect', walletId: WALLET_ID }));\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const provider = await this.getProvider(evmChainIds(req));\n const accounts = await rpc<string[]>(provider, 'eth_requestAccounts');\n const account = accounts?.[0];\n if (!account) throw new Error('Coinbase Wallet returned no account');\n await this.ensureChain(provider, req);\n const chainId = toCaip(await rpc<string>(provider, 'eth_chainId'));\n return this.toConnection(provider, account, chainId);\n }\n\n async restore(): Promise<Connection[]> {\n const provider = await this.getProvider().catch(() => null);\n if (!provider) return [];\n const accounts = await rpc<string[]>(provider, 'eth_accounts').catch(() => [] as string[]);\n const account = accounts?.[0];\n if (!account) return [];\n const chainId = toCaip(await rpc<string>(provider, 'eth_chainId').catch(() => '0x1'));\n return [this.toConnection(provider, account, chainId)];\n }\n\n async reset(): Promise<void> {\n await this.provider?.disconnect().catch(() => {});\n this.provider = null;\n this.listenersBound = false;\n }\n\n private async ensureChain(provider: CoinbaseProvider, req: ConnectRequest): Promise<void> {\n const wanted = req.namespace.value.chains?.[0];\n const wantedNum = wanted ? Number(wanted.split(':')[1]) : NaN;\n if (!Number.isFinite(wantedNum) || wantedNum <= 0) return;\n const current = parseInt(\n (await rpc<string>(provider, 'eth_chainId').catch(() => '0x0')) ?? '0x0',\n 16,\n );\n if (current === wantedNum) return;\n await rpc(provider, 'wallet_switchEthereumChain', [{ chainId: `0x${wantedNum.toString(16)}` }]).catch(\n () => {},\n );\n }\n\n private toConnection(provider: CoinbaseProvider, account: string, chainId: string): Connection {\n return {\n walletId: WALLET_ID,\n account,\n chainId,\n request: <T>(args: { method: string; params?: unknown }) =>\n rpc<T>(provider, args.method, args.params),\n openWallet: () => {}, // Coinbase SDK foregrounds the wallet on request\n disconnect: async () => {\n await provider.disconnect().catch(() => {});\n this.provider = null;\n this.listenersBound = false;\n this.emit({ type: 'disconnect', walletId: WALLET_ID });\n },\n };\n }\n}\n\nfunction toCaip(hexChainId: string | null | undefined): string {\n if (!hexChainId) return 'eip155:1';\n const num = hexChainId.startsWith('0x') ? parseInt(hexChainId, 16) : Number(hexChainId);\n return `eip155:${Number.isFinite(num) ? num : 1}`;\n}\n\n/** The numeric EVM chain id the connect targets, for Coinbase's appChainIds hint. */\nfunction evmChainIds(req: ConnectRequest): number[] | undefined {\n const wanted = req.namespace.value.chains?.[0];\n const n = wanted ? Number(wanted.split(':')[1]) : NaN;\n return Number.isFinite(n) && n > 0 ? [n] : undefined;\n}\n","// Wallet deep-link registry — hand-maintained.\n// Originally seeded from the WalletConnect explorer API; edit entries directly now.\n// Per entry: native = bare app scheme (foreground only); scheme = WC connect deep\n// link (we append `?uri=`); universal = fallback only; store = not-installed links.\nimport type { WalletLink } from './registry';\n\nexport const WALLET_LINKS: Record<string, WalletLink> = {\n metamask: {\"native\":\"metamask://\",\"scheme\":\"metamask://wc\",\"universal\":\"https://metamask.app.link/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/metamask/id1438144202\",\"android\":\"https://play.google.com/store/apps/details?id=io.metamask\"}},\n trust: {\"native\":\"trust://\",\"scheme\":\"trust://wc\",\"universal\":\"https://link.trustwallet.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/apple-store/id1288339409\",\"android\":\"https://play.google.com/store/apps/details?id=com.wallet.crypto.trustapp\"}},\n rainbow: {\"native\":\"rainbow://\",\"scheme\":\"rainbow://wc\",\"universal\":\"https://rnbwapp.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/apple-store/id1457119021?pt=119997837&ct=wc&mt=8\",\"android\":\"https://play.google.com/store/apps/details?id=me.rainbow&referrer=utm_source%3Dwc%26utm_medium%3Dconnector%26utm_campaign%3Dwc\"}},\n coinbase: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/base-formerly-coinbase-wallet/id1278383455\"}},\n zerion: {\"native\":\"zerion://\",\"scheme\":\"zerion://wc\",\"universal\":\"https://wallet.zerion.io/wc/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/id1456732565\",\"android\":\"https://play.google.com/store/apps/details?id=io.zerion.android&hl=en&gl=US\"}},\n tokenpocket: {\"native\":\"tpoutside://\",\"scheme\":\"tpoutside://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/tp-wallet/id6444625622?l=en\",\"android\":\"https://play.google.com/store/apps/details?id=vip.mytokenpocket\"}},\n blockchaincom: {\"native\":\"blockchain-wallet://\",\"scheme\":\"blockchain-wallet://wc\",\"universal\":\"https://login.blockchain.com/app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/blockchain-bitcoin-wallet/id493253309\",\"android\":\"https://play.google.com/store/apps/details?id=piuk.blockchain.android\"}},\n exodus: {\"native\":\"exodus://\",\"scheme\":\"exodus://wc\",\"universal\":\"https://exodus.com/m/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/exodus-crypto-bitcoin-wallet/id1414384820\",\"android\":\"https://play.google.com/store/apps/details?id=exodusmovement.exodus&hl=en&gl=US\"}},\n phantom: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/phantom-crypto-wallet/id1598432977\",\"android\":\"https://play.google.com/store/apps/details?id=app.phantom&hl=en\"}},\n okx: {\"native\":\"okxwallet://main\",\"scheme\":\"okxwallet://main/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/okx-buy-bitcoin-eth-crypto/id1327268470\",\"android\":\"https://play.google.com/store/apps/details?id=com.okinc.okex.gp\"}},\n cryptocom: {\"native\":\"cryptowallet://\",\"scheme\":\"cryptowallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/US/app/id1512048310?mt=8\",\"android\":\"https://play.google.com/store/apps/details?id=com.defi.wallet\"}},\n argent: {\"native\":\"argent://app/\",\"scheme\":\"argent://app/wc\",\"universal\":\"https://www.argent.xyz/app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/argent-defi-in-a-tap/id1358741926\",\"android\":\"https://play.google.com/store/apps/details?id=im.argent.contractwalletclient&hl=en&gl=US&pli=1\"}},\n safepal: {\"native\":\"safepalwallet://\",\"scheme\":\"safepalwallet://wc\",\"universal\":\"https://link.safepal.io/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/safepal-wallet/id1548297139\",\"android\":\"https://play.google.com/store/apps/details?id=io.safepal.wallet\"}},\n imtoken: {\"native\":\"imtokenv2://\",\"scheme\":\"imtokenv2://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/imtoken2/id1384798940\",\"android\":\"https://play.google.com/store/apps/details?id=im.token.app\"}},\n ronin: {\"native\":\"roninwallet://\",\"scheme\":\"roninwallet://wc\",\"universal\":\"https://wallet.roninchain.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/ronin-wallet/id1592675001\",\"android\":\"https://play.google.com/store/apps/details?id=com.skymavis.genesis\"}},\n coin98: {\"native\":\"coin98://\",\"scheme\":\"coin98://wc\",\"universal\":\"https://coin98.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/vn/app/coin98-wallet/id1561969966\",\"android\":\"https://play.google.com/store/apps/details?id=coin98.crypto.finance.media&hl=vi&gl=US\"}},\n bitkeep: {\"native\":\"bitkeep://\",\"scheme\":\"bitkeep://wc\",\"universal\":\"https://bkapp.vip/wc\",\"store\":{\"ios\":\"https://web3.bitget.com/en/wallet-download?type=0\",\"android\":\"https://web3.bitget.com/en/wallet-download?type=0\"}},\n \"1inch\": {\"native\":\"oneinch://open/nobodywilleveruseit\",\"scheme\":\"oneinch://open/nobodywilleveruseit/wc\",\"universal\":\"https://wallet.1inch.io/app/nobodywilleveruseit/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/1inch-defi-wallet/id1546049391\",\"android\":\"https://play.google.com/store/apps/details?id=io.oneinch.android\"}},\n ledgerlive: {\"native\":\"ledgerlive://\",\"scheme\":\"ledgerlive://wc\",\"store\":{\"ios\":\"https://itunes.apple.com/app/id1361671700\",\"android\":\"https://play.google.com/store/apps/details?id=com.ledger.live\"}},\n atomic: {\"native\":\"atomicwallet://\",\"scheme\":\"atomicwallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/atomic-wallet/id1478257827\",\"android\":\"https://play.google.com/store/apps/details?id=io.atomicwallet\"}},\n alpha: {\"native\":\"awallet://\",\"scheme\":\"awallet://wc\",\"universal\":\"https://aw.app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/alphawallet-eth-wallet/id1358230430\",\"android\":\"https://play.google.com/store/apps/details?id=io.stormbird.wallet\"}},\n math: {\"native\":\"mathwallet://\",\"scheme\":\"mathwallet://wc\",\"universal\":\"https://www.mathwallet.org/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/mathwallet5/id1582612388\",\"android\":\"https://play.google.com/store/apps/details?id=com.mathwallet.android\"}},\n bitpay: {\"native\":\"bitpay://\",\"scheme\":\"bitpay://wc\",\"universal\":\"https://link.bitpay.com/wc\",\"store\":{\"ios\":\"https://bitpay.onelink.me/Cenw/ejjaw7bs\",\"android\":\"https://bitpay.onelink.me/Cenw/ejjaw7bs\"}},\n rabby: {\"native\":\"rabby://\",\"scheme\":\"rabby://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/rabby-wallet-crypto-evm/id6474381673\",\"android\":\"https://play.google.com/store/apps/details?id=com.debank.rabbymobile\"}},\n // Bybit's WC deep link nests the uri inside a targetUrl wrapper (bybitapp://open/route?targetUrl=by://web3/walletconnect/wc?uri=...), which the `${scheme}?uri=` builder can't express — QR/scan connect only.\n bybit: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/bybit-buy-trade-crypto/id1488296980\",\"android\":\"https://play.google.com/store/apps/details?id=com.bybit.app\"}},\n binance: {\"native\":\"bnc://app.binance.com/cedefi/\",\"scheme\":\"bnc://app.binance.com/cedefi/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/id1436799971\",\"android\":\"https://play.google.com/store/apps/details?id=com.binance.dev\"}},\n gate: {\"native\":\"gtweb3wallet://\",\"scheme\":\"gtweb3wallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/gate-io-buy-bitcoin-crypto/id1294998195\",\"android\":\"https://play.google.com/store/apps/details?id=com.gateio.gateio\"}},\n // Core: `core://` scheme not corroborated to 2 sources — QR/scan connect only.\n core: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/core-wallet/id6443685999\",\"android\":\"https://play.google.com/store/apps/details?id=com.avaxwallet\"}},\n // Backpack: `backpack://` scheme not corroborated to 2 sources — QR/scan connect only.\n backpack: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/backpack-wallet-exchange/id6445964121\",\"android\":\"https://play.google.com/store/apps/details?id=app.backpack.mobile\"}},\n frontier: {\"native\":\"frontier://\",\"scheme\":\"frontier://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/frontier-crypto-defi-wallet/id1482380988\",\"android\":\"https://play.google.com/store/apps/details?id=com.frontierwallet\"}},\n onekey: {\"native\":\"onekey-wallet://\",\"scheme\":\"onekey-wallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/onekey-open-source-wallet/id1609559473\",\"android\":\"https://play.google.com/store/apps/details?id=so.onekey.app.wallet\"}},\n kraken: {\"native\":\"krakenwallet://\",\"scheme\":\"krakenwallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/kraken-wallet/id1626327149\",\"android\":\"https://play.google.com/store/apps/details?id=com.kraken.superwallet\"}},\n uniswap: {\"native\":\"uniswap://\",\"scheme\":\"uniswap://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/uniswap-crypto-nft-wallet/id6443944476\",\"android\":\"https://play.google.com/store/apps/details?id=com.uniswap.mobile\"}},\n omni: {\"native\":\"omni://\",\"scheme\":\"omni://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/omni-web3-wallet/id1569375204\",\"android\":\"https://play.google.com/store/apps/details?id=fi.steakwallet.app\"}},\n mew: {\"universal\":\"https://mewwallet.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/id1464614025\",\"android\":\"https://play.google.com/store/apps/details?id=com.myetherwallet.mewwallet\"}},\n foxwallet: {\"native\":\"foxwallet://\",\"scheme\":\"foxwallet://wc\",\"universal\":\"https://link.foxwallet.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/foxwallet-crypto-web3/id1590983231\",\"android\":\"https://play.google.com/store/apps/details?id=com.foxwallet.play\"}},\n nova: {\"native\":\"novawallet://\",\"scheme\":\"novawallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/nova-polkadot-wallet/id1597119355\",\"android\":\"https://play.google.com/store/apps/details?id=io.novafoundation.nova.market\"}},\n subwallet: {\"native\":\"subwallet://\",\"scheme\":\"subwallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/subwallet-polkadot-wallet/id1633050285\",\"android\":\"https://play.google.com/store/apps/details?id=app.subwallet.mobile\"}},\n safe: {\"native\":\"safe://\",\"scheme\":\"safe://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/safe-mobile/id6748754793\",\"android\":\"https://play.google.com/store/apps/details?id=global.safe.mobileapp\"}},\n robinhood: {\"native\":\"robinhood-wallet://\",\"scheme\":\"robinhood-wallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/robinhood-wallet-swap-crypto/id1634080733\",\"android\":\"https://play.google.com/store/apps/details?id=com.robinhood.gateway\"}},\n tangem: {\"native\":\"tangem://\",\"scheme\":\"tangem://wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/tangem/id1354868448\",\"android\":\"https://play.google.com/store/apps/details?id=com.tangem.wallet\"}},\n // Trezor Suite: WalletConnect pairing is QR/paste-into-Suite (no corroborated custom scheme) — QR connect only.\n trezor: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/trezor-suite/id1631884497\",\"android\":\"https://play.google.com/store/apps/details?id=io.trezor.suite\"}},\n kucoin: {\"native\":\"kucoin://\",\"scheme\":\"kucoin:///wallet/walletConnect\",\"store\":{\"ios\":\"https://apps.apple.com/app/kucoin-buy-bitcoin-crypto/id1378956601\",\"android\":\"https://play.google.com/store/apps/details?id=com.kubi.kucoin\"}},\n // Jupiter (Solana): no corroborated WC deep-link scheme — QR connect only.\n jupiter: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/jupiter-solana-swap-wallet/id6484069059\",\"android\":\"https://play.google.com/store/apps/details?id=ag.jup.jupiter.android\"}},\n zengo: {\"native\":\"zengo://get.zengo.com/\",\"scheme\":\"zengo://get.zengo.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/zengo-crypto-bitcoin-wallet/id1440147115\",\"android\":\"https://play.google.com/store/apps/details?id=com.zengo.wallet\"}},\n // Bitcoin.com Wallet: no corroborated WC deep-link scheme — QR connect only.\n bitcoincom: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/bitcoin-wallet-by-bitcoin-com/id1252903728\",\"android\":\"https://play.google.com/store/apps/details?id=com.bitcoin.mwallet\"}},\n keplr: {\"native\":\"keplrwallet://\",\"scheme\":\"keplrwallet://wcV2\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/keplr-wallet/id1567851089\",\"android\":\"https://play.google.com/store/apps/details?id=com.chainapsis.keplr\"}},\n cake: {\"native\":\"cakewallet://\",\"scheme\":\"cakewallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/cake-wallet/id1334702542\",\"android\":\"https://play.google.com/store/apps/details?id=com.cakewallet.cake_wallet\"}},\n unstoppable: {\"native\":\"unstoppable.money://\",\"scheme\":\"unstoppable.money://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/unstoppable-crypto-wallet/id1447619907\",\"android\":\"https://play.google.com/store/apps/details?id=io.horizontalsystems.bankwallet\"}},\n bifrost: {\"native\":\"bifrostwallet://\",\"scheme\":\"bifrostwallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/bifrost-wallet/id1577198351\",\"android\":\"https://play.google.com/store/apps/details?id=com.bifrostwallet.app\"}},\n pintu: {\"native\":\"pintu://web3wallet\",\"scheme\":\"pintu://web3wallet/wc\",\"store\":{\"ios\":\"https://apps.apple.com/id/app/pintu-buy-invest-crypto/id1494119678\",\"android\":\"https://play.google.com/store/apps/details?id=com.valar.pintu\"}},\n hot: {\"native\":\"hotwallet://\",\"scheme\":\"hotwallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/hot-wallet/id6740916148\",\"android\":\"https://play.google.com/store/apps/details?id=app.herewallet.hot\"}},\n arculus: {\"native\":\"arculuswc://\",\"scheme\":\"arculuswc://wc\",\"universal\":\"https://gw.arculus.co/app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/arculus-wallet/id1575425801\",\"android\":\"https://play.google.com/store/apps/details?id=co.arculus.wallet.android\"}},\n};\n","import { WALLET_LINKS } from './wallet-links';\n\nexport interface WalletLink {\n /** App scheme used to foreground the wallet — without the `wc` suffix; may include a path (e.g. \"okxwallet://main\"). */\n native?: string;\n /** Custom scheme deep link incl. the `wc` path; we append `?uri=`. e.g. \"metamask://wc\". Preferred on mobile (same-tab). */\n scheme?: string;\n /** Universal/applink incl. the `wc` path. Fallback only — used when no `scheme` exists. */\n universal?: string;\n /** App store links — used for the \"wallet not installed\" fallback. */\n store?: { ios?: string; android?: string };\n}\n\nexport const DEFAULT_WALLET_LINKS: Record<string, WalletLink> = WALLET_LINKS;\n","import type { WalletLink } from './registry';\n\nexport function isMobile(): boolean {\n if (typeof navigator === 'undefined') return false;\n const ua = navigator.userAgent || '';\n const uaDataMobile =\n (navigator as { userAgentData?: { mobile?: boolean } }).userAgentData?.mobile ?? false;\n return /iPhone|iPad|iPod|Android/i.test(ua) || uaDataMobile;\n}\n\nfunction buildLink(base: string, uri: string): string {\n const sep = base.includes('?') ? '&' : '?';\n return `${base}${sep}uri=${encodeURIComponent(uri)}`;\n}\n\n/**\n * Open the wallet for a WalletConnect pairing on mobile. Custom scheme first, in\n * the SAME TAB — that reliably foregrounds an installed app and, unlike a\n * _blank/popup navigation, is NOT suppressed once the click gesture has been lost\n * (which it has by the time connect() reaches here, after the async pairing setup).\n * Universal link is only a fallback for the rare wallet with no custom scheme.\n * The not-installed case is handled by the connector via detectAppOpen().\n */\nexport function openWallet(link: WalletLink, uri: string): void {\n if (typeof document === 'undefined') return;\n if (link.scheme) {\n openHref(buildLink(link.scheme, uri), false);\n } else if (link.universal) {\n openHref(buildLink(link.universal, uri), false);\n }\n}\n\n/**\n * Bring the wallet app to the foreground (no WC URI) — for an approval the user\n * must return to the wallet for. Uses the bare `native` scheme; call within a gesture.\n */\nexport function openWalletApp(link: WalletLink): void {\n if (typeof document === 'undefined') return;\n if (!link.native) return;\n openHref(link.native, false);\n}\n\nfunction openHref(href: string, newContext: boolean): void {\n const a = document.createElement('a');\n a.href = href;\n if (newContext) {\n a.target = '_blank';\n a.rel = 'noopener noreferrer';\n }\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n}\n\n/** Resolves true if the page was backgrounded (wallet likely opened) within the window. */\nexport function detectAppOpen(timeoutMs: number): Promise<boolean> {\n if (typeof document === 'undefined') return Promise.resolve(false);\n return new Promise((resolve) => {\n let done = false;\n const finish = (opened: boolean) => {\n if (done) return;\n done = true;\n document.removeEventListener('visibilitychange', onVisibility);\n window.removeEventListener('pagehide', onPageHide);\n clearTimeout(timer);\n resolve(opened);\n };\n const onVisibility = () => {\n if (document.hidden) finish(true);\n };\n const onPageHide = () => finish(true);\n document.addEventListener('visibilitychange', onVisibility);\n window.addEventListener('pagehide', onPageHide);\n const timer = setTimeout(() => finish(false), timeoutMs);\n });\n}\n","import SignClient from '@walletconnect/sign-client';\nimport { getSdkError, parseUri } 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\n constructor(\n private app: AppConfig,\n private options: WalletConnectOptions,\n ) {\n super();\n this.links = { ...DEFAULT_WALLET_LINKS, ...(options.walletLinks ?? {}) };\n }\n\n isAvailable(): boolean {\n return true;\n }\n\n private async getClient(): Promise<SignClient> {\n if (this.client) return this.client;\n const client = await SignClient.init({\n projectId: this.options.projectId,\n metadata: {\n name: this.app.appName,\n description: this.app.description ?? this.app.appName,\n url: deriveUrl(),\n icons: this.app.icon ? [this.app.icon] : [],\n },\n relayUrl: this.options.relayUrl,\n });\n\n client.on('session_delete', ({ topic }) => {\n const walletId = this.walletForTopic(topic);\n if (!walletId) return;\n this.topics.delete(walletId);\n this.persist();\n this.emit({ type: 'disconnect', walletId });\n });\n\n client.on('session_event', ({ topic, params }) => {\n const walletId = this.walletForTopic(topic);\n if (!walletId) return;\n const { name, data } = params.event;\n if (name === 'chainChanged') {\n // params.chainId is the CAIP-2 chain the event is scoped to; prefix the\n // bare value with its namespace rather than assuming eip155.\n const ns = params.chainId.split(':')[0] ?? 'eip155';\n const chainId =\n typeof data === 'string' && data.includes(':') ? data : `${ns}:${String(data)}`;\n this.emit({ type: 'chainChanged', walletId, chainId });\n } else if (name === 'accountsChanged' && Array.isArray(data) && data[0]) {\n const account = String(data[0]).split(':').pop() ?? '';\n if (account) this.emit({ type: 'accountsChanged', walletId, account });\n }\n });\n\n this.client = client;\n this.load();\n return client;\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const client = await this.getClient();\n\n const reused = this.tryReuse(client, req);\n if (reused) return reused;\n\n const { uri, approval } = await client.connect({\n requiredNamespaces: { [req.namespace.name]: req.namespace.value },\n });\n if (!uri) throw new Error('WalletConnect did not return a pairing URI');\n\n this.emit({ type: 'display_uri', walletId: req.walletId, uri });\n\n if (isMobile()) {\n const link = this.links[req.walletId];\n if (link) {\n openWallet(link, uri);\n void detectAppOpen(this.options.openTimeoutMs ?? 2000).then((opened) => {\n if (!opened)\n this.emit({\n type: 'wallet_open_failed',\n walletId: req.walletId,\n uri,\n store: link.store,\n });\n });\n }\n }\n\n const pairingTopic = parseUri(uri).topic;\n const session = await withSignal(approval(), req.signal, () => {\n void client.core.pairing.disconnect({ topic: pairingTopic }).catch(() => {});\n });\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 }\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.js CHANGED
@@ -29,13 +29,19 @@ var ConnectManager = class {
29
29
  this.unsubs.push(connector.on((event) => this.handle(event)));
30
30
  }
31
31
  }
32
- /** SDK connector if one claims this walletId, else the fallback. The host app is oblivious. */
33
- resolve(walletId) {
34
- return this.byWallet.get(walletId) ?? this.fallback;
32
+ /**
33
+ * SDK connector if one claims this walletId AND serves the requested
34
+ * namespace, else the fallback. So an EVM-only SDK connector is bypassed to
35
+ * WalletConnect for a non-EVM chain. The host app is oblivious.
36
+ */
37
+ resolve(walletId, namespaceName) {
38
+ const claimed = this.byWallet.get(walletId);
39
+ if (claimed && claimed.servesNamespace(namespaceName)) return claimed;
40
+ return this.fallback;
35
41
  }
36
42
  async connect(req) {
37
43
  if (!this.started) await this.init();
38
- const connection = await this.resolve(req.walletId).connect(req);
44
+ const connection = await this.resolve(req.walletId, req.namespace.name).connect(req);
39
45
  this.connections.set(req.walletId, connection);
40
46
  this.emit({ type: "connect", walletId: req.walletId, connection });
41
47
  return connection;
@@ -83,24 +89,40 @@ var ConnectManager = class {
83
89
  };
84
90
 
85
91
  // src/core/namespace.ts
86
- var DEFAULT_EVM_METHODS = [
87
- "eth_sendTransaction",
88
- "personal_sign",
89
- "eth_signTypedData_v4",
90
- "wallet_switchEthereumChain"
91
- ];
92
- var DEFAULT_EVM_EVENTS = ["chainChanged", "accountsChanged"];
92
+ var NAMESPACE_DEFAULTS = {
93
+ eip155: {
94
+ methods: [
95
+ "eth_sendTransaction",
96
+ "personal_sign",
97
+ "eth_signTypedData_v4",
98
+ "wallet_switchEthereumChain"
99
+ ],
100
+ events: ["chainChanged", "accountsChanged"]
101
+ },
102
+ solana: {
103
+ methods: ["solana_signTransaction", "solana_signMessage", "solana_signAndSendTransaction"],
104
+ events: []
105
+ },
106
+ bip122: {
107
+ methods: ["sendTransfer", "signMessage", "signPsbt", "getAccountAddresses"],
108
+ events: ["bip122_addressesChanged"]
109
+ }
110
+ };
93
111
  function buildNamespace(chainId) {
94
112
  const caip = typeof chainId === "number" ? `eip155:${chainId}` : chainId;
95
113
  const [name, reference] = caip.split(":");
96
- if (name !== "eip155" || !reference || !/^\d+$/.test(reference) || Number(reference) <= 0) {
114
+ const defaults = name ? NAMESPACE_DEFAULTS[name] : void 0;
115
+ if (!name || !defaults || !reference) {
97
116
  throw new Error(
98
- `Unsupported chain "${caip}". lydianconnect is EVM-only for now \u2014 pass a positive number or an "eip155:<id>" string.`
117
+ `Unsupported chain "${caip}". lydianconnect connects ${Object.keys(NAMESPACE_DEFAULTS).join(", ")} \u2014 pass a number (EVM) or a "<namespace>:<reference>" CAIP-2 id.`
99
118
  );
100
119
  }
120
+ if (name === "eip155" && !(/^\d+$/.test(reference) && Number(reference) > 0)) {
121
+ throw new Error(`Invalid eip155 chain "${caip}" \u2014 the reference must be a positive integer.`);
122
+ }
101
123
  return {
102
124
  name,
103
- value: { chains: [caip], methods: DEFAULT_EVM_METHODS, events: DEFAULT_EVM_EVENTS }
125
+ value: { chains: [caip], methods: defaults.methods, events: defaults.events }
104
126
  };
105
127
  }
106
128
 
@@ -110,6 +132,9 @@ var BaseConnector = class {
110
132
  this.walletIds = [];
111
133
  this.handlers = /* @__PURE__ */ new Set();
112
134
  }
135
+ servesNamespace(_namespaceName) {
136
+ return true;
137
+ }
113
138
  async restore() {
114
139
  return [];
115
140
  }
@@ -144,6 +169,9 @@ var MetaMaskConnector = class extends BaseConnector {
144
169
  isAvailable() {
145
170
  return true;
146
171
  }
172
+ servesNamespace(name) {
173
+ return name === "eip155";
174
+ }
147
175
  async getProvider() {
148
176
  if (this.provider) return this.provider;
149
177
  const { MetaMaskSDK } = await import('@metamask/sdk');
@@ -256,6 +284,9 @@ var CoinbaseConnector = class extends BaseConnector {
256
284
  isAvailable() {
257
285
  return true;
258
286
  }
287
+ servesNamespace(name) {
288
+ return name === "eip155";
289
+ }
259
290
  async getProvider(appChainIds) {
260
291
  if (this.provider) return this.provider;
261
292
  const { CoinbaseWalletSDK } = await import('@coinbase/wallet-sdk');
@@ -375,7 +406,43 @@ var WALLET_LINKS = {
375
406
  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
407
  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
408
  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" } }
409
+ 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" } },
410
+ rabby: { "native": "rabby://", "scheme": "rabby://wc", "store": { "ios": "https://apps.apple.com/us/app/rabby-wallet-crypto-evm/id6474381673", "android": "https://play.google.com/store/apps/details?id=com.debank.rabbymobile" } },
411
+ // Bybit's WC deep link nests the uri inside a targetUrl wrapper (bybitapp://open/route?targetUrl=by://web3/walletconnect/wc?uri=...), which the `${scheme}?uri=` builder can't express — QR/scan connect only.
412
+ bybit: { "store": { "ios": "https://apps.apple.com/us/app/bybit-buy-trade-crypto/id1488296980", "android": "https://play.google.com/store/apps/details?id=com.bybit.app" } },
413
+ binance: { "native": "bnc://app.binance.com/cedefi/", "scheme": "bnc://app.binance.com/cedefi/wc", "store": { "ios": "https://apps.apple.com/us/app/id1436799971", "android": "https://play.google.com/store/apps/details?id=com.binance.dev" } },
414
+ gate: { "native": "gtweb3wallet://", "scheme": "gtweb3wallet://wc", "store": { "ios": "https://apps.apple.com/us/app/gate-io-buy-bitcoin-crypto/id1294998195", "android": "https://play.google.com/store/apps/details?id=com.gateio.gateio" } },
415
+ // Core: `core://` scheme not corroborated to 2 sources — QR/scan connect only.
416
+ core: { "store": { "ios": "https://apps.apple.com/us/app/core-wallet/id6443685999", "android": "https://play.google.com/store/apps/details?id=com.avaxwallet" } },
417
+ // Backpack: `backpack://` scheme not corroborated to 2 sources — QR/scan connect only.
418
+ backpack: { "store": { "ios": "https://apps.apple.com/us/app/backpack-wallet-exchange/id6445964121", "android": "https://play.google.com/store/apps/details?id=app.backpack.mobile" } },
419
+ frontier: { "native": "frontier://", "scheme": "frontier://wc", "store": { "ios": "https://apps.apple.com/us/app/frontier-crypto-defi-wallet/id1482380988", "android": "https://play.google.com/store/apps/details?id=com.frontierwallet" } },
420
+ onekey: { "native": "onekey-wallet://", "scheme": "onekey-wallet://wc", "store": { "ios": "https://apps.apple.com/us/app/onekey-open-source-wallet/id1609559473", "android": "https://play.google.com/store/apps/details?id=so.onekey.app.wallet" } },
421
+ kraken: { "native": "krakenwallet://", "scheme": "krakenwallet://wc", "store": { "ios": "https://apps.apple.com/us/app/kraken-wallet/id1626327149", "android": "https://play.google.com/store/apps/details?id=com.kraken.superwallet" } },
422
+ uniswap: { "native": "uniswap://", "scheme": "uniswap://wc", "store": { "ios": "https://apps.apple.com/us/app/uniswap-crypto-nft-wallet/id6443944476", "android": "https://play.google.com/store/apps/details?id=com.uniswap.mobile" } },
423
+ omni: { "native": "omni://", "scheme": "omni://wc", "store": { "ios": "https://apps.apple.com/us/app/omni-web3-wallet/id1569375204", "android": "https://play.google.com/store/apps/details?id=fi.steakwallet.app" } },
424
+ mew: { "universal": "https://mewwallet.com/wc", "store": { "ios": "https://apps.apple.com/app/id1464614025", "android": "https://play.google.com/store/apps/details?id=com.myetherwallet.mewwallet" } },
425
+ foxwallet: { "native": "foxwallet://", "scheme": "foxwallet://wc", "universal": "https://link.foxwallet.com/wc", "store": { "ios": "https://apps.apple.com/app/foxwallet-crypto-web3/id1590983231", "android": "https://play.google.com/store/apps/details?id=com.foxwallet.play" } },
426
+ nova: { "native": "novawallet://", "scheme": "novawallet://wc", "store": { "ios": "https://apps.apple.com/us/app/nova-polkadot-wallet/id1597119355", "android": "https://play.google.com/store/apps/details?id=io.novafoundation.nova.market" } },
427
+ subwallet: { "native": "subwallet://", "scheme": "subwallet://wc", "store": { "ios": "https://apps.apple.com/us/app/subwallet-polkadot-wallet/id1633050285", "android": "https://play.google.com/store/apps/details?id=app.subwallet.mobile" } },
428
+ safe: { "native": "safe://", "scheme": "safe://wc", "store": { "ios": "https://apps.apple.com/us/app/safe-mobile/id6748754793", "android": "https://play.google.com/store/apps/details?id=global.safe.mobileapp" } },
429
+ robinhood: { "native": "robinhood-wallet://", "scheme": "robinhood-wallet://wc", "store": { "ios": "https://apps.apple.com/us/app/robinhood-wallet-swap-crypto/id1634080733", "android": "https://play.google.com/store/apps/details?id=com.robinhood.gateway" } },
430
+ tangem: { "native": "tangem://", "scheme": "tangem://wc", "store": { "ios": "https://apps.apple.com/app/tangem/id1354868448", "android": "https://play.google.com/store/apps/details?id=com.tangem.wallet" } },
431
+ // Trezor Suite: WalletConnect pairing is QR/paste-into-Suite (no corroborated custom scheme) — QR connect only.
432
+ trezor: { "store": { "ios": "https://apps.apple.com/us/app/trezor-suite/id1631884497", "android": "https://play.google.com/store/apps/details?id=io.trezor.suite" } },
433
+ kucoin: { "native": "kucoin://", "scheme": "kucoin:///wallet/walletConnect", "store": { "ios": "https://apps.apple.com/app/kucoin-buy-bitcoin-crypto/id1378956601", "android": "https://play.google.com/store/apps/details?id=com.kubi.kucoin" } },
434
+ // Jupiter (Solana): no corroborated WC deep-link scheme — QR connect only.
435
+ jupiter: { "store": { "ios": "https://apps.apple.com/us/app/jupiter-solana-swap-wallet/id6484069059", "android": "https://play.google.com/store/apps/details?id=ag.jup.jupiter.android" } },
436
+ zengo: { "native": "zengo://get.zengo.com/", "scheme": "zengo://get.zengo.com/wc", "store": { "ios": "https://apps.apple.com/us/app/zengo-crypto-bitcoin-wallet/id1440147115", "android": "https://play.google.com/store/apps/details?id=com.zengo.wallet" } },
437
+ // Bitcoin.com Wallet: no corroborated WC deep-link scheme — QR connect only.
438
+ bitcoincom: { "store": { "ios": "https://apps.apple.com/us/app/bitcoin-wallet-by-bitcoin-com/id1252903728", "android": "https://play.google.com/store/apps/details?id=com.bitcoin.mwallet" } },
439
+ keplr: { "native": "keplrwallet://", "scheme": "keplrwallet://wcV2", "store": { "ios": "https://apps.apple.com/us/app/keplr-wallet/id1567851089", "android": "https://play.google.com/store/apps/details?id=com.chainapsis.keplr" } },
440
+ cake: { "native": "cakewallet://", "scheme": "cakewallet://wc", "store": { "ios": "https://apps.apple.com/us/app/cake-wallet/id1334702542", "android": "https://play.google.com/store/apps/details?id=com.cakewallet.cake_wallet" } },
441
+ unstoppable: { "native": "unstoppable.money://", "scheme": "unstoppable.money://wc", "store": { "ios": "https://apps.apple.com/us/app/unstoppable-crypto-wallet/id1447619907", "android": "https://play.google.com/store/apps/details?id=io.horizontalsystems.bankwallet" } },
442
+ bifrost: { "native": "bifrostwallet://", "scheme": "bifrostwallet://wc", "store": { "ios": "https://apps.apple.com/us/app/bifrost-wallet/id1577198351", "android": "https://play.google.com/store/apps/details?id=com.bifrostwallet.app" } },
443
+ pintu: { "native": "pintu://web3wallet", "scheme": "pintu://web3wallet/wc", "store": { "ios": "https://apps.apple.com/id/app/pintu-buy-invest-crypto/id1494119678", "android": "https://play.google.com/store/apps/details?id=com.valar.pintu" } },
444
+ hot: { "native": "hotwallet://", "scheme": "hotwallet://wc", "store": { "ios": "https://apps.apple.com/us/app/hot-wallet/id6740916148", "android": "https://play.google.com/store/apps/details?id=app.herewallet.hot" } },
445
+ arculus: { "native": "arculuswc://", "scheme": "arculuswc://wc", "universal": "https://gw.arculus.co/app/wc", "store": { "ios": "https://apps.apple.com/us/app/arculus-wallet/id1575425801", "android": "https://play.google.com/store/apps/details?id=co.arculus.wallet.android" } }
379
446
  };
380
447
 
381
448
  // src/connectors/walletconnect/registry.ts
@@ -476,7 +543,8 @@ var WalletConnectConnector = class extends BaseConnector {
476
543
  if (!walletId) return;
477
544
  const { name, data } = params.event;
478
545
  if (name === "chainChanged") {
479
- const chainId = typeof data === "string" && data.includes(":") ? data : `eip155:${String(data)}`;
546
+ const ns = params.chainId.split(":")[0] ?? "eip155";
547
+ const chainId = typeof data === "string" && data.includes(":") ? data : `${ns}:${String(data)}`;
480
548
  this.emit({ type: "chainChanged", walletId, chainId });
481
549
  } else if (name === "accountsChanged" && Array.isArray(data) && data[0]) {
482
550
  const account = String(data[0]).split(":").pop() ?? "";
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.ts","../src/connectors/walletconnect/registry.ts","../src/connectors/walletconnect/deeplink.ts","../src/connectors/walletconnect/connector.ts","../src/core/lydian-connect.ts"],"names":["WALLET_ID","toCaip"],"mappings":"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","file":"index.js","sourcesContent":["import type { Connector, ConnectRequest } from './connector';\nimport type { Connection, LydianConnectEvent, LydianConnectEventHandler } from './types';\n\n/**\n * Routing engine: takes a flat list of connectors, auto-detects the fallback\n * (the connector with no claimed walletIds), routes each walletId to its\n * connector, and forwards events. Internal — the host app uses `LydianConnect`.\n */\nexport class ConnectManager {\n private byWallet = new Map<string, Connector>();\n private fallback: Connector;\n private all: Connector[];\n private connections = new Map<string, Connection>();\n private handlers = new Set<LydianConnectEventHandler>();\n private unsubs: Array<() => void> = [];\n private started = false;\n\n constructor(connectors: Connector[]) {\n const fallbacks = connectors.filter((c) => c.walletIds.length === 0);\n if (fallbacks.length !== 1) {\n throw new Error(\n `LydianConnect requires exactly one fallback connector (empty walletIds); found ${fallbacks.length}`,\n );\n }\n this.fallback = fallbacks[0]!;\n this.all = connectors;\n for (const connector of connectors) {\n for (const id of connector.walletIds) this.byWallet.set(id, connector);\n }\n }\n\n /** Wire connector event forwarding, once. */\n async init(): Promise<void> {\n if (this.started) return;\n this.started = true;\n for (const connector of this.all) {\n this.unsubs.push(connector.on((event) => this.handle(event)));\n }\n }\n\n /** SDK connector if one claims this walletId, else the fallback. The host app is oblivious. */\n private resolve(walletId: string): Connector {\n return this.byWallet.get(walletId) ?? this.fallback;\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n if (!this.started) await this.init();\n const connection = await this.resolve(req.walletId).connect(req);\n this.connections.set(req.walletId, connection);\n this.emit({ type: 'connect', walletId: req.walletId, connection });\n return connection;\n }\n\n async restore(): Promise<Connection[]> {\n if (!this.started) await this.init();\n const restored: Connection[] = [];\n for (const connector of this.all) {\n const conns = await connector.restore().catch(() => [] as Connection[]);\n for (const conn of conns) {\n this.connections.set(conn.walletId, conn);\n restored.push(conn);\n }\n }\n return restored;\n }\n\n get(walletId: string): Connection | undefined {\n return this.connections.get(walletId);\n }\n\n async disconnect(walletId?: string): Promise<void> {\n if (walletId) {\n await this.connections.get(walletId)?.disconnect().catch(() => {});\n this.connections.delete(walletId);\n return;\n }\n await Promise.allSettled([...this.connections.values()].map((c) => c.disconnect()));\n this.connections.clear();\n }\n\n async reset(): Promise<void> {\n await this.disconnect();\n await Promise.allSettled(this.all.map((c) => c.reset()));\n }\n\n on(handler: LydianConnectEventHandler): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n private handle(event: LydianConnectEvent): void {\n if (event.type === 'disconnect') this.connections.delete(event.walletId);\n this.emit(event);\n }\n\n private emit(event: LydianConnectEvent): void {\n for (const handler of this.handlers) handler(event);\n }\n}\n","import type { CaipNamespace } from './types';\n\n// Sensible defaults for an EVM payment flow. Internalized so the host app\n// never hand-builds a namespace — it only chooses a chain.\nconst DEFAULT_EVM_METHODS = [\n 'eth_sendTransaction',\n 'personal_sign',\n 'eth_signTypedData_v4',\n 'wallet_switchEthereumChain',\n];\nconst DEFAULT_EVM_EVENTS = ['chainChanged', 'accountsChanged'];\n\n/**\n * Build a CAIP namespace from a chain id.\n * EVM-only for now: a number maps to `eip155:<n>`, and a CAIP-2 string must be\n * `eip155:<reference>`. Non-EVM namespaces (e.g. `solana:…`) would branch here\n * with their own methods/events when that support is added; until then we throw\n * rather than silently apply EVM defaults to a chain that can't use them.\n */\nexport function buildNamespace(chainId: number | string): CaipNamespace {\n const caip = typeof chainId === 'number' ? `eip155:${chainId}` : chainId;\n const [name, reference] = caip.split(':');\n if (name !== 'eip155' || !reference || !/^\\d+$/.test(reference) || Number(reference) <= 0) {\n throw new Error(\n `Unsupported chain \"${caip}\". lydianconnect is EVM-only for now — pass a positive number or an \"eip155:<id>\" string.`,\n );\n }\n return {\n name,\n value: { chains: [caip], methods: DEFAULT_EVM_METHODS, events: DEFAULT_EVM_EVENTS },\n };\n}\n","import type {\n CaipNamespace,\n Connection,\n ConnectorType,\n LydianConnectEvent,\n LydianConnectEventHandler,\n} from './types';\n\nexport interface ConnectRequest {\n walletId: string;\n namespace: CaipNamespace;\n /** Cancel a pending connection (replaces the host app's manual cancel plumbing). */\n signal?: AbortSignal;\n}\n\n/**\n * Internal contract every connector implements. The host app never sees this —\n * it only ever touches {@link LydianConnect} and the {@link Connection} handle.\n */\nexport interface Connector {\n readonly type: ConnectorType;\n /**\n * Wallet ids this connector natively serves. The WalletConnect fallback\n * returns an empty list and claims any wallet not served by another connector.\n */\n readonly walletIds: readonly string[];\n isAvailable(walletId: string): boolean | Promise<boolean>;\n connect(req: ConnectRequest): Promise<Connection>;\n /** Rebuild Connections for still-live sessions — the reconnect-on-reload case. */\n restore(): Promise<Connection[]>;\n /** Tear down everything this connector owns. */\n reset(): Promise<void>;\n on(handler: LydianConnectEventHandler): () => void;\n}\n\nexport abstract class BaseConnector implements Connector {\n abstract readonly type: ConnectorType;\n readonly walletIds: readonly string[] = [];\n\n private handlers = new Set<LydianConnectEventHandler>();\n\n abstract isAvailable(walletId: string): boolean | Promise<boolean>;\n abstract connect(req: ConnectRequest): Promise<Connection>;\n\n async restore(): Promise<Connection[]> {\n return [];\n }\n\n async reset(): Promise<void> {\n /* no-op by default */\n }\n\n on(handler: LydianConnectEventHandler): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n protected emit(event: LydianConnectEvent): void {\n for (const handler of this.handlers) handler(event);\n }\n}\n","/** Shared app identity passed to every connector; mapped to each SDK's own shape internally. */\nexport interface AppConfig {\n /** Display name shown in the wallet's connect prompt. */\n appName: string;\n /** Optional icon shown in the wallet's connect prompt. */\n icon?: string;\n /** Optional description; defaults to appName. */\n description?: string;\n}\n\n/**\n * The dapp URL, derived from the page origin at connect-time (always client-side).\n * Returns '' during SSR — connectors only read this when initializing their SDK,\n * which never happens on the server.\n */\nexport function deriveUrl(): string {\n return typeof window !== 'undefined' ? window.location.origin : '';\n}\n","import type { MetaMaskSDK as MetaMaskSDKType, MetaMaskSDKOptions } from '@metamask/sdk';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { Connection } from '../../core/types';\nimport { type AppConfig, deriveUrl } from '../../core/app';\n\n/** The provider type MetaMaskSDK.getProvider() returns, without depending on a named export. */\ntype MetaMaskProvider = NonNullable<ReturnType<MetaMaskSDKType['getProvider']>>;\n\nconst WALLET_ID = 'metamask';\n\nexport class MetaMaskConnector extends BaseConnector {\n readonly type = 'sdk' as const;\n readonly walletIds = [WALLET_ID] as const;\n\n private sdk: MetaMaskSDKType | null = null;\n private provider: MetaMaskProvider | null = null;\n private listenersBound = false;\n\n constructor(private app: AppConfig) {\n super();\n }\n\n isAvailable(): boolean {\n return true; // SDK covers desktop (extension) and mobile (deep-link) itself\n }\n\n private async getProvider(): Promise<MetaMaskProvider> {\n if (this.provider) return this.provider;\n const { MetaMaskSDK } = await import('@metamask/sdk'); // value import — code-split, loaded on demand\n const dappMetadata: MetaMaskSDKOptions['dappMetadata'] = {\n name: this.app.appName,\n url: deriveUrl(),\n ...(this.app.icon ? { iconUrl: this.app.icon } : {}),\n };\n const sdk = new MetaMaskSDK({ dappMetadata });\n await sdk.init();\n const provider = sdk.getProvider();\n if (!provider) throw new Error('MetaMask provider unavailable');\n this.sdk = sdk;\n this.provider = provider;\n this.bindEvents(provider);\n return provider;\n }\n\n private bindEvents(provider: MetaMaskProvider): void {\n if (this.listenersBound) return;\n this.listenersBound = true;\n provider.on('chainChanged', (hex) => {\n this.emit({ type: 'chainChanged', walletId: WALLET_ID, chainId: toCaip(String(hex)) });\n });\n provider.on('accountsChanged', (accounts) => {\n const account = Array.isArray(accounts) ? (accounts[0] as string | undefined) : undefined;\n if (account) this.emit({ type: 'accountsChanged', walletId: WALLET_ID, account });\n else this.emit({ type: 'disconnect', walletId: WALLET_ID });\n });\n provider.on('disconnect', () => this.emit({ type: 'disconnect', walletId: WALLET_ID }));\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const provider = await this.getProvider();\n const accounts = await provider.request<string[]>({ method: 'eth_requestAccounts' });\n const account = accounts?.[0];\n if (!account) throw new Error('MetaMask returned no account');\n await this.ensureChain(provider, req);\n const chainId = toCaip(await provider.request<string>({ method: 'eth_chainId' }));\n return this.toConnection(provider, account, chainId);\n }\n\n async restore(): Promise<Connection[]> {\n const provider = await this.getProvider().catch(() => null);\n if (!provider) return [];\n const accounts = await provider.request<string[]>({ method: 'eth_accounts' }).catch(() => []);\n const account = accounts?.[0];\n if (!account) return [];\n const chainId = toCaip(\n await provider.request<string>({ method: 'eth_chainId' }).catch(() => '0x1'),\n );\n return [this.toConnection(provider, account, chainId)];\n }\n\n async reset(): Promise<void> {\n await this.sdk?.terminate();\n this.provider = null;\n this.listenersBound = false;\n }\n\n /** Best-effort switch to the requested chain; leaves the wallet as-is if it's unknown to it. */\n private async ensureChain(provider: MetaMaskProvider, req: ConnectRequest): Promise<void> {\n const wanted = req.namespace.value.chains?.[0]; // \"eip155:137\"\n const wantedNum = wanted ? Number(wanted.split(':')[1]) : NaN;\n if (!Number.isFinite(wantedNum) || wantedNum <= 0) return;\n const current = parseInt(\n (await provider.request<string>({ method: 'eth_chainId' }).catch(() => '0x0')) ?? '0x0',\n 16,\n );\n if (current === wantedNum) return;\n await provider\n .request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: `0x${wantedNum.toString(16)}` }],\n })\n .catch(() => {\n /* chain not added to the wallet — the caller's chainChanged will reflect reality */\n });\n }\n\n private toConnection(provider: MetaMaskProvider, account: string, chainId: string): Connection {\n return {\n walletId: WALLET_ID,\n account,\n chainId,\n request: async <T>(args: { method: string; params?: unknown }) =>\n (await provider.request<T>({ method: args.method, params: args.params as never })) as T,\n openWallet: () => {}, // MetaMask SDK foregrounds the wallet on request\n disconnect: async () => {\n await this.sdk?.terminate();\n this.provider = null;\n this.listenersBound = false;\n this.emit({ type: 'disconnect', walletId: WALLET_ID });\n },\n };\n }\n}\n\nfunction toCaip(hexChainId: string | null | undefined): string {\n if (!hexChainId) return 'eip155:1';\n const num = hexChainId.startsWith('0x') ? parseInt(hexChainId, 16) : Number(hexChainId);\n return `eip155:${Number.isFinite(num) ? num : 1}`;\n}\n","import type { CoinbaseWalletSDK as CoinbaseWalletSDKType } from '@coinbase/wallet-sdk';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { Connection } from '../../core/types';\nimport type { AppConfig } from '../../core/app';\n\ntype CoinbaseProvider = NonNullable<ReturnType<CoinbaseWalletSDKType['makeWeb3Provider']>>;\ntype RequestArgs = Parameters<CoinbaseProvider['request']>[0];\n\n/** Coinbase v4's provider.request is non-generic and returns unknown; wrap + cast. */\nfunction rpc<T>(provider: CoinbaseProvider, method: string, params?: unknown): Promise<T> {\n return provider.request({ method, params } as unknown as RequestArgs) as Promise<T>;\n}\n\nconst WALLET_ID = 'coinbase';\n\nexport class CoinbaseConnector extends BaseConnector {\n readonly type = 'sdk' as const;\n readonly walletIds = [WALLET_ID] as const;\n\n private provider: CoinbaseProvider | null = null;\n private listenersBound = false;\n\n constructor(private app: AppConfig) {\n super();\n }\n\n isAvailable(): boolean {\n return true; // SDK covers extension + mobile deep-link itself\n }\n\n private async getProvider(appChainIds?: number[]): Promise<CoinbaseProvider> {\n if (this.provider) return this.provider;\n const { CoinbaseWalletSDK } = await import('@coinbase/wallet-sdk'); // lazy — code-split\n const sdk = new CoinbaseWalletSDK({\n appName: this.app.appName,\n appLogoUrl: this.app.icon,\n appChainIds, // one-time SDK-init hint; ensureChain enforces the actual chain per connect\n });\n const provider = sdk.makeWeb3Provider();\n this.provider = provider;\n this.bindEvents(provider);\n return provider;\n }\n\n private bindEvents(provider: CoinbaseProvider): void {\n if (this.listenersBound) return;\n this.listenersBound = true;\n provider.on('chainChanged', (hex) => {\n this.emit({ type: 'chainChanged', walletId: WALLET_ID, chainId: toCaip(String(hex)) });\n });\n provider.on('accountsChanged', (accounts) => {\n const account = Array.isArray(accounts) ? (accounts[0] as string | undefined) : undefined;\n if (account) this.emit({ type: 'accountsChanged', walletId: WALLET_ID, account });\n else this.emit({ type: 'disconnect', walletId: WALLET_ID });\n });\n provider.on('disconnect', () => this.emit({ type: 'disconnect', walletId: WALLET_ID }));\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const provider = await this.getProvider(evmChainIds(req));\n const accounts = await rpc<string[]>(provider, 'eth_requestAccounts');\n const account = accounts?.[0];\n if (!account) throw new Error('Coinbase Wallet returned no account');\n await this.ensureChain(provider, req);\n const chainId = toCaip(await rpc<string>(provider, 'eth_chainId'));\n return this.toConnection(provider, account, chainId);\n }\n\n async restore(): Promise<Connection[]> {\n const provider = await this.getProvider().catch(() => null);\n if (!provider) return [];\n const accounts = await rpc<string[]>(provider, 'eth_accounts').catch(() => [] as string[]);\n const account = accounts?.[0];\n if (!account) return [];\n const chainId = toCaip(await rpc<string>(provider, 'eth_chainId').catch(() => '0x1'));\n return [this.toConnection(provider, account, chainId)];\n }\n\n async reset(): Promise<void> {\n await this.provider?.disconnect().catch(() => {});\n this.provider = null;\n this.listenersBound = false;\n }\n\n private async ensureChain(provider: CoinbaseProvider, req: ConnectRequest): Promise<void> {\n const wanted = req.namespace.value.chains?.[0];\n const wantedNum = wanted ? Number(wanted.split(':')[1]) : NaN;\n if (!Number.isFinite(wantedNum) || wantedNum <= 0) return;\n const current = parseInt(\n (await rpc<string>(provider, 'eth_chainId').catch(() => '0x0')) ?? '0x0',\n 16,\n );\n if (current === wantedNum) return;\n await rpc(provider, 'wallet_switchEthereumChain', [{ chainId: `0x${wantedNum.toString(16)}` }]).catch(\n () => {},\n );\n }\n\n private toConnection(provider: CoinbaseProvider, account: string, chainId: string): Connection {\n return {\n walletId: WALLET_ID,\n account,\n chainId,\n request: <T>(args: { method: string; params?: unknown }) =>\n rpc<T>(provider, args.method, args.params),\n openWallet: () => {}, // Coinbase SDK foregrounds the wallet on request\n disconnect: async () => {\n await provider.disconnect().catch(() => {});\n this.provider = null;\n this.listenersBound = false;\n this.emit({ type: 'disconnect', walletId: WALLET_ID });\n },\n };\n }\n}\n\nfunction toCaip(hexChainId: string | null | undefined): string {\n if (!hexChainId) return 'eip155:1';\n const num = hexChainId.startsWith('0x') ? parseInt(hexChainId, 16) : Number(hexChainId);\n return `eip155:${Number.isFinite(num) ? num : 1}`;\n}\n\n/** The numeric EVM chain id the connect targets, for Coinbase's appChainIds hint. */\nfunction evmChainIds(req: ConnectRequest): number[] | undefined {\n const wanted = req.namespace.value.chains?.[0];\n const n = wanted ? Number(wanted.split(':')[1]) : NaN;\n return Number.isFinite(n) && n > 0 ? [n] : undefined;\n}\n","// Wallet deep-link registry — hand-maintained.\n// Originally seeded from the WalletConnect explorer API; edit entries directly now.\n// Per entry: native = bare app scheme (foreground only); scheme = WC connect deep\n// link (we append `?uri=`); universal = fallback only; store = not-installed links.\nimport type { WalletLink } from './registry';\n\nexport const WALLET_LINKS: Record<string, WalletLink> = {\n metamask: {\"native\":\"metamask://\",\"scheme\":\"metamask://wc\",\"universal\":\"https://metamask.app.link/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/metamask/id1438144202\",\"android\":\"https://play.google.com/store/apps/details?id=io.metamask\"}},\n trust: {\"native\":\"trust://\",\"scheme\":\"trust://wc\",\"universal\":\"https://link.trustwallet.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/apple-store/id1288339409\",\"android\":\"https://play.google.com/store/apps/details?id=com.wallet.crypto.trustapp\"}},\n rainbow: {\"native\":\"rainbow://\",\"scheme\":\"rainbow://wc\",\"universal\":\"https://rnbwapp.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/apple-store/id1457119021?pt=119997837&ct=wc&mt=8\",\"android\":\"https://play.google.com/store/apps/details?id=me.rainbow&referrer=utm_source%3Dwc%26utm_medium%3Dconnector%26utm_campaign%3Dwc\"}},\n coinbase: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/base-formerly-coinbase-wallet/id1278383455\"}},\n zerion: {\"native\":\"zerion://\",\"scheme\":\"zerion://wc\",\"universal\":\"https://wallet.zerion.io/wc/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/id1456732565\",\"android\":\"https://play.google.com/store/apps/details?id=io.zerion.android&hl=en&gl=US\"}},\n tokenpocket: {\"native\":\"tpoutside://\",\"scheme\":\"tpoutside://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/tp-wallet/id6444625622?l=en\",\"android\":\"https://play.google.com/store/apps/details?id=vip.mytokenpocket\"}},\n blockchaincom: {\"native\":\"blockchain-wallet://\",\"scheme\":\"blockchain-wallet://wc\",\"universal\":\"https://login.blockchain.com/app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/blockchain-bitcoin-wallet/id493253309\",\"android\":\"https://play.google.com/store/apps/details?id=piuk.blockchain.android\"}},\n exodus: {\"native\":\"exodus://\",\"scheme\":\"exodus://wc\",\"universal\":\"https://exodus.com/m/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/exodus-crypto-bitcoin-wallet/id1414384820\",\"android\":\"https://play.google.com/store/apps/details?id=exodusmovement.exodus&hl=en&gl=US\"}},\n phantom: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/phantom-crypto-wallet/id1598432977\",\"android\":\"https://play.google.com/store/apps/details?id=app.phantom&hl=en\"}},\n okx: {\"native\":\"okxwallet://main\",\"scheme\":\"okxwallet://main/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/okx-buy-bitcoin-eth-crypto/id1327268470\",\"android\":\"https://play.google.com/store/apps/details?id=com.okinc.okex.gp\"}},\n cryptocom: {\"native\":\"cryptowallet://\",\"scheme\":\"cryptowallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/US/app/id1512048310?mt=8\",\"android\":\"https://play.google.com/store/apps/details?id=com.defi.wallet\"}},\n argent: {\"native\":\"argent://app/\",\"scheme\":\"argent://app/wc\",\"universal\":\"https://www.argent.xyz/app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/argent-defi-in-a-tap/id1358741926\",\"android\":\"https://play.google.com/store/apps/details?id=im.argent.contractwalletclient&hl=en&gl=US&pli=1\"}},\n safepal: {\"native\":\"safepalwallet://\",\"scheme\":\"safepalwallet://wc\",\"universal\":\"https://link.safepal.io/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/safepal-wallet/id1548297139\",\"android\":\"https://play.google.com/store/apps/details?id=io.safepal.wallet\"}},\n imtoken: {\"native\":\"imtokenv2://\",\"scheme\":\"imtokenv2://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/imtoken2/id1384798940\",\"android\":\"https://play.google.com/store/apps/details?id=im.token.app\"}},\n ronin: {\"native\":\"roninwallet://\",\"scheme\":\"roninwallet://wc\",\"universal\":\"https://wallet.roninchain.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/ronin-wallet/id1592675001\",\"android\":\"https://play.google.com/store/apps/details?id=com.skymavis.genesis\"}},\n coin98: {\"native\":\"coin98://\",\"scheme\":\"coin98://wc\",\"universal\":\"https://coin98.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/vn/app/coin98-wallet/id1561969966\",\"android\":\"https://play.google.com/store/apps/details?id=coin98.crypto.finance.media&hl=vi&gl=US\"}},\n bitkeep: {\"native\":\"bitkeep://\",\"scheme\":\"bitkeep://wc\",\"universal\":\"https://bkapp.vip/wc\",\"store\":{\"ios\":\"https://web3.bitget.com/en/wallet-download?type=0\",\"android\":\"https://web3.bitget.com/en/wallet-download?type=0\"}},\n \"1inch\": {\"native\":\"oneinch://open/nobodywilleveruseit\",\"scheme\":\"oneinch://open/nobodywilleveruseit/wc\",\"universal\":\"https://wallet.1inch.io/app/nobodywilleveruseit/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/1inch-defi-wallet/id1546049391\",\"android\":\"https://play.google.com/store/apps/details?id=io.oneinch.android\"}},\n ledgerlive: {\"native\":\"ledgerlive://\",\"scheme\":\"ledgerlive://wc\",\"store\":{\"ios\":\"https://itunes.apple.com/app/id1361671700\",\"android\":\"https://play.google.com/store/apps/details?id=com.ledger.live\"}},\n atomic: {\"native\":\"atomicwallet://\",\"scheme\":\"atomicwallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/atomic-wallet/id1478257827\",\"android\":\"https://play.google.com/store/apps/details?id=io.atomicwallet\"}},\n alpha: {\"native\":\"awallet://\",\"scheme\":\"awallet://wc\",\"universal\":\"https://aw.app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/alphawallet-eth-wallet/id1358230430\",\"android\":\"https://play.google.com/store/apps/details?id=io.stormbird.wallet\"}},\n math: {\"native\":\"mathwallet://\",\"scheme\":\"mathwallet://wc\",\"universal\":\"https://www.mathwallet.org/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/mathwallet5/id1582612388\",\"android\":\"https://play.google.com/store/apps/details?id=com.mathwallet.android\"}},\n bitpay: {\"native\":\"bitpay://\",\"scheme\":\"bitpay://wc\",\"universal\":\"https://link.bitpay.com/wc\",\"store\":{\"ios\":\"https://bitpay.onelink.me/Cenw/ejjaw7bs\",\"android\":\"https://bitpay.onelink.me/Cenw/ejjaw7bs\"}},\n};\n","import { WALLET_LINKS } from './wallet-links';\n\nexport interface WalletLink {\n /** App scheme used to foreground the wallet — without the `wc` suffix; may include a path (e.g. \"okxwallet://main\"). */\n native?: string;\n /** Custom scheme deep link incl. the `wc` path; we append `?uri=`. e.g. \"metamask://wc\". Preferred on mobile (same-tab). */\n scheme?: string;\n /** Universal/applink incl. the `wc` path. Fallback only — used when no `scheme` exists. */\n universal?: string;\n /** App store links — used for the \"wallet not installed\" fallback. */\n store?: { ios?: string; android?: string };\n}\n\nexport const DEFAULT_WALLET_LINKS: Record<string, WalletLink> = WALLET_LINKS;\n","import type { WalletLink } from './registry';\n\nexport function isMobile(): boolean {\n if (typeof navigator === 'undefined') return false;\n const ua = navigator.userAgent || '';\n const uaDataMobile =\n (navigator as { userAgentData?: { mobile?: boolean } }).userAgentData?.mobile ?? false;\n return /iPhone|iPad|iPod|Android/i.test(ua) || uaDataMobile;\n}\n\nfunction buildLink(base: string, uri: string): string {\n const sep = base.includes('?') ? '&' : '?';\n return `${base}${sep}uri=${encodeURIComponent(uri)}`;\n}\n\n/**\n * Open the wallet for a WalletConnect pairing on mobile. Custom scheme first, in\n * the SAME TAB — that reliably foregrounds an installed app and, unlike a\n * _blank/popup navigation, is NOT suppressed once the click gesture has been lost\n * (which it has by the time connect() reaches here, after the async pairing setup).\n * Universal link is only a fallback for the rare wallet with no custom scheme.\n * The not-installed case is handled by the connector via detectAppOpen().\n */\nexport function openWallet(link: WalletLink, uri: string): void {\n if (typeof document === 'undefined') return;\n if (link.scheme) {\n openHref(buildLink(link.scheme, uri), false);\n } else if (link.universal) {\n openHref(buildLink(link.universal, uri), false);\n }\n}\n\n/**\n * Bring the wallet app to the foreground (no WC URI) — for an approval the user\n * must return to the wallet for. Uses the bare `native` scheme; call within a gesture.\n */\nexport function openWalletApp(link: WalletLink): void {\n if (typeof document === 'undefined') return;\n if (!link.native) return;\n openHref(link.native, false);\n}\n\nfunction openHref(href: string, newContext: boolean): void {\n const a = document.createElement('a');\n a.href = href;\n if (newContext) {\n a.target = '_blank';\n a.rel = 'noopener noreferrer';\n }\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n}\n\n/** Resolves true if the page was backgrounded (wallet likely opened) within the window. */\nexport function detectAppOpen(timeoutMs: number): Promise<boolean> {\n if (typeof document === 'undefined') return Promise.resolve(false);\n return new Promise((resolve) => {\n let done = false;\n const finish = (opened: boolean) => {\n if (done) return;\n done = true;\n document.removeEventListener('visibilitychange', onVisibility);\n window.removeEventListener('pagehide', onPageHide);\n clearTimeout(timer);\n resolve(opened);\n };\n const onVisibility = () => {\n if (document.hidden) finish(true);\n };\n const onPageHide = () => finish(true);\n document.addEventListener('visibilitychange', onVisibility);\n window.addEventListener('pagehide', onPageHide);\n const timer = setTimeout(() => finish(false), timeoutMs);\n });\n}\n","import SignClient from '@walletconnect/sign-client';\nimport { getSdkError, parseUri } 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\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 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 const { uri, approval } = await client.connect({\n requiredNamespaces: { [req.namespace.name]: req.namespace.value },\n });\n if (!uri) throw new Error('WalletConnect did not return a pairing URI');\n\n this.emit({ type: 'display_uri', walletId: req.walletId, uri });\n\n if (isMobile()) {\n const link = this.links[req.walletId];\n if (link) {\n openWallet(link, uri);\n void detectAppOpen(this.options.openTimeoutMs ?? 2000).then((opened) => {\n if (!opened)\n this.emit({\n type: 'wallet_open_failed',\n walletId: req.walletId,\n uri,\n store: link.store,\n });\n });\n }\n }\n\n const pairingTopic = parseUri(uri).topic;\n const session = await withSignal(approval(), req.signal, () => {\n void client.core.pairing.disconnect({ topic: pairingTopic }).catch(() => {});\n });\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 }\n\n // --- helpers ---\n\n private tryReuse(client: SignClient, req: ConnectRequest): Connection | null {\n const topic = this.topics.get(req.walletId);\n if (!topic) return null;\n const session = this.liveSession(client, topic);\n if (!session) {\n this.topics.delete(req.walletId);\n return null;\n }\n const ns = session.namespaces[req.namespace.name];\n const wanted = req.namespace.value.chains?.[0];\n if (!ns || (wanted && !ns.chains?.includes(wanted))) return null;\n return this.toConnection(client, req.walletId, session, req.namespace);\n }\n\n private toConnection(\n client: SignClient,\n walletId: string,\n session: SessionTypes.Struct,\n namespace: CaipNamespace,\n ): Connection {\n const ns = session.namespaces[namespace.name];\n const account =\n (ns?.accounts ?? []).map((a) => a.split(':')[2]).find((a): a is string => !!a) ?? '';\n const chainId =\n ns?.chains?.[0] ??\n (ns?.accounts?.[0] ? ns.accounts[0].split(':').slice(0, 2).join(':') : `${namespace.name}:1`);\n const topic = session.topic;\n return {\n walletId,\n account,\n chainId,\n request: <T>(args: { method: string; params?: unknown }) =>\n client.request<T>({\n topic,\n chainId,\n request: { method: args.method, params: args.params as never },\n }),\n openWallet: () => {\n if (!isMobile()) return;\n const link = this.links[walletId];\n if (link) openWalletApp(link);\n },\n disconnect: async () => {\n await client.disconnect({ topic, reason: getSdkError('USER_DISCONNECTED') }).catch(() => {});\n this.topics.delete(walletId);\n this.persist();\n this.emit({ type: 'disconnect', walletId });\n },\n };\n }\n\n private liveSession(client: SignClient, topic: string): SessionTypes.Struct | undefined {\n try {\n return client.session.get(topic);\n } catch {\n return undefined;\n }\n }\n\n private walletForTopic(topic: string): string | null {\n for (const [walletId, t] of this.topics) if (t === topic) return walletId;\n return null;\n }\n\n private persist(): void {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify([...this.topics]));\n } catch {\n /* SSR / no storage */\n }\n }\n\n private load(): void {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (raw) this.topics = new Map(JSON.parse(raw) as Array<[string, string]>);\n } catch {\n /* SSR / no storage */\n }\n }\n}\n\nfunction firstNamespace(session: SessionTypes.Struct): CaipNamespace | null {\n const name = Object.keys(session.namespaces)[0];\n if (!name) return null;\n const v = session.namespaces[name];\n if (!v) return null;\n return { name, value: { chains: v.chains, methods: v.methods, events: v.events } };\n}\n\nfunction withSignal<T>(\n promise: Promise<T>,\n signal: AbortSignal | undefined,\n onAbort: () => void,\n): Promise<T> {\n if (!signal) return promise;\n if (signal.aborted) {\n onAbort();\n return Promise.reject(new DOMException('Aborted', 'AbortError'));\n }\n return new Promise<T>((resolve, reject) => {\n const abortHandler = () => {\n onAbort();\n reject(new DOMException('Aborted', 'AbortError'));\n };\n signal.addEventListener('abort', abortHandler, { once: true });\n promise.then(\n (v) => {\n signal.removeEventListener('abort', abortHandler);\n resolve(v);\n },\n (e) => {\n signal.removeEventListener('abort', abortHandler);\n reject(e);\n },\n );\n });\n}\n","import { ConnectManager } from './manager';\nimport { buildNamespace } from './namespace';\nimport type { Connector } from './connector';\nimport type { AppConfig } from './app';\nimport type {\n ConnectInput,\n Connection,\n LydianConnectConfig,\n LydianConnectEventHandler,\n} from './types';\nimport { MetaMaskConnector } from '../connectors/metamask/connector';\nimport { CoinbaseConnector } from '../connectors/coinbase/connector';\nimport { WalletConnectConnector } from '../connectors/walletconnect/connector';\n\n/**\n * The library-owned connector set. Adding a new wallet SDK is a change HERE —\n * consumers get it on `npm update` with no code change. SDK code stays\n * code-split (lazy `import()` inside each connector), so registering a\n * connector adds ~nothing to the host app's initial bundle.\n */\nfunction createConnectors(config: LydianConnectConfig): Connector[] {\n const app: AppConfig = {\n appName: config.appName,\n icon: config.icon,\n description: config.description,\n };\n return [\n new MetaMaskConnector(app),\n new CoinbaseConnector(app),\n new WalletConnectConnector(app, { projectId: config.walletConnectProjectId }),\n ];\n}\n\n/**\n * The single surface the host app touches. Hand it a flat config; it owns the\n * connectors and routes each wallet to its native SDK (or the WalletConnect\n * fallback), returning a uniform {@link Connection} either way.\n */\nexport class LydianConnect {\n private manager: ConnectManager;\n\n constructor(config: LydianConnectConfig) {\n this.manager = new ConnectManager(createConnectors(config));\n }\n\n init(): Promise<void> {\n return this.manager.init();\n }\n\n async connect(input: ConnectInput): Promise<Connection> {\n if (input.chainId === undefined || input.chainId === null) {\n throw new Error('connect() requires a chainId (a number like 137 or an \"eip155:<id>\" string)');\n }\n return this.manager.connect({\n walletId: input.walletId,\n namespace: buildNamespace(input.chainId),\n signal: input.signal,\n });\n }\n\n restore(): Promise<Connection[]> {\n return this.manager.restore();\n }\n\n disconnect(walletId?: string): Promise<void> {\n return this.manager.disconnect(walletId);\n }\n\n reset(): Promise<void> {\n return this.manager.reset();\n }\n\n get(walletId: string): Connection | undefined {\n return this.manager.get(walletId);\n }\n\n on(handler: LydianConnectEventHandler): () => void {\n return this.manager.on(handler);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/core/manager.ts","../src/core/namespace.ts","../src/core/connector.ts","../src/core/app.ts","../src/connectors/metamask/connector.ts","../src/connectors/coinbase/connector.ts","../src/connectors/walletconnect/wallet-links.ts","../src/connectors/walletconnect/registry.ts","../src/connectors/walletconnect/deeplink.ts","../src/connectors/walletconnect/connector.ts","../src/core/lydian-connect.ts"],"names":["WALLET_ID","toCaip"],"mappings":"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","file":"index.js","sourcesContent":["import type { Connector, ConnectRequest } from './connector';\nimport type { Connection, LydianConnectEvent, LydianConnectEventHandler } from './types';\n\n/**\n * Routing engine: takes a flat list of connectors, auto-detects the fallback\n * (the connector with no claimed walletIds), routes each walletId to its\n * connector, and forwards events. Internal — the host app uses `LydianConnect`.\n */\nexport class ConnectManager {\n private byWallet = new Map<string, Connector>();\n private fallback: Connector;\n private all: Connector[];\n private connections = new Map<string, Connection>();\n private handlers = new Set<LydianConnectEventHandler>();\n private unsubs: Array<() => void> = [];\n private started = false;\n\n constructor(connectors: Connector[]) {\n const fallbacks = connectors.filter((c) => c.walletIds.length === 0);\n if (fallbacks.length !== 1) {\n throw new Error(\n `LydianConnect requires exactly one fallback connector (empty walletIds); found ${fallbacks.length}`,\n );\n }\n this.fallback = fallbacks[0]!;\n this.all = connectors;\n for (const connector of connectors) {\n for (const id of connector.walletIds) this.byWallet.set(id, connector);\n }\n }\n\n /** Wire connector event forwarding, once. */\n async init(): Promise<void> {\n if (this.started) return;\n this.started = true;\n for (const connector of this.all) {\n this.unsubs.push(connector.on((event) => this.handle(event)));\n }\n }\n\n /**\n * SDK connector if one claims this walletId AND serves the requested\n * namespace, else the fallback. So an EVM-only SDK connector is bypassed to\n * WalletConnect for a non-EVM chain. The host app is oblivious.\n */\n private resolve(walletId: string, namespaceName: string): Connector {\n const claimed = this.byWallet.get(walletId);\n if (claimed && claimed.servesNamespace(namespaceName)) return claimed;\n return 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, req.namespace.name).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// Per-namespace method/event sets. A bare number is always EVM (back-compat).\n// tron/ton are intentionally absent — not WalletConnect-reachable, so they're\n// payment-by-QR only and must not negotiate a wallet session here.\nconst NAMESPACE_DEFAULTS: Record<string, { methods: string[]; events: string[] }> = {\n eip155: {\n methods: [\n 'eth_sendTransaction',\n 'personal_sign',\n 'eth_signTypedData_v4',\n 'wallet_switchEthereumChain',\n ],\n events: ['chainChanged', 'accountsChanged'],\n },\n solana: {\n methods: ['solana_signTransaction', 'solana_signMessage', 'solana_signAndSendTransaction'],\n events: [],\n },\n bip122: {\n methods: ['sendTransfer', 'signMessage', 'signPsbt', 'getAccountAddresses'],\n events: ['bip122_addressesChanged'],\n },\n};\n\n/**\n * Build a CAIP namespace from a chain id.\n * A number maps to `eip155:<n>` (the EVM back-compat path); a CAIP-2 string\n * `<namespace>:<reference>` is honored if the namespace is one we connect.\n * Unsupported namespaces (e.g. `tron:`, `ton:`) throw rather than silently\n * applying defaults to a chain we can't negotiate a session for.\n */\nexport function buildNamespace(chainId: number | string): CaipNamespace {\n const caip = typeof chainId === 'number' ? `eip155:${chainId}` : chainId;\n const [name, reference] = caip.split(':');\n const defaults = name ? NAMESPACE_DEFAULTS[name] : undefined;\n if (!name || !defaults || !reference) {\n throw new Error(\n `Unsupported chain \"${caip}\". lydianconnect connects ${Object.keys(NAMESPACE_DEFAULTS).join(', ')} — ` +\n `pass a number (EVM) or a \"<namespace>:<reference>\" CAIP-2 id.`,\n );\n }\n // eip155 references are positive integers; non-EVM references are opaque ids.\n if (name === 'eip155' && !(/^\\d+$/.test(reference) && Number(reference) > 0)) {\n throw new Error(`Invalid eip155 chain \"${caip}\" — the reference must be a positive integer.`);\n }\n return {\n name,\n value: { chains: [caip], methods: defaults.methods, events: defaults.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 /** Namespace families this connector can connect on. The WalletConnect\n * fallback serves all; SDK connectors restrict to what their SDK speaks. */\n servesNamespace(namespaceName: string): boolean;\n isAvailable(walletId: string): boolean | Promise<boolean>;\n connect(req: ConnectRequest): Promise<Connection>;\n /** Rebuild Connections for still-live sessions — the reconnect-on-reload case. */\n restore(): Promise<Connection[]>;\n /** Tear down everything this connector owns. */\n reset(): Promise<void>;\n on(handler: LydianConnectEventHandler): () => void;\n}\n\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 servesNamespace(_namespaceName: string): boolean {\n return true;\n }\n\n async restore(): Promise<Connection[]> {\n return [];\n }\n\n async reset(): Promise<void> {\n /* no-op by default */\n }\n\n on(handler: LydianConnectEventHandler): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n 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 servesNamespace(name: string): boolean {\n return name === 'eip155'; // MetaMask SDK speaks EVM only\n }\n\n private async getProvider(): Promise<MetaMaskProvider> {\n if (this.provider) return this.provider;\n const { MetaMaskSDK } = await import('@metamask/sdk'); // value import — code-split, loaded on demand\n const dappMetadata: MetaMaskSDKOptions['dappMetadata'] = {\n name: this.app.appName,\n url: deriveUrl(),\n ...(this.app.icon ? { iconUrl: this.app.icon } : {}),\n };\n const sdk = new MetaMaskSDK({ dappMetadata });\n await sdk.init();\n const provider = sdk.getProvider();\n if (!provider) throw new Error('MetaMask provider unavailable');\n this.sdk = sdk;\n this.provider = provider;\n this.bindEvents(provider);\n return provider;\n }\n\n private bindEvents(provider: MetaMaskProvider): void {\n if (this.listenersBound) return;\n this.listenersBound = true;\n provider.on('chainChanged', (hex) => {\n this.emit({ 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 servesNamespace(name: string): boolean {\n return name === 'eip155'; // Coinbase Wallet SDK provider speaks EVM only\n }\n\n private async getProvider(appChainIds?: number[]): Promise<CoinbaseProvider> {\n if (this.provider) return this.provider;\n const { CoinbaseWalletSDK } = await import('@coinbase/wallet-sdk'); // lazy — code-split\n const sdk = new CoinbaseWalletSDK({\n appName: this.app.appName,\n appLogoUrl: this.app.icon,\n appChainIds, // one-time SDK-init hint; ensureChain enforces the actual chain per connect\n });\n const provider = sdk.makeWeb3Provider();\n this.provider = provider;\n this.bindEvents(provider);\n return provider;\n }\n\n private bindEvents(provider: CoinbaseProvider): void {\n if (this.listenersBound) return;\n this.listenersBound = true;\n provider.on('chainChanged', (hex) => {\n this.emit({ type: 'chainChanged', walletId: WALLET_ID, chainId: toCaip(String(hex)) });\n });\n provider.on('accountsChanged', (accounts) => {\n const account = Array.isArray(accounts) ? (accounts[0] as string | undefined) : undefined;\n if (account) this.emit({ type: 'accountsChanged', walletId: WALLET_ID, account });\n else this.emit({ type: 'disconnect', walletId: WALLET_ID });\n });\n provider.on('disconnect', () => this.emit({ type: 'disconnect', walletId: WALLET_ID }));\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const provider = await this.getProvider(evmChainIds(req));\n const accounts = await rpc<string[]>(provider, 'eth_requestAccounts');\n const account = accounts?.[0];\n if (!account) throw new Error('Coinbase Wallet returned no account');\n await this.ensureChain(provider, req);\n const chainId = toCaip(await rpc<string>(provider, 'eth_chainId'));\n return this.toConnection(provider, account, chainId);\n }\n\n async restore(): Promise<Connection[]> {\n const provider = await this.getProvider().catch(() => null);\n if (!provider) return [];\n const accounts = await rpc<string[]>(provider, 'eth_accounts').catch(() => [] as string[]);\n const account = accounts?.[0];\n if (!account) return [];\n const chainId = toCaip(await rpc<string>(provider, 'eth_chainId').catch(() => '0x1'));\n return [this.toConnection(provider, account, chainId)];\n }\n\n async reset(): Promise<void> {\n await this.provider?.disconnect().catch(() => {});\n this.provider = null;\n this.listenersBound = false;\n }\n\n private async ensureChain(provider: CoinbaseProvider, req: ConnectRequest): Promise<void> {\n const wanted = req.namespace.value.chains?.[0];\n const wantedNum = wanted ? Number(wanted.split(':')[1]) : NaN;\n if (!Number.isFinite(wantedNum) || wantedNum <= 0) return;\n const current = parseInt(\n (await rpc<string>(provider, 'eth_chainId').catch(() => '0x0')) ?? '0x0',\n 16,\n );\n if (current === wantedNum) return;\n await rpc(provider, 'wallet_switchEthereumChain', [{ chainId: `0x${wantedNum.toString(16)}` }]).catch(\n () => {},\n );\n }\n\n private toConnection(provider: CoinbaseProvider, account: string, chainId: string): Connection {\n return {\n walletId: WALLET_ID,\n account,\n chainId,\n request: <T>(args: { method: string; params?: unknown }) =>\n rpc<T>(provider, args.method, args.params),\n openWallet: () => {}, // Coinbase SDK foregrounds the wallet on request\n disconnect: async () => {\n await provider.disconnect().catch(() => {});\n this.provider = null;\n this.listenersBound = false;\n this.emit({ type: 'disconnect', walletId: WALLET_ID });\n },\n };\n }\n}\n\nfunction toCaip(hexChainId: string | null | undefined): string {\n if (!hexChainId) return 'eip155:1';\n const num = hexChainId.startsWith('0x') ? parseInt(hexChainId, 16) : Number(hexChainId);\n return `eip155:${Number.isFinite(num) ? num : 1}`;\n}\n\n/** The numeric EVM chain id the connect targets, for Coinbase's appChainIds hint. */\nfunction evmChainIds(req: ConnectRequest): number[] | undefined {\n const wanted = req.namespace.value.chains?.[0];\n const n = wanted ? Number(wanted.split(':')[1]) : NaN;\n return Number.isFinite(n) && n > 0 ? [n] : undefined;\n}\n","// Wallet deep-link registry — hand-maintained.\n// Originally seeded from the WalletConnect explorer API; edit entries directly now.\n// Per entry: native = bare app scheme (foreground only); scheme = WC connect deep\n// link (we append `?uri=`); universal = fallback only; store = not-installed links.\nimport type { WalletLink } from './registry';\n\nexport const WALLET_LINKS: Record<string, WalletLink> = {\n metamask: {\"native\":\"metamask://\",\"scheme\":\"metamask://wc\",\"universal\":\"https://metamask.app.link/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/metamask/id1438144202\",\"android\":\"https://play.google.com/store/apps/details?id=io.metamask\"}},\n trust: {\"native\":\"trust://\",\"scheme\":\"trust://wc\",\"universal\":\"https://link.trustwallet.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/apple-store/id1288339409\",\"android\":\"https://play.google.com/store/apps/details?id=com.wallet.crypto.trustapp\"}},\n rainbow: {\"native\":\"rainbow://\",\"scheme\":\"rainbow://wc\",\"universal\":\"https://rnbwapp.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/apple-store/id1457119021?pt=119997837&ct=wc&mt=8\",\"android\":\"https://play.google.com/store/apps/details?id=me.rainbow&referrer=utm_source%3Dwc%26utm_medium%3Dconnector%26utm_campaign%3Dwc\"}},\n coinbase: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/base-formerly-coinbase-wallet/id1278383455\"}},\n zerion: {\"native\":\"zerion://\",\"scheme\":\"zerion://wc\",\"universal\":\"https://wallet.zerion.io/wc/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/id1456732565\",\"android\":\"https://play.google.com/store/apps/details?id=io.zerion.android&hl=en&gl=US\"}},\n tokenpocket: {\"native\":\"tpoutside://\",\"scheme\":\"tpoutside://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/tp-wallet/id6444625622?l=en\",\"android\":\"https://play.google.com/store/apps/details?id=vip.mytokenpocket\"}},\n blockchaincom: {\"native\":\"blockchain-wallet://\",\"scheme\":\"blockchain-wallet://wc\",\"universal\":\"https://login.blockchain.com/app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/blockchain-bitcoin-wallet/id493253309\",\"android\":\"https://play.google.com/store/apps/details?id=piuk.blockchain.android\"}},\n exodus: {\"native\":\"exodus://\",\"scheme\":\"exodus://wc\",\"universal\":\"https://exodus.com/m/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/exodus-crypto-bitcoin-wallet/id1414384820\",\"android\":\"https://play.google.com/store/apps/details?id=exodusmovement.exodus&hl=en&gl=US\"}},\n phantom: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/phantom-crypto-wallet/id1598432977\",\"android\":\"https://play.google.com/store/apps/details?id=app.phantom&hl=en\"}},\n okx: {\"native\":\"okxwallet://main\",\"scheme\":\"okxwallet://main/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/okx-buy-bitcoin-eth-crypto/id1327268470\",\"android\":\"https://play.google.com/store/apps/details?id=com.okinc.okex.gp\"}},\n cryptocom: {\"native\":\"cryptowallet://\",\"scheme\":\"cryptowallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/US/app/id1512048310?mt=8\",\"android\":\"https://play.google.com/store/apps/details?id=com.defi.wallet\"}},\n argent: {\"native\":\"argent://app/\",\"scheme\":\"argent://app/wc\",\"universal\":\"https://www.argent.xyz/app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/argent-defi-in-a-tap/id1358741926\",\"android\":\"https://play.google.com/store/apps/details?id=im.argent.contractwalletclient&hl=en&gl=US&pli=1\"}},\n safepal: {\"native\":\"safepalwallet://\",\"scheme\":\"safepalwallet://wc\",\"universal\":\"https://link.safepal.io/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/safepal-wallet/id1548297139\",\"android\":\"https://play.google.com/store/apps/details?id=io.safepal.wallet\"}},\n imtoken: {\"native\":\"imtokenv2://\",\"scheme\":\"imtokenv2://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/imtoken2/id1384798940\",\"android\":\"https://play.google.com/store/apps/details?id=im.token.app\"}},\n ronin: {\"native\":\"roninwallet://\",\"scheme\":\"roninwallet://wc\",\"universal\":\"https://wallet.roninchain.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/ronin-wallet/id1592675001\",\"android\":\"https://play.google.com/store/apps/details?id=com.skymavis.genesis\"}},\n coin98: {\"native\":\"coin98://\",\"scheme\":\"coin98://wc\",\"universal\":\"https://coin98.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/vn/app/coin98-wallet/id1561969966\",\"android\":\"https://play.google.com/store/apps/details?id=coin98.crypto.finance.media&hl=vi&gl=US\"}},\n bitkeep: {\"native\":\"bitkeep://\",\"scheme\":\"bitkeep://wc\",\"universal\":\"https://bkapp.vip/wc\",\"store\":{\"ios\":\"https://web3.bitget.com/en/wallet-download?type=0\",\"android\":\"https://web3.bitget.com/en/wallet-download?type=0\"}},\n \"1inch\": {\"native\":\"oneinch://open/nobodywilleveruseit\",\"scheme\":\"oneinch://open/nobodywilleveruseit/wc\",\"universal\":\"https://wallet.1inch.io/app/nobodywilleveruseit/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/1inch-defi-wallet/id1546049391\",\"android\":\"https://play.google.com/store/apps/details?id=io.oneinch.android\"}},\n ledgerlive: {\"native\":\"ledgerlive://\",\"scheme\":\"ledgerlive://wc\",\"store\":{\"ios\":\"https://itunes.apple.com/app/id1361671700\",\"android\":\"https://play.google.com/store/apps/details?id=com.ledger.live\"}},\n atomic: {\"native\":\"atomicwallet://\",\"scheme\":\"atomicwallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/atomic-wallet/id1478257827\",\"android\":\"https://play.google.com/store/apps/details?id=io.atomicwallet\"}},\n alpha: {\"native\":\"awallet://\",\"scheme\":\"awallet://wc\",\"universal\":\"https://aw.app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/alphawallet-eth-wallet/id1358230430\",\"android\":\"https://play.google.com/store/apps/details?id=io.stormbird.wallet\"}},\n math: {\"native\":\"mathwallet://\",\"scheme\":\"mathwallet://wc\",\"universal\":\"https://www.mathwallet.org/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/mathwallet5/id1582612388\",\"android\":\"https://play.google.com/store/apps/details?id=com.mathwallet.android\"}},\n bitpay: {\"native\":\"bitpay://\",\"scheme\":\"bitpay://wc\",\"universal\":\"https://link.bitpay.com/wc\",\"store\":{\"ios\":\"https://bitpay.onelink.me/Cenw/ejjaw7bs\",\"android\":\"https://bitpay.onelink.me/Cenw/ejjaw7bs\"}},\n rabby: {\"native\":\"rabby://\",\"scheme\":\"rabby://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/rabby-wallet-crypto-evm/id6474381673\",\"android\":\"https://play.google.com/store/apps/details?id=com.debank.rabbymobile\"}},\n // Bybit's WC deep link nests the uri inside a targetUrl wrapper (bybitapp://open/route?targetUrl=by://web3/walletconnect/wc?uri=...), which the `${scheme}?uri=` builder can't express — QR/scan connect only.\n bybit: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/bybit-buy-trade-crypto/id1488296980\",\"android\":\"https://play.google.com/store/apps/details?id=com.bybit.app\"}},\n binance: {\"native\":\"bnc://app.binance.com/cedefi/\",\"scheme\":\"bnc://app.binance.com/cedefi/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/id1436799971\",\"android\":\"https://play.google.com/store/apps/details?id=com.binance.dev\"}},\n gate: {\"native\":\"gtweb3wallet://\",\"scheme\":\"gtweb3wallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/gate-io-buy-bitcoin-crypto/id1294998195\",\"android\":\"https://play.google.com/store/apps/details?id=com.gateio.gateio\"}},\n // Core: `core://` scheme not corroborated to 2 sources — QR/scan connect only.\n core: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/core-wallet/id6443685999\",\"android\":\"https://play.google.com/store/apps/details?id=com.avaxwallet\"}},\n // Backpack: `backpack://` scheme not corroborated to 2 sources — QR/scan connect only.\n backpack: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/backpack-wallet-exchange/id6445964121\",\"android\":\"https://play.google.com/store/apps/details?id=app.backpack.mobile\"}},\n frontier: {\"native\":\"frontier://\",\"scheme\":\"frontier://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/frontier-crypto-defi-wallet/id1482380988\",\"android\":\"https://play.google.com/store/apps/details?id=com.frontierwallet\"}},\n onekey: {\"native\":\"onekey-wallet://\",\"scheme\":\"onekey-wallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/onekey-open-source-wallet/id1609559473\",\"android\":\"https://play.google.com/store/apps/details?id=so.onekey.app.wallet\"}},\n kraken: {\"native\":\"krakenwallet://\",\"scheme\":\"krakenwallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/kraken-wallet/id1626327149\",\"android\":\"https://play.google.com/store/apps/details?id=com.kraken.superwallet\"}},\n uniswap: {\"native\":\"uniswap://\",\"scheme\":\"uniswap://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/uniswap-crypto-nft-wallet/id6443944476\",\"android\":\"https://play.google.com/store/apps/details?id=com.uniswap.mobile\"}},\n omni: {\"native\":\"omni://\",\"scheme\":\"omni://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/omni-web3-wallet/id1569375204\",\"android\":\"https://play.google.com/store/apps/details?id=fi.steakwallet.app\"}},\n mew: {\"universal\":\"https://mewwallet.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/id1464614025\",\"android\":\"https://play.google.com/store/apps/details?id=com.myetherwallet.mewwallet\"}},\n foxwallet: {\"native\":\"foxwallet://\",\"scheme\":\"foxwallet://wc\",\"universal\":\"https://link.foxwallet.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/foxwallet-crypto-web3/id1590983231\",\"android\":\"https://play.google.com/store/apps/details?id=com.foxwallet.play\"}},\n nova: {\"native\":\"novawallet://\",\"scheme\":\"novawallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/nova-polkadot-wallet/id1597119355\",\"android\":\"https://play.google.com/store/apps/details?id=io.novafoundation.nova.market\"}},\n subwallet: {\"native\":\"subwallet://\",\"scheme\":\"subwallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/subwallet-polkadot-wallet/id1633050285\",\"android\":\"https://play.google.com/store/apps/details?id=app.subwallet.mobile\"}},\n safe: {\"native\":\"safe://\",\"scheme\":\"safe://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/safe-mobile/id6748754793\",\"android\":\"https://play.google.com/store/apps/details?id=global.safe.mobileapp\"}},\n robinhood: {\"native\":\"robinhood-wallet://\",\"scheme\":\"robinhood-wallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/robinhood-wallet-swap-crypto/id1634080733\",\"android\":\"https://play.google.com/store/apps/details?id=com.robinhood.gateway\"}},\n tangem: {\"native\":\"tangem://\",\"scheme\":\"tangem://wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/tangem/id1354868448\",\"android\":\"https://play.google.com/store/apps/details?id=com.tangem.wallet\"}},\n // Trezor Suite: WalletConnect pairing is QR/paste-into-Suite (no corroborated custom scheme) — QR connect only.\n trezor: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/trezor-suite/id1631884497\",\"android\":\"https://play.google.com/store/apps/details?id=io.trezor.suite\"}},\n kucoin: {\"native\":\"kucoin://\",\"scheme\":\"kucoin:///wallet/walletConnect\",\"store\":{\"ios\":\"https://apps.apple.com/app/kucoin-buy-bitcoin-crypto/id1378956601\",\"android\":\"https://play.google.com/store/apps/details?id=com.kubi.kucoin\"}},\n // Jupiter (Solana): no corroborated WC deep-link scheme — QR connect only.\n jupiter: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/jupiter-solana-swap-wallet/id6484069059\",\"android\":\"https://play.google.com/store/apps/details?id=ag.jup.jupiter.android\"}},\n zengo: {\"native\":\"zengo://get.zengo.com/\",\"scheme\":\"zengo://get.zengo.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/zengo-crypto-bitcoin-wallet/id1440147115\",\"android\":\"https://play.google.com/store/apps/details?id=com.zengo.wallet\"}},\n // Bitcoin.com Wallet: no corroborated WC deep-link scheme — QR connect only.\n bitcoincom: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/bitcoin-wallet-by-bitcoin-com/id1252903728\",\"android\":\"https://play.google.com/store/apps/details?id=com.bitcoin.mwallet\"}},\n keplr: {\"native\":\"keplrwallet://\",\"scheme\":\"keplrwallet://wcV2\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/keplr-wallet/id1567851089\",\"android\":\"https://play.google.com/store/apps/details?id=com.chainapsis.keplr\"}},\n cake: {\"native\":\"cakewallet://\",\"scheme\":\"cakewallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/cake-wallet/id1334702542\",\"android\":\"https://play.google.com/store/apps/details?id=com.cakewallet.cake_wallet\"}},\n unstoppable: {\"native\":\"unstoppable.money://\",\"scheme\":\"unstoppable.money://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/unstoppable-crypto-wallet/id1447619907\",\"android\":\"https://play.google.com/store/apps/details?id=io.horizontalsystems.bankwallet\"}},\n bifrost: {\"native\":\"bifrostwallet://\",\"scheme\":\"bifrostwallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/bifrost-wallet/id1577198351\",\"android\":\"https://play.google.com/store/apps/details?id=com.bifrostwallet.app\"}},\n pintu: {\"native\":\"pintu://web3wallet\",\"scheme\":\"pintu://web3wallet/wc\",\"store\":{\"ios\":\"https://apps.apple.com/id/app/pintu-buy-invest-crypto/id1494119678\",\"android\":\"https://play.google.com/store/apps/details?id=com.valar.pintu\"}},\n hot: {\"native\":\"hotwallet://\",\"scheme\":\"hotwallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/hot-wallet/id6740916148\",\"android\":\"https://play.google.com/store/apps/details?id=app.herewallet.hot\"}},\n arculus: {\"native\":\"arculuswc://\",\"scheme\":\"arculuswc://wc\",\"universal\":\"https://gw.arculus.co/app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/arculus-wallet/id1575425801\",\"android\":\"https://play.google.com/store/apps/details?id=co.arculus.wallet.android\"}},\n};\n","import { WALLET_LINKS } from './wallet-links';\n\nexport interface WalletLink {\n /** App scheme used to foreground the wallet — without the `wc` suffix; may include a path (e.g. \"okxwallet://main\"). */\n native?: string;\n /** Custom scheme deep link incl. the `wc` path; we append `?uri=`. e.g. \"metamask://wc\". Preferred on mobile (same-tab). */\n scheme?: string;\n /** Universal/applink incl. the `wc` path. Fallback only — used when no `scheme` exists. */\n universal?: string;\n /** App store links — used for the \"wallet not installed\" fallback. */\n store?: { ios?: string; android?: string };\n}\n\nexport const DEFAULT_WALLET_LINKS: Record<string, WalletLink> = WALLET_LINKS;\n","import type { WalletLink } from './registry';\n\nexport function isMobile(): boolean {\n if (typeof navigator === 'undefined') return false;\n const ua = navigator.userAgent || '';\n const uaDataMobile =\n (navigator as { userAgentData?: { mobile?: boolean } }).userAgentData?.mobile ?? false;\n return /iPhone|iPad|iPod|Android/i.test(ua) || uaDataMobile;\n}\n\nfunction buildLink(base: string, uri: string): string {\n const sep = base.includes('?') ? '&' : '?';\n return `${base}${sep}uri=${encodeURIComponent(uri)}`;\n}\n\n/**\n * Open the wallet for a WalletConnect pairing on mobile. Custom scheme first, in\n * the SAME TAB — that reliably foregrounds an installed app and, unlike a\n * _blank/popup navigation, is NOT suppressed once the click gesture has been lost\n * (which it has by the time connect() reaches here, after the async pairing setup).\n * Universal link is only a fallback for the rare wallet with no custom scheme.\n * The not-installed case is handled by the connector via detectAppOpen().\n */\nexport function openWallet(link: WalletLink, uri: string): void {\n if (typeof document === 'undefined') return;\n if (link.scheme) {\n openHref(buildLink(link.scheme, uri), false);\n } else if (link.universal) {\n openHref(buildLink(link.universal, uri), false);\n }\n}\n\n/**\n * Bring the wallet app to the foreground (no WC URI) — for an approval the user\n * must return to the wallet for. Uses the bare `native` scheme; call within a gesture.\n */\nexport function openWalletApp(link: WalletLink): void {\n if (typeof document === 'undefined') return;\n if (!link.native) return;\n openHref(link.native, false);\n}\n\nfunction openHref(href: string, newContext: boolean): void {\n const a = document.createElement('a');\n a.href = href;\n if (newContext) {\n a.target = '_blank';\n a.rel = 'noopener noreferrer';\n }\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n}\n\n/** Resolves true if the page was backgrounded (wallet likely opened) within the window. */\nexport function detectAppOpen(timeoutMs: number): Promise<boolean> {\n if (typeof document === 'undefined') return Promise.resolve(false);\n return new Promise((resolve) => {\n let done = false;\n const finish = (opened: boolean) => {\n if (done) return;\n done = true;\n document.removeEventListener('visibilitychange', onVisibility);\n window.removeEventListener('pagehide', onPageHide);\n clearTimeout(timer);\n resolve(opened);\n };\n const onVisibility = () => {\n if (document.hidden) finish(true);\n };\n const onPageHide = () => finish(true);\n document.addEventListener('visibilitychange', onVisibility);\n window.addEventListener('pagehide', onPageHide);\n const timer = setTimeout(() => finish(false), timeoutMs);\n });\n}\n","import SignClient from '@walletconnect/sign-client';\nimport { getSdkError, parseUri } 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\n constructor(\n private app: AppConfig,\n private options: WalletConnectOptions,\n ) {\n super();\n this.links = { ...DEFAULT_WALLET_LINKS, ...(options.walletLinks ?? {}) };\n }\n\n isAvailable(): boolean {\n return true;\n }\n\n private async getClient(): Promise<SignClient> {\n if (this.client) return this.client;\n const client = await SignClient.init({\n projectId: this.options.projectId,\n metadata: {\n name: this.app.appName,\n description: this.app.description ?? this.app.appName,\n url: deriveUrl(),\n icons: this.app.icon ? [this.app.icon] : [],\n },\n relayUrl: this.options.relayUrl,\n });\n\n client.on('session_delete', ({ topic }) => {\n const walletId = this.walletForTopic(topic);\n if (!walletId) return;\n this.topics.delete(walletId);\n this.persist();\n this.emit({ type: 'disconnect', walletId });\n });\n\n client.on('session_event', ({ topic, params }) => {\n const walletId = this.walletForTopic(topic);\n if (!walletId) return;\n const { name, data } = params.event;\n if (name === 'chainChanged') {\n // params.chainId is the CAIP-2 chain the event is scoped to; prefix the\n // bare value with its namespace rather than assuming eip155.\n const ns = params.chainId.split(':')[0] ?? 'eip155';\n const chainId =\n typeof data === 'string' && data.includes(':') ? data : `${ns}:${String(data)}`;\n this.emit({ type: 'chainChanged', walletId, chainId });\n } else if (name === 'accountsChanged' && Array.isArray(data) && data[0]) {\n const account = String(data[0]).split(':').pop() ?? '';\n if (account) this.emit({ type: 'accountsChanged', walletId, account });\n }\n });\n\n this.client = client;\n this.load();\n return client;\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const client = await this.getClient();\n\n const reused = this.tryReuse(client, req);\n if (reused) return reused;\n\n const { uri, approval } = await client.connect({\n requiredNamespaces: { [req.namespace.name]: req.namespace.value },\n });\n if (!uri) throw new Error('WalletConnect did not return a pairing URI');\n\n this.emit({ type: 'display_uri', walletId: req.walletId, uri });\n\n if (isMobile()) {\n const link = this.links[req.walletId];\n if (link) {\n openWallet(link, uri);\n void detectAppOpen(this.options.openTimeoutMs ?? 2000).then((opened) => {\n if (!opened)\n this.emit({\n type: 'wallet_open_failed',\n walletId: req.walletId,\n uri,\n store: link.store,\n });\n });\n }\n }\n\n const pairingTopic = parseUri(uri).topic;\n const session = await withSignal(approval(), req.signal, () => {\n void client.core.pairing.disconnect({ topic: pairingTopic }).catch(() => {});\n });\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 }\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,9 +1,13 @@
1
1
  {
2
2
  "name": "@lydianpay/lydianconnect",
3
- "version": "1.1.2",
3
+ "version": "1.1.4",
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",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/lydianpay/lydianconnect.git"
10
+ },
7
11
  "main": "./dist/index.cjs",
8
12
  "module": "./dist/index.js",
9
13
  "types": "./dist/index.d.ts",
@@ -37,12 +41,13 @@
37
41
  },
38
42
  "devDependencies": {
39
43
  "@eslint/js": "^9.13.0",
44
+ "@lydianpay/lydianconnect-catalog": "^1.2.1",
45
+ "@vitest/coverage-v8": "^2.1.0",
40
46
  "eslint": "^9.13.0",
41
47
  "jsdom": "^29.1.1",
42
48
  "tsup": "^8.3.0",
43
49
  "typescript": "^5.6.0",
44
50
  "typescript-eslint": "^8.11.0",
45
- "vitest": "^2.1.0",
46
- "@vitest/coverage-v8": "^2.1.0"
51
+ "vitest": "^2.1.0"
47
52
  }
48
53
  }