@solana/connector 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -11
- package/dist/{chunk-HPQ5T32K.mjs → chunk-3623Z2QL.mjs} +4 -4
- package/dist/{chunk-HPQ5T32K.mjs.map → chunk-3623Z2QL.mjs.map} +1 -1
- package/dist/{chunk-UCISIAOG.mjs → chunk-A7WQ3K75.mjs} +3 -3
- package/dist/{chunk-UCISIAOG.mjs.map → chunk-A7WQ3K75.mjs.map} +1 -1
- package/dist/{chunk-SITQ4JWM.js → chunk-BF67LVVM.js} +17 -21
- package/dist/chunk-BF67LVVM.js.map +1 -0
- package/dist/{chunk-RTXUS5KG.mjs → chunk-DFHJYZKZ.mjs} +84 -71
- package/dist/chunk-DFHJYZKZ.mjs.map +1 -0
- package/dist/chunk-E3DAIOYS.mjs +22 -0
- package/dist/chunk-E3DAIOYS.mjs.map +1 -0
- package/dist/chunk-FG7HTQTV.mjs +7 -0
- package/dist/chunk-FG7HTQTV.mjs.map +1 -0
- package/dist/{chunk-BJAVJQLK.js → chunk-I2XX5FUG.js} +6 -6
- package/dist/{chunk-BJAVJQLK.js.map → chunk-I2XX5FUG.js.map} +1 -1
- package/dist/chunk-L5FWMNWO.js +9 -0
- package/dist/chunk-L5FWMNWO.js.map +1 -0
- package/dist/{chunk-HN5AJF7F.js → chunk-NLPEO5GT.js} +5 -5
- package/dist/{chunk-HN5AJF7F.js.map → chunk-NLPEO5GT.js.map} +1 -1
- package/dist/chunk-QST7XLMB.js +26 -0
- package/dist/chunk-QST7XLMB.js.map +1 -0
- package/dist/{chunk-ZZTY3O4N.mjs → chunk-SJCQ3KZE.mjs} +4 -7
- package/dist/chunk-SJCQ3KZE.mjs.map +1 -0
- package/dist/{chunk-IDTUFDNB.mjs → chunk-SQ2JEA2M.mjs} +58 -11
- package/dist/chunk-SQ2JEA2M.mjs.map +1 -0
- package/dist/{chunk-BZ2VBJCZ.js → chunk-TRSJSU33.js} +141 -94
- package/dist/chunk-TRSJSU33.js.map +1 -0
- package/dist/{chunk-EM4KNOKG.js → chunk-VVLY6QPI.js} +202 -189
- package/dist/chunk-VVLY6QPI.js.map +1 -0
- package/dist/compat.js +2 -2
- package/dist/compat.mjs +1 -1
- package/dist/fireblocks-FLKRTJU3.js +67 -0
- package/dist/fireblocks-FLKRTJU3.js.map +1 -0
- package/dist/fireblocks-KCJV3GEK.mjs +65 -0
- package/dist/fireblocks-KCJV3GEK.mjs.map +1 -0
- package/dist/headless.d.mts +6 -11
- package/dist/headless.d.ts +6 -11
- package/dist/headless.js +147 -147
- package/dist/headless.mjs +4 -4
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +188 -188
- package/dist/index.mjs +5 -5
- package/dist/privy-6LYDE24Z.mjs +64 -0
- package/dist/privy-6LYDE24Z.mjs.map +1 -0
- package/dist/privy-ID4YFTKR.js +66 -0
- package/dist/privy-ID4YFTKR.js.map +1 -0
- package/dist/protocol-G-z1lRqo.d.mts +166 -0
- package/dist/protocol-G-z1lRqo.d.ts +166 -0
- package/dist/react.d.mts +18 -6
- package/dist/react.d.ts +18 -6
- package/dist/react.js +49 -49
- package/dist/react.mjs +2 -2
- package/dist/remote.d.mts +46 -0
- package/dist/remote.d.ts +46 -0
- package/dist/remote.js +212 -0
- package/dist/remote.js.map +1 -0
- package/dist/remote.mjs +198 -0
- package/dist/remote.mjs.map +1 -0
- package/dist/server.d.mts +141 -0
- package/dist/server.d.ts +141 -0
- package/dist/server.js +189 -0
- package/dist/server.js.map +1 -0
- package/dist/server.mjs +187 -0
- package/dist/server.mjs.map +1 -0
- package/dist/{standard-shim-tmnQelaJ.d.ts → standard-shim-Cg6fmjK_.d.ts} +10 -0
- package/dist/{standard-shim-CGB88PPO.d.mts → standard-shim-Cz4UNS7t.d.mts} +10 -0
- package/dist/{walletconnect-447EY3OJ.js → walletconnect-F2M3PAAN.js} +8 -8
- package/dist/{walletconnect-447EY3OJ.js.map → walletconnect-F2M3PAAN.js.map} +1 -1
- package/dist/walletconnect-Z6LPGALR.mjs +3 -0
- package/dist/{walletconnect-U455PO4I.mjs.map → walletconnect-Z6LPGALR.mjs.map} +1 -1
- package/package.json +27 -2
- package/dist/chunk-BZ2VBJCZ.js.map +0 -1
- package/dist/chunk-EM4KNOKG.js.map +0 -1
- package/dist/chunk-IDTUFDNB.mjs.map +0 -1
- package/dist/chunk-RTXUS5KG.mjs.map +0 -1
- package/dist/chunk-SITQ4JWM.js.map +0 -1
- package/dist/chunk-ZZTY3O4N.mjs.map +0 -1
- package/dist/walletconnect-U455PO4I.mjs +0 -3
package/dist/react.js
CHANGED
|
@@ -1,197 +1,197 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var chunkVVLY6QPI_js = require('./chunk-VVLY6QPI.js');
|
|
4
|
+
var chunkTRSJSU33_js = require('./chunk-TRSJSU33.js');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
Object.defineProperty(exports, "AccountElement", {
|
|
9
9
|
enumerable: true,
|
|
10
|
-
get: function () { return
|
|
10
|
+
get: function () { return chunkVVLY6QPI_js.AccountElement; }
|
|
11
11
|
});
|
|
12
12
|
Object.defineProperty(exports, "AppProvider", {
|
|
13
13
|
enumerable: true,
|
|
14
|
-
get: function () { return
|
|
14
|
+
get: function () { return chunkVVLY6QPI_js.AppProvider; }
|
|
15
15
|
});
|
|
16
16
|
Object.defineProperty(exports, "BalanceElement", {
|
|
17
17
|
enumerable: true,
|
|
18
|
-
get: function () { return
|
|
18
|
+
get: function () { return chunkVVLY6QPI_js.BalanceElement; }
|
|
19
19
|
});
|
|
20
20
|
Object.defineProperty(exports, "ClusterElement", {
|
|
21
21
|
enumerable: true,
|
|
22
|
-
get: function () { return
|
|
22
|
+
get: function () { return chunkVVLY6QPI_js.ClusterElement; }
|
|
23
23
|
});
|
|
24
24
|
Object.defineProperty(exports, "ConnectorErrorBoundary", {
|
|
25
25
|
enumerable: true,
|
|
26
|
-
get: function () { return
|
|
26
|
+
get: function () { return chunkVVLY6QPI_js.ConnectorErrorBoundary; }
|
|
27
27
|
});
|
|
28
28
|
Object.defineProperty(exports, "ConnectorProvider", {
|
|
29
29
|
enumerable: true,
|
|
30
|
-
get: function () { return
|
|
30
|
+
get: function () { return chunkVVLY6QPI_js.ConnectorProvider; }
|
|
31
31
|
});
|
|
32
32
|
Object.defineProperty(exports, "DisconnectElement", {
|
|
33
33
|
enumerable: true,
|
|
34
|
-
get: function () { return
|
|
34
|
+
get: function () { return chunkVVLY6QPI_js.DisconnectElement; }
|
|
35
35
|
});
|
|
36
36
|
Object.defineProperty(exports, "SkeletonShine", {
|
|
37
37
|
enumerable: true,
|
|
38
|
-
get: function () { return
|
|
38
|
+
get: function () { return chunkVVLY6QPI_js.SkeletonShine; }
|
|
39
39
|
});
|
|
40
40
|
Object.defineProperty(exports, "TokenListElement", {
|
|
41
41
|
enumerable: true,
|
|
42
|
-
get: function () { return
|
|
42
|
+
get: function () { return chunkVVLY6QPI_js.TokenListElement; }
|
|
43
43
|
});
|
|
44
44
|
Object.defineProperty(exports, "TransactionHistoryElement", {
|
|
45
45
|
enumerable: true,
|
|
46
|
-
get: function () { return
|
|
46
|
+
get: function () { return chunkVVLY6QPI_js.TransactionHistoryElement; }
|
|
47
47
|
});
|
|
48
48
|
Object.defineProperty(exports, "UnifiedProvider", {
|
|
49
49
|
enumerable: true,
|
|
50
|
-
get: function () { return
|
|
50
|
+
get: function () { return chunkVVLY6QPI_js.UnifiedProvider; }
|
|
51
51
|
});
|
|
52
52
|
Object.defineProperty(exports, "WalletConnectProvider", {
|
|
53
53
|
enumerable: true,
|
|
54
|
-
get: function () { return
|
|
54
|
+
get: function () { return chunkVVLY6QPI_js.WalletConnectProvider; }
|
|
55
55
|
});
|
|
56
56
|
Object.defineProperty(exports, "WalletListElement", {
|
|
57
57
|
enumerable: true,
|
|
58
|
-
get: function () { return
|
|
58
|
+
get: function () { return chunkVVLY6QPI_js.WalletListElement; }
|
|
59
59
|
});
|
|
60
60
|
Object.defineProperty(exports, "clearSharedQueryCache", {
|
|
61
61
|
enumerable: true,
|
|
62
|
-
get: function () { return
|
|
62
|
+
get: function () { return chunkVVLY6QPI_js.clearSharedQueryCache; }
|
|
63
63
|
});
|
|
64
64
|
Object.defineProperty(exports, "clearTokenCaches", {
|
|
65
65
|
enumerable: true,
|
|
66
|
-
get: function () { return
|
|
66
|
+
get: function () { return chunkVVLY6QPI_js.clearTokenCaches; }
|
|
67
67
|
});
|
|
68
68
|
Object.defineProperty(exports, "getBalanceQueryKey", {
|
|
69
69
|
enumerable: true,
|
|
70
|
-
get: function () { return
|
|
70
|
+
get: function () { return chunkVVLY6QPI_js.getBalanceQueryKey; }
|
|
71
71
|
});
|
|
72
72
|
Object.defineProperty(exports, "getTokensQueryKey", {
|
|
73
73
|
enumerable: true,
|
|
74
|
-
get: function () { return
|
|
74
|
+
get: function () { return chunkVVLY6QPI_js.getTokensQueryKey; }
|
|
75
75
|
});
|
|
76
76
|
Object.defineProperty(exports, "getTransactionsQueryKey", {
|
|
77
77
|
enumerable: true,
|
|
78
|
-
get: function () { return
|
|
78
|
+
get: function () { return chunkVVLY6QPI_js.getTransactionsQueryKey; }
|
|
79
79
|
});
|
|
80
80
|
Object.defineProperty(exports, "getWalletAssetsQueryKey", {
|
|
81
81
|
enumerable: true,
|
|
82
|
-
get: function () { return
|
|
82
|
+
get: function () { return chunkVVLY6QPI_js.getWalletAssetsQueryKey; }
|
|
83
83
|
});
|
|
84
84
|
Object.defineProperty(exports, "invalidateSharedQuery", {
|
|
85
85
|
enumerable: true,
|
|
86
|
-
get: function () { return
|
|
86
|
+
get: function () { return chunkVVLY6QPI_js.invalidateSharedQuery; }
|
|
87
87
|
});
|
|
88
88
|
Object.defineProperty(exports, "useAccount", {
|
|
89
89
|
enumerable: true,
|
|
90
|
-
get: function () { return
|
|
90
|
+
get: function () { return chunkVVLY6QPI_js.useAccount; }
|
|
91
91
|
});
|
|
92
92
|
Object.defineProperty(exports, "useBalance", {
|
|
93
93
|
enumerable: true,
|
|
94
|
-
get: function () { return
|
|
94
|
+
get: function () { return chunkVVLY6QPI_js.useBalance; }
|
|
95
95
|
});
|
|
96
96
|
Object.defineProperty(exports, "useCluster", {
|
|
97
97
|
enumerable: true,
|
|
98
|
-
get: function () { return
|
|
98
|
+
get: function () { return chunkVVLY6QPI_js.useCluster; }
|
|
99
99
|
});
|
|
100
100
|
Object.defineProperty(exports, "useConnectWallet", {
|
|
101
101
|
enumerable: true,
|
|
102
|
-
get: function () { return
|
|
102
|
+
get: function () { return chunkVVLY6QPI_js.useConnectWallet; }
|
|
103
103
|
});
|
|
104
104
|
Object.defineProperty(exports, "useConnector", {
|
|
105
105
|
enumerable: true,
|
|
106
|
-
get: function () { return
|
|
106
|
+
get: function () { return chunkVVLY6QPI_js.useConnector; }
|
|
107
107
|
});
|
|
108
108
|
Object.defineProperty(exports, "useConnectorClient", {
|
|
109
109
|
enumerable: true,
|
|
110
|
-
get: function () { return
|
|
110
|
+
get: function () { return chunkVVLY6QPI_js.useConnectorClient; }
|
|
111
111
|
});
|
|
112
112
|
Object.defineProperty(exports, "useDisconnectWallet", {
|
|
113
113
|
enumerable: true,
|
|
114
|
-
get: function () { return
|
|
114
|
+
get: function () { return chunkVVLY6QPI_js.useDisconnectWallet; }
|
|
115
115
|
});
|
|
116
116
|
Object.defineProperty(exports, "useGillSolanaClient", {
|
|
117
117
|
enumerable: true,
|
|
118
|
-
get: function () { return
|
|
118
|
+
get: function () { return chunkVVLY6QPI_js.useGillSolanaClient; }
|
|
119
119
|
});
|
|
120
120
|
Object.defineProperty(exports, "useGillTransactionSigner", {
|
|
121
121
|
enumerable: true,
|
|
122
|
-
get: function () { return
|
|
122
|
+
get: function () { return chunkVVLY6QPI_js.useGillTransactionSigner; }
|
|
123
123
|
});
|
|
124
124
|
Object.defineProperty(exports, "useKitTransactionSigner", {
|
|
125
125
|
enumerable: true,
|
|
126
|
-
get: function () { return
|
|
126
|
+
get: function () { return chunkVVLY6QPI_js.useKitTransactionSigner; }
|
|
127
127
|
});
|
|
128
128
|
Object.defineProperty(exports, "useSolanaClient", {
|
|
129
129
|
enumerable: true,
|
|
130
|
-
get: function () { return
|
|
130
|
+
get: function () { return chunkVVLY6QPI_js.useSolanaClient; }
|
|
131
131
|
});
|
|
132
132
|
Object.defineProperty(exports, "useTokens", {
|
|
133
133
|
enumerable: true,
|
|
134
|
-
get: function () { return
|
|
134
|
+
get: function () { return chunkVVLY6QPI_js.useTokens; }
|
|
135
135
|
});
|
|
136
136
|
Object.defineProperty(exports, "useTransactionPreparer", {
|
|
137
137
|
enumerable: true,
|
|
138
|
-
get: function () { return
|
|
138
|
+
get: function () { return chunkVVLY6QPI_js.useTransactionPreparer; }
|
|
139
139
|
});
|
|
140
140
|
Object.defineProperty(exports, "useTransactionSigner", {
|
|
141
141
|
enumerable: true,
|
|
142
|
-
get: function () { return
|
|
142
|
+
get: function () { return chunkVVLY6QPI_js.useTransactionSigner; }
|
|
143
143
|
});
|
|
144
144
|
Object.defineProperty(exports, "useTransactions", {
|
|
145
145
|
enumerable: true,
|
|
146
|
-
get: function () { return
|
|
146
|
+
get: function () { return chunkVVLY6QPI_js.useTransactions; }
|
|
147
147
|
});
|
|
148
148
|
Object.defineProperty(exports, "useWallet", {
|
|
149
149
|
enumerable: true,
|
|
150
|
-
get: function () { return
|
|
150
|
+
get: function () { return chunkVVLY6QPI_js.useWallet; }
|
|
151
151
|
});
|
|
152
152
|
Object.defineProperty(exports, "useWalletConnectUri", {
|
|
153
153
|
enumerable: true,
|
|
154
|
-
get: function () { return
|
|
154
|
+
get: function () { return chunkVVLY6QPI_js.useWalletConnectUri; }
|
|
155
155
|
});
|
|
156
156
|
Object.defineProperty(exports, "useWalletConnectors", {
|
|
157
157
|
enumerable: true,
|
|
158
|
-
get: function () { return
|
|
158
|
+
get: function () { return chunkVVLY6QPI_js.useWalletConnectors; }
|
|
159
159
|
});
|
|
160
160
|
Object.defineProperty(exports, "useWalletInfo", {
|
|
161
161
|
enumerable: true,
|
|
162
|
-
get: function () { return
|
|
162
|
+
get: function () { return chunkVVLY6QPI_js.useWalletInfo; }
|
|
163
163
|
});
|
|
164
164
|
Object.defineProperty(exports, "withErrorBoundary", {
|
|
165
165
|
enumerable: true,
|
|
166
|
-
get: function () { return
|
|
166
|
+
get: function () { return chunkVVLY6QPI_js.withErrorBoundary; }
|
|
167
167
|
});
|
|
168
168
|
Object.defineProperty(exports, "createConnectorId", {
|
|
169
169
|
enumerable: true,
|
|
170
|
-
get: function () { return
|
|
170
|
+
get: function () { return chunkTRSJSU33_js.createConnectorId; }
|
|
171
171
|
});
|
|
172
172
|
Object.defineProperty(exports, "getDefaultConfig", {
|
|
173
173
|
enumerable: true,
|
|
174
|
-
get: function () { return
|
|
174
|
+
get: function () { return chunkTRSJSU33_js.getDefaultConfig; }
|
|
175
175
|
});
|
|
176
176
|
Object.defineProperty(exports, "getDefaultMobileConfig", {
|
|
177
177
|
enumerable: true,
|
|
178
|
-
get: function () { return
|
|
178
|
+
get: function () { return chunkTRSJSU33_js.getDefaultMobileConfig; }
|
|
179
179
|
});
|
|
180
180
|
Object.defineProperty(exports, "isConnected", {
|
|
181
181
|
enumerable: true,
|
|
182
|
-
get: function () { return
|
|
182
|
+
get: function () { return chunkTRSJSU33_js.isConnected; }
|
|
183
183
|
});
|
|
184
184
|
Object.defineProperty(exports, "isConnecting", {
|
|
185
185
|
enumerable: true,
|
|
186
|
-
get: function () { return
|
|
186
|
+
get: function () { return chunkTRSJSU33_js.isConnecting; }
|
|
187
187
|
});
|
|
188
188
|
Object.defineProperty(exports, "isDisconnected", {
|
|
189
189
|
enumerable: true,
|
|
190
|
-
get: function () { return
|
|
190
|
+
get: function () { return chunkTRSJSU33_js.isDisconnected; }
|
|
191
191
|
});
|
|
192
192
|
Object.defineProperty(exports, "isWalletConnectorId", {
|
|
193
193
|
enumerable: true,
|
|
194
|
-
get: function () { return
|
|
194
|
+
get: function () { return chunkTRSJSU33_js.isWalletConnectorId; }
|
|
195
195
|
});
|
|
196
196
|
//# sourceMappingURL=react.js.map
|
|
197
197
|
//# sourceMappingURL=react.js.map
|
package/dist/react.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { AccountElement, AppProvider, BalanceElement, ClusterElement, ConnectorErrorBoundary, ConnectorProvider, DisconnectElement, SkeletonShine, TokenListElement, TransactionHistoryElement, UnifiedProvider, WalletConnectProvider, WalletListElement, clearSharedQueryCache, clearTokenCaches, getBalanceQueryKey, getTokensQueryKey, getTransactionsQueryKey, getWalletAssetsQueryKey, invalidateSharedQuery, useAccount, useBalance, useCluster, useConnectWallet, useConnector, useConnectorClient, useDisconnectWallet, useGillSolanaClient, useGillTransactionSigner, useKitTransactionSigner, useSolanaClient, useTokens, useTransactionPreparer, useTransactionSigner, useTransactions, useWallet, useWalletConnectUri, useWalletConnectors, useWalletInfo, withErrorBoundary } from './chunk-
|
|
2
|
-
export { createConnectorId, getDefaultConfig, getDefaultMobileConfig, isConnected, isConnecting, isDisconnected, isWalletConnectorId } from './chunk-
|
|
1
|
+
export { AccountElement, AppProvider, BalanceElement, ClusterElement, ConnectorErrorBoundary, ConnectorProvider, DisconnectElement, SkeletonShine, TokenListElement, TransactionHistoryElement, UnifiedProvider, WalletConnectProvider, WalletListElement, clearSharedQueryCache, clearTokenCaches, getBalanceQueryKey, getTokensQueryKey, getTransactionsQueryKey, getWalletAssetsQueryKey, invalidateSharedQuery, useAccount, useBalance, useCluster, useConnectWallet, useConnector, useConnectorClient, useDisconnectWallet, useGillSolanaClient, useGillTransactionSigner, useKitTransactionSigner, useSolanaClient, useTokens, useTransactionPreparer, useTransactionSigner, useTransactions, useWallet, useWalletConnectUri, useWalletConnectors, useWalletInfo, withErrorBoundary } from './chunk-DFHJYZKZ.mjs';
|
|
2
|
+
export { createConnectorId, getDefaultConfig, getDefaultMobileConfig, isConnected, isConnecting, isDisconnected, isWalletConnectorId } from './chunk-SQ2JEA2M.mjs';
|
|
3
3
|
//# sourceMappingURL=react.mjs.map
|
|
4
4
|
//# sourceMappingURL=react.mjs.map
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Wallet } from '@wallet-standard/base';
|
|
2
|
+
import { R as RemoteWalletConfig } from './protocol-G-z1lRqo.mjs';
|
|
3
|
+
export { b as RemoteSignerCapabilities, l as RemoteSignerErrorCode, k as RemoteSignerErrorResponse, a as RemoteSignerMetadata, c as RemoteSignerRequest, d as SignAllTransactionsRequest, h as SignAllTransactionsResponse, f as SignAndSendTransactionRequest, j as SignAndSendTransactionResponse, e as SignMessageRequest, i as SignMessageResponse, S as SignTransactionRequest, g as SignTransactionResponse, n as decodeBase64, m as encodeBase64, o as isErrorResponse } from './protocol-G-z1lRqo.mjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @solana/connector/remote - Remote Wallet Standard Adapter
|
|
7
|
+
*
|
|
8
|
+
* Creates a Wallet Standard compatible wallet that delegates signing
|
|
9
|
+
* operations to a remote signer API endpoint.
|
|
10
|
+
*
|
|
11
|
+
* This keeps the browser bundle lean - no signing SDKs needed client-side.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Error thrown by remote wallet operations
|
|
16
|
+
*/
|
|
17
|
+
declare class RemoteWalletError extends Error {
|
|
18
|
+
code: string;
|
|
19
|
+
details?: unknown | undefined;
|
|
20
|
+
constructor(message: string, code: string, details?: unknown | undefined);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create a Wallet Standard compatible wallet that delegates to a remote signer API
|
|
24
|
+
*
|
|
25
|
+
* @param config - Configuration for the remote wallet
|
|
26
|
+
* @returns A Wallet Standard wallet object
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* import { createRemoteSignerWallet } from '@solana/connector/remote';
|
|
31
|
+
*
|
|
32
|
+
* const remoteWallet = createRemoteSignerWallet({
|
|
33
|
+
* endpoint: '/api/connector-signer',
|
|
34
|
+
* name: 'Treasury Signer',
|
|
35
|
+
* getAuthHeaders: () => ({
|
|
36
|
+
* 'Authorization': `Bearer ${getSessionToken()}`
|
|
37
|
+
* })
|
|
38
|
+
* });
|
|
39
|
+
*
|
|
40
|
+
* // Pass to Connector
|
|
41
|
+
* <ConnectorProvider config={{ additionalWallets: [remoteWallet] }}>
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
declare function createRemoteSignerWallet(config: RemoteWalletConfig): Wallet;
|
|
45
|
+
|
|
46
|
+
export { RemoteWalletConfig, RemoteWalletError, createRemoteSignerWallet };
|
package/dist/remote.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Wallet } from '@wallet-standard/base';
|
|
2
|
+
import { R as RemoteWalletConfig } from './protocol-G-z1lRqo.js';
|
|
3
|
+
export { b as RemoteSignerCapabilities, l as RemoteSignerErrorCode, k as RemoteSignerErrorResponse, a as RemoteSignerMetadata, c as RemoteSignerRequest, d as SignAllTransactionsRequest, h as SignAllTransactionsResponse, f as SignAndSendTransactionRequest, j as SignAndSendTransactionResponse, e as SignMessageRequest, i as SignMessageResponse, S as SignTransactionRequest, g as SignTransactionResponse, n as decodeBase64, m as encodeBase64, o as isErrorResponse } from './protocol-G-z1lRqo.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @solana/connector/remote - Remote Wallet Standard Adapter
|
|
7
|
+
*
|
|
8
|
+
* Creates a Wallet Standard compatible wallet that delegates signing
|
|
9
|
+
* operations to a remote signer API endpoint.
|
|
10
|
+
*
|
|
11
|
+
* This keeps the browser bundle lean - no signing SDKs needed client-side.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Error thrown by remote wallet operations
|
|
16
|
+
*/
|
|
17
|
+
declare class RemoteWalletError extends Error {
|
|
18
|
+
code: string;
|
|
19
|
+
details?: unknown | undefined;
|
|
20
|
+
constructor(message: string, code: string, details?: unknown | undefined);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create a Wallet Standard compatible wallet that delegates to a remote signer API
|
|
24
|
+
*
|
|
25
|
+
* @param config - Configuration for the remote wallet
|
|
26
|
+
* @returns A Wallet Standard wallet object
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* import { createRemoteSignerWallet } from '@solana/connector/remote';
|
|
31
|
+
*
|
|
32
|
+
* const remoteWallet = createRemoteSignerWallet({
|
|
33
|
+
* endpoint: '/api/connector-signer',
|
|
34
|
+
* name: 'Treasury Signer',
|
|
35
|
+
* getAuthHeaders: () => ({
|
|
36
|
+
* 'Authorization': `Bearer ${getSessionToken()}`
|
|
37
|
+
* })
|
|
38
|
+
* });
|
|
39
|
+
*
|
|
40
|
+
* // Pass to Connector
|
|
41
|
+
* <ConnectorProvider config={{ additionalWallets: [remoteWallet] }}>
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
declare function createRemoteSignerWallet(config: RemoteWalletConfig): Wallet;
|
|
45
|
+
|
|
46
|
+
export { RemoteWalletConfig, RemoteWalletError, createRemoteSignerWallet };
|
package/dist/remote.js
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkQST7XLMB_js = require('./chunk-QST7XLMB.js');
|
|
4
|
+
|
|
5
|
+
// src/remote/remote-wallet.ts
|
|
6
|
+
var DEFAULT_ICON = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAzMCAyOC4zMzE5IiBmaWxsPSJjdXJyZW50Q29sb3IiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGc+PHJlY3QgaGVpZ2h0PSIyNS4wODU1IiBvcGFjaXR5PSIwIiB3aWR0aD0iMjYuNTYyNSIgeD0iMCIgeT0iMCIvPjxwYXRoIGQ9Ik0xNy42NzgzIDE1LjEyNzdDMTcuNzc2MSAxNi41MzcgMTguNTE0NyAxNy43NzA5IDE5LjY1ODIgMTguNTI0MkwxOS42NTgyIDIxLjMxNjlDMTkuNjU1MSAyMS4zMTcxIDE5LjY1MTggMjEuMzE3MSAxOS42NDg0IDIxLjMxNzFMNi41NTI3MyAyMS4zMTcxQzUuNTA3ODEgMjEuMzE3MSA0Ljg4MjgxIDIwLjgyODkgNC44ODI4MSAyMC4wMTgzQzQuODgyODEgMTcuNDk4OCA4LjAzNzExIDE0LjAyMjIgMTMuMDk1NyAxNC4wMjIyQzE0Ljg4MDkgMTQuMDIyMiAxNi40Mjg2IDE0LjQ1MzUgMTcuNjc4MyAxNS4xMjc3Wk0xNy4wMTE3IDcuOTU3NzdDMTcuMDExNyAxMC4zOTkyIDE1LjE5NTMgMTIuMjc0MiAxMy4xMDU1IDEyLjI3NDJDMTEuMDA1OSAxMi4yNzQyIDkuMTk5MjIgMTAuMzk5MiA5LjE5OTIyIDcuOTc3M0M5LjE5OTIyIDUuNTg0NzIgMTEuMDE1NiAzLjc1ODU1IDEzLjEwNTUgMy43NTg1NUMxNS4xOTUzIDMuNzU4NTUgMTcuMDExNyA1LjU0NTY2IDE3LjAxMTcgNy45NTc3N1oiIGZpbGwtb3BhY2l0eT0iMC44NSIvPjxwYXRoIGQ9Ik0yMi4xMTkxIDExLjY5OEMyMC4zODA5IDExLjY5OCAxOS4wMDM5IDEzLjA5NDUgMTkuMDAzOSAxNC44MDM1QzE5LjAwMzkgMTYuMTMxNiAxOS43ODUyIDE3LjI1NDYgMjAuOTg2MyAxNy43MjM0TDIwLjk4NjMgMjIuNTU3NEMyMC45ODYzIDIyLjY3NDYgMjEuMDQ0OSAyMi43NjI1IDIxLjEyMyAyMi44NjAxTDIxLjk0MzQgMjMuNjgwNEMyMi4wNDEgMjMuNzc4MSAyMi4xNzc3IDIzLjc4NzggMjIuMjg1MiAyMy42ODA0TDIzLjgzNzkgMjIuMTM3NUMyMy45MzU1IDIyLjAzIDIzLjkzNTUgMjEuODkzMyAyMy44Mzc5IDIxLjc5NTdMMjIuODcxMSAyMC44Mjg5TDI0LjIwOSAxOS41MjAzQzI0LjMwNjYgMTkuNDMyNCAyNC4zMDY2IDE5LjI4NTkgMjQuMTg5NSAxOS4xNjg3TDIyLjg4MDkgMTcuODY5OUMyNC4zODQ4IDE3LjI1NDYgMjUuMjI0NiAxNi4xNjA5IDI1LjIyNDYgMTQuODAzNUMyNS4yMjQ2IDEzLjA5NDUgMjMuODM3OSAxMS42OTggMjIuMTE5MSAxMS42OThaTTIyLjEwOTQgMTMuMTUzMUMyMi42MzY3IDEzLjE1MzEgMjMuMDY2NCAxMy41ODI4IDIzLjA2NjQgMTQuMTEwMUMyMy4wNjY0IDE0LjY1NyAyMi42MzY3IDE1LjA4NjcgMjIuMTA5NCAxNS4wODY3QzIxLjU4MiAxNS4wODY3IDIxLjE0MjYgMTQuNjU3IDIxLjE0MjYgMTQuMTEwMUMyMS4xNDI2IDEzLjU4MjggMjEuNTcyMyAxMy4xNTMxIDIyLjEwOTQgMTMuMTUzMVoiIGZpbGwtb3BhY2l0eT0iMC44NSIvPjwvZz48L3N2Zz4=", DEFAULT_CHAINS = ["solana:mainnet", "solana:devnet"], RemoteWalletError = class extends Error {
|
|
7
|
+
constructor(message, code, details) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.code = code;
|
|
10
|
+
this.details = details;
|
|
11
|
+
this.name = "RemoteWalletError";
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
function createRemoteSignerWallet(config) {
|
|
15
|
+
let { endpoint, name, icon = DEFAULT_ICON, chains = DEFAULT_CHAINS, getAuthHeaders } = config, connected = false, metadata = null, accounts = [], eventListeners = /* @__PURE__ */ new Map();
|
|
16
|
+
async function request(method, body) {
|
|
17
|
+
let headers = {
|
|
18
|
+
"Content-Type": "application/json"
|
|
19
|
+
};
|
|
20
|
+
if (getAuthHeaders) {
|
|
21
|
+
let authHeaders = await getAuthHeaders();
|
|
22
|
+
Object.assign(headers, authHeaders);
|
|
23
|
+
}
|
|
24
|
+
let response = await fetch(endpoint, {
|
|
25
|
+
method,
|
|
26
|
+
headers,
|
|
27
|
+
body: body ? JSON.stringify(body) : void 0
|
|
28
|
+
}), data = await response.json();
|
|
29
|
+
if (!response.ok || chunkQST7XLMB_js.isErrorResponse(data)) {
|
|
30
|
+
let errorData = chunkQST7XLMB_js.isErrorResponse(data) ? data.error : { code: "UNKNOWN", message: "Request failed", details: void 0 };
|
|
31
|
+
throw new RemoteWalletError(errorData.message, errorData.code, errorData.details);
|
|
32
|
+
}
|
|
33
|
+
return data;
|
|
34
|
+
}
|
|
35
|
+
function emit(event, ...args) {
|
|
36
|
+
let listeners = eventListeners.get(event);
|
|
37
|
+
if (listeners)
|
|
38
|
+
for (let listener of listeners)
|
|
39
|
+
try {
|
|
40
|
+
listener(...args);
|
|
41
|
+
} catch {
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
let wallet = {
|
|
45
|
+
version: "1.0.0",
|
|
46
|
+
name,
|
|
47
|
+
icon,
|
|
48
|
+
chains,
|
|
49
|
+
features: {
|
|
50
|
+
// Standard connect
|
|
51
|
+
"standard:connect": {
|
|
52
|
+
version: "1.0.0",
|
|
53
|
+
connect: async () => connected && accounts.length > 0 ? { accounts } : (metadata = await request("GET"), accounts = [{
|
|
54
|
+
address: metadata.address,
|
|
55
|
+
publicKey: new Uint8Array(32),
|
|
56
|
+
// Placeholder - not needed for signing
|
|
57
|
+
chains: metadata.chains || chains,
|
|
58
|
+
features: [
|
|
59
|
+
"solana:signTransaction",
|
|
60
|
+
...metadata.capabilities.signAllTransactions ? ["solana:signAllTransactions"] : [],
|
|
61
|
+
...metadata.capabilities.signMessage ? ["solana:signMessage"] : [],
|
|
62
|
+
...metadata.capabilities.signAndSendTransaction ? ["solana:signAndSendTransaction"] : []
|
|
63
|
+
]
|
|
64
|
+
}], connected = true, emit("change", { accounts }), { accounts })
|
|
65
|
+
},
|
|
66
|
+
// Standard disconnect
|
|
67
|
+
"standard:disconnect": {
|
|
68
|
+
version: "1.0.0",
|
|
69
|
+
disconnect: async () => {
|
|
70
|
+
connected = false, accounts = [], metadata = null, emit("change", { accounts: [] });
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
// Standard events
|
|
74
|
+
"standard:events": {
|
|
75
|
+
version: "1.0.0",
|
|
76
|
+
on: (event, listener) => {
|
|
77
|
+
let listeners = eventListeners.get(event);
|
|
78
|
+
return listeners || (listeners = /* @__PURE__ */ new Set(), eventListeners.set(event, listeners)), listeners.add(listener), () => {
|
|
79
|
+
listeners?.delete(listener), listeners?.size === 0 && eventListeners.delete(event);
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
// Solana sign transaction
|
|
84
|
+
"solana:signTransaction": {
|
|
85
|
+
version: "1.0.0",
|
|
86
|
+
supportedTransactionVersions: ["legacy", 0],
|
|
87
|
+
signTransaction: async (...inputs) => {
|
|
88
|
+
if (!connected)
|
|
89
|
+
throw new RemoteWalletError("Wallet not connected", "NOT_CONNECTED");
|
|
90
|
+
let results = [];
|
|
91
|
+
for (let input of inputs) {
|
|
92
|
+
let txBytes = input.transaction, req = {
|
|
93
|
+
operation: "signTransaction",
|
|
94
|
+
transaction: chunkQST7XLMB_js.encodeBase64(txBytes)
|
|
95
|
+
}, response = await request("POST", req);
|
|
96
|
+
results.push({
|
|
97
|
+
signedTransaction: chunkQST7XLMB_js.decodeBase64(response.signedTransaction)
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return results;
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
// Solana sign all transactions (batch)
|
|
104
|
+
"solana:signAllTransactions": {
|
|
105
|
+
version: "1.0.0",
|
|
106
|
+
supportedTransactionVersions: ["legacy", 0],
|
|
107
|
+
signAllTransactions: async (...inputs) => {
|
|
108
|
+
if (!connected)
|
|
109
|
+
throw new RemoteWalletError("Wallet not connected", "NOT_CONNECTED");
|
|
110
|
+
let allTxBytes = [];
|
|
111
|
+
for (let input of inputs)
|
|
112
|
+
allTxBytes.push(input.transaction);
|
|
113
|
+
let req = {
|
|
114
|
+
operation: "signAllTransactions",
|
|
115
|
+
transactions: allTxBytes.map((tx) => chunkQST7XLMB_js.encodeBase64(tx))
|
|
116
|
+
};
|
|
117
|
+
return (await request("POST", req)).signedTransactions.map((signedTx) => ({
|
|
118
|
+
signedTransaction: chunkQST7XLMB_js.decodeBase64(signedTx)
|
|
119
|
+
}));
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
// Solana sign message
|
|
123
|
+
"solana:signMessage": {
|
|
124
|
+
version: "1.0.0",
|
|
125
|
+
signMessage: async (...inputs) => {
|
|
126
|
+
if (!connected)
|
|
127
|
+
throw new RemoteWalletError("Wallet not connected", "NOT_CONNECTED");
|
|
128
|
+
let results = [];
|
|
129
|
+
for (let input of inputs) {
|
|
130
|
+
let req = {
|
|
131
|
+
operation: "signMessage",
|
|
132
|
+
message: chunkQST7XLMB_js.encodeBase64(input.message)
|
|
133
|
+
}, response = await request("POST", req);
|
|
134
|
+
results.push({
|
|
135
|
+
signedMessage: input.message,
|
|
136
|
+
signature: chunkQST7XLMB_js.decodeBase64(response.signature)
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
return results;
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
// Solana sign and send transaction (optional)
|
|
143
|
+
"solana:signAndSendTransaction": {
|
|
144
|
+
version: "1.0.0",
|
|
145
|
+
supportedTransactionVersions: ["legacy", 0],
|
|
146
|
+
signAndSendTransaction: async (...inputs) => {
|
|
147
|
+
if (!connected)
|
|
148
|
+
throw new RemoteWalletError("Wallet not connected", "NOT_CONNECTED");
|
|
149
|
+
if (metadata && !metadata.capabilities.signAndSendTransaction)
|
|
150
|
+
throw new RemoteWalletError(
|
|
151
|
+
"Server does not support signAndSendTransaction",
|
|
152
|
+
"UNSUPPORTED_OPERATION"
|
|
153
|
+
);
|
|
154
|
+
let results = [];
|
|
155
|
+
for (let input of inputs) {
|
|
156
|
+
let req = {
|
|
157
|
+
operation: "signAndSendTransaction",
|
|
158
|
+
transaction: chunkQST7XLMB_js.encodeBase64(input.transaction),
|
|
159
|
+
options: input.options
|
|
160
|
+
}, response = await request("POST", req), sigBytes = base58ToBytes(response.signature);
|
|
161
|
+
results.push({ signature: sigBytes });
|
|
162
|
+
}
|
|
163
|
+
return results;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
accounts: []
|
|
168
|
+
};
|
|
169
|
+
return Object.defineProperty(wallet, "accounts", {
|
|
170
|
+
get: () => accounts,
|
|
171
|
+
enumerable: true
|
|
172
|
+
}), wallet;
|
|
173
|
+
}
|
|
174
|
+
function base58ToBytes(base58) {
|
|
175
|
+
let ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", ALPHABET_MAP = /* @__PURE__ */ new Map();
|
|
176
|
+
for (let i = 0; i < ALPHABET.length; i++)
|
|
177
|
+
ALPHABET_MAP.set(ALPHABET[i], i);
|
|
178
|
+
let bytes = [0];
|
|
179
|
+
for (let char of base58) {
|
|
180
|
+
let value = ALPHABET_MAP.get(char);
|
|
181
|
+
if (value === void 0)
|
|
182
|
+
throw new Error(`Invalid base58 character: ${char}`);
|
|
183
|
+
let carry = value;
|
|
184
|
+
for (let i = 0; i < bytes.length; i++)
|
|
185
|
+
carry += bytes[i] * 58, bytes[i] = carry & 255, carry >>= 8;
|
|
186
|
+
for (; carry > 0; )
|
|
187
|
+
bytes.push(carry & 255), carry >>= 8;
|
|
188
|
+
}
|
|
189
|
+
for (let char of base58)
|
|
190
|
+
if (char === "1")
|
|
191
|
+
bytes.push(0);
|
|
192
|
+
else
|
|
193
|
+
break;
|
|
194
|
+
return new Uint8Array(bytes.reverse());
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
Object.defineProperty(exports, "decodeBase64", {
|
|
198
|
+
enumerable: true,
|
|
199
|
+
get: function () { return chunkQST7XLMB_js.decodeBase64; }
|
|
200
|
+
});
|
|
201
|
+
Object.defineProperty(exports, "encodeBase64", {
|
|
202
|
+
enumerable: true,
|
|
203
|
+
get: function () { return chunkQST7XLMB_js.encodeBase64; }
|
|
204
|
+
});
|
|
205
|
+
Object.defineProperty(exports, "isErrorResponse", {
|
|
206
|
+
enumerable: true,
|
|
207
|
+
get: function () { return chunkQST7XLMB_js.isErrorResponse; }
|
|
208
|
+
});
|
|
209
|
+
exports.RemoteWalletError = RemoteWalletError;
|
|
210
|
+
exports.createRemoteSignerWallet = createRemoteSignerWallet;
|
|
211
|
+
//# sourceMappingURL=remote.js.map
|
|
212
|
+
//# sourceMappingURL=remote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/remote/remote-wallet.ts"],"names":["isErrorResponse","encodeBase64","decodeBase64"],"mappings":"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","file":"remote.js","sourcesContent":["/**\n * @solana/connector/remote - Remote Wallet Standard Adapter\n *\n * Creates a Wallet Standard compatible wallet that delegates signing\n * operations to a remote signer API endpoint.\n *\n * This keeps the browser bundle lean - no signing SDKs needed client-side.\n */\n\nimport type { Wallet, WalletAccount } from '@wallet-standard/base';\nimport type {\n StandardConnectFeature,\n StandardDisconnectFeature,\n StandardEventsFeature,\n StandardEventsListeners,\n StandardEventsNames,\n} from '@wallet-standard/features';\nimport type {\n RemoteWalletConfig,\n RemoteSignerMetadata,\n SignTransactionRequest,\n SignAllTransactionsRequest,\n SignMessageRequest,\n SignAndSendTransactionRequest,\n SignTransactionResponse,\n SignAllTransactionsResponse,\n SignMessageResponse,\n SignAndSendTransactionResponse,\n} from './protocol';\nimport { encodeBase64, decodeBase64, isErrorResponse } from './protocol';\n\n// Default icon for remote wallets (data URI)\nconst DEFAULT_ICON =\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAzMCAyOC4zMzE5IiBmaWxsPSJjdXJyZW50Q29sb3IiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGc+PHJlY3QgaGVpZ2h0PSIyNS4wODU1IiBvcGFjaXR5PSIwIiB3aWR0aD0iMjYuNTYyNSIgeD0iMCIgeT0iMCIvPjxwYXRoIGQ9Ik0xNy42NzgzIDE1LjEyNzdDMTcuNzc2MSAxNi41MzcgMTguNTE0NyAxNy43NzA5IDE5LjY1ODIgMTguNTI0MkwxOS42NTgyIDIxLjMxNjlDMTkuNjU1MSAyMS4zMTcxIDE5LjY1MTggMjEuMzE3MSAxOS42NDg0IDIxLjMxNzFMNi41NTI3MyAyMS4zMTcxQzUuNTA3ODEgMjEuMzE3MSA0Ljg4MjgxIDIwLjgyODkgNC44ODI4MSAyMC4wMTgzQzQuODgyODEgMTcuNDk4OCA4LjAzNzExIDE0LjAyMjIgMTMuMDk1NyAxNC4wMjIyQzE0Ljg4MDkgMTQuMDIyMiAxNi40Mjg2IDE0LjQ1MzUgMTcuNjc4MyAxNS4xMjc3Wk0xNy4wMTE3IDcuOTU3NzdDMTcuMDExNyAxMC4zOTkyIDE1LjE5NTMgMTIuMjc0MiAxMy4xMDU1IDEyLjI3NDJDMTEuMDA1OSAxMi4yNzQyIDkuMTk5MjIgMTAuMzk5MiA5LjE5OTIyIDcuOTc3M0M5LjE5OTIyIDUuNTg0NzIgMTEuMDE1NiAzLjc1ODU1IDEzLjEwNTUgMy43NTg1NUMxNS4xOTUzIDMuNzU4NTUgMTcuMDExNyA1LjU0NTY2IDE3LjAxMTcgNy45NTc3N1oiIGZpbGwtb3BhY2l0eT0iMC44NSIvPjxwYXRoIGQ9Ik0yMi4xMTkxIDExLjY5OEMyMC4zODA5IDExLjY5OCAxOS4wMDM5IDEzLjA5NDUgMTkuMDAzOSAxNC44MDM1QzE5LjAwMzkgMTYuMTMxNiAxOS43ODUyIDE3LjI1NDYgMjAuOTg2MyAxNy43MjM0TDIwLjk4NjMgMjIuNTU3NEMyMC45ODYzIDIyLjY3NDYgMjEuMDQ0OSAyMi43NjI1IDIxLjEyMyAyMi44NjAxTDIxLjk0MzQgMjMuNjgwNEMyMi4wNDEgMjMuNzc4MSAyMi4xNzc3IDIzLjc4NzggMjIuMjg1MiAyMy42ODA0TDIzLjgzNzkgMjIuMTM3NUMyMy45MzU1IDIyLjAzIDIzLjkzNTUgMjEuODkzMyAyMy44Mzc5IDIxLjc5NTdMMjIuODcxMSAyMC44Mjg5TDI0LjIwOSAxOS41MjAzQzI0LjMwNjYgMTkuNDMyNCAyNC4zMDY2IDE5LjI4NTkgMjQuMTg5NSAxOS4xNjg3TDIyLjg4MDkgMTcuODY5OUMyNC4zODQ4IDE3LjI1NDYgMjUuMjI0NiAxNi4xNjA5IDI1LjIyNDYgMTQuODAzNUMyNS4yMjQ2IDEzLjA5NDUgMjMuODM3OSAxMS42OTggMjIuMTE5MSAxMS42OThaTTIyLjEwOTQgMTMuMTUzMUMyMi42MzY3IDEzLjE1MzEgMjMuMDY2NCAxMy41ODI4IDIzLjA2NjQgMTQuMTEwMUMyMy4wNjY0IDE0LjY1NyAyMi42MzY3IDE1LjA4NjcgMjIuMTA5NCAxNS4wODY3QzIxLjU4MiAxNS4wODY3IDIxLjE0MjYgMTQuNjU3IDIxLjE0MjYgMTQuMTEwMUMyMS4xNDI2IDEzLjU4MjggMjEuNTcyMyAxMy4xNTMxIDIyLjEwOTQgMTMuMTUzMVoiIGZpbGwtb3BhY2l0eT0iMC44NSIvPjwvZz48L3N2Zz4=' as const;\n\n// Default chains if none specified\nconst DEFAULT_CHAINS: `solana:${string}`[] = ['solana:mainnet', 'solana:devnet'];\n\n// Types for Solana wallet standard features (inline to avoid dependency)\ninterface SignTransactionInput {\n transaction: Uint8Array;\n account?: WalletAccount;\n chain?: string;\n}\n\ninterface SignMessageInput {\n message: Uint8Array;\n account?: WalletAccount;\n}\n\ninterface SignAndSendTransactionInput {\n transaction: Uint8Array;\n account?: WalletAccount;\n chain?: string;\n options?: {\n skipPreflight?: boolean;\n maxRetries?: number;\n preflightCommitment?: 'processed' | 'confirmed' | 'finalized';\n };\n}\n\n/**\n * Error thrown by remote wallet operations\n */\nexport class RemoteWalletError extends Error {\n constructor(\n message: string,\n public code: string,\n public details?: unknown,\n ) {\n super(message);\n this.name = 'RemoteWalletError';\n }\n}\n\n/**\n * Create a Wallet Standard compatible wallet that delegates to a remote signer API\n *\n * @param config - Configuration for the remote wallet\n * @returns A Wallet Standard wallet object\n *\n * @example\n * ```typescript\n * import { createRemoteSignerWallet } from '@solana/connector/remote';\n *\n * const remoteWallet = createRemoteSignerWallet({\n * endpoint: '/api/connector-signer',\n * name: 'Treasury Signer',\n * getAuthHeaders: () => ({\n * 'Authorization': `Bearer ${getSessionToken()}`\n * })\n * });\n *\n * // Pass to Connector\n * <ConnectorProvider config={{ additionalWallets: [remoteWallet] }}>\n * ```\n */\nexport function createRemoteSignerWallet(config: RemoteWalletConfig): Wallet {\n const { endpoint, name, icon = DEFAULT_ICON, chains = DEFAULT_CHAINS, getAuthHeaders } = config;\n\n // Internal state\n let connected = false;\n let metadata: RemoteSignerMetadata | null = null;\n let accounts: WalletAccount[] = [];\n const eventListeners: Map<StandardEventsNames, Set<StandardEventsListeners[StandardEventsNames]>> = new Map();\n\n // Helper: make authenticated request\n async function request<T>(method: 'GET' | 'POST', body?: unknown): Promise<T> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (getAuthHeaders) {\n const authHeaders = await getAuthHeaders();\n Object.assign(headers, authHeaders);\n }\n\n const response = await fetch(endpoint, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n const data = await response.json();\n\n if (!response.ok || isErrorResponse(data)) {\n const errorData = isErrorResponse(data)\n ? data.error\n : { code: 'UNKNOWN', message: 'Request failed', details: undefined };\n throw new RemoteWalletError(errorData.message, errorData.code, errorData.details);\n }\n\n return data as T;\n }\n\n // Helper: emit event to listeners\n function emit<E extends StandardEventsNames>(event: E, ...args: Parameters<StandardEventsListeners[E]>) {\n const listeners = eventListeners.get(event);\n if (listeners) {\n for (const listener of listeners) {\n try {\n (listener as (...args: unknown[]) => void)(...args);\n } catch {\n // Ignore listener errors\n }\n }\n }\n }\n\n // Build features object\n const features: Wallet['features'] = {\n // Standard connect\n 'standard:connect': {\n version: '1.0.0',\n connect: async () => {\n if (connected && accounts.length > 0) {\n return { accounts };\n }\n\n // Fetch metadata from server\n metadata = await request<RemoteSignerMetadata>('GET');\n\n // Create account from metadata\n const account: WalletAccount = {\n address: metadata.address,\n publicKey: new Uint8Array(32), // Placeholder - not needed for signing\n chains: (metadata.chains || chains) as `${string}:${string}`[],\n features: [\n 'solana:signTransaction',\n ...(metadata.capabilities.signAllTransactions ? ['solana:signAllTransactions'] : []),\n ...(metadata.capabilities.signMessage ? ['solana:signMessage'] : []),\n ...(metadata.capabilities.signAndSendTransaction ? ['solana:signAndSendTransaction'] : []),\n ] as `${string}:${string}`[],\n };\n\n accounts = [account];\n connected = true;\n\n emit('change', { accounts });\n\n return { accounts };\n },\n } satisfies StandardConnectFeature['standard:connect'],\n\n // Standard disconnect\n 'standard:disconnect': {\n version: '1.0.0',\n disconnect: async () => {\n connected = false;\n accounts = [];\n metadata = null;\n emit('change', { accounts: [] });\n },\n } satisfies StandardDisconnectFeature['standard:disconnect'],\n\n // Standard events\n 'standard:events': {\n version: '1.0.0',\n on: <E extends StandardEventsNames>(event: E, listener: StandardEventsListeners[E]) => {\n let listeners = eventListeners.get(event);\n if (!listeners) {\n listeners = new Set();\n eventListeners.set(event, listeners);\n }\n listeners.add(listener);\n\n return () => {\n listeners?.delete(listener);\n if (listeners?.size === 0) {\n eventListeners.delete(event);\n }\n };\n },\n } satisfies StandardEventsFeature['standard:events'],\n\n // Solana sign transaction\n 'solana:signTransaction': {\n version: '1.0.0',\n supportedTransactionVersions: ['legacy', 0],\n signTransaction: async (...inputs: SignTransactionInput[]) => {\n if (!connected) {\n throw new RemoteWalletError('Wallet not connected', 'NOT_CONNECTED');\n }\n\n const results: { signedTransaction: Uint8Array }[] = [];\n\n for (const input of inputs) {\n const txBytes = input.transaction;\n const req: SignTransactionRequest = {\n operation: 'signTransaction',\n transaction: encodeBase64(txBytes),\n };\n\n const response = await request<SignTransactionResponse>('POST', req);\n results.push({\n signedTransaction: decodeBase64(response.signedTransaction),\n });\n }\n\n return results;\n },\n },\n\n // Solana sign all transactions (batch)\n 'solana:signAllTransactions': {\n version: '1.0.0',\n supportedTransactionVersions: ['legacy', 0],\n signAllTransactions: async (...inputs: SignTransactionInput[]) => {\n if (!connected) {\n throw new RemoteWalletError('Wallet not connected', 'NOT_CONNECTED');\n }\n\n // Collect all transactions from all inputs\n const allTxBytes: Uint8Array[] = [];\n for (const input of inputs) {\n allTxBytes.push(input.transaction);\n }\n\n const req: SignAllTransactionsRequest = {\n operation: 'signAllTransactions',\n transactions: allTxBytes.map(tx => encodeBase64(tx)),\n };\n\n const response = await request<SignAllTransactionsResponse>('POST', req);\n\n return response.signedTransactions.map(signedTx => ({\n signedTransaction: decodeBase64(signedTx),\n }));\n },\n },\n\n // Solana sign message\n 'solana:signMessage': {\n version: '1.0.0',\n signMessage: async (...inputs: SignMessageInput[]) => {\n if (!connected) {\n throw new RemoteWalletError('Wallet not connected', 'NOT_CONNECTED');\n }\n\n const results: { signedMessage: Uint8Array; signature: Uint8Array }[] = [];\n\n for (const input of inputs) {\n const req: SignMessageRequest = {\n operation: 'signMessage',\n message: encodeBase64(input.message),\n };\n\n const response = await request<SignMessageResponse>('POST', req);\n results.push({\n signedMessage: input.message,\n signature: decodeBase64(response.signature),\n });\n }\n\n return results;\n },\n },\n\n // Solana sign and send transaction (optional)\n 'solana:signAndSendTransaction': {\n version: '1.0.0',\n supportedTransactionVersions: ['legacy', 0],\n signAndSendTransaction: async (...inputs: SignAndSendTransactionInput[]) => {\n if (!connected) {\n throw new RemoteWalletError('Wallet not connected', 'NOT_CONNECTED');\n }\n\n // Check if server supports this operation\n if (metadata && !metadata.capabilities.signAndSendTransaction) {\n throw new RemoteWalletError(\n 'Server does not support signAndSendTransaction',\n 'UNSUPPORTED_OPERATION',\n );\n }\n\n const results: { signature: Uint8Array }[] = [];\n\n for (const input of inputs) {\n const req: SignAndSendTransactionRequest = {\n operation: 'signAndSendTransaction',\n transaction: encodeBase64(input.transaction),\n options: input.options,\n };\n\n const response = await request<SignAndSendTransactionResponse>('POST', req);\n\n // Convert base58 signature to bytes\n // Signature is 64 bytes, base58 encoded\n const sigBytes = base58ToBytes(response.signature);\n results.push({ signature: sigBytes });\n }\n\n return results;\n },\n },\n };\n\n // Build the wallet object\n const wallet: Wallet = {\n version: '1.0.0',\n name,\n icon: icon as `data:image/${'svg+xml' | 'webp' | 'png' | 'gif'};base64,${string}`,\n chains,\n features,\n accounts: [],\n };\n\n // Make accounts reactive via getter\n Object.defineProperty(wallet, 'accounts', {\n get: () => accounts,\n enumerable: true,\n });\n\n return wallet;\n}\n\n/**\n * Convert base58 string to bytes\n * Simple implementation for signature conversion\n */\nfunction base58ToBytes(base58: string): Uint8Array {\n const ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n const ALPHABET_MAP = new Map<string, number>();\n for (let i = 0; i < ALPHABET.length; i++) {\n ALPHABET_MAP.set(ALPHABET[i], i);\n }\n\n const bytes: number[] = [0];\n for (const char of base58) {\n const value = ALPHABET_MAP.get(char);\n if (value === undefined) {\n throw new Error(`Invalid base58 character: ${char}`);\n }\n\n let carry = value;\n for (let i = 0; i < bytes.length; i++) {\n carry += bytes[i] * 58;\n bytes[i] = carry & 0xff;\n carry >>= 8;\n }\n while (carry > 0) {\n bytes.push(carry & 0xff);\n carry >>= 8;\n }\n }\n\n // Handle leading zeros\n for (const char of base58) {\n if (char === '1') {\n bytes.push(0);\n } else {\n break;\n }\n }\n\n return new Uint8Array(bytes.reverse());\n}\n"]}
|