@solana/connector 0.1.10 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +344 -88
- package/dist/{chunk-MN7XNCYI.js → chunk-BJAVJQLK.js} +6 -6
- package/dist/{chunk-MN7XNCYI.js.map → chunk-BJAVJQLK.js.map} +1 -1
- package/dist/{chunk-6AJJJG5B.js → chunk-BZ2VBJCZ.js} +618 -415
- package/dist/chunk-BZ2VBJCZ.js.map +1 -0
- package/dist/{chunk-ATYK5OKR.js → chunk-EM4KNOKG.js} +614 -194
- package/dist/chunk-EM4KNOKG.js.map +1 -0
- package/dist/{chunk-4JT24DIX.js → chunk-HN5AJF7F.js} +61 -20
- package/dist/chunk-HN5AJF7F.js.map +1 -0
- package/dist/{chunk-FVA4TUI4.mjs → chunk-HPQ5T32K.mjs} +4 -4
- package/dist/{chunk-FVA4TUI4.mjs.map → chunk-HPQ5T32K.mjs.map} +1 -1
- package/dist/{chunk-QOIQBWMP.mjs → chunk-IDTUFDNB.mjs} +531 -339
- package/dist/chunk-IDTUFDNB.mjs.map +1 -0
- package/dist/{chunk-WGZYKDXF.mjs → chunk-RTXUS5KG.mjs} +529 -115
- package/dist/chunk-RTXUS5KG.mjs.map +1 -0
- package/dist/{chunk-64LV76OK.js → chunk-SITQ4JWM.js} +23 -2
- package/dist/chunk-SITQ4JWM.js.map +1 -0
- package/dist/{chunk-7XHVZW2L.mjs → chunk-UCISIAOG.mjs} +60 -19
- package/dist/chunk-UCISIAOG.mjs.map +1 -0
- package/dist/{chunk-DKCZA2QI.mjs → chunk-ZZTY3O4N.mjs} +21 -3
- package/dist/chunk-ZZTY3O4N.mjs.map +1 -0
- package/dist/compat.d.mts +1 -1
- package/dist/compat.d.ts +1 -1
- package/dist/compat.js +2 -2
- package/dist/compat.mjs +1 -1
- package/dist/headless.d.mts +25 -7
- package/dist/headless.d.ts +25 -7
- package/dist/headless.js +196 -132
- package/dist/headless.mjs +4 -4
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +255 -175
- package/dist/index.mjs +5 -5
- package/dist/react.d.mts +230 -8
- package/dist/react.d.ts +230 -8
- package/dist/react.js +78 -42
- package/dist/react.mjs +2 -2
- package/dist/{standard-shim-BTUm7cur.d.mts → standard-shim-CGB88PPO.d.mts} +396 -54
- package/dist/{standard-shim-LsQ97i9T.d.ts → standard-shim-tmnQelaJ.d.ts} +396 -54
- package/dist/{transaction-signer-T-KVQFi8.d.ts → transaction-signer-7NaYmP5w.d.mts} +1 -0
- package/dist/{transaction-signer-T-KVQFi8.d.mts → transaction-signer-7NaYmP5w.d.ts} +1 -0
- package/dist/{walletconnect-D4JN6H2O.js → walletconnect-447EY3OJ.js} +8 -8
- package/dist/{walletconnect-D4JN6H2O.js.map → walletconnect-447EY3OJ.js.map} +1 -1
- package/dist/walletconnect-U455PO4I.mjs +3 -0
- package/dist/{walletconnect-I3PZUBTA.mjs.map → walletconnect-U455PO4I.mjs.map} +1 -1
- package/package.json +1 -1
- package/dist/chunk-4JT24DIX.js.map +0 -1
- package/dist/chunk-64LV76OK.js.map +0 -1
- package/dist/chunk-6AJJJG5B.js.map +0 -1
- package/dist/chunk-7XHVZW2L.mjs.map +0 -1
- package/dist/chunk-ATYK5OKR.js.map +0 -1
- package/dist/chunk-DKCZA2QI.mjs.map +0 -1
- package/dist/chunk-QOIQBWMP.mjs.map +0 -1
- package/dist/chunk-WGZYKDXF.mjs.map +0 -1
- package/dist/walletconnect-I3PZUBTA.mjs +0 -3
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var chunk4KD6HQQG_js = require('./chunk-4KD6HQQG.js');
|
|
4
|
-
var
|
|
5
|
-
var react = require('react');
|
|
6
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var chunkSITQ4JWM_js = require('./chunk-SITQ4JWM.js');
|
|
7
5
|
var webcryptoEd25519Polyfill = require('@solana/webcrypto-ed25519-polyfill');
|
|
8
6
|
var core = require('@wallet-ui/core');
|
|
9
7
|
var addresses = require('@solana/addresses');
|
|
@@ -11,6 +9,49 @@ var v4 = require('zod/v4');
|
|
|
11
9
|
var codecs = require('@solana/codecs');
|
|
12
10
|
var transactions = require('@solana/transactions');
|
|
13
11
|
|
|
12
|
+
// src/types/session.ts
|
|
13
|
+
function createConnectorId(walletName) {
|
|
14
|
+
return `wallet-standard:${walletName.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "")}`;
|
|
15
|
+
}
|
|
16
|
+
function isWalletConnectorId(value) {
|
|
17
|
+
return typeof value == "string" && (value.startsWith("wallet-standard:") || value === "walletconnect" || value.startsWith("mwa:"));
|
|
18
|
+
}
|
|
19
|
+
function getWalletNameFromConnectorId(connectorId) {
|
|
20
|
+
return connectorId === "walletconnect" ? "WalletConnect" : connectorId.startsWith("mwa:") ? connectorId.slice(4) : connectorId.startsWith("wallet-standard:") ? connectorId.slice(16).split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ") : connectorId;
|
|
21
|
+
}
|
|
22
|
+
function isDisconnected(status) {
|
|
23
|
+
return status.status === "disconnected";
|
|
24
|
+
}
|
|
25
|
+
function isConnecting(status) {
|
|
26
|
+
return status.status === "connecting";
|
|
27
|
+
}
|
|
28
|
+
function isConnected(status) {
|
|
29
|
+
return status.status === "connected";
|
|
30
|
+
}
|
|
31
|
+
function isStatusError(status) {
|
|
32
|
+
return status.status === "error";
|
|
33
|
+
}
|
|
34
|
+
var isWalletStatusError = isStatusError, INITIAL_WALLET_STATUS = {
|
|
35
|
+
status: "disconnected"
|
|
36
|
+
};
|
|
37
|
+
function toLegacyWalletState(wallet) {
|
|
38
|
+
switch (wallet.status) {
|
|
39
|
+
case "disconnected":
|
|
40
|
+
return { connected: false, connecting: false, selectedAccount: null, accounts: [] };
|
|
41
|
+
case "connecting":
|
|
42
|
+
return { connected: false, connecting: true, selectedAccount: null, accounts: [] };
|
|
43
|
+
case "connected":
|
|
44
|
+
return {
|
|
45
|
+
connected: true,
|
|
46
|
+
connecting: false,
|
|
47
|
+
selectedAccount: wallet.session.selectedAccount.address,
|
|
48
|
+
accounts: wallet.session.accounts.map((a) => ({ address: a.address, label: a.label }))
|
|
49
|
+
};
|
|
50
|
+
case "error":
|
|
51
|
+
return { connected: false, connecting: false, selectedAccount: null, accounts: [] };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
14
55
|
// src/lib/wallet/standard-shim.ts
|
|
15
56
|
var registry = null, registryInitPromise = null, registryInitResolve = null, ready = new Promise((resolve, reject) => {
|
|
16
57
|
if (typeof window > "u") {
|
|
@@ -99,7 +140,7 @@ function toClusterId(network) {
|
|
|
99
140
|
function getDefaultRpcUrl(network) {
|
|
100
141
|
let normalized = normalizeNetwork(network);
|
|
101
142
|
try {
|
|
102
|
-
return
|
|
143
|
+
return chunkSITQ4JWM_js.getPublicSolanaRpcUrl(normalized);
|
|
103
144
|
} catch {
|
|
104
145
|
return PUBLIC_RPC_ENDPOINTS[normalized] ?? PUBLIC_RPC_ENDPOINTS.localnet;
|
|
105
146
|
}
|
|
@@ -154,14 +195,14 @@ function getClusterExplorerUrl(cluster, path) {
|
|
|
154
195
|
}
|
|
155
196
|
function getTransactionUrl(signature, cluster) {
|
|
156
197
|
let clusterType = getClusterType(cluster), explorerCluster = clusterType === "custom" || clusterType === "localnet" ? "devnet" : clusterType;
|
|
157
|
-
return
|
|
198
|
+
return chunkSITQ4JWM_js.getExplorerLink({
|
|
158
199
|
transaction: signature,
|
|
159
200
|
cluster: explorerCluster === "mainnet" ? "mainnet" : explorerCluster
|
|
160
201
|
});
|
|
161
202
|
}
|
|
162
203
|
function getAddressUrl(address, cluster) {
|
|
163
204
|
let clusterType = getClusterType(cluster), explorerCluster = clusterType === "custom" || clusterType === "localnet" ? "devnet" : clusterType;
|
|
164
|
-
return
|
|
205
|
+
return chunkSITQ4JWM_js.getExplorerLink({
|
|
165
206
|
address,
|
|
166
207
|
cluster: explorerCluster === "mainnet" ? "mainnet" : explorerCluster
|
|
167
208
|
});
|
|
@@ -224,9 +265,9 @@ var POLL_INTERVALS_MS = [1e3, 2e3, 3e3, 5e3, 5e3], DEFAULT_MAX_RETRIES = 3, DEFA
|
|
|
224
265
|
// src/lib/core/state-manager.ts
|
|
225
266
|
var StateManager = class {
|
|
226
267
|
constructor(initialState) {
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
268
|
+
chunkSITQ4JWM_js.__publicField(this, "state");
|
|
269
|
+
chunkSITQ4JWM_js.__publicField(this, "listeners", /* @__PURE__ */ new Set());
|
|
270
|
+
chunkSITQ4JWM_js.__publicField(this, "notifyTimeout");
|
|
230
271
|
this.state = initialState;
|
|
231
272
|
}
|
|
232
273
|
/**
|
|
@@ -285,10 +326,10 @@ var StateManager = class {
|
|
|
285
326
|
};
|
|
286
327
|
|
|
287
328
|
// src/lib/core/event-emitter.ts
|
|
288
|
-
var logger =
|
|
329
|
+
var logger = chunkSITQ4JWM_js.createLogger("EventEmitter"), EventEmitter = class {
|
|
289
330
|
constructor(debug = false) {
|
|
290
|
-
|
|
291
|
-
|
|
331
|
+
chunkSITQ4JWM_js.__publicField(this, "listeners", /* @__PURE__ */ new Set());
|
|
332
|
+
chunkSITQ4JWM_js.__publicField(this, "debug");
|
|
292
333
|
this.debug = debug;
|
|
293
334
|
}
|
|
294
335
|
/**
|
|
@@ -344,12 +385,12 @@ var logger = chunk64LV76OK_js.createLogger("EventEmitter"), EventEmitter = class
|
|
|
344
385
|
// src/lib/core/debug-metrics.ts
|
|
345
386
|
var DebugMetrics = class {
|
|
346
387
|
constructor() {
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
388
|
+
chunkSITQ4JWM_js.__publicField(this, "stateUpdates", 0);
|
|
389
|
+
chunkSITQ4JWM_js.__publicField(this, "noopUpdates", 0);
|
|
390
|
+
chunkSITQ4JWM_js.__publicField(this, "updateTimes", []);
|
|
391
|
+
chunkSITQ4JWM_js.__publicField(this, "lastUpdateTime", 0);
|
|
392
|
+
chunkSITQ4JWM_js.__publicField(this, "eventListenerCount", 0);
|
|
393
|
+
chunkSITQ4JWM_js.__publicField(this, "subscriptionCount", 0);
|
|
353
394
|
}
|
|
354
395
|
/**
|
|
355
396
|
* Record a state update attempt
|
|
@@ -389,11 +430,11 @@ var DebugMetrics = class {
|
|
|
389
430
|
// src/lib/core/base-collaborator.ts
|
|
390
431
|
var BaseCollaborator = class {
|
|
391
432
|
constructor(config, loggerPrefix) {
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
this.stateManager = config.stateManager, this.eventEmitter = config.eventEmitter, this.debug = config.debug ?? false, this.logger =
|
|
433
|
+
chunkSITQ4JWM_js.__publicField(this, "stateManager");
|
|
434
|
+
chunkSITQ4JWM_js.__publicField(this, "eventEmitter");
|
|
435
|
+
chunkSITQ4JWM_js.__publicField(this, "debug");
|
|
436
|
+
chunkSITQ4JWM_js.__publicField(this, "logger");
|
|
437
|
+
this.stateManager = config.stateManager, this.eventEmitter = config.eventEmitter, this.debug = config.debug ?? false, this.logger = chunkSITQ4JWM_js.createLogger(loggerPrefix);
|
|
397
438
|
}
|
|
398
439
|
/**
|
|
399
440
|
* Log debug message if debug mode is enabled
|
|
@@ -416,7 +457,7 @@ var BaseCollaborator = class {
|
|
|
416
457
|
};
|
|
417
458
|
|
|
418
459
|
// src/lib/wallet/authenticity-verifier.ts
|
|
419
|
-
var logger2 =
|
|
460
|
+
var logger2 = chunkSITQ4JWM_js.createLogger("WalletAuthenticity"), WalletAuthenticityVerifier = class {
|
|
420
461
|
/**
|
|
421
462
|
* Verify a wallet's authenticity using dynamic heuristics
|
|
422
463
|
*
|
|
@@ -626,7 +667,7 @@ var logger2 = chunk64LV76OK_js.createLogger("WalletAuthenticity"), WalletAuthent
|
|
|
626
667
|
};
|
|
627
668
|
|
|
628
669
|
// src/lib/wallet/wallet-icon-overrides.ts
|
|
629
|
-
var PHANTOM_ICON = "data:image/svg+xml;base64,
|
|
670
|
+
var PHANTOM_ICON = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBmaWxsPSIjOTc4NkU0Ii8+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF80NF82MTApIj4KPHBhdGggZD0iTTUuNzY1NSAxNS43OTdDNS43NjU1IDE3LjIyMiA2LjQ5ODc5IDE3LjU1IDcuMjYxNDEgMTcuNTVDOC44NzQ2MyAxNy41NSAxMC4wODcgMTYuMDg0MSAxMC44MTA1IDE0LjkyNTZDMTAuNzIyNSAxNS4xODE5IDEwLjY3MzYgMTUuNDM4MiAxMC42NzM2IDE1LjY4NDJDMTAuNjczNiAxNi4zNjA5IDExLjA0NTIgMTYuODQyNyAxMS43Nzg1IDE2Ljg0MjdDMTIuNzg1NSAxNi44NDI3IDEzLjg2MSAxNS45MiAxNC40MTgzIDE0LjkyNTZDMTQuMzc5MiAxNS4wNjkyIDE0LjM1OTYgMTUuMjAyNCAxNC4zNTk2IDE1LjMyNTRDMTQuMzU5NiAxNS43OTcgMTQuNjEzOCAxNi4wOTQzIDE1LjEzMiAxNi4wOTQzQzE2Ljc2NDggMTYuMDk0MyAxOC40MDc0IDEzLjA3MDEgMTguNDA3NCAxMC40MjUyQzE4LjQwNzQgOC4zNjQ1OSAxNy40MTAxIDYuNTUwMDUgMTQuOTA3MSA2LjU1MDA1QzEwLjUwNzQgNi41NTAwNSA1Ljc2NTUgMTIuMTY3OSA1Ljc2NTUgMTUuNzk3Wk0xMy4zOTE3IDEwLjE5OTZDMTMuMzkxNyA5LjY4NzA1IDEzLjY2NTQgOS4zMjgyNSAxNC4wNjYzIDkuMzI4MjVDMTQuNDU3NCA5LjMyODI1IDE0LjczMTIgOS42ODcwNSAxNC43MzEyIDEwLjE5OTZDMTQuNzMxMiAxMC43MTIyIDE0LjQ1NzQgMTEuMDgxMyAxNC4wNjYzIDExLjA4MTNDMTMuNjY1NCAxMS4wODEzIDEzLjM5MTcgMTAuNzEyMiAxMy4zOTE3IDEwLjE5OTZaTTE1LjQ4NCAxMC4xOTk2QzE1LjQ4NCA5LjY4NzA1IDE1Ljc1NzggOS4zMjgyNSAxNi4xNTg2IDkuMzI4MjVDMTYuNTQ5NyA5LjMyODI1IDE2LjgyMzUgOS42ODcwNSAxNi44MjM1IDEwLjE5OTZDMTYuODIzNSAxMC43MTIyIDE2LjU0OTcgMTEuMDgxMyAxNi4xNTg2IDExLjA4MTNDMTUuNzU3OCAxMS4wODEzIDE1LjQ4NCAxMC43MTIyIDE1LjQ4NCAxMC4xOTk2WiIgZmlsbD0iI0ZFRkRGOCIvPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzQ0XzYxMCI+CjxyZWN0IHdpZHRoPSIxMi43NiIgaGVpZ2h0PSIxMSIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUuNzA2NDIgNi41NDk5MykiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4=", SOLFLARE_ICON = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBmaWxsPSIjRkZFRjQ2Ii8+CjxwYXRoIGQ9Ik0xMi4xMjg1IDEyLjUyNjZMMTIuOTU1NiAxMS43Mjc2TDE0LjQ5NzYgMTIuMjMyM0MxNS41MDcgMTIuNTY4NyAxNi4wMTE3IDEzLjE4NTUgMTYuMDExNyAxNC4wNTQ3QzE2LjAxMTcgMTQuNzEzNiAxNS43NTkzIDE1LjE0ODIgMTUuMjU0NyAxNS43MDg5TDE1LjEwMDUgMTUuODc3MUwxNS4xNTY1IDE1LjQ4NDZDMTUuMzgwOCAxNC4wNTQ3IDE0Ljk2MDMgMTMuNDM3OSAxMy41NzI0IDEyLjk4OTJMMTIuMTI4NSAxMi41MjY2Wk0xMC4wNTM3IDcuNjM0MTRMMTQuMjU5MyA5LjAzNkwxMy4zNDgxIDkuOTA1MTdMMTEuMTYxMiA5LjE3NjE5QzEwLjQwNDIgOC45MjM4NSAxMC4xNTE4IDguNTE3MzEgMTAuMDUzNyA3LjY2MjE3VjcuNjM0MTRaTTkuODAxMzUgMTQuNzU1NkwxMC43NTQ2IDEzLjg0NDRMMTIuNTQ5MSAxNC40MzMyQzEzLjQ4ODMgMTQuNzQxNiAxMy44MTA3IDE1LjE0ODIgMTMuNzEyNiAxNi4xNzE1TDkuODAxMzUgMTQuNzU1NlpNOC41OTU3NyAxMC42OTAyQzguNTk1NzcgMTAuNDIzOSA4LjczNTk1IDEwLjE3MTUgOC45NzQyNyA5Ljk2MTIyQzkuMjI2NjEgMTAuMzI1NyA5LjY2MTE4IDEwLjY0ODEgMTAuMzQ4MSAxMC44NzI1TDExLjgzNDEgMTEuMzYzMUwxMS4wMDcgMTIuMTYyMkw5LjU0OTAzIDExLjY4NTVDOC44NzYxNCAxMS40NjEyIDguNTk1NzcgMTEuMTI0OCA4LjU5NTc3IDEwLjY5MDJaTTEyLjk5NzYgMTguMDVDMTYuMDgxNyAxNi4wMDMzIDE3LjczNTkgMTQuNjE1NCAxNy43MzU5IDEyLjkwNTJDMTcuNzM1OSAxMS43Njk2IDE3LjA2MyAxMS4xMzg4IDE1LjU3NzEgMTAuNjQ4MUwxNC40NTU2IDEwLjI2OTZMMTcuNTI1NyA3LjMyNTcyTDE2LjkwODggNi42NjY4NEwxNS45OTc2IDcuNDY1OUwxMS42OTM5IDYuMDUwMDJDMTAuMzYyMSA2LjQ4NDYgOC42Nzk4OCA3Ljc2MDMgOC42Nzk4OCA5LjAzNkM4LjY3OTg4IDkuMTc2MTggOC42OTM5IDkuMzE2MzcgOC43MzU5NSA5LjQ3MDU5QzcuNjI4NDcgMTAuMTAxNCA3LjE3OTg4IDEwLjY5MDIgNy4xNzk4OCAxMS40MTkxQzcuMTc5ODggMTIuMTA2MSA3LjU0NDM2IDEyLjc5MyA4LjcwNzkyIDEzLjE3MTVMOS42MzMxNCAxMy40Nzk5TDYuNDM2ODkgMTYuNTVMNy4wNTM3MSAxNy4yMDg5TDguMDQ5MDQgMTYuMjk3N0wxMi45OTc2IDE4LjA1WiIgZmlsbD0iIzAyMDUwQSIvPgo8L3N2Zz4=", BACKPACK_ICON = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBmaWxsPSIjRTMzRTNGIi8+CjxwYXRoIGQ9Ik0xNS41MTg2IDEzLjkyNzJDMTUuOTgxMSAxMy45MjcyIDE2LjIxMjcgMTMuOTI3MSAxNi4zNTY0IDE0LjA3MDhDMTYuNTAwMiAxNC4yMTQ1IDE2LjUgMTQuNDQ2MiAxNi41IDE0LjkwODdWMTUuNTY0QzE2LjUgMTYuNDg5MyAxNi41MDAyIDE2Ljk1MjIgMTYuMjEyOSAxNy4yMzk3QzE1LjkyNTMgMTcuNTI3MyAxNS40NjE4IDE3LjUyNzggMTQuNTM2MSAxNy41Mjc4SDkuNDYzODdDOC41Mzg0MiAxNy41Mjc4IDguMDc1NjcgMTcuNTI3MSA3Ljc4ODA5IDE3LjIzOTdDNy41MDA1NCAxNi45NTIyIDcuNSAxNi40ODk0IDcuNSAxNS41NjRWMTQuOTA4N0M3LjUgMTQuNDQ2MiA3LjQ5OTgyIDE0LjIxNDUgNy42NDM1NSAxNC4wNzA4QzcuNzg3MyAxMy45MjcxIDguMDE4OTEgMTMuOTI3MiA4LjQ4MTQ1IDEzLjkyNzJIMTUuNTE4NlpNMTIgNi4zNTg4OUMxNi41NjUzIDYuMzU4ODkgMTYuNSA5LjQwMjM4IDE2LjUgMTAuODU4OVYxMi40OTU2QzE2LjQ5OTkgMTIuNzY2NyAxNi4yNzk5IDEyLjk4NjggMTYuMDA4OCAxMi45ODY4SDcuOTkxMjFDNy43MjAxMiAxMi45ODY4IDcuNTAwMDYgMTIuNzY2NyA3LjUgMTIuNDk1NkM3LjUgMTIuNDk1NiA3LjUgMTIuMzE1MyA3LjUgMTAuODU4OUM3LjQ5OTk5IDkuNDAyMzkgNy40MzQ3OCA2LjM1ODkzIDEyIDYuMzU4ODlaTTEyIDcuNTE5MDRDMTEuMjMxOSA3LjUxOTEgMTAuNjA5NCA4LjE0MTU1IDEwLjYwOTQgOC45MDk2N0MxMC42MDk0IDkuNjc3NzggMTEuMjMxOSAxMC4zMDAyIDEyIDEwLjMwMDNDMTIuNzY4MiAxMC4zMDAzIDEzLjM5MDYgOS42Nzc4MiAxMy4zOTA2IDguOTA5NjdDMTMuMzkwNiA4LjE0MTUxIDEyLjc2ODIgNy41MTkwNCAxMiA3LjUxOTA0Wk0xMS45OTkgNC40NzIxN0MxMi45ODQxIDQuNDcyMjIgMTMuODQ2MiA0LjgxNjczIDE0LjA3NDIgNS4zNzc0NEMxNC4xMDg1IDUuNDczODcgMTQuMTI1OCA1LjUyMjIyIDE0LjA5NTcgNS41NTgxMUMxNC4wNjUyIDUuNTk0MDIgMTQuMDA1OCA1LjU4MzQyIDEzLjg4NzcgNS41NjIwMUMxMy41ODIyIDUuNTA2NjUgMTMuMTQ5MyA1LjQ2ODc3IDEyLjc2ODYgNS40NTc1MkMxMi41MjU4IDUuNDQ0NDggMTIuMjY5NSA1LjQzNzk5IDEyIDUuNDM3OTlDMTEuNzMwNSA1LjQzNzk5IDExLjQ3NDIgNS40NDQ0OCAxMS4yMzE0IDUuNDU3NTJDMTAuODQ5IDUuNDY4NzcgMTAuNDE0OSA1LjUwNjU4IDEwLjEwODQgNS41NjAwNkM5Ljk5MzM1IDUuNTgwMTMgOS45MzU2NSA1LjU5MDQ3IDkuOTA1MjcgNS41NTUxOEM5Ljg3NDk3IDUuNTE5MzUgOS44OTEyOCA1LjQ3MTQ0IDkuOTI0OCA1LjM3NjQ2QzEwLjE1MSA0LjgxNzQ4IDExLjAxNDIgNC40NzIxNyAxMS45OTkgNC40NzIxN1oiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPg==", WALLET_ICON_OVERRIDES = {
|
|
630
671
|
Phantom: PHANTOM_ICON,
|
|
631
672
|
Solflare: SOLFLARE_ICON,
|
|
632
673
|
Backpack: BACKPACK_ICON
|
|
@@ -658,7 +699,10 @@ function applyWalletIconOverride(wallet) {
|
|
|
658
699
|
}
|
|
659
700
|
|
|
660
701
|
// src/lib/wallet/detector.ts
|
|
661
|
-
var logger3 =
|
|
702
|
+
var logger3 = chunkSITQ4JWM_js.createLogger("WalletDetector");
|
|
703
|
+
function isSolanaWallet(wallet) {
|
|
704
|
+
return Array.isArray(wallet.chains) && wallet.chains.some((chain) => typeof chain == "string" && chain.startsWith("solana:"));
|
|
705
|
+
}
|
|
662
706
|
function hasFeature(wallet, featureName) {
|
|
663
707
|
return wallet.features != null && wallet.features[featureName] !== void 0;
|
|
664
708
|
}
|
|
@@ -680,7 +724,9 @@ function verifyWalletName(wallet, requestedName) {
|
|
|
680
724
|
var WalletDetector = class extends BaseCollaborator {
|
|
681
725
|
constructor(stateManager, eventEmitter, debug = false) {
|
|
682
726
|
super({ stateManager, eventEmitter, debug }, "WalletDetector");
|
|
683
|
-
|
|
727
|
+
chunkSITQ4JWM_js.__publicField(this, "unsubscribers", []);
|
|
728
|
+
/** Map from stable connector ID to Wallet reference (not stored in state) */
|
|
729
|
+
chunkSITQ4JWM_js.__publicField(this, "connectorRegistry", /* @__PURE__ */ new Map());
|
|
684
730
|
}
|
|
685
731
|
/**
|
|
686
732
|
* Initialize wallet detection (synchronous)
|
|
@@ -696,11 +742,10 @@ var WalletDetector = class extends BaseCollaborator {
|
|
|
696
742
|
if (!(typeof window > "u"))
|
|
697
743
|
try {
|
|
698
744
|
let walletsApi = getWalletsRegistry(), update = () => {
|
|
699
|
-
let
|
|
700
|
-
newCount !== previousCount && this.log("\u{1F50D} WalletDetector: found wallets:", newCount)
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
wallets: unique.map((w) => this.mapToWalletInfo(w))
|
|
745
|
+
let solanaWallets = walletsApi.get().filter(isSolanaWallet), unique = this.deduplicateWallets(solanaWallets), previousCount = this.getState().wallets.length, newCount = unique.length;
|
|
746
|
+
newCount !== previousCount && this.log("\u{1F50D} WalletDetector: found wallets:", newCount), this.updateConnectorRegistry(unique), this.stateManager.updateState({
|
|
747
|
+
wallets: unique.map((w) => this.mapToWalletInfo(w)),
|
|
748
|
+
connectors: unique.map((w) => this.mapToConnectorMetadata(w))
|
|
704
749
|
}), newCount !== previousCount && newCount > 0 && this.eventEmitter.emit({
|
|
705
750
|
type: "wallets:detected",
|
|
706
751
|
count: newCount,
|
|
@@ -778,20 +823,64 @@ var WalletDetector = class extends BaseCollaborator {
|
|
|
778
823
|
return null;
|
|
779
824
|
}
|
|
780
825
|
/**
|
|
781
|
-
* Get currently detected wallets
|
|
826
|
+
* Get currently detected wallets (legacy)
|
|
827
|
+
* @deprecated Use getConnectors() for vNext API
|
|
782
828
|
*/
|
|
783
829
|
getDetectedWallets() {
|
|
784
830
|
return this.getState().wallets;
|
|
785
831
|
}
|
|
786
832
|
/**
|
|
787
|
-
*
|
|
833
|
+
* Get all available connectors (vNext API)
|
|
834
|
+
*/
|
|
835
|
+
getConnectors() {
|
|
836
|
+
return this.getState().connectors;
|
|
837
|
+
}
|
|
838
|
+
/**
|
|
839
|
+
* Get a wallet by its stable connector ID (vNext API)
|
|
840
|
+
* Returns the Wallet reference for connection operations
|
|
841
|
+
*/
|
|
842
|
+
getConnectorById(connectorId) {
|
|
843
|
+
return this.connectorRegistry.get(connectorId);
|
|
844
|
+
}
|
|
845
|
+
/**
|
|
846
|
+
* Get connector metadata by ID
|
|
847
|
+
*/
|
|
848
|
+
getConnectorMetadata(connectorId) {
|
|
849
|
+
return this.getState().connectors.find((c) => c.id === connectorId);
|
|
850
|
+
}
|
|
851
|
+
/**
|
|
852
|
+
* Update the connector registry map
|
|
853
|
+
*/
|
|
854
|
+
updateConnectorRegistry(wallets) {
|
|
855
|
+
this.connectorRegistry.clear();
|
|
856
|
+
for (let wallet of wallets) {
|
|
857
|
+
let connectorId = createConnectorId(wallet.name);
|
|
858
|
+
this.connectorRegistry.set(connectorId, wallet);
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
/**
|
|
862
|
+
* Convert a Wallet Standard wallet to WalletConnectorMetadata (serializable)
|
|
863
|
+
*/
|
|
864
|
+
mapToConnectorMetadata(wallet) {
|
|
865
|
+
let walletWithIcon = applyWalletIconOverride(wallet), hasConnect = hasFeature(walletWithIcon, "standard:connect"), isSolana = isSolanaWallet(walletWithIcon), ready2 = hasConnect && isSolana;
|
|
866
|
+
return {
|
|
867
|
+
id: createConnectorId(wallet.name),
|
|
868
|
+
name: wallet.name,
|
|
869
|
+
icon: typeof walletWithIcon.icon == "string" ? walletWithIcon.icon : "",
|
|
870
|
+
ready: ready2,
|
|
871
|
+
chains: walletWithIcon.chains ?? [],
|
|
872
|
+
features: Object.keys(walletWithIcon.features ?? {})
|
|
873
|
+
};
|
|
874
|
+
}
|
|
875
|
+
/**
|
|
876
|
+
* Convert a Wallet Standard wallet to WalletInfo with capability checks (legacy)
|
|
788
877
|
*/
|
|
789
878
|
mapToWalletInfo(wallet) {
|
|
790
|
-
let walletWithIcon = applyWalletIconOverride(wallet), hasConnect = hasFeature(walletWithIcon, "standard:connect"),
|
|
879
|
+
let walletWithIcon = applyWalletIconOverride(wallet), hasConnect = hasFeature(walletWithIcon, "standard:connect"), isSolana = isSolanaWallet(walletWithIcon);
|
|
791
880
|
return {
|
|
792
881
|
wallet: walletWithIcon,
|
|
793
882
|
installed: true,
|
|
794
|
-
connectable: hasConnect &&
|
|
883
|
+
connectable: hasConnect && isSolana
|
|
795
884
|
};
|
|
796
885
|
}
|
|
797
886
|
/**
|
|
@@ -830,25 +919,241 @@ function getEventsFeature(wallet) {
|
|
|
830
919
|
var ConnectionManager = class extends BaseCollaborator {
|
|
831
920
|
constructor(stateManager, eventEmitter, walletStorage, debug = false) {
|
|
832
921
|
super({ stateManager, eventEmitter, debug }, "ConnectionManager");
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
922
|
+
chunkSITQ4JWM_js.__publicField(this, "walletStorage");
|
|
923
|
+
chunkSITQ4JWM_js.__publicField(this, "walletChangeUnsub", null);
|
|
924
|
+
chunkSITQ4JWM_js.__publicField(this, "pollTimer", null);
|
|
925
|
+
chunkSITQ4JWM_js.__publicField(this, "pollAttempts", 0);
|
|
926
|
+
chunkSITQ4JWM_js.__publicField(this, "connectAttemptId", 0);
|
|
927
|
+
chunkSITQ4JWM_js.__publicField(this, "pendingWallet", null);
|
|
928
|
+
chunkSITQ4JWM_js.__publicField(this, "pendingWalletName", null);
|
|
840
929
|
this.walletStorage = walletStorage;
|
|
841
930
|
}
|
|
931
|
+
// ========================================================================
|
|
932
|
+
// vNext Connection Methods (connector-id based, silent-first)
|
|
933
|
+
// ========================================================================
|
|
934
|
+
/**
|
|
935
|
+
* Connect to a wallet using the vNext API with silent-first support.
|
|
936
|
+
*
|
|
937
|
+
* @param wallet - Wallet Standard wallet instance
|
|
938
|
+
* @param connectorId - Stable connector identifier
|
|
939
|
+
* @param options - Connection options (silent mode, preferred account, etc.)
|
|
940
|
+
*/
|
|
941
|
+
async connectWallet(wallet, connectorId, options) {
|
|
942
|
+
if (typeof window > "u") return;
|
|
943
|
+
let attemptId = ++this.connectAttemptId;
|
|
944
|
+
this.pendingWallet = wallet, this.pendingWalletName = wallet.name;
|
|
945
|
+
let { silent = false, allowInteractiveFallback = true, preferredAccount } = options ?? {};
|
|
946
|
+
this.updateWalletStatus({
|
|
947
|
+
status: "connecting",
|
|
948
|
+
connectorId
|
|
949
|
+
}), this.stateManager.updateState({ connecting: true }, true), this.eventEmitter.emit({
|
|
950
|
+
type: "connecting",
|
|
951
|
+
wallet: wallet.name,
|
|
952
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
953
|
+
});
|
|
954
|
+
try {
|
|
955
|
+
let connect = getConnectFeature(wallet);
|
|
956
|
+
if (!connect) throw new Error(`Wallet ${wallet.name} does not support standard connect`);
|
|
957
|
+
let result;
|
|
958
|
+
if (silent)
|
|
959
|
+
try {
|
|
960
|
+
if (result = await connect({ silent: true }), attemptId !== this.connectAttemptId) throw new Error("Connection cancelled");
|
|
961
|
+
let hasAccounts = result.accounts.length > 0 || wallet.accounts.length > 0;
|
|
962
|
+
if (!hasAccounts && allowInteractiveFallback)
|
|
963
|
+
this.log("Silent connect returned no accounts, trying interactive..."), result = await connect({ silent: false });
|
|
964
|
+
else if (!hasAccounts)
|
|
965
|
+
throw new Error("Silent connection failed: no accounts returned");
|
|
966
|
+
} catch (silentError) {
|
|
967
|
+
if (attemptId !== this.connectAttemptId) throw new Error("Connection cancelled");
|
|
968
|
+
if (allowInteractiveFallback)
|
|
969
|
+
this.log("Silent connect failed, trying interactive...", silentError), result = await connect({ silent: false });
|
|
970
|
+
else
|
|
971
|
+
throw silentError;
|
|
972
|
+
}
|
|
973
|
+
else
|
|
974
|
+
result = await connect({ silent: false });
|
|
975
|
+
if (attemptId !== this.connectAttemptId) throw new Error("Connection cancelled");
|
|
976
|
+
let walletAccounts = wallet.accounts, accountMap = /* @__PURE__ */ new Map();
|
|
977
|
+
for (let a of [...walletAccounts, ...result.accounts]) accountMap.set(a.address, a);
|
|
978
|
+
let sessionAccounts = Array.from(accountMap.values()).map((a) => ({
|
|
979
|
+
address: a.address,
|
|
980
|
+
label: a.label,
|
|
981
|
+
account: a
|
|
982
|
+
})), legacyAccounts = sessionAccounts.map((a) => this.toAccountInfo(a.account)), selectedAccount = sessionAccounts[0];
|
|
983
|
+
if (preferredAccount) {
|
|
984
|
+
let preferred = sessionAccounts.find((a) => a.address === preferredAccount);
|
|
985
|
+
preferred && (selectedAccount = preferred);
|
|
986
|
+
}
|
|
987
|
+
let session = this.createSession(wallet, connectorId, sessionAccounts, selectedAccount);
|
|
988
|
+
this.updateWalletStatus({
|
|
989
|
+
status: "connected",
|
|
990
|
+
session
|
|
991
|
+
}), this.stateManager.updateState(
|
|
992
|
+
{
|
|
993
|
+
selectedWallet: wallet,
|
|
994
|
+
connected: true,
|
|
995
|
+
connecting: false,
|
|
996
|
+
accounts: legacyAccounts,
|
|
997
|
+
selectedAccount: selectedAccount?.address ?? null
|
|
998
|
+
},
|
|
999
|
+
true
|
|
1000
|
+
), this.log("\u2705 Connection successful (vNext)", {
|
|
1001
|
+
connectorId,
|
|
1002
|
+
selectedAccount: selectedAccount?.address,
|
|
1003
|
+
accountsCount: sessionAccounts.length
|
|
1004
|
+
}), selectedAccount && this.eventEmitter.emit({
|
|
1005
|
+
type: "wallet:connected",
|
|
1006
|
+
wallet: wallet.name,
|
|
1007
|
+
account: selectedAccount.address,
|
|
1008
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1009
|
+
}), this.walletStorage && (!("isAvailable" in this.walletStorage) || typeof this.walletStorage.isAvailable != "function" || this.walletStorage.isAvailable()) && this.walletStorage.set(wallet.name), this.subscribeToWalletEventsVNext(wallet, connectorId);
|
|
1010
|
+
} catch (e) {
|
|
1011
|
+
if (attemptId !== this.connectAttemptId) throw e;
|
|
1012
|
+
let errorMessage = e instanceof Error ? e.message : String(e), error = e instanceof Error ? e : new Error(errorMessage);
|
|
1013
|
+
throw this.updateWalletStatus({
|
|
1014
|
+
status: "error",
|
|
1015
|
+
error,
|
|
1016
|
+
connectorId,
|
|
1017
|
+
recoverable: this.isRecoverableError(error)
|
|
1018
|
+
}), this.stateManager.updateState(
|
|
1019
|
+
{
|
|
1020
|
+
selectedWallet: null,
|
|
1021
|
+
connected: false,
|
|
1022
|
+
connecting: false,
|
|
1023
|
+
accounts: [],
|
|
1024
|
+
selectedAccount: null
|
|
1025
|
+
},
|
|
1026
|
+
true
|
|
1027
|
+
), this.eventEmitter.emit({
|
|
1028
|
+
type: "connection:failed",
|
|
1029
|
+
wallet: wallet.name,
|
|
1030
|
+
error: errorMessage,
|
|
1031
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1032
|
+
}), e;
|
|
1033
|
+
} finally {
|
|
1034
|
+
this.pendingWallet === wallet && (this.pendingWallet = null, this.pendingWalletName = null);
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
/**
|
|
1038
|
+
* Create a WalletSession object
|
|
1039
|
+
*/
|
|
1040
|
+
createSession(wallet, connectorId, accounts, selectedAccount) {
|
|
1041
|
+
let listeners = /* @__PURE__ */ new Set();
|
|
1042
|
+
return {
|
|
1043
|
+
connectorId,
|
|
1044
|
+
accounts,
|
|
1045
|
+
selectedAccount,
|
|
1046
|
+
onAccountsChanged: (listener) => (listeners.add(listener), () => listeners.delete(listener)),
|
|
1047
|
+
selectAccount: async (address) => {
|
|
1048
|
+
if (accounts.find((a) => a.address === address))
|
|
1049
|
+
return this.selectAccount(address);
|
|
1050
|
+
}
|
|
1051
|
+
};
|
|
1052
|
+
}
|
|
842
1053
|
/**
|
|
843
|
-
*
|
|
1054
|
+
* Update wallet status in state
|
|
1055
|
+
*/
|
|
1056
|
+
updateWalletStatus(status) {
|
|
1057
|
+
this.stateManager.updateState({ wallet: status });
|
|
1058
|
+
}
|
|
1059
|
+
/**
|
|
1060
|
+
* Subscribe to wallet events (vNext version with improved account change handling)
|
|
1061
|
+
*/
|
|
1062
|
+
subscribeToWalletEventsVNext(wallet, connectorId) {
|
|
1063
|
+
this.walletChangeUnsub && (this.walletChangeUnsub(), this.walletChangeUnsub = null), this.stopPollingWalletAccounts();
|
|
1064
|
+
let eventsOn = getEventsFeature(wallet);
|
|
1065
|
+
if (!eventsOn) {
|
|
1066
|
+
this.startPollingWalletAccountsVNext(wallet, connectorId);
|
|
1067
|
+
return;
|
|
1068
|
+
}
|
|
1069
|
+
try {
|
|
1070
|
+
this.walletChangeUnsub = eventsOn("change", (properties) => {
|
|
1071
|
+
let changeAccounts = properties?.accounts ?? [];
|
|
1072
|
+
this.handleAccountsChanged(changeAccounts, connectorId, wallet);
|
|
1073
|
+
});
|
|
1074
|
+
} catch {
|
|
1075
|
+
this.startPollingWalletAccountsVNext(wallet, connectorId);
|
|
1076
|
+
}
|
|
1077
|
+
}
|
|
1078
|
+
/**
|
|
1079
|
+
* Handle accounts changed event with proper validation
|
|
1080
|
+
*/
|
|
1081
|
+
handleAccountsChanged(newAccounts, connectorId, wallet) {
|
|
1082
|
+
let state = this.getState();
|
|
1083
|
+
if (newAccounts.length === 0) {
|
|
1084
|
+
this.log("No accounts available, disconnecting..."), this.disconnect();
|
|
1085
|
+
return;
|
|
1086
|
+
}
|
|
1087
|
+
let sessionAccounts = newAccounts.map((a) => ({
|
|
1088
|
+
address: a.address,
|
|
1089
|
+
label: a.label,
|
|
1090
|
+
account: a
|
|
1091
|
+
})), legacyAccounts = sessionAccounts.map((a) => this.toAccountInfo(a.account)), currentSelected = state.selectedAccount, selectedAccount = sessionAccounts.find((a) => a.address === currentSelected);
|
|
1092
|
+
if (selectedAccount || (selectedAccount = sessionAccounts[0], this.eventEmitter.emit({
|
|
1093
|
+
type: "account:changed",
|
|
1094
|
+
account: selectedAccount.address,
|
|
1095
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1096
|
+
})), state.wallet.status === "connected") {
|
|
1097
|
+
let session = this.createSession(wallet, connectorId, sessionAccounts, selectedAccount);
|
|
1098
|
+
this.updateWalletStatus({
|
|
1099
|
+
status: "connected",
|
|
1100
|
+
session
|
|
1101
|
+
});
|
|
1102
|
+
}
|
|
1103
|
+
this.stateManager.updateState({
|
|
1104
|
+
accounts: legacyAccounts,
|
|
1105
|
+
selectedAccount: selectedAccount.address
|
|
1106
|
+
});
|
|
1107
|
+
}
|
|
1108
|
+
/**
|
|
1109
|
+
* Start polling wallet accounts (vNext version)
|
|
1110
|
+
*/
|
|
1111
|
+
startPollingWalletAccountsVNext(wallet, connectorId) {
|
|
1112
|
+
if (this.pollTimer) return;
|
|
1113
|
+
this.pollAttempts = 0;
|
|
1114
|
+
let poll = () => {
|
|
1115
|
+
if (this.pollAttempts >= 20) {
|
|
1116
|
+
this.stopPollingWalletAccounts(), this.log("Stopped wallet polling after max attempts");
|
|
1117
|
+
return;
|
|
1118
|
+
}
|
|
1119
|
+
try {
|
|
1120
|
+
let walletAccounts = wallet.accounts;
|
|
1121
|
+
walletAccounts.length > 0 && (this.handleAccountsChanged(walletAccounts, connectorId, wallet), this.pollAttempts = 0);
|
|
1122
|
+
} catch (error) {
|
|
1123
|
+
this.log("Wallet polling error:", error);
|
|
1124
|
+
}
|
|
1125
|
+
this.pollAttempts++;
|
|
1126
|
+
let intervalIndex = Math.min(this.pollAttempts, POLL_INTERVALS_MS.length - 1), interval = POLL_INTERVALS_MS[intervalIndex];
|
|
1127
|
+
this.pollTimer = setTimeout(poll, interval);
|
|
1128
|
+
};
|
|
1129
|
+
poll();
|
|
1130
|
+
}
|
|
1131
|
+
/**
|
|
1132
|
+
* Check if an error is recoverable
|
|
1133
|
+
*/
|
|
1134
|
+
isRecoverableError(error) {
|
|
1135
|
+
let message = error.message.toLowerCase();
|
|
1136
|
+
return message.includes("user rejected") || message.includes("user denied") || message.includes("cancelled") || message.includes("canceled");
|
|
1137
|
+
}
|
|
1138
|
+
// ========================================================================
|
|
1139
|
+
// Legacy Connection Methods (kept for backwards compatibility)
|
|
1140
|
+
// ========================================================================
|
|
1141
|
+
/**
|
|
1142
|
+
* Connect to a wallet (legacy API)
|
|
1143
|
+
* @deprecated Use connectWallet() instead
|
|
844
1144
|
*/
|
|
845
1145
|
async connect(wallet, walletName) {
|
|
846
1146
|
if (typeof window > "u") return;
|
|
847
1147
|
let name = walletName || wallet.name, attemptId = ++this.connectAttemptId;
|
|
848
|
-
this.pendingWallet = wallet, this.pendingWalletName = name
|
|
1148
|
+
this.pendingWallet = wallet, this.pendingWalletName = name;
|
|
1149
|
+
let connectorId = createConnectorId(name);
|
|
1150
|
+
this.eventEmitter.emit({
|
|
849
1151
|
type: "connecting",
|
|
850
1152
|
wallet: name,
|
|
851
1153
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1154
|
+
}), this.updateWalletStatus({
|
|
1155
|
+
status: "connecting",
|
|
1156
|
+
connectorId
|
|
852
1157
|
}), this.stateManager.updateState({ connecting: true }, true);
|
|
853
1158
|
try {
|
|
854
1159
|
let connect = getConnectFeature(wallet);
|
|
@@ -858,8 +1163,18 @@ var ConnectionManager = class extends BaseCollaborator {
|
|
|
858
1163
|
throw new Error("Connection cancelled");
|
|
859
1164
|
let walletAccounts = wallet.accounts, accountMap = /* @__PURE__ */ new Map();
|
|
860
1165
|
for (let a of [...walletAccounts, ...result.accounts]) accountMap.set(a.address, a);
|
|
861
|
-
let
|
|
862
|
-
|
|
1166
|
+
let sessionAccounts = Array.from(accountMap.values()).map((a) => ({
|
|
1167
|
+
address: a.address,
|
|
1168
|
+
label: a.label,
|
|
1169
|
+
account: a
|
|
1170
|
+
}));
|
|
1171
|
+
if (sessionAccounts.length === 0)
|
|
1172
|
+
throw new Error(`Wallet ${name} connected but returned no accounts`);
|
|
1173
|
+
let accounts = sessionAccounts.map((a) => this.toAccountInfo(a.account)), state = this.getState(), previouslySelected = state.selectedAccount, previousAddresses = new Set(state.accounts.map((a) => a.address)), selected = accounts.find((a) => !previousAddresses.has(a.address))?.address ?? previouslySelected ?? accounts[0]?.address ?? null, selectedSessionAccount = (selected ? sessionAccounts.find((a) => a.address === selected) : void 0) ?? sessionAccounts[0], session = this.createSession(wallet, connectorId, sessionAccounts, selectedSessionAccount);
|
|
1174
|
+
this.updateWalletStatus({
|
|
1175
|
+
status: "connected",
|
|
1176
|
+
session
|
|
1177
|
+
}), this.stateManager.updateState(
|
|
863
1178
|
{
|
|
864
1179
|
selectedWallet: wallet,
|
|
865
1180
|
connected: true,
|
|
@@ -885,7 +1200,7 @@ var ConnectionManager = class extends BaseCollaborator {
|
|
|
885
1200
|
} catch (e) {
|
|
886
1201
|
if (attemptId !== this.connectAttemptId)
|
|
887
1202
|
throw e;
|
|
888
|
-
let errorMessage = e instanceof Error ? e.message : String(e);
|
|
1203
|
+
let errorMessage = e instanceof Error ? e.message : String(e), error = e instanceof Error ? e : new Error(errorMessage);
|
|
889
1204
|
throw this.eventEmitter.emit({
|
|
890
1205
|
type: "connection:failed",
|
|
891
1206
|
wallet: name,
|
|
@@ -893,9 +1208,14 @@ var ConnectionManager = class extends BaseCollaborator {
|
|
|
893
1208
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
894
1209
|
}), this.eventEmitter.emit({
|
|
895
1210
|
type: "error",
|
|
896
|
-
error
|
|
1211
|
+
error,
|
|
897
1212
|
context: "wallet-connection",
|
|
898
1213
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1214
|
+
}), this.updateWalletStatus({
|
|
1215
|
+
status: "error",
|
|
1216
|
+
error,
|
|
1217
|
+
connectorId,
|
|
1218
|
+
recoverable: this.isRecoverableError(error)
|
|
899
1219
|
}), this.stateManager.updateState(
|
|
900
1220
|
{
|
|
901
1221
|
selectedWallet: null,
|
|
@@ -916,7 +1236,7 @@ var ConnectionManager = class extends BaseCollaborator {
|
|
|
916
1236
|
async disconnect() {
|
|
917
1237
|
this.connectAttemptId++, this.walletChangeUnsub && (this.walletChangeUnsub(), this.walletChangeUnsub = null), this.stopPollingWalletAccounts();
|
|
918
1238
|
let wallet = this.getState().selectedWallet ?? this.pendingWallet;
|
|
919
|
-
if (this.pendingWallet = null, this.pendingWalletName = null, this.stateManager.updateState(
|
|
1239
|
+
if (this.pendingWallet = null, this.pendingWalletName = null, this.updateWalletStatus(INITIAL_WALLET_STATUS), this.stateManager.updateState(
|
|
920
1240
|
{
|
|
921
1241
|
selectedWallet: null,
|
|
922
1242
|
connected: false,
|
|
@@ -1042,17 +1362,50 @@ var ConnectionManager = class extends BaseCollaborator {
|
|
|
1042
1362
|
};
|
|
1043
1363
|
|
|
1044
1364
|
// src/lib/wallet/auto-connector.ts
|
|
1045
|
-
var logger4 =
|
|
1046
|
-
constructor(walletDetector, connectionManager, stateManager, walletStorage, debug = false) {
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1365
|
+
var logger4 = chunkSITQ4JWM_js.createLogger("AutoConnector"), MIN_ADDRESS_LENGTH = 30, AutoConnector = class {
|
|
1366
|
+
constructor(walletDetector, connectionManager, stateManager, walletStorage, debug = false, walletStateStorage) {
|
|
1367
|
+
chunkSITQ4JWM_js.__publicField(this, "walletDetector");
|
|
1368
|
+
chunkSITQ4JWM_js.__publicField(this, "connectionManager");
|
|
1369
|
+
chunkSITQ4JWM_js.__publicField(this, "stateManager");
|
|
1370
|
+
/** Legacy wallet name storage */
|
|
1371
|
+
chunkSITQ4JWM_js.__publicField(this, "walletStorage");
|
|
1372
|
+
/** vNext wallet state storage (connector ID + account) */
|
|
1373
|
+
chunkSITQ4JWM_js.__publicField(this, "walletStateStorage");
|
|
1374
|
+
chunkSITQ4JWM_js.__publicField(this, "debug");
|
|
1375
|
+
this.walletDetector = walletDetector, this.connectionManager = connectionManager, this.stateManager = stateManager, this.walletStorage = walletStorage, this.walletStateStorage = walletStateStorage, this.debug = debug;
|
|
1053
1376
|
}
|
|
1054
1377
|
async attemptAutoConnect() {
|
|
1055
|
-
return await this.attemptInstantConnect() ? true : (await this.attemptStandardConnect(), this.stateManager.getSnapshot().connected);
|
|
1378
|
+
return this.walletStateStorage && await this.attemptVNextAutoConnect() || await this.attemptInstantConnect() ? true : (await this.attemptStandardConnect(), this.stateManager.getSnapshot().connected);
|
|
1379
|
+
}
|
|
1380
|
+
/**
|
|
1381
|
+
* vNext auto-connect using stored connector ID with silent-first approach.
|
|
1382
|
+
* This won't prompt the user unless they explicitly initiated the connect.
|
|
1383
|
+
*/
|
|
1384
|
+
async attemptVNextAutoConnect() {
|
|
1385
|
+
let walletState = this.walletStateStorage?.get();
|
|
1386
|
+
if (!walletState || !walletState.autoConnect)
|
|
1387
|
+
return this.debug && logger4.debug("vNext auto-connect: No stored wallet state or autoConnect disabled"), false;
|
|
1388
|
+
let { connectorId, lastAccount } = walletState;
|
|
1389
|
+
await ready;
|
|
1390
|
+
let wallet = this.walletDetector.getConnectorById(connectorId);
|
|
1391
|
+
if (!wallet)
|
|
1392
|
+
return this.debug && logger4.debug("vNext auto-connect: Connector not found", { connectorId }), false;
|
|
1393
|
+
try {
|
|
1394
|
+
return this.debug && logger4.info("vNext auto-connect: Attempting silent connect", {
|
|
1395
|
+
connectorId,
|
|
1396
|
+
lastAccount
|
|
1397
|
+
}), await this.connectionManager.connectWallet(wallet, connectorId, {
|
|
1398
|
+
silent: true,
|
|
1399
|
+
allowInteractiveFallback: false,
|
|
1400
|
+
// Don't prompt on auto-connect
|
|
1401
|
+
preferredAccount: lastAccount
|
|
1402
|
+
}), this.debug && logger4.info("vNext auto-connect: Silent connect successful", { connectorId }), true;
|
|
1403
|
+
} catch (error) {
|
|
1404
|
+
return this.debug && logger4.debug("vNext auto-connect: Silent connect failed (expected for first-time or revoked)", {
|
|
1405
|
+
connectorId,
|
|
1406
|
+
error: error instanceof Error ? error.message : error
|
|
1407
|
+
}), false;
|
|
1408
|
+
}
|
|
1056
1409
|
}
|
|
1057
1410
|
async attemptInstantConnect() {
|
|
1058
1411
|
let storedWalletName = this.walletStorage?.get();
|
|
@@ -1202,7 +1555,7 @@ var logger4 = chunk64LV76OK_js.createLogger("AutoConnector"), MIN_ADDRESS_LENGTH
|
|
|
1202
1555
|
var ClusterManager = class extends BaseCollaborator {
|
|
1203
1556
|
constructor(stateManager, eventEmitter, clusterStorage, config, debug = false) {
|
|
1204
1557
|
super({ stateManager, eventEmitter, debug }, "ClusterManager");
|
|
1205
|
-
|
|
1558
|
+
chunkSITQ4JWM_js.__publicField(this, "clusterStorage");
|
|
1206
1559
|
if (this.clusterStorage = clusterStorage, config) {
|
|
1207
1560
|
let clusters = config.clusters ?? [], initialClusterId = this.clusterStorage?.get() ?? config.initialCluster ?? "solana:mainnet", initialCluster = clusters.find((c) => c.id === initialClusterId) ?? clusters[0] ?? null;
|
|
1208
1561
|
this.stateManager.updateState({
|
|
@@ -1217,7 +1570,7 @@ var ClusterManager = class extends BaseCollaborator {
|
|
|
1217
1570
|
async setCluster(clusterId) {
|
|
1218
1571
|
let state = this.getState(), previousClusterId = state.cluster?.id || null, cluster = state.clusters.find((c) => c.id === clusterId);
|
|
1219
1572
|
if (!cluster)
|
|
1220
|
-
throw
|
|
1573
|
+
throw chunkSITQ4JWM_js.Errors.clusterNotFound(
|
|
1221
1574
|
clusterId,
|
|
1222
1575
|
state.clusters.map((c) => c.id)
|
|
1223
1576
|
);
|
|
@@ -1246,9 +1599,9 @@ var ClusterManager = class extends BaseCollaborator {
|
|
|
1246
1599
|
var TransactionTracker = class extends BaseCollaborator {
|
|
1247
1600
|
constructor(stateManager, eventEmitter, maxTransactions = 20, debug = false) {
|
|
1248
1601
|
super({ stateManager, eventEmitter, debug }, "TransactionTracker");
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1602
|
+
chunkSITQ4JWM_js.__publicField(this, "transactions", []);
|
|
1603
|
+
chunkSITQ4JWM_js.__publicField(this, "totalTransactions", 0);
|
|
1604
|
+
chunkSITQ4JWM_js.__publicField(this, "maxTransactions");
|
|
1252
1605
|
this.maxTransactions = maxTransactions;
|
|
1253
1606
|
}
|
|
1254
1607
|
/**
|
|
@@ -1302,10 +1655,10 @@ var TransactionTracker = class extends BaseCollaborator {
|
|
|
1302
1655
|
// src/lib/health/health-monitor.ts
|
|
1303
1656
|
var HealthMonitor = class {
|
|
1304
1657
|
constructor(stateManager, walletStorage, clusterStorage, isInitialized) {
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1658
|
+
chunkSITQ4JWM_js.__publicField(this, "stateManager");
|
|
1659
|
+
chunkSITQ4JWM_js.__publicField(this, "walletStorage");
|
|
1660
|
+
chunkSITQ4JWM_js.__publicField(this, "clusterStorage");
|
|
1661
|
+
chunkSITQ4JWM_js.__publicField(this, "isInitialized");
|
|
1309
1662
|
this.stateManager = stateManager, this.walletStorage = walletStorage, this.clusterStorage = clusterStorage, this.isInitialized = isInitialized ?? (() => true);
|
|
1310
1663
|
}
|
|
1311
1664
|
/**
|
|
@@ -1357,22 +1710,26 @@ var HealthMonitor = class {
|
|
|
1357
1710
|
};
|
|
1358
1711
|
|
|
1359
1712
|
// src/lib/core/connector-client.ts
|
|
1360
|
-
var logger5 =
|
|
1713
|
+
var logger5 = chunkSITQ4JWM_js.createLogger("ConnectorClient"), ConnectorClient = class {
|
|
1361
1714
|
constructor(config = {}) {
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1715
|
+
chunkSITQ4JWM_js.__publicField(this, "stateManager");
|
|
1716
|
+
chunkSITQ4JWM_js.__publicField(this, "eventEmitter");
|
|
1717
|
+
chunkSITQ4JWM_js.__publicField(this, "walletDetector");
|
|
1718
|
+
chunkSITQ4JWM_js.__publicField(this, "connectionManager");
|
|
1719
|
+
chunkSITQ4JWM_js.__publicField(this, "autoConnector");
|
|
1720
|
+
chunkSITQ4JWM_js.__publicField(this, "clusterManager");
|
|
1721
|
+
chunkSITQ4JWM_js.__publicField(this, "transactionTracker");
|
|
1722
|
+
chunkSITQ4JWM_js.__publicField(this, "debugMetrics");
|
|
1723
|
+
chunkSITQ4JWM_js.__publicField(this, "healthMonitor");
|
|
1724
|
+
chunkSITQ4JWM_js.__publicField(this, "initialized", false);
|
|
1725
|
+
chunkSITQ4JWM_js.__publicField(this, "config");
|
|
1726
|
+
chunkSITQ4JWM_js.__publicField(this, "walletConnectRegistration", null);
|
|
1374
1727
|
this.config = config;
|
|
1375
1728
|
let initialState = {
|
|
1729
|
+
// vNext wallet status
|
|
1730
|
+
wallet: INITIAL_WALLET_STATUS,
|
|
1731
|
+
connectors: [],
|
|
1732
|
+
// Legacy fields (for backwards compatibility)
|
|
1376
1733
|
wallets: [],
|
|
1377
1734
|
selectedWallet: null,
|
|
1378
1735
|
connected: false,
|
|
@@ -1431,17 +1788,55 @@ var logger5 = chunk64LV76OK_js.createLogger("ConnectorClient"), ConnectorClient
|
|
|
1431
1788
|
async initializeWalletConnect() {
|
|
1432
1789
|
if (this.config.walletConnect?.enabled)
|
|
1433
1790
|
try {
|
|
1434
|
-
let { registerWalletConnectWallet } = await import('./walletconnect-
|
|
1791
|
+
let { registerWalletConnectWallet } = await import('./walletconnect-447EY3OJ.js');
|
|
1435
1792
|
this.walletConnectRegistration = await registerWalletConnectWallet(this.config.walletConnect), this.config.debug && logger5.info("WalletConnect wallet registered successfully");
|
|
1436
1793
|
} catch (error) {
|
|
1437
1794
|
this.config.debug && logger5.error("Failed to register WalletConnect wallet", { error });
|
|
1438
1795
|
}
|
|
1439
1796
|
}
|
|
1797
|
+
// ========================================================================
|
|
1798
|
+
// vNext Wallet Actions (connector-id based)
|
|
1799
|
+
// ========================================================================
|
|
1800
|
+
/**
|
|
1801
|
+
* Connect to a wallet using its stable connector ID.
|
|
1802
|
+
* This is the recommended way to connect in vNext.
|
|
1803
|
+
*
|
|
1804
|
+
* @param connectorId - Stable connector identifier
|
|
1805
|
+
* @param options - Connection options (silent mode, preferred account, etc.)
|
|
1806
|
+
*/
|
|
1807
|
+
async connectWallet(connectorId, options) {
|
|
1808
|
+
let connector = this.walletDetector.getConnectorById(connectorId);
|
|
1809
|
+
if (!connector)
|
|
1810
|
+
throw new Error(`Connector ${connectorId} not found`);
|
|
1811
|
+
await this.connectionManager.connectWallet(connector, connectorId, options);
|
|
1812
|
+
}
|
|
1813
|
+
/**
|
|
1814
|
+
* Disconnect the current wallet session.
|
|
1815
|
+
* This is the vNext equivalent of disconnect().
|
|
1816
|
+
*/
|
|
1817
|
+
async disconnectWallet() {
|
|
1818
|
+
await this.connectionManager.disconnect();
|
|
1819
|
+
}
|
|
1820
|
+
/**
|
|
1821
|
+
* Get a connector by its ID (for advanced use cases).
|
|
1822
|
+
*/
|
|
1823
|
+
getConnector(connectorId) {
|
|
1824
|
+
return this.walletDetector.getConnectorById(connectorId);
|
|
1825
|
+
}
|
|
1826
|
+
// ========================================================================
|
|
1827
|
+
// Legacy Actions (kept for backwards compatibility)
|
|
1828
|
+
// ========================================================================
|
|
1829
|
+
/**
|
|
1830
|
+
* @deprecated Use `connectWallet(connectorId)` instead.
|
|
1831
|
+
*/
|
|
1440
1832
|
async select(walletName) {
|
|
1441
1833
|
let wallet = this.stateManager.getSnapshot().wallets.find((w) => w.wallet.name === walletName)?.wallet;
|
|
1442
1834
|
if (!wallet) throw new Error(`Wallet ${walletName} not found`);
|
|
1443
1835
|
await this.connectionManager.connect(wallet, walletName);
|
|
1444
1836
|
}
|
|
1837
|
+
/**
|
|
1838
|
+
* @deprecated Use `disconnectWallet()` instead.
|
|
1839
|
+
*/
|
|
1445
1840
|
async disconnect() {
|
|
1446
1841
|
await this.connectionManager.disconnect();
|
|
1447
1842
|
}
|
|
@@ -1539,284 +1934,13 @@ var logger5 = chunk64LV76OK_js.createLogger("ConnectorClient"), ConnectorClient
|
|
|
1539
1934
|
}), this.walletDetector.destroy(), this.eventEmitter.offAll(), this.stateManager.clear();
|
|
1540
1935
|
}
|
|
1541
1936
|
};
|
|
1542
|
-
var logger6 =
|
|
1543
|
-
static log(error, errorInfo, context) {
|
|
1544
|
-
if (process.env.NODE_ENV === "development" && logger6.error(error.message, {
|
|
1545
|
-
error,
|
|
1546
|
-
errorInfo,
|
|
1547
|
-
context
|
|
1548
|
-
}), process.env.NODE_ENV === "production" && typeof window < "u")
|
|
1549
|
-
try {
|
|
1550
|
-
let gtag = window.gtag;
|
|
1551
|
-
typeof gtag == "function" && gtag("event", "exception", {
|
|
1552
|
-
description: error.message,
|
|
1553
|
-
fatal: false,
|
|
1554
|
-
custom_map: { error_type: "wallet_error", ...context }
|
|
1555
|
-
});
|
|
1556
|
-
} catch {
|
|
1557
|
-
}
|
|
1558
|
-
}
|
|
1559
|
-
};
|
|
1560
|
-
function classifyError(error) {
|
|
1561
|
-
if (chunk64LV76OK_js.isConnectorError(error))
|
|
1562
|
-
return {
|
|
1563
|
-
...error,
|
|
1564
|
-
type: {
|
|
1565
|
-
WALLET_NOT_CONNECTED: "CONNECTION_FAILED" /* CONNECTION_FAILED */,
|
|
1566
|
-
WALLET_NOT_FOUND: "WALLET_NOT_FOUND" /* WALLET_NOT_FOUND */,
|
|
1567
|
-
CONNECTION_FAILED: "CONNECTION_FAILED" /* CONNECTION_FAILED */,
|
|
1568
|
-
USER_REJECTED: "USER_REJECTED" /* USER_REJECTED */,
|
|
1569
|
-
RPC_ERROR: "NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
1570
|
-
NETWORK_TIMEOUT: "NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
1571
|
-
SIGNING_FAILED: "TRANSACTION_FAILED" /* TRANSACTION_FAILED */,
|
|
1572
|
-
SEND_FAILED: "TRANSACTION_FAILED" /* TRANSACTION_FAILED */
|
|
1573
|
-
}[error.code] || "UNKNOWN_ERROR" /* UNKNOWN_ERROR */,
|
|
1574
|
-
recoverable: error.recoverable,
|
|
1575
|
-
context: error.context
|
|
1576
|
-
};
|
|
1577
|
-
let walletError = error;
|
|
1578
|
-
if (walletError.type) return walletError;
|
|
1579
|
-
let type = "UNKNOWN_ERROR" /* UNKNOWN_ERROR */, recoverable = false;
|
|
1580
|
-
return error.message.includes("User rejected") || error.message.includes("User denied") ? (type = "USER_REJECTED" /* USER_REJECTED */, recoverable = true) : error.message.includes("Insufficient funds") ? (type = "INSUFFICIENT_FUNDS" /* INSUFFICIENT_FUNDS */, recoverable = false) : error.message.includes("Network") || error.message.includes("fetch") ? (type = "NETWORK_ERROR" /* NETWORK_ERROR */, recoverable = true) : error.message.includes("Wallet not found") || error.message.includes("not installed") ? (type = "WALLET_NOT_FOUND" /* WALLET_NOT_FOUND */, recoverable = true) : (error.message.includes("Failed to connect") || error.message.includes("Connection")) && (type = "CONNECTION_FAILED" /* CONNECTION_FAILED */, recoverable = true), {
|
|
1581
|
-
...error,
|
|
1582
|
-
type,
|
|
1583
|
-
recoverable,
|
|
1584
|
-
context: { originalMessage: error.message }
|
|
1585
|
-
};
|
|
1586
|
-
}
|
|
1587
|
-
var ConnectorErrorBoundary = class extends react.Component {
|
|
1588
|
-
constructor(props) {
|
|
1589
|
-
super(props);
|
|
1590
|
-
chunk64LV76OK_js.__publicField(this, "retryTimeouts", /* @__PURE__ */ new Set());
|
|
1591
|
-
chunk64LV76OK_js.__publicField(this, "retry", () => {
|
|
1592
|
-
let { maxRetries = 3 } = this.props;
|
|
1593
|
-
this.state.retryCount >= maxRetries || this.setState((prevState) => ({
|
|
1594
|
-
hasError: false,
|
|
1595
|
-
error: null,
|
|
1596
|
-
errorInfo: null,
|
|
1597
|
-
retryCount: prevState.retryCount + 1
|
|
1598
|
-
}));
|
|
1599
|
-
});
|
|
1600
|
-
this.state = {
|
|
1601
|
-
hasError: false,
|
|
1602
|
-
error: null,
|
|
1603
|
-
errorInfo: null,
|
|
1604
|
-
errorId: "",
|
|
1605
|
-
retryCount: 0
|
|
1606
|
-
};
|
|
1607
|
-
}
|
|
1608
|
-
static getDerivedStateFromError(error) {
|
|
1609
|
-
return {
|
|
1610
|
-
hasError: true,
|
|
1611
|
-
error,
|
|
1612
|
-
errorId: `error_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`
|
|
1613
|
-
};
|
|
1614
|
-
}
|
|
1615
|
-
componentDidCatch(error, errorInfo) {
|
|
1616
|
-
this.setState({ errorInfo }), ErrorLogger.log(error, errorInfo, {
|
|
1617
|
-
retryCount: this.state.retryCount,
|
|
1618
|
-
errorId: this.state.errorId,
|
|
1619
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1620
|
-
}), this.props.onError?.(error, errorInfo);
|
|
1621
|
-
}
|
|
1622
|
-
componentWillUnmount() {
|
|
1623
|
-
this.retryTimeouts.forEach((timeout) => clearTimeout(timeout));
|
|
1624
|
-
}
|
|
1625
|
-
render() {
|
|
1626
|
-
if (this.state.hasError && this.state.error) {
|
|
1627
|
-
let walletError = classifyError(this.state.error);
|
|
1628
|
-
return this.props.fallback ? this.props.fallback(walletError, this.retry) : /* @__PURE__ */ jsxRuntime.jsx(DefaultErrorFallback, { error: walletError, onRetry: this.retry });
|
|
1629
|
-
}
|
|
1630
|
-
return this.props.children;
|
|
1631
|
-
}
|
|
1632
|
-
};
|
|
1633
|
-
function DefaultErrorFallback({ error, onRetry }) {
|
|
1634
|
-
let [isPending, startTransition] = react.useTransition(), [isRetrying, setIsRetrying] = react.useState(false), handleRetry = react.useCallback(() => {
|
|
1635
|
-
setIsRetrying(true), startTransition(() => {
|
|
1636
|
-
setTimeout(() => {
|
|
1637
|
-
onRetry(), setIsRetrying(false);
|
|
1638
|
-
}, 500);
|
|
1639
|
-
});
|
|
1640
|
-
}, [onRetry]), { title, message, actionText, showRetry } = react.useMemo(() => {
|
|
1641
|
-
switch (error.type) {
|
|
1642
|
-
case "USER_REJECTED" /* USER_REJECTED */:
|
|
1643
|
-
return {
|
|
1644
|
-
title: "Transaction Cancelled",
|
|
1645
|
-
message: "You cancelled the transaction. No problem!",
|
|
1646
|
-
actionText: "Try Again",
|
|
1647
|
-
showRetry: true
|
|
1648
|
-
};
|
|
1649
|
-
case "WALLET_NOT_FOUND" /* WALLET_NOT_FOUND */:
|
|
1650
|
-
return {
|
|
1651
|
-
title: "Wallet Not Found",
|
|
1652
|
-
message: "Please install a supported Solana wallet to continue.",
|
|
1653
|
-
actionText: "Check Wallets",
|
|
1654
|
-
showRetry: true
|
|
1655
|
-
};
|
|
1656
|
-
case "NETWORK_ERROR" /* NETWORK_ERROR */:
|
|
1657
|
-
return {
|
|
1658
|
-
title: "Network Error",
|
|
1659
|
-
message: "Having trouble connecting. Please check your internet connection.",
|
|
1660
|
-
actionText: "Retry",
|
|
1661
|
-
showRetry: true
|
|
1662
|
-
};
|
|
1663
|
-
case "INSUFFICIENT_FUNDS" /* INSUFFICIENT_FUNDS */:
|
|
1664
|
-
return {
|
|
1665
|
-
title: "Insufficient Funds",
|
|
1666
|
-
message: "You don't have enough SOL for this transaction.",
|
|
1667
|
-
actionText: "Add Funds",
|
|
1668
|
-
showRetry: false
|
|
1669
|
-
};
|
|
1670
|
-
default:
|
|
1671
|
-
return {
|
|
1672
|
-
title: "Something went wrong",
|
|
1673
|
-
message: "An unexpected error occurred. Please try again.",
|
|
1674
|
-
actionText: "Retry",
|
|
1675
|
-
showRetry: error.recoverable
|
|
1676
|
-
};
|
|
1677
|
-
}
|
|
1678
|
-
}, [error.type, error.recoverable]);
|
|
1679
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1680
|
-
"div",
|
|
1681
|
-
{
|
|
1682
|
-
style: {
|
|
1683
|
-
display: "flex",
|
|
1684
|
-
flexDirection: "column",
|
|
1685
|
-
alignItems: "center",
|
|
1686
|
-
justifyContent: "center",
|
|
1687
|
-
padding: "2rem",
|
|
1688
|
-
textAlign: "center",
|
|
1689
|
-
borderRadius: "12px",
|
|
1690
|
-
border: "1px solid #e5e7eb",
|
|
1691
|
-
backgroundColor: "#fafafa",
|
|
1692
|
-
maxWidth: "400px",
|
|
1693
|
-
margin: "0 auto"
|
|
1694
|
-
},
|
|
1695
|
-
children: [
|
|
1696
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1697
|
-
"div",
|
|
1698
|
-
{
|
|
1699
|
-
style: {
|
|
1700
|
-
width: "48px",
|
|
1701
|
-
height: "48px",
|
|
1702
|
-
borderRadius: "50%",
|
|
1703
|
-
backgroundColor: "#fee2e2",
|
|
1704
|
-
display: "flex",
|
|
1705
|
-
alignItems: "center",
|
|
1706
|
-
justifyContent: "center",
|
|
1707
|
-
marginBottom: "1rem"
|
|
1708
|
-
},
|
|
1709
|
-
children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "#dc2626", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z" }) })
|
|
1710
|
-
}
|
|
1711
|
-
),
|
|
1712
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1713
|
-
"h3",
|
|
1714
|
-
{
|
|
1715
|
-
style: {
|
|
1716
|
-
margin: "0 0 0.5rem 0",
|
|
1717
|
-
fontSize: "1.125rem",
|
|
1718
|
-
fontWeight: "600",
|
|
1719
|
-
color: "#111827"
|
|
1720
|
-
},
|
|
1721
|
-
children: title
|
|
1722
|
-
}
|
|
1723
|
-
),
|
|
1724
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1725
|
-
"p",
|
|
1726
|
-
{
|
|
1727
|
-
style: {
|
|
1728
|
-
margin: "0 0 1.5rem 0",
|
|
1729
|
-
fontSize: "0.875rem",
|
|
1730
|
-
color: "#6b7280",
|
|
1731
|
-
lineHeight: "1.5"
|
|
1732
|
-
},
|
|
1733
|
-
children: message
|
|
1734
|
-
}
|
|
1735
|
-
),
|
|
1736
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", gap: "0.75rem", flexWrap: "wrap" }, children: [
|
|
1737
|
-
showRetry && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1738
|
-
"button",
|
|
1739
|
-
{
|
|
1740
|
-
onClick: handleRetry,
|
|
1741
|
-
disabled: isPending || isRetrying,
|
|
1742
|
-
style: {
|
|
1743
|
-
padding: "0.5rem 1rem",
|
|
1744
|
-
backgroundColor: "#3b82f6",
|
|
1745
|
-
color: "white",
|
|
1746
|
-
border: "none",
|
|
1747
|
-
borderRadius: "6px",
|
|
1748
|
-
fontSize: "0.875rem",
|
|
1749
|
-
fontWeight: "500",
|
|
1750
|
-
cursor: isPending || isRetrying ? "wait" : "pointer",
|
|
1751
|
-
opacity: isPending || isRetrying ? 0.7 : 1,
|
|
1752
|
-
transition: "all 0.2s"
|
|
1753
|
-
},
|
|
1754
|
-
children: isRetrying ? "Retrying..." : actionText
|
|
1755
|
-
}
|
|
1756
|
-
),
|
|
1757
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1758
|
-
"button",
|
|
1759
|
-
{
|
|
1760
|
-
onClick: () => window.location.reload(),
|
|
1761
|
-
style: {
|
|
1762
|
-
padding: "0.5rem 1rem",
|
|
1763
|
-
backgroundColor: "transparent",
|
|
1764
|
-
color: "#6b7280",
|
|
1765
|
-
border: "1px solid #d1d5db",
|
|
1766
|
-
borderRadius: "6px",
|
|
1767
|
-
fontSize: "0.875rem",
|
|
1768
|
-
fontWeight: "500",
|
|
1769
|
-
cursor: "pointer",
|
|
1770
|
-
transition: "all 0.2s"
|
|
1771
|
-
},
|
|
1772
|
-
children: "Refresh Page"
|
|
1773
|
-
}
|
|
1774
|
-
)
|
|
1775
|
-
] }),
|
|
1776
|
-
process.env.NODE_ENV === "development" && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1777
|
-
"details",
|
|
1778
|
-
{
|
|
1779
|
-
style: {
|
|
1780
|
-
marginTop: "1rem",
|
|
1781
|
-
fontSize: "0.75rem",
|
|
1782
|
-
color: "#6b7280",
|
|
1783
|
-
width: "100%"
|
|
1784
|
-
},
|
|
1785
|
-
children: [
|
|
1786
|
-
/* @__PURE__ */ jsxRuntime.jsx("summary", { style: { cursor: "pointer", marginBottom: "0.5rem" }, children: "Error Details" }),
|
|
1787
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1788
|
-
"pre",
|
|
1789
|
-
{
|
|
1790
|
-
style: {
|
|
1791
|
-
whiteSpace: "pre-wrap",
|
|
1792
|
-
wordBreak: "break-all",
|
|
1793
|
-
backgroundColor: "#f3f4f6",
|
|
1794
|
-
padding: "0.5rem",
|
|
1795
|
-
borderRadius: "4px",
|
|
1796
|
-
overflow: "auto",
|
|
1797
|
-
maxHeight: "200px"
|
|
1798
|
-
},
|
|
1799
|
-
children: error.message
|
|
1800
|
-
}
|
|
1801
|
-
)
|
|
1802
|
-
]
|
|
1803
|
-
}
|
|
1804
|
-
)
|
|
1805
|
-
]
|
|
1806
|
-
}
|
|
1807
|
-
);
|
|
1808
|
-
}
|
|
1809
|
-
function withErrorBoundary(Component2, errorBoundaryProps) {
|
|
1810
|
-
let WrappedComponent = (props) => /* @__PURE__ */ jsxRuntime.jsx(ConnectorErrorBoundary, { ...errorBoundaryProps, children: /* @__PURE__ */ jsxRuntime.jsx(Component2, { ...props }) });
|
|
1811
|
-
return WrappedComponent.displayName = `withErrorBoundary(${Component2.displayName || Component2.name})`, WrappedComponent;
|
|
1812
|
-
}
|
|
1813
|
-
var logger7 = chunk64LV76OK_js.createLogger("Polyfills"), installed = false;
|
|
1937
|
+
var logger6 = chunkSITQ4JWM_js.createLogger("Polyfills"), installed = false;
|
|
1814
1938
|
function installPolyfills() {
|
|
1815
1939
|
if (!(installed || typeof window > "u"))
|
|
1816
1940
|
try {
|
|
1817
|
-
webcryptoEd25519Polyfill.install(), installed = true,
|
|
1941
|
+
webcryptoEd25519Polyfill.install(), installed = true, logger6.info("Browser compatibility polyfills installed");
|
|
1818
1942
|
} catch (error) {
|
|
1819
|
-
|
|
1943
|
+
logger6 && logger6.warn("Failed to install polyfills", { error }), installed = true;
|
|
1820
1944
|
}
|
|
1821
1945
|
}
|
|
1822
1946
|
function isPolyfillInstalled() {
|
|
@@ -1837,18 +1961,18 @@ function getPolyfillStatus() {
|
|
|
1837
1961
|
environment: typeof window < "u" ? "browser" : "server"
|
|
1838
1962
|
};
|
|
1839
1963
|
}
|
|
1840
|
-
var
|
|
1964
|
+
var logger7 = chunkSITQ4JWM_js.createLogger("EnhancedStorage"), STORAGE_VERSION = "v1", EnhancedStorage = class extends core.Storage {
|
|
1841
1965
|
constructor(key, initial, options) {
|
|
1842
1966
|
super(key, initial);
|
|
1843
1967
|
this.options = options;
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1968
|
+
chunkSITQ4JWM_js.__publicField(this, "errorHandlers", /* @__PURE__ */ new Set());
|
|
1969
|
+
chunkSITQ4JWM_js.__publicField(this, "validators", []);
|
|
1970
|
+
chunkSITQ4JWM_js.__publicField(this, "memoryFallback");
|
|
1847
1971
|
this.memoryFallback = initial, options?.onError && this.errorHandlers.add(options.onError), options?.validator && this.validators.push(options.validator);
|
|
1848
1972
|
}
|
|
1849
1973
|
set(value) {
|
|
1850
1974
|
try {
|
|
1851
|
-
return this.validate(value) ? (super.set(value), this.memoryFallback = value, true) : (
|
|
1975
|
+
return this.validate(value) ? (super.set(value), this.memoryFallback = value, true) : (logger7.warn("Validation failed", { key: this.key }), false);
|
|
1852
1976
|
} catch (error) {
|
|
1853
1977
|
return this.handleError(error), this.options?.useMemoryFallback ? (this.memoryFallback = value, true) : false;
|
|
1854
1978
|
}
|
|
@@ -1905,11 +2029,11 @@ var logger8 = chunk64LV76OK_js.createLogger("EnhancedStorage"), STORAGE_VERSION
|
|
|
1905
2029
|
}
|
|
1906
2030
|
}
|
|
1907
2031
|
handleError(error) {
|
|
1908
|
-
|
|
2032
|
+
logger7.error("Storage error", { key: this.key, error }), this.errorHandlers.forEach((handler) => {
|
|
1909
2033
|
try {
|
|
1910
2034
|
handler(error);
|
|
1911
2035
|
} catch (err) {
|
|
1912
|
-
|
|
2036
|
+
logger7.error("Error in error handler", { error: err });
|
|
1913
2037
|
}
|
|
1914
2038
|
});
|
|
1915
2039
|
}
|
|
@@ -1937,6 +2061,53 @@ function createEnhancedStorageWallet(options) {
|
|
|
1937
2061
|
useMemoryFallback: true
|
|
1938
2062
|
});
|
|
1939
2063
|
}
|
|
2064
|
+
var WALLET_STATE_VERSION = 1;
|
|
2065
|
+
function createEnhancedStorageWalletState(options) {
|
|
2066
|
+
let key = options?.key ?? `connector-kit:${STORAGE_VERSION}:wallet-state`, legacyKey = `connector-kit:${STORAGE_VERSION}:wallet`, storage = new EnhancedStorage(key, options?.initial ?? null, {
|
|
2067
|
+
onError: options?.onError,
|
|
2068
|
+
useMemoryFallback: true
|
|
2069
|
+
});
|
|
2070
|
+
if (typeof window < "u" && storage.isAvailable())
|
|
2071
|
+
try {
|
|
2072
|
+
if (!storage.get()) {
|
|
2073
|
+
let legacyValue = window.localStorage.getItem(legacyKey);
|
|
2074
|
+
if (legacyValue) {
|
|
2075
|
+
let legacyWalletName = JSON.parse(legacyValue);
|
|
2076
|
+
if (legacyWalletName && typeof legacyWalletName == "string") {
|
|
2077
|
+
let connectorId = options?.migrateLegacy ? options.migrateLegacy(legacyWalletName) : createConnectorId(legacyWalletName);
|
|
2078
|
+
if (connectorId) {
|
|
2079
|
+
let migratedState = {
|
|
2080
|
+
version: WALLET_STATE_VERSION,
|
|
2081
|
+
connectorId,
|
|
2082
|
+
autoConnect: true,
|
|
2083
|
+
lastConnected: (/* @__PURE__ */ new Date()).toISOString()
|
|
2084
|
+
};
|
|
2085
|
+
storage.set(migratedState), logger7.info("Migrated legacy wallet storage", {
|
|
2086
|
+
from: legacyWalletName,
|
|
2087
|
+
to: connectorId
|
|
2088
|
+
}), window.localStorage.removeItem(legacyKey);
|
|
2089
|
+
}
|
|
2090
|
+
}
|
|
2091
|
+
}
|
|
2092
|
+
}
|
|
2093
|
+
} catch (error) {
|
|
2094
|
+
logger7.warn("Failed to migrate legacy wallet storage", { error });
|
|
2095
|
+
}
|
|
2096
|
+
return storage;
|
|
2097
|
+
}
|
|
2098
|
+
function saveWalletState(storage, connectorId, account, autoConnect = true) {
|
|
2099
|
+
let state = {
|
|
2100
|
+
version: WALLET_STATE_VERSION,
|
|
2101
|
+
connectorId,
|
|
2102
|
+
lastAccount: account,
|
|
2103
|
+
autoConnect,
|
|
2104
|
+
lastConnected: (/* @__PURE__ */ new Date()).toISOString()
|
|
2105
|
+
};
|
|
2106
|
+
storage.set(state);
|
|
2107
|
+
}
|
|
2108
|
+
function clearWalletState(storage) {
|
|
2109
|
+
storage.set(null);
|
|
2110
|
+
}
|
|
1940
2111
|
var EnhancedStorageAdapter = class {
|
|
1941
2112
|
constructor(storage) {
|
|
1942
2113
|
this.storage = storage;
|
|
@@ -1972,7 +2143,7 @@ var EnhancedStorageAdapter = class {
|
|
|
1972
2143
|
return this.storage.onError(handler), this;
|
|
1973
2144
|
}
|
|
1974
2145
|
};
|
|
1975
|
-
var
|
|
2146
|
+
var logger8 = chunkSITQ4JWM_js.createLogger("DefaultConfig");
|
|
1976
2147
|
function getDefaultConfig(options) {
|
|
1977
2148
|
let {
|
|
1978
2149
|
appName,
|
|
@@ -2002,7 +2173,7 @@ function getDefaultConfig(options) {
|
|
|
2002
2173
|
], validClusterIds = defaultClusters.map((c) => c.id), accountStorage = createEnhancedStorageAccount({
|
|
2003
2174
|
validator: (address) => address ? addresses.isAddress(address) : true,
|
|
2004
2175
|
onError: (error) => {
|
|
2005
|
-
debug &&
|
|
2176
|
+
debug && logger8.error("Account Storage error", { error }), onError && onError(error, {
|
|
2006
2177
|
componentStack: "account-storage"
|
|
2007
2178
|
});
|
|
2008
2179
|
}
|
|
@@ -2011,13 +2182,13 @@ function getDefaultConfig(options) {
|
|
|
2011
2182
|
initial: getInitialCluster(network),
|
|
2012
2183
|
validClusters: persistClusterSelection ? validClusterIds : void 0,
|
|
2013
2184
|
onError: (error) => {
|
|
2014
|
-
debug &&
|
|
2185
|
+
debug && logger8.error("Cluster Storage error", { error }), onError && onError(error, {
|
|
2015
2186
|
componentStack: "cluster-storage"
|
|
2016
2187
|
});
|
|
2017
2188
|
}
|
|
2018
2189
|
}), walletStorage = createEnhancedStorageWallet({
|
|
2019
2190
|
onError: (error) => {
|
|
2020
|
-
debug &&
|
|
2191
|
+
debug && logger8.error("Wallet Storage error", { error }), onError && onError(error, {
|
|
2021
2192
|
componentStack: "wallet-storage"
|
|
2022
2193
|
});
|
|
2023
2194
|
}
|
|
@@ -2059,7 +2230,9 @@ function buildWalletConnectConfig(walletConnect, appName, appUrl, clusterStorage
|
|
|
2059
2230
|
if (!walletConnect) return;
|
|
2060
2231
|
let configProjectId = typeof walletConnect == "object" ? walletConnect.projectId : void 0, envProjectId = typeof process < "u" ? process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID : void 0, projectId = configProjectId || envProjectId;
|
|
2061
2232
|
if (!projectId) {
|
|
2062
|
-
(typeof walletConnect == "object" || walletConnect === true) &&
|
|
2233
|
+
(typeof walletConnect == "object" || walletConnect === true) && logger8.warn(
|
|
2234
|
+
"WalletConnect enabled but no project ID found. Set NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID or provide projectId in config."
|
|
2235
|
+
);
|
|
2063
2236
|
return;
|
|
2064
2237
|
}
|
|
2065
2238
|
let origin = appUrl || (typeof window < "u" ? window.location.origin : "http://localhost:3000"), customMetadata = typeof walletConnect == "object" ? walletConnect.metadata : void 0, customDefaultChain = typeof walletConnect == "object" ? walletConnect.defaultChain : void 0, customRelayUrl = typeof walletConnect == "object" ? walletConnect.relayUrl : void 0;
|
|
@@ -2397,7 +2570,7 @@ async function copySignatureToClipboard(signature, options) {
|
|
|
2397
2570
|
}
|
|
2398
2571
|
|
|
2399
2572
|
// src/lib/transaction/transaction-validator.ts
|
|
2400
|
-
var
|
|
2573
|
+
var logger9 = chunkSITQ4JWM_js.createLogger("TransactionValidator"), MAX_TRANSACTION_SIZE = 1232, MIN_TRANSACTION_SIZE = 64, TransactionValidator = class {
|
|
2401
2574
|
/**
|
|
2402
2575
|
* Validate a transaction before signing
|
|
2403
2576
|
*
|
|
@@ -2420,7 +2593,7 @@ var logger10 = chunk64LV76OK_js.createLogger("TransactionValidator"), MAX_TRANSA
|
|
|
2420
2593
|
try {
|
|
2421
2594
|
serialized = transaction.serialize();
|
|
2422
2595
|
} catch (serializeError) {
|
|
2423
|
-
|
|
2596
|
+
logger9.debug("Transaction not yet serializable (may need signing)", {
|
|
2424
2597
|
error: serializeError instanceof Error ? serializeError.message : String(serializeError)
|
|
2425
2598
|
});
|
|
2426
2599
|
}
|
|
@@ -2430,10 +2603,10 @@ var logger10 = chunk64LV76OK_js.createLogger("TransactionValidator"), MAX_TRANSA
|
|
|
2430
2603
|
return errors.push(
|
|
2431
2604
|
"Transaction type not recognized - must be a Transaction object with serialize() or Uint8Array"
|
|
2432
2605
|
), { valid: false, errors, warnings };
|
|
2433
|
-
serialized && (size = serialized.length, size > maxSize && (errors.push(`Transaction too large: ${size} bytes (max ${maxSize} bytes)`),
|
|
2606
|
+
serialized && (size = serialized.length, size > maxSize && (errors.push(`Transaction too large: ${size} bytes (max ${maxSize} bytes)`), logger9.warn("Transaction exceeds maximum size", { size, maxSize })), size < minSize && warnings.push(`Transaction is very small: ${size} bytes (min recommended ${minSize} bytes)`), size === 0 && errors.push("Transaction is empty (0 bytes)"), this.hasSuspiciousPattern(serialized) && warnings.push("Transaction contains unusual patterns - please review carefully"));
|
|
2434
2607
|
} catch (error) {
|
|
2435
2608
|
let errorMessage = error instanceof Error ? error.message : String(error);
|
|
2436
|
-
errors.push(`Transaction validation failed: ${errorMessage}`),
|
|
2609
|
+
errors.push(`Transaction validation failed: ${errorMessage}`), logger9.error("Validation error", { error: errorMessage });
|
|
2437
2610
|
}
|
|
2438
2611
|
if (checkDuplicateSignatures && typeof transaction == "object" && "signatures" in transaction) {
|
|
2439
2612
|
let signatures = transaction.signatures;
|
|
@@ -2446,7 +2619,7 @@ var logger10 = chunk64LV76OK_js.createLogger("TransactionValidator"), MAX_TRANSA
|
|
|
2446
2619
|
}
|
|
2447
2620
|
strict && warnings.length > 0 && (errors.push(...warnings.map((w) => `Strict mode: ${w}`)), warnings.length = 0);
|
|
2448
2621
|
let valid = errors.length === 0;
|
|
2449
|
-
return valid ? warnings.length > 0 ?
|
|
2622
|
+
return valid ? warnings.length > 0 ? logger9.debug("Transaction validation passed with warnings", { warnings, size }) : logger9.debug("Transaction validation passed", { size }) : logger9.warn("Transaction validation failed", { errors, size }), {
|
|
2450
2623
|
valid,
|
|
2451
2624
|
errors,
|
|
2452
2625
|
warnings,
|
|
@@ -2486,7 +2659,7 @@ var logger10 = chunk64LV76OK_js.createLogger("TransactionValidator"), MAX_TRANSA
|
|
|
2486
2659
|
let result = this.validate(transaction, options);
|
|
2487
2660
|
if (!result.valid)
|
|
2488
2661
|
throw new Error(`Transaction validation failed: ${result.errors.join(", ")}`);
|
|
2489
|
-
result.warnings.length > 0 &&
|
|
2662
|
+
result.warnings.length > 0 && logger9.warn("Transaction validation warnings", { warnings: result.warnings });
|
|
2490
2663
|
}
|
|
2491
2664
|
/**
|
|
2492
2665
|
* Batch validate multiple transactions
|
|
@@ -2497,10 +2670,10 @@ var logger10 = chunk64LV76OK_js.createLogger("TransactionValidator"), MAX_TRANSA
|
|
|
2497
2670
|
* @returns Array of validation results
|
|
2498
2671
|
*/
|
|
2499
2672
|
static validateBatch(transactions, options) {
|
|
2500
|
-
return transactions.map((tx, index) => (
|
|
2673
|
+
return transactions.map((tx, index) => (logger9.debug(`Validating transaction ${index + 1}/${transactions.length}`), this.validate(tx, options)));
|
|
2501
2674
|
}
|
|
2502
2675
|
};
|
|
2503
|
-
var
|
|
2676
|
+
var logger10 = chunkSITQ4JWM_js.createLogger("TransactionSigner");
|
|
2504
2677
|
function signatureBytesToBase58(bytes) {
|
|
2505
2678
|
if (bytes.length !== 64)
|
|
2506
2679
|
throw new Error(`Invalid signature length: expected 64 bytes, got ${bytes.length}`);
|
|
@@ -2522,6 +2695,24 @@ function extractSignatureString(result) {
|
|
|
2522
2695
|
}
|
|
2523
2696
|
throw new Error("Unexpected wallet response format for signAndSendTransaction");
|
|
2524
2697
|
}
|
|
2698
|
+
function extractSignatureBytes(result) {
|
|
2699
|
+
if (result instanceof Uint8Array)
|
|
2700
|
+
return result;
|
|
2701
|
+
if (Array.isArray(result)) {
|
|
2702
|
+
let [first] = result;
|
|
2703
|
+
if (!first)
|
|
2704
|
+
throw new Error("Wallet returned empty results array");
|
|
2705
|
+
return extractSignatureBytes(first);
|
|
2706
|
+
}
|
|
2707
|
+
if (result && typeof result == "object") {
|
|
2708
|
+
let record = result;
|
|
2709
|
+
if ("signature" in record)
|
|
2710
|
+
return extractSignatureBytes(record.signature);
|
|
2711
|
+
if (Array.isArray(record.signatures) && record.signatures.length > 0)
|
|
2712
|
+
return extractSignatureBytes(record.signatures[0]);
|
|
2713
|
+
}
|
|
2714
|
+
throw new Error("Unexpected wallet response format for signMessage");
|
|
2715
|
+
}
|
|
2525
2716
|
function createTransactionSigner(config) {
|
|
2526
2717
|
let { wallet, account, cluster, eventEmitter } = config;
|
|
2527
2718
|
if (!wallet || !account)
|
|
@@ -2535,14 +2726,14 @@ function createTransactionSigner(config) {
|
|
|
2535
2726
|
address,
|
|
2536
2727
|
async signTransaction(transaction) {
|
|
2537
2728
|
if (!capabilities.canSign)
|
|
2538
|
-
throw
|
|
2729
|
+
throw chunkSITQ4JWM_js.Errors.featureNotSupported("transaction signing");
|
|
2539
2730
|
let validation = TransactionValidator.validate(transaction);
|
|
2540
2731
|
if (!validation.valid)
|
|
2541
|
-
throw
|
|
2542
|
-
validation.warnings.length > 0 &&
|
|
2732
|
+
throw logger10.error("Transaction validation failed", { errors: validation.errors }), chunkSITQ4JWM_js.Errors.invalidTransaction(validation.errors.join(", "));
|
|
2733
|
+
validation.warnings.length > 0 && logger10.warn("Transaction validation warnings", { warnings: validation.warnings });
|
|
2543
2734
|
try {
|
|
2544
2735
|
let signFeature = features["solana:signTransaction"], { serialized, wasWeb3js } = chunk4KD6HQQG_js.prepareTransactionForWallet(transaction);
|
|
2545
|
-
|
|
2736
|
+
logger10.debug("Signing transaction", {
|
|
2546
2737
|
wasWeb3js,
|
|
2547
2738
|
serializedLength: serialized.length,
|
|
2548
2739
|
serializedType: serialized.constructor.name,
|
|
@@ -2551,26 +2742,26 @@ function createTransactionSigner(config) {
|
|
|
2551
2742
|
});
|
|
2552
2743
|
let result, usedFormat = "";
|
|
2553
2744
|
try {
|
|
2554
|
-
|
|
2745
|
+
logger10.debug("Trying array format: transactions: [Uint8Array]"), result = await signFeature.signTransaction({
|
|
2555
2746
|
account,
|
|
2556
2747
|
transactions: [serialized],
|
|
2557
2748
|
...cluster ? { chain: cluster.id } : {}
|
|
2558
2749
|
}), usedFormat = "array";
|
|
2559
2750
|
} catch (err1) {
|
|
2560
2751
|
let error1 = err1 instanceof Error ? err1 : new Error(String(err1));
|
|
2561
|
-
|
|
2752
|
+
logger10.debug("Array format failed, trying singular format", { error: error1.message });
|
|
2562
2753
|
try {
|
|
2563
|
-
|
|
2754
|
+
logger10.debug("Trying singular format: transaction: Uint8Array"), result = await signFeature.signTransaction({
|
|
2564
2755
|
account,
|
|
2565
2756
|
transaction: serialized,
|
|
2566
2757
|
...cluster ? { chain: cluster.id } : {}
|
|
2567
2758
|
}), usedFormat = "singular";
|
|
2568
2759
|
} catch (err2) {
|
|
2569
2760
|
let error2 = err2 instanceof Error ? err2 : new Error(String(err2));
|
|
2570
|
-
throw
|
|
2761
|
+
throw logger10.error("Both array and singular formats failed", { error: error2.message }), error2;
|
|
2571
2762
|
}
|
|
2572
2763
|
}
|
|
2573
|
-
|
|
2764
|
+
logger10.debug("Wallet signed successfully", { format: usedFormat });
|
|
2574
2765
|
let signedTx;
|
|
2575
2766
|
if (Array.isArray(result.signedTransactions) && result.signedTransactions[0])
|
|
2576
2767
|
signedTx = result.signedTransactions[0];
|
|
@@ -2582,31 +2773,31 @@ function createTransactionSigner(config) {
|
|
|
2582
2773
|
signedTx = result;
|
|
2583
2774
|
else
|
|
2584
2775
|
throw new Error(`Unexpected wallet response format: ${JSON.stringify(Object.keys(result))}`);
|
|
2585
|
-
if (
|
|
2776
|
+
if (logger10.debug("Extracted signed transaction", {
|
|
2586
2777
|
hasSignedTx: !!signedTx,
|
|
2587
2778
|
signedTxType: signedTx?.constructor?.name,
|
|
2588
2779
|
signedTxLength: signedTx?.length,
|
|
2589
2780
|
isUint8Array: signedTx instanceof Uint8Array,
|
|
2590
2781
|
hasSerialize: typeof signedTx?.serialize == "function"
|
|
2591
2782
|
}), signedTx && typeof signedTx.serialize == "function")
|
|
2592
|
-
return
|
|
2783
|
+
return logger10.debug("Wallet returned web3.js object directly, no conversion needed"), signedTx;
|
|
2593
2784
|
if (signedTx && signedTx.signedTransaction) {
|
|
2594
|
-
|
|
2785
|
+
logger10.debug("Found signedTransaction property");
|
|
2595
2786
|
let bytes = signedTx.signedTransaction;
|
|
2596
2787
|
if (bytes instanceof Uint8Array)
|
|
2597
2788
|
return await chunk4KD6HQQG_js.convertSignedTransaction(bytes, wasWeb3js);
|
|
2598
2789
|
}
|
|
2599
2790
|
if (signedTx instanceof Uint8Array)
|
|
2600
2791
|
return await chunk4KD6HQQG_js.convertSignedTransaction(signedTx, wasWeb3js);
|
|
2601
|
-
throw
|
|
2792
|
+
throw logger10.error("Unexpected wallet response format", {
|
|
2602
2793
|
type: typeof signedTx,
|
|
2603
2794
|
constructor: signedTx?.constructor?.name
|
|
2604
|
-
}), new
|
|
2795
|
+
}), new chunkSITQ4JWM_js.ValidationError(
|
|
2605
2796
|
"INVALID_FORMAT",
|
|
2606
2797
|
"Wallet returned unexpected format - not a Transaction or Uint8Array"
|
|
2607
2798
|
);
|
|
2608
2799
|
} catch (error) {
|
|
2609
|
-
throw
|
|
2800
|
+
throw chunkSITQ4JWM_js.Errors.signingFailed(error);
|
|
2610
2801
|
}
|
|
2611
2802
|
},
|
|
2612
2803
|
async signAllTransactions(transactions) {
|
|
@@ -2631,7 +2822,7 @@ function createTransactionSigner(config) {
|
|
|
2631
2822
|
)
|
|
2632
2823
|
);
|
|
2633
2824
|
} catch (error) {
|
|
2634
|
-
throw new
|
|
2825
|
+
throw new chunkSITQ4JWM_js.TransactionError(
|
|
2635
2826
|
"SIGNING_FAILED",
|
|
2636
2827
|
"Failed to sign transactions in batch",
|
|
2637
2828
|
{ count: transactions.length },
|
|
@@ -2639,14 +2830,14 @@ function createTransactionSigner(config) {
|
|
|
2639
2830
|
);
|
|
2640
2831
|
}
|
|
2641
2832
|
if (!capabilities.canSign)
|
|
2642
|
-
throw
|
|
2833
|
+
throw chunkSITQ4JWM_js.Errors.featureNotSupported("transaction signing");
|
|
2643
2834
|
let signed = [];
|
|
2644
2835
|
for (let i = 0; i < transactions.length; i++)
|
|
2645
2836
|
try {
|
|
2646
2837
|
let signedTx = await signer.signTransaction(transactions[i]);
|
|
2647
2838
|
signed.push(signedTx);
|
|
2648
2839
|
} catch (error) {
|
|
2649
|
-
throw new
|
|
2840
|
+
throw new chunkSITQ4JWM_js.TransactionError(
|
|
2650
2841
|
"SIGNING_FAILED",
|
|
2651
2842
|
`Failed to sign transaction ${i + 1} of ${transactions.length}`,
|
|
2652
2843
|
{ index: i, total: transactions.length },
|
|
@@ -2657,7 +2848,7 @@ function createTransactionSigner(config) {
|
|
|
2657
2848
|
},
|
|
2658
2849
|
async signAndSendTransaction(transaction, options) {
|
|
2659
2850
|
if (!capabilities.canSend)
|
|
2660
|
-
throw
|
|
2851
|
+
throw chunkSITQ4JWM_js.Errors.featureNotSupported("sending transactions");
|
|
2661
2852
|
try {
|
|
2662
2853
|
let sendFeature = features["solana:signAndSendTransaction"], { serialized } = chunk4KD6HQQG_js.prepareTransactionForWallet(transaction);
|
|
2663
2854
|
eventEmitter && eventEmitter.emit({
|
|
@@ -2694,21 +2885,21 @@ function createTransactionSigner(config) {
|
|
|
2694
2885
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
2695
2886
|
}), signature;
|
|
2696
2887
|
} catch (error) {
|
|
2697
|
-
throw new
|
|
2888
|
+
throw new chunkSITQ4JWM_js.TransactionError("SEND_FAILED", "Failed to send transaction", void 0, error);
|
|
2698
2889
|
}
|
|
2699
2890
|
},
|
|
2700
2891
|
async signAndSendTransactions(transactions, options) {
|
|
2701
2892
|
if (transactions.length === 0)
|
|
2702
2893
|
return [];
|
|
2703
2894
|
if (!capabilities.canSend)
|
|
2704
|
-
throw
|
|
2895
|
+
throw chunkSITQ4JWM_js.Errors.featureNotSupported("sending transactions");
|
|
2705
2896
|
let signatures = [];
|
|
2706
2897
|
for (let i = 0; i < transactions.length; i++)
|
|
2707
2898
|
try {
|
|
2708
2899
|
let sig = await signer.signAndSendTransaction(transactions[i], options);
|
|
2709
2900
|
signatures.push(sig);
|
|
2710
2901
|
} catch (error) {
|
|
2711
|
-
throw new
|
|
2902
|
+
throw new chunkSITQ4JWM_js.TransactionError(
|
|
2712
2903
|
"SEND_FAILED",
|
|
2713
2904
|
`Failed to send transaction ${i + 1} of ${transactions.length}`,
|
|
2714
2905
|
{ index: i, total: transactions.length },
|
|
@@ -2720,13 +2911,14 @@ function createTransactionSigner(config) {
|
|
|
2720
2911
|
...capabilities.canSignMessage && {
|
|
2721
2912
|
async signMessage(message) {
|
|
2722
2913
|
try {
|
|
2723
|
-
|
|
2914
|
+
let result = await features["solana:signMessage"].signMessage({
|
|
2724
2915
|
account,
|
|
2725
2916
|
message,
|
|
2726
2917
|
...cluster ? { chain: cluster.id } : {}
|
|
2727
|
-
})
|
|
2918
|
+
});
|
|
2919
|
+
return extractSignatureBytes(result);
|
|
2728
2920
|
} catch (error) {
|
|
2729
|
-
throw new
|
|
2921
|
+
throw new chunkSITQ4JWM_js.TransactionError("SIGNING_FAILED", "Failed to sign message", void 0, error);
|
|
2730
2922
|
}
|
|
2731
2923
|
}
|
|
2732
2924
|
},
|
|
@@ -2736,16 +2928,16 @@ function createTransactionSigner(config) {
|
|
|
2736
2928
|
};
|
|
2737
2929
|
return signer;
|
|
2738
2930
|
}
|
|
2739
|
-
var TransactionSignerError = class extends
|
|
2931
|
+
var TransactionSignerError = class extends chunkSITQ4JWM_js.TransactionError {
|
|
2740
2932
|
constructor(message, code, originalError) {
|
|
2741
2933
|
let newCode = code === "WALLET_NOT_CONNECTED" ? "FEATURE_NOT_SUPPORTED" : code;
|
|
2742
2934
|
super(newCode, message, void 0, originalError), this.name = "TransactionSignerError";
|
|
2743
2935
|
}
|
|
2744
2936
|
};
|
|
2745
2937
|
function isTransactionSignerError(error) {
|
|
2746
|
-
return error instanceof TransactionSignerError || error instanceof
|
|
2938
|
+
return error instanceof TransactionSignerError || error instanceof chunkSITQ4JWM_js.TransactionError;
|
|
2747
2939
|
}
|
|
2748
|
-
var
|
|
2940
|
+
var logger11 = chunkSITQ4JWM_js.createLogger("KitTransactionSigner");
|
|
2749
2941
|
function encodeShortVecLength(value) {
|
|
2750
2942
|
let bytes = [], remaining = value;
|
|
2751
2943
|
for (; remaining >= 128; )
|
|
@@ -2820,7 +3012,7 @@ function createKitTransactionSigner(connectorSigner) {
|
|
|
2820
3012
|
async modifyAndSignTransactions(transactions$1) {
|
|
2821
3013
|
let transactionData = transactions$1.map((tx) => {
|
|
2822
3014
|
let messageBytes = new Uint8Array(tx.messageBytes), { numSigners } = parseMessageSigners(messageBytes), wireFormat = createTransactionBytesForSigning(messageBytes, numSigners);
|
|
2823
|
-
return
|
|
3015
|
+
return logger11.debug("Preparing wire format for wallet", {
|
|
2824
3016
|
signerAddress,
|
|
2825
3017
|
messageBytesLength: messageBytes.length,
|
|
2826
3018
|
wireFormatLength: wireFormat.length,
|
|
@@ -2849,14 +3041,14 @@ function createKitTransactionSigner(connectorSigner) {
|
|
|
2849
3041
|
throw new Error("Web3.js transaction without serialize method");
|
|
2850
3042
|
} else
|
|
2851
3043
|
throw new Error("Unknown signed transaction format");
|
|
2852
|
-
if (
|
|
3044
|
+
if (logger11.debug("Wallet returned signed transaction", {
|
|
2853
3045
|
returnedLength: signedTxBytes.length,
|
|
2854
3046
|
sentLength: wireFormat.length,
|
|
2855
3047
|
lengthsMatch: signedTxBytes.length === wireFormat.length,
|
|
2856
3048
|
signedFirstBytes: Array.from(signedTxBytes.slice(0, 20)),
|
|
2857
3049
|
sentFirstBytes: Array.from(wireFormat.slice(0, 20))
|
|
2858
3050
|
}), signedTxBytes.length !== wireFormat.length) {
|
|
2859
|
-
|
|
3051
|
+
logger11.warn("Wallet modified transaction! Using wallet version", {
|
|
2860
3052
|
originalLength: wireFormat.length,
|
|
2861
3053
|
modifiedLength: signedTxBytes.length,
|
|
2862
3054
|
difference: signedTxBytes.length - wireFormat.length
|
|
@@ -2867,13 +3059,13 @@ function createKitTransactionSigner(connectorSigner) {
|
|
|
2867
3059
|
lifetimeConstraint: originalWithLifetime.lifetimeConstraint
|
|
2868
3060
|
} : {}
|
|
2869
3061
|
};
|
|
2870
|
-
return
|
|
3062
|
+
return logger11.debug("Using modified transaction from wallet", {
|
|
2871
3063
|
modifiedMessageBytesLength: walletTransaction.messageBytes.length,
|
|
2872
3064
|
signatures: Object.keys(walletTransaction.signatures)
|
|
2873
3065
|
}), transactions.assertIsTransactionWithinSizeLimit(result), result;
|
|
2874
3066
|
}
|
|
2875
3067
|
let extractedSignatureBytes = extractSignature(signedTxBytes), signatureBase58 = codecs.getBase58Decoder().decode(extractedSignatureBytes);
|
|
2876
|
-
|
|
3068
|
+
logger11.debug("Extracted signature from wallet (unmodified)", {
|
|
2877
3069
|
signerAddress,
|
|
2878
3070
|
signatureLength: extractedSignatureBytes.length,
|
|
2879
3071
|
signatureBase58
|
|
@@ -2888,7 +3080,7 @@ function createKitTransactionSigner(connectorSigner) {
|
|
|
2888
3080
|
};
|
|
2889
3081
|
return transactions.assertIsTransactionWithinSizeLimit(signedTransaction), signedTransaction;
|
|
2890
3082
|
} catch (error) {
|
|
2891
|
-
return
|
|
3083
|
+
return logger11.error("Failed to decode signed transaction", { error }), transactions.assertIsTransactionWithinSizeLimit(originalTransaction), originalTransaction;
|
|
2892
3084
|
}
|
|
2893
3085
|
});
|
|
2894
3086
|
}
|
|
@@ -2898,18 +3090,21 @@ var createGillTransactionSigner = createKitTransactionSigner;
|
|
|
2898
3090
|
|
|
2899
3091
|
exports.ClipboardErrorType = ClipboardErrorType;
|
|
2900
3092
|
exports.ConnectorClient = ConnectorClient;
|
|
2901
|
-
exports.ConnectorErrorBoundary = ConnectorErrorBoundary;
|
|
2902
3093
|
exports.EnhancedStorage = EnhancedStorage;
|
|
2903
3094
|
exports.EnhancedStorageAdapter = EnhancedStorageAdapter;
|
|
3095
|
+
exports.INITIAL_WALLET_STATUS = INITIAL_WALLET_STATUS;
|
|
2904
3096
|
exports.PUBLIC_RPC_ENDPOINTS = PUBLIC_RPC_ENDPOINTS;
|
|
2905
3097
|
exports.TransactionSignerError = TransactionSignerError;
|
|
2906
|
-
exports.
|
|
3098
|
+
exports.WALLET_STATE_VERSION = WALLET_STATE_VERSION;
|
|
3099
|
+
exports.clearWalletState = clearWalletState;
|
|
2907
3100
|
exports.copyAddressToClipboard = copyAddressToClipboard;
|
|
2908
3101
|
exports.copySignatureToClipboard = copySignatureToClipboard;
|
|
2909
3102
|
exports.copyToClipboard = copyToClipboard;
|
|
3103
|
+
exports.createConnectorId = createConnectorId;
|
|
2910
3104
|
exports.createEnhancedStorageAccount = createEnhancedStorageAccount;
|
|
2911
3105
|
exports.createEnhancedStorageCluster = createEnhancedStorageCluster;
|
|
2912
3106
|
exports.createEnhancedStorageWallet = createEnhancedStorageWallet;
|
|
3107
|
+
exports.createEnhancedStorageWalletState = createEnhancedStorageWalletState;
|
|
2913
3108
|
exports.createGillTransactionSigner = createGillTransactionSigner;
|
|
2914
3109
|
exports.createKitTransactionSigner = createKitTransactionSigner;
|
|
2915
3110
|
exports.createTransactionSigner = createTransactionSigner;
|
|
@@ -2936,26 +3131,34 @@ exports.getNetworkDisplayName = getNetworkDisplayName;
|
|
|
2936
3131
|
exports.getPolyfillStatus = getPolyfillStatus;
|
|
2937
3132
|
exports.getTokenUrl = getTokenUrl;
|
|
2938
3133
|
exports.getTransactionUrl = getTransactionUrl;
|
|
3134
|
+
exports.getWalletNameFromConnectorId = getWalletNameFromConnectorId;
|
|
2939
3135
|
exports.getWalletsRegistry = getWalletsRegistry;
|
|
2940
3136
|
exports.installPolyfills = installPolyfills;
|
|
2941
3137
|
exports.isClipboardAvailable = isClipboardAvailable;
|
|
3138
|
+
exports.isConnected = isConnected;
|
|
3139
|
+
exports.isConnecting = isConnecting;
|
|
2942
3140
|
exports.isCryptoAvailable = isCryptoAvailable;
|
|
2943
3141
|
exports.isDevnet = isDevnet;
|
|
2944
3142
|
exports.isDevnetCluster = isDevnetCluster;
|
|
3143
|
+
exports.isDisconnected = isDisconnected;
|
|
2945
3144
|
exports.isLocalCluster = isLocalCluster;
|
|
2946
3145
|
exports.isLocalnet = isLocalnet;
|
|
2947
3146
|
exports.isMainnet = isMainnet;
|
|
2948
3147
|
exports.isMainnetCluster = isMainnetCluster;
|
|
2949
3148
|
exports.isPolyfillInstalled = isPolyfillInstalled;
|
|
3149
|
+
exports.isStatusError = isStatusError;
|
|
2950
3150
|
exports.isTestnet = isTestnet;
|
|
2951
3151
|
exports.isTestnetCluster = isTestnetCluster;
|
|
2952
3152
|
exports.isTransactionSignerError = isTransactionSignerError;
|
|
3153
|
+
exports.isWalletConnectorId = isWalletConnectorId;
|
|
3154
|
+
exports.isWalletStatusError = isWalletStatusError;
|
|
2953
3155
|
exports.normalizeNetwork = normalizeNetwork;
|
|
2954
3156
|
exports.parseConfigOptions = parseConfigOptions;
|
|
2955
3157
|
exports.ready = ready;
|
|
3158
|
+
exports.saveWalletState = saveWalletState;
|
|
2956
3159
|
exports.toClusterId = toClusterId;
|
|
3160
|
+
exports.toLegacyWalletState = toLegacyWalletState;
|
|
2957
3161
|
exports.truncate = truncate;
|
|
2958
3162
|
exports.validateConfigOptions = validateConfigOptions;
|
|
2959
|
-
|
|
2960
|
-
//# sourceMappingURL=chunk-
|
|
2961
|
-
//# sourceMappingURL=chunk-6AJJJG5B.js.map
|
|
3163
|
+
//# sourceMappingURL=chunk-BZ2VBJCZ.js.map
|
|
3164
|
+
//# sourceMappingURL=chunk-BZ2VBJCZ.js.map
|