@solana/connector 0.1.9 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +403 -50
- package/dist/chunk-4KD6HQQG.js +69 -0
- package/dist/chunk-4KD6HQQG.js.map +1 -0
- package/dist/chunk-BJAVJQLK.js +230 -0
- package/dist/chunk-BJAVJQLK.js.map +1 -0
- package/dist/{chunk-5HRJKCIL.js → chunk-BZ2VBJCZ.js} +1061 -424
- package/dist/chunk-BZ2VBJCZ.js.map +1 -0
- package/dist/{chunk-WDXEP4AJ.js → chunk-EM4KNOKG.js} +658 -190
- package/dist/chunk-EM4KNOKG.js.map +1 -0
- package/dist/chunk-HN5AJF7F.js +507 -0
- package/dist/chunk-HN5AJF7F.js.map +1 -0
- package/dist/chunk-HO6QNKFM.mjs +61 -0
- package/dist/chunk-HO6QNKFM.mjs.map +1 -0
- package/dist/chunk-HPQ5T32K.mjs +178 -0
- package/dist/chunk-HPQ5T32K.mjs.map +1 -0
- package/dist/{chunk-MAXA3HEP.mjs → chunk-IDTUFDNB.mjs} +962 -344
- package/dist/chunk-IDTUFDNB.mjs.map +1 -0
- package/dist/{chunk-P5LXUDP6.mjs → chunk-RTXUS5KG.mjs} +579 -119
- package/dist/chunk-RTXUS5KG.mjs.map +1 -0
- package/dist/{chunk-DSUCH44G.js → chunk-SITQ4JWM.js} +23 -67
- package/dist/chunk-SITQ4JWM.js.map +1 -0
- package/dist/chunk-UCISIAOG.mjs +501 -0
- package/dist/chunk-UCISIAOG.mjs.map +1 -0
- package/dist/{chunk-J7DHGLW6.mjs → chunk-ZZTY3O4N.mjs} +21 -61
- 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 +10 -9
- package/dist/compat.js.map +1 -1
- package/dist/compat.mjs +2 -1
- package/dist/compat.mjs.map +1 -1
- package/dist/headless.d.mts +239 -104
- package/dist/headless.d.ts +239 -104
- package/dist/headless.js +255 -169
- package/dist/headless.mjs +5 -3
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +316 -206
- package/dist/index.mjs +6 -4
- package/dist/react.d.mts +299 -9
- package/dist/react.d.ts +299 -9
- package/dist/react.js +90 -38
- package/dist/react.mjs +2 -2
- package/dist/{standard-shim-CT49DM5l.d.mts → standard-shim-CGB88PPO.d.mts} +673 -52
- package/dist/{standard-shim-D9guL5fz.d.ts → standard-shim-tmnQelaJ.d.ts} +673 -52
- package/dist/{transaction-signer-T-KVQFi8.d.mts → transaction-signer-7NaYmP5w.d.mts} +1 -0
- package/dist/{transaction-signer-T-KVQFi8.d.ts → transaction-signer-7NaYmP5w.d.ts} +1 -0
- package/dist/walletconnect-447EY3OJ.js +28 -0
- package/dist/walletconnect-447EY3OJ.js.map +1 -0
- package/dist/walletconnect-U455PO4I.mjs +3 -0
- package/dist/walletconnect-U455PO4I.mjs.map +1 -0
- package/package.json +6 -2
- package/dist/chunk-5HRJKCIL.js.map +0 -1
- package/dist/chunk-DSUCH44G.js.map +0 -1
- package/dist/chunk-I6TJLYNA.js +0 -535
- package/dist/chunk-I6TJLYNA.js.map +0 -1
- package/dist/chunk-J7DHGLW6.mjs.map +0 -1
- package/dist/chunk-JOBLG62A.mjs +0 -476
- package/dist/chunk-JOBLG62A.mjs.map +0 -1
- package/dist/chunk-MAXA3HEP.mjs.map +0 -1
- package/dist/chunk-P5LXUDP6.mjs.map +0 -1
- package/dist/chunk-WDXEP4AJ.js.map +0 -1
|
@@ -1,13 +1,57 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
3
|
+
var chunk4KD6HQQG_js = require('./chunk-4KD6HQQG.js');
|
|
4
|
+
var chunkSITQ4JWM_js = require('./chunk-SITQ4JWM.js');
|
|
6
5
|
var webcryptoEd25519Polyfill = require('@solana/webcrypto-ed25519-polyfill');
|
|
6
|
+
var core = require('@wallet-ui/core');
|
|
7
7
|
var addresses = require('@solana/addresses');
|
|
8
|
+
var v4 = require('zod/v4');
|
|
8
9
|
var codecs = require('@solana/codecs');
|
|
9
10
|
var transactions = require('@solana/transactions');
|
|
10
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
|
+
|
|
11
55
|
// src/lib/wallet/standard-shim.ts
|
|
12
56
|
var registry = null, registryInitPromise = null, registryInitResolve = null, ready = new Promise((resolve, reject) => {
|
|
13
57
|
if (typeof window > "u") {
|
|
@@ -96,7 +140,7 @@ function toClusterId(network) {
|
|
|
96
140
|
function getDefaultRpcUrl(network) {
|
|
97
141
|
let normalized = normalizeNetwork(network);
|
|
98
142
|
try {
|
|
99
|
-
return
|
|
143
|
+
return chunkSITQ4JWM_js.getPublicSolanaRpcUrl(normalized);
|
|
100
144
|
} catch {
|
|
101
145
|
return PUBLIC_RPC_ENDPOINTS[normalized] ?? PUBLIC_RPC_ENDPOINTS.localnet;
|
|
102
146
|
}
|
|
@@ -151,14 +195,14 @@ function getClusterExplorerUrl(cluster, path) {
|
|
|
151
195
|
}
|
|
152
196
|
function getTransactionUrl(signature, cluster) {
|
|
153
197
|
let clusterType = getClusterType(cluster), explorerCluster = clusterType === "custom" || clusterType === "localnet" ? "devnet" : clusterType;
|
|
154
|
-
return
|
|
198
|
+
return chunkSITQ4JWM_js.getExplorerLink({
|
|
155
199
|
transaction: signature,
|
|
156
200
|
cluster: explorerCluster === "mainnet" ? "mainnet" : explorerCluster
|
|
157
201
|
});
|
|
158
202
|
}
|
|
159
203
|
function getAddressUrl(address, cluster) {
|
|
160
204
|
let clusterType = getClusterType(cluster), explorerCluster = clusterType === "custom" || clusterType === "localnet" ? "devnet" : clusterType;
|
|
161
|
-
return
|
|
205
|
+
return chunkSITQ4JWM_js.getExplorerLink({
|
|
162
206
|
address,
|
|
163
207
|
cluster: explorerCluster === "mainnet" ? "mainnet" : explorerCluster
|
|
164
208
|
});
|
|
@@ -221,9 +265,9 @@ var POLL_INTERVALS_MS = [1e3, 2e3, 3e3, 5e3, 5e3], DEFAULT_MAX_RETRIES = 3, DEFA
|
|
|
221
265
|
// src/lib/core/state-manager.ts
|
|
222
266
|
var StateManager = class {
|
|
223
267
|
constructor(initialState) {
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
268
|
+
chunkSITQ4JWM_js.__publicField(this, "state");
|
|
269
|
+
chunkSITQ4JWM_js.__publicField(this, "listeners", /* @__PURE__ */ new Set());
|
|
270
|
+
chunkSITQ4JWM_js.__publicField(this, "notifyTimeout");
|
|
227
271
|
this.state = initialState;
|
|
228
272
|
}
|
|
229
273
|
/**
|
|
@@ -282,10 +326,10 @@ var StateManager = class {
|
|
|
282
326
|
};
|
|
283
327
|
|
|
284
328
|
// src/lib/core/event-emitter.ts
|
|
285
|
-
var logger =
|
|
329
|
+
var logger = chunkSITQ4JWM_js.createLogger("EventEmitter"), EventEmitter = class {
|
|
286
330
|
constructor(debug = false) {
|
|
287
|
-
|
|
288
|
-
|
|
331
|
+
chunkSITQ4JWM_js.__publicField(this, "listeners", /* @__PURE__ */ new Set());
|
|
332
|
+
chunkSITQ4JWM_js.__publicField(this, "debug");
|
|
289
333
|
this.debug = debug;
|
|
290
334
|
}
|
|
291
335
|
/**
|
|
@@ -341,12 +385,12 @@ var logger = chunkDSUCH44G_js.createLogger("EventEmitter"), EventEmitter = class
|
|
|
341
385
|
// src/lib/core/debug-metrics.ts
|
|
342
386
|
var DebugMetrics = class {
|
|
343
387
|
constructor() {
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
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);
|
|
350
394
|
}
|
|
351
395
|
/**
|
|
352
396
|
* Record a state update attempt
|
|
@@ -386,11 +430,11 @@ var DebugMetrics = class {
|
|
|
386
430
|
// src/lib/core/base-collaborator.ts
|
|
387
431
|
var BaseCollaborator = class {
|
|
388
432
|
constructor(config, loggerPrefix) {
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
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);
|
|
394
438
|
}
|
|
395
439
|
/**
|
|
396
440
|
* Log debug message if debug mode is enabled
|
|
@@ -413,7 +457,7 @@ var BaseCollaborator = class {
|
|
|
413
457
|
};
|
|
414
458
|
|
|
415
459
|
// src/lib/wallet/authenticity-verifier.ts
|
|
416
|
-
var logger2 =
|
|
460
|
+
var logger2 = chunkSITQ4JWM_js.createLogger("WalletAuthenticity"), WalletAuthenticityVerifier = class {
|
|
417
461
|
/**
|
|
418
462
|
* Verify a wallet's authenticity using dynamic heuristics
|
|
419
463
|
*
|
|
@@ -622,8 +666,43 @@ var logger2 = chunkDSUCH44G_js.createLogger("WalletAuthenticity"), WalletAuthent
|
|
|
622
666
|
}
|
|
623
667
|
};
|
|
624
668
|
|
|
669
|
+
// src/lib/wallet/wallet-icon-overrides.ts
|
|
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 = {
|
|
671
|
+
Phantom: PHANTOM_ICON,
|
|
672
|
+
Solflare: SOLFLARE_ICON,
|
|
673
|
+
Backpack: BACKPACK_ICON
|
|
674
|
+
}, ICON_PROXY_CACHE = /* @__PURE__ */ new WeakMap();
|
|
675
|
+
function getWalletIconOverride(walletName) {
|
|
676
|
+
return WALLET_ICON_OVERRIDES[walletName];
|
|
677
|
+
}
|
|
678
|
+
function createIconProxy(wallet, icon) {
|
|
679
|
+
let cached = ICON_PROXY_CACHE.get(wallet);
|
|
680
|
+
if (cached) return cached;
|
|
681
|
+
let proxy = new Proxy(wallet, {
|
|
682
|
+
get(target, prop) {
|
|
683
|
+
if (prop === "icon") return icon;
|
|
684
|
+
let value = Reflect.get(target, prop, target);
|
|
685
|
+
return typeof value == "function" ? value.bind(target) : value;
|
|
686
|
+
}
|
|
687
|
+
});
|
|
688
|
+
return ICON_PROXY_CACHE.set(wallet, proxy), proxy;
|
|
689
|
+
}
|
|
690
|
+
function applyWalletIconOverride(wallet) {
|
|
691
|
+
let override = getWalletIconOverride(wallet.name);
|
|
692
|
+
if (!override || wallet.icon === override) return wallet;
|
|
693
|
+
if (Object.isExtensible(wallet))
|
|
694
|
+
try {
|
|
695
|
+
return wallet.icon = override, wallet;
|
|
696
|
+
} catch {
|
|
697
|
+
}
|
|
698
|
+
return createIconProxy(wallet, override);
|
|
699
|
+
}
|
|
700
|
+
|
|
625
701
|
// src/lib/wallet/detector.ts
|
|
626
|
-
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
|
+
}
|
|
627
706
|
function hasFeature(wallet, featureName) {
|
|
628
707
|
return wallet.features != null && wallet.features[featureName] !== void 0;
|
|
629
708
|
}
|
|
@@ -645,7 +724,9 @@ function verifyWalletName(wallet, requestedName) {
|
|
|
645
724
|
var WalletDetector = class extends BaseCollaborator {
|
|
646
725
|
constructor(stateManager, eventEmitter, debug = false) {
|
|
647
726
|
super({ stateManager, eventEmitter, debug }, "WalletDetector");
|
|
648
|
-
|
|
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());
|
|
649
730
|
}
|
|
650
731
|
/**
|
|
651
732
|
* Initialize wallet detection (synchronous)
|
|
@@ -661,11 +742,10 @@ var WalletDetector = class extends BaseCollaborator {
|
|
|
661
742
|
if (!(typeof window > "u"))
|
|
662
743
|
try {
|
|
663
744
|
let walletsApi = getWalletsRegistry(), update = () => {
|
|
664
|
-
let
|
|
665
|
-
newCount !== previousCount && this.log("\u{1F50D} WalletDetector: found wallets:", newCount)
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
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))
|
|
669
749
|
}), newCount !== previousCount && newCount > 0 && this.eventEmitter.emit({
|
|
670
750
|
type: "wallets:detected",
|
|
671
751
|
count: newCount,
|
|
@@ -743,20 +823,64 @@ var WalletDetector = class extends BaseCollaborator {
|
|
|
743
823
|
return null;
|
|
744
824
|
}
|
|
745
825
|
/**
|
|
746
|
-
* Get currently detected wallets
|
|
826
|
+
* Get currently detected wallets (legacy)
|
|
827
|
+
* @deprecated Use getConnectors() for vNext API
|
|
747
828
|
*/
|
|
748
829
|
getDetectedWallets() {
|
|
749
830
|
return this.getState().wallets;
|
|
750
831
|
}
|
|
751
832
|
/**
|
|
752
|
-
*
|
|
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)
|
|
753
877
|
*/
|
|
754
878
|
mapToWalletInfo(wallet) {
|
|
755
|
-
let
|
|
879
|
+
let walletWithIcon = applyWalletIconOverride(wallet), hasConnect = hasFeature(walletWithIcon, "standard:connect"), isSolana = isSolanaWallet(walletWithIcon);
|
|
756
880
|
return {
|
|
757
|
-
wallet,
|
|
881
|
+
wallet: walletWithIcon,
|
|
758
882
|
installed: true,
|
|
759
|
-
connectable: hasConnect &&
|
|
883
|
+
connectable: hasConnect && isSolana
|
|
760
884
|
};
|
|
761
885
|
}
|
|
762
886
|
/**
|
|
@@ -795,30 +919,262 @@ function getEventsFeature(wallet) {
|
|
|
795
919
|
var ConnectionManager = class extends BaseCollaborator {
|
|
796
920
|
constructor(stateManager, eventEmitter, walletStorage, debug = false) {
|
|
797
921
|
super({ stateManager, eventEmitter, debug }, "ConnectionManager");
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
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);
|
|
802
929
|
this.walletStorage = walletStorage;
|
|
803
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
|
+
}
|
|
1053
|
+
/**
|
|
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
|
+
}
|
|
804
1131
|
/**
|
|
805
|
-
*
|
|
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
|
|
806
1144
|
*/
|
|
807
1145
|
async connect(wallet, walletName) {
|
|
808
1146
|
if (typeof window > "u") return;
|
|
809
|
-
let name = walletName || wallet.name;
|
|
1147
|
+
let name = walletName || wallet.name, attemptId = ++this.connectAttemptId;
|
|
1148
|
+
this.pendingWallet = wallet, this.pendingWalletName = name;
|
|
1149
|
+
let connectorId = createConnectorId(name);
|
|
810
1150
|
this.eventEmitter.emit({
|
|
811
1151
|
type: "connecting",
|
|
812
1152
|
wallet: name,
|
|
813
1153
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1154
|
+
}), this.updateWalletStatus({
|
|
1155
|
+
status: "connecting",
|
|
1156
|
+
connectorId
|
|
814
1157
|
}), this.stateManager.updateState({ connecting: true }, true);
|
|
815
1158
|
try {
|
|
816
1159
|
let connect = getConnectFeature(wallet);
|
|
817
1160
|
if (!connect) throw new Error(`Wallet ${name} does not support standard connect`);
|
|
818
|
-
let result = await connect({ silent: false })
|
|
1161
|
+
let result = await connect({ silent: false });
|
|
1162
|
+
if (attemptId !== this.connectAttemptId)
|
|
1163
|
+
throw new Error("Connection cancelled");
|
|
1164
|
+
let walletAccounts = wallet.accounts, accountMap = /* @__PURE__ */ new Map();
|
|
819
1165
|
for (let a of [...walletAccounts, ...result.accounts]) accountMap.set(a.address, a);
|
|
820
|
-
let
|
|
821
|
-
|
|
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(
|
|
822
1178
|
{
|
|
823
1179
|
selectedWallet: wallet,
|
|
824
1180
|
connected: true,
|
|
@@ -842,7 +1198,9 @@ var ConnectionManager = class extends BaseCollaborator {
|
|
|
842
1198
|
accountsCount: accounts.length
|
|
843
1199
|
}), this.walletStorage && (!("isAvailable" in this.walletStorage) || typeof this.walletStorage.isAvailable != "function" || this.walletStorage.isAvailable() ? this.walletStorage.set(name) : this.log("Storage not available (private browsing?), skipping wallet persistence")), this.subscribeToWalletEvents();
|
|
844
1200
|
} catch (e) {
|
|
845
|
-
|
|
1201
|
+
if (attemptId !== this.connectAttemptId)
|
|
1202
|
+
throw e;
|
|
1203
|
+
let errorMessage = e instanceof Error ? e.message : String(e), error = e instanceof Error ? e : new Error(errorMessage);
|
|
846
1204
|
throw this.eventEmitter.emit({
|
|
847
1205
|
type: "connection:failed",
|
|
848
1206
|
wallet: name,
|
|
@@ -850,9 +1208,14 @@ var ConnectionManager = class extends BaseCollaborator {
|
|
|
850
1208
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
851
1209
|
}), this.eventEmitter.emit({
|
|
852
1210
|
type: "error",
|
|
853
|
-
error
|
|
1211
|
+
error,
|
|
854
1212
|
context: "wallet-connection",
|
|
855
1213
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1214
|
+
}), this.updateWalletStatus({
|
|
1215
|
+
status: "error",
|
|
1216
|
+
error,
|
|
1217
|
+
connectorId,
|
|
1218
|
+
recoverable: this.isRecoverableError(error)
|
|
856
1219
|
}), this.stateManager.updateState(
|
|
857
1220
|
{
|
|
858
1221
|
selectedWallet: null,
|
|
@@ -863,22 +1226,21 @@ var ConnectionManager = class extends BaseCollaborator {
|
|
|
863
1226
|
},
|
|
864
1227
|
true
|
|
865
1228
|
), e;
|
|
1229
|
+
} finally {
|
|
1230
|
+
this.pendingWallet === wallet && this.pendingWalletName === name && (this.pendingWallet = null, this.pendingWalletName = null);
|
|
866
1231
|
}
|
|
867
1232
|
}
|
|
868
1233
|
/**
|
|
869
1234
|
* Disconnect from wallet
|
|
870
1235
|
*/
|
|
871
1236
|
async disconnect() {
|
|
872
|
-
this.walletChangeUnsub && (this.walletChangeUnsub(), this.walletChangeUnsub = null), this.stopPollingWalletAccounts();
|
|
873
|
-
let wallet = this.getState().selectedWallet;
|
|
874
|
-
if (
|
|
875
|
-
let disconnect = getDisconnectFeature(wallet);
|
|
876
|
-
disconnect && await disconnect();
|
|
877
|
-
}
|
|
878
|
-
this.stateManager.updateState(
|
|
1237
|
+
this.connectAttemptId++, this.walletChangeUnsub && (this.walletChangeUnsub(), this.walletChangeUnsub = null), this.stopPollingWalletAccounts();
|
|
1238
|
+
let wallet = this.getState().selectedWallet ?? this.pendingWallet;
|
|
1239
|
+
if (this.pendingWallet = null, this.pendingWalletName = null, this.updateWalletStatus(INITIAL_WALLET_STATUS), this.stateManager.updateState(
|
|
879
1240
|
{
|
|
880
1241
|
selectedWallet: null,
|
|
881
1242
|
connected: false,
|
|
1243
|
+
connecting: false,
|
|
882
1244
|
accounts: [],
|
|
883
1245
|
selectedAccount: null
|
|
884
1246
|
},
|
|
@@ -886,7 +1248,14 @@ var ConnectionManager = class extends BaseCollaborator {
|
|
|
886
1248
|
), this.eventEmitter.emit({
|
|
887
1249
|
type: "wallet:disconnected",
|
|
888
1250
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
889
|
-
}), this.walletStorage && "clear" in this.walletStorage && typeof this.walletStorage.clear == "function" ? this.walletStorage.clear() : this.walletStorage?.set(void 0)
|
|
1251
|
+
}), this.walletStorage && "clear" in this.walletStorage && typeof this.walletStorage.clear == "function" ? this.walletStorage.clear() : this.walletStorage?.set(void 0), wallet) {
|
|
1252
|
+
let disconnect = getDisconnectFeature(wallet);
|
|
1253
|
+
if (disconnect)
|
|
1254
|
+
try {
|
|
1255
|
+
await disconnect();
|
|
1256
|
+
} catch {
|
|
1257
|
+
}
|
|
1258
|
+
}
|
|
890
1259
|
}
|
|
891
1260
|
/**
|
|
892
1261
|
* Select a different account
|
|
@@ -993,17 +1362,50 @@ var ConnectionManager = class extends BaseCollaborator {
|
|
|
993
1362
|
};
|
|
994
1363
|
|
|
995
1364
|
// src/lib/wallet/auto-connector.ts
|
|
996
|
-
var logger4 =
|
|
997
|
-
constructor(walletDetector, connectionManager, stateManager, walletStorage, debug = false) {
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
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;
|
|
1004
1376
|
}
|
|
1005
1377
|
async attemptAutoConnect() {
|
|
1006
|
-
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
|
+
}
|
|
1007
1409
|
}
|
|
1008
1410
|
async attemptInstantConnect() {
|
|
1009
1411
|
let storedWalletName = this.walletStorage?.get();
|
|
@@ -1094,12 +1496,12 @@ var logger4 = chunkDSUCH44G_js.createLogger("AutoConnector"), MIN_ADDRESS_LENGTH
|
|
|
1094
1496
|
],
|
|
1095
1497
|
features,
|
|
1096
1498
|
accounts: []
|
|
1097
|
-
};
|
|
1499
|
+
}, walletWithIcon = applyWalletIconOverride(wallet);
|
|
1098
1500
|
this.stateManager.updateState(
|
|
1099
1501
|
{
|
|
1100
1502
|
wallets: [
|
|
1101
1503
|
{
|
|
1102
|
-
wallet,
|
|
1504
|
+
wallet: walletWithIcon,
|
|
1103
1505
|
installed: true,
|
|
1104
1506
|
connectable: true
|
|
1105
1507
|
}
|
|
@@ -1107,7 +1509,7 @@ var logger4 = chunkDSUCH44G_js.createLogger("AutoConnector"), MIN_ADDRESS_LENGTH
|
|
|
1107
1509
|
},
|
|
1108
1510
|
true
|
|
1109
1511
|
), await ready;
|
|
1110
|
-
let walletsApi = getWalletsRegistry(), registryWallet = walletsApi.get().find((w) => w.name === storedWalletName), walletToUse = registryWallet ||
|
|
1512
|
+
let walletsApi = getWalletsRegistry(), registryWallet = walletsApi.get().find((w) => w.name === storedWalletName), walletToUse = applyWalletIconOverride(registryWallet || walletWithIcon);
|
|
1111
1513
|
return this.debug && logger4.info("Attempting to connect via instant auto-connect", {
|
|
1112
1514
|
walletName: storedWalletName,
|
|
1113
1515
|
usingRegistry: !!registryWallet
|
|
@@ -1153,7 +1555,7 @@ var logger4 = chunkDSUCH44G_js.createLogger("AutoConnector"), MIN_ADDRESS_LENGTH
|
|
|
1153
1555
|
var ClusterManager = class extends BaseCollaborator {
|
|
1154
1556
|
constructor(stateManager, eventEmitter, clusterStorage, config, debug = false) {
|
|
1155
1557
|
super({ stateManager, eventEmitter, debug }, "ClusterManager");
|
|
1156
|
-
|
|
1558
|
+
chunkSITQ4JWM_js.__publicField(this, "clusterStorage");
|
|
1157
1559
|
if (this.clusterStorage = clusterStorage, config) {
|
|
1158
1560
|
let clusters = config.clusters ?? [], initialClusterId = this.clusterStorage?.get() ?? config.initialCluster ?? "solana:mainnet", initialCluster = clusters.find((c) => c.id === initialClusterId) ?? clusters[0] ?? null;
|
|
1159
1561
|
this.stateManager.updateState({
|
|
@@ -1168,7 +1570,7 @@ var ClusterManager = class extends BaseCollaborator {
|
|
|
1168
1570
|
async setCluster(clusterId) {
|
|
1169
1571
|
let state = this.getState(), previousClusterId = state.cluster?.id || null, cluster = state.clusters.find((c) => c.id === clusterId);
|
|
1170
1572
|
if (!cluster)
|
|
1171
|
-
throw
|
|
1573
|
+
throw chunkSITQ4JWM_js.Errors.clusterNotFound(
|
|
1172
1574
|
clusterId,
|
|
1173
1575
|
state.clusters.map((c) => c.id)
|
|
1174
1576
|
);
|
|
@@ -1197,9 +1599,9 @@ var ClusterManager = class extends BaseCollaborator {
|
|
|
1197
1599
|
var TransactionTracker = class extends BaseCollaborator {
|
|
1198
1600
|
constructor(stateManager, eventEmitter, maxTransactions = 20, debug = false) {
|
|
1199
1601
|
super({ stateManager, eventEmitter, debug }, "TransactionTracker");
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1602
|
+
chunkSITQ4JWM_js.__publicField(this, "transactions", []);
|
|
1603
|
+
chunkSITQ4JWM_js.__publicField(this, "totalTransactions", 0);
|
|
1604
|
+
chunkSITQ4JWM_js.__publicField(this, "maxTransactions");
|
|
1203
1605
|
this.maxTransactions = maxTransactions;
|
|
1204
1606
|
}
|
|
1205
1607
|
/**
|
|
@@ -1253,10 +1655,10 @@ var TransactionTracker = class extends BaseCollaborator {
|
|
|
1253
1655
|
// src/lib/health/health-monitor.ts
|
|
1254
1656
|
var HealthMonitor = class {
|
|
1255
1657
|
constructor(stateManager, walletStorage, clusterStorage, isInitialized) {
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1658
|
+
chunkSITQ4JWM_js.__publicField(this, "stateManager");
|
|
1659
|
+
chunkSITQ4JWM_js.__publicField(this, "walletStorage");
|
|
1660
|
+
chunkSITQ4JWM_js.__publicField(this, "clusterStorage");
|
|
1661
|
+
chunkSITQ4JWM_js.__publicField(this, "isInitialized");
|
|
1260
1662
|
this.stateManager = stateManager, this.walletStorage = walletStorage, this.clusterStorage = clusterStorage, this.isInitialized = isInitialized ?? (() => true);
|
|
1261
1663
|
}
|
|
1262
1664
|
/**
|
|
@@ -1308,21 +1710,26 @@ var HealthMonitor = class {
|
|
|
1308
1710
|
};
|
|
1309
1711
|
|
|
1310
1712
|
// src/lib/core/connector-client.ts
|
|
1311
|
-
var logger5 =
|
|
1713
|
+
var logger5 = chunkSITQ4JWM_js.createLogger("ConnectorClient"), ConnectorClient = class {
|
|
1312
1714
|
constructor(config = {}) {
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
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);
|
|
1324
1727
|
this.config = config;
|
|
1325
1728
|
let initialState = {
|
|
1729
|
+
// vNext wallet status
|
|
1730
|
+
wallet: INITIAL_WALLET_STATUS,
|
|
1731
|
+
connectors: [],
|
|
1732
|
+
// Legacy fields (for backwards compatibility)
|
|
1326
1733
|
wallets: [],
|
|
1327
1734
|
selectedWallet: null,
|
|
1328
1735
|
connected: false,
|
|
@@ -1363,8 +1770,10 @@ var logger5 = chunkDSUCH44G_js.createLogger("ConnectorClient"), ConnectorClient
|
|
|
1363
1770
|
}
|
|
1364
1771
|
initialize() {
|
|
1365
1772
|
if (typeof window > "u" || this.initialized) return;
|
|
1366
|
-
let { error } =
|
|
1367
|
-
this.walletDetector.initialize(), this.config.
|
|
1773
|
+
let { error } = chunk4KD6HQQG_js.tryCatchSync(() => {
|
|
1774
|
+
this.walletDetector.initialize(), this.config.walletConnect?.enabled && this.initializeWalletConnect().catch((err) => {
|
|
1775
|
+
this.config.debug && logger5.error("WalletConnect initialization failed", { error: err });
|
|
1776
|
+
}), this.config.autoConnect && setTimeout(() => {
|
|
1368
1777
|
this.autoConnector.attemptAutoConnect().catch((err) => {
|
|
1369
1778
|
this.config.debug && logger5.error("Auto-connect error", { error: err });
|
|
1370
1779
|
});
|
|
@@ -1372,11 +1781,62 @@ var logger5 = chunkDSUCH44G_js.createLogger("ConnectorClient"), ConnectorClient
|
|
|
1372
1781
|
});
|
|
1373
1782
|
error && this.config.debug && logger5.error("Connector initialization failed", { error });
|
|
1374
1783
|
}
|
|
1784
|
+
/**
|
|
1785
|
+
* Initialize WalletConnect integration
|
|
1786
|
+
* Dynamically imports and registers the WalletConnect wallet
|
|
1787
|
+
*/
|
|
1788
|
+
async initializeWalletConnect() {
|
|
1789
|
+
if (this.config.walletConnect?.enabled)
|
|
1790
|
+
try {
|
|
1791
|
+
let { registerWalletConnectWallet } = await import('./walletconnect-447EY3OJ.js');
|
|
1792
|
+
this.walletConnectRegistration = await registerWalletConnectWallet(this.config.walletConnect), this.config.debug && logger5.info("WalletConnect wallet registered successfully");
|
|
1793
|
+
} catch (error) {
|
|
1794
|
+
this.config.debug && logger5.error("Failed to register WalletConnect wallet", { error });
|
|
1795
|
+
}
|
|
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
|
+
*/
|
|
1375
1832
|
async select(walletName) {
|
|
1376
1833
|
let wallet = this.stateManager.getSnapshot().wallets.find((w) => w.wallet.name === walletName)?.wallet;
|
|
1377
1834
|
if (!wallet) throw new Error(`Wallet ${walletName} not found`);
|
|
1378
1835
|
await this.connectionManager.connect(wallet, walletName);
|
|
1379
1836
|
}
|
|
1837
|
+
/**
|
|
1838
|
+
* @deprecated Use `disconnectWallet()` instead.
|
|
1839
|
+
*/
|
|
1380
1840
|
async disconnect() {
|
|
1381
1841
|
await this.connectionManager.disconnect();
|
|
1382
1842
|
}
|
|
@@ -1395,7 +1855,7 @@ var logger5 = chunkDSUCH44G_js.createLogger("ConnectorClient"), ConnectorClient
|
|
|
1395
1855
|
getRpcUrl() {
|
|
1396
1856
|
let cluster = this.clusterManager.getCluster();
|
|
1397
1857
|
if (!cluster) return null;
|
|
1398
|
-
let { data, error } =
|
|
1858
|
+
let { data, error } = chunk4KD6HQQG_js.tryCatchSync(() => getClusterRpcUrl(cluster));
|
|
1399
1859
|
return error ? (this.config.debug && logger5.error("Failed to get RPC URL", { error }), null) : data;
|
|
1400
1860
|
}
|
|
1401
1861
|
subscribe(listener) {
|
|
@@ -1410,7 +1870,7 @@ var logger5 = chunkDSUCH44G_js.createLogger("ConnectorClient"), ConnectorClient
|
|
|
1410
1870
|
for (let key of storageKeys) {
|
|
1411
1871
|
let storage = this.config.storage?.[key];
|
|
1412
1872
|
if (storage && "reset" in storage && typeof storage.reset == "function") {
|
|
1413
|
-
let resetFn = storage.reset, { error } =
|
|
1873
|
+
let resetFn = storage.reset, { error } = chunk4KD6HQQG_js.tryCatchSync(() => resetFn());
|
|
1414
1874
|
error ? this.config.debug && logger5.error("Failed to reset storage", { key, error }) : this.config.debug && logger5.debug("Reset storage", { key });
|
|
1415
1875
|
}
|
|
1416
1876
|
}
|
|
@@ -1464,288 +1924,23 @@ var logger5 = chunkDSUCH44G_js.createLogger("ConnectorClient"), ConnectorClient
|
|
|
1464
1924
|
this.debugMetrics.resetMetrics();
|
|
1465
1925
|
}
|
|
1466
1926
|
destroy() {
|
|
1467
|
-
this.
|
|
1468
|
-
}), this.walletDetector.destroy(), this.eventEmitter.offAll(), this.stateManager.clear();
|
|
1469
|
-
}
|
|
1470
|
-
};
|
|
1471
|
-
var logger6 = chunkDSUCH44G_js.createLogger("ErrorBoundary"), WalletErrorType = /* @__PURE__ */ ((WalletErrorType2) => (WalletErrorType2.CONNECTION_FAILED = "CONNECTION_FAILED", WalletErrorType2.TRANSACTION_FAILED = "TRANSACTION_FAILED", WalletErrorType2.NETWORK_ERROR = "NETWORK_ERROR", WalletErrorType2.WALLET_NOT_FOUND = "WALLET_NOT_FOUND", WalletErrorType2.USER_REJECTED = "USER_REJECTED", WalletErrorType2.INSUFFICIENT_FUNDS = "INSUFFICIENT_FUNDS", WalletErrorType2.UNKNOWN_ERROR = "UNKNOWN_ERROR", WalletErrorType2))(WalletErrorType || {}), ErrorLogger = class {
|
|
1472
|
-
static log(error, errorInfo, context) {
|
|
1473
|
-
if (process.env.NODE_ENV === "development" && logger6.error(error.message, {
|
|
1474
|
-
error,
|
|
1475
|
-
errorInfo,
|
|
1476
|
-
context
|
|
1477
|
-
}), process.env.NODE_ENV === "production" && typeof window < "u")
|
|
1927
|
+
if (this.walletConnectRegistration)
|
|
1478
1928
|
try {
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
fatal: false,
|
|
1483
|
-
custom_map: { error_type: "wallet_error", ...context }
|
|
1484
|
-
});
|
|
1485
|
-
} catch {
|
|
1929
|
+
this.walletConnectRegistration.unregister(), this.walletConnectRegistration = null;
|
|
1930
|
+
} catch (error) {
|
|
1931
|
+
this.config.debug && logger5.warn("Error unregistering WalletConnect wallet", { error });
|
|
1486
1932
|
}
|
|
1933
|
+
this.connectionManager.disconnect().catch(() => {
|
|
1934
|
+
}), this.walletDetector.destroy(), this.eventEmitter.offAll(), this.stateManager.clear();
|
|
1487
1935
|
}
|
|
1488
1936
|
};
|
|
1489
|
-
|
|
1490
|
-
if (chunkDSUCH44G_js.isConnectorError(error))
|
|
1491
|
-
return {
|
|
1492
|
-
...error,
|
|
1493
|
-
type: {
|
|
1494
|
-
WALLET_NOT_CONNECTED: "CONNECTION_FAILED" /* CONNECTION_FAILED */,
|
|
1495
|
-
WALLET_NOT_FOUND: "WALLET_NOT_FOUND" /* WALLET_NOT_FOUND */,
|
|
1496
|
-
CONNECTION_FAILED: "CONNECTION_FAILED" /* CONNECTION_FAILED */,
|
|
1497
|
-
USER_REJECTED: "USER_REJECTED" /* USER_REJECTED */,
|
|
1498
|
-
RPC_ERROR: "NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
1499
|
-
NETWORK_TIMEOUT: "NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
1500
|
-
SIGNING_FAILED: "TRANSACTION_FAILED" /* TRANSACTION_FAILED */,
|
|
1501
|
-
SEND_FAILED: "TRANSACTION_FAILED" /* TRANSACTION_FAILED */
|
|
1502
|
-
}[error.code] || "UNKNOWN_ERROR" /* UNKNOWN_ERROR */,
|
|
1503
|
-
recoverable: error.recoverable,
|
|
1504
|
-
context: error.context
|
|
1505
|
-
};
|
|
1506
|
-
let walletError = error;
|
|
1507
|
-
if (walletError.type) return walletError;
|
|
1508
|
-
let type = "UNKNOWN_ERROR" /* UNKNOWN_ERROR */, recoverable = false;
|
|
1509
|
-
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), {
|
|
1510
|
-
...error,
|
|
1511
|
-
type,
|
|
1512
|
-
recoverable,
|
|
1513
|
-
context: { originalMessage: error.message }
|
|
1514
|
-
};
|
|
1515
|
-
}
|
|
1516
|
-
var ConnectorErrorBoundary = class extends react.Component {
|
|
1517
|
-
constructor(props) {
|
|
1518
|
-
super(props);
|
|
1519
|
-
chunkDSUCH44G_js.__publicField(this, "retryTimeouts", /* @__PURE__ */ new Set());
|
|
1520
|
-
chunkDSUCH44G_js.__publicField(this, "retry", () => {
|
|
1521
|
-
let { maxRetries = 3 } = this.props;
|
|
1522
|
-
this.state.retryCount >= maxRetries || this.setState((prevState) => ({
|
|
1523
|
-
hasError: false,
|
|
1524
|
-
error: null,
|
|
1525
|
-
errorInfo: null,
|
|
1526
|
-
retryCount: prevState.retryCount + 1
|
|
1527
|
-
}));
|
|
1528
|
-
});
|
|
1529
|
-
this.state = {
|
|
1530
|
-
hasError: false,
|
|
1531
|
-
error: null,
|
|
1532
|
-
errorInfo: null,
|
|
1533
|
-
errorId: "",
|
|
1534
|
-
retryCount: 0
|
|
1535
|
-
};
|
|
1536
|
-
}
|
|
1537
|
-
static getDerivedStateFromError(error) {
|
|
1538
|
-
return {
|
|
1539
|
-
hasError: true,
|
|
1540
|
-
error,
|
|
1541
|
-
errorId: `error_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`
|
|
1542
|
-
};
|
|
1543
|
-
}
|
|
1544
|
-
componentDidCatch(error, errorInfo) {
|
|
1545
|
-
this.setState({ errorInfo }), ErrorLogger.log(error, errorInfo, {
|
|
1546
|
-
retryCount: this.state.retryCount,
|
|
1547
|
-
errorId: this.state.errorId,
|
|
1548
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1549
|
-
}), this.props.onError?.(error, errorInfo);
|
|
1550
|
-
}
|
|
1551
|
-
componentWillUnmount() {
|
|
1552
|
-
this.retryTimeouts.forEach((timeout) => clearTimeout(timeout));
|
|
1553
|
-
}
|
|
1554
|
-
render() {
|
|
1555
|
-
if (this.state.hasError && this.state.error) {
|
|
1556
|
-
let walletError = classifyError(this.state.error);
|
|
1557
|
-
return this.props.fallback ? this.props.fallback(walletError, this.retry) : /* @__PURE__ */ jsxRuntime.jsx(DefaultErrorFallback, { error: walletError, onRetry: this.retry });
|
|
1558
|
-
}
|
|
1559
|
-
return this.props.children;
|
|
1560
|
-
}
|
|
1561
|
-
};
|
|
1562
|
-
function DefaultErrorFallback({ error, onRetry }) {
|
|
1563
|
-
let [isPending, startTransition] = react.useTransition(), [isRetrying, setIsRetrying] = react.useState(false), handleRetry = react.useCallback(() => {
|
|
1564
|
-
setIsRetrying(true), startTransition(() => {
|
|
1565
|
-
setTimeout(() => {
|
|
1566
|
-
onRetry(), setIsRetrying(false);
|
|
1567
|
-
}, 500);
|
|
1568
|
-
});
|
|
1569
|
-
}, [onRetry]), { title, message, actionText, showRetry } = react.useMemo(() => {
|
|
1570
|
-
switch (error.type) {
|
|
1571
|
-
case "USER_REJECTED" /* USER_REJECTED */:
|
|
1572
|
-
return {
|
|
1573
|
-
title: "Transaction Cancelled",
|
|
1574
|
-
message: "You cancelled the transaction. No problem!",
|
|
1575
|
-
actionText: "Try Again",
|
|
1576
|
-
showRetry: true
|
|
1577
|
-
};
|
|
1578
|
-
case "WALLET_NOT_FOUND" /* WALLET_NOT_FOUND */:
|
|
1579
|
-
return {
|
|
1580
|
-
title: "Wallet Not Found",
|
|
1581
|
-
message: "Please install a supported Solana wallet to continue.",
|
|
1582
|
-
actionText: "Check Wallets",
|
|
1583
|
-
showRetry: true
|
|
1584
|
-
};
|
|
1585
|
-
case "NETWORK_ERROR" /* NETWORK_ERROR */:
|
|
1586
|
-
return {
|
|
1587
|
-
title: "Network Error",
|
|
1588
|
-
message: "Having trouble connecting. Please check your internet connection.",
|
|
1589
|
-
actionText: "Retry",
|
|
1590
|
-
showRetry: true
|
|
1591
|
-
};
|
|
1592
|
-
case "INSUFFICIENT_FUNDS" /* INSUFFICIENT_FUNDS */:
|
|
1593
|
-
return {
|
|
1594
|
-
title: "Insufficient Funds",
|
|
1595
|
-
message: "You don't have enough SOL for this transaction.",
|
|
1596
|
-
actionText: "Add Funds",
|
|
1597
|
-
showRetry: false
|
|
1598
|
-
};
|
|
1599
|
-
default:
|
|
1600
|
-
return {
|
|
1601
|
-
title: "Something went wrong",
|
|
1602
|
-
message: "An unexpected error occurred. Please try again.",
|
|
1603
|
-
actionText: "Retry",
|
|
1604
|
-
showRetry: error.recoverable
|
|
1605
|
-
};
|
|
1606
|
-
}
|
|
1607
|
-
}, [error.type, error.recoverable]);
|
|
1608
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1609
|
-
"div",
|
|
1610
|
-
{
|
|
1611
|
-
style: {
|
|
1612
|
-
display: "flex",
|
|
1613
|
-
flexDirection: "column",
|
|
1614
|
-
alignItems: "center",
|
|
1615
|
-
justifyContent: "center",
|
|
1616
|
-
padding: "2rem",
|
|
1617
|
-
textAlign: "center",
|
|
1618
|
-
borderRadius: "12px",
|
|
1619
|
-
border: "1px solid #e5e7eb",
|
|
1620
|
-
backgroundColor: "#fafafa",
|
|
1621
|
-
maxWidth: "400px",
|
|
1622
|
-
margin: "0 auto"
|
|
1623
|
-
},
|
|
1624
|
-
children: [
|
|
1625
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1626
|
-
"div",
|
|
1627
|
-
{
|
|
1628
|
-
style: {
|
|
1629
|
-
width: "48px",
|
|
1630
|
-
height: "48px",
|
|
1631
|
-
borderRadius: "50%",
|
|
1632
|
-
backgroundColor: "#fee2e2",
|
|
1633
|
-
display: "flex",
|
|
1634
|
-
alignItems: "center",
|
|
1635
|
-
justifyContent: "center",
|
|
1636
|
-
marginBottom: "1rem"
|
|
1637
|
-
},
|
|
1638
|
-
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" }) })
|
|
1639
|
-
}
|
|
1640
|
-
),
|
|
1641
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1642
|
-
"h3",
|
|
1643
|
-
{
|
|
1644
|
-
style: {
|
|
1645
|
-
margin: "0 0 0.5rem 0",
|
|
1646
|
-
fontSize: "1.125rem",
|
|
1647
|
-
fontWeight: "600",
|
|
1648
|
-
color: "#111827"
|
|
1649
|
-
},
|
|
1650
|
-
children: title
|
|
1651
|
-
}
|
|
1652
|
-
),
|
|
1653
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1654
|
-
"p",
|
|
1655
|
-
{
|
|
1656
|
-
style: {
|
|
1657
|
-
margin: "0 0 1.5rem 0",
|
|
1658
|
-
fontSize: "0.875rem",
|
|
1659
|
-
color: "#6b7280",
|
|
1660
|
-
lineHeight: "1.5"
|
|
1661
|
-
},
|
|
1662
|
-
children: message
|
|
1663
|
-
}
|
|
1664
|
-
),
|
|
1665
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", gap: "0.75rem", flexWrap: "wrap" }, children: [
|
|
1666
|
-
showRetry && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1667
|
-
"button",
|
|
1668
|
-
{
|
|
1669
|
-
onClick: handleRetry,
|
|
1670
|
-
disabled: isPending || isRetrying,
|
|
1671
|
-
style: {
|
|
1672
|
-
padding: "0.5rem 1rem",
|
|
1673
|
-
backgroundColor: "#3b82f6",
|
|
1674
|
-
color: "white",
|
|
1675
|
-
border: "none",
|
|
1676
|
-
borderRadius: "6px",
|
|
1677
|
-
fontSize: "0.875rem",
|
|
1678
|
-
fontWeight: "500",
|
|
1679
|
-
cursor: isPending || isRetrying ? "wait" : "pointer",
|
|
1680
|
-
opacity: isPending || isRetrying ? 0.7 : 1,
|
|
1681
|
-
transition: "all 0.2s"
|
|
1682
|
-
},
|
|
1683
|
-
children: isRetrying ? "Retrying..." : actionText
|
|
1684
|
-
}
|
|
1685
|
-
),
|
|
1686
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1687
|
-
"button",
|
|
1688
|
-
{
|
|
1689
|
-
onClick: () => window.location.reload(),
|
|
1690
|
-
style: {
|
|
1691
|
-
padding: "0.5rem 1rem",
|
|
1692
|
-
backgroundColor: "transparent",
|
|
1693
|
-
color: "#6b7280",
|
|
1694
|
-
border: "1px solid #d1d5db",
|
|
1695
|
-
borderRadius: "6px",
|
|
1696
|
-
fontSize: "0.875rem",
|
|
1697
|
-
fontWeight: "500",
|
|
1698
|
-
cursor: "pointer",
|
|
1699
|
-
transition: "all 0.2s"
|
|
1700
|
-
},
|
|
1701
|
-
children: "Refresh Page"
|
|
1702
|
-
}
|
|
1703
|
-
)
|
|
1704
|
-
] }),
|
|
1705
|
-
process.env.NODE_ENV === "development" && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1706
|
-
"details",
|
|
1707
|
-
{
|
|
1708
|
-
style: {
|
|
1709
|
-
marginTop: "1rem",
|
|
1710
|
-
fontSize: "0.75rem",
|
|
1711
|
-
color: "#6b7280",
|
|
1712
|
-
width: "100%"
|
|
1713
|
-
},
|
|
1714
|
-
children: [
|
|
1715
|
-
/* @__PURE__ */ jsxRuntime.jsx("summary", { style: { cursor: "pointer", marginBottom: "0.5rem" }, children: "Error Details" }),
|
|
1716
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1717
|
-
"pre",
|
|
1718
|
-
{
|
|
1719
|
-
style: {
|
|
1720
|
-
whiteSpace: "pre-wrap",
|
|
1721
|
-
wordBreak: "break-all",
|
|
1722
|
-
backgroundColor: "#f3f4f6",
|
|
1723
|
-
padding: "0.5rem",
|
|
1724
|
-
borderRadius: "4px",
|
|
1725
|
-
overflow: "auto",
|
|
1726
|
-
maxHeight: "200px"
|
|
1727
|
-
},
|
|
1728
|
-
children: error.message
|
|
1729
|
-
}
|
|
1730
|
-
)
|
|
1731
|
-
]
|
|
1732
|
-
}
|
|
1733
|
-
)
|
|
1734
|
-
]
|
|
1735
|
-
}
|
|
1736
|
-
);
|
|
1737
|
-
}
|
|
1738
|
-
function withErrorBoundary(Component2, errorBoundaryProps) {
|
|
1739
|
-
let WrappedComponent = (props) => /* @__PURE__ */ jsxRuntime.jsx(ConnectorErrorBoundary, { ...errorBoundaryProps, children: /* @__PURE__ */ jsxRuntime.jsx(Component2, { ...props }) });
|
|
1740
|
-
return WrappedComponent.displayName = `withErrorBoundary(${Component2.displayName || Component2.name})`, WrappedComponent;
|
|
1741
|
-
}
|
|
1742
|
-
var logger7 = chunkDSUCH44G_js.createLogger("Polyfills"), installed = false;
|
|
1937
|
+
var logger6 = chunkSITQ4JWM_js.createLogger("Polyfills"), installed = false;
|
|
1743
1938
|
function installPolyfills() {
|
|
1744
1939
|
if (!(installed || typeof window > "u"))
|
|
1745
1940
|
try {
|
|
1746
|
-
webcryptoEd25519Polyfill.install(), installed = true,
|
|
1941
|
+
webcryptoEd25519Polyfill.install(), installed = true, logger6.info("Browser compatibility polyfills installed");
|
|
1747
1942
|
} catch (error) {
|
|
1748
|
-
|
|
1943
|
+
logger6 && logger6.warn("Failed to install polyfills", { error }), installed = true;
|
|
1749
1944
|
}
|
|
1750
1945
|
}
|
|
1751
1946
|
function isPolyfillInstalled() {
|
|
@@ -1766,6 +1961,404 @@ function getPolyfillStatus() {
|
|
|
1766
1961
|
environment: typeof window < "u" ? "browser" : "server"
|
|
1767
1962
|
};
|
|
1768
1963
|
}
|
|
1964
|
+
var logger7 = chunkSITQ4JWM_js.createLogger("EnhancedStorage"), STORAGE_VERSION = "v1", EnhancedStorage = class extends core.Storage {
|
|
1965
|
+
constructor(key, initial, options) {
|
|
1966
|
+
super(key, initial);
|
|
1967
|
+
this.options = options;
|
|
1968
|
+
chunkSITQ4JWM_js.__publicField(this, "errorHandlers", /* @__PURE__ */ new Set());
|
|
1969
|
+
chunkSITQ4JWM_js.__publicField(this, "validators", []);
|
|
1970
|
+
chunkSITQ4JWM_js.__publicField(this, "memoryFallback");
|
|
1971
|
+
this.memoryFallback = initial, options?.onError && this.errorHandlers.add(options.onError), options?.validator && this.validators.push(options.validator);
|
|
1972
|
+
}
|
|
1973
|
+
set(value) {
|
|
1974
|
+
try {
|
|
1975
|
+
return this.validate(value) ? (super.set(value), this.memoryFallback = value, true) : (logger7.warn("Validation failed", { key: this.key }), false);
|
|
1976
|
+
} catch (error) {
|
|
1977
|
+
return this.handleError(error), this.options?.useMemoryFallback ? (this.memoryFallback = value, true) : false;
|
|
1978
|
+
}
|
|
1979
|
+
}
|
|
1980
|
+
get() {
|
|
1981
|
+
try {
|
|
1982
|
+
return super.get();
|
|
1983
|
+
} catch (error) {
|
|
1984
|
+
return this.handleError(error), this.options?.useMemoryFallback ? this.memoryFallback : this.initial;
|
|
1985
|
+
}
|
|
1986
|
+
}
|
|
1987
|
+
validate(value) {
|
|
1988
|
+
return this.validators.every((validator) => validator(value));
|
|
1989
|
+
}
|
|
1990
|
+
addValidator(validator) {
|
|
1991
|
+
return this.validators.push(validator), this;
|
|
1992
|
+
}
|
|
1993
|
+
onError(handler) {
|
|
1994
|
+
return this.errorHandlers.add(handler), this;
|
|
1995
|
+
}
|
|
1996
|
+
transform(transformer) {
|
|
1997
|
+
return transformer(this.get());
|
|
1998
|
+
}
|
|
1999
|
+
reset() {
|
|
2000
|
+
this.set(this.initial);
|
|
2001
|
+
}
|
|
2002
|
+
clear() {
|
|
2003
|
+
try {
|
|
2004
|
+
typeof window < "u" && window.localStorage && window.localStorage.removeItem(this.key), this.reset();
|
|
2005
|
+
} catch (error) {
|
|
2006
|
+
this.handleError(error);
|
|
2007
|
+
}
|
|
2008
|
+
}
|
|
2009
|
+
isAvailable() {
|
|
2010
|
+
try {
|
|
2011
|
+
if (typeof window > "u") return false;
|
|
2012
|
+
let testKey = `__storage_test_${this.key}__`;
|
|
2013
|
+
return window.localStorage.setItem(testKey, "test"), window.localStorage.removeItem(testKey), true;
|
|
2014
|
+
} catch {
|
|
2015
|
+
return false;
|
|
2016
|
+
}
|
|
2017
|
+
}
|
|
2018
|
+
static migrate(oldKey, newStorage) {
|
|
2019
|
+
try {
|
|
2020
|
+
if (typeof window > "u") return false;
|
|
2021
|
+
let oldValue = window.localStorage.getItem(oldKey);
|
|
2022
|
+
if (oldValue) {
|
|
2023
|
+
let parsed = JSON.parse(oldValue);
|
|
2024
|
+
return newStorage.set(parsed), window.localStorage.removeItem(oldKey), true;
|
|
2025
|
+
}
|
|
2026
|
+
return false;
|
|
2027
|
+
} catch {
|
|
2028
|
+
return false;
|
|
2029
|
+
}
|
|
2030
|
+
}
|
|
2031
|
+
handleError(error) {
|
|
2032
|
+
logger7.error("Storage error", { key: this.key, error }), this.errorHandlers.forEach((handler) => {
|
|
2033
|
+
try {
|
|
2034
|
+
handler(error);
|
|
2035
|
+
} catch (err) {
|
|
2036
|
+
logger7.error("Error in error handler", { error: err });
|
|
2037
|
+
}
|
|
2038
|
+
});
|
|
2039
|
+
}
|
|
2040
|
+
};
|
|
2041
|
+
function createEnhancedStorageAccount(options) {
|
|
2042
|
+
let key = options?.key ?? `connector-kit:${STORAGE_VERSION}:account`;
|
|
2043
|
+
return new EnhancedStorage(key, options?.initial, {
|
|
2044
|
+
validator: options?.validator,
|
|
2045
|
+
onError: options?.onError,
|
|
2046
|
+
useMemoryFallback: true
|
|
2047
|
+
// Always fallback for SSR
|
|
2048
|
+
});
|
|
2049
|
+
}
|
|
2050
|
+
function createEnhancedStorageCluster(options) {
|
|
2051
|
+
let key = options?.key ?? `connector-kit:${STORAGE_VERSION}:cluster`, storage = new EnhancedStorage(key, options?.initial ?? "solana:mainnet", {
|
|
2052
|
+
onError: options?.onError,
|
|
2053
|
+
useMemoryFallback: true
|
|
2054
|
+
});
|
|
2055
|
+
return options?.validClusters && storage.addValidator((clusterId) => options.validClusters.includes(clusterId)), storage;
|
|
2056
|
+
}
|
|
2057
|
+
function createEnhancedStorageWallet(options) {
|
|
2058
|
+
let key = options?.key ?? `connector-kit:${STORAGE_VERSION}:wallet`;
|
|
2059
|
+
return new EnhancedStorage(key, options?.initial, {
|
|
2060
|
+
onError: options?.onError,
|
|
2061
|
+
useMemoryFallback: true
|
|
2062
|
+
});
|
|
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
|
+
}
|
|
2111
|
+
var EnhancedStorageAdapter = class {
|
|
2112
|
+
constructor(storage) {
|
|
2113
|
+
this.storage = storage;
|
|
2114
|
+
}
|
|
2115
|
+
get() {
|
|
2116
|
+
return this.storage.get();
|
|
2117
|
+
}
|
|
2118
|
+
set(value) {
|
|
2119
|
+
this.storage.set(value);
|
|
2120
|
+
}
|
|
2121
|
+
subscribe(callback) {
|
|
2122
|
+
return this.storage.value.subscribe(callback);
|
|
2123
|
+
}
|
|
2124
|
+
validate(value) {
|
|
2125
|
+
return this.storage.validate(value);
|
|
2126
|
+
}
|
|
2127
|
+
reset() {
|
|
2128
|
+
this.storage.reset();
|
|
2129
|
+
}
|
|
2130
|
+
clear() {
|
|
2131
|
+
this.storage.clear();
|
|
2132
|
+
}
|
|
2133
|
+
isAvailable() {
|
|
2134
|
+
return this.storage.isAvailable();
|
|
2135
|
+
}
|
|
2136
|
+
transform(transformer) {
|
|
2137
|
+
return this.storage.transform(transformer);
|
|
2138
|
+
}
|
|
2139
|
+
addValidator(validator) {
|
|
2140
|
+
return this.storage.addValidator(validator), this;
|
|
2141
|
+
}
|
|
2142
|
+
onError(handler) {
|
|
2143
|
+
return this.storage.onError(handler), this;
|
|
2144
|
+
}
|
|
2145
|
+
};
|
|
2146
|
+
var logger8 = chunkSITQ4JWM_js.createLogger("DefaultConfig");
|
|
2147
|
+
function getDefaultConfig(options) {
|
|
2148
|
+
let {
|
|
2149
|
+
appName,
|
|
2150
|
+
appUrl,
|
|
2151
|
+
autoConnect = true,
|
|
2152
|
+
debug,
|
|
2153
|
+
network = "mainnet-beta",
|
|
2154
|
+
enableMobile = true,
|
|
2155
|
+
storage,
|
|
2156
|
+
clusters,
|
|
2157
|
+
customClusters = [],
|
|
2158
|
+
persistClusterSelection = true,
|
|
2159
|
+
clusterStorageKey,
|
|
2160
|
+
enableErrorBoundary = true,
|
|
2161
|
+
maxRetries = DEFAULT_MAX_RETRIES,
|
|
2162
|
+
onError,
|
|
2163
|
+
imageProxy,
|
|
2164
|
+
programLabels,
|
|
2165
|
+
coingecko,
|
|
2166
|
+
walletConnect
|
|
2167
|
+
} = options, defaultClusters = clusters ?? [
|
|
2168
|
+
core.createSolanaMainnet(),
|
|
2169
|
+
core.createSolanaDevnet(),
|
|
2170
|
+
core.createSolanaTestnet(),
|
|
2171
|
+
...network === "localnet" ? [core.createSolanaLocalnet()] : [],
|
|
2172
|
+
...customClusters || []
|
|
2173
|
+
], validClusterIds = defaultClusters.map((c) => c.id), accountStorage = createEnhancedStorageAccount({
|
|
2174
|
+
validator: (address) => address ? addresses.isAddress(address) : true,
|
|
2175
|
+
onError: (error) => {
|
|
2176
|
+
debug && logger8.error("Account Storage error", { error }), onError && onError(error, {
|
|
2177
|
+
componentStack: "account-storage"
|
|
2178
|
+
});
|
|
2179
|
+
}
|
|
2180
|
+
}), clusterStorage = createEnhancedStorageCluster({
|
|
2181
|
+
key: clusterStorageKey,
|
|
2182
|
+
initial: getInitialCluster(network),
|
|
2183
|
+
validClusters: persistClusterSelection ? validClusterIds : void 0,
|
|
2184
|
+
onError: (error) => {
|
|
2185
|
+
debug && logger8.error("Cluster Storage error", { error }), onError && onError(error, {
|
|
2186
|
+
componentStack: "cluster-storage"
|
|
2187
|
+
});
|
|
2188
|
+
}
|
|
2189
|
+
}), walletStorage = createEnhancedStorageWallet({
|
|
2190
|
+
onError: (error) => {
|
|
2191
|
+
debug && logger8.error("Wallet Storage error", { error }), onError && onError(error, {
|
|
2192
|
+
componentStack: "wallet-storage"
|
|
2193
|
+
});
|
|
2194
|
+
}
|
|
2195
|
+
});
|
|
2196
|
+
if (typeof window < "u") {
|
|
2197
|
+
let oldAccountKey = "connector-kit:account", oldWalletKey = "connector-kit:wallet", oldClusterKey = clusterStorageKey || "connector-kit:cluster";
|
|
2198
|
+
EnhancedStorage.migrate(oldAccountKey, accountStorage), EnhancedStorage.migrate(oldWalletKey, walletStorage), EnhancedStorage.migrate(oldClusterKey, clusterStorage);
|
|
2199
|
+
}
|
|
2200
|
+
let defaultStorage = storage ?? {
|
|
2201
|
+
account: new EnhancedStorageAdapter(accountStorage),
|
|
2202
|
+
cluster: new EnhancedStorageAdapter(clusterStorage),
|
|
2203
|
+
wallet: new EnhancedStorageAdapter(walletStorage)
|
|
2204
|
+
}, walletConnectConfig = buildWalletConnectConfig(walletConnect, appName, appUrl, clusterStorageKey ?? "connector-kit:v1:cluster");
|
|
2205
|
+
return {
|
|
2206
|
+
autoConnect,
|
|
2207
|
+
debug: debug ?? process.env.NODE_ENV === "development",
|
|
2208
|
+
storage: defaultStorage,
|
|
2209
|
+
appName,
|
|
2210
|
+
appUrl,
|
|
2211
|
+
enableMobile,
|
|
2212
|
+
network,
|
|
2213
|
+
cluster: {
|
|
2214
|
+
clusters: defaultClusters,
|
|
2215
|
+
persistSelection: persistClusterSelection,
|
|
2216
|
+
initialCluster: getInitialCluster(network)
|
|
2217
|
+
},
|
|
2218
|
+
errorBoundary: {
|
|
2219
|
+
enabled: enableErrorBoundary,
|
|
2220
|
+
maxRetries,
|
|
2221
|
+
onError
|
|
2222
|
+
},
|
|
2223
|
+
imageProxy,
|
|
2224
|
+
programLabels,
|
|
2225
|
+
coingecko,
|
|
2226
|
+
walletConnect: walletConnectConfig
|
|
2227
|
+
};
|
|
2228
|
+
}
|
|
2229
|
+
function buildWalletConnectConfig(walletConnect, appName, appUrl, clusterStorageKey) {
|
|
2230
|
+
if (!walletConnect) return;
|
|
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;
|
|
2232
|
+
if (!projectId) {
|
|
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
|
+
);
|
|
2236
|
+
return;
|
|
2237
|
+
}
|
|
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;
|
|
2239
|
+
return {
|
|
2240
|
+
enabled: true,
|
|
2241
|
+
projectId,
|
|
2242
|
+
metadata: {
|
|
2243
|
+
name: customMetadata?.name ?? appName,
|
|
2244
|
+
description: customMetadata?.description ?? `${appName} - Powered by ConnectorKit`,
|
|
2245
|
+
url: customMetadata?.url ?? origin,
|
|
2246
|
+
icons: customMetadata?.icons ?? [`${origin}/icon.svg`]
|
|
2247
|
+
},
|
|
2248
|
+
defaultChain: customDefaultChain ?? "solana:mainnet",
|
|
2249
|
+
relayUrl: customRelayUrl,
|
|
2250
|
+
// Auto-sync with cluster storage
|
|
2251
|
+
getCurrentChain: () => {
|
|
2252
|
+
if (typeof window > "u") return "solana:mainnet";
|
|
2253
|
+
let storageKey = clusterStorageKey || "connector-kit:v1:cluster";
|
|
2254
|
+
try {
|
|
2255
|
+
let stored = localStorage.getItem(storageKey);
|
|
2256
|
+
if (stored) {
|
|
2257
|
+
let id = JSON.parse(stored);
|
|
2258
|
+
if (id === "solana:mainnet" || id === "solana:devnet" || id === "solana:testnet")
|
|
2259
|
+
return id;
|
|
2260
|
+
}
|
|
2261
|
+
} catch {
|
|
2262
|
+
}
|
|
2263
|
+
return customDefaultChain ?? "solana:mainnet";
|
|
2264
|
+
}
|
|
2265
|
+
// Note: onDisplayUri, onSessionEstablished, onSessionDisconnected are auto-wired by AppProvider
|
|
2266
|
+
};
|
|
2267
|
+
}
|
|
2268
|
+
function getInitialCluster(network = "mainnet-beta") {
|
|
2269
|
+
return toClusterId(network);
|
|
2270
|
+
}
|
|
2271
|
+
function getDefaultMobileConfig(options) {
|
|
2272
|
+
let baseUrl = options.appUrl || (typeof window < "u" ? window.location.origin : "https://localhost:3000");
|
|
2273
|
+
return {
|
|
2274
|
+
appIdentity: {
|
|
2275
|
+
name: options.appName,
|
|
2276
|
+
uri: baseUrl,
|
|
2277
|
+
icon: `${baseUrl}/favicon.ico`
|
|
2278
|
+
},
|
|
2279
|
+
cluster: options.network || "mainnet-beta"
|
|
2280
|
+
};
|
|
2281
|
+
}
|
|
2282
|
+
var solanaNetworkSchema = v4.z.enum(["mainnet", "mainnet-beta", "devnet", "testnet", "localnet"]), solanaClusterIdSchema = v4.z.string().regex(/^solana:(mainnet|devnet|testnet|localnet|[a-zA-Z0-9-]+)$/, {
|
|
2283
|
+
message: 'Cluster ID must be in format "solana:<network>" (e.g., "solana:mainnet")'
|
|
2284
|
+
}), urlSchema = v4.z.string().url("Invalid URL format"), optionalUrlSchema = urlSchema.optional(), coinGeckoConfigSchema = v4.z.strictObject({
|
|
2285
|
+
apiKey: v4.z.string().optional(),
|
|
2286
|
+
isPro: v4.z.boolean().optional(),
|
|
2287
|
+
maxRetries: v4.z.number().int().positive().max(10).optional(),
|
|
2288
|
+
baseDelay: v4.z.number().int().positive().max(3e4).optional(),
|
|
2289
|
+
maxTimeout: v4.z.number().int().positive().max(12e4).optional()
|
|
2290
|
+
}).optional(), walletConnectMetadataSchema = v4.z.object({
|
|
2291
|
+
name: v4.z.string().min(1, "WalletConnect app name is required"),
|
|
2292
|
+
description: v4.z.string(),
|
|
2293
|
+
url: urlSchema,
|
|
2294
|
+
icons: v4.z.array(v4.z.string())
|
|
2295
|
+
}), walletConnectObjectConfigSchema = v4.z.object({
|
|
2296
|
+
enabled: v4.z.boolean().optional(),
|
|
2297
|
+
projectId: v4.z.string().min(1, "WalletConnect projectId is required"),
|
|
2298
|
+
metadata: walletConnectMetadataSchema,
|
|
2299
|
+
defaultChain: v4.z.enum(["solana:mainnet", "solana:devnet", "solana:testnet"]).optional(),
|
|
2300
|
+
onDisplayUri: v4.z.custom((val) => typeof val == "function").optional(),
|
|
2301
|
+
onSessionEstablished: v4.z.custom((val) => typeof val == "function").optional(),
|
|
2302
|
+
onSessionDisconnected: v4.z.custom((val) => typeof val == "function").optional(),
|
|
2303
|
+
relayUrl: urlSchema.optional()
|
|
2304
|
+
}), walletConnectConfigSchema = v4.z.union([v4.z.literal(true), walletConnectObjectConfigSchema]).optional(), storageAdapterSchema = v4.z.looseObject({
|
|
2305
|
+
get: v4.z.custom((val) => typeof val == "function"),
|
|
2306
|
+
set: v4.z.custom((val) => typeof val == "function")
|
|
2307
|
+
}), storageConfigSchema = v4.z.object({
|
|
2308
|
+
account: storageAdapterSchema,
|
|
2309
|
+
cluster: storageAdapterSchema,
|
|
2310
|
+
wallet: storageAdapterSchema
|
|
2311
|
+
}).optional(), solanaClusterSchema = v4.z.object({
|
|
2312
|
+
id: solanaClusterIdSchema,
|
|
2313
|
+
label: v4.z.string().min(1, "Cluster label cannot be empty"),
|
|
2314
|
+
url: urlSchema,
|
|
2315
|
+
urlWs: urlSchema.optional()
|
|
2316
|
+
}), clusterConfigSchema = v4.z.object({
|
|
2317
|
+
clusters: v4.z.array(solanaClusterSchema).optional(),
|
|
2318
|
+
persistSelection: v4.z.boolean().optional(),
|
|
2319
|
+
initialCluster: solanaClusterIdSchema.optional()
|
|
2320
|
+
}).optional(), defaultConfigOptionsSchema = v4.z.object({
|
|
2321
|
+
// Required
|
|
2322
|
+
appName: v4.z.string().min(1, "Application name is required"),
|
|
2323
|
+
// Optional strings
|
|
2324
|
+
appUrl: optionalUrlSchema,
|
|
2325
|
+
imageProxy: v4.z.string().optional(),
|
|
2326
|
+
clusterStorageKey: v4.z.string().optional(),
|
|
2327
|
+
// Optional booleans
|
|
2328
|
+
autoConnect: v4.z.boolean().optional(),
|
|
2329
|
+
debug: v4.z.boolean().optional(),
|
|
2330
|
+
enableMobile: v4.z.boolean().optional(),
|
|
2331
|
+
persistClusterSelection: v4.z.boolean().optional(),
|
|
2332
|
+
enableErrorBoundary: v4.z.boolean().optional(),
|
|
2333
|
+
// Network
|
|
2334
|
+
network: solanaNetworkSchema.optional(),
|
|
2335
|
+
// Numbers
|
|
2336
|
+
maxRetries: v4.z.number().int().positive().max(10).optional(),
|
|
2337
|
+
// Complex types
|
|
2338
|
+
storage: storageConfigSchema,
|
|
2339
|
+
clusters: v4.z.array(solanaClusterSchema).optional(),
|
|
2340
|
+
customClusters: v4.z.array(solanaClusterSchema).optional(),
|
|
2341
|
+
programLabels: v4.z.record(v4.z.string(), v4.z.string()).optional(),
|
|
2342
|
+
coingecko: coinGeckoConfigSchema,
|
|
2343
|
+
walletConnect: walletConnectConfigSchema,
|
|
2344
|
+
// Functions (can't validate implementation, just existence)
|
|
2345
|
+
onError: v4.z.custom((val) => typeof val == "function").optional()
|
|
2346
|
+
}); v4.z.strictObject({
|
|
2347
|
+
autoConnect: v4.z.boolean().optional(),
|
|
2348
|
+
debug: v4.z.boolean().optional(),
|
|
2349
|
+
storage: storageConfigSchema,
|
|
2350
|
+
cluster: clusterConfigSchema,
|
|
2351
|
+
imageProxy: v4.z.string().optional(),
|
|
2352
|
+
programLabels: v4.z.record(v4.z.string(), v4.z.string()).optional(),
|
|
2353
|
+
coingecko: coinGeckoConfigSchema,
|
|
2354
|
+
walletConnect: walletConnectConfigSchema
|
|
2355
|
+
}).optional();
|
|
2356
|
+
function validateConfigOptions(options) {
|
|
2357
|
+
return defaultConfigOptionsSchema.safeParse(options);
|
|
2358
|
+
}
|
|
2359
|
+
function parseConfigOptions(options) {
|
|
2360
|
+
return defaultConfigOptionsSchema.parse(options);
|
|
2361
|
+
}
|
|
1769
2362
|
|
|
1770
2363
|
// src/utils/formatting.ts
|
|
1771
2364
|
function formatAddress(address, options = {}) {
|
|
@@ -1977,7 +2570,7 @@ async function copySignatureToClipboard(signature, options) {
|
|
|
1977
2570
|
}
|
|
1978
2571
|
|
|
1979
2572
|
// src/lib/transaction/transaction-validator.ts
|
|
1980
|
-
var
|
|
2573
|
+
var logger9 = chunkSITQ4JWM_js.createLogger("TransactionValidator"), MAX_TRANSACTION_SIZE = 1232, MIN_TRANSACTION_SIZE = 64, TransactionValidator = class {
|
|
1981
2574
|
/**
|
|
1982
2575
|
* Validate a transaction before signing
|
|
1983
2576
|
*
|
|
@@ -2000,7 +2593,7 @@ var logger8 = chunkDSUCH44G_js.createLogger("TransactionValidator"), MAX_TRANSAC
|
|
|
2000
2593
|
try {
|
|
2001
2594
|
serialized = transaction.serialize();
|
|
2002
2595
|
} catch (serializeError) {
|
|
2003
|
-
|
|
2596
|
+
logger9.debug("Transaction not yet serializable (may need signing)", {
|
|
2004
2597
|
error: serializeError instanceof Error ? serializeError.message : String(serializeError)
|
|
2005
2598
|
});
|
|
2006
2599
|
}
|
|
@@ -2010,10 +2603,10 @@ var logger8 = chunkDSUCH44G_js.createLogger("TransactionValidator"), MAX_TRANSAC
|
|
|
2010
2603
|
return errors.push(
|
|
2011
2604
|
"Transaction type not recognized - must be a Transaction object with serialize() or Uint8Array"
|
|
2012
2605
|
), { valid: false, errors, warnings };
|
|
2013
|
-
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"));
|
|
2014
2607
|
} catch (error) {
|
|
2015
2608
|
let errorMessage = error instanceof Error ? error.message : String(error);
|
|
2016
|
-
errors.push(`Transaction validation failed: ${errorMessage}`),
|
|
2609
|
+
errors.push(`Transaction validation failed: ${errorMessage}`), logger9.error("Validation error", { error: errorMessage });
|
|
2017
2610
|
}
|
|
2018
2611
|
if (checkDuplicateSignatures && typeof transaction == "object" && "signatures" in transaction) {
|
|
2019
2612
|
let signatures = transaction.signatures;
|
|
@@ -2026,7 +2619,7 @@ var logger8 = chunkDSUCH44G_js.createLogger("TransactionValidator"), MAX_TRANSAC
|
|
|
2026
2619
|
}
|
|
2027
2620
|
strict && warnings.length > 0 && (errors.push(...warnings.map((w) => `Strict mode: ${w}`)), warnings.length = 0);
|
|
2028
2621
|
let valid = errors.length === 0;
|
|
2029
|
-
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 }), {
|
|
2030
2623
|
valid,
|
|
2031
2624
|
errors,
|
|
2032
2625
|
warnings,
|
|
@@ -2066,7 +2659,7 @@ var logger8 = chunkDSUCH44G_js.createLogger("TransactionValidator"), MAX_TRANSAC
|
|
|
2066
2659
|
let result = this.validate(transaction, options);
|
|
2067
2660
|
if (!result.valid)
|
|
2068
2661
|
throw new Error(`Transaction validation failed: ${result.errors.join(", ")}`);
|
|
2069
|
-
result.warnings.length > 0 &&
|
|
2662
|
+
result.warnings.length > 0 && logger9.warn("Transaction validation warnings", { warnings: result.warnings });
|
|
2070
2663
|
}
|
|
2071
2664
|
/**
|
|
2072
2665
|
* Batch validate multiple transactions
|
|
@@ -2077,10 +2670,10 @@ var logger8 = chunkDSUCH44G_js.createLogger("TransactionValidator"), MAX_TRANSAC
|
|
|
2077
2670
|
* @returns Array of validation results
|
|
2078
2671
|
*/
|
|
2079
2672
|
static validateBatch(transactions, options) {
|
|
2080
|
-
return transactions.map((tx, index) => (
|
|
2673
|
+
return transactions.map((tx, index) => (logger9.debug(`Validating transaction ${index + 1}/${transactions.length}`), this.validate(tx, options)));
|
|
2081
2674
|
}
|
|
2082
2675
|
};
|
|
2083
|
-
var
|
|
2676
|
+
var logger10 = chunkSITQ4JWM_js.createLogger("TransactionSigner");
|
|
2084
2677
|
function signatureBytesToBase58(bytes) {
|
|
2085
2678
|
if (bytes.length !== 64)
|
|
2086
2679
|
throw new Error(`Invalid signature length: expected 64 bytes, got ${bytes.length}`);
|
|
@@ -2102,6 +2695,24 @@ function extractSignatureString(result) {
|
|
|
2102
2695
|
}
|
|
2103
2696
|
throw new Error("Unexpected wallet response format for signAndSendTransaction");
|
|
2104
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
|
+
}
|
|
2105
2716
|
function createTransactionSigner(config) {
|
|
2106
2717
|
let { wallet, account, cluster, eventEmitter } = config;
|
|
2107
2718
|
if (!wallet || !account)
|
|
@@ -2115,14 +2726,14 @@ function createTransactionSigner(config) {
|
|
|
2115
2726
|
address,
|
|
2116
2727
|
async signTransaction(transaction) {
|
|
2117
2728
|
if (!capabilities.canSign)
|
|
2118
|
-
throw
|
|
2729
|
+
throw chunkSITQ4JWM_js.Errors.featureNotSupported("transaction signing");
|
|
2119
2730
|
let validation = TransactionValidator.validate(transaction);
|
|
2120
2731
|
if (!validation.valid)
|
|
2121
|
-
throw
|
|
2122
|
-
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 });
|
|
2123
2734
|
try {
|
|
2124
|
-
let signFeature = features["solana:signTransaction"], { serialized, wasWeb3js } =
|
|
2125
|
-
|
|
2735
|
+
let signFeature = features["solana:signTransaction"], { serialized, wasWeb3js } = chunk4KD6HQQG_js.prepareTransactionForWallet(transaction);
|
|
2736
|
+
logger10.debug("Signing transaction", {
|
|
2126
2737
|
wasWeb3js,
|
|
2127
2738
|
serializedLength: serialized.length,
|
|
2128
2739
|
serializedType: serialized.constructor.name,
|
|
@@ -2131,26 +2742,26 @@ function createTransactionSigner(config) {
|
|
|
2131
2742
|
});
|
|
2132
2743
|
let result, usedFormat = "";
|
|
2133
2744
|
try {
|
|
2134
|
-
|
|
2745
|
+
logger10.debug("Trying array format: transactions: [Uint8Array]"), result = await signFeature.signTransaction({
|
|
2135
2746
|
account,
|
|
2136
2747
|
transactions: [serialized],
|
|
2137
2748
|
...cluster ? { chain: cluster.id } : {}
|
|
2138
2749
|
}), usedFormat = "array";
|
|
2139
2750
|
} catch (err1) {
|
|
2140
2751
|
let error1 = err1 instanceof Error ? err1 : new Error(String(err1));
|
|
2141
|
-
|
|
2752
|
+
logger10.debug("Array format failed, trying singular format", { error: error1.message });
|
|
2142
2753
|
try {
|
|
2143
|
-
|
|
2754
|
+
logger10.debug("Trying singular format: transaction: Uint8Array"), result = await signFeature.signTransaction({
|
|
2144
2755
|
account,
|
|
2145
2756
|
transaction: serialized,
|
|
2146
2757
|
...cluster ? { chain: cluster.id } : {}
|
|
2147
2758
|
}), usedFormat = "singular";
|
|
2148
2759
|
} catch (err2) {
|
|
2149
2760
|
let error2 = err2 instanceof Error ? err2 : new Error(String(err2));
|
|
2150
|
-
throw
|
|
2761
|
+
throw logger10.error("Both array and singular formats failed", { error: error2.message }), error2;
|
|
2151
2762
|
}
|
|
2152
2763
|
}
|
|
2153
|
-
|
|
2764
|
+
logger10.debug("Wallet signed successfully", { format: usedFormat });
|
|
2154
2765
|
let signedTx;
|
|
2155
2766
|
if (Array.isArray(result.signedTransactions) && result.signedTransactions[0])
|
|
2156
2767
|
signedTx = result.signedTransactions[0];
|
|
@@ -2162,31 +2773,31 @@ function createTransactionSigner(config) {
|
|
|
2162
2773
|
signedTx = result;
|
|
2163
2774
|
else
|
|
2164
2775
|
throw new Error(`Unexpected wallet response format: ${JSON.stringify(Object.keys(result))}`);
|
|
2165
|
-
if (
|
|
2776
|
+
if (logger10.debug("Extracted signed transaction", {
|
|
2166
2777
|
hasSignedTx: !!signedTx,
|
|
2167
2778
|
signedTxType: signedTx?.constructor?.name,
|
|
2168
2779
|
signedTxLength: signedTx?.length,
|
|
2169
2780
|
isUint8Array: signedTx instanceof Uint8Array,
|
|
2170
2781
|
hasSerialize: typeof signedTx?.serialize == "function"
|
|
2171
2782
|
}), signedTx && typeof signedTx.serialize == "function")
|
|
2172
|
-
return
|
|
2783
|
+
return logger10.debug("Wallet returned web3.js object directly, no conversion needed"), signedTx;
|
|
2173
2784
|
if (signedTx && signedTx.signedTransaction) {
|
|
2174
|
-
|
|
2785
|
+
logger10.debug("Found signedTransaction property");
|
|
2175
2786
|
let bytes = signedTx.signedTransaction;
|
|
2176
2787
|
if (bytes instanceof Uint8Array)
|
|
2177
|
-
return await
|
|
2788
|
+
return await chunk4KD6HQQG_js.convertSignedTransaction(bytes, wasWeb3js);
|
|
2178
2789
|
}
|
|
2179
2790
|
if (signedTx instanceof Uint8Array)
|
|
2180
|
-
return await
|
|
2181
|
-
throw
|
|
2791
|
+
return await chunk4KD6HQQG_js.convertSignedTransaction(signedTx, wasWeb3js);
|
|
2792
|
+
throw logger10.error("Unexpected wallet response format", {
|
|
2182
2793
|
type: typeof signedTx,
|
|
2183
2794
|
constructor: signedTx?.constructor?.name
|
|
2184
|
-
}), new
|
|
2795
|
+
}), new chunkSITQ4JWM_js.ValidationError(
|
|
2185
2796
|
"INVALID_FORMAT",
|
|
2186
2797
|
"Wallet returned unexpected format - not a Transaction or Uint8Array"
|
|
2187
2798
|
);
|
|
2188
2799
|
} catch (error) {
|
|
2189
|
-
throw
|
|
2800
|
+
throw chunkSITQ4JWM_js.Errors.signingFailed(error);
|
|
2190
2801
|
}
|
|
2191
2802
|
},
|
|
2192
2803
|
async signAllTransactions(transactions) {
|
|
@@ -2194,18 +2805,24 @@ function createTransactionSigner(config) {
|
|
|
2194
2805
|
return [];
|
|
2195
2806
|
if (capabilities.supportsBatchSigning)
|
|
2196
2807
|
try {
|
|
2197
|
-
let signFeature = features["solana:signAllTransactions"], prepared = transactions.map((tx) =>
|
|
2808
|
+
let signFeature = features["solana:signAllTransactions"], prepared = transactions.map((tx) => chunk4KD6HQQG_js.prepareTransactionForWallet(tx)), serializedTxs = prepared.map((p) => p.serialized), wasWeb3js = prepared[0].wasWeb3js, result = await signFeature.signAllTransactions({
|
|
2198
2809
|
account,
|
|
2199
2810
|
transactions: serializedTxs,
|
|
2200
2811
|
...cluster ? { chain: cluster.id } : {}
|
|
2201
|
-
});
|
|
2812
|
+
}), signedBytesArray;
|
|
2813
|
+
if (Array.isArray(result))
|
|
2814
|
+
signedBytesArray = result.map((item) => item.signedTransaction);
|
|
2815
|
+
else if ("signedTransactions" in result)
|
|
2816
|
+
signedBytesArray = result.signedTransactions;
|
|
2817
|
+
else
|
|
2818
|
+
throw new Error("Unexpected signAllTransactions response format");
|
|
2202
2819
|
return await Promise.all(
|
|
2203
|
-
|
|
2204
|
-
(signedBytes) =>
|
|
2820
|
+
signedBytesArray.map(
|
|
2821
|
+
(signedBytes) => chunk4KD6HQQG_js.convertSignedTransaction(signedBytes, wasWeb3js)
|
|
2205
2822
|
)
|
|
2206
2823
|
);
|
|
2207
2824
|
} catch (error) {
|
|
2208
|
-
throw new
|
|
2825
|
+
throw new chunkSITQ4JWM_js.TransactionError(
|
|
2209
2826
|
"SIGNING_FAILED",
|
|
2210
2827
|
"Failed to sign transactions in batch",
|
|
2211
2828
|
{ count: transactions.length },
|
|
@@ -2213,14 +2830,14 @@ function createTransactionSigner(config) {
|
|
|
2213
2830
|
);
|
|
2214
2831
|
}
|
|
2215
2832
|
if (!capabilities.canSign)
|
|
2216
|
-
throw
|
|
2833
|
+
throw chunkSITQ4JWM_js.Errors.featureNotSupported("transaction signing");
|
|
2217
2834
|
let signed = [];
|
|
2218
2835
|
for (let i = 0; i < transactions.length; i++)
|
|
2219
2836
|
try {
|
|
2220
2837
|
let signedTx = await signer.signTransaction(transactions[i]);
|
|
2221
2838
|
signed.push(signedTx);
|
|
2222
2839
|
} catch (error) {
|
|
2223
|
-
throw new
|
|
2840
|
+
throw new chunkSITQ4JWM_js.TransactionError(
|
|
2224
2841
|
"SIGNING_FAILED",
|
|
2225
2842
|
`Failed to sign transaction ${i + 1} of ${transactions.length}`,
|
|
2226
2843
|
{ index: i, total: transactions.length },
|
|
@@ -2231,9 +2848,9 @@ function createTransactionSigner(config) {
|
|
|
2231
2848
|
},
|
|
2232
2849
|
async signAndSendTransaction(transaction, options) {
|
|
2233
2850
|
if (!capabilities.canSend)
|
|
2234
|
-
throw
|
|
2851
|
+
throw chunkSITQ4JWM_js.Errors.featureNotSupported("sending transactions");
|
|
2235
2852
|
try {
|
|
2236
|
-
let sendFeature = features["solana:signAndSendTransaction"], { serialized } =
|
|
2853
|
+
let sendFeature = features["solana:signAndSendTransaction"], { serialized } = chunk4KD6HQQG_js.prepareTransactionForWallet(transaction);
|
|
2237
2854
|
eventEmitter && eventEmitter.emit({
|
|
2238
2855
|
type: "transaction:preparing",
|
|
2239
2856
|
transaction: serialized,
|
|
@@ -2268,21 +2885,21 @@ function createTransactionSigner(config) {
|
|
|
2268
2885
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
2269
2886
|
}), signature;
|
|
2270
2887
|
} catch (error) {
|
|
2271
|
-
throw new
|
|
2888
|
+
throw new chunkSITQ4JWM_js.TransactionError("SEND_FAILED", "Failed to send transaction", void 0, error);
|
|
2272
2889
|
}
|
|
2273
2890
|
},
|
|
2274
2891
|
async signAndSendTransactions(transactions, options) {
|
|
2275
2892
|
if (transactions.length === 0)
|
|
2276
2893
|
return [];
|
|
2277
2894
|
if (!capabilities.canSend)
|
|
2278
|
-
throw
|
|
2895
|
+
throw chunkSITQ4JWM_js.Errors.featureNotSupported("sending transactions");
|
|
2279
2896
|
let signatures = [];
|
|
2280
2897
|
for (let i = 0; i < transactions.length; i++)
|
|
2281
2898
|
try {
|
|
2282
2899
|
let sig = await signer.signAndSendTransaction(transactions[i], options);
|
|
2283
2900
|
signatures.push(sig);
|
|
2284
2901
|
} catch (error) {
|
|
2285
|
-
throw new
|
|
2902
|
+
throw new chunkSITQ4JWM_js.TransactionError(
|
|
2286
2903
|
"SEND_FAILED",
|
|
2287
2904
|
`Failed to send transaction ${i + 1} of ${transactions.length}`,
|
|
2288
2905
|
{ index: i, total: transactions.length },
|
|
@@ -2294,13 +2911,14 @@ function createTransactionSigner(config) {
|
|
|
2294
2911
|
...capabilities.canSignMessage && {
|
|
2295
2912
|
async signMessage(message) {
|
|
2296
2913
|
try {
|
|
2297
|
-
|
|
2914
|
+
let result = await features["solana:signMessage"].signMessage({
|
|
2298
2915
|
account,
|
|
2299
2916
|
message,
|
|
2300
2917
|
...cluster ? { chain: cluster.id } : {}
|
|
2301
|
-
})
|
|
2918
|
+
});
|
|
2919
|
+
return extractSignatureBytes(result);
|
|
2302
2920
|
} catch (error) {
|
|
2303
|
-
throw new
|
|
2921
|
+
throw new chunkSITQ4JWM_js.TransactionError("SIGNING_FAILED", "Failed to sign message", void 0, error);
|
|
2304
2922
|
}
|
|
2305
2923
|
}
|
|
2306
2924
|
},
|
|
@@ -2310,16 +2928,16 @@ function createTransactionSigner(config) {
|
|
|
2310
2928
|
};
|
|
2311
2929
|
return signer;
|
|
2312
2930
|
}
|
|
2313
|
-
var TransactionSignerError = class extends
|
|
2931
|
+
var TransactionSignerError = class extends chunkSITQ4JWM_js.TransactionError {
|
|
2314
2932
|
constructor(message, code, originalError) {
|
|
2315
2933
|
let newCode = code === "WALLET_NOT_CONNECTED" ? "FEATURE_NOT_SUPPORTED" : code;
|
|
2316
2934
|
super(newCode, message, void 0, originalError), this.name = "TransactionSignerError";
|
|
2317
2935
|
}
|
|
2318
2936
|
};
|
|
2319
2937
|
function isTransactionSignerError(error) {
|
|
2320
|
-
return error instanceof TransactionSignerError || error instanceof
|
|
2938
|
+
return error instanceof TransactionSignerError || error instanceof chunkSITQ4JWM_js.TransactionError;
|
|
2321
2939
|
}
|
|
2322
|
-
var
|
|
2940
|
+
var logger11 = chunkSITQ4JWM_js.createLogger("KitTransactionSigner");
|
|
2323
2941
|
function encodeShortVecLength(value) {
|
|
2324
2942
|
let bytes = [], remaining = value;
|
|
2325
2943
|
for (; remaining >= 128; )
|
|
@@ -2374,7 +2992,7 @@ function extractSignature(signedTx) {
|
|
|
2374
2992
|
let signatureStart = bytesConsumed;
|
|
2375
2993
|
return signedTx.slice(signatureStart, signatureStart + 64);
|
|
2376
2994
|
}
|
|
2377
|
-
if (
|
|
2995
|
+
if (chunk4KD6HQQG_js.isWeb3jsTransaction(signedTx)) {
|
|
2378
2996
|
let signatures = signedTx.signatures;
|
|
2379
2997
|
if (!signatures || signatures.length === 0)
|
|
2380
2998
|
throw new Error("No signatures found in web3.js transaction");
|
|
@@ -2394,7 +3012,7 @@ function createKitTransactionSigner(connectorSigner) {
|
|
|
2394
3012
|
async modifyAndSignTransactions(transactions$1) {
|
|
2395
3013
|
let transactionData = transactions$1.map((tx) => {
|
|
2396
3014
|
let messageBytes = new Uint8Array(tx.messageBytes), { numSigners } = parseMessageSigners(messageBytes), wireFormat = createTransactionBytesForSigning(messageBytes, numSigners);
|
|
2397
|
-
return
|
|
3015
|
+
return logger11.debug("Preparing wire format for wallet", {
|
|
2398
3016
|
signerAddress,
|
|
2399
3017
|
messageBytesLength: messageBytes.length,
|
|
2400
3018
|
wireFormatLength: wireFormat.length,
|
|
@@ -2415,7 +3033,7 @@ function createKitTransactionSigner(connectorSigner) {
|
|
|
2415
3033
|
let signedTxBytes;
|
|
2416
3034
|
if (signedTx instanceof Uint8Array)
|
|
2417
3035
|
signedTxBytes = signedTx;
|
|
2418
|
-
else if (
|
|
3036
|
+
else if (chunk4KD6HQQG_js.isWeb3jsTransaction(signedTx)) {
|
|
2419
3037
|
let txObj = signedTx;
|
|
2420
3038
|
if (typeof txObj.serialize == "function")
|
|
2421
3039
|
signedTxBytes = txObj.serialize();
|
|
@@ -2423,14 +3041,14 @@ function createKitTransactionSigner(connectorSigner) {
|
|
|
2423
3041
|
throw new Error("Web3.js transaction without serialize method");
|
|
2424
3042
|
} else
|
|
2425
3043
|
throw new Error("Unknown signed transaction format");
|
|
2426
|
-
if (
|
|
3044
|
+
if (logger11.debug("Wallet returned signed transaction", {
|
|
2427
3045
|
returnedLength: signedTxBytes.length,
|
|
2428
3046
|
sentLength: wireFormat.length,
|
|
2429
3047
|
lengthsMatch: signedTxBytes.length === wireFormat.length,
|
|
2430
3048
|
signedFirstBytes: Array.from(signedTxBytes.slice(0, 20)),
|
|
2431
3049
|
sentFirstBytes: Array.from(wireFormat.slice(0, 20))
|
|
2432
3050
|
}), signedTxBytes.length !== wireFormat.length) {
|
|
2433
|
-
|
|
3051
|
+
logger11.warn("Wallet modified transaction! Using wallet version", {
|
|
2434
3052
|
originalLength: wireFormat.length,
|
|
2435
3053
|
modifiedLength: signedTxBytes.length,
|
|
2436
3054
|
difference: signedTxBytes.length - wireFormat.length
|
|
@@ -2441,13 +3059,13 @@ function createKitTransactionSigner(connectorSigner) {
|
|
|
2441
3059
|
lifetimeConstraint: originalWithLifetime.lifetimeConstraint
|
|
2442
3060
|
} : {}
|
|
2443
3061
|
};
|
|
2444
|
-
return
|
|
3062
|
+
return logger11.debug("Using modified transaction from wallet", {
|
|
2445
3063
|
modifiedMessageBytesLength: walletTransaction.messageBytes.length,
|
|
2446
3064
|
signatures: Object.keys(walletTransaction.signatures)
|
|
2447
3065
|
}), transactions.assertIsTransactionWithinSizeLimit(result), result;
|
|
2448
3066
|
}
|
|
2449
3067
|
let extractedSignatureBytes = extractSignature(signedTxBytes), signatureBase58 = codecs.getBase58Decoder().decode(extractedSignatureBytes);
|
|
2450
|
-
|
|
3068
|
+
logger11.debug("Extracted signature from wallet (unmodified)", {
|
|
2451
3069
|
signerAddress,
|
|
2452
3070
|
signatureLength: extractedSignatureBytes.length,
|
|
2453
3071
|
signatureBase58
|
|
@@ -2462,7 +3080,7 @@ function createKitTransactionSigner(connectorSigner) {
|
|
|
2462
3080
|
};
|
|
2463
3081
|
return transactions.assertIsTransactionWithinSizeLimit(signedTransaction), signedTransaction;
|
|
2464
3082
|
} catch (error) {
|
|
2465
|
-
return
|
|
3083
|
+
return logger11.error("Failed to decode signed transaction", { error }), transactions.assertIsTransactionWithinSizeLimit(originalTransaction), originalTransaction;
|
|
2466
3084
|
}
|
|
2467
3085
|
});
|
|
2468
3086
|
}
|
|
@@ -2472,14 +3090,21 @@ var createGillTransactionSigner = createKitTransactionSigner;
|
|
|
2472
3090
|
|
|
2473
3091
|
exports.ClipboardErrorType = ClipboardErrorType;
|
|
2474
3092
|
exports.ConnectorClient = ConnectorClient;
|
|
2475
|
-
exports.
|
|
2476
|
-
exports.
|
|
3093
|
+
exports.EnhancedStorage = EnhancedStorage;
|
|
3094
|
+
exports.EnhancedStorageAdapter = EnhancedStorageAdapter;
|
|
3095
|
+
exports.INITIAL_WALLET_STATUS = INITIAL_WALLET_STATUS;
|
|
2477
3096
|
exports.PUBLIC_RPC_ENDPOINTS = PUBLIC_RPC_ENDPOINTS;
|
|
2478
3097
|
exports.TransactionSignerError = TransactionSignerError;
|
|
2479
|
-
exports.
|
|
3098
|
+
exports.WALLET_STATE_VERSION = WALLET_STATE_VERSION;
|
|
3099
|
+
exports.clearWalletState = clearWalletState;
|
|
2480
3100
|
exports.copyAddressToClipboard = copyAddressToClipboard;
|
|
2481
3101
|
exports.copySignatureToClipboard = copySignatureToClipboard;
|
|
2482
3102
|
exports.copyToClipboard = copyToClipboard;
|
|
3103
|
+
exports.createConnectorId = createConnectorId;
|
|
3104
|
+
exports.createEnhancedStorageAccount = createEnhancedStorageAccount;
|
|
3105
|
+
exports.createEnhancedStorageCluster = createEnhancedStorageCluster;
|
|
3106
|
+
exports.createEnhancedStorageWallet = createEnhancedStorageWallet;
|
|
3107
|
+
exports.createEnhancedStorageWalletState = createEnhancedStorageWalletState;
|
|
2483
3108
|
exports.createGillTransactionSigner = createGillTransactionSigner;
|
|
2484
3109
|
exports.createKitTransactionSigner = createKitTransactionSigner;
|
|
2485
3110
|
exports.createTransactionSigner = createTransactionSigner;
|
|
@@ -2499,29 +3124,41 @@ exports.getClusterExplorerUrl = getClusterExplorerUrl;
|
|
|
2499
3124
|
exports.getClusterName = getClusterName;
|
|
2500
3125
|
exports.getClusterRpcUrl = getClusterRpcUrl;
|
|
2501
3126
|
exports.getClusterType = getClusterType;
|
|
3127
|
+
exports.getDefaultConfig = getDefaultConfig;
|
|
3128
|
+
exports.getDefaultMobileConfig = getDefaultMobileConfig;
|
|
2502
3129
|
exports.getDefaultRpcUrl = getDefaultRpcUrl;
|
|
2503
3130
|
exports.getNetworkDisplayName = getNetworkDisplayName;
|
|
2504
3131
|
exports.getPolyfillStatus = getPolyfillStatus;
|
|
2505
3132
|
exports.getTokenUrl = getTokenUrl;
|
|
2506
3133
|
exports.getTransactionUrl = getTransactionUrl;
|
|
3134
|
+
exports.getWalletNameFromConnectorId = getWalletNameFromConnectorId;
|
|
2507
3135
|
exports.getWalletsRegistry = getWalletsRegistry;
|
|
2508
3136
|
exports.installPolyfills = installPolyfills;
|
|
2509
3137
|
exports.isClipboardAvailable = isClipboardAvailable;
|
|
3138
|
+
exports.isConnected = isConnected;
|
|
3139
|
+
exports.isConnecting = isConnecting;
|
|
2510
3140
|
exports.isCryptoAvailable = isCryptoAvailable;
|
|
2511
3141
|
exports.isDevnet = isDevnet;
|
|
2512
3142
|
exports.isDevnetCluster = isDevnetCluster;
|
|
3143
|
+
exports.isDisconnected = isDisconnected;
|
|
2513
3144
|
exports.isLocalCluster = isLocalCluster;
|
|
2514
3145
|
exports.isLocalnet = isLocalnet;
|
|
2515
3146
|
exports.isMainnet = isMainnet;
|
|
2516
3147
|
exports.isMainnetCluster = isMainnetCluster;
|
|
2517
3148
|
exports.isPolyfillInstalled = isPolyfillInstalled;
|
|
3149
|
+
exports.isStatusError = isStatusError;
|
|
2518
3150
|
exports.isTestnet = isTestnet;
|
|
2519
3151
|
exports.isTestnetCluster = isTestnetCluster;
|
|
2520
3152
|
exports.isTransactionSignerError = isTransactionSignerError;
|
|
3153
|
+
exports.isWalletConnectorId = isWalletConnectorId;
|
|
3154
|
+
exports.isWalletStatusError = isWalletStatusError;
|
|
2521
3155
|
exports.normalizeNetwork = normalizeNetwork;
|
|
3156
|
+
exports.parseConfigOptions = parseConfigOptions;
|
|
2522
3157
|
exports.ready = ready;
|
|
3158
|
+
exports.saveWalletState = saveWalletState;
|
|
2523
3159
|
exports.toClusterId = toClusterId;
|
|
3160
|
+
exports.toLegacyWalletState = toLegacyWalletState;
|
|
2524
3161
|
exports.truncate = truncate;
|
|
2525
|
-
exports.
|
|
2526
|
-
//# sourceMappingURL=chunk-
|
|
2527
|
-
//# sourceMappingURL=chunk-
|
|
3162
|
+
exports.validateConfigOptions = validateConfigOptions;
|
|
3163
|
+
//# sourceMappingURL=chunk-BZ2VBJCZ.js.map
|
|
3164
|
+
//# sourceMappingURL=chunk-BZ2VBJCZ.js.map
|