@solana/connector 0.2.1 → 0.2.3

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.
Files changed (79) hide show
  1. package/README.md +17 -0
  2. package/dist/{chunk-UCISIAOG.mjs → chunk-A7WQ3K75.mjs} +3 -3
  3. package/dist/{chunk-UCISIAOG.mjs.map → chunk-A7WQ3K75.mjs.map} +1 -1
  4. package/dist/{chunk-4Z2F6ERB.js → chunk-B6YBZB6H.js} +49 -48
  5. package/dist/chunk-B6YBZB6H.js.map +1 -0
  6. package/dist/{chunk-SITQ4JWM.js → chunk-BF67LVVM.js} +17 -21
  7. package/dist/chunk-BF67LVVM.js.map +1 -0
  8. package/dist/{chunk-IDTUFDNB.mjs → chunk-DFKGCW7K.mjs} +98 -12
  9. package/dist/chunk-DFKGCW7K.mjs.map +1 -0
  10. package/dist/chunk-E3DAIOYS.mjs +22 -0
  11. package/dist/chunk-E3DAIOYS.mjs.map +1 -0
  12. package/dist/chunk-FG7HTQTV.mjs +7 -0
  13. package/dist/chunk-FG7HTQTV.mjs.map +1 -0
  14. package/dist/chunk-L5FWMNWO.js +9 -0
  15. package/dist/chunk-L5FWMNWO.js.map +1 -0
  16. package/dist/{chunk-HN5AJF7F.js → chunk-NLPEO5GT.js} +5 -5
  17. package/dist/{chunk-HN5AJF7F.js.map → chunk-NLPEO5GT.js.map} +1 -1
  18. package/dist/chunk-QST7XLMB.js +26 -0
  19. package/dist/chunk-QST7XLMB.js.map +1 -0
  20. package/dist/{chunk-ZZTY3O4N.mjs → chunk-SJCQ3KZE.mjs} +4 -7
  21. package/dist/chunk-SJCQ3KZE.mjs.map +1 -0
  22. package/dist/{chunk-BZ2VBJCZ.js → chunk-ULEPN4NL.js} +181 -95
  23. package/dist/chunk-ULEPN4NL.js.map +1 -0
  24. package/dist/{chunk-HPQ5T32K.mjs → chunk-UOML5ULB.mjs} +4 -4
  25. package/dist/{chunk-HPQ5T32K.mjs.map → chunk-UOML5ULB.mjs.map} +1 -1
  26. package/dist/{chunk-MDR4Y37Z.mjs → chunk-WPDCSFX2.mjs} +5 -4
  27. package/dist/chunk-WPDCSFX2.mjs.map +1 -0
  28. package/dist/{chunk-BJAVJQLK.js → chunk-X2X5TFXS.js} +6 -6
  29. package/dist/{chunk-BJAVJQLK.js.map → chunk-X2X5TFXS.js.map} +1 -1
  30. package/dist/compat.js +2 -2
  31. package/dist/compat.mjs +1 -1
  32. package/dist/fireblocks-FLKRTJU3.js +67 -0
  33. package/dist/fireblocks-FLKRTJU3.js.map +1 -0
  34. package/dist/fireblocks-KCJV3GEK.mjs +65 -0
  35. package/dist/fireblocks-KCJV3GEK.mjs.map +1 -0
  36. package/dist/headless.d.mts +11 -11
  37. package/dist/headless.d.ts +11 -11
  38. package/dist/headless.js +147 -147
  39. package/dist/headless.mjs +4 -4
  40. package/dist/index.d.mts +1 -1
  41. package/dist/index.d.ts +1 -1
  42. package/dist/index.js +188 -188
  43. package/dist/index.mjs +5 -5
  44. package/dist/privy-6LYDE24Z.mjs +64 -0
  45. package/dist/privy-6LYDE24Z.mjs.map +1 -0
  46. package/dist/privy-ID4YFTKR.js +66 -0
  47. package/dist/privy-ID4YFTKR.js.map +1 -0
  48. package/dist/protocol-G-z1lRqo.d.mts +166 -0
  49. package/dist/protocol-G-z1lRqo.d.ts +166 -0
  50. package/dist/react.d.mts +3 -3
  51. package/dist/react.d.ts +3 -3
  52. package/dist/react.js +49 -49
  53. package/dist/react.mjs +2 -2
  54. package/dist/remote.d.mts +46 -0
  55. package/dist/remote.d.ts +46 -0
  56. package/dist/remote.js +212 -0
  57. package/dist/remote.js.map +1 -0
  58. package/dist/remote.mjs +198 -0
  59. package/dist/remote.mjs.map +1 -0
  60. package/dist/server.d.mts +141 -0
  61. package/dist/server.d.ts +141 -0
  62. package/dist/server.js +189 -0
  63. package/dist/server.js.map +1 -0
  64. package/dist/server.mjs +187 -0
  65. package/dist/server.mjs.map +1 -0
  66. package/dist/{standard-shim-tmnQelaJ.d.ts → standard-shim-BB0Lkg_C.d.ts} +44 -1
  67. package/dist/{standard-shim-CGB88PPO.d.mts → standard-shim-n5phZB1d.d.mts} +44 -1
  68. package/dist/{walletconnect-447EY3OJ.js → walletconnect-F2M3PAAN.js} +8 -8
  69. package/dist/{walletconnect-447EY3OJ.js.map → walletconnect-F2M3PAAN.js.map} +1 -1
  70. package/dist/walletconnect-Z6LPGALR.mjs +3 -0
  71. package/dist/{walletconnect-U455PO4I.mjs.map → walletconnect-Z6LPGALR.mjs.map} +1 -1
  72. package/package.json +27 -2
  73. package/dist/chunk-4Z2F6ERB.js.map +0 -1
  74. package/dist/chunk-BZ2VBJCZ.js.map +0 -1
  75. package/dist/chunk-IDTUFDNB.mjs.map +0 -1
  76. package/dist/chunk-MDR4Y37Z.mjs.map +0 -1
  77. package/dist/chunk-SITQ4JWM.js.map +0 -1
  78. package/dist/chunk-ZZTY3O4N.mjs.map +0 -1
  79. package/dist/walletconnect-U455PO4I.mjs +0 -3
package/README.md CHANGED
@@ -70,6 +70,12 @@ export function Providers({ children }: { children: React.ReactNode }) {
70
70
  autoConnect: true,
71
71
  enableMobile: true,
72
72
  clusters,
73
+ // Optional: Control which detected wallets are shown/available (Wallet Standard auto-discovery)
74
+ wallets: {
75
+ allowList: ['Phantom', 'Solflare', 'Backpack'],
76
+ denyList: ['Keplr', 'MetaMask'],
77
+ featured: ['Phantom', 'Solflare'],
78
+ },
73
79
  });
74
80
  }, []);
75
81
 
@@ -90,6 +96,16 @@ export function Providers({ children }: { children: React.ReactNode }) {
90
96
  }
91
97
  ```
92
98
 
99
+ **Optional: Wallet filtering & ordering**
100
+
101
+ ConnectorKit auto-detects wallets via Wallet Standard. To improve UX for users with many installed wallets, you can filter/prioritize the detected list using `wallets`.
102
+
103
+ - `allowList`: only expose these wallet names
104
+ - `denyList`: hide these wallet names (deny wins)
105
+ - `featured`: show these wallets first
106
+
107
+ This is **full-scope** filtering: hidden wallets are removed from `connectors` and cannot be selected or auto-connected.
108
+
93
109
  ### 3. Use Hooks (in any component)
94
110
 
95
111
  ```typescript
