@solana/connector 0.2.1 → 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.
Files changed (78) hide show
  1. package/dist/{chunk-HPQ5T32K.mjs → chunk-3623Z2QL.mjs} +4 -4
  2. package/dist/{chunk-HPQ5T32K.mjs.map → chunk-3623Z2QL.mjs.map} +1 -1
  3. package/dist/{chunk-UCISIAOG.mjs → chunk-A7WQ3K75.mjs} +3 -3
  4. package/dist/{chunk-UCISIAOG.mjs.map → chunk-A7WQ3K75.mjs.map} +1 -1
  5. package/dist/{chunk-SITQ4JWM.js → chunk-BF67LVVM.js} +17 -21
  6. package/dist/chunk-BF67LVVM.js.map +1 -0
  7. package/dist/{chunk-MDR4Y37Z.mjs → chunk-DFHJYZKZ.mjs} +5 -4
  8. package/dist/chunk-DFHJYZKZ.mjs.map +1 -0
  9. package/dist/chunk-E3DAIOYS.mjs +22 -0
  10. package/dist/chunk-E3DAIOYS.mjs.map +1 -0
  11. package/dist/chunk-FG7HTQTV.mjs +7 -0
  12. package/dist/chunk-FG7HTQTV.mjs.map +1 -0
  13. package/dist/{chunk-BJAVJQLK.js → chunk-I2XX5FUG.js} +6 -6
  14. package/dist/{chunk-BJAVJQLK.js.map → chunk-I2XX5FUG.js.map} +1 -1
  15. package/dist/chunk-L5FWMNWO.js +9 -0
  16. package/dist/chunk-L5FWMNWO.js.map +1 -0
  17. package/dist/{chunk-HN5AJF7F.js → chunk-NLPEO5GT.js} +5 -5
  18. package/dist/{chunk-HN5AJF7F.js.map → chunk-NLPEO5GT.js.map} +1 -1
  19. package/dist/chunk-QST7XLMB.js +26 -0
  20. package/dist/chunk-QST7XLMB.js.map +1 -0
  21. package/dist/{chunk-ZZTY3O4N.mjs → chunk-SJCQ3KZE.mjs} +4 -7
  22. package/dist/chunk-SJCQ3KZE.mjs.map +1 -0
  23. package/dist/{chunk-IDTUFDNB.mjs → chunk-SQ2JEA2M.mjs} +58 -11
  24. package/dist/chunk-SQ2JEA2M.mjs.map +1 -0
  25. package/dist/{chunk-BZ2VBJCZ.js → chunk-TRSJSU33.js} +141 -94
  26. package/dist/chunk-TRSJSU33.js.map +1 -0
  27. package/dist/{chunk-4Z2F6ERB.js → chunk-VVLY6QPI.js} +49 -48
  28. package/dist/chunk-VVLY6QPI.js.map +1 -0
  29. package/dist/compat.js +2 -2
  30. package/dist/compat.mjs +1 -1
  31. package/dist/fireblocks-FLKRTJU3.js +67 -0
  32. package/dist/fireblocks-FLKRTJU3.js.map +1 -0
  33. package/dist/fireblocks-KCJV3GEK.mjs +65 -0
  34. package/dist/fireblocks-KCJV3GEK.mjs.map +1 -0
  35. package/dist/headless.d.mts +6 -11
  36. package/dist/headless.d.ts +6 -11
  37. package/dist/headless.js +147 -147
  38. package/dist/headless.mjs +4 -4
  39. package/dist/index.d.mts +1 -1
  40. package/dist/index.d.ts +1 -1
  41. package/dist/index.js +188 -188
  42. package/dist/index.mjs +5 -5
  43. package/dist/privy-6LYDE24Z.mjs +64 -0
  44. package/dist/privy-6LYDE24Z.mjs.map +1 -0
  45. package/dist/privy-ID4YFTKR.js +66 -0
  46. package/dist/privy-ID4YFTKR.js.map +1 -0
  47. package/dist/protocol-G-z1lRqo.d.mts +166 -0
  48. package/dist/protocol-G-z1lRqo.d.ts +166 -0
  49. package/dist/react.d.mts +3 -3
  50. package/dist/react.d.ts +3 -3
  51. package/dist/react.js +49 -49
  52. package/dist/react.mjs +2 -2
  53. package/dist/remote.d.mts +46 -0
  54. package/dist/remote.d.ts +46 -0
  55. package/dist/remote.js +212 -0
  56. package/dist/remote.js.map +1 -0
  57. package/dist/remote.mjs +198 -0
  58. package/dist/remote.mjs.map +1 -0
  59. package/dist/server.d.mts +141 -0
  60. package/dist/server.d.ts +141 -0
  61. package/dist/server.js +189 -0
  62. package/dist/server.js.map +1 -0
  63. package/dist/server.mjs +187 -0
  64. package/dist/server.mjs.map +1 -0
  65. package/dist/{standard-shim-tmnQelaJ.d.ts → standard-shim-Cg6fmjK_.d.ts} +10 -0
  66. package/dist/{standard-shim-CGB88PPO.d.mts → standard-shim-Cz4UNS7t.d.mts} +10 -0
  67. package/dist/{walletconnect-447EY3OJ.js → walletconnect-F2M3PAAN.js} +8 -8
  68. package/dist/{walletconnect-447EY3OJ.js.map → walletconnect-F2M3PAAN.js.map} +1 -1
  69. package/dist/walletconnect-Z6LPGALR.mjs +3 -0
  70. package/dist/{walletconnect-U455PO4I.mjs.map → walletconnect-Z6LPGALR.mjs.map} +1 -1
  71. package/package.json +27 -2
  72. package/dist/chunk-4Z2F6ERB.js.map +0 -1
  73. package/dist/chunk-BZ2VBJCZ.js.map +0 -1
  74. package/dist/chunk-IDTUFDNB.mjs.map +0 -1
  75. package/dist/chunk-MDR4Y37Z.mjs.map +0 -1
  76. package/dist/chunk-SITQ4JWM.js.map +0 -1
  77. package/dist/chunk-ZZTY3O4N.mjs.map +0 -1
  78. package/dist/walletconnect-U455PO4I.mjs +0 -3
