@solana/connector 0.2.3 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-WPDCSFX2.mjs → chunk-26SWXQP6.mjs} +11 -8
- package/dist/chunk-26SWXQP6.mjs.map +1 -0
- package/dist/{chunk-NLPEO5GT.js → chunk-5MA4YO43.js} +3 -3
- package/dist/chunk-5MA4YO43.js.map +1 -0
- package/dist/{chunk-B6YBZB6H.js → chunk-6UTXGTYX.js} +26 -23
- package/dist/chunk-6UTXGTYX.js.map +1 -0
- package/dist/{chunk-X2X5TFXS.js → chunk-7DATF5NN.js} +4 -4
- package/dist/{chunk-X2X5TFXS.js.map → chunk-7DATF5NN.js.map} +1 -1
- package/dist/{chunk-E3DAIOYS.mjs → chunk-GM3PZ3WK.mjs} +11 -6
- package/dist/chunk-GM3PZ3WK.mjs.map +1 -0
- package/dist/{chunk-QST7XLMB.js → chunk-PNZYYZZS.js} +11 -6
- package/dist/chunk-PNZYYZZS.js.map +1 -0
- package/dist/{chunk-UOML5ULB.mjs → chunk-PP7GI6BR.mjs} +3 -3
- package/dist/{chunk-UOML5ULB.mjs.map → chunk-PP7GI6BR.mjs.map} +1 -1
- package/dist/{chunk-DFKGCW7K.mjs → chunk-STJOIQUF.mjs} +35 -8
- package/dist/chunk-STJOIQUF.mjs.map +1 -0
- package/dist/{chunk-ULEPN4NL.js → chunk-USIWRRHO.js} +34 -7
- package/dist/chunk-USIWRRHO.js.map +1 -0
- package/dist/{chunk-A7WQ3K75.mjs → chunk-ZBPAQUIP.mjs} +3 -3
- package/dist/chunk-ZBPAQUIP.mjs.map +1 -0
- package/dist/compat.d.mts +1 -1
- package/dist/compat.d.ts +1 -1
- package/dist/headless.d.mts +5 -6
- package/dist/headless.d.ts +5 -6
- package/dist/headless.js +113 -113
- package/dist/headless.mjs +3 -3
- package/dist/index.d.mts +2 -3
- package/dist/index.d.ts +2 -3
- package/dist/index.js +154 -154
- package/dist/index.mjs +4 -4
- package/dist/{protocol-G-z1lRqo.d.mts → protocol-nWSt9TTV.d.mts} +1 -1
- package/dist/{protocol-G-z1lRqo.d.ts → protocol-nWSt9TTV.d.ts} +1 -1
- package/dist/react.d.mts +23 -18
- package/dist/react.d.ts +23 -18
- package/dist/react.js +49 -49
- package/dist/react.mjs +2 -2
- package/dist/remote.d.mts +2 -2
- package/dist/remote.d.ts +2 -2
- package/dist/remote.js +13 -13
- package/dist/remote.mjs +2 -2
- package/dist/server.d.mts +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.js +13 -10
- package/dist/server.js.map +1 -1
- package/dist/server.mjs +5 -2
- package/dist/server.mjs.map +1 -1
- package/dist/{standard-shim-BB0Lkg_C.d.ts → standard-shim-BK2nn2ZT.d.ts} +15 -8
- package/dist/{standard-shim-n5phZB1d.d.mts → standard-shim-DSMKHCxD.d.mts} +15 -8
- package/dist/{transaction-signer-7NaYmP5w.d.ts → transaction-signer-B3eCsMfI.d.mts} +1 -1
- package/dist/{transaction-signer-7NaYmP5w.d.mts → transaction-signer-B3eCsMfI.d.ts} +1 -1
- package/dist/{walletconnect-F2M3PAAN.js → walletconnect-FFPQ6PDH.js} +8 -8
- package/dist/{walletconnect-F2M3PAAN.js.map → walletconnect-FFPQ6PDH.js.map} +1 -1
- package/dist/walletconnect-HMQQB3YM.mjs +3 -0
- package/dist/{walletconnect-Z6LPGALR.mjs.map → walletconnect-HMQQB3YM.mjs.map} +1 -1
- package/package.json +40 -31
- package/dist/chunk-A7WQ3K75.mjs.map +0 -1
- package/dist/chunk-B6YBZB6H.js.map +0 -1
- package/dist/chunk-DFKGCW7K.mjs.map +0 -1
- package/dist/chunk-E3DAIOYS.mjs.map +0 -1
- package/dist/chunk-NLPEO5GT.js.map +0 -1
- package/dist/chunk-QST7XLMB.js.map +0 -1
- package/dist/chunk-ULEPN4NL.js.map +0 -1
- package/dist/chunk-WPDCSFX2.mjs.map +0 -1
- package/dist/walletconnect-Z6LPGALR.mjs +0 -3
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
import React, { ReactNode } from 'react';
|
|
1
|
+
import React__default, { ReactNode } from 'react';
|
|
3
2
|
import * as _wallet_standard_base from '@wallet-standard/base';
|
|
4
3
|
import { Wallet, WalletAccount, IdentifierArray } from '@wallet-standard/base';
|
|
5
|
-
import {
|
|
4
|
+
import { T as TransactionActivity, g as TransactionActivityStatus, f as SolanaTransaction } from './transaction-signer-B3eCsMfI.mjs';
|
|
6
5
|
import { SolanaClusterId, SolanaCluster } from '@wallet-ui/core';
|
|
7
6
|
import { Address } from '@solana/addresses';
|
|
8
7
|
import { Signature } from '@solana/keys';
|
|
@@ -930,6 +929,14 @@ declare class ConnectorClient {
|
|
|
930
929
|
offAll(): void;
|
|
931
930
|
emitEvent(event: ConnectorEvent): void;
|
|
932
931
|
trackTransaction(activity: Omit<TransactionActivity, 'timestamp' | 'cluster'>): void;
|
|
932
|
+
/**
|
|
933
|
+
* Emit a pre-send transaction preview event for devtools.
|
|
934
|
+
*
|
|
935
|
+
* This does not sign or send the transaction. It exists so apps that do not
|
|
936
|
+
* use the connector transaction signer can still surface wire bytes in the
|
|
937
|
+
* debugger (e.g. to simulate before sending).
|
|
938
|
+
*/
|
|
939
|
+
previewTransaction(transaction: SolanaTransaction): void;
|
|
933
940
|
updateTransactionStatus(signature: string, status: TransactionActivity['status'], error?: string): void;
|
|
934
941
|
clearTransactionHistory(): void;
|
|
935
942
|
getHealth(): ConnectorHealth;
|
|
@@ -971,7 +978,7 @@ interface DefaultConfigOptions {
|
|
|
971
978
|
/** Maximum retry attempts for error recovery (default: 3) */
|
|
972
979
|
maxRetries?: number;
|
|
973
980
|
/** Custom error handler */
|
|
974
|
-
onError?: (error: Error, errorInfo:
|
|
981
|
+
onError?: (error: Error, errorInfo: React__default.ErrorInfo) => void;
|
|
975
982
|
/**
|
|
976
983
|
* Image proxy URL prefix for token images.
|
|
977
984
|
* When set, token image URLs will be transformed to: `${imageProxy}${encodeURIComponent(originalUrl)}`
|
|
@@ -1075,9 +1082,9 @@ interface ExtendedConnectorConfig extends ConnectorConfig {
|
|
|
1075
1082
|
/** Maximum retry attempts (default: 3) */
|
|
1076
1083
|
maxRetries?: number;
|
|
1077
1084
|
/** Custom error handler */
|
|
1078
|
-
onError?: (error: Error, errorInfo:
|
|
1085
|
+
onError?: (error: Error, errorInfo: React__default.ErrorInfo) => void;
|
|
1079
1086
|
/** Custom fallback component */
|
|
1080
|
-
fallback?: (error: Error, retry: () => void) =>
|
|
1087
|
+
fallback?: (error: Error, retry: () => void) => React__default.ReactNode;
|
|
1081
1088
|
};
|
|
1082
1089
|
/**
|
|
1083
1090
|
* Image proxy URL prefix for token images.
|
|
@@ -1206,7 +1213,7 @@ declare function ConnectorProvider({ children, config, mobile, }: {
|
|
|
1206
1213
|
children: ReactNode;
|
|
1207
1214
|
config?: ExtendedConnectorConfig;
|
|
1208
1215
|
mobile?: MobileWalletAdapterConfig;
|
|
1209
|
-
}):
|
|
1216
|
+
}): React__default.JSX.Element;
|
|
1210
1217
|
declare function useConnector(): ConnectorSnapshot;
|
|
1211
1218
|
declare function useConnectorClient(): ConnectorClient | null;
|
|
1212
1219
|
|
|
@@ -1617,4 +1624,4 @@ declare const ready: Promise<void>;
|
|
|
1617
1624
|
*/
|
|
1618
1625
|
declare function getWalletsRegistry(): WalletsRegistry;
|
|
1619
1626
|
|
|
1620
|
-
export { type
|
|
1627
|
+
export { type WalletError as $, type AccountAddress as A, type StorageOptions as B, ClipboardErrorType as C, type DefaultConfigOptions as D, type EnhancedStorageAccountOptions as E, type WalletConnectMetadata as F, type WalletConnectSignAllTransactionsParams as G, type WalletConnectSignAllTransactionsResult as H, INITIAL_WALLET_STATUS as I, type WalletConnectSignAndSendTransactionParams as J, type WalletConnectSignAndSendTransactionResult as K, type Listener as L, type MobileWalletAdapterConfig as M, type WalletConnectSignMessageParams as N, type WalletConnectSignMessageResult as O, type PersistedWalletState as P, type WalletConnectSignTransactionParams as Q, type RegisterMwaConfig as R, type SessionAccount as S, type WalletConnectSignTransactionResult as T, type WalletConnectSolanaAccount as U, type WalletConnectTransport as V, type WalletConnectConfig as W, type WalletConnector as X, type WalletConnectorId as Y, type WalletConnectorMetadata as Z, type WalletDisplayConfig as _, type AccountInfo as a, WalletErrorType as a0, type WalletInfo as a1, type WalletName as a2, type WalletSession as a3, type WalletStandardAccount as a4, type WalletStandardWallet as a5, type WalletStatus as a6, type WalletStatusConnected as a7, type WalletStatusConnecting as a8, type WalletStatusDisconnected as a9, isDevnetCluster as aA, isDisconnected as aB, isLocalCluster as aC, isMainnetCluster as aD, isStatusError as aE, isTestnetCluster as aF, isWalletConnectorId as aG, isWalletError as aH, isWalletName as aI, isWalletStatusError as aJ, ready as aK, toLegacyWalletState as aL, useConnector as aM, useConnectorClient as aN, type WalletStatusError as aa, copyAddressToClipboard as ab, copySignatureToClipboard as ac, copyToClipboard as ad, createConnectorId as ae, createSolanaClient as af, createWalletError as ag, getAddressUrl as ah, getBlockUrl as ai, getChainIdForWalletStandard as aj, getClusterChainId as ak, getClusterExplorerUrl as al, getClusterName as am, getClusterRpcUrl as an, getClusterType as ao, getDefaultConfig as ap, getDefaultMobileConfig as aq, getPublicSolanaRpcUrl as ar, getTokenUrl as as, getTransactionUrl as at, getWalletNameFromConnectorId as au, getWalletsRegistry as av, isAccountAddress as aw, isClipboardAvailable as ax, isConnected as ay, isConnecting as az, type ClipboardResult as b, type ClusterType as c, type CoinGeckoConfig as d, type ConnectOptions as e, ConnectorClient as f, type ConnectorConfig as g, type ConnectorDebugMetrics as h, type ConnectorDebugState as i, type ConnectorEvent as j, type ConnectorEventListener as k, type ConnectorHealth as l, ConnectorProvider as m, type ConnectorSnapshot as n, type ConnectorState as o, type CopyOptions as p, type CreateSolanaClientArgs as q, type EnhancedStorageClusterOptions as r, type EnhancedStorageWalletOptions as s, type EnhancedStorageWalletStateOptions as t, type ExtendedConnectorConfig as u, type ModifiedClusterUrl as v, type SimplifiedWalletConnectConfig as w, type SolanaClient as x, type SolanaClusterMoniker as y, type StorageAdapter as z };
|
|
@@ -199,4 +199,4 @@ declare class TransactionSignerError extends TransactionError {
|
|
|
199
199
|
*/
|
|
200
200
|
declare function isTransactionSignerError(error: unknown): error is TransactionSignerError;
|
|
201
201
|
|
|
202
|
-
export {
|
|
202
|
+
export { ConfigurationError as C, Errors as E, NetworkError as N, type SignedTransaction as S, type TransactionActivity as T, ValidationError as V, type ConfigurationErrorCode as a, ConnectionError as b, type ConnectionErrorCode as c, ConnectorError as d, type NetworkErrorCode as e, type SolanaTransaction as f, type TransactionActivityStatus as g, TransactionError as h, type TransactionErrorCode as i, type TransactionMetadata as j, type TransactionMethod as k, type TransactionSigner as l, type TransactionSignerCapabilities as m, type TransactionSignerConfig as n, TransactionSignerError as o, type ValidationErrorCode as p, createTransactionSigner as q, getUserFriendlyMessage as r, isConfigurationError as s, isConnectionError as t, isConnectorError as u, isNetworkError as v, isTransactionError as w, isTransactionSignerError as x, isValidationError as y, toConnectorError as z };
|
|
@@ -199,4 +199,4 @@ declare class TransactionSignerError extends TransactionError {
|
|
|
199
199
|
*/
|
|
200
200
|
declare function isTransactionSignerError(error: unknown): error is TransactionSignerError;
|
|
201
201
|
|
|
202
|
-
export {
|
|
202
|
+
export { ConfigurationError as C, Errors as E, NetworkError as N, type SignedTransaction as S, type TransactionActivity as T, ValidationError as V, type ConfigurationErrorCode as a, ConnectionError as b, type ConnectionErrorCode as c, ConnectorError as d, type NetworkErrorCode as e, type SolanaTransaction as f, type TransactionActivityStatus as g, TransactionError as h, type TransactionErrorCode as i, type TransactionMetadata as j, type TransactionMethod as k, type TransactionSigner as l, type TransactionSignerCapabilities as m, type TransactionSignerConfig as n, TransactionSignerError as o, type ValidationErrorCode as p, createTransactionSigner as q, getUserFriendlyMessage as r, isConfigurationError as s, isConnectionError as t, isConnectorError as u, isNetworkError as v, isTransactionError as w, isTransactionSignerError as x, isValidationError as y, toConnectorError as z };
|
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunk5MA4YO43_js = require('./chunk-5MA4YO43.js');
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
Object.defineProperty(exports, "createMockWalletConnectTransport", {
|
|
8
8
|
enumerable: true,
|
|
9
|
-
get: function () { return
|
|
9
|
+
get: function () { return chunk5MA4YO43_js.createMockWalletConnectTransport; }
|
|
10
10
|
});
|
|
11
11
|
Object.defineProperty(exports, "createWalletConnectTransport", {
|
|
12
12
|
enumerable: true,
|
|
13
|
-
get: function () { return
|
|
13
|
+
get: function () { return chunk5MA4YO43_js.createWalletConnectTransport; }
|
|
14
14
|
});
|
|
15
15
|
Object.defineProperty(exports, "createWalletConnectWallet", {
|
|
16
16
|
enumerable: true,
|
|
17
|
-
get: function () { return
|
|
17
|
+
get: function () { return chunk5MA4YO43_js.createWalletConnectWallet; }
|
|
18
18
|
});
|
|
19
19
|
Object.defineProperty(exports, "isWalletConnectAvailable", {
|
|
20
20
|
enumerable: true,
|
|
21
|
-
get: function () { return
|
|
21
|
+
get: function () { return chunk5MA4YO43_js.isWalletConnectAvailable; }
|
|
22
22
|
});
|
|
23
23
|
Object.defineProperty(exports, "registerWalletConnectWallet", {
|
|
24
24
|
enumerable: true,
|
|
25
|
-
get: function () { return
|
|
25
|
+
get: function () { return chunk5MA4YO43_js.registerWalletConnectWallet; }
|
|
26
26
|
});
|
|
27
|
-
//# sourceMappingURL=walletconnect-
|
|
28
|
-
//# sourceMappingURL=walletconnect-
|
|
27
|
+
//# sourceMappingURL=walletconnect-FFPQ6PDH.js.map
|
|
28
|
+
//# sourceMappingURL=walletconnect-FFPQ6PDH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"walletconnect-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"walletconnect-FFPQ6PDH.js"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { createMockWalletConnectTransport, createWalletConnectTransport, createWalletConnectWallet, isWalletConnectAvailable, registerWalletConnectWallet } from './chunk-ZBPAQUIP.mjs';
|
|
2
|
+
//# sourceMappingURL=walletconnect-HMQQB3YM.mjs.map
|
|
3
|
+
//# sourceMappingURL=walletconnect-HMQQB3YM.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"walletconnect-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"walletconnect-HMQQB3YM.mjs"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@solana/connector",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.6",
|
|
4
4
|
"description": "Headless wallet connector client and React provider built on Wallet Standard",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -57,15 +57,15 @@
|
|
|
57
57
|
"test:coverage": "vitest run --coverage"
|
|
58
58
|
},
|
|
59
59
|
"peerDependencies": {
|
|
60
|
+
"@solana/keychain": "^1.2.0",
|
|
61
|
+
"@solana/keychain-aws-kms": "^1.2.0",
|
|
62
|
+
"@solana/keychain-fireblocks": "^1.2.0",
|
|
63
|
+
"@solana/keychain-privy": "^1.2.0",
|
|
64
|
+
"@solana/keychain-turnkey": "^1.2.0",
|
|
65
|
+
"@solana/keychain-vault": "^1.2.0",
|
|
60
66
|
"@solana/web3.js": "^1.0.0",
|
|
61
|
-
"
|
|
62
|
-
"
|
|
63
|
-
"@solana/keychain": "^0.2.1",
|
|
64
|
-
"@solana/keychain-fireblocks": "^0.2.1",
|
|
65
|
-
"@solana/keychain-privy": "^0.2.1",
|
|
66
|
-
"@solana/keychain-turnkey": "^0.2.1",
|
|
67
|
-
"@solana/keychain-vault": "^0.2.1",
|
|
68
|
-
"@solana/keychain-aws-kms": "^0.2.1"
|
|
67
|
+
"@walletconnect/universal-provider": "^2.23.9",
|
|
68
|
+
"react": ">=18.0.0"
|
|
69
69
|
},
|
|
70
70
|
"peerDependenciesMeta": {
|
|
71
71
|
"react": {
|
|
@@ -88,37 +88,46 @@
|
|
|
88
88
|
},
|
|
89
89
|
"@solana/keychain-privy": {
|
|
90
90
|
"optional": true
|
|
91
|
+
},
|
|
92
|
+
"@solana/keychain-turnkey": {
|
|
93
|
+
"optional": true
|
|
94
|
+
},
|
|
95
|
+
"@solana/keychain-vault": {
|
|
96
|
+
"optional": true
|
|
97
|
+
},
|
|
98
|
+
"@solana/keychain-aws-kms": {
|
|
99
|
+
"optional": true
|
|
91
100
|
}
|
|
92
101
|
},
|
|
93
102
|
"dependencies": {
|
|
94
|
-
"@solana-mobile/wallet-standard-mobile": "^0.
|
|
95
|
-
"@solana/
|
|
96
|
-
"@solana/
|
|
97
|
-
"@solana/
|
|
98
|
-
"@solana/
|
|
99
|
-
"@solana/
|
|
100
|
-
"@solana/
|
|
101
|
-
"@solana/
|
|
102
|
-
"@solana/
|
|
103
|
-
"@wallet-standard/app": "^1.1.
|
|
104
|
-
"@wallet-standard/base": "^1.1.
|
|
105
|
-
"@wallet-standard/features": "^1.1.
|
|
106
|
-
"@wallet-ui/core": "^2.
|
|
107
|
-
"zod": "^4.
|
|
103
|
+
"@solana-mobile/wallet-standard-mobile": "^0.5.3",
|
|
104
|
+
"@solana/addresses": "^7.0.0",
|
|
105
|
+
"@solana/codecs": "^7.0.0",
|
|
106
|
+
"@solana/keys": "^7.0.0",
|
|
107
|
+
"@solana/kit": "^7.0.0",
|
|
108
|
+
"@solana/signers": "^7.0.0",
|
|
109
|
+
"@solana/transaction-messages": "^7.0.0",
|
|
110
|
+
"@solana/transactions": "^7.0.0",
|
|
111
|
+
"@solana/webcrypto-ed25519-polyfill": "^7.0.0",
|
|
112
|
+
"@wallet-standard/app": "^1.1.1",
|
|
113
|
+
"@wallet-standard/base": "^1.1.1",
|
|
114
|
+
"@wallet-standard/features": "^1.1.1",
|
|
115
|
+
"@wallet-ui/core": "^4.2.0",
|
|
116
|
+
"zod": "^4.4.3"
|
|
108
117
|
},
|
|
109
118
|
"devDependencies": {
|
|
110
119
|
"@testing-library/jest-dom": "^6.9.1",
|
|
111
120
|
"@testing-library/react": "^16.3.0",
|
|
112
121
|
"@testing-library/user-event": "^14.6.1",
|
|
113
|
-
"@types/react": "^19.2.
|
|
114
|
-
"@vitest/coverage-v8": "^
|
|
115
|
-
"@vitest/ui": "^
|
|
116
|
-
"happy-dom": "^20.
|
|
117
|
-
"react": "^19.2.
|
|
118
|
-
"react-dom": "^19.2.
|
|
122
|
+
"@types/react": "^19.2.17",
|
|
123
|
+
"@vitest/coverage-v8": "^4.1.9",
|
|
124
|
+
"@vitest/ui": "^4.1.9",
|
|
125
|
+
"happy-dom": "^20.10.6",
|
|
126
|
+
"react": "^19.2.7",
|
|
127
|
+
"react-dom": "^19.2.7",
|
|
119
128
|
"tsup": "^8.5.0",
|
|
120
|
-
"typescript": "^
|
|
121
|
-
"vitest": "^
|
|
129
|
+
"typescript": "^6.0.3",
|
|
130
|
+
"vitest": "^4.1.9"
|
|
122
131
|
},
|
|
123
132
|
"license": "MIT",
|
|
124
133
|
"repository": {
|
|
@@ -1 +0,0 @@
|
|
|
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"]}
|