@solana/connector 0.1.6 → 0.1.8
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 +122 -44
- package/dist/{chunk-VMSZJPR5.mjs → chunk-6F6M6L7R.mjs} +152 -173
- package/dist/chunk-6F6M6L7R.mjs.map +1 -0
- package/dist/{chunk-NQXK7PGX.js → chunk-AOIXHVRH.js} +82 -235
- package/dist/chunk-AOIXHVRH.js.map +1 -0
- package/dist/chunk-DSUCH44G.js +678 -0
- package/dist/chunk-DSUCH44G.js.map +1 -0
- package/dist/{chunk-JUZVCBAI.js → chunk-FTXIXM43.js} +240 -271
- package/dist/chunk-FTXIXM43.js.map +1 -0
- package/dist/{chunk-QKVL45F6.mjs → chunk-G575OAT4.mjs} +73 -218
- package/dist/chunk-G575OAT4.mjs.map +1 -0
- package/dist/chunk-J7DHGLW6.mjs +638 -0
- package/dist/chunk-J7DHGLW6.mjs.map +1 -0
- package/dist/{chunk-ULUYX23Q.js → chunk-K3BNIGPX.js} +1023 -404
- package/dist/chunk-K3BNIGPX.js.map +1 -0
- package/dist/{chunk-3STZXVXD.mjs → chunk-TTOKQAPX.mjs} +998 -388
- package/dist/chunk-TTOKQAPX.mjs.map +1 -0
- package/dist/compat.d.mts +1 -1
- package/dist/compat.d.ts +1 -1
- package/dist/compat.js +40 -39
- package/dist/compat.js.map +1 -1
- package/dist/compat.mjs +39 -38
- package/dist/compat.mjs.map +1 -1
- package/dist/headless.d.mts +540 -152
- package/dist/headless.d.ts +540 -152
- package/dist/headless.js +226 -190
- package/dist/headless.mjs +3 -3
- package/dist/index.d.mts +8 -6
- package/dist/index.d.ts +8 -6
- package/dist/index.js +286 -218
- package/dist/index.mjs +4 -4
- package/dist/react.d.mts +283 -16
- package/dist/react.d.ts +283 -16
- package/dist/react.js +60 -28
- package/dist/react.mjs +2 -2
- package/dist/{wallet-standard-shim--YcrQNRt.d.ts → standard-shim-CT49DM5l.d.mts} +72 -252
- package/dist/{wallet-standard-shim-Dx7H8Ctf.d.mts → standard-shim-D9guL5fz.d.ts} +72 -252
- package/dist/{transaction-signer-D9d8nxwb.d.mts → transaction-signer-T-KVQFi8.d.mts} +2 -2
- package/dist/{transaction-signer-D9d8nxwb.d.ts → transaction-signer-T-KVQFi8.d.ts} +2 -2
- package/package.json +3 -3
- package/dist/chunk-3STZXVXD.mjs.map +0 -1
- package/dist/chunk-I64FD2EH.js +0 -312
- package/dist/chunk-I64FD2EH.js.map +0 -1
- package/dist/chunk-JUZVCBAI.js.map +0 -1
- package/dist/chunk-NQXK7PGX.js.map +0 -1
- package/dist/chunk-QKVL45F6.mjs.map +0 -1
- package/dist/chunk-QL3IT3TS.mjs +0 -299
- package/dist/chunk-QL3IT3TS.mjs.map +0 -1
- package/dist/chunk-ULUYX23Q.js.map +0 -1
- package/dist/chunk-VMSZJPR5.mjs.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkDSUCH44G_js = require('./chunk-DSUCH44G.js');
|
|
4
4
|
var react = require('react');
|
|
5
5
|
var jsxRuntime = require('react/jsx-runtime');
|
|
6
6
|
var webcryptoEd25519Polyfill = require('@solana/webcrypto-ed25519-polyfill');
|
|
@@ -8,8 +8,25 @@ var addresses = require('@solana/addresses');
|
|
|
8
8
|
var transactions = require('@solana/transactions');
|
|
9
9
|
var codecs = require('@solana/codecs');
|
|
10
10
|
|
|
11
|
-
// src/lib/
|
|
12
|
-
var registry = null
|
|
11
|
+
// src/lib/wallet/standard-shim.ts
|
|
12
|
+
var registry = null, registryInitPromise = null, registryInitResolve = null, ready = new Promise((resolve, reject) => {
|
|
13
|
+
if (typeof window > "u") {
|
|
14
|
+
resolve();
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
registryInitResolve = resolve;
|
|
18
|
+
let nav = window.navigator;
|
|
19
|
+
if (nav.wallets && typeof nav.wallets.get == "function") {
|
|
20
|
+
registry = nav.wallets, resolve();
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
registryInitPromise = import('@wallet-standard/app').then((mod) => {
|
|
24
|
+
let walletStandardRegistry = mod.getWallets?.();
|
|
25
|
+
walletStandardRegistry && (registry = walletStandardRegistry), resolve();
|
|
26
|
+
}).catch((err) => {
|
|
27
|
+
console.warn("[standard-shim] Failed to load @wallet-standard/app:", err), resolve();
|
|
28
|
+
});
|
|
29
|
+
});
|
|
13
30
|
function getWalletsRegistry() {
|
|
14
31
|
if (typeof window > "u")
|
|
15
32
|
return {
|
|
@@ -17,12 +34,13 @@ function getWalletsRegistry() {
|
|
|
17
34
|
on: () => () => {
|
|
18
35
|
}
|
|
19
36
|
};
|
|
20
|
-
if (!registry) {
|
|
37
|
+
if (!registry && !registryInitPromise) {
|
|
21
38
|
let nav = window.navigator;
|
|
22
|
-
nav.wallets && typeof nav.wallets.get == "function" ? registry = nav.wallets : import('@wallet-standard/app').then((mod) => {
|
|
39
|
+
nav.wallets && typeof nav.wallets.get == "function" ? (registry = nav.wallets, registryInitResolve?.()) : registryInitPromise = import('@wallet-standard/app').then((mod) => {
|
|
23
40
|
let walletStandardRegistry = mod.getWallets?.();
|
|
24
|
-
walletStandardRegistry && (registry = walletStandardRegistry);
|
|
41
|
+
walletStandardRegistry && (registry = walletStandardRegistry), registryInitResolve?.();
|
|
25
42
|
}).catch(() => {
|
|
43
|
+
registryInitResolve?.();
|
|
26
44
|
});
|
|
27
45
|
}
|
|
28
46
|
return {
|
|
@@ -51,135 +69,6 @@ function getWalletsRegistry() {
|
|
|
51
69
|
};
|
|
52
70
|
}
|
|
53
71
|
|
|
54
|
-
// src/lib/errors/index.ts
|
|
55
|
-
var ConnectorError = class extends Error {
|
|
56
|
-
constructor(message, context, originalError) {
|
|
57
|
-
super(message);
|
|
58
|
-
chunkI64FD2EH_js.__publicField(this, "context");
|
|
59
|
-
chunkI64FD2EH_js.__publicField(this, "originalError");
|
|
60
|
-
chunkI64FD2EH_js.__publicField(this, "timestamp");
|
|
61
|
-
this.name = this.constructor.name, this.context = context, this.originalError = originalError, this.timestamp = (/* @__PURE__ */ new Date()).toISOString(), Error.captureStackTrace && Error.captureStackTrace(this, this.constructor);
|
|
62
|
-
}
|
|
63
|
-
toJSON() {
|
|
64
|
-
return {
|
|
65
|
-
name: this.name,
|
|
66
|
-
code: this.code,
|
|
67
|
-
message: this.message,
|
|
68
|
-
recoverable: this.recoverable,
|
|
69
|
-
context: this.context,
|
|
70
|
-
timestamp: this.timestamp,
|
|
71
|
-
originalError: this.originalError?.message
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
}, ConnectionError = class extends ConnectorError {
|
|
75
|
-
constructor(code, message, context, originalError) {
|
|
76
|
-
super(message, context, originalError);
|
|
77
|
-
chunkI64FD2EH_js.__publicField(this, "code");
|
|
78
|
-
chunkI64FD2EH_js.__publicField(this, "recoverable", true);
|
|
79
|
-
this.code = code;
|
|
80
|
-
}
|
|
81
|
-
}, ValidationError = class extends ConnectorError {
|
|
82
|
-
constructor(code, message, context, originalError) {
|
|
83
|
-
super(message, context, originalError);
|
|
84
|
-
chunkI64FD2EH_js.__publicField(this, "code");
|
|
85
|
-
chunkI64FD2EH_js.__publicField(this, "recoverable", false);
|
|
86
|
-
this.code = code;
|
|
87
|
-
}
|
|
88
|
-
}, ConfigurationError = class extends ConnectorError {
|
|
89
|
-
constructor(code, message, context, originalError) {
|
|
90
|
-
super(message, context, originalError);
|
|
91
|
-
chunkI64FD2EH_js.__publicField(this, "code");
|
|
92
|
-
chunkI64FD2EH_js.__publicField(this, "recoverable", false);
|
|
93
|
-
this.code = code;
|
|
94
|
-
}
|
|
95
|
-
}, NetworkError = class extends ConnectorError {
|
|
96
|
-
constructor(code, message, context, originalError) {
|
|
97
|
-
super(message, context, originalError);
|
|
98
|
-
chunkI64FD2EH_js.__publicField(this, "code");
|
|
99
|
-
chunkI64FD2EH_js.__publicField(this, "recoverable", true);
|
|
100
|
-
this.code = code;
|
|
101
|
-
}
|
|
102
|
-
}, TransactionError = class extends ConnectorError {
|
|
103
|
-
constructor(code, message, context, originalError) {
|
|
104
|
-
super(message, context, originalError);
|
|
105
|
-
chunkI64FD2EH_js.__publicField(this, "code");
|
|
106
|
-
chunkI64FD2EH_js.__publicField(this, "recoverable");
|
|
107
|
-
this.code = code, this.recoverable = ["USER_REJECTED", "SEND_FAILED", "SIMULATION_FAILED"].includes(code);
|
|
108
|
-
}
|
|
109
|
-
};
|
|
110
|
-
function isConnectorError(error) {
|
|
111
|
-
return error instanceof ConnectorError;
|
|
112
|
-
}
|
|
113
|
-
function isConnectionError(error) {
|
|
114
|
-
return error instanceof ConnectionError;
|
|
115
|
-
}
|
|
116
|
-
function isValidationError(error) {
|
|
117
|
-
return error instanceof ValidationError;
|
|
118
|
-
}
|
|
119
|
-
function isConfigurationError(error) {
|
|
120
|
-
return error instanceof ConfigurationError;
|
|
121
|
-
}
|
|
122
|
-
function isNetworkError(error) {
|
|
123
|
-
return error instanceof NetworkError;
|
|
124
|
-
}
|
|
125
|
-
function isTransactionError(error) {
|
|
126
|
-
return error instanceof TransactionError;
|
|
127
|
-
}
|
|
128
|
-
var Errors = {
|
|
129
|
-
walletNotConnected: (context) => new ConnectionError("WALLET_NOT_CONNECTED", "No wallet connected", context),
|
|
130
|
-
walletNotFound: (walletName) => new ConnectionError("WALLET_NOT_FOUND", `Wallet not found${walletName ? `: ${walletName}` : ""}`, {
|
|
131
|
-
walletName
|
|
132
|
-
}),
|
|
133
|
-
connectionFailed: (originalError) => new ConnectionError("CONNECTION_FAILED", "Failed to connect to wallet", void 0, originalError),
|
|
134
|
-
accountNotAvailable: (address) => new ConnectionError("ACCOUNT_NOT_AVAILABLE", "Requested account not available", { address }),
|
|
135
|
-
invalidTransaction: (reason, context) => new ValidationError("INVALID_TRANSACTION", `Invalid transaction: ${reason}`, context),
|
|
136
|
-
invalidFormat: (expectedFormat, actualFormat) => new ValidationError("INVALID_FORMAT", `Invalid format: expected ${expectedFormat}`, {
|
|
137
|
-
expectedFormat,
|
|
138
|
-
actualFormat
|
|
139
|
-
}),
|
|
140
|
-
unsupportedFormat: (format) => new ValidationError("UNSUPPORTED_FORMAT", `Unsupported format: ${format}`, { format }),
|
|
141
|
-
missingProvider: (hookName) => new ConfigurationError(
|
|
142
|
-
"MISSING_PROVIDER",
|
|
143
|
-
`${hookName} must be used within ConnectorProvider. Wrap your app with <ConnectorProvider> or <UnifiedProvider>.`,
|
|
144
|
-
{ hookName }
|
|
145
|
-
),
|
|
146
|
-
clusterNotFound: (clusterId, availableClusters) => new ConfigurationError(
|
|
147
|
-
"CLUSTER_NOT_FOUND",
|
|
148
|
-
`Cluster ${clusterId} not found. Available clusters: ${availableClusters.join(", ")}`,
|
|
149
|
-
{ clusterId, availableClusters }
|
|
150
|
-
),
|
|
151
|
-
rpcError: (message, originalError) => new NetworkError("RPC_ERROR", message, void 0, originalError),
|
|
152
|
-
networkTimeout: () => new NetworkError("NETWORK_TIMEOUT", "Network request timed out"),
|
|
153
|
-
signingFailed: (originalError) => new TransactionError("SIGNING_FAILED", "Failed to sign transaction", void 0, originalError),
|
|
154
|
-
featureNotSupported: (feature) => new TransactionError("FEATURE_NOT_SUPPORTED", `Wallet does not support ${feature}`, { feature }),
|
|
155
|
-
userRejected: (operation) => new TransactionError("USER_REJECTED", `User rejected ${operation}`, { operation })
|
|
156
|
-
};
|
|
157
|
-
function toConnectorError(error, defaultMessage = "An unexpected error occurred") {
|
|
158
|
-
if (isConnectorError(error))
|
|
159
|
-
return error;
|
|
160
|
-
if (error instanceof Error) {
|
|
161
|
-
let message = error.message.toLowerCase();
|
|
162
|
-
return message.includes("user rejected") || message.includes("user denied") ? Errors.userRejected("transaction") : message.includes("wallet not found") || message.includes("not installed") ? Errors.walletNotFound() : message.includes("not connected") ? Errors.walletNotConnected() : message.includes("network") || message.includes("fetch") ? Errors.rpcError(error.message, error) : message.includes("invalid") ? new ValidationError("VALIDATION_FAILED", error.message, void 0, error) : new TransactionError("SIGNING_FAILED", error.message, void 0, error);
|
|
163
|
-
}
|
|
164
|
-
return new TransactionError("SIGNING_FAILED", defaultMessage, { originalError: String(error) });
|
|
165
|
-
}
|
|
166
|
-
function getUserFriendlyMessage(error) {
|
|
167
|
-
return isConnectorError(error) ? {
|
|
168
|
-
WALLET_NOT_CONNECTED: "Please connect your wallet to continue.",
|
|
169
|
-
WALLET_NOT_FOUND: "Wallet not found. Please install a supported wallet.",
|
|
170
|
-
CONNECTION_FAILED: "Failed to connect to wallet. Please try again.",
|
|
171
|
-
USER_REJECTED: "Transaction was cancelled.",
|
|
172
|
-
FEATURE_NOT_SUPPORTED: "This wallet does not support this feature.",
|
|
173
|
-
SIGNING_FAILED: "Failed to sign transaction. Please try again.",
|
|
174
|
-
SEND_FAILED: "Failed to send transaction. Please try again.",
|
|
175
|
-
INVALID_CLUSTER: "Invalid network configuration.",
|
|
176
|
-
CLUSTER_NOT_FOUND: "Network not found.",
|
|
177
|
-
MISSING_PROVIDER: "Application not properly configured.",
|
|
178
|
-
RPC_ERROR: "Network error. Please check your connection.",
|
|
179
|
-
NETWORK_TIMEOUT: "Request timed out. Please try again."
|
|
180
|
-
}[error.code] || error.message || "An error occurred." : "An unexpected error occurred. Please try again.";
|
|
181
|
-
}
|
|
182
|
-
|
|
183
72
|
// src/utils/network.ts
|
|
184
73
|
var PUBLIC_RPC_ENDPOINTS = {
|
|
185
74
|
mainnet: "https://api.mainnet-beta.solana.com",
|
|
@@ -207,7 +96,7 @@ function toClusterId(network) {
|
|
|
207
96
|
function getDefaultRpcUrl(network) {
|
|
208
97
|
let normalized = normalizeNetwork(network);
|
|
209
98
|
try {
|
|
210
|
-
return
|
|
99
|
+
return chunkDSUCH44G_js.getPublicSolanaRpcUrl(normalized);
|
|
211
100
|
} catch {
|
|
212
101
|
return PUBLIC_RPC_ENDPOINTS[normalized] ?? PUBLIC_RPC_ENDPOINTS.localnet;
|
|
213
102
|
}
|
|
@@ -230,6 +119,11 @@ function getNetworkDisplayName(network) {
|
|
|
230
119
|
}
|
|
231
120
|
|
|
232
121
|
// src/utils/cluster.ts
|
|
122
|
+
function getMaybeStringProp(value, prop) {
|
|
123
|
+
if (typeof value != "object" || value === null) return;
|
|
124
|
+
let v = value[prop];
|
|
125
|
+
return typeof v == "string" ? v : void 0;
|
|
126
|
+
}
|
|
233
127
|
function getClusterRpcUrl(cluster) {
|
|
234
128
|
if (typeof cluster == "string") {
|
|
235
129
|
let presets2 = {
|
|
@@ -240,7 +134,7 @@ function getClusterRpcUrl(cluster) {
|
|
|
240
134
|
return presets2[cluster];
|
|
241
135
|
throw new Error(`Unknown cluster: ${cluster}`);
|
|
242
136
|
}
|
|
243
|
-
let url = cluster.url
|
|
137
|
+
let url = cluster.url ?? getMaybeStringProp(cluster, "rpcUrl");
|
|
244
138
|
if (!url)
|
|
245
139
|
throw new Error("Cluster URL is required");
|
|
246
140
|
if (url.startsWith("http://") || url.startsWith("https://"))
|
|
@@ -257,14 +151,14 @@ function getClusterExplorerUrl(cluster, path) {
|
|
|
257
151
|
}
|
|
258
152
|
function getTransactionUrl(signature, cluster) {
|
|
259
153
|
let clusterType = getClusterType(cluster), explorerCluster = clusterType === "custom" || clusterType === "localnet" ? "devnet" : clusterType;
|
|
260
|
-
return
|
|
154
|
+
return chunkDSUCH44G_js.getExplorerLink({
|
|
261
155
|
transaction: signature,
|
|
262
156
|
cluster: explorerCluster === "mainnet" ? "mainnet" : explorerCluster
|
|
263
157
|
});
|
|
264
158
|
}
|
|
265
159
|
function getAddressUrl(address, cluster) {
|
|
266
160
|
let clusterType = getClusterType(cluster), explorerCluster = clusterType === "custom" || clusterType === "localnet" ? "devnet" : clusterType;
|
|
267
|
-
return
|
|
161
|
+
return chunkDSUCH44G_js.getExplorerLink({
|
|
268
162
|
address,
|
|
269
163
|
cluster: explorerCluster === "mainnet" ? "mainnet" : explorerCluster
|
|
270
164
|
});
|
|
@@ -285,16 +179,17 @@ function isTestnetCluster(cluster) {
|
|
|
285
179
|
return cluster.id === "solana:testnet";
|
|
286
180
|
}
|
|
287
181
|
function isLocalCluster(cluster) {
|
|
288
|
-
let url = cluster.url
|
|
182
|
+
let url = cluster.url ?? getMaybeStringProp(cluster, "rpcUrl");
|
|
289
183
|
return url ? cluster.id === "solana:localnet" || url.includes("localhost") || url.includes("127.0.0.1") : cluster.id === "solana:localnet";
|
|
290
184
|
}
|
|
291
185
|
function getClusterName(cluster) {
|
|
292
186
|
if (cluster.label) return cluster.label;
|
|
293
|
-
|
|
187
|
+
let name = getMaybeStringProp(cluster, "name");
|
|
188
|
+
if (name) return name;
|
|
294
189
|
let parts = cluster.id.split(":");
|
|
295
190
|
if (parts.length >= 2 && parts[1]) {
|
|
296
|
-
let
|
|
297
|
-
return
|
|
191
|
+
let name2 = parts.slice(1).join(":");
|
|
192
|
+
return name2.charAt(0).toUpperCase() + name2.slice(1).replace(/-/g, " ");
|
|
298
193
|
}
|
|
299
194
|
return "Unknown";
|
|
300
195
|
}
|
|
@@ -326,9 +221,9 @@ var POLL_INTERVALS_MS = [1e3, 2e3, 3e3, 5e3, 5e3], DEFAULT_MAX_RETRIES = 3, DEFA
|
|
|
326
221
|
// src/lib/core/state-manager.ts
|
|
327
222
|
var StateManager = class {
|
|
328
223
|
constructor(initialState) {
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
224
|
+
chunkDSUCH44G_js.__publicField(this, "state");
|
|
225
|
+
chunkDSUCH44G_js.__publicField(this, "listeners", /* @__PURE__ */ new Set());
|
|
226
|
+
chunkDSUCH44G_js.__publicField(this, "notifyTimeout");
|
|
332
227
|
this.state = initialState;
|
|
333
228
|
}
|
|
334
229
|
/**
|
|
@@ -387,10 +282,10 @@ var StateManager = class {
|
|
|
387
282
|
};
|
|
388
283
|
|
|
389
284
|
// src/lib/core/event-emitter.ts
|
|
390
|
-
var logger =
|
|
285
|
+
var logger = chunkDSUCH44G_js.createLogger("EventEmitter"), EventEmitter = class {
|
|
391
286
|
constructor(debug = false) {
|
|
392
|
-
|
|
393
|
-
|
|
287
|
+
chunkDSUCH44G_js.__publicField(this, "listeners", /* @__PURE__ */ new Set());
|
|
288
|
+
chunkDSUCH44G_js.__publicField(this, "debug");
|
|
394
289
|
this.debug = debug;
|
|
395
290
|
}
|
|
396
291
|
/**
|
|
@@ -446,12 +341,12 @@ var logger = chunkI64FD2EH_js.createLogger("EventEmitter"), EventEmitter = class
|
|
|
446
341
|
// src/lib/core/debug-metrics.ts
|
|
447
342
|
var DebugMetrics = class {
|
|
448
343
|
constructor() {
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
344
|
+
chunkDSUCH44G_js.__publicField(this, "stateUpdates", 0);
|
|
345
|
+
chunkDSUCH44G_js.__publicField(this, "noopUpdates", 0);
|
|
346
|
+
chunkDSUCH44G_js.__publicField(this, "updateTimes", []);
|
|
347
|
+
chunkDSUCH44G_js.__publicField(this, "lastUpdateTime", 0);
|
|
348
|
+
chunkDSUCH44G_js.__publicField(this, "eventListenerCount", 0);
|
|
349
|
+
chunkDSUCH44G_js.__publicField(this, "subscriptionCount", 0);
|
|
455
350
|
}
|
|
456
351
|
/**
|
|
457
352
|
* Record a state update attempt
|
|
@@ -491,11 +386,11 @@ var DebugMetrics = class {
|
|
|
491
386
|
// src/lib/core/base-collaborator.ts
|
|
492
387
|
var BaseCollaborator = class {
|
|
493
388
|
constructor(config, loggerPrefix) {
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
this.stateManager = config.stateManager, this.eventEmitter = config.eventEmitter, this.debug = config.debug ?? false, this.logger =
|
|
389
|
+
chunkDSUCH44G_js.__publicField(this, "stateManager");
|
|
390
|
+
chunkDSUCH44G_js.__publicField(this, "eventEmitter");
|
|
391
|
+
chunkDSUCH44G_js.__publicField(this, "debug");
|
|
392
|
+
chunkDSUCH44G_js.__publicField(this, "logger");
|
|
393
|
+
this.stateManager = config.stateManager, this.eventEmitter = config.eventEmitter, this.debug = config.debug ?? false, this.logger = chunkDSUCH44G_js.createLogger(loggerPrefix);
|
|
499
394
|
}
|
|
500
395
|
/**
|
|
501
396
|
* Log debug message if debug mode is enabled
|
|
@@ -517,8 +412,8 @@ var BaseCollaborator = class {
|
|
|
517
412
|
}
|
|
518
413
|
};
|
|
519
414
|
|
|
520
|
-
// src/lib/
|
|
521
|
-
var logger2 =
|
|
415
|
+
// src/lib/wallet/authenticity-verifier.ts
|
|
416
|
+
var logger2 = chunkDSUCH44G_js.createLogger("WalletAuthenticity"), WalletAuthenticityVerifier = class {
|
|
522
417
|
/**
|
|
523
418
|
* Verify a wallet's authenticity using dynamic heuristics
|
|
524
419
|
*
|
|
@@ -727,8 +622,8 @@ var logger2 = chunkI64FD2EH_js.createLogger("WalletAuthenticity"), WalletAuthent
|
|
|
727
622
|
}
|
|
728
623
|
};
|
|
729
624
|
|
|
730
|
-
// src/lib/
|
|
731
|
-
var logger3 =
|
|
625
|
+
// src/lib/wallet/detector.ts
|
|
626
|
+
var logger3 = chunkDSUCH44G_js.createLogger("WalletDetector");
|
|
732
627
|
function hasFeature(wallet, featureName) {
|
|
733
628
|
return wallet.features != null && wallet.features[featureName] !== void 0;
|
|
734
629
|
}
|
|
@@ -750,10 +645,17 @@ function verifyWalletName(wallet, requestedName) {
|
|
|
750
645
|
var WalletDetector = class extends BaseCollaborator {
|
|
751
646
|
constructor(stateManager, eventEmitter, debug = false) {
|
|
752
647
|
super({ stateManager, eventEmitter, debug }, "WalletDetector");
|
|
753
|
-
|
|
648
|
+
chunkDSUCH44G_js.__publicField(this, "unsubscribers", []);
|
|
754
649
|
}
|
|
755
650
|
/**
|
|
756
|
-
* Initialize wallet detection
|
|
651
|
+
* Initialize wallet detection (synchronous)
|
|
652
|
+
*
|
|
653
|
+
* Sets up registry listeners immediately. Due to the async nature of registry initialization,
|
|
654
|
+
* the initial call to `get()` may return an empty array if called before the registry is ready.
|
|
655
|
+
* Event listeners will fire as wallets register, providing eventual consistency.
|
|
656
|
+
*
|
|
657
|
+
* For deterministic detection where you need all wallets available immediately,
|
|
658
|
+
* use `initializeAsync()` instead.
|
|
757
659
|
*/
|
|
758
660
|
initialize() {
|
|
759
661
|
if (!(typeof window > "u"))
|
|
@@ -776,6 +678,24 @@ var WalletDetector = class extends BaseCollaborator {
|
|
|
776
678
|
} catch {
|
|
777
679
|
}
|
|
778
680
|
}
|
|
681
|
+
/**
|
|
682
|
+
* Initialize wallet detection with deterministic registry availability (async)
|
|
683
|
+
*
|
|
684
|
+
* Awaits the registry `ready` Promise before performing initial detection,
|
|
685
|
+
* ensuring all registered wallets are available on the first `get()` call.
|
|
686
|
+
*
|
|
687
|
+
* Use this when you need guaranteed wallet availability before proceeding
|
|
688
|
+
* (e.g., auto-reconnect logic, checking if a specific wallet is installed).
|
|
689
|
+
*
|
|
690
|
+
* @example
|
|
691
|
+
* ```ts
|
|
692
|
+
* await walletDetector.initializeAsync();
|
|
693
|
+
* const wallets = walletDetector.getDetectedWallets(); // Guaranteed populated
|
|
694
|
+
* ```
|
|
695
|
+
*/
|
|
696
|
+
async initializeAsync() {
|
|
697
|
+
typeof window > "u" || (await ready, this.initialize());
|
|
698
|
+
}
|
|
779
699
|
/**
|
|
780
700
|
* Check if a specific wallet is available immediately via direct window object detection
|
|
781
701
|
*/
|
|
@@ -862,7 +782,7 @@ var WalletDetector = class extends BaseCollaborator {
|
|
|
862
782
|
}
|
|
863
783
|
};
|
|
864
784
|
|
|
865
|
-
// src/lib/
|
|
785
|
+
// src/lib/wallet/connection-manager.ts
|
|
866
786
|
function getConnectFeature(wallet) {
|
|
867
787
|
return wallet.features["standard:connect"]?.connect ?? null;
|
|
868
788
|
}
|
|
@@ -875,10 +795,10 @@ function getEventsFeature(wallet) {
|
|
|
875
795
|
var ConnectionManager = class extends BaseCollaborator {
|
|
876
796
|
constructor(stateManager, eventEmitter, walletStorage, debug = false) {
|
|
877
797
|
super({ stateManager, eventEmitter, debug }, "ConnectionManager");
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
798
|
+
chunkDSUCH44G_js.__publicField(this, "walletStorage");
|
|
799
|
+
chunkDSUCH44G_js.__publicField(this, "walletChangeUnsub", null);
|
|
800
|
+
chunkDSUCH44G_js.__publicField(this, "pollTimer", null);
|
|
801
|
+
chunkDSUCH44G_js.__publicField(this, "pollAttempts", 0);
|
|
882
802
|
this.walletStorage = walletStorage;
|
|
883
803
|
}
|
|
884
804
|
/**
|
|
@@ -1072,14 +992,14 @@ var ConnectionManager = class extends BaseCollaborator {
|
|
|
1072
992
|
}
|
|
1073
993
|
};
|
|
1074
994
|
|
|
1075
|
-
// src/lib/
|
|
1076
|
-
var logger4 =
|
|
995
|
+
// src/lib/wallet/auto-connector.ts
|
|
996
|
+
var logger4 = chunkDSUCH44G_js.createLogger("AutoConnector"), MIN_ADDRESS_LENGTH = 30, AutoConnector = class {
|
|
1077
997
|
constructor(walletDetector, connectionManager, stateManager, walletStorage, debug = false) {
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
998
|
+
chunkDSUCH44G_js.__publicField(this, "walletDetector");
|
|
999
|
+
chunkDSUCH44G_js.__publicField(this, "connectionManager");
|
|
1000
|
+
chunkDSUCH44G_js.__publicField(this, "stateManager");
|
|
1001
|
+
chunkDSUCH44G_js.__publicField(this, "walletStorage");
|
|
1002
|
+
chunkDSUCH44G_js.__publicField(this, "debug");
|
|
1083
1003
|
this.walletDetector = walletDetector, this.connectionManager = connectionManager, this.stateManager = stateManager, this.walletStorage = walletStorage, this.debug = debug;
|
|
1084
1004
|
}
|
|
1085
1005
|
async attemptAutoConnect() {
|
|
@@ -1186,7 +1106,7 @@ var logger4 = chunkI64FD2EH_js.createLogger("AutoConnector"), MIN_ADDRESS_LENGTH
|
|
|
1186
1106
|
]
|
|
1187
1107
|
},
|
|
1188
1108
|
true
|
|
1189
|
-
);
|
|
1109
|
+
), await ready;
|
|
1190
1110
|
let walletsApi = getWalletsRegistry(), registryWallet = walletsApi.get().find((w) => w.name === storedWalletName), walletToUse = registryWallet || wallet;
|
|
1191
1111
|
return this.debug && logger4.info("Attempting to connect via instant auto-connect", {
|
|
1192
1112
|
walletName: storedWalletName,
|
|
@@ -1233,7 +1153,7 @@ var logger4 = chunkI64FD2EH_js.createLogger("AutoConnector"), MIN_ADDRESS_LENGTH
|
|
|
1233
1153
|
var ClusterManager = class extends BaseCollaborator {
|
|
1234
1154
|
constructor(stateManager, eventEmitter, clusterStorage, config, debug = false) {
|
|
1235
1155
|
super({ stateManager, eventEmitter, debug }, "ClusterManager");
|
|
1236
|
-
|
|
1156
|
+
chunkDSUCH44G_js.__publicField(this, "clusterStorage");
|
|
1237
1157
|
if (this.clusterStorage = clusterStorage, config) {
|
|
1238
1158
|
let clusters = config.clusters ?? [], initialClusterId = this.clusterStorage?.get() ?? config.initialCluster ?? "solana:mainnet", initialCluster = clusters.find((c) => c.id === initialClusterId) ?? clusters[0] ?? null;
|
|
1239
1159
|
this.stateManager.updateState({
|
|
@@ -1248,7 +1168,7 @@ var ClusterManager = class extends BaseCollaborator {
|
|
|
1248
1168
|
async setCluster(clusterId) {
|
|
1249
1169
|
let state = this.getState(), previousClusterId = state.cluster?.id || null, cluster = state.clusters.find((c) => c.id === clusterId);
|
|
1250
1170
|
if (!cluster)
|
|
1251
|
-
throw Errors.clusterNotFound(
|
|
1171
|
+
throw chunkDSUCH44G_js.Errors.clusterNotFound(
|
|
1252
1172
|
clusterId,
|
|
1253
1173
|
state.clusters.map((c) => c.id)
|
|
1254
1174
|
);
|
|
@@ -1277,16 +1197,16 @@ var ClusterManager = class extends BaseCollaborator {
|
|
|
1277
1197
|
var TransactionTracker = class extends BaseCollaborator {
|
|
1278
1198
|
constructor(stateManager, eventEmitter, maxTransactions = 20, debug = false) {
|
|
1279
1199
|
super({ stateManager, eventEmitter, debug }, "TransactionTracker");
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1200
|
+
chunkDSUCH44G_js.__publicField(this, "transactions", []);
|
|
1201
|
+
chunkDSUCH44G_js.__publicField(this, "totalTransactions", 0);
|
|
1202
|
+
chunkDSUCH44G_js.__publicField(this, "maxTransactions");
|
|
1283
1203
|
this.maxTransactions = maxTransactions;
|
|
1284
1204
|
}
|
|
1285
1205
|
/**
|
|
1286
1206
|
* Track a transaction for debugging and monitoring
|
|
1287
1207
|
*/
|
|
1288
1208
|
trackTransaction(activity) {
|
|
1289
|
-
let clusterId = this.getState().cluster?.id
|
|
1209
|
+
let clusterId = this.getState().cluster?.id ?? "solana:devnet", fullActivity = {
|
|
1290
1210
|
...activity,
|
|
1291
1211
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1292
1212
|
cluster: clusterId
|
|
@@ -1302,10 +1222,10 @@ var TransactionTracker = class extends BaseCollaborator {
|
|
|
1302
1222
|
* Update transaction status (e.g., from pending to confirmed/failed)
|
|
1303
1223
|
*/
|
|
1304
1224
|
updateStatus(signature, status, error) {
|
|
1305
|
-
let tx = this.transactions.find((t) => t.signature === signature);
|
|
1225
|
+
let tx = this.transactions.find((t) => String(t.signature) === signature);
|
|
1306
1226
|
tx && (tx.status = status, error && (tx.error = error), this.eventEmitter.emit({
|
|
1307
1227
|
type: "transaction:updated",
|
|
1308
|
-
signature,
|
|
1228
|
+
signature: tx.signature,
|
|
1309
1229
|
status,
|
|
1310
1230
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1311
1231
|
}), this.log("[Connector] Transaction updated:", { signature, status, error }));
|
|
@@ -1333,10 +1253,10 @@ var TransactionTracker = class extends BaseCollaborator {
|
|
|
1333
1253
|
// src/lib/health/health-monitor.ts
|
|
1334
1254
|
var HealthMonitor = class {
|
|
1335
1255
|
constructor(stateManager, walletStorage, clusterStorage, isInitialized) {
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1256
|
+
chunkDSUCH44G_js.__publicField(this, "stateManager");
|
|
1257
|
+
chunkDSUCH44G_js.__publicField(this, "walletStorage");
|
|
1258
|
+
chunkDSUCH44G_js.__publicField(this, "clusterStorage");
|
|
1259
|
+
chunkDSUCH44G_js.__publicField(this, "isInitialized");
|
|
1340
1260
|
this.stateManager = stateManager, this.walletStorage = walletStorage, this.clusterStorage = clusterStorage, this.isInitialized = isInitialized ?? (() => true);
|
|
1341
1261
|
}
|
|
1342
1262
|
/**
|
|
@@ -1388,19 +1308,19 @@ var HealthMonitor = class {
|
|
|
1388
1308
|
};
|
|
1389
1309
|
|
|
1390
1310
|
// src/lib/core/connector-client.ts
|
|
1391
|
-
var logger5 =
|
|
1311
|
+
var logger5 = chunkDSUCH44G_js.createLogger("ConnectorClient"), ConnectorClient = class {
|
|
1392
1312
|
constructor(config = {}) {
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1313
|
+
chunkDSUCH44G_js.__publicField(this, "stateManager");
|
|
1314
|
+
chunkDSUCH44G_js.__publicField(this, "eventEmitter");
|
|
1315
|
+
chunkDSUCH44G_js.__publicField(this, "walletDetector");
|
|
1316
|
+
chunkDSUCH44G_js.__publicField(this, "connectionManager");
|
|
1317
|
+
chunkDSUCH44G_js.__publicField(this, "autoConnector");
|
|
1318
|
+
chunkDSUCH44G_js.__publicField(this, "clusterManager");
|
|
1319
|
+
chunkDSUCH44G_js.__publicField(this, "transactionTracker");
|
|
1320
|
+
chunkDSUCH44G_js.__publicField(this, "debugMetrics");
|
|
1321
|
+
chunkDSUCH44G_js.__publicField(this, "healthMonitor");
|
|
1322
|
+
chunkDSUCH44G_js.__publicField(this, "initialized", false);
|
|
1323
|
+
chunkDSUCH44G_js.__publicField(this, "config");
|
|
1404
1324
|
this.config = config;
|
|
1405
1325
|
let initialState = {
|
|
1406
1326
|
wallets: [],
|
|
@@ -1442,16 +1362,15 @@ var logger5 = chunkI64FD2EH_js.createLogger("ConnectorClient"), ConnectorClient
|
|
|
1442
1362
|
), this.initialize();
|
|
1443
1363
|
}
|
|
1444
1364
|
initialize() {
|
|
1445
|
-
if (
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
}
|
|
1365
|
+
if (typeof window > "u" || this.initialized) return;
|
|
1366
|
+
let { error } = chunkDSUCH44G_js.tryCatchSync(() => {
|
|
1367
|
+
this.walletDetector.initialize(), this.config.autoConnect && setTimeout(() => {
|
|
1368
|
+
this.autoConnector.attemptAutoConnect().catch((err) => {
|
|
1369
|
+
this.config.debug && logger5.error("Auto-connect error", { error: err });
|
|
1370
|
+
});
|
|
1371
|
+
}, 100), this.initialized = true;
|
|
1372
|
+
});
|
|
1373
|
+
error && this.config.debug && logger5.error("Connector initialization failed", { error });
|
|
1455
1374
|
}
|
|
1456
1375
|
async select(walletName) {
|
|
1457
1376
|
let wallet = this.stateManager.getSnapshot().wallets.find((w) => w.wallet.name === walletName)?.wallet;
|
|
@@ -1476,11 +1395,8 @@ var logger5 = chunkI64FD2EH_js.createLogger("ConnectorClient"), ConnectorClient
|
|
|
1476
1395
|
getRpcUrl() {
|
|
1477
1396
|
let cluster = this.clusterManager.getCluster();
|
|
1478
1397
|
if (!cluster) return null;
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
} catch (error) {
|
|
1482
|
-
return this.config.debug && logger5.error("Failed to get RPC URL", { error }), null;
|
|
1483
|
-
}
|
|
1398
|
+
let { data, error } = chunkDSUCH44G_js.tryCatchSync(() => getClusterRpcUrl(cluster));
|
|
1399
|
+
return error ? (this.config.debug && logger5.error("Failed to get RPC URL", { error }), null) : data;
|
|
1484
1400
|
}
|
|
1485
1401
|
subscribe(listener) {
|
|
1486
1402
|
return this.stateManager.subscribe(listener);
|
|
@@ -1493,12 +1409,10 @@ var logger5 = chunkI64FD2EH_js.createLogger("ConnectorClient"), ConnectorClient
|
|
|
1493
1409
|
let storageKeys = ["account", "wallet", "cluster"];
|
|
1494
1410
|
for (let key of storageKeys) {
|
|
1495
1411
|
let storage = this.config.storage?.[key];
|
|
1496
|
-
if (storage && "reset" in storage && typeof storage.reset == "function")
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
this.config.debug && logger5.error("Failed to reset storage", { key, error });
|
|
1501
|
-
}
|
|
1412
|
+
if (storage && "reset" in storage && typeof storage.reset == "function") {
|
|
1413
|
+
let resetFn = storage.reset, { error } = chunkDSUCH44G_js.tryCatchSync(() => resetFn());
|
|
1414
|
+
error ? this.config.debug && logger5.error("Failed to reset storage", { key, error }) : this.config.debug && logger5.debug("Reset storage", { key });
|
|
1415
|
+
}
|
|
1502
1416
|
}
|
|
1503
1417
|
this.eventEmitter.emit({
|
|
1504
1418
|
type: "storage:reset",
|
|
@@ -1554,7 +1468,7 @@ var logger5 = chunkI64FD2EH_js.createLogger("ConnectorClient"), ConnectorClient
|
|
|
1554
1468
|
}), this.walletDetector.destroy(), this.eventEmitter.offAll(), this.stateManager.clear();
|
|
1555
1469
|
}
|
|
1556
1470
|
};
|
|
1557
|
-
var logger6 =
|
|
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 {
|
|
1558
1472
|
static log(error, errorInfo, context) {
|
|
1559
1473
|
if (process.env.NODE_ENV === "development" && logger6.error(error.message, {
|
|
1560
1474
|
error,
|
|
@@ -1573,7 +1487,7 @@ var logger6 = chunkI64FD2EH_js.createLogger("ErrorBoundary"), WalletErrorType =
|
|
|
1573
1487
|
}
|
|
1574
1488
|
};
|
|
1575
1489
|
function classifyError(error) {
|
|
1576
|
-
if (isConnectorError(error))
|
|
1490
|
+
if (chunkDSUCH44G_js.isConnectorError(error))
|
|
1577
1491
|
return {
|
|
1578
1492
|
...error,
|
|
1579
1493
|
type: {
|
|
@@ -1602,8 +1516,8 @@ function classifyError(error) {
|
|
|
1602
1516
|
var ConnectorErrorBoundary = class extends react.Component {
|
|
1603
1517
|
constructor(props) {
|
|
1604
1518
|
super(props);
|
|
1605
|
-
|
|
1606
|
-
|
|
1519
|
+
chunkDSUCH44G_js.__publicField(this, "retryTimeouts", /* @__PURE__ */ new Set());
|
|
1520
|
+
chunkDSUCH44G_js.__publicField(this, "retry", () => {
|
|
1607
1521
|
let { maxRetries = 3 } = this.props;
|
|
1608
1522
|
this.state.retryCount >= maxRetries || this.setState((prevState) => ({
|
|
1609
1523
|
hasError: false,
|
|
@@ -1825,7 +1739,7 @@ function withErrorBoundary(Component2, errorBoundaryProps) {
|
|
|
1825
1739
|
let WrappedComponent = (props) => /* @__PURE__ */ jsxRuntime.jsx(ConnectorErrorBoundary, { ...errorBoundaryProps, children: /* @__PURE__ */ jsxRuntime.jsx(Component2, { ...props }) });
|
|
1826
1740
|
return WrappedComponent.displayName = `withErrorBoundary(${Component2.displayName || Component2.name})`, WrappedComponent;
|
|
1827
1741
|
}
|
|
1828
|
-
var logger7 =
|
|
1742
|
+
var logger7 = chunkDSUCH44G_js.createLogger("Polyfills"), installed = false;
|
|
1829
1743
|
function installPolyfills() {
|
|
1830
1744
|
if (!(installed || typeof window > "u"))
|
|
1831
1745
|
try {
|
|
@@ -1888,6 +1802,71 @@ function formatTokenAmount(amount, decimals, options = {}) {
|
|
|
1888
1802
|
maximumFractionDigits: maxDecimals
|
|
1889
1803
|
});
|
|
1890
1804
|
}
|
|
1805
|
+
var MAX_SAFE_INTEGER = BigInt(Number.MAX_SAFE_INTEGER);
|
|
1806
|
+
function isSafeInteger(value) {
|
|
1807
|
+
return value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;
|
|
1808
|
+
}
|
|
1809
|
+
function splitBigIntDecimals(amount, decimals) {
|
|
1810
|
+
if (decimals <= 0)
|
|
1811
|
+
return { whole: amount.toString(), fraction: "" };
|
|
1812
|
+
let str = amount.toString(), isNegative = str.startsWith("-"), absStr = isNegative ? str.slice(1) : str;
|
|
1813
|
+
if (absStr.length <= decimals) {
|
|
1814
|
+
let padded = absStr.padStart(decimals, "0");
|
|
1815
|
+
return {
|
|
1816
|
+
whole: isNegative ? "-0" : "0",
|
|
1817
|
+
fraction: padded
|
|
1818
|
+
};
|
|
1819
|
+
}
|
|
1820
|
+
let splitPoint = absStr.length - decimals;
|
|
1821
|
+
return {
|
|
1822
|
+
whole: (isNegative ? "-" : "") + absStr.slice(0, splitPoint),
|
|
1823
|
+
fraction: absStr.slice(splitPoint)
|
|
1824
|
+
};
|
|
1825
|
+
}
|
|
1826
|
+
function formatBigIntBalance(amount, decimals, options = {}) {
|
|
1827
|
+
let { maxDecimals = Math.min(decimals, 6), minDecimals = 0, locale, useGrouping = true } = options;
|
|
1828
|
+
if (isSafeInteger(amount))
|
|
1829
|
+
return (Number(amount) / Math.pow(10, decimals)).toLocaleString(locale, {
|
|
1830
|
+
minimumFractionDigits: minDecimals,
|
|
1831
|
+
maximumFractionDigits: maxDecimals,
|
|
1832
|
+
useGrouping
|
|
1833
|
+
});
|
|
1834
|
+
let { whole, fraction } = splitBigIntDecimals(amount, decimals), truncatedFraction = fraction.slice(0, maxDecimals);
|
|
1835
|
+
for (; truncatedFraction.length > minDecimals && truncatedFraction.endsWith("0"); )
|
|
1836
|
+
truncatedFraction = truncatedFraction.slice(0, -1);
|
|
1837
|
+
truncatedFraction = truncatedFraction.padEnd(minDecimals, "0");
|
|
1838
|
+
let formattedWhole = whole;
|
|
1839
|
+
if (useGrouping) {
|
|
1840
|
+
let isNegative = whole.startsWith("-"), absWhole = isNegative ? whole.slice(1) : whole, parts = [];
|
|
1841
|
+
for (let i = absWhole.length; i > 0; i -= 3)
|
|
1842
|
+
parts.unshift(absWhole.slice(Math.max(0, i - 3), i));
|
|
1843
|
+
formattedWhole = (isNegative ? "-" : "") + parts.join(",");
|
|
1844
|
+
}
|
|
1845
|
+
return truncatedFraction.length === 0 ? formattedWhole : `${formattedWhole}.${truncatedFraction}`;
|
|
1846
|
+
}
|
|
1847
|
+
function formatLamportsToSolSafe(lamports, options = {}) {
|
|
1848
|
+
let { maxDecimals = 4, minDecimals = 0, suffix = false, locale } = options, formatted = formatBigIntBalance(lamports, 9, {
|
|
1849
|
+
maxDecimals,
|
|
1850
|
+
minDecimals,
|
|
1851
|
+
locale
|
|
1852
|
+
});
|
|
1853
|
+
return suffix ? `${formatted} SOL` : formatted;
|
|
1854
|
+
}
|
|
1855
|
+
function formatBigIntUsd(amount, decimals, usdPrice, options = {}) {
|
|
1856
|
+
let { locale, currency = "USD" } = options, { whole, fraction } = splitBigIntDecimals(amount, decimals), wholeNum = parseFloat(whole), fractionNum = fraction ? parseFloat("0." + fraction) : 0;
|
|
1857
|
+
return ((wholeNum + fractionNum) * usdPrice).toLocaleString(locale, {
|
|
1858
|
+
style: "currency",
|
|
1859
|
+
currency,
|
|
1860
|
+
minimumFractionDigits: 2,
|
|
1861
|
+
maximumFractionDigits: 2
|
|
1862
|
+
});
|
|
1863
|
+
}
|
|
1864
|
+
function formatTokenBalanceSafe(amount, decimals, options = {}) {
|
|
1865
|
+
return formatBigIntBalance(amount, decimals, {
|
|
1866
|
+
maxDecimals: options.maxDecimals ?? Math.min(decimals, 6),
|
|
1867
|
+
locale: options.locale
|
|
1868
|
+
});
|
|
1869
|
+
}
|
|
1891
1870
|
var ClipboardErrorType = /* @__PURE__ */ ((ClipboardErrorType2) => (ClipboardErrorType2.NOT_SUPPORTED = "not_supported", ClipboardErrorType2.PERMISSION_DENIED = "permission_denied", ClipboardErrorType2.SSR = "ssr", ClipboardErrorType2.EMPTY_VALUE = "empty_value", ClipboardErrorType2.INVALID_VALUE = "invalid_value", ClipboardErrorType2.UNKNOWN = "unknown", ClipboardErrorType2))(ClipboardErrorType || {});
|
|
1892
1871
|
function isClipboardAvailable() {
|
|
1893
1872
|
if (typeof window > "u" || typeof document > "u")
|
|
@@ -1998,7 +1977,7 @@ async function copySignatureToClipboard(signature, options) {
|
|
|
1998
1977
|
}
|
|
1999
1978
|
|
|
2000
1979
|
// src/lib/transaction/transaction-validator.ts
|
|
2001
|
-
var logger8 =
|
|
1980
|
+
var logger8 = chunkDSUCH44G_js.createLogger("TransactionValidator"), MAX_TRANSACTION_SIZE = 1232, MIN_TRANSACTION_SIZE = 64, TransactionValidator = class {
|
|
2002
1981
|
/**
|
|
2003
1982
|
* Validate a transaction before signing
|
|
2004
1983
|
*
|
|
@@ -2103,7 +2082,7 @@ var logger8 = chunkI64FD2EH_js.createLogger("TransactionValidator"), MAX_TRANSAC
|
|
|
2103
2082
|
};
|
|
2104
2083
|
|
|
2105
2084
|
// src/lib/transaction/transaction-signer.ts
|
|
2106
|
-
var logger9 =
|
|
2085
|
+
var logger9 = chunkDSUCH44G_js.createLogger("TransactionSigner");
|
|
2107
2086
|
function createTransactionSigner(config) {
|
|
2108
2087
|
let { wallet, account, cluster, eventEmitter } = config;
|
|
2109
2088
|
if (!wallet || !account)
|
|
@@ -2117,13 +2096,13 @@ function createTransactionSigner(config) {
|
|
|
2117
2096
|
address,
|
|
2118
2097
|
async signTransaction(transaction) {
|
|
2119
2098
|
if (!capabilities.canSign)
|
|
2120
|
-
throw Errors.featureNotSupported("transaction signing");
|
|
2099
|
+
throw chunkDSUCH44G_js.Errors.featureNotSupported("transaction signing");
|
|
2121
2100
|
let validation = TransactionValidator.validate(transaction);
|
|
2122
2101
|
if (!validation.valid)
|
|
2123
|
-
throw logger9.error("Transaction validation failed", { errors: validation.errors }), Errors.invalidTransaction(validation.errors.join(", "));
|
|
2102
|
+
throw logger9.error("Transaction validation failed", { errors: validation.errors }), chunkDSUCH44G_js.Errors.invalidTransaction(validation.errors.join(", "));
|
|
2124
2103
|
validation.warnings.length > 0 && logger9.warn("Transaction validation warnings", { warnings: validation.warnings });
|
|
2125
2104
|
try {
|
|
2126
|
-
let signFeature = features["solana:signTransaction"], { serialized, wasWeb3js } =
|
|
2105
|
+
let signFeature = features["solana:signTransaction"], { serialized, wasWeb3js } = chunkDSUCH44G_js.prepareTransactionForWallet(transaction);
|
|
2127
2106
|
logger9.debug("Signing transaction", {
|
|
2128
2107
|
wasWeb3js,
|
|
2129
2108
|
serializedLength: serialized.length,
|
|
@@ -2176,19 +2155,19 @@ function createTransactionSigner(config) {
|
|
|
2176
2155
|
logger9.debug("Found signedTransaction property");
|
|
2177
2156
|
let bytes = signedTx.signedTransaction;
|
|
2178
2157
|
if (bytes instanceof Uint8Array)
|
|
2179
|
-
return await
|
|
2158
|
+
return await chunkDSUCH44G_js.convertSignedTransaction(bytes, wasWeb3js);
|
|
2180
2159
|
}
|
|
2181
2160
|
if (signedTx instanceof Uint8Array)
|
|
2182
|
-
return await
|
|
2161
|
+
return await chunkDSUCH44G_js.convertSignedTransaction(signedTx, wasWeb3js);
|
|
2183
2162
|
throw logger9.error("Unexpected wallet response format", {
|
|
2184
2163
|
type: typeof signedTx,
|
|
2185
2164
|
constructor: signedTx?.constructor?.name
|
|
2186
|
-
}), new ValidationError(
|
|
2165
|
+
}), new chunkDSUCH44G_js.ValidationError(
|
|
2187
2166
|
"INVALID_FORMAT",
|
|
2188
2167
|
"Wallet returned unexpected format - not a Transaction or Uint8Array"
|
|
2189
2168
|
);
|
|
2190
2169
|
} catch (error) {
|
|
2191
|
-
throw Errors.signingFailed(error);
|
|
2170
|
+
throw chunkDSUCH44G_js.Errors.signingFailed(error);
|
|
2192
2171
|
}
|
|
2193
2172
|
},
|
|
2194
2173
|
async signAllTransactions(transactions) {
|
|
@@ -2196,18 +2175,18 @@ function createTransactionSigner(config) {
|
|
|
2196
2175
|
return [];
|
|
2197
2176
|
if (capabilities.supportsBatchSigning)
|
|
2198
2177
|
try {
|
|
2199
|
-
let signFeature = features["solana:signAllTransactions"], prepared = transactions.map((tx) =>
|
|
2178
|
+
let signFeature = features["solana:signAllTransactions"], prepared = transactions.map((tx) => chunkDSUCH44G_js.prepareTransactionForWallet(tx)), serializedTxs = prepared.map((p) => p.serialized), wasWeb3js = prepared[0].wasWeb3js, result = await signFeature.signAllTransactions({
|
|
2200
2179
|
account,
|
|
2201
2180
|
transactions: serializedTxs,
|
|
2202
2181
|
...cluster ? { chain: cluster.id } : {}
|
|
2203
2182
|
});
|
|
2204
2183
|
return await Promise.all(
|
|
2205
2184
|
result.signedTransactions.map(
|
|
2206
|
-
(signedBytes) =>
|
|
2185
|
+
(signedBytes) => chunkDSUCH44G_js.convertSignedTransaction(signedBytes, wasWeb3js)
|
|
2207
2186
|
)
|
|
2208
2187
|
);
|
|
2209
2188
|
} catch (error) {
|
|
2210
|
-
throw new TransactionError(
|
|
2189
|
+
throw new chunkDSUCH44G_js.TransactionError(
|
|
2211
2190
|
"SIGNING_FAILED",
|
|
2212
2191
|
"Failed to sign transactions in batch",
|
|
2213
2192
|
{ count: transactions.length },
|
|
@@ -2215,14 +2194,14 @@ function createTransactionSigner(config) {
|
|
|
2215
2194
|
);
|
|
2216
2195
|
}
|
|
2217
2196
|
if (!capabilities.canSign)
|
|
2218
|
-
throw Errors.featureNotSupported("transaction signing");
|
|
2197
|
+
throw chunkDSUCH44G_js.Errors.featureNotSupported("transaction signing");
|
|
2219
2198
|
let signed = [];
|
|
2220
2199
|
for (let i = 0; i < transactions.length; i++)
|
|
2221
2200
|
try {
|
|
2222
2201
|
let signedTx = await signer.signTransaction(transactions[i]);
|
|
2223
2202
|
signed.push(signedTx);
|
|
2224
2203
|
} catch (error) {
|
|
2225
|
-
throw new TransactionError(
|
|
2204
|
+
throw new chunkDSUCH44G_js.TransactionError(
|
|
2226
2205
|
"SIGNING_FAILED",
|
|
2227
2206
|
`Failed to sign transaction ${i + 1} of ${transactions.length}`,
|
|
2228
2207
|
{ index: i, total: transactions.length },
|
|
@@ -2233,9 +2212,9 @@ function createTransactionSigner(config) {
|
|
|
2233
2212
|
},
|
|
2234
2213
|
async signAndSendTransaction(transaction, options) {
|
|
2235
2214
|
if (!capabilities.canSend)
|
|
2236
|
-
throw Errors.featureNotSupported("sending transactions");
|
|
2215
|
+
throw chunkDSUCH44G_js.Errors.featureNotSupported("sending transactions");
|
|
2237
2216
|
try {
|
|
2238
|
-
let sendFeature = features["solana:signAndSendTransaction"], { serialized } =
|
|
2217
|
+
let sendFeature = features["solana:signAndSendTransaction"], { serialized } = chunkDSUCH44G_js.prepareTransactionForWallet(transaction);
|
|
2239
2218
|
eventEmitter && eventEmitter.emit({
|
|
2240
2219
|
type: "transaction:preparing",
|
|
2241
2220
|
transaction: serialized,
|
|
@@ -2270,21 +2249,21 @@ function createTransactionSigner(config) {
|
|
|
2270
2249
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
2271
2250
|
}), signature;
|
|
2272
2251
|
} catch (error) {
|
|
2273
|
-
throw new TransactionError("SEND_FAILED", "Failed to send transaction", void 0, error);
|
|
2252
|
+
throw new chunkDSUCH44G_js.TransactionError("SEND_FAILED", "Failed to send transaction", void 0, error);
|
|
2274
2253
|
}
|
|
2275
2254
|
},
|
|
2276
2255
|
async signAndSendTransactions(transactions, options) {
|
|
2277
2256
|
if (transactions.length === 0)
|
|
2278
2257
|
return [];
|
|
2279
2258
|
if (!capabilities.canSend)
|
|
2280
|
-
throw Errors.featureNotSupported("sending transactions");
|
|
2259
|
+
throw chunkDSUCH44G_js.Errors.featureNotSupported("sending transactions");
|
|
2281
2260
|
let signatures = [];
|
|
2282
2261
|
for (let i = 0; i < transactions.length; i++)
|
|
2283
2262
|
try {
|
|
2284
2263
|
let sig = await signer.signAndSendTransaction(transactions[i], options);
|
|
2285
2264
|
signatures.push(sig);
|
|
2286
2265
|
} catch (error) {
|
|
2287
|
-
throw new TransactionError(
|
|
2266
|
+
throw new chunkDSUCH44G_js.TransactionError(
|
|
2288
2267
|
"SEND_FAILED",
|
|
2289
2268
|
`Failed to send transaction ${i + 1} of ${transactions.length}`,
|
|
2290
2269
|
{ index: i, total: transactions.length },
|
|
@@ -2302,7 +2281,7 @@ function createTransactionSigner(config) {
|
|
|
2302
2281
|
...cluster ? { chain: cluster.id } : {}
|
|
2303
2282
|
})).signature;
|
|
2304
2283
|
} catch (error) {
|
|
2305
|
-
throw new TransactionError("SIGNING_FAILED", "Failed to sign message", void 0, error);
|
|
2284
|
+
throw new chunkDSUCH44G_js.TransactionError("SIGNING_FAILED", "Failed to sign message", void 0, error);
|
|
2306
2285
|
}
|
|
2307
2286
|
}
|
|
2308
2287
|
},
|
|
@@ -2312,16 +2291,16 @@ function createTransactionSigner(config) {
|
|
|
2312
2291
|
};
|
|
2313
2292
|
return signer;
|
|
2314
2293
|
}
|
|
2315
|
-
var TransactionSignerError = class extends TransactionError {
|
|
2294
|
+
var TransactionSignerError = class extends chunkDSUCH44G_js.TransactionError {
|
|
2316
2295
|
constructor(message, code, originalError) {
|
|
2317
2296
|
let newCode = code === "WALLET_NOT_CONNECTED" ? "FEATURE_NOT_SUPPORTED" : code;
|
|
2318
2297
|
super(newCode, message, void 0, originalError), this.name = "TransactionSignerError";
|
|
2319
2298
|
}
|
|
2320
2299
|
};
|
|
2321
2300
|
function isTransactionSignerError(error) {
|
|
2322
|
-
return error instanceof TransactionSignerError || error instanceof TransactionError;
|
|
2301
|
+
return error instanceof TransactionSignerError || error instanceof chunkDSUCH44G_js.TransactionError;
|
|
2323
2302
|
}
|
|
2324
|
-
var logger10 =
|
|
2303
|
+
var logger10 = chunkDSUCH44G_js.createLogger("KitTransactionSigner");
|
|
2325
2304
|
function encodeShortVecLength(value) {
|
|
2326
2305
|
let bytes = [], remaining = value;
|
|
2327
2306
|
for (; remaining >= 128; )
|
|
@@ -2353,7 +2332,7 @@ function extractSignature(signedTx) {
|
|
|
2353
2332
|
let signatureStart = bytesConsumed;
|
|
2354
2333
|
return signedTx.slice(signatureStart, signatureStart + 64);
|
|
2355
2334
|
}
|
|
2356
|
-
if (
|
|
2335
|
+
if (chunkDSUCH44G_js.isWeb3jsTransaction(signedTx)) {
|
|
2357
2336
|
let signatures = signedTx.signatures;
|
|
2358
2337
|
if (!signatures || signatures.length === 0)
|
|
2359
2338
|
throw new Error("No signatures found in web3.js transaction");
|
|
@@ -2394,7 +2373,7 @@ function createKitTransactionSigner(connectorSigner) {
|
|
|
2394
2373
|
let signedTxBytes;
|
|
2395
2374
|
if (signedTx instanceof Uint8Array)
|
|
2396
2375
|
signedTxBytes = signedTx;
|
|
2397
|
-
else if (
|
|
2376
|
+
else if (chunkDSUCH44G_js.isWeb3jsTransaction(signedTx)) {
|
|
2398
2377
|
let txObj = signedTx;
|
|
2399
2378
|
if (typeof txObj.serialize == "function")
|
|
2400
2379
|
signedTxBytes = txObj.serialize();
|
|
@@ -2450,18 +2429,11 @@ function createKitTransactionSigner(connectorSigner) {
|
|
|
2450
2429
|
var createGillTransactionSigner = createKitTransactionSigner;
|
|
2451
2430
|
|
|
2452
2431
|
exports.ClipboardErrorType = ClipboardErrorType;
|
|
2453
|
-
exports.ConfigurationError = ConfigurationError;
|
|
2454
|
-
exports.ConnectionError = ConnectionError;
|
|
2455
2432
|
exports.ConnectorClient = ConnectorClient;
|
|
2456
|
-
exports.ConnectorError = ConnectorError;
|
|
2457
2433
|
exports.ConnectorErrorBoundary = ConnectorErrorBoundary;
|
|
2458
2434
|
exports.DEFAULT_MAX_RETRIES = DEFAULT_MAX_RETRIES;
|
|
2459
|
-
exports.Errors = Errors;
|
|
2460
|
-
exports.NetworkError = NetworkError;
|
|
2461
2435
|
exports.PUBLIC_RPC_ENDPOINTS = PUBLIC_RPC_ENDPOINTS;
|
|
2462
|
-
exports.TransactionError = TransactionError;
|
|
2463
2436
|
exports.TransactionSignerError = TransactionSignerError;
|
|
2464
|
-
exports.ValidationError = ValidationError;
|
|
2465
2437
|
exports.WalletErrorType = WalletErrorType;
|
|
2466
2438
|
exports.copyAddressToClipboard = copyAddressToClipboard;
|
|
2467
2439
|
exports.copySignatureToClipboard = copySignatureToClipboard;
|
|
@@ -2470,9 +2442,13 @@ exports.createGillTransactionSigner = createGillTransactionSigner;
|
|
|
2470
2442
|
exports.createKitTransactionSigner = createKitTransactionSigner;
|
|
2471
2443
|
exports.createTransactionSigner = createTransactionSigner;
|
|
2472
2444
|
exports.formatAddress = formatAddress;
|
|
2445
|
+
exports.formatBigIntBalance = formatBigIntBalance;
|
|
2446
|
+
exports.formatBigIntUsd = formatBigIntUsd;
|
|
2447
|
+
exports.formatLamportsToSolSafe = formatLamportsToSolSafe;
|
|
2473
2448
|
exports.formatNumber = formatNumber;
|
|
2474
2449
|
exports.formatSOL = formatSOL;
|
|
2475
2450
|
exports.formatTokenAmount = formatTokenAmount;
|
|
2451
|
+
exports.formatTokenBalanceSafe = formatTokenBalanceSafe;
|
|
2476
2452
|
exports.getAddressUrl = getAddressUrl;
|
|
2477
2453
|
exports.getBlockUrl = getBlockUrl;
|
|
2478
2454
|
exports.getChainIdForWalletStandard = getChainIdForWalletStandard;
|
|
@@ -2486,13 +2462,9 @@ exports.getNetworkDisplayName = getNetworkDisplayName;
|
|
|
2486
2462
|
exports.getPolyfillStatus = getPolyfillStatus;
|
|
2487
2463
|
exports.getTokenUrl = getTokenUrl;
|
|
2488
2464
|
exports.getTransactionUrl = getTransactionUrl;
|
|
2489
|
-
exports.getUserFriendlyMessage = getUserFriendlyMessage;
|
|
2490
2465
|
exports.getWalletsRegistry = getWalletsRegistry;
|
|
2491
2466
|
exports.installPolyfills = installPolyfills;
|
|
2492
2467
|
exports.isClipboardAvailable = isClipboardAvailable;
|
|
2493
|
-
exports.isConfigurationError = isConfigurationError;
|
|
2494
|
-
exports.isConnectionError = isConnectionError;
|
|
2495
|
-
exports.isConnectorError = isConnectorError;
|
|
2496
2468
|
exports.isCryptoAvailable = isCryptoAvailable;
|
|
2497
2469
|
exports.isDevnet = isDevnet;
|
|
2498
2470
|
exports.isDevnetCluster = isDevnetCluster;
|
|
@@ -2500,17 +2472,14 @@ exports.isLocalCluster = isLocalCluster;
|
|
|
2500
2472
|
exports.isLocalnet = isLocalnet;
|
|
2501
2473
|
exports.isMainnet = isMainnet;
|
|
2502
2474
|
exports.isMainnetCluster = isMainnetCluster;
|
|
2503
|
-
exports.isNetworkError = isNetworkError;
|
|
2504
2475
|
exports.isPolyfillInstalled = isPolyfillInstalled;
|
|
2505
2476
|
exports.isTestnet = isTestnet;
|
|
2506
2477
|
exports.isTestnetCluster = isTestnetCluster;
|
|
2507
|
-
exports.isTransactionError = isTransactionError;
|
|
2508
2478
|
exports.isTransactionSignerError = isTransactionSignerError;
|
|
2509
|
-
exports.isValidationError = isValidationError;
|
|
2510
2479
|
exports.normalizeNetwork = normalizeNetwork;
|
|
2480
|
+
exports.ready = ready;
|
|
2511
2481
|
exports.toClusterId = toClusterId;
|
|
2512
|
-
exports.toConnectorError = toConnectorError;
|
|
2513
2482
|
exports.truncate = truncate;
|
|
2514
2483
|
exports.withErrorBoundary = withErrorBoundary;
|
|
2515
|
-
//# sourceMappingURL=chunk-
|
|
2516
|
-
//# sourceMappingURL=chunk-
|
|
2484
|
+
//# sourceMappingURL=chunk-FTXIXM43.js.map
|
|
2485
|
+
//# sourceMappingURL=chunk-FTXIXM43.js.map
|