@@ -1467,6 +1483,7 @@ import { AppProvider, useConnector, useWallet, useConnectWallet } from '@solana/
1467
1483
  import type {
1468
1484
  // Configuration
1469
1485
  ConnectorConfig,
1486
+ WalletDisplayConfig,
1470
1487
  DefaultConfigOptions,
1471
1488
  ExtendedConnectorConfig,
1472
1489
 
@@ -1,4 +1,4 @@
1
- import { createLogger } from './chunk-ZZTY3O4N.mjs';
1
+ import { createLogger } from './chunk-SJCQ3KZE.mjs';
2
2
  import { getBase58Encoder, getBase58Decoder } from '@solana/codecs';
3
3
 
4
4
  // src/lib/wallet/walletconnect/universal-provider.ts
@@ -497,5 +497,5 @@ async function isWalletConnectAvailable() {
497
497
  }
498
498
 
499
499
  export { createMockWalletConnectTransport, createWalletConnectTransport, createWalletConnectWallet, isWalletConnectAvailable, registerWalletConnectWallet };
500
- //# sourceMappingURL=chunk-UCISIAOG.mjs.map
501
- //# sourceMappingURL=chunk-UCISIAOG.mjs.map
500
+ //# sourceMappingURL=chunk-A7WQ3K75.mjs.map
501
+ //# sourceMappingURL=chunk-A7WQ3K75.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/wallet/walletconnect/universal-provider.ts","../src/lib/wallet/walletconnect/create-walletconnect-wallet.ts","../src/lib/wallet/walletconnect/register-walletconnect.ts"],"names":["logger"],"mappings":"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","file":"chunk-UCISIAOG.mjs","sourcesContent":["/**\n * WalletConnect Universal Provider Adapter\n *\n * Provides a thin adapter around @walletconnect/universal-provider that:\n * - Lazily imports the provider (optional dependency)\n * - Handles display_uri events and forwards to onDisplayUri callback\n * - Implements the WalletConnectTransport interface\n *\n * @see https://docs.walletconnect.network/wallet-sdk/chain-support/solana\n */\n\nimport type { WalletConnectConfig, WalletConnectTransport } from '../../../types/walletconnect';\nimport { createLogger } from '../../utils/secure-logger';\n\nconst logger = createLogger('WalletConnectProvider');\n\n// Solana JSON-RPC methods we need to support\nconst SOLANA_METHODS = [\n 'solana_getAccounts',\n 'solana_requestAccounts',\n 'solana_signMessage',\n 'solana_signTransaction',\n 'solana_signAllTransactions',\n 'solana_signAndSendTransaction',\n] as const;\n\n// CAIP-2 chain IDs for Solana networks\n// Format: solana:<genesis_hash_first_32_chars>\nexport const SOLANA_CAIP_CHAINS = {\n 'solana:mainnet': 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n 'solana:devnet': 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n 'solana:testnet': 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z',\n} as const;\n\n// All CAIP chain IDs as an array (for requesting all chains)\nconst ALL_SOLANA_CAIP_CHAINS = Object.values(SOLANA_CAIP_CHAINS);\n\n/**\n * State for the WalletConnect provider instance\n */\ninterface ProviderState {\n provider: import('@walletconnect/universal-provider').default | null;\n initialized: boolean;\n connecting: boolean;\n connectPromise: Promise<void> | null;\n cancelConnect: (() => void) | null;\n sessionChangeListeners: Set<(accounts: string[]) => void>;\n}\n\n/**\n * Create a WalletConnect transport adapter\n *\n * This adapter lazily loads @walletconnect/universal-provider and implements\n * the WalletConnectTransport interface for use with the WalletConnect wallet shim.\n */\nexport async function createWalletConnectTransport(config: WalletConnectConfig): Promise<WalletConnectTransport> {\n const state: ProviderState = {\n provider: null,\n initialized: false,\n connecting: false,\n connectPromise: null,\n cancelConnect: null,\n sessionChangeListeners: new Set(),\n };\n\n /**\n * Notify all session change listeners with current accounts\n */\n function notifySessionChange(): void {\n if (!state.provider?.session) return;\n\n const accounts = getAccountsFromSession(state.provider.session);\n state.sessionChangeListeners.forEach(listener => {\n try {\n listener(accounts);\n } catch (error) {\n logger.warn('Error in session change listener', { error });\n }\n });\n }\n\n /**\n * Extract accounts from a WalletConnect session\n */\n function getAccountsFromSession(session: unknown): string[] {\n const accounts: string[] = [];\n const namespaces = (session as { namespaces?: Record<string, { accounts?: string[] }> } | null)?.namespaces;\n\n if (namespaces?.solana?.accounts) {\n for (const account of namespaces.solana.accounts) {\n // Account format: \"solana:chainId:address\"\n const parts = account.split(':');\n if (parts.length >= 3) {\n const address = parts.slice(2).join(':');\n if (address && !accounts.includes(address)) {\n accounts.push(address);\n }\n }\n }\n }\n return accounts;\n }\n\n function hasSolanaNamespace(session: unknown): boolean {\n const namespaces = (session as { namespaces?: Record<string, unknown> } | null | undefined)?.namespaces;\n if (!namespaces) return false;\n return 'solana' in namespaces;\n }\n\n async function safeCleanupPendingPairings(\n provider: import('@walletconnect/universal-provider').default,\n deletePairings = false,\n ): Promise<void> {\n const cleanup = (\n provider as unknown as { cleanupPendingPairings?: (opts?: { deletePairings?: boolean }) => Promise<void> }\n ).cleanupPendingPairings;\n if (!cleanup) return;\n try {\n await cleanup.call(provider, { deletePairings });\n } catch (error) {\n // ignore errors\n }\n }\n\n function safeAbortPairingAttempt(provider: import('@walletconnect/universal-provider').default): void {\n const abort = (provider as unknown as { abortPairingAttempt?: () => void }).abortPairingAttempt;\n if (!abort) return;\n try {\n abort.call(provider);\n } catch (error) {\n // ignore errors\n }\n }\n\n async function safeDisconnectProvider(\n provider: import('@walletconnect/universal-provider').default,\n ): Promise<void> {\n try {\n await provider.disconnect();\n } catch (error) {\n // ignore errors\n }\n }\n\n /**\n * Initialize the provider lazily\n */\n async function initProvider(): Promise<import('@walletconnect/universal-provider').default> {\n if (state.provider) {\n return state.provider;\n }\n\n // Dynamically import WalletConnect Universal Provider\n let UniversalProvider: typeof import('@walletconnect/universal-provider').default;\n\n try {\n const module = await import('@walletconnect/universal-provider');\n UniversalProvider = module.default;\n } catch (error) {\n throw new Error(\n 'WalletConnect is enabled but @walletconnect/universal-provider is not installed. ' +\n 'Please install it in your app (e.g. pnpm add @walletconnect/universal-provider).',\n );\n }\n\n // Initialize the provider\n const provider = await UniversalProvider.init({\n projectId: config.projectId,\n metadata: config.metadata,\n relayUrl: config.relayUrl,\n });\n\n // Set up event listeners\n provider.on('display_uri', (uri: string) => {\n if (config.onDisplayUri) {\n config.onDisplayUri(uri);\n } else if (process.env.NODE_ENV === 'development') {\n // Log to console in development if no handler provided\n }\n });\n\n provider.on('session_delete', () => {\n if (config.onSessionDisconnected) {\n config.onSessionDisconnected();\n }\n });\n\n // Handle session_update events (accounts may have changed)\n provider.on('session_update', () => {\n logger.debug('WalletConnect session_update received');\n notifySessionChange();\n });\n\n // Handle session_event (general session events that may include account changes)\n provider.on('session_event', (event: unknown) => {\n logger.debug('WalletConnect session_event received', { event });\n // Some wallets emit account changes through session_event\n notifySessionChange();\n });\n\n state.provider = provider;\n state.initialized = true;\n\n return provider;\n }\n\n const transport: WalletConnectTransport = {\n async connect(): Promise<void> {\n if (state.connectPromise) {\n await state.connectPromise;\n return;\n }\n\n state.connectPromise = (async () => {\n state.connecting = true;\n\n try {\n const CANCELLED = Symbol('WALLETCONNECT_CANCELLED');\n type Cancelled = typeof CANCELLED;\n\n let cancelResolve: (() => void) | null = null;\n const cancelPromise = new Promise<Cancelled>(resolve => {\n cancelResolve = () => resolve(CANCELLED);\n });\n\n let isCancelled = false;\n state.cancelConnect = () => {\n if (isCancelled) return;\n isCancelled = true;\n cancelResolve?.();\n };\n\n async function raceWithCancel<T>(promise: Promise<T>): Promise<T> {\n const result = await Promise.race([\n promise as Promise<T | Cancelled>,\n cancelPromise as Promise<T | Cancelled>,\n ]);\n if (result === CANCELLED) {\n throw new Error('Connection cancelled');\n }\n return result as T;\n }\n\n let provider: import('@walletconnect/universal-provider').default | null = null;\n let connectAttemptPromise: Promise<unknown> | null = null;\n\n provider = await raceWithCancel(initProvider());\n\n // If we already have a session, validate that it's actually a Solana session.\n // WalletConnect can restore sessions from storage; if it's not a Solana session,\n // we must disconnect and start a fresh pairing so we can request Solana accounts.\n if (provider.session) {\n if (hasSolanaNamespace(provider.session)) {\n if (config.onSessionEstablished) {\n config.onSessionEstablished();\n }\n return;\n }\n\n await raceWithCancel(safeDisconnectProvider(provider));\n // Clean up old pairings only after explicitly disconnecting an invalid session\n await raceWithCancel(safeCleanupPendingPairings(provider, false));\n }\n\n // Request ALL Solana chains so the session supports any cluster.\n // The actual chain used for requests will be determined by the current cluster.\n connectAttemptPromise = provider.connect({\n namespaces: {\n solana: {\n chains: [...ALL_SOLANA_CAIP_CHAINS],\n methods: [...SOLANA_METHODS],\n events: [],\n },\n },\n });\n\n try {\n await raceWithCancel(connectAttemptPromise);\n } catch (error) {\n // Prevent unhandled rejections if the underlying connect eventually errors.\n void connectAttemptPromise?.catch(() => {});\n throw error;\n }\n\n if (!provider.session) {\n throw new Error('WalletConnect: connect completed but no session was established');\n }\n if (!hasSolanaNamespace(provider.session)) {\n await raceWithCancel(safeDisconnectProvider(provider));\n throw new Error('WalletConnect: connected session does not include Solana namespace');\n }\n\n if (config.onSessionEstablished) {\n config.onSessionEstablished();\n }\n } finally {\n state.connecting = false;\n state.cancelConnect = null;\n state.connectPromise = null;\n }\n })();\n\n await state.connectPromise;\n },\n\n async disconnect(): Promise<void> {\n // Always cancel an in-flight connect attempt, even if the provider isn't initialized yet.\n if (state.cancelConnect) {\n try {\n state.cancelConnect();\n } catch {\n // ignore cancellation errors\n }\n }\n\n if (!state.provider) {\n if (config.onSessionDisconnected) {\n config.onSessionDisconnected();\n }\n return;\n }\n\n // Only abort/cleanup if there's no active session (i.e., still pairing)\n if (!state.provider.session) {\n safeAbortPairingAttempt(state.provider);\n // Don't delete pairings aggressively - just clean up expired ones\n await safeCleanupPendingPairings(state.provider, false);\n } else {\n // There's an active session - disconnect it properly\n await safeDisconnectProvider(state.provider);\n }\n\n if (config.onSessionDisconnected) {\n config.onSessionDisconnected();\n }\n },\n\n async request<T = unknown>(args: { method: string; params: unknown; chainId?: string }): Promise<T> {\n const provider = await initProvider();\n\n if (!provider.session) {\n throw new Error('WalletConnect: no active session. Call connect() first.');\n }\n\n try {\n return await provider.request<T>(\n {\n method: args.method,\n params: args.params as object | Record<string, unknown> | unknown[] | undefined,\n },\n args.chainId,\n );\n } catch (error) {\n throw error;\n }\n },\n\n isConnected(): boolean {\n return state.provider?.session != null;\n },\n\n getSessionAccounts(): string[] {\n if (!state.provider?.session) {\n return [];\n }\n return getAccountsFromSession(state.provider.session);\n },\n\n onSessionChanged(listener: (accounts: string[]) => void): () => void {\n state.sessionChangeListeners.add(listener);\n return () => {\n state.sessionChangeListeners.delete(listener);\n };\n },\n };\n\n return transport;\n}\n\n/**\n * Create a mock transport for testing purposes\n *\n * This allows testing the WalletConnect wallet shim without actual WalletConnect\n * network dependencies.\n */\nexport function createMockWalletConnectTransport(\n mockImplementation: Partial<WalletConnectTransport> = {},\n): WalletConnectTransport {\n let connected = false;\n const listeners = new Set<(accounts: string[]) => void>();\n\n const defaultTransport: WalletConnectTransport = {\n async connect(): Promise<void> {\n connected = true;\n },\n async disconnect(): Promise<void> {\n connected = false;\n },\n async request<T = unknown>(): Promise<T> {\n throw new Error('Mock transport: request not implemented');\n },\n isConnected(): boolean {\n return connected;\n },\n getSessionAccounts(): string[] {\n return [];\n },\n onSessionChanged(listener: (accounts: string[]) => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n };\n\n return {\n ...defaultTransport,\n ...mockImplementation,\n };\n}\n","/**\n * WalletConnect Wallet Standard Shim\n *\n * Creates a Wallet Standard-compatible wallet that proxies all operations\n * to WalletConnect Solana JSON-RPC methods.\n *\n * @see https://docs.walletconnect.network/wallet-sdk/chain-support/solana\n */\n\nimport type { Wallet, WalletAccount, WalletIcon } from '@wallet-standard/base';\nimport type {\n WalletConnectConfig,\n WalletConnectTransport,\n WalletConnectSolanaAccount,\n WalletConnectSignMessageResult,\n WalletConnectSignTransactionResult,\n WalletConnectSignAllTransactionsResult,\n WalletConnectSignAndSendTransactionResult,\n} from '../../../types/walletconnect';\nimport { getBase58Encoder, getBase58Decoder } from '@solana/codecs';\n\n// WalletConnect icon (official WC logo as SVG data URI)\nconst WALLETCONNECT_ICON: WalletIcon =\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiByeD0iOCIgZmlsbD0iIzMzOTZGRiIvPgo8cGF0aCBkPSJNOS42IDEyLjRDMTMuMSA5IDE4LjkgOSAyMi40IDEyLjRMMjIuOSAxMi45QzIzLjEgMTMuMSAyMy4xIDEzLjQgMjIuOSAxMy42TDIxLjQgMTUuMUMyMS4zIDE1LjIgMjEuMSAxNS4yIDIxIDE1LjFMMjAuMyAxNC40QzE4IDEyLjIgMTQgMTIuMiAxMS43IDE0LjRMMTEgMTUuMUMxMC45IDE1LjIgMTAuNyAxNS4yIDEwLjYgMTUuMUw5LjEgMTMuNkM4LjkgMTMuNCA4LjkgMTMuMSA5LjEgMTIuOUw5LjYgMTIuNFpNMjUuMyAxNS4yTDI2LjYgMTYuNUMyNi44IDE2LjcgMjYuOCAxNyAyNi42IDE3LjJMMjAuNyAyMy4xQzIwLjUgMjMuMyAyMC4yIDIzLjMgMjAgMjMuMUwxNS45IDE5QzE1LjggMTguOSAxNS43IDE4LjkgMTUuNiAxOUwxMS41IDIzLjFDMTEuMyAyMy4zIDExIDIzLjMgMTAuOCAyMy4xTDQuOSAxNy4yQzQuNyAxNyA0LjcgMTYuNyA0LjkgMTYuNUw2LjIgMTUuMkM2LjQgMTUgNi43IDE1IDYuOSAxNS4yTDExIDE5LjNDMTEuMSAxOS40IDExLjIgMTkuNCAxMS4zIDE5LjNMMTUuNCAxNS4yQzE1LjYgMTUgMTUuOSAxNSAxNi4xIDE1LjJMMjAuMiAxOS4zQzIwLjMgMTkuNCAyMC40IDE5LjQgMjAuNSAxOS4zTDI0LjYgMTUuMkMyNC44IDE1IDI1LjEgMTUgMjUuMyAxNS4yWiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg==';\n\nimport { SOLANA_CAIP_CHAINS } from './universal-provider';\n\n// Default supported chains\nconst DEFAULT_CHAINS = ['solana:mainnet', 'solana:devnet', 'solana:testnet'] as const;\n\nfunction toCaipChainId(chainId: string): string {\n return SOLANA_CAIP_CHAINS[chainId as keyof typeof SOLANA_CAIP_CHAINS] || chainId;\n}\n\n/**\n * Encode bytes to base64\n */\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n/**\n * Decode base64 to bytes\n */\nfunction base64ToBytes(base64: string): Uint8Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\n/**\n * Check if a string is likely base58 encoded (vs base64)\n * Base58 doesn't use: 0, O, I, l, +, /, =\n * If any of these are present, it's likely base64\n */\nfunction isLikelyBase58(str: string): boolean {\n // Base64 characters that are NOT in base58\n return !/[0OIl+/=]/.test(str);\n}\n\n/**\n * Decode a transaction string that could be base58 or base64\n * Some wallets (like Backpack) return base58, others return base64\n */\nfunction decodeTransaction(encoded: string): Uint8Array {\n if (isLikelyBase58(encoded)) {\n // Note: getBase58Encoder().encode() takes a base58 string and returns bytes\n // Convert ReadonlyUint8Array to Uint8Array\n const readonlyBytes = getBase58Encoder().encode(encoded);\n return new Uint8Array(readonlyBytes);\n } else {\n return base64ToBytes(encoded);\n }\n}\n\n/**\n * Decode shortvec-encoded length prefix from serialized transaction\n */\nfunction decodeShortVecLength(data: Uint8Array): { length: number; bytesConsumed: number } {\n let length = 0;\n let size = 0;\n\n for (;;) {\n if (size >= data.length) {\n throw new Error('Invalid shortvec encoding: unexpected end of data');\n }\n const byte = data[size];\n length |= (byte & 0x7f) << (size * 7);\n size += 1;\n\n if ((byte & 0x80) === 0) {\n break;\n }\n if (size > 10) {\n throw new Error('Invalid shortvec encoding: length prefix too long');\n }\n }\n\n return { length, bytesConsumed: size };\n}\n\n/**\n * Parse transaction message to find the index of a signer\n */\nfunction findSignerIndex(txBytes: Uint8Array, signerPubkeyBase58: string): number {\n const { length: numSignatures, bytesConsumed: sigCountSize } = decodeShortVecLength(txBytes);\n const messageOffset = sigCountSize + numSignatures * 64;\n const messageBytes = txBytes.subarray(messageOffset);\n\n // Parse message header\n let offset = 0;\n\n // Check for version byte (0x80 = version 0)\n if (messageBytes[0] === 0x80) {\n offset = 1;\n }\n\n // Read header (3 bytes)\n const numSignerAccounts = messageBytes[offset];\n offset += 3;\n\n // Read static accounts array\n const { length: numStaticAccounts, bytesConsumed } = decodeShortVecLength(messageBytes.subarray(offset));\n offset += bytesConsumed;\n\n // Search for the signer pubkey in the static accounts\n const base58Decoder = getBase58Decoder();\n for (let i = 0; i < Math.min(numStaticAccounts, numSignerAccounts); i++) {\n const accountBytes = messageBytes.subarray(offset + i * 32, offset + (i + 1) * 32);\n const accountAddress = base58Decoder.decode(accountBytes);\n if (accountAddress === signerPubkeyBase58) {\n return i;\n }\n }\n\n return -1;\n}\n\n/**\n * Inject a signature into a serialized transaction at the specified signer index\n */\nfunction injectSignature(txBytes: Uint8Array, signerIndex: number, signatureBase58: string): Uint8Array {\n const { bytesConsumed: sigCountSize } = decodeShortVecLength(txBytes);\n\n // Decode signature from base58 to bytes\n const signatureBytes = getBase58Encoder().encode(signatureBase58);\n if (signatureBytes.length !== 64) {\n throw new Error(`Invalid signature length: expected 64 bytes, got ${signatureBytes.length}`);\n }\n\n // Create a copy and inject the signature\n const result = new Uint8Array(txBytes);\n const signatureOffset = sigCountSize + signerIndex * 64;\n result.set(signatureBytes, signatureOffset);\n\n return result;\n}\n\n/**\n * Convert WalletConnect account response to Wallet Standard account\n */\nfunction toWalletAccount(account: WalletConnectSolanaAccount, chains: readonly string[]): WalletAccount {\n const base58Encoder = getBase58Encoder();\n return {\n address: account.pubkey,\n publicKey: base58Encoder.encode(account.pubkey),\n chains: chains as `${string}:${string}`[],\n features: [],\n };\n}\n\n/**\n * Create a Wallet Standard-compatible wallet that uses WalletConnect\n */\nexport function createWalletConnectWallet(config: WalletConnectConfig, transport: WalletConnectTransport): Wallet {\n const chains = (config.defaultChain ? [config.defaultChain] : DEFAULT_CHAINS) as readonly `${string}:${string}`[];\n\n // Function to get the current CAIP chain ID dynamically\n function getCurrentCaipChainId(): string {\n const currentChain = config.getCurrentChain?.() || config.defaultChain || 'solana:mainnet';\n return toCaipChainId(currentChain);\n }\n\n let accounts: WalletAccount[] = [];\n const changeListeners = new Set<(props: { accounts?: readonly WalletAccount[] }) => void>();\n\n function emitChange() {\n changeListeners.forEach(fn => fn({ accounts }));\n }\n\n /**\n * Refresh accounts from the session.\n * Called when transport notifies of session changes.\n */\n function refreshAccountsFromSession(sessionAccounts: string[]): void {\n if (sessionAccounts.length === 0) {\n // Session cleared - emit with empty accounts\n accounts = [];\n emitChange();\n return;\n }\n\n // Convert session accounts to Wallet Standard accounts\n accounts = sessionAccounts.map(pubkey => toWalletAccount({ pubkey }, chains));\n emitChange();\n }\n\n // Subscribe to session changes from the transport and capture unsubscribe function\n let unsubscribeSessionChanged: (() => void) | undefined;\n if (transport.onSessionChanged) {\n const unsubscribe = transport.onSessionChanged(refreshAccountsFromSession);\n // Guard for transports that return void (no-op) - store only if it's a function\n if (typeof unsubscribe === 'function') {\n unsubscribeSessionChanged = unsubscribe;\n }\n }\n\n /**\n * Cleanup function to unsubscribe from session changes\n */\n function cleanupSessionSubscription(): void {\n if (unsubscribeSessionChanged) {\n unsubscribeSessionChanged();\n unsubscribeSessionChanged = undefined; // Clear reference to avoid double-calls\n }\n }\n\n const wallet: Wallet & { cleanup?: () => void } = {\n version: '1.0.0',\n name: 'WalletConnect',\n icon: WALLETCONNECT_ICON,\n chains,\n get accounts() {\n return accounts;\n },\n cleanup: cleanupSessionSubscription,\n features: {\n // Standard connect feature\n 'standard:connect': {\n version: '1.0.0',\n connect: async (input?: { silent?: boolean }) => {\n await transport.connect();\n\n // First, try to get accounts from the session namespaces (most reliable)\n const sessionAccounts = transport.getSessionAccounts();\n\n if (sessionAccounts.length > 0) {\n accounts = sessionAccounts.map(pubkey => toWalletAccount({ pubkey }, chains));\n emitChange();\n return { accounts };\n }\n\n // Fallback: Try RPC methods if session doesn't have accounts\n const method = input?.silent ? 'solana_getAccounts' : 'solana_requestAccounts';\n let result: WalletConnectSolanaAccount[];\n let firstError: unknown;\n\n try {\n result = await transport.request<WalletConnectSolanaAccount[]>({\n method,\n params: {},\n chainId: getCurrentCaipChainId(),\n });\n } catch (error) {\n firstError = error;\n // Fallback to the other method\n try {\n const fallbackMethod =\n method === 'solana_getAccounts' ? 'solana_requestAccounts' : 'solana_getAccounts';\n result = await transport.request<WalletConnectSolanaAccount[]>({\n method: fallbackMethod,\n params: {},\n chainId: getCurrentCaipChainId(),\n });\n } catch (fallbackError) {\n const firstMessage = firstError instanceof Error ? firstError.message : String(firstError);\n const fallbackMessage =\n fallbackError instanceof Error ? fallbackError.message : String(fallbackError);\n const details = [firstMessage, fallbackMessage].filter(Boolean).join(' | ');\n throw new Error(\n `Failed to get accounts from WalletConnect. The wallet may not support Solana accounts.${\n details ? ` (Details: ${details})` : ''\n }`,\n );\n }\n }\n\n // Map to Wallet Standard accounts\n accounts = Array.isArray(result) ? result.map(acc => toWalletAccount(acc, chains)) : [];\n emitChange();\n\n return { accounts };\n },\n },\n\n // Standard disconnect feature\n 'standard:disconnect': {\n version: '1.0.0',\n disconnect: async () => {\n // Unsubscribe from session changes before disconnecting\n cleanupSessionSubscription();\n await transport.disconnect();\n accounts = [];\n emitChange();\n },\n },\n\n // Standard events feature\n 'standard:events': {\n version: '1.0.0',\n on: (event: string, listener: (props: { accounts?: readonly WalletAccount[] }) => void) => {\n if (event !== 'change') return () => {};\n changeListeners.add(listener);\n return () => changeListeners.delete(listener);\n },\n },\n\n // Solana sign message feature\n 'solana:signMessage': {\n version: '1.0.0',\n signMessage: async ({ account, message }: { account: WalletAccount; message: Uint8Array }) => {\n // WalletConnect expects message as base58 string\n const base58Decoder = getBase58Decoder();\n const messageBase58 = base58Decoder.decode(message);\n\n const result = await transport.request<WalletConnectSignMessageResult>({\n method: 'solana_signMessage',\n params: {\n message: messageBase58,\n pubkey: account.address,\n },\n chainId: getCurrentCaipChainId(),\n });\n\n // WalletConnect returns signature as base58 string, convert to bytes\n const signatureBytes = getBase58Encoder().encode(result.signature);\n\n return [{ signature: signatureBytes, signedMessage: message }];\n },\n },\n\n // Solana sign transaction feature\n 'solana:signTransaction': {\n version: '1.0.0',\n signTransaction: async ({\n account,\n transaction,\n }: {\n account: WalletAccount;\n transaction: Uint8Array;\n }) => {\n // WalletConnect expects transaction as base64 string\n const transactionBase64 = bytesToBase64(transaction);\n\n const requestChainId = getCurrentCaipChainId();\n\n const result = await transport.request<WalletConnectSignTransactionResult>({\n method: 'solana_signTransaction',\n params: {\n transaction: transactionBase64,\n },\n chainId: requestChainId,\n });\n\n let signedTransaction: Uint8Array;\n\n if (result.transaction) {\n // Wallet returned the full signed transaction\n signedTransaction = decodeTransaction(result.transaction);\n } else if (result.signature) {\n // Wallet returned only the signature, inject it into the original transaction\n const signerIndex = findSignerIndex(transaction, account.address);\n if (signerIndex < 0) {\n throw new Error('Signer pubkey not found in transaction');\n }\n signedTransaction = injectSignature(transaction, signerIndex, result.signature);\n } else {\n throw new Error('Invalid solana_signTransaction response: no signature or transaction');\n }\n\n return [{ signedTransaction }];\n },\n },\n\n // Solana sign all transactions feature\n 'solana:signAllTransactions': {\n version: '1.0.0',\n signAllTransactions: async ({\n account,\n transactions,\n }: {\n account: WalletAccount;\n transactions: Uint8Array[];\n }) => {\n // WalletConnect expects transactions as base64 strings\n const transactionsBase64 = transactions.map(bytesToBase64);\n\n try {\n const result = await transport.request<WalletConnectSignAllTransactionsResult>({\n method: 'solana_signAllTransactions',\n params: {\n transactions: transactionsBase64,\n },\n chainId: getCurrentCaipChainId(),\n });\n\n // Map back to bytes - could be base58 or base64 depending on wallet\n return result.transactions.map(txEncoded => ({\n signedTransaction: decodeTransaction(txEncoded),\n }));\n } catch (error) {\n // Fallback: sign transactions one by one\n\n const signFeature = wallet.features['solana:signTransaction'] as {\n signTransaction: (args: {\n account: WalletAccount;\n transaction: Uint8Array;\n }) => Promise<{ signedTransaction: Uint8Array }[]>;\n };\n\n const results = await Promise.all(\n transactions.map(tx => signFeature.signTransaction({ account, transaction: tx })),\n );\n\n return results.map(r => ({ signedTransaction: r[0].signedTransaction }));\n }\n },\n },\n\n // Solana sign and send transaction feature\n 'solana:signAndSendTransaction': {\n version: '1.0.0',\n signAndSendTransaction: async ({\n transaction,\n options,\n }: {\n account: WalletAccount;\n transaction: Uint8Array;\n options?: {\n skipPreflight?: boolean;\n preflightCommitment?: string;\n maxRetries?: number;\n minContextSlot?: number;\n };\n }) => {\n // WalletConnect expects transaction as base64 string\n const transactionBase64 = bytesToBase64(transaction);\n\n const result = await transport.request<WalletConnectSignAndSendTransactionResult>({\n method: 'solana_signAndSendTransaction',\n params: {\n transaction: transactionBase64,\n sendOptions: options\n ? {\n skipPreflight: options.skipPreflight,\n preflightCommitment: options.preflightCommitment as\n | 'processed'\n | 'confirmed'\n | 'finalized'\n | undefined,\n maxRetries: options.maxRetries,\n minContextSlot: options.minContextSlot,\n }\n : undefined,\n },\n chainId: getCurrentCaipChainId(),\n });\n\n // Return signature bytes (convert from base58)\n const signatureBytes = getBase58Encoder().encode(result.signature);\n\n return [{ signature: signatureBytes }];\n },\n },\n },\n };\n\n return wallet;\n}\n","/**\n * WalletConnect Registration Helper\n *\n * Registers the WalletConnect wallet shim into the Wallet Standard registry,\n * making it available to ConnectorKit's wallet detection system.\n */\n\nimport type { Wallet } from '@wallet-standard/base';\nimport type { WalletConnectConfig } from '../../../types/walletconnect';\nimport { createWalletConnectWallet } from './create-walletconnect-wallet';\nimport { createWalletConnectTransport } from './universal-provider';\nimport { createLogger } from '../../utils/secure-logger';\n\nconst logger = createLogger('WalletConnectRegistration');\n\n/**\n * Result of registering the WalletConnect wallet\n */\nexport interface WalletConnectRegistration {\n /** The registered wallet instance */\n wallet: Wallet;\n /** Function to unregister the wallet from the registry */\n unregister: () => void;\n}\n\n/**\n * Register a WalletConnect wallet into the Wallet Standard registry\n *\n * This function:\n * 1. Creates a WalletConnect transport adapter\n * 2. Creates a Wallet Standard-compatible wallet shim\n * 3. Registers the wallet with the Wallet Standard registry\n *\n * The wallet will appear in ConnectorKit's wallet list as \"WalletConnect\"\n * and can be selected like any other wallet.\n *\n * @param config - WalletConnect configuration\n * @returns Registration result with wallet and unregister function\n *\n * @example\n * ```typescript\n * const { wallet, unregister } = await registerWalletConnectWallet({\n * projectId: 'your-project-id',\n * metadata: {\n * name: 'My App',\n * description: 'My Solana App',\n * url: 'https://myapp.com',\n * icons: ['https://myapp.com/icon.png'],\n * },\n * onDisplayUri: (uri) => {\n * // Show QR code with this URI\n * },\n * });\n *\n * // Later, to remove from registry:\n * unregister();\n * ```\n */\nexport async function registerWalletConnectWallet(config: WalletConnectConfig): Promise<WalletConnectRegistration> {\n if (typeof window === 'undefined') {\n throw new Error('WalletConnect registration can only be done in a browser environment');\n }\n\n logger.debug('Registering WalletConnect wallet', {\n projectId: config.projectId.substring(0, 8) + '...',\n defaultChain: config.defaultChain,\n });\n\n // Create the transport adapter\n const transport = await createWalletConnectTransport(config);\n\n // Create the Wallet Standard wallet shim\n const wallet = createWalletConnectWallet(config, transport);\n\n // Get the Wallet Standard registry and register the wallet\n const { getWallets } = await import('@wallet-standard/app');\n const wallets = getWallets();\n const unregister = wallets.register(wallet);\n\n logger.info('WalletConnect wallet registered successfully');\n\n return {\n wallet,\n unregister,\n };\n}\n\n/**\n * Check if WalletConnect dependencies are available\n *\n * This function checks if @walletconnect/universal-provider can be imported.\n * Useful for conditionally showing WalletConnect options in UI.\n */\nexport async function isWalletConnectAvailable(): Promise<boolean> {\n if (typeof window === 'undefined') {\n return false;\n }\n\n try {\n await import('@walletconnect/universal-provider');\n return true;\n } catch {\n return false;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/lib/wallet/walletconnect/universal-provider.ts","../src/lib/wallet/walletconnect/create-walletconnect-wallet.ts","../src/lib/wallet/walletconnect/register-walletconnect.ts"],"names":["logger"],"mappings":"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","file":"chunk-A7WQ3K75.mjs","sourcesContent":["/**\n * WalletConnect Universal Provider Adapter\n *\n * Provides a thin adapter around @walletconnect/universal-provider that:\n * - Lazily imports the provider (optional dependency)\n * - Handles display_uri events and forwards to onDisplayUri callback\n * - Implements the WalletConnectTransport interface\n *\n * @see https://docs.walletconnect.network/wallet-sdk/chain-support/solana\n */\n\nimport type { WalletConnectConfig, WalletConnectTransport } from '../../../types/walletconnect';\nimport { createLogger } from '../../utils/secure-logger';\n\nconst logger = createLogger('WalletConnectProvider');\n\n// Solana JSON-RPC methods we need to support\nconst SOLANA_METHODS = [\n 'solana_getAccounts',\n 'solana_requestAccounts',\n 'solana_signMessage',\n 'solana_signTransaction',\n 'solana_signAllTransactions',\n 'solana_signAndSendTransaction',\n] as const;\n\n// CAIP-2 chain IDs for Solana networks\n// Format: solana:<genesis_hash_first_32_chars>\nexport const SOLANA_CAIP_CHAINS = {\n 'solana:mainnet': 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n 'solana:devnet': 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n 'solana:testnet': 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z',\n} as const;\n\n// All CAIP chain IDs as an array (for requesting all chains)\nconst ALL_SOLANA_CAIP_CHAINS = Object.values(SOLANA_CAIP_CHAINS);\n\n/**\n * State for the WalletConnect provider instance\n */\ninterface ProviderState {\n provider: import('@walletconnect/universal-provider').default | null;\n initialized: boolean;\n connecting: boolean;\n connectPromise: Promise<void> | null;\n cancelConnect: (() => void) | null;\n sessionChangeListeners: Set<(accounts: string[]) => void>;\n}\n\n/**\n * Create a WalletConnect transport adapter\n *\n * This adapter lazily loads @walletconnect/universal-provider and implements\n * the WalletConnectTransport interface for use with the WalletConnect wallet shim.\n */\nexport async function createWalletConnectTransport(config: WalletConnectConfig): Promise<WalletConnectTransport> {\n const state: ProviderState = {\n provider: null,\n initialized: false,\n connecting: false,\n connectPromise: null,\n cancelConnect: null,\n sessionChangeListeners: new Set(),\n };\n\n /**\n * Notify all session change listeners with current accounts\n */\n function notifySessionChange(): void {\n if (!state.provider?.session) return;\n\n const accounts = getAccountsFromSession(state.provider.session);\n state.sessionChangeListeners.forEach(listener => {\n try {\n listener(accounts);\n } catch (error) {\n logger.warn('Error in session change listener', { error });\n }\n });\n }\n\n /**\n * Extract accounts from a WalletConnect session\n */\n function getAccountsFromSession(session: unknown): string[] {\n const accounts: string[] = [];\n const namespaces = (session as { namespaces?: Record<string, { accounts?: string[] }> } | null)?.namespaces;\n\n if (namespaces?.solana?.accounts) {\n for (const account of namespaces.solana.accounts) {\n // Account format: \"solana:chainId:address\"\n const parts = account.split(':');\n if (parts.length >= 3) {\n const address = parts.slice(2).join(':');\n if (address && !accounts.includes(address)) {\n accounts.push(address);\n }\n }\n }\n }\n return accounts;\n }\n\n function hasSolanaNamespace(session: unknown): boolean {\n const namespaces = (session as { namespaces?: Record<string, unknown> } | null | undefined)?.namespaces;\n if (!namespaces) return false;\n return 'solana' in namespaces;\n }\n\n async function safeCleanupPendingPairings(\n provider: import('@walletconnect/universal-provider').default,\n deletePairings = false,\n ): Promise<void> {\n const cleanup = (\n provider as unknown as { cleanupPendingPairings?: (opts?: { deletePairings?: boolean }) => Promise<void> }\n ).cleanupPendingPairings;\n if (!cleanup) return;\n try {\n await cleanup.call(provider, { deletePairings });\n } catch (error) {\n // ignore errors\n }\n }\n\n function safeAbortPairingAttempt(provider: import('@walletconnect/universal-provider').default): void {\n const abort = (provider as unknown as { abortPairingAttempt?: () => void }).abortPairingAttempt;\n if (!abort) return;\n try {\n abort.call(provider);\n } catch (error) {\n // ignore errors\n }\n }\n\n async function safeDisconnectProvider(\n provider: import('@walletconnect/universal-provider').default,\n ): Promise<void> {\n try {\n await provider.disconnect();\n } catch (error) {\n // ignore errors\n }\n }\n\n /**\n * Initialize the provider lazily\n */\n async function initProvider(): Promise<import('@walletconnect/universal-provider').default> {\n if (state.provider) {\n return state.provider;\n }\n\n // Dynamically import WalletConnect Universal Provider\n let UniversalProvider: typeof import('@walletconnect/universal-provider').default;\n\n try {\n const module = await import('@walletconnect/universal-provider');\n UniversalProvider = module.default;\n } catch (error) {\n throw new Error(\n 'WalletConnect is enabled but @walletconnect/universal-provider is not installed. ' +\n 'Please install it in your app (e.g. pnpm add @walletconnect/universal-provider).',\n );\n }\n\n // Initialize the provider\n const provider = await UniversalProvider.init({\n projectId: config.projectId,\n metadata: config.metadata,\n relayUrl: config.relayUrl,\n });\n\n // Set up event listeners\n provider.on('display_uri', (uri: string) => {\n if (config.onDisplayUri) {\n config.onDisplayUri(uri);\n } else if (process.env.NODE_ENV === 'development') {\n // Log to console in development if no handler provided\n }\n });\n\n provider.on('session_delete', () => {\n if (config.onSessionDisconnected) {\n config.onSessionDisconnected();\n }\n });\n\n // Handle session_update events (accounts may have changed)\n provider.on('session_update', () => {\n logger.debug('WalletConnect session_update received');\n notifySessionChange();\n });\n\n // Handle session_event (general session events that may include account changes)\n provider.on('session_event', (event: unknown) => {\n logger.debug('WalletConnect session_event received', { event });\n // Some wallets emit account changes through session_event\n notifySessionChange();\n });\n\n state.provider = provider;\n state.initialized = true;\n\n return provider;\n }\n\n const transport: WalletConnectTransport = {\n async connect(): Promise<void> {\n if (state.connectPromise) {\n await state.connectPromise;\n return;\n }\n\n state.connectPromise = (async () => {\n state.connecting = true;\n\n try {\n const CANCELLED = Symbol('WALLETCONNECT_CANCELLED');\n type Cancelled = typeof CANCELLED;\n\n let cancelResolve: (() => void) | null = null;\n const cancelPromise = new Promise<Cancelled>(resolve => {\n cancelResolve = () => resolve(CANCELLED);\n });\n\n let isCancelled = false;\n state.cancelConnect = () => {\n if (isCancelled) return;\n isCancelled = true;\n cancelResolve?.();\n };\n\n async function raceWithCancel<T>(promise: Promise<T>): Promise<T> {\n const result = await Promise.race([\n promise as Promise<T | Cancelled>,\n cancelPromise as Promise<T | Cancelled>,\n ]);\n if (result === CANCELLED) {\n throw new Error('Connection cancelled');\n }\n return result as T;\n }\n\n let provider: import('@walletconnect/universal-provider').default | null = null;\n let connectAttemptPromise: Promise<unknown> | null = null;\n\n provider = await raceWithCancel(initProvider());\n\n // If we already have a session, validate that it's actually a Solana session.\n // WalletConnect can restore sessions from storage; if it's not a Solana session,\n // we must disconnect and start a fresh pairing so we can request Solana accounts.\n if (provider.session) {\n if (hasSolanaNamespace(provider.session)) {\n if (config.onSessionEstablished) {\n config.onSessionEstablished();\n }\n return;\n }\n\n await raceWithCancel(safeDisconnectProvider(provider));\n // Clean up old pairings only after explicitly disconnecting an invalid session\n await raceWithCancel(safeCleanupPendingPairings(provider, false));\n }\n\n // Request ALL Solana chains so the session supports any cluster.\n // The actual chain used for requests will be determined by the current cluster.\n connectAttemptPromise = provider.connect({\n namespaces: {\n solana: {\n chains: [...ALL_SOLANA_CAIP_CHAINS],\n methods: [...SOLANA_METHODS],\n events: [],\n },\n },\n });\n\n try {\n await raceWithCancel(connectAttemptPromise);\n } catch (error) {\n // Prevent unhandled rejections if the underlying connect eventually errors.\n void connectAttemptPromise?.catch(() => {});\n throw error;\n }\n\n if (!provider.session) {\n throw new Error('WalletConnect: connect completed but no session was established');\n }\n if (!hasSolanaNamespace(provider.session)) {\n await raceWithCancel(safeDisconnectProvider(provider));\n throw new Error('WalletConnect: connected session does not include Solana namespace');\n }\n\n if (config.onSessionEstablished) {\n config.onSessionEstablished();\n }\n } finally {\n state.connecting = false;\n state.cancelConnect = null;\n state.connectPromise = null;\n }\n })();\n\n await state.connectPromise;\n },\n\n async disconnect(): Promise<void> {\n // Always cancel an in-flight connect attempt, even if the provider isn't initialized yet.\n if (state.cancelConnect) {\n try {\n state.cancelConnect();\n } catch {\n // ignore cancellation errors\n }\n }\n\n if (!state.provider) {\n if (config.onSessionDisconnected) {\n config.onSessionDisconnected();\n }\n return;\n }\n\n // Only abort/cleanup if there's no active session (i.e., still pairing)\n if (!state.provider.session) {\n safeAbortPairingAttempt(state.provider);\n // Don't delete pairings aggressively - just clean up expired ones\n await safeCleanupPendingPairings(state.provider, false);\n } else {\n // There's an active session - disconnect it properly\n await safeDisconnectProvider(state.provider);\n }\n\n if (config.onSessionDisconnected) {\n config.onSessionDisconnected();\n }\n },\n\n async request<T = unknown>(args: { method: string; params: unknown; chainId?: string }): Promise<T> {\n const provider = await initProvider();\n\n if (!provider.session) {\n throw new Error('WalletConnect: no active session. Call connect() first.');\n }\n\n try {\n return await provider.request<T>(\n {\n method: args.method,\n params: args.params as object | Record<string, unknown> | unknown[] | undefined,\n },\n args.chainId,\n );\n } catch (error) {\n throw error;\n }\n },\n\n isConnected(): boolean {\n return state.provider?.session != null;\n },\n\n getSessionAccounts(): string[] {\n if (!state.provider?.session) {\n return [];\n }\n return getAccountsFromSession(state.provider.session);\n },\n\n onSessionChanged(listener: (accounts: string[]) => void): () => void {\n state.sessionChangeListeners.add(listener);\n return () => {\n state.sessionChangeListeners.delete(listener);\n };\n },\n };\n\n return transport;\n}\n\n/**\n * Create a mock transport for testing purposes\n *\n * This allows testing the WalletConnect wallet shim without actual WalletConnect\n * network dependencies.\n */\nexport function createMockWalletConnectTransport(\n mockImplementation: Partial<WalletConnectTransport> = {},\n): WalletConnectTransport {\n let connected = false;\n const listeners = new Set<(accounts: string[]) => void>();\n\n const defaultTransport: WalletConnectTransport = {\n async connect(): Promise<void> {\n connected = true;\n },\n async disconnect(): Promise<void> {\n connected = false;\n },\n async request<T = unknown>(): Promise<T> {\n throw new Error('Mock transport: request not implemented');\n },\n isConnected(): boolean {\n return connected;\n },\n getSessionAccounts(): string[] {\n return [];\n },\n onSessionChanged(listener: (accounts: string[]) => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n };\n\n return {\n ...defaultTransport,\n ...mockImplementation,\n };\n}\n","/**\n * WalletConnect Wallet Standard Shim\n *\n * Creates a Wallet Standard-compatible wallet that proxies all operations\n * to WalletConnect Solana JSON-RPC methods.\n *\n * @see https://docs.walletconnect.network/wallet-sdk/chain-support/solana\n */\n\nimport type { Wallet, WalletAccount, WalletIcon } from '@wallet-standard/base';\nimport type {\n WalletConnectConfig,\n WalletConnectTransport,\n WalletConnectSolanaAccount,\n WalletConnectSignMessageResult,\n WalletConnectSignTransactionResult,\n WalletConnectSignAllTransactionsResult,\n WalletConnectSignAndSendTransactionResult,\n} from '../../../types/walletconnect';\nimport { getBase58Encoder, getBase58Decoder } from '@solana/codecs';\n\n// WalletConnect icon (official WC logo as SVG data URI)\nconst WALLETCONNECT_ICON: WalletIcon =\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiByeD0iOCIgZmlsbD0iIzMzOTZGRiIvPgo8cGF0aCBkPSJNOS42IDEyLjRDMTMuMSA5IDE4LjkgOSAyMi40IDEyLjRMMjIuOSAxMi45QzIzLjEgMTMuMSAyMy4xIDEzLjQgMjIuOSAxMy42TDIxLjQgMTUuMUMyMS4zIDE1LjIgMjEuMSAxNS4yIDIxIDE1LjFMMjAuMyAxNC40QzE4IDEyLjIgMTQgMTIuMiAxMS43IDE0LjRMMTEgMTUuMUMxMC45IDE1LjIgMTAuNyAxNS4yIDEwLjYgMTUuMUw5LjEgMTMuNkM4LjkgMTMuNCA4LjkgMTMuMSA5LjEgMTIuOUw5LjYgMTIuNFpNMjUuMyAxNS4yTDI2LjYgMTYuNUMyNi44IDE2LjcgMjYuOCAxNyAyNi42IDE3LjJMMjAuNyAyMy4xQzIwLjUgMjMuMyAyMC4yIDIzLjMgMjAgMjMuMUwxNS45IDE5QzE1LjggMTguOSAxNS43IDE4LjkgMTUuNiAxOUwxMS41IDIzLjFDMTEuMyAyMy4zIDExIDIzLjMgMTAuOCAyMy4xTDQuOSAxNy4yQzQuNyAxNyA0LjcgMTYuNyA0LjkgMTYuNUw2LjIgMTUuMkM2LjQgMTUgNi43IDE1IDYuOSAxNS4yTDExIDE5LjNDMTEuMSAxOS40IDExLjIgMTkuNCAxMS4zIDE5LjNMMTUuNCAxNS4yQzE1LjYgMTUgMTUuOSAxNSAxNi4xIDE1LjJMMjAuMiAxOS4zQzIwLjMgMTkuNCAyMC40IDE5LjQgMjAuNSAxOS4zTDI0LjYgMTUuMkMyNC44IDE1IDI1LjEgMTUgMjUuMyAxNS4yWiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg==';\n\nimport { SOLANA_CAIP_CHAINS } from './universal-provider';\n\n// Default supported chains\nconst DEFAULT_CHAINS = ['solana:mainnet', 'solana:devnet', 'solana:testnet'] as const;\n\nfunction toCaipChainId(chainId: string): string {\n return SOLANA_CAIP_CHAINS[chainId as keyof typeof SOLANA_CAIP_CHAINS] || chainId;\n}\n\n/**\n * Encode bytes to base64\n */\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n/**\n * Decode base64 to bytes\n */\nfunction base64ToBytes(base64: string): Uint8Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\n/**\n * Check if a string is likely base58 encoded (vs base64)\n * Base58 doesn't use: 0, O, I, l, +, /, =\n * If any of these are present, it's likely base64\n */\nfunction isLikelyBase58(str: string): boolean {\n // Base64 characters that are NOT in base58\n return !/[0OIl+/=]/.test(str);\n}\n\n/**\n * Decode a transaction string that could be base58 or base64\n * Some wallets (like Backpack) return base58, others return base64\n */\nfunction decodeTransaction(encoded: string): Uint8Array {\n if (isLikelyBase58(encoded)) {\n // Note: getBase58Encoder().encode() takes a base58 string and returns bytes\n // Convert ReadonlyUint8Array to Uint8Array\n const readonlyBytes = getBase58Encoder().encode(encoded);\n return new Uint8Array(readonlyBytes);\n } else {\n return base64ToBytes(encoded);\n }\n}\n\n/**\n * Decode shortvec-encoded length prefix from serialized transaction\n */\nfunction decodeShortVecLength(data: Uint8Array): { length: number; bytesConsumed: number } {\n let length = 0;\n let size = 0;\n\n for (;;) {\n if (size >= data.length) {\n throw new Error('Invalid shortvec encoding: unexpected end of data');\n }\n const byte = data[size];\n length |= (byte & 0x7f) << (size * 7);\n size += 1;\n\n if ((byte & 0x80) === 0) {\n break;\n }\n if (size > 10) {\n throw new Error('Invalid shortvec encoding: length prefix too long');\n }\n }\n\n return { length, bytesConsumed: size };\n}\n\n/**\n * Parse transaction message to find the index of a signer\n */\nfunction findSignerIndex(txBytes: Uint8Array, signerPubkeyBase58: string): number {\n const { length: numSignatures, bytesConsumed: sigCountSize } = decodeShortVecLength(txBytes);\n const messageOffset = sigCountSize + numSignatures * 64;\n const messageBytes = txBytes.subarray(messageOffset);\n\n // Parse message header\n let offset = 0;\n\n // Check for version byte (0x80 = version 0)\n if (messageBytes[0] === 0x80) {\n offset = 1;\n }\n\n // Read header (3 bytes)\n const numSignerAccounts = messageBytes[offset];\n offset += 3;\n\n // Read static accounts array\n const { length: numStaticAccounts, bytesConsumed } = decodeShortVecLength(messageBytes.subarray(offset));\n offset += bytesConsumed;\n\n // Search for the signer pubkey in the static accounts\n const base58Decoder = getBase58Decoder();\n for (let i = 0; i < Math.min(numStaticAccounts, numSignerAccounts); i++) {\n const accountBytes = messageBytes.subarray(offset + i * 32, offset + (i + 1) * 32);\n const accountAddress = base58Decoder.decode(accountBytes);\n if (accountAddress === signerPubkeyBase58) {\n return i;\n }\n }\n\n return -1;\n}\n\n/**\n * Inject a signature into a serialized transaction at the specified signer index\n */\nfunction injectSignature(txBytes: Uint8Array, signerIndex: number, signatureBase58: string): Uint8Array {\n const { bytesConsumed: sigCountSize } = decodeShortVecLength(txBytes);\n\n // Decode signature from base58 to bytes\n const signatureBytes = getBase58Encoder().encode(signatureBase58);\n if (signatureBytes.length !== 64) {\n throw new Error(`Invalid signature length: expected 64 bytes, got ${signatureBytes.length}`);\n }\n\n // Create a copy and inject the signature\n const result = new Uint8Array(txBytes);\n const signatureOffset = sigCountSize + signerIndex * 64;\n result.set(signatureBytes, signatureOffset);\n\n return result;\n}\n\n/**\n * Convert WalletConnect account response to Wallet Standard account\n */\nfunction toWalletAccount(account: WalletConnectSolanaAccount, chains: readonly string[]): WalletAccount {\n const base58Encoder = getBase58Encoder();\n return {\n address: account.pubkey,\n publicKey: base58Encoder.encode(account.pubkey),\n chains: chains as `${string}:${string}`[],\n features: [],\n };\n}\n\n/**\n * Create a Wallet Standard-compatible wallet that uses WalletConnect\n */\nexport function createWalletConnectWallet(config: WalletConnectConfig, transport: WalletConnectTransport): Wallet {\n const chains = (config.defaultChain ? [config.defaultChain] : DEFAULT_CHAINS) as readonly `${string}:${string}`[];\n\n // Function to get the current CAIP chain ID dynamically\n function getCurrentCaipChainId(): string {\n const currentChain = config.getCurrentChain?.() || config.defaultChain || 'solana:mainnet';\n return toCaipChainId(currentChain);\n }\n\n let accounts: WalletAccount[] = [];\n const changeListeners = new Set<(props: { accounts?: readonly WalletAccount[] }) => void>();\n\n function emitChange() {\n changeListeners.forEach(fn => fn({ accounts }));\n }\n\n /**\n * Refresh accounts from the session.\n * Called when transport notifies of session changes.\n */\n function refreshAccountsFromSession(sessionAccounts: string[]): void {\n if (sessionAccounts.length === 0) {\n // Session cleared - emit with empty accounts\n accounts = [];\n emitChange();\n return;\n }\n\n // Convert session accounts to Wallet Standard accounts\n accounts = sessionAccounts.map(pubkey => toWalletAccount({ pubkey }, chains));\n emitChange();\n }\n\n // Subscribe to session changes from the transport and capture unsubscribe function\n let unsubscribeSessionChanged: (() => void) | undefined;\n if (transport.onSessionChanged) {\n const unsubscribe = transport.onSessionChanged(refreshAccountsFromSession);\n // Guard for transports that return void (no-op) - store only if it's a function\n if (typeof unsubscribe === 'function') {\n unsubscribeSessionChanged = unsubscribe;\n }\n }\n\n /**\n * Cleanup function to unsubscribe from session changes\n */\n function cleanupSessionSubscription(): void {\n if (unsubscribeSessionChanged) {\n unsubscribeSessionChanged();\n unsubscribeSessionChanged = undefined; // Clear reference to avoid double-calls\n }\n }\n\n const wallet: Wallet & { cleanup?: () => void } = {\n version: '1.0.0',\n name: 'WalletConnect',\n icon: WALLETCONNECT_ICON,\n chains,\n get accounts() {\n return accounts;\n },\n cleanup: cleanupSessionSubscription,\n features: {\n // Standard connect feature\n 'standard:connect': {\n version: '1.0.0',\n connect: async (input?: { silent?: boolean }) => {\n await transport.connect();\n\n // First, try to get accounts from the session namespaces (most reliable)\n const sessionAccounts = transport.getSessionAccounts();\n\n if (sessionAccounts.length > 0) {\n accounts = sessionAccounts.map(pubkey => toWalletAccount({ pubkey }, chains));\n emitChange();\n return { accounts };\n }\n\n // Fallback: Try RPC methods if session doesn't have accounts\n const method = input?.silent ? 'solana_getAccounts' : 'solana_requestAccounts';\n let result: WalletConnectSolanaAccount[];\n let firstError: unknown;\n\n try {\n result = await transport.request<WalletConnectSolanaAccount[]>({\n method,\n params: {},\n chainId: getCurrentCaipChainId(),\n });\n } catch (error) {\n firstError = error;\n // Fallback to the other method\n try {\n const fallbackMethod =\n method === 'solana_getAccounts' ? 'solana_requestAccounts' : 'solana_getAccounts';\n result = await transport.request<WalletConnectSolanaAccount[]>({\n method: fallbackMethod,\n params: {},\n chainId: getCurrentCaipChainId(),\n });\n } catch (fallbackError) {\n const firstMessage = firstError instanceof Error ? firstError.message : String(firstError);\n const fallbackMessage =\n fallbackError instanceof Error ? fallbackError.message : String(fallbackError);\n const details = [firstMessage, fallbackMessage].filter(Boolean).join(' | ');\n throw new Error(\n `Failed to get accounts from WalletConnect. The wallet may not support Solana accounts.${\n details ? ` (Details: ${details})` : ''\n }`,\n );\n }\n }\n\n // Map to Wallet Standard accounts\n accounts = Array.isArray(result) ? result.map(acc => toWalletAccount(acc, chains)) : [];\n emitChange();\n\n return { accounts };\n },\n },\n\n // Standard disconnect feature\n 'standard:disconnect': {\n version: '1.0.0',\n disconnect: async () => {\n // Unsubscribe from session changes before disconnecting\n cleanupSessionSubscription();\n await transport.disconnect();\n accounts = [];\n emitChange();\n },\n },\n\n // Standard events feature\n 'standard:events': {\n version: '1.0.0',\n on: (event: string, listener: (props: { accounts?: readonly WalletAccount[] }) => void) => {\n if (event !== 'change') return () => {};\n changeListeners.add(listener);\n return () => changeListeners.delete(listener);\n },\n },\n\n // Solana sign message feature\n 'solana:signMessage': {\n version: '1.0.0',\n signMessage: async ({ account, message }: { account: WalletAccount; message: Uint8Array }) => {\n // WalletConnect expects message as base58 string\n const base58Decoder = getBase58Decoder();\n const messageBase58 = base58Decoder.decode(message);\n\n const result = await transport.request<WalletConnectSignMessageResult>({\n method: 'solana_signMessage',\n params: {\n message: messageBase58,\n pubkey: account.address,\n },\n chainId: getCurrentCaipChainId(),\n });\n\n // WalletConnect returns signature as base58 string, convert to bytes\n const signatureBytes = getBase58Encoder().encode(result.signature);\n\n return [{ signature: signatureBytes, signedMessage: message }];\n },\n },\n\n // Solana sign transaction feature\n 'solana:signTransaction': {\n version: '1.0.0',\n signTransaction: async ({\n account,\n transaction,\n }: {\n account: WalletAccount;\n transaction: Uint8Array;\n }) => {\n // WalletConnect expects transaction as base64 string\n const transactionBase64 = bytesToBase64(transaction);\n\n const requestChainId = getCurrentCaipChainId();\n\n const result = await transport.request<WalletConnectSignTransactionResult>({\n method: 'solana_signTransaction',\n params: {\n transaction: transactionBase64,\n },\n chainId: requestChainId,\n });\n\n let signedTransaction: Uint8Array;\n\n if (result.transaction) {\n // Wallet returned the full signed transaction\n signedTransaction = decodeTransaction(result.transaction);\n } else if (result.signature) {\n // Wallet returned only the signature, inject it into the original transaction\n const signerIndex = findSignerIndex(transaction, account.address);\n if (signerIndex < 0) {\n throw new Error('Signer pubkey not found in transaction');\n }\n signedTransaction = injectSignature(transaction, signerIndex, result.signature);\n } else {\n throw new Error('Invalid solana_signTransaction response: no signature or transaction');\n }\n\n return [{ signedTransaction }];\n },\n },\n\n // Solana sign all transactions feature\n 'solana:signAllTransactions': {\n version: '1.0.0',\n signAllTransactions: async ({\n account,\n transactions,\n }: {\n account: WalletAccount;\n transactions: Uint8Array[];\n }) => {\n // WalletConnect expects transactions as base64 strings\n const transactionsBase64 = transactions.map(bytesToBase64);\n\n try {\n const result = await transport.request<WalletConnectSignAllTransactionsResult>({\n method: 'solana_signAllTransactions',\n params: {\n transactions: transactionsBase64,\n },\n chainId: getCurrentCaipChainId(),\n });\n\n // Map back to bytes - could be base58 or base64 depending on wallet\n return result.transactions.map(txEncoded => ({\n signedTransaction: decodeTransaction(txEncoded),\n }));\n } catch (error) {\n // Fallback: sign transactions one by one\n\n const signFeature = wallet.features['solana:signTransaction'] as {\n signTransaction: (args: {\n account: WalletAccount;\n transaction: Uint8Array;\n }) => Promise<{ signedTransaction: Uint8Array }[]>;\n };\n\n const results = await Promise.all(\n transactions.map(tx => signFeature.signTransaction({ account, transaction: tx })),\n );\n\n return results.map(r => ({ signedTransaction: r[0].signedTransaction }));\n }\n },\n },\n\n // Solana sign and send transaction feature\n 'solana:signAndSendTransaction': {\n version: '1.0.0',\n signAndSendTransaction: async ({\n transaction,\n options,\n }: {\n account: WalletAccount;\n transaction: Uint8Array;\n options?: {\n skipPreflight?: boolean;\n preflightCommitment?: string;\n maxRetries?: number;\n minContextSlot?: number;\n };\n }) => {\n // WalletConnect expects transaction as base64 string\n const transactionBase64 = bytesToBase64(transaction);\n\n const result = await transport.request<WalletConnectSignAndSendTransactionResult>({\n method: 'solana_signAndSendTransaction',\n params: {\n transaction: transactionBase64,\n sendOptions: options\n ? {\n skipPreflight: options.skipPreflight,\n preflightCommitment: options.preflightCommitment as\n | 'processed'\n | 'confirmed'\n | 'finalized'\n | undefined,\n maxRetries: options.maxRetries,\n minContextSlot: options.minContextSlot,\n }\n : undefined,\n },\n chainId: getCurrentCaipChainId(),\n });\n\n // Return signature bytes (convert from base58)\n const signatureBytes = getBase58Encoder().encode(result.signature);\n\n return [{ signature: signatureBytes }];\n },\n },\n },\n };\n\n return wallet;\n}\n","/**\n * WalletConnect Registration Helper\n *\n * Registers the WalletConnect wallet shim into the Wallet Standard registry,\n * making it available to ConnectorKit's wallet detection system.\n */\n\nimport type { Wallet } from '@wallet-standard/base';\nimport type { WalletConnectConfig } from '../../../types/walletconnect';\nimport { createWalletConnectWallet } from './create-walletconnect-wallet';\nimport { createWalletConnectTransport } from './universal-provider';\nimport { createLogger } from '../../utils/secure-logger';\n\nconst logger = createLogger('WalletConnectRegistration');\n\n/**\n * Result of registering the WalletConnect wallet\n */\nexport interface WalletConnectRegistration {\n /** The registered wallet instance */\n wallet: Wallet;\n /** Function to unregister the wallet from the registry */\n unregister: () => void;\n}\n\n/**\n * Register a WalletConnect wallet into the Wallet Standard registry\n *\n * This function:\n * 1. Creates a WalletConnect transport adapter\n * 2. Creates a Wallet Standard-compatible wallet shim\n * 3. Registers the wallet with the Wallet Standard registry\n *\n * The wallet will appear in ConnectorKit's wallet list as \"WalletConnect\"\n * and can be selected like any other wallet.\n *\n * @param config - WalletConnect configuration\n * @returns Registration result with wallet and unregister function\n *\n * @example\n * ```typescript\n * const { wallet, unregister } = await registerWalletConnectWallet({\n * projectId: 'your-project-id',\n * metadata: {\n * name: 'My App',\n * description: 'My Solana App',\n * url: 'https://myapp.com',\n * icons: ['https://myapp.com/icon.png'],\n * },\n * onDisplayUri: (uri) => {\n * // Show QR code with this URI\n * },\n * });\n *\n * // Later, to remove from registry:\n * unregister();\n * ```\n */\nexport async function registerWalletConnectWallet(config: WalletConnectConfig): Promise<WalletConnectRegistration> {\n if (typeof window === 'undefined') {\n throw new Error('WalletConnect registration can only be done in a browser environment');\n }\n\n logger.debug('Registering WalletConnect wallet', {\n projectId: config.projectId.substring(0, 8) + '...',\n defaultChain: config.defaultChain,\n });\n\n // Create the transport adapter\n const transport = await createWalletConnectTransport(config);\n\n // Create the Wallet Standard wallet shim\n const wallet = createWalletConnectWallet(config, transport);\n\n // Get the Wallet Standard registry and register the wallet\n const { getWallets } = await import('@wallet-standard/app');\n const wallets = getWallets();\n const unregister = wallets.register(wallet);\n\n logger.info('WalletConnect wallet registered successfully');\n\n return {\n wallet,\n unregister,\n };\n}\n\n/**\n * Check if WalletConnect dependencies are available\n *\n * This function checks if @walletconnect/universal-provider can be imported.\n * Useful for conditionally showing WalletConnect options in UI.\n */\nexport async function isWalletConnectAvailable(): Promise<boolean> {\n if (typeof window === 'undefined') {\n return false;\n }\n\n try {\n await import('@walletconnect/universal-provider');\n return true;\n } catch {\n return false;\n }\n}\n"]}
@@ -1,7 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var chunkBZ2VBJCZ_js = require('./chunk-BZ2VBJCZ.js');
4
- var chunkSITQ4JWM_js = require('./chunk-SITQ4JWM.js');
3
+ var chunkULEPN4NL_js = require('./chunk-ULEPN4NL.js');
4
+ var chunkBF67LVVM_js = require('./chunk-BF67LVVM.js');
5
+ var chunkL5FWMNWO_js = require('./chunk-L5FWMNWO.js');
5
6
  var React4 = require('react');
6
7
  var jsxRuntime = require('react/jsx-runtime');
7
8
  var addresses = require('@solana/addresses');
@@ -11,7 +12,7 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
12
 
12
13
  var React4__default = /*#__PURE__*/_interopDefault(React4);
13
14
 
14
- var logger = chunkSITQ4JWM_js.createLogger("ErrorBoundary");
15
+ var logger = chunkBF67LVVM_js.createLogger("ErrorBoundary");
15
16
  var ErrorLogger = class {
16
17
  static log(error, errorInfo, context) {
17
18
  if (process.env.NODE_ENV === "development" && logger.error(error.message, {
@@ -31,28 +32,28 @@ var ErrorLogger = class {
31
32
  }
32
33
  };
33
34
  function classifyError(error) {
34
- if (chunkSITQ4JWM_js.isConnectorError(error)) {
35
+ if (chunkBF67LVVM_js.isConnectorError(error)) {
35
36
  let typeMapping = {
36
- WALLET_NOT_CONNECTED: chunkSITQ4JWM_js.WalletErrorType.CONNECTION_FAILED,
37
- WALLET_NOT_FOUND: chunkSITQ4JWM_js.WalletErrorType.WALLET_NOT_FOUND,
38
- CONNECTION_FAILED: chunkSITQ4JWM_js.WalletErrorType.CONNECTION_FAILED,
39
- USER_REJECTED: chunkSITQ4JWM_js.WalletErrorType.USER_REJECTED,
40
- RPC_ERROR: chunkSITQ4JWM_js.WalletErrorType.NETWORK_ERROR,
41
- NETWORK_TIMEOUT: chunkSITQ4JWM_js.WalletErrorType.NETWORK_ERROR,
42
- SIGNING_FAILED: chunkSITQ4JWM_js.WalletErrorType.TRANSACTION_FAILED,
43
- SEND_FAILED: chunkSITQ4JWM_js.WalletErrorType.TRANSACTION_FAILED
37
+ WALLET_NOT_CONNECTED: chunkBF67LVVM_js.WalletErrorType.CONNECTION_FAILED,
38
+ WALLET_NOT_FOUND: chunkBF67LVVM_js.WalletErrorType.WALLET_NOT_FOUND,
39
+ CONNECTION_FAILED: chunkBF67LVVM_js.WalletErrorType.CONNECTION_FAILED,
40
+ USER_REJECTED: chunkBF67LVVM_js.WalletErrorType.USER_REJECTED,
41
+ RPC_ERROR: chunkBF67LVVM_js.WalletErrorType.NETWORK_ERROR,
42
+ NETWORK_TIMEOUT: chunkBF67LVVM_js.WalletErrorType.NETWORK_ERROR,
43
+ SIGNING_FAILED: chunkBF67LVVM_js.WalletErrorType.TRANSACTION_FAILED,
44
+ SEND_FAILED: chunkBF67LVVM_js.WalletErrorType.TRANSACTION_FAILED
44
45
  };
45
46
  return {
46
47
  ...error,
47
- type: typeMapping[error.code] || chunkSITQ4JWM_js.WalletErrorType.UNKNOWN_ERROR,
48
+ type: typeMapping[error.code] || chunkBF67LVVM_js.WalletErrorType.UNKNOWN_ERROR,
48
49
  recoverable: error.recoverable,
49
50
  context: error.context
50
51
  };
51
52
  }
52
53
  let walletError = error;
53
54
  if (walletError.type) return walletError;
54
- let type = chunkSITQ4JWM_js.WalletErrorType.UNKNOWN_ERROR, recoverable = false;
55
- return error.message.includes("User rejected") || error.message.includes("User denied") ? (type = chunkSITQ4JWM_js.WalletErrorType.USER_REJECTED, recoverable = true) : error.message.includes("Insufficient funds") ? (type = chunkSITQ4JWM_js.WalletErrorType.INSUFFICIENT_FUNDS, recoverable = false) : error.message.includes("Network") || error.message.includes("fetch") ? (type = chunkSITQ4JWM_js.WalletErrorType.NETWORK_ERROR, recoverable = true) : error.message.includes("Wallet not found") || error.message.includes("not installed") ? (type = chunkSITQ4JWM_js.WalletErrorType.WALLET_NOT_FOUND, recoverable = true) : (error.message.includes("Failed to connect") || error.message.includes("Connection")) && (type = chunkSITQ4JWM_js.WalletErrorType.CONNECTION_FAILED, recoverable = true), {
55
+ let type = chunkBF67LVVM_js.WalletErrorType.UNKNOWN_ERROR, recoverable = false;
56
+ return error.message.includes("User rejected") || error.message.includes("User denied") ? (type = chunkBF67LVVM_js.WalletErrorType.USER_REJECTED, recoverable = true) : error.message.includes("Insufficient funds") ? (type = chunkBF67LVVM_js.WalletErrorType.INSUFFICIENT_FUNDS, recoverable = false) : error.message.includes("Network") || error.message.includes("fetch") ? (type = chunkBF67LVVM_js.WalletErrorType.NETWORK_ERROR, recoverable = true) : error.message.includes("Wallet not found") || error.message.includes("not installed") ? (type = chunkBF67LVVM_js.WalletErrorType.WALLET_NOT_FOUND, recoverable = true) : (error.message.includes("Failed to connect") || error.message.includes("Connection")) && (type = chunkBF67LVVM_js.WalletErrorType.CONNECTION_FAILED, recoverable = true), {
56
57
  ...error,
57
58
  type,
58
59
  recoverable,
@@ -62,8 +63,8 @@ function classifyError(error) {
62
63
  var ConnectorErrorBoundary = class extends React4.Component {
63
64
  constructor(props) {
64
65
  super(props);
65
- chunkSITQ4JWM_js.__publicField(this, "retryTimeouts", /* @__PURE__ */ new Set());
66
- chunkSITQ4JWM_js.__publicField(this, "retry", () => {
66
+ chunkL5FWMNWO_js.__publicField(this, "retryTimeouts", /* @__PURE__ */ new Set());
67
+ chunkL5FWMNWO_js.__publicField(this, "retry", () => {
67
68
  let { maxRetries = 3 } = this.props;
68
69
  this.state.retryCount >= maxRetries || this.setState((prevState) => ({
69
70
  hasError: false,
@@ -114,28 +115,28 @@ function DefaultErrorFallback({ error, onRetry }) {
114
115
  });
115
116
  }, [onRetry]), { title, message, actionText, showRetry } = React4.useMemo(() => {
116
117
  switch (error.type) {
117
- case chunkSITQ4JWM_js.WalletErrorType.USER_REJECTED:
118
+ case chunkBF67LVVM_js.WalletErrorType.USER_REJECTED:
118
119
  return {
119
120
  title: "Transaction Cancelled",
120
121
  message: "You cancelled the transaction. No problem!",
121
122
  actionText: "Try Again",
122
123
  showRetry: true
123
124
  };
124
- case chunkSITQ4JWM_js.WalletErrorType.WALLET_NOT_FOUND:
125
+ case chunkBF67LVVM_js.WalletErrorType.WALLET_NOT_FOUND:
125
126
  return {
126
127
  title: "Wallet Not Found",
127
128
  message: "Please install a supported Solana wallet to continue.",
128
129
  actionText: "Check Wallets",
129
130
  showRetry: true
130
131
  };
131
- case chunkSITQ4JWM_js.WalletErrorType.NETWORK_ERROR:
132
+ case chunkBF67LVVM_js.WalletErrorType.NETWORK_ERROR:
132
133
  return {
133
134
  title: "Network Error",
134
135
  message: "Having trouble connecting. Please check your internet connection.",
135
136
  actionText: "Retry",
136
137
  showRetry: true
137
138
  };
138
- case chunkSITQ4JWM_js.WalletErrorType.INSUFFICIENT_FUNDS:
139
+ case chunkBF67LVVM_js.WalletErrorType.INSUFFICIENT_FUNDS:
139
140
  return {
140
141
  title: "Insufficient Funds",
141
142
  message: "You don't have enough SOL for this transaction.",
@@ -312,8 +313,8 @@ function useWalletConnectUri() {
312
313
  }
313
314
  };
314
315
  }
315
- var logger2 = chunkSITQ4JWM_js.createLogger("ConnectorProvider");
316
- chunkBZ2VBJCZ_js.installPolyfills();
316
+ var logger2 = chunkBF67LVVM_js.createLogger("ConnectorProvider");
317
+ chunkULEPN4NL_js.installPolyfills();
317
318
  var ConnectorContext = React4.createContext(null);
318
319
  ConnectorContext.displayName = "ConnectorContext";
319
320
  function ConnectorProviderInternal({
@@ -324,7 +325,7 @@ function ConnectorProviderInternal({
324
325
  let clientRef = React4.useRef(null), client = React4__default.default.useCallback(() => {
325
326
  if (!clientRef.current)
326
327
  try {
327
- clientRef.current = new chunkBZ2VBJCZ_js.ConnectorClient(config), typeof window < "u" && (window.__connectorClient = clientRef.current), config?.debug && logger2.info("Client initialized successfully");
328
+ clientRef.current = new chunkULEPN4NL_js.ConnectorClient(config), typeof window < "u" && (window.__connectorClient = clientRef.current), config?.debug && logger2.info("Client initialized successfully");
328
329
  } catch (error) {
329
330
  let err = error;
330
331
  logger2.error("Failed to initialize client", { error: err });
@@ -567,7 +568,7 @@ function useCluster() {
567
568
  [client]
568
569
  );
569
570
  return React4.useMemo(() => {
570
- let isMainnet = cluster ? chunkBZ2VBJCZ_js.isMainnetCluster(cluster) : false, isDevnet = cluster ? chunkBZ2VBJCZ_js.isDevnetCluster(cluster) : false, isTestnet = cluster ? chunkBZ2VBJCZ_js.isTestnetCluster(cluster) : false, isLocal = cluster ? chunkBZ2VBJCZ_js.isLocalCluster(cluster) : false, explorerUrl = cluster ? chunkBZ2VBJCZ_js.getClusterExplorerUrl(cluster) : "", type = cluster ? chunkBZ2VBJCZ_js.getClusterType(cluster) : null;
571
+ let isMainnet = cluster ? chunkULEPN4NL_js.isMainnetCluster(cluster) : false, isDevnet = cluster ? chunkULEPN4NL_js.isDevnetCluster(cluster) : false, isTestnet = cluster ? chunkULEPN4NL_js.isTestnetCluster(cluster) : false, isLocal = cluster ? chunkULEPN4NL_js.isLocalCluster(cluster) : false, explorerUrl = cluster ? chunkULEPN4NL_js.getClusterExplorerUrl(cluster) : "", type = cluster ? chunkULEPN4NL_js.getClusterType(cluster) : null;
571
572
  return {
572
573
  cluster,
573
574
  clusters,
@@ -585,7 +586,7 @@ function useAccount() {
585
586
  let { selectedAccount, accounts, connected, selectAccount } = useConnector(), [copied, setCopied] = React4.useState(false), copyTimeoutRef = React4__default.default.useRef(void 0), account = React4.useMemo(
586
587
  () => accounts.find((a) => a.address === selectedAccount) ?? null,
587
588
  [accounts, selectedAccount]
588
- ), formatted = React4.useMemo(() => selectedAccount ? chunkBZ2VBJCZ_js.formatAddress(selectedAccount) : "", [selectedAccount]), copy = React4.useCallback(async () => selectedAccount ? (copyTimeoutRef.current && clearTimeout(copyTimeoutRef.current), await chunkBZ2VBJCZ_js.copyAddressToClipboard(selectedAccount, {
589
+ ), formatted = React4.useMemo(() => selectedAccount ? chunkULEPN4NL_js.formatAddress(selectedAccount) : "", [selectedAccount]), copy = React4.useCallback(async () => selectedAccount ? (copyTimeoutRef.current && clearTimeout(copyTimeoutRef.current), await chunkULEPN4NL_js.copyAddressToClipboard(selectedAccount, {
589
590
  onSuccess: () => {
590
591
  setCopied(true), copyTimeoutRef.current = setTimeout(() => setCopied(false), 2e3);
591
592
  }
@@ -615,7 +616,7 @@ function useWalletInfo() {
615
616
  () => wallets.map(
616
617
  (walletInfo) => ({
617
618
  name: walletInfo.wallet.name,
618
- connectorId: chunkBZ2VBJCZ_js.createConnectorId(walletInfo.wallet.name),
619
+ connectorId: chunkULEPN4NL_js.createConnectorId(walletInfo.wallet.name),
619
620
  icon: walletInfo.wallet.icon,
620
621
  installed: walletInfo.installed,
621
622
  connectable: walletInfo.connectable
@@ -652,7 +653,7 @@ function useTransactionSigner() {
652
653
  let { selectedWallet, selectedAccount, accounts, cluster, connected } = useConnector(), client = useConnectorClient(), account = React4.useMemo(
653
654
  () => accounts.find((a) => a.address === selectedAccount)?.raw ?? null,
654
655
  [accounts, selectedAccount]
655
- ), signer = React4.useMemo(() => !connected || !selectedWallet || !account ? null : chunkBZ2VBJCZ_js.createTransactionSigner({
656
+ ), signer = React4.useMemo(() => !connected || !selectedWallet || !account ? null : chunkULEPN4NL_js.createTransactionSigner({
656
657
  wallet: selectedWallet,
657
658
  account,
658
659
  cluster: cluster ?? void 0,
@@ -680,20 +681,20 @@ function useTransactionSigner() {
680
681
  function useKitTransactionSigner() {
681
682
  let { signer: connectorSigner, ready } = useTransactionSigner();
682
683
  return {
683
- signer: React4.useMemo(() => connectorSigner ? chunkBZ2VBJCZ_js.createKitTransactionSigner(connectorSigner) : null, [connectorSigner]),
684
+ signer: React4.useMemo(() => connectorSigner ? chunkULEPN4NL_js.createKitTransactionSigner(connectorSigner) : null, [connectorSigner]),
684
685
  ready
685
686
  };
686
687
  }
687
688
  var useGillTransactionSigner = useKitTransactionSigner;
688
- var logger3 = chunkSITQ4JWM_js.createLogger("useSolanaClient");
689
+ var logger3 = chunkBF67LVVM_js.createLogger("useSolanaClient");
689
690
  function useSolanaClient() {
690
691
  let { type } = useCluster(), connectorClient = useConnectorClient(), client = React4.useMemo(() => {
691
692
  if (!type || !connectorClient) return null;
692
693
  try {
693
694
  let rpcUrl = connectorClient.getRpcUrl();
694
- return rpcUrl ? chunkSITQ4JWM_js.createSolanaClient({
695
+ return rpcUrl ? chunkBF67LVVM_js.createSolanaClient({
695
696
  urlOrMoniker: rpcUrl
696
- }) : type !== "custom" ? chunkSITQ4JWM_js.createSolanaClient({
697
+ }) : type !== "custom" ? chunkBF67LVVM_js.createSolanaClient({
697
698
  urlOrMoniker: type
698
699
  }) : null;
699
700
  } catch (error) {
@@ -714,8 +715,8 @@ function useTransactionPreparer() {
714
715
  let { client, ready } = useSolanaClient(), prepare = React4.useCallback(
715
716
  async (transaction, options = {}) => {
716
717
  if (!client)
717
- throw new chunkSITQ4JWM_js.NetworkError("RPC_ERROR", "Solana client not available. Cannot prepare transaction.");
718
- return chunkSITQ4JWM_js.prepareTransaction({
718
+ throw new chunkBF67LVVM_js.NetworkError("RPC_ERROR", "Solana client not available. Cannot prepare transaction.");
719
+ return chunkBF67LVVM_js.prepareTransaction({
719
720
  transaction,
720
721
  rpc: client.rpc,
721
722
  computeUnitLimitMultiplier: options.computeUnitLimitMultiplier,
@@ -1065,7 +1066,7 @@ function getBalanceQueryKey(rpcUrl, address) {
1065
1066
  }
1066
1067
  var LAMPORTS_PER_SOL2 = 1000000000n;
1067
1068
  function formatTokenAccount(account) {
1068
- let formatted = chunkBZ2VBJCZ_js.formatBigIntBalance(account.amount, account.decimals, {
1069
+ let formatted = chunkULEPN4NL_js.formatBigIntBalance(account.amount, account.decimals, {
1069
1070
  maxDecimals: Math.min(account.decimals, 6)
1070
1071
  });
1071
1072
  return {
@@ -1109,7 +1110,7 @@ function useBalance(options = {}) {
1109
1110
  refetchIntervalMs: autoRefresh ? refreshInterval : false,
1110
1111
  client: clientOverride,
1111
1112
  select: selectBalance
1112
- }), lamports = data?.lamports ?? 0n, tokens = data?.tokens ?? [], solBalance = React4.useMemo(() => Number(lamports) / Number(LAMPORTS_PER_SOL2), [lamports]), formattedSol = React4.useMemo(() => chunkBZ2VBJCZ_js.formatLamportsToSolSafe(lamports, { maxDecimals: 4, suffix: true }), [lamports]), visibleError = updatedAt ? null : error, refetch = React4.useCallback(
1113
+ }), lamports = data?.lamports ?? 0n, tokens = data?.tokens ?? [], solBalance = React4.useMemo(() => Number(lamports) / Number(LAMPORTS_PER_SOL2), [lamports]), formattedSol = React4.useMemo(() => chunkULEPN4NL_js.formatLamportsToSolSafe(lamports, { maxDecimals: 4, suffix: true }), [lamports]), visibleError = updatedAt ? null : error, refetch = React4.useCallback(
1113
1114
  async (opts) => {
1114
1115
  await sharedRefetch(opts);
1115
1116
  },
@@ -1578,7 +1579,7 @@ function useTransactions(options = {}) {
1578
1579
  blockTimeNum,
1579
1580
  Number(sig.slot),
1580
1581
  sig.err,
1581
- chunkBZ2VBJCZ_js.getTransactionUrl(String(sig.signature), currentCluster)
1582
+ chunkULEPN4NL_js.getTransactionUrl(String(sig.signature), currentCluster)
1582
1583
  );
1583
1584
  });
1584
1585
  } else
@@ -1593,7 +1594,7 @@ function useTransactions(options = {}) {
1593
1594
  type: "unknown",
1594
1595
  formattedDate: date,
1595
1596
  formattedTime: time,
1596
- explorerUrl: chunkBZ2VBJCZ_js.getTransactionUrl(String(sig.signature), currentCluster)
1597
+ explorerUrl: chunkULEPN4NL_js.getTransactionUrl(String(sig.signature), currentCluster)
1597
1598
  };
1598
1599
  });
1599
1600
  let mintsToFetch = [
@@ -1607,7 +1608,7 @@ function useTransactions(options = {}) {
1607
1608
  throwIfAborted(signal);
1608
1609
  let tokenMetadata = await fetchTransactionTokenMetadata(mintsToFetch, {
1609
1610
  signal,
1610
- cluster: chunkBZ2VBJCZ_js.getClusterType(currentCluster)
1611
+ cluster: chunkULEPN4NL_js.getClusterType(currentCluster)
1611
1612
  });
1612
1613
  tokenMetadata.size > 0 && (newTransactions = newTransactions.map((tx) => {
1613
1614
  let enrichedTx = { ...tx };
@@ -1714,10 +1715,10 @@ function getTokensQueryKey(rpcUrl, address) {
1714
1715
  }
1715
1716
  var CACHE_MAX_SIZE = 500, PRICE_CACHE_TTL = 6e4, STALE_CLEANUP_INTERVAL = 12e4, COINGECKO_DEFAULT_MAX_RETRIES = 3, COINGECKO_DEFAULT_BASE_DELAY = 1e3, COINGECKO_DEFAULT_MAX_TIMEOUT = 3e4, COINGECKO_API_BASE_URL = "https://api.coingecko.com/api/v3", LRUCache = class {
1716
1717
  constructor(maxSize, options) {
1717
- chunkSITQ4JWM_js.__publicField(this, "cache", /* @__PURE__ */ new Map());
1718
- chunkSITQ4JWM_js.__publicField(this, "maxSize");
1719
- chunkSITQ4JWM_js.__publicField(this, "getTtl");
1720
- chunkSITQ4JWM_js.__publicField(this, "getTimestamp");
1718
+ chunkL5FWMNWO_js.__publicField(this, "cache", /* @__PURE__ */ new Map());
1719
+ chunkL5FWMNWO_js.__publicField(this, "maxSize");
1720
+ chunkL5FWMNWO_js.__publicField(this, "getTtl");
1721
+ chunkL5FWMNWO_js.__publicField(this, "getTimestamp");
1721
1722
  this.maxSize = maxSize, this.getTtl = options?.getTtl, this.getTimestamp = options?.getTimestamp;
1722
1723
  }
1723
1724
  get(key) {
@@ -1887,12 +1888,12 @@ async function fetchTokenMetadataHybrid(mints, coingeckoConfig, options) {
1887
1888
  return didUpdatePrices && options?.onUpdate?.(), didUpdate;
1888
1889
  }
1889
1890
  function formatBalance(amount, decimals) {
1890
- return chunkBZ2VBJCZ_js.formatBigIntBalance(amount, decimals, {
1891
+ return chunkULEPN4NL_js.formatBigIntBalance(amount, decimals, {
1891
1892
  maxDecimals: Math.min(decimals, 6)
1892
1893
  });
1893
1894
  }
1894
1895
  function formatUsd(amount, decimals, usdPrice) {
1895
- return chunkBZ2VBJCZ_js.formatBigIntUsd(amount, decimals, usdPrice);
1896
+ return chunkULEPN4NL_js.formatBigIntUsd(amount, decimals, usdPrice);
1896
1897
  }
1897
1898
  function selectTokens(assets, address) {
1898
1899
  return {
@@ -2109,7 +2110,7 @@ function AccountElement({
2109
2110
  variant = "compact",
2110
2111
  render
2111
2112
  }) {
2112
- let { account, connectorId } = useWallet(), connectors = useWalletConnectors(), address = React4__default.default.useMemo(() => account ? String(account) : null, [account]), formatted = React4__default.default.useMemo(() => address ? chunkBZ2VBJCZ_js.formatAddress(address) : "", [address]), connector = React4__default.default.useMemo(() => connectorId ? connectors.find((c) => c.id === connectorId) ?? null : null, [connectors, connectorId]), walletName = connector?.name ?? null, walletIcon = connector?.icon ? connector.icon : null, [copied, setCopied] = React4__default.default.useState(false), copyTimeoutRef = React4__default.default.useRef(void 0), copy = React4__default.default.useCallback(async () => address ? (copyTimeoutRef.current && clearTimeout(copyTimeoutRef.current), await chunkBZ2VBJCZ_js.copyAddressToClipboard(address, {
2113
+ let { account, connectorId } = useWallet(), connectors = useWalletConnectors(), address = React4__default.default.useMemo(() => account ? String(account) : null, [account]), formatted = React4__default.default.useMemo(() => address ? chunkULEPN4NL_js.formatAddress(address) : "", [address]), connector = React4__default.default.useMemo(() => connectorId ? connectors.find((c) => c.id === connectorId) ?? null : null, [connectors, connectorId]), walletName = connector?.name ?? null, walletIcon = connector?.icon ? connector.icon : null, [copied, setCopied] = React4__default.default.useState(false), copyTimeoutRef = React4__default.default.useRef(void 0), copy = React4__default.default.useCallback(async () => address ? (copyTimeoutRef.current && clearTimeout(copyTimeoutRef.current), await chunkULEPN4NL_js.copyAddressToClipboard(address, {
2113
2114
  onSuccess: () => {
2114
2115
  setCopied(true), copyTimeoutRef.current = setTimeout(() => setCopied(false), 2e3);
2115
2116
  }
@@ -3308,5 +3309,5 @@ exports.useWalletConnectUri = useWalletConnectUri;
3308
3309
  exports.useWalletConnectors = useWalletConnectors;
3309
3310
  exports.useWalletInfo = useWalletInfo;
3310
3311
  exports.withErrorBoundary = withErrorBoundary;
3311
- //# sourceMappingURL=chunk-4Z2F6ERB.js.map
3312
- //# sourceMappingURL=chunk-4Z2F6ERB.js.map
3312
+ //# sourceMappingURL=chunk-B6YBZB6H.js.map
3313
+ //# sourceMappingURL=chunk-B6YBZB6H.js.map