@@ -0,0 +1,198 @@
1
+ import { encodeBase64, decodeBase64, isErrorResponse } from './chunk-E3DAIOYS.mjs';
2
+ export { decodeBase64, encodeBase64, isErrorResponse } from './chunk-E3DAIOYS.mjs';
3
+
4
+ // src/remote/remote-wallet.ts
5
+ var DEFAULT_ICON = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAzMCAyOC4zMzE5IiBmaWxsPSJjdXJyZW50Q29sb3IiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGc+PHJlY3QgaGVpZ2h0PSIyNS4wODU1IiBvcGFjaXR5PSIwIiB3aWR0aD0iMjYuNTYyNSIgeD0iMCIgeT0iMCIvPjxwYXRoIGQ9Ik0xNy42NzgzIDE1LjEyNzdDMTcuNzc2MSAxNi41MzcgMTguNTE0NyAxNy43NzA5IDE5LjY1ODIgMTguNTI0MkwxOS42NTgyIDIxLjMxNjlDMTkuNjU1MSAyMS4zMTcxIDE5LjY1MTggMjEuMzE3MSAxOS42NDg0IDIxLjMxNzFMNi41NTI3MyAyMS4zMTcxQzUuNTA3ODEgMjEuMzE3MSA0Ljg4MjgxIDIwLjgyODkgNC44ODI4MSAyMC4wMTgzQzQuODgyODEgMTcuNDk4OCA4LjAzNzExIDE0LjAyMjIgMTMuMDk1NyAxNC4wMjIyQzE0Ljg4MDkgMTQuMDIyMiAxNi40Mjg2IDE0LjQ1MzUgMTcuNjc4MyAxNS4xMjc3Wk0xNy4wMTE3IDcuOTU3NzdDMTcuMDExNyAxMC4zOTkyIDE1LjE5NTMgMTIuMjc0MiAxMy4xMDU1IDEyLjI3NDJDMTEuMDA1OSAxMi4yNzQyIDkuMTk5MjIgMTAuMzk5MiA5LjE5OTIyIDcuOTc3M0M5LjE5OTIyIDUuNTg0NzIgMTEuMDE1NiAzLjc1ODU1IDEzLjEwNTUgMy43NTg1NUMxNS4xOTUzIDMuNzU4NTUgMTcuMDExNyA1LjU0NTY2IDE3LjAxMTcgNy45NTc3N1oiIGZpbGwtb3BhY2l0eT0iMC44NSIvPjxwYXRoIGQ9Ik0yMi4xMTkxIDExLjY5OEMyMC4zODA5IDExLjY5OCAxOS4wMDM5IDEzLjA5NDUgMTkuMDAzOSAxNC44MDM1QzE5LjAwMzkgMTYuMTMxNiAxOS43ODUyIDE3LjI1NDYgMjAuOTg2MyAxNy43MjM0TDIwLjk4NjMgMjIuNTU3NEMyMC45ODYzIDIyLjY3NDYgMjEuMDQ0OSAyMi43NjI1IDIxLjEyMyAyMi44NjAxTDIxLjk0MzQgMjMuNjgwNEMyMi4wNDEgMjMuNzc4MSAyMi4xNzc3IDIzLjc4NzggMjIuMjg1MiAyMy42ODA0TDIzLjgzNzkgMjIuMTM3NUMyMy45MzU1IDIyLjAzIDIzLjkzNTUgMjEuODkzMyAyMy44Mzc5IDIxLjc5NTdMMjIuODcxMSAyMC44Mjg5TDI0LjIwOSAxOS41MjAzQzI0LjMwNjYgMTkuNDMyNCAyNC4zMDY2IDE5LjI4NTkgMjQuMTg5NSAxOS4xNjg3TDIyLjg4MDkgMTcuODY5OUMyNC4zODQ4IDE3LjI1NDYgMjUuMjI0NiAxNi4xNjA5IDI1LjIyNDYgMTQuODAzNUMyNS4yMjQ2IDEzLjA5NDUgMjMuODM3OSAxMS42OTggMjIuMTE5MSAxMS42OThaTTIyLjEwOTQgMTMuMTUzMUMyMi42MzY3IDEzLjE1MzEgMjMuMDY2NCAxMy41ODI4IDIzLjA2NjQgMTQuMTEwMUMyMy4wNjY0IDE0LjY1NyAyMi42MzY3IDE1LjA4NjcgMjIuMTA5NCAxNS4wODY3QzIxLjU4MiAxNS4wODY3IDIxLjE0MjYgMTQuNjU3IDIxLjE0MjYgMTQuMTEwMUMyMS4xNDI2IDEzLjU4MjggMjEuNTcyMyAxMy4xNTMxIDIyLjEwOTQgMTMuMTUzMVoiIGZpbGwtb3BhY2l0eT0iMC44NSIvPjwvZz48L3N2Zz4=", DEFAULT_CHAINS = ["solana:mainnet", "solana:devnet"], RemoteWalletError = class extends Error {
6
+ constructor(message, code, details) {
7
+ super(message);
8
+ this.code = code;
9
+ this.details = details;
10
+ this.name = "RemoteWalletError";
11
+ }
12
+ };
13
+ function createRemoteSignerWallet(config) {
14
+ let { endpoint, name, icon = DEFAULT_ICON, chains = DEFAULT_CHAINS, getAuthHeaders } = config, connected = false, metadata = null, accounts = [], eventListeners = /* @__PURE__ */ new Map();
15
+ async function request(method, body) {
16
+ let headers = {
17
+ "Content-Type": "application/json"
18
+ };
19
+ if (getAuthHeaders) {
20
+ let authHeaders = await getAuthHeaders();
21
+ Object.assign(headers, authHeaders);
22
+ }
23
+ let response = await fetch(endpoint, {
24
+ method,
25
+ headers,
26
+ body: body ? JSON.stringify(body) : void 0
27
+ }), data = await response.json();
28
+ if (!response.ok || isErrorResponse(data)) {
29
+ let errorData = isErrorResponse(data) ? data.error : { code: "UNKNOWN", message: "Request failed", details: void 0 };
30
+ throw new RemoteWalletError(errorData.message, errorData.code, errorData.details);
31
+ }
32
+ return data;
33
+ }
34
+ function emit(event, ...args) {
35
+ let listeners = eventListeners.get(event);
36
+ if (listeners)
37
+ for (let listener of listeners)
38
+ try {
39
+ listener(...args);
40
+ } catch {
41
+ }
42
+ }
43
+ let wallet = {
44
+ version: "1.0.0",
45
+ name,
46
+ icon,
47
+ chains,
48
+ features: {
49
+ // Standard connect
50
+ "standard:connect": {
51
+ version: "1.0.0",
52
+ connect: async () => connected && accounts.length > 0 ? { accounts } : (metadata = await request("GET"), accounts = [{
53
+ address: metadata.address,
54
+ publicKey: new Uint8Array(32),
55
+ // Placeholder - not needed for signing
56
+ chains: metadata.chains || chains,
57
+ features: [
58
+ "solana:signTransaction",
59
+ ...metadata.capabilities.signAllTransactions ? ["solana:signAllTransactions"] : [],
60
+ ...metadata.capabilities.signMessage ? ["solana:signMessage"] : [],
61
+ ...metadata.capabilities.signAndSendTransaction ? ["solana:signAndSendTransaction"] : []
62
+ ]
63
+ }], connected = true, emit("change", { accounts }), { accounts })
64
+ },
65
+ // Standard disconnect
66
+ "standard:disconnect": {
67
+ version: "1.0.0",
68
+ disconnect: async () => {
69
+ connected = false, accounts = [], metadata = null, emit("change", { accounts: [] });
70
+ }
71
+ },
72
+ // Standard events
73
+ "standard:events": {
74
+ version: "1.0.0",
75
+ on: (event, listener) => {
76
+ let listeners = eventListeners.get(event);
77
+ return listeners || (listeners = /* @__PURE__ */ new Set(), eventListeners.set(event, listeners)), listeners.add(listener), () => {
78
+ listeners?.delete(listener), listeners?.size === 0 && eventListeners.delete(event);
79
+ };
80
+ }
81
+ },
82
+ // Solana sign transaction
83
+ "solana:signTransaction": {
84
+ version: "1.0.0",
85
+ supportedTransactionVersions: ["legacy", 0],
86
+ signTransaction: async (...inputs) => {
87
+ if (!connected)
88
+ throw new RemoteWalletError("Wallet not connected", "NOT_CONNECTED");
89
+ let results = [];
90
+ for (let input of inputs) {
91
+ let txBytes = input.transaction, req = {
92
+ operation: "signTransaction",
93
+ transaction: encodeBase64(txBytes)
94
+ }, response = await request("POST", req);
95
+ results.push({
96
+ signedTransaction: decodeBase64(response.signedTransaction)
97
+ });
98
+ }
99
+ return results;
100
+ }
101
+ },
102
+ // Solana sign all transactions (batch)
103
+ "solana:signAllTransactions": {
104
+ version: "1.0.0",
105
+ supportedTransactionVersions: ["legacy", 0],
106
+ signAllTransactions: async (...inputs) => {
107
+ if (!connected)
108
+ throw new RemoteWalletError("Wallet not connected", "NOT_CONNECTED");
109
+ let allTxBytes = [];
110
+ for (let input of inputs)
111
+ allTxBytes.push(input.transaction);
112
+ let req = {
113
+ operation: "signAllTransactions",
114
+ transactions: allTxBytes.map((tx) => encodeBase64(tx))
115
+ };
116
+ return (await request("POST", req)).signedTransactions.map((signedTx) => ({
117
+ signedTransaction: decodeBase64(signedTx)
118
+ }));
119
+ }
120
+ },
121
+ // Solana sign message
122
+ "solana:signMessage": {
123
+ version: "1.0.0",
124
+ signMessage: async (...inputs) => {
125
+ if (!connected)
126
+ throw new RemoteWalletError("Wallet not connected", "NOT_CONNECTED");
127
+ let results = [];
128
+ for (let input of inputs) {
129
+ let req = {
130
+ operation: "signMessage",
131
+ message: encodeBase64(input.message)
132
+ }, response = await request("POST", req);
133
+ results.push({
134
+ signedMessage: input.message,
135
+ signature: decodeBase64(response.signature)
136
+ });
137
+ }
138
+ return results;
139
+ }
140
+ },
141
+ // Solana sign and send transaction (optional)
142
+ "solana:signAndSendTransaction": {
143
+ version: "1.0.0",
144
+ supportedTransactionVersions: ["legacy", 0],
145
+ signAndSendTransaction: async (...inputs) => {
146
+ if (!connected)
147
+ throw new RemoteWalletError("Wallet not connected", "NOT_CONNECTED");
148
+ if (metadata && !metadata.capabilities.signAndSendTransaction)
149
+ throw new RemoteWalletError(
150
+ "Server does not support signAndSendTransaction",
151
+ "UNSUPPORTED_OPERATION"
152
+ );
153
+ let results = [];
154
+ for (let input of inputs) {
155
+ let req = {
156
+ operation: "signAndSendTransaction",
157
+ transaction: encodeBase64(input.transaction),
158
+ options: input.options
159
+ }, response = await request("POST", req), sigBytes = base58ToBytes(response.signature);
160
+ results.push({ signature: sigBytes });
161
+ }
162
+ return results;
163
+ }
164
+ }
165
+ },
166
+ accounts: []
167
+ };
168
+ return Object.defineProperty(wallet, "accounts", {
169
+ get: () => accounts,
170
+ enumerable: true
171
+ }), wallet;
172
+ }
173
+ function base58ToBytes(base58) {
174
+ let ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz", ALPHABET_MAP = /* @__PURE__ */ new Map();
175
+ for (let i = 0; i < ALPHABET.length; i++)
176
+ ALPHABET_MAP.set(ALPHABET[i], i);
177
+ let bytes = [0];
178
+ for (let char of base58) {
179
+ let value = ALPHABET_MAP.get(char);
180
+ if (value === void 0)
181
+ throw new Error(`Invalid base58 character: ${char}`);
182
+ let carry = value;
183
+ for (let i = 0; i < bytes.length; i++)
184
+ carry += bytes[i] * 58, bytes[i] = carry & 255, carry >>= 8;
185
+ for (; carry > 0; )
186
+ bytes.push(carry & 255), carry >>= 8;
187
+ }
188
+ for (let char of base58)
189
+ if (char === "1")
190
+ bytes.push(0);
191
+ else
192
+ break;
193
+ return new Uint8Array(bytes.reverse());
194
+ }
195
+
196
+ export { RemoteWalletError, createRemoteSignerWallet };
197
+ //# sourceMappingURL=remote.mjs.map
198
+ //# sourceMappingURL=remote.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/remote/remote-wallet.ts"],"names":[],"mappings":"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","file":"remote.mjs","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"]}
@@ -0,0 +1,141 @@
1
+ export { b as RemoteSignerCapabilities, l as RemoteSignerErrorCode, k as RemoteSignerErrorResponse, a as RemoteSignerMetadata, c as RemoteSignerRequest } from './protocol-G-z1lRqo.mjs';
2
+
3
+ /**
4
+ * @solana/connector/server - Route Handlers
5
+ *
6
+ * Creates Next.js Route Handler compatible GET/POST handlers for remote signing.
7
+ * Designed for Node.js runtime (not Edge) to support crypto operations.
8
+ */
9
+ /**
10
+ * Signer interface that providers must implement
11
+ */
12
+ interface RemoteSigner {
13
+ /** Signer's Solana address (base58) */
14
+ readonly address: string;
15
+ /** Sign transaction bytes, return signed transaction bytes */
16
+ signTransaction(transactionBytes: Uint8Array): Promise<Uint8Array>;
17
+ /** Sign multiple transactions */
18
+ signAllTransactions(transactions: Uint8Array[]): Promise<Uint8Array[]>;
19
+ /** Sign a message, return 64-byte signature */
20
+ signMessage(message: Uint8Array): Promise<Uint8Array>;
21
+ /** Check if signer is available/healthy */
22
+ isAvailable(): Promise<boolean>;
23
+ }
24
+ /**
25
+ * Provider configuration
26
+ */
27
+ type ProviderType = 'fireblocks' | 'privy' | 'custom';
28
+ interface FireblocksProviderConfig {
29
+ type: 'fireblocks';
30
+ /** Fireblocks API key */
31
+ apiKey: string;
32
+ /** RSA private key PEM for JWT signing */
33
+ privateKeyPem: string;
34
+ /** Vault account ID */
35
+ vaultAccountId: string;
36
+ /** Asset ID (default: 'SOL') */
37
+ assetId?: string;
38
+ /** API base URL (default: https://api.fireblocks.io) */
39
+ apiBaseUrl?: string;
40
+ }
41
+ interface PrivyProviderConfig {
42
+ type: 'privy';
43
+ /** Privy app ID */
44
+ appId: string;
45
+ /** Privy app secret */
46
+ appSecret: string;
47
+ /** Privy wallet ID */
48
+ walletId: string;
49
+ /** API base URL (default: https://api.privy.io/v1) */
50
+ apiBaseUrl?: string;
51
+ }
52
+ interface CustomProviderConfig {
53
+ type: 'custom';
54
+ /** Custom signer implementation */
55
+ signer: RemoteSigner;
56
+ }
57
+ type ProviderConfig = FireblocksProviderConfig | PrivyProviderConfig | CustomProviderConfig;
58
+ /**
59
+ * Authorization callback
60
+ */
61
+ type AuthorizeCallback = (request: Request) => Promise<boolean> | boolean;
62
+ /**
63
+ * Policy validation callback
64
+ */
65
+ interface PolicyHooks {
66
+ /** Validate a transaction before signing (return false to reject) */
67
+ validateTransaction?: (transactionBytes: Uint8Array, request: Request) => Promise<boolean> | boolean;
68
+ /** Validate a message before signing (return false to reject) */
69
+ validateMessage?: (messageBytes: Uint8Array, request: Request) => Promise<boolean> | boolean;
70
+ }
71
+ /**
72
+ * RPC configuration for sign+send operations
73
+ */
74
+ interface RpcConfig {
75
+ /** Solana RPC endpoint URL */
76
+ url: string;
77
+ /** Commitment level for confirmations */
78
+ commitment?: 'processed' | 'confirmed' | 'finalized';
79
+ }
80
+ /**
81
+ * Route handler configuration
82
+ */
83
+ interface RemoteSignerRouteHandlersConfig {
84
+ /** Provider configuration */
85
+ provider: ProviderConfig;
86
+ /**
87
+ * Authorization callback. Default: checks for Authorization header matching CONNECTOR_SIGNER_TOKEN env var.
88
+ * Return true to allow, false to reject.
89
+ */
90
+ authorize?: AuthorizeCallback;
91
+ /** Policy hooks for transaction/message validation */
92
+ policy?: PolicyHooks;
93
+ /** RPC configuration (required for signAndSendTransaction) */
94
+ rpc?: RpcConfig;
95
+ /** Supported chains (default: ['solana:mainnet', 'solana:devnet']) */
96
+ chains?: string[];
97
+ /** Wallet name shown in metadata */
98
+ name?: string;
99
+ /** Wallet icon URL */
100
+ icon?: string;
101
+ }
102
+ /**
103
+ * Next.js compatible request/response types
104
+ */
105
+ interface NextRequest extends Request {
106
+ }
107
+ type NextResponse = Response;
108
+ /**
109
+ * Route handlers object returned by the factory
110
+ */
111
+ interface RouteHandlers {
112
+ GET: (request: NextRequest) => Promise<NextResponse>;
113
+ POST: (request: NextRequest) => Promise<NextResponse>;
114
+ }
115
+ /**
116
+ * Create Next.js Route Handlers for remote signing
117
+ *
118
+ * @example
119
+ * ```typescript
120
+ * // app/api/connector-signer/route.ts
121
+ * import { createRemoteSignerRouteHandlers } from '@solana/connector/server';
122
+ *
123
+ * const { GET, POST } = createRemoteSignerRouteHandlers({
124
+ * provider: {
125
+ * type: 'fireblocks',
126
+ * apiKey: process.env.FIREBLOCKS_API_KEY!,
127
+ * privateKeyPem: process.env.FIREBLOCKS_PRIVATE_KEY!,
128
+ * vaultAccountId: process.env.FIREBLOCKS_VAULT_ID!,
129
+ * },
130
+ * rpc: {
131
+ * url: process.env.SOLANA_RPC_URL!,
132
+ * },
133
+ * });
134
+ *
135
+ * export { GET, POST };
136
+ * export const runtime = 'nodejs';
137
+ * ```
138
+ */
139
+ declare function createRemoteSignerRouteHandlers(config: RemoteSignerRouteHandlersConfig): RouteHandlers;
140
+
141
+ export { type AuthorizeCallback, type CustomProviderConfig, type FireblocksProviderConfig, type NextRequest, type NextResponse, type PolicyHooks, type PrivyProviderConfig, type ProviderConfig, type ProviderType, type RemoteSigner, type RemoteSignerRouteHandlersConfig, type RouteHandlers, type RpcConfig, createRemoteSignerRouteHandlers };
@@ -0,0 +1,141 @@
1
+ export { b as RemoteSignerCapabilities, l as RemoteSignerErrorCode, k as RemoteSignerErrorResponse, a as RemoteSignerMetadata, c as RemoteSignerRequest } from './protocol-G-z1lRqo.js';
2
+
3
+ /**
4
+ * @solana/connector/server - Route Handlers
5
+ *
6
+ * Creates Next.js Route Handler compatible GET/POST handlers for remote signing.
7
+ * Designed for Node.js runtime (not Edge) to support crypto operations.
8
+ */
9
+ /**
10
+ * Signer interface that providers must implement
11
+ */
12
+ interface RemoteSigner {
13
+ /** Signer's Solana address (base58) */
14
+ readonly address: string;
15
+ /** Sign transaction bytes, return signed transaction bytes */
16
+ signTransaction(transactionBytes: Uint8Array): Promise<Uint8Array>;
17
+ /** Sign multiple transactions */
18
+ signAllTransactions(transactions: Uint8Array[]): Promise<Uint8Array[]>;
19
+ /** Sign a message, return 64-byte signature */
20
+ signMessage(message: Uint8Array): Promise<Uint8Array>;
21
+ /** Check if signer is available/healthy */
22
+ isAvailable(): Promise<boolean>;
23
+ }
24
+ /**
25
+ * Provider configuration
26
+ */
27
+ type ProviderType = 'fireblocks' | 'privy' | 'custom';
28
+ interface FireblocksProviderConfig {
29
+ type: 'fireblocks';
30
+ /** Fireblocks API key */
31
+ apiKey: string;
32
+ /** RSA private key PEM for JWT signing */
33
+ privateKeyPem: string;
34
+ /** Vault account ID */
35
+ vaultAccountId: string;
36
+ /** Asset ID (default: 'SOL') */
37
+ assetId?: string;
38
+ /** API base URL (default: https://api.fireblocks.io) */
39
+ apiBaseUrl?: string;
40
+ }
41
+ interface PrivyProviderConfig {
42
+ type: 'privy';
43
+ /** Privy app ID */
44
+ appId: string;
45
+ /** Privy app secret */
46
+ appSecret: string;
47
+ /** Privy wallet ID */
48
+ walletId: string;
49
+ /** API base URL (default: https://api.privy.io/v1) */
50
+ apiBaseUrl?: string;
51
+ }
52
+ interface CustomProviderConfig {
53
+ type: 'custom';
54
+ /** Custom signer implementation */
55
+ signer: RemoteSigner;
56
+ }
57
+ type ProviderConfig = FireblocksProviderConfig | PrivyProviderConfig | CustomProviderConfig;
58
+ /**
59
+ * Authorization callback
60
+ */
61
+ type AuthorizeCallback = (request: Request) => Promise<boolean> | boolean;
62
+ /**
63
+ * Policy validation callback
64
+ */
65
+ interface PolicyHooks {
66
+ /** Validate a transaction before signing (return false to reject) */
67
+ validateTransaction?: (transactionBytes: Uint8Array, request: Request) => Promise<boolean> | boolean;
68
+ /** Validate a message before signing (return false to reject) */
69
+ validateMessage?: (messageBytes: Uint8Array, request: Request) => Promise<boolean> | boolean;
70
+ }
71
+ /**
72
+ * RPC configuration for sign+send operations
73
+ */
74
+ interface RpcConfig {
75
+ /** Solana RPC endpoint URL */
76
+ url: string;
77
+ /** Commitment level for confirmations */
78
+ commitment?: 'processed' | 'confirmed' | 'finalized';
79
+ }
80
+ /**
81
+ * Route handler configuration
82
+ */
83
+ interface RemoteSignerRouteHandlersConfig {
84
+ /** Provider configuration */
85
+ provider: ProviderConfig;
86
+ /**
87
+ * Authorization callback. Default: checks for Authorization header matching CONNECTOR_SIGNER_TOKEN env var.
88
+ * Return true to allow, false to reject.
89
+ */
90
+ authorize?: AuthorizeCallback;
91
+ /** Policy hooks for transaction/message validation */
92
+ policy?: PolicyHooks;
93
+ /** RPC configuration (required for signAndSendTransaction) */
94
+ rpc?: RpcConfig;
95
+ /** Supported chains (default: ['solana:mainnet', 'solana:devnet']) */
96
+ chains?: string[];
97
+ /** Wallet name shown in metadata */
98
+ name?: string;
99
+ /** Wallet icon URL */
100
+ icon?: string;
101
+ }
102
+ /**
103
+ * Next.js compatible request/response types
104
+ */
105
+ interface NextRequest extends Request {
106
+ }
107
+ type NextResponse = Response;
108
+ /**
109
+ * Route handlers object returned by the factory
110
+ */
111
+ interface RouteHandlers {
112
+ GET: (request: NextRequest) => Promise<NextResponse>;
113
+ POST: (request: NextRequest) => Promise<NextResponse>;
114
+ }
115
+ /**
116
+ * Create Next.js Route Handlers for remote signing
117
+ *
118
+ * @example
119
+ * ```typescript
120
+ * // app/api/connector-signer/route.ts
121
+ * import { createRemoteSignerRouteHandlers } from '@solana/connector/server';
122
+ *
123
+ * const { GET, POST } = createRemoteSignerRouteHandlers({
124
+ * provider: {
125
+ * type: 'fireblocks',
126
+ * apiKey: process.env.FIREBLOCKS_API_KEY!,
127
+ * privateKeyPem: process.env.FIREBLOCKS_PRIVATE_KEY!,
128
+ * vaultAccountId: process.env.FIREBLOCKS_VAULT_ID!,
129
+ * },
130
+ * rpc: {
131
+ * url: process.env.SOLANA_RPC_URL!,
132
+ * },
133
+ * });
134
+ *
135
+ * export { GET, POST };
136
+ * export const runtime = 'nodejs';
137
+ * ```
138
+ */
139
+ declare function createRemoteSignerRouteHandlers(config: RemoteSignerRouteHandlersConfig): RouteHandlers;
140
+
141
+ export { type AuthorizeCallback, type CustomProviderConfig, type FireblocksProviderConfig, type NextRequest, type NextResponse, type PolicyHooks, type PrivyProviderConfig, type ProviderConfig, type ProviderType, type RemoteSigner, type RemoteSignerRouteHandlersConfig, type RouteHandlers, type RpcConfig, createRemoteSignerRouteHandlers };