@solana/connector 0.1.9 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +403 -50
  2. package/dist/chunk-4KD6HQQG.js +69 -0
  3. package/dist/chunk-4KD6HQQG.js.map +1 -0
  4. package/dist/chunk-BJAVJQLK.js +230 -0
  5. package/dist/chunk-BJAVJQLK.js.map +1 -0
  6. package/dist/{chunk-5HRJKCIL.js → chunk-BZ2VBJCZ.js} +1061 -424
  7. package/dist/chunk-BZ2VBJCZ.js.map +1 -0
  8. package/dist/{chunk-WDXEP4AJ.js → chunk-EM4KNOKG.js} +658 -190
  9. package/dist/chunk-EM4KNOKG.js.map +1 -0
  10. package/dist/chunk-HN5AJF7F.js +507 -0
  11. package/dist/chunk-HN5AJF7F.js.map +1 -0
  12. package/dist/chunk-HO6QNKFM.mjs +61 -0
  13. package/dist/chunk-HO6QNKFM.mjs.map +1 -0
  14. package/dist/chunk-HPQ5T32K.mjs +178 -0
  15. package/dist/chunk-HPQ5T32K.mjs.map +1 -0
  16. package/dist/{chunk-MAXA3HEP.mjs → chunk-IDTUFDNB.mjs} +962 -344
  17. package/dist/chunk-IDTUFDNB.mjs.map +1 -0
  18. package/dist/{chunk-P5LXUDP6.mjs → chunk-RTXUS5KG.mjs} +579 -119
  19. package/dist/chunk-RTXUS5KG.mjs.map +1 -0
  20. package/dist/{chunk-DSUCH44G.js → chunk-SITQ4JWM.js} +23 -67
  21. package/dist/chunk-SITQ4JWM.js.map +1 -0
  22. package/dist/chunk-UCISIAOG.mjs +501 -0
  23. package/dist/chunk-UCISIAOG.mjs.map +1 -0
  24. package/dist/{chunk-J7DHGLW6.mjs → chunk-ZZTY3O4N.mjs} +21 -61
  25. package/dist/chunk-ZZTY3O4N.mjs.map +1 -0
  26. package/dist/compat.d.mts +1 -1
  27. package/dist/compat.d.ts +1 -1
  28. package/dist/compat.js +10 -9
  29. package/dist/compat.js.map +1 -1
  30. package/dist/compat.mjs +2 -1
  31. package/dist/compat.mjs.map +1 -1
  32. package/dist/headless.d.mts +239 -104
  33. package/dist/headless.d.ts +239 -104
  34. package/dist/headless.js +255 -169
  35. package/dist/headless.mjs +5 -3
  36. package/dist/index.d.mts +4 -4
  37. package/dist/index.d.ts +4 -4
  38. package/dist/index.js +316 -206
  39. package/dist/index.mjs +6 -4
  40. package/dist/react.d.mts +299 -9
  41. package/dist/react.d.ts +299 -9
  42. package/dist/react.js +90 -38
  43. package/dist/react.mjs +2 -2
  44. package/dist/{standard-shim-CT49DM5l.d.mts → standard-shim-CGB88PPO.d.mts} +673 -52
  45. package/dist/{standard-shim-D9guL5fz.d.ts → standard-shim-tmnQelaJ.d.ts} +673 -52
  46. package/dist/{transaction-signer-T-KVQFi8.d.mts → transaction-signer-7NaYmP5w.d.mts} +1 -0
  47. package/dist/{transaction-signer-T-KVQFi8.d.ts → transaction-signer-7NaYmP5w.d.ts} +1 -0
  48. package/dist/walletconnect-447EY3OJ.js +28 -0
  49. package/dist/walletconnect-447EY3OJ.js.map +1 -0
  50. package/dist/walletconnect-U455PO4I.mjs +3 -0
  51. package/dist/walletconnect-U455PO4I.mjs.map +1 -0
  52. package/package.json +6 -2
  53. package/dist/chunk-5HRJKCIL.js.map +0 -1
  54. package/dist/chunk-DSUCH44G.js.map +0 -1
  55. package/dist/chunk-I6TJLYNA.js +0 -535
  56. package/dist/chunk-I6TJLYNA.js.map +0 -1
  57. package/dist/chunk-J7DHGLW6.mjs.map +0 -1
  58. package/dist/chunk-JOBLG62A.mjs +0 -476
  59. package/dist/chunk-JOBLG62A.mjs.map +0 -1
  60. package/dist/chunk-MAXA3HEP.mjs.map +0 -1
  61. package/dist/chunk-P5LXUDP6.mjs.map +0 -1
  62. package/dist/chunk-WDXEP4AJ.js.map +0 -1
@@ -0,0 +1,507 @@
1
+ 'use strict';
2
+
3
+ var chunkSITQ4JWM_js = require('./chunk-SITQ4JWM.js');
4
+ var codecs = require('@solana/codecs');
5
+
6
+ // src/lib/wallet/walletconnect/universal-provider.ts
7
+ var logger = chunkSITQ4JWM_js.createLogger("WalletConnectProvider"), SOLANA_METHODS = [
8
+ "solana_getAccounts",
9
+ "solana_requestAccounts",
10
+ "solana_signMessage",
11
+ "solana_signTransaction",
12
+ "solana_signAllTransactions",
13
+ "solana_signAndSendTransaction"
14
+ ], SOLANA_CAIP_CHAINS = {
15
+ "solana:mainnet": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
16
+ "solana:devnet": "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",
17
+ "solana:testnet": "solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z"
18
+ }, ALL_SOLANA_CAIP_CHAINS = Object.values(SOLANA_CAIP_CHAINS);
19
+ async function createWalletConnectTransport(config) {
20
+ let state = {
21
+ provider: null,
22
+ initialized: false,
23
+ connecting: false,
24
+ connectPromise: null,
25
+ cancelConnect: null,
26
+ sessionChangeListeners: /* @__PURE__ */ new Set()
27
+ };
28
+ function notifySessionChange() {
29
+ if (!state.provider?.session) return;
30
+ let accounts = getAccountsFromSession(state.provider.session);
31
+ state.sessionChangeListeners.forEach((listener) => {
32
+ try {
33
+ listener(accounts);
34
+ } catch (error) {
35
+ logger.warn("Error in session change listener", { error });
36
+ }
37
+ });
38
+ }
39
+ function getAccountsFromSession(session) {
40
+ let accounts = [], namespaces = session?.namespaces;
41
+ if (namespaces?.solana?.accounts)
42
+ for (let account of namespaces.solana.accounts) {
43
+ let parts = account.split(":");
44
+ if (parts.length >= 3) {
45
+ let address = parts.slice(2).join(":");
46
+ address && !accounts.includes(address) && accounts.push(address);
47
+ }
48
+ }
49
+ return accounts;
50
+ }
51
+ function hasSolanaNamespace(session) {
52
+ let namespaces = session?.namespaces;
53
+ return namespaces ? "solana" in namespaces : false;
54
+ }
55
+ async function safeCleanupPendingPairings(provider, deletePairings = false) {
56
+ let cleanup = provider.cleanupPendingPairings;
57
+ if (cleanup)
58
+ try {
59
+ await cleanup.call(provider, { deletePairings });
60
+ } catch {
61
+ }
62
+ }
63
+ function safeAbortPairingAttempt(provider) {
64
+ let abort = provider.abortPairingAttempt;
65
+ if (abort)
66
+ try {
67
+ abort.call(provider);
68
+ } catch {
69
+ }
70
+ }
71
+ async function safeDisconnectProvider(provider) {
72
+ try {
73
+ await provider.disconnect();
74
+ } catch {
75
+ }
76
+ }
77
+ async function initProvider() {
78
+ if (state.provider)
79
+ return state.provider;
80
+ let UniversalProvider;
81
+ try {
82
+ UniversalProvider = (await import('@walletconnect/universal-provider')).default;
83
+ } catch {
84
+ throw new Error(
85
+ "WalletConnect is enabled but @walletconnect/universal-provider is not installed. Please install it in your app (e.g. pnpm add @walletconnect/universal-provider)."
86
+ );
87
+ }
88
+ let provider = await UniversalProvider.init({
89
+ projectId: config.projectId,
90
+ metadata: config.metadata,
91
+ relayUrl: config.relayUrl
92
+ });
93
+ return provider.on("display_uri", (uri) => {
94
+ config.onDisplayUri ? config.onDisplayUri(uri) : process.env.NODE_ENV;
95
+ }), provider.on("session_delete", () => {
96
+ config.onSessionDisconnected && config.onSessionDisconnected();
97
+ }), provider.on("session_update", () => {
98
+ logger.debug("WalletConnect session_update received"), notifySessionChange();
99
+ }), provider.on("session_event", (event) => {
100
+ logger.debug("WalletConnect session_event received", { event }), notifySessionChange();
101
+ }), state.provider = provider, state.initialized = true, provider;
102
+ }
103
+ return {
104
+ async connect() {
105
+ if (state.connectPromise) {
106
+ await state.connectPromise;
107
+ return;
108
+ }
109
+ state.connectPromise = (async () => {
110
+ state.connecting = true;
111
+ try {
112
+ let CANCELLED = Symbol("WALLETCONNECT_CANCELLED"), cancelResolve = null, cancelPromise = new Promise((resolve) => {
113
+ cancelResolve = () => resolve(CANCELLED);
114
+ }), isCancelled = false;
115
+ state.cancelConnect = () => {
116
+ isCancelled || (isCancelled = true, cancelResolve?.());
117
+ };
118
+ async function raceWithCancel(promise) {
119
+ let result = await Promise.race([
120
+ promise,
121
+ cancelPromise
122
+ ]);
123
+ if (result === CANCELLED)
124
+ throw new Error("Connection cancelled");
125
+ return result;
126
+ }
127
+ let provider = null, connectAttemptPromise = null;
128
+ if (provider = await raceWithCancel(initProvider()), provider.session) {
129
+ if (hasSolanaNamespace(provider.session)) {
130
+ config.onSessionEstablished && config.onSessionEstablished();
131
+ return;
132
+ }
133
+ await raceWithCancel(safeDisconnectProvider(provider)), await raceWithCancel(safeCleanupPendingPairings(provider, false));
134
+ }
135
+ connectAttemptPromise = provider.connect({
136
+ namespaces: {
137
+ solana: {
138
+ chains: [...ALL_SOLANA_CAIP_CHAINS],
139
+ methods: [...SOLANA_METHODS],
140
+ events: []
141
+ }
142
+ }
143
+ });
144
+ try {
145
+ await raceWithCancel(connectAttemptPromise);
146
+ } catch (error) {
147
+ throw connectAttemptPromise?.catch(() => {
148
+ }), error;
149
+ }
150
+ if (!provider.session)
151
+ throw new Error("WalletConnect: connect completed but no session was established");
152
+ if (!hasSolanaNamespace(provider.session))
153
+ throw await raceWithCancel(safeDisconnectProvider(provider)), new Error("WalletConnect: connected session does not include Solana namespace");
154
+ config.onSessionEstablished && config.onSessionEstablished();
155
+ } finally {
156
+ state.connecting = false, state.cancelConnect = null, state.connectPromise = null;
157
+ }
158
+ })(), await state.connectPromise;
159
+ },
160
+ async disconnect() {
161
+ if (state.cancelConnect)
162
+ try {
163
+ state.cancelConnect();
164
+ } catch {
165
+ }
166
+ if (!state.provider) {
167
+ config.onSessionDisconnected && config.onSessionDisconnected();
168
+ return;
169
+ }
170
+ state.provider.session ? await safeDisconnectProvider(state.provider) : (safeAbortPairingAttempt(state.provider), await safeCleanupPendingPairings(state.provider, false)), config.onSessionDisconnected && config.onSessionDisconnected();
171
+ },
172
+ async request(args) {
173
+ let provider = await initProvider();
174
+ if (!provider.session)
175
+ throw new Error("WalletConnect: no active session. Call connect() first.");
176
+ try {
177
+ return await provider.request(
178
+ {
179
+ method: args.method,
180
+ params: args.params
181
+ },
182
+ args.chainId
183
+ );
184
+ } catch (error) {
185
+ throw error;
186
+ }
187
+ },
188
+ isConnected() {
189
+ return state.provider?.session != null;
190
+ },
191
+ getSessionAccounts() {
192
+ return state.provider?.session ? getAccountsFromSession(state.provider.session) : [];
193
+ },
194
+ onSessionChanged(listener) {
195
+ return state.sessionChangeListeners.add(listener), () => {
196
+ state.sessionChangeListeners.delete(listener);
197
+ };
198
+ }
199
+ };
200
+ }
201
+ function createMockWalletConnectTransport(mockImplementation = {}) {
202
+ let connected = false, listeners = /* @__PURE__ */ new Set();
203
+ return {
204
+ ...{
205
+ async connect() {
206
+ connected = true;
207
+ },
208
+ async disconnect() {
209
+ connected = false;
210
+ },
211
+ async request() {
212
+ throw new Error("Mock transport: request not implemented");
213
+ },
214
+ isConnected() {
215
+ return connected;
216
+ },
217
+ getSessionAccounts() {
218
+ return [];
219
+ },
220
+ onSessionChanged(listener) {
221
+ return listeners.add(listener), () => listeners.delete(listener);
222
+ }
223
+ },
224
+ ...mockImplementation
225
+ };
226
+ }
227
+
228
+ // src/lib/wallet/walletconnect/create-walletconnect-wallet.ts
229
+ var WALLETCONNECT_ICON = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiByeD0iOCIgZmlsbD0iIzMzOTZGRiIvPgo8cGF0aCBkPSJNOS42IDEyLjRDMTMuMSA5IDE4LjkgOSAyMi40IDEyLjRMMjIuOSAxMi45QzIzLjEgMTMuMSAyMy4xIDEzLjQgMjIuOSAxMy42TDIxLjQgMTUuMUMyMS4zIDE1LjIgMjEuMSAxNS4yIDIxIDE1LjFMMjAuMyAxNC40QzE4IDEyLjIgMTQgMTIuMiAxMS43IDE0LjRMMTEgMTUuMUMxMC45IDE1LjIgMTAuNyAxNS4yIDEwLjYgMTUuMUw5LjEgMTMuNkM4LjkgMTMuNCA4LjkgMTMuMSA5LjEgMTIuOUw5LjYgMTIuNFpNMjUuMyAxNS4yTDI2LjYgMTYuNUMyNi44IDE2LjcgMjYuOCAxNyAyNi42IDE3LjJMMjAuNyAyMy4xQzIwLjUgMjMuMyAyMC4yIDIzLjMgMjAgMjMuMUwxNS45IDE5QzE1LjggMTguOSAxNS43IDE4LjkgMTUuNiAxOUwxMS41IDIzLjFDMTEuMyAyMy4zIDExIDIzLjMgMTAuOCAyMy4xTDQuOSAxNy4yQzQuNyAxNyA0LjcgMTYuNyA0LjkgMTYuNUw2LjIgMTUuMkM2LjQgMTUgNi43IDE1IDYuOSAxNS4yTDExIDE5LjNDMTEuMSAxOS40IDExLjIgMTkuNCAxMS4zIDE5LjNMMTUuNCAxNS4yQzE1LjYgMTUgMTUuOSAxNSAxNi4xIDE1LjJMMjAuMiAxOS4zQzIwLjMgMTkuNCAyMC40IDE5LjQgMjAuNSAxOS4zTDI0LjYgMTUuMkMyNC44IDE1IDI1LjEgMTUgMjUuMyAxNS4yWiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg==", DEFAULT_CHAINS = ["solana:mainnet", "solana:devnet", "solana:testnet"];
230
+ function toCaipChainId(chainId) {
231
+ return SOLANA_CAIP_CHAINS[chainId] || chainId;
232
+ }
233
+ function bytesToBase64(bytes) {
234
+ let binary = "";
235
+ for (let i = 0; i < bytes.length; i++)
236
+ binary += String.fromCharCode(bytes[i]);
237
+ return btoa(binary);
238
+ }
239
+ function base64ToBytes(base64) {
240
+ let binary = atob(base64), bytes = new Uint8Array(binary.length);
241
+ for (let i = 0; i < binary.length; i++)
242
+ bytes[i] = binary.charCodeAt(i);
243
+ return bytes;
244
+ }
245
+ function isLikelyBase58(str) {
246
+ return !/[0OIl+/=]/.test(str);
247
+ }
248
+ function decodeTransaction(encoded) {
249
+ if (isLikelyBase58(encoded)) {
250
+ let readonlyBytes = codecs.getBase58Encoder().encode(encoded);
251
+ return new Uint8Array(readonlyBytes);
252
+ } else
253
+ return base64ToBytes(encoded);
254
+ }
255
+ function decodeShortVecLength(data) {
256
+ let length = 0, size = 0;
257
+ for (; ; ) {
258
+ if (size >= data.length)
259
+ throw new Error("Invalid shortvec encoding: unexpected end of data");
260
+ let byte = data[size];
261
+ if (length |= (byte & 127) << size * 7, size += 1, (byte & 128) === 0)
262
+ break;
263
+ if (size > 10)
264
+ throw new Error("Invalid shortvec encoding: length prefix too long");
265
+ }
266
+ return { length, bytesConsumed: size };
267
+ }
268
+ function findSignerIndex(txBytes, signerPubkeyBase58) {
269
+ let { length: numSignatures, bytesConsumed: sigCountSize } = decodeShortVecLength(txBytes), messageOffset = sigCountSize + numSignatures * 64, messageBytes = txBytes.subarray(messageOffset), offset = 0;
270
+ messageBytes[0] === 128 && (offset = 1);
271
+ let numSignerAccounts = messageBytes[offset];
272
+ offset += 3;
273
+ let { length: numStaticAccounts, bytesConsumed } = decodeShortVecLength(messageBytes.subarray(offset));
274
+ offset += bytesConsumed;
275
+ let base58Decoder = codecs.getBase58Decoder();
276
+ for (let i = 0; i < Math.min(numStaticAccounts, numSignerAccounts); i++) {
277
+ let accountBytes = messageBytes.subarray(offset + i * 32, offset + (i + 1) * 32);
278
+ if (base58Decoder.decode(accountBytes) === signerPubkeyBase58)
279
+ return i;
280
+ }
281
+ return -1;
282
+ }
283
+ function injectSignature(txBytes, signerIndex, signatureBase58) {
284
+ let { bytesConsumed: sigCountSize } = decodeShortVecLength(txBytes), signatureBytes = codecs.getBase58Encoder().encode(signatureBase58);
285
+ if (signatureBytes.length !== 64)
286
+ throw new Error(`Invalid signature length: expected 64 bytes, got ${signatureBytes.length}`);
287
+ let result = new Uint8Array(txBytes), signatureOffset = sigCountSize + signerIndex * 64;
288
+ return result.set(signatureBytes, signatureOffset), result;
289
+ }
290
+ function toWalletAccount(account, chains) {
291
+ let base58Encoder = codecs.getBase58Encoder();
292
+ return {
293
+ address: account.pubkey,
294
+ publicKey: base58Encoder.encode(account.pubkey),
295
+ chains,
296
+ features: []
297
+ };
298
+ }
299
+ function createWalletConnectWallet(config, transport) {
300
+ let chains = config.defaultChain ? [config.defaultChain] : DEFAULT_CHAINS;
301
+ function getCurrentCaipChainId() {
302
+ let currentChain = config.getCurrentChain?.() || config.defaultChain || "solana:mainnet";
303
+ return toCaipChainId(currentChain);
304
+ }
305
+ let accounts = [], changeListeners = /* @__PURE__ */ new Set();
306
+ function emitChange() {
307
+ changeListeners.forEach((fn) => fn({ accounts }));
308
+ }
309
+ function refreshAccountsFromSession(sessionAccounts) {
310
+ if (sessionAccounts.length === 0) {
311
+ accounts = [], emitChange();
312
+ return;
313
+ }
314
+ accounts = sessionAccounts.map((pubkey) => toWalletAccount({ pubkey }, chains)), emitChange();
315
+ }
316
+ let unsubscribeSessionChanged;
317
+ if (transport.onSessionChanged) {
318
+ let unsubscribe = transport.onSessionChanged(refreshAccountsFromSession);
319
+ typeof unsubscribe == "function" && (unsubscribeSessionChanged = unsubscribe);
320
+ }
321
+ function cleanupSessionSubscription() {
322
+ unsubscribeSessionChanged && (unsubscribeSessionChanged(), unsubscribeSessionChanged = void 0);
323
+ }
324
+ let wallet = {
325
+ version: "1.0.0",
326
+ name: "WalletConnect",
327
+ icon: WALLETCONNECT_ICON,
328
+ chains,
329
+ get accounts() {
330
+ return accounts;
331
+ },
332
+ cleanup: cleanupSessionSubscription,
333
+ features: {
334
+ // Standard connect feature
335
+ "standard:connect": {
336
+ version: "1.0.0",
337
+ connect: async (input) => {
338
+ await transport.connect();
339
+ let sessionAccounts = transport.getSessionAccounts();
340
+ if (sessionAccounts.length > 0)
341
+ return accounts = sessionAccounts.map((pubkey) => toWalletAccount({ pubkey }, chains)), emitChange(), { accounts };
342
+ let method = input?.silent ? "solana_getAccounts" : "solana_requestAccounts", result, firstError;
343
+ try {
344
+ result = await transport.request({
345
+ method,
346
+ params: {},
347
+ chainId: getCurrentCaipChainId()
348
+ });
349
+ } catch (error) {
350
+ firstError = error;
351
+ try {
352
+ let fallbackMethod = method === "solana_getAccounts" ? "solana_requestAccounts" : "solana_getAccounts";
353
+ result = await transport.request({
354
+ method: fallbackMethod,
355
+ params: {},
356
+ chainId: getCurrentCaipChainId()
357
+ });
358
+ } catch (fallbackError) {
359
+ let firstMessage = firstError instanceof Error ? firstError.message : String(firstError), fallbackMessage = fallbackError instanceof Error ? fallbackError.message : String(fallbackError), details = [firstMessage, fallbackMessage].filter(Boolean).join(" | ");
360
+ throw new Error(
361
+ `Failed to get accounts from WalletConnect. The wallet may not support Solana accounts.${details ? ` (Details: ${details})` : ""}`
362
+ );
363
+ }
364
+ }
365
+ return accounts = Array.isArray(result) ? result.map((acc) => toWalletAccount(acc, chains)) : [], emitChange(), { accounts };
366
+ }
367
+ },
368
+ // Standard disconnect feature
369
+ "standard:disconnect": {
370
+ version: "1.0.0",
371
+ disconnect: async () => {
372
+ cleanupSessionSubscription(), await transport.disconnect(), accounts = [], emitChange();
373
+ }
374
+ },
375
+ // Standard events feature
376
+ "standard:events": {
377
+ version: "1.0.0",
378
+ on: (event, listener) => event !== "change" ? () => {
379
+ } : (changeListeners.add(listener), () => changeListeners.delete(listener))
380
+ },
381
+ // Solana sign message feature
382
+ "solana:signMessage": {
383
+ version: "1.0.0",
384
+ signMessage: async ({ account, message }) => {
385
+ let messageBase58 = codecs.getBase58Decoder().decode(message), result = await transport.request({
386
+ method: "solana_signMessage",
387
+ params: {
388
+ message: messageBase58,
389
+ pubkey: account.address
390
+ },
391
+ chainId: getCurrentCaipChainId()
392
+ });
393
+ return [{ signature: codecs.getBase58Encoder().encode(result.signature), signedMessage: message }];
394
+ }
395
+ },
396
+ // Solana sign transaction feature
397
+ "solana:signTransaction": {
398
+ version: "1.0.0",
399
+ signTransaction: async ({
400
+ account,
401
+ transaction
402
+ }) => {
403
+ let transactionBase64 = bytesToBase64(transaction), requestChainId = getCurrentCaipChainId(), result = await transport.request({
404
+ method: "solana_signTransaction",
405
+ params: {
406
+ transaction: transactionBase64
407
+ },
408
+ chainId: requestChainId
409
+ }), signedTransaction;
410
+ if (result.transaction)
411
+ signedTransaction = decodeTransaction(result.transaction);
412
+ else if (result.signature) {
413
+ let signerIndex = findSignerIndex(transaction, account.address);
414
+ if (signerIndex < 0)
415
+ throw new Error("Signer pubkey not found in transaction");
416
+ signedTransaction = injectSignature(transaction, signerIndex, result.signature);
417
+ } else
418
+ throw new Error("Invalid solana_signTransaction response: no signature or transaction");
419
+ return [{ signedTransaction }];
420
+ }
421
+ },
422
+ // Solana sign all transactions feature
423
+ "solana:signAllTransactions": {
424
+ version: "1.0.0",
425
+ signAllTransactions: async ({
426
+ account,
427
+ transactions
428
+ }) => {
429
+ let transactionsBase64 = transactions.map(bytesToBase64);
430
+ try {
431
+ return (await transport.request({
432
+ method: "solana_signAllTransactions",
433
+ params: {
434
+ transactions: transactionsBase64
435
+ },
436
+ chainId: getCurrentCaipChainId()
437
+ })).transactions.map((txEncoded) => ({
438
+ signedTransaction: decodeTransaction(txEncoded)
439
+ }));
440
+ } catch {
441
+ let signFeature = wallet.features["solana:signTransaction"];
442
+ return (await Promise.all(
443
+ transactions.map((tx) => signFeature.signTransaction({ account, transaction: tx }))
444
+ )).map((r) => ({ signedTransaction: r[0].signedTransaction }));
445
+ }
446
+ }
447
+ },
448
+ // Solana sign and send transaction feature
449
+ "solana:signAndSendTransaction": {
450
+ version: "1.0.0",
451
+ signAndSendTransaction: async ({
452
+ transaction,
453
+ options
454
+ }) => {
455
+ let transactionBase64 = bytesToBase64(transaction), result = await transport.request({
456
+ method: "solana_signAndSendTransaction",
457
+ params: {
458
+ transaction: transactionBase64,
459
+ sendOptions: options ? {
460
+ skipPreflight: options.skipPreflight,
461
+ preflightCommitment: options.preflightCommitment,
462
+ maxRetries: options.maxRetries,
463
+ minContextSlot: options.minContextSlot
464
+ } : void 0
465
+ },
466
+ chainId: getCurrentCaipChainId()
467
+ });
468
+ return [{ signature: codecs.getBase58Encoder().encode(result.signature) }];
469
+ }
470
+ }
471
+ }
472
+ };
473
+ return wallet;
474
+ }
475
+
476
+ // src/lib/wallet/walletconnect/register-walletconnect.ts
477
+ var logger2 = chunkSITQ4JWM_js.createLogger("WalletConnectRegistration");
478
+ async function registerWalletConnectWallet(config) {
479
+ if (typeof window > "u")
480
+ throw new Error("WalletConnect registration can only be done in a browser environment");
481
+ logger2.debug("Registering WalletConnect wallet", {
482
+ projectId: config.projectId.substring(0, 8) + "...",
483
+ defaultChain: config.defaultChain
484
+ });
485
+ let transport = await createWalletConnectTransport(config), wallet = createWalletConnectWallet(config, transport), { getWallets } = await import('@wallet-standard/app'), unregister = getWallets().register(wallet);
486
+ return logger2.info("WalletConnect wallet registered successfully"), {
487
+ wallet,
488
+ unregister
489
+ };
490
+ }
491
+ async function isWalletConnectAvailable() {
492
+ if (typeof window > "u")
493
+ return false;
494
+ try {
495
+ return await import('@walletconnect/universal-provider'), true;
496
+ } catch {
497
+ return false;
498
+ }
499
+ }
500
+
501
+ exports.createMockWalletConnectTransport = createMockWalletConnectTransport;
502
+ exports.createWalletConnectTransport = createWalletConnectTransport;
503
+ exports.createWalletConnectWallet = createWalletConnectWallet;
504
+ exports.isWalletConnectAvailable = isWalletConnectAvailable;
505
+ exports.registerWalletConnectWallet = registerWalletConnectWallet;
506
+ //# sourceMappingURL=chunk-HN5AJF7F.js.map
507
+ //# sourceMappingURL=chunk-HN5AJF7F.js.map
@@ -0,0 +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":["createLogger","getBase58Encoder","getBase58Decoder","logger"],"mappings":"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","file":"chunk-HN5AJF7F.js","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"]}