@solana/connector 0.1.7 → 0.1.9
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 +83 -5
- package/dist/{chunk-VA6LKXCQ.js → chunk-5HRJKCIL.js} +204 -268
- package/dist/chunk-5HRJKCIL.js.map +1 -0
- package/dist/chunk-DSUCH44G.js +678 -0
- package/dist/chunk-DSUCH44G.js.map +1 -0
- package/dist/{chunk-VZ5Y6DIM.js → chunk-I6TJLYNA.js} +80 -235
- package/dist/chunk-I6TJLYNA.js.map +1 -0
- package/dist/chunk-J7DHGLW6.mjs +638 -0
- package/dist/chunk-J7DHGLW6.mjs.map +1 -0
- package/dist/{chunk-TQRJYZNK.mjs → chunk-JOBLG62A.mjs} +71 -218
- package/dist/chunk-JOBLG62A.mjs.map +1 -0
- package/dist/{chunk-APQGEW7S.mjs → chunk-MAXA3HEP.mjs} +120 -170
- package/dist/chunk-MAXA3HEP.mjs.map +1 -0
- package/dist/{chunk-JK47EFJT.mjs → chunk-P5LXUDP6.mjs} +65 -14
- package/dist/chunk-P5LXUDP6.mjs.map +1 -0
- package/dist/{chunk-Z22V3D4E.js → chunk-WDXEP4AJ.js} +95 -37
- package/dist/chunk-WDXEP4AJ.js.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 +447 -151
- package/dist/headless.d.ts +447 -151
- package/dist/headless.js +214 -194
- package/dist/headless.mjs +3 -3
- package/dist/index.d.mts +7 -6
- package/dist/index.d.ts +7 -6
- package/dist/index.js +268 -224
- package/dist/index.mjs +4 -4
- package/dist/react.d.mts +108 -7
- package/dist/react.d.ts +108 -7
- package/dist/react.js +54 -30
- package/dist/react.mjs +2 -2
- package/dist/{wallet-standard-shim-DiMvGjOk.d.ts → standard-shim-CT49DM5l.d.mts} +38 -247
- package/dist/{wallet-standard-shim-D4CYG5sU.d.mts → standard-shim-D9guL5fz.d.ts} +38 -247
- package/dist/{transaction-signer-CpGEvp7S.d.mts → transaction-signer-T-KVQFi8.d.mts} +1 -1
- package/dist/{transaction-signer-CpGEvp7S.d.ts → transaction-signer-T-KVQFi8.d.ts} +1 -1
- package/package.json +3 -3
- package/dist/chunk-APQGEW7S.mjs.map +0 -1
- package/dist/chunk-I64FD2EH.js +0 -312
- package/dist/chunk-I64FD2EH.js.map +0 -1
- package/dist/chunk-JK47EFJT.mjs.map +0 -1
- package/dist/chunk-QL3IT3TS.mjs +0 -299
- package/dist/chunk-QL3IT3TS.mjs.map +0 -1
- package/dist/chunk-TQRJYZNK.mjs.map +0 -1
- package/dist/chunk-VA6LKXCQ.js.map +0 -1
- package/dist/chunk-VZ5Y6DIM.js.map +0 -1
- package/dist/chunk-Z22V3D4E.js.map +0 -1
|
@@ -1,15 +1,32 @@
|
|
|
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');
|
|
7
7
|
var addresses = require('@solana/addresses');
|
|
8
|
-
var transactions = require('@solana/transactions');
|
|
9
8
|
var codecs = require('@solana/codecs');
|
|
9
|
+
var transactions = require('@solana/transactions');
|
|
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
|
}
|
|
@@ -262,14 +151,14 @@ function getClusterExplorerUrl(cluster, path) {
|
|
|
262
151
|
}
|
|
263
152
|
function getTransactionUrl(signature, cluster) {
|
|
264
153
|
let clusterType = getClusterType(cluster), explorerCluster = clusterType === "custom" || clusterType === "localnet" ? "devnet" : clusterType;
|
|
265
|
-
return
|
|
154
|
+
return chunkDSUCH44G_js.getExplorerLink({
|
|
266
155
|
transaction: signature,
|
|
267
156
|
cluster: explorerCluster === "mainnet" ? "mainnet" : explorerCluster
|
|
268
157
|
});
|
|
269
158
|
}
|
|
270
159
|
function getAddressUrl(address, cluster) {
|
|
271
160
|
let clusterType = getClusterType(cluster), explorerCluster = clusterType === "custom" || clusterType === "localnet" ? "devnet" : clusterType;
|
|
272
|
-
return
|
|
161
|
+
return chunkDSUCH44G_js.getExplorerLink({
|
|
273
162
|
address,
|
|
274
163
|
cluster: explorerCluster === "mainnet" ? "mainnet" : explorerCluster
|
|
275
164
|
});
|
|
@@ -332,9 +221,9 @@ var POLL_INTERVALS_MS = [1e3, 2e3, 3e3, 5e3, 5e3], DEFAULT_MAX_RETRIES = 3, DEFA
|
|
|
332
221
|
// src/lib/core/state-manager.ts
|
|
333
222
|
var StateManager = class {
|
|
334
223
|
constructor(initialState) {
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
224
|
+
chunkDSUCH44G_js.__publicField(this, "state");
|
|
225
|
+
chunkDSUCH44G_js.__publicField(this, "listeners", /* @__PURE__ */ new Set());
|
|
226
|
+
chunkDSUCH44G_js.__publicField(this, "notifyTimeout");
|
|
338
227
|
this.state = initialState;
|
|
339
228
|
}
|
|
340
229
|
/**
|
|
@@ -393,10 +282,10 @@ var StateManager = class {
|
|
|
393
282
|
};
|
|
394
283
|
|
|
395
284
|
// src/lib/core/event-emitter.ts
|
|
396
|
-
var logger =
|
|
285
|
+
var logger = chunkDSUCH44G_js.createLogger("EventEmitter"), EventEmitter = class {
|
|
397
286
|
constructor(debug = false) {
|
|
398
|
-
|
|
399
|
-
|
|
287
|
+
chunkDSUCH44G_js.__publicField(this, "listeners", /* @__PURE__ */ new Set());
|
|
288
|
+
chunkDSUCH44G_js.__publicField(this, "debug");
|
|
400
289
|
this.debug = debug;
|
|
401
290
|
}
|
|
402
291
|
/**
|
|
@@ -452,12 +341,12 @@ var logger = chunkI64FD2EH_js.createLogger("EventEmitter"), EventEmitter = class
|
|
|
452
341
|
// src/lib/core/debug-metrics.ts
|
|
453
342
|
var DebugMetrics = class {
|
|
454
343
|
constructor() {
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
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);
|
|
461
350
|
}
|
|
462
351
|
/**
|
|
463
352
|
* Record a state update attempt
|
|
@@ -497,11 +386,11 @@ var DebugMetrics = class {
|
|
|
497
386
|
// src/lib/core/base-collaborator.ts
|
|
498
387
|
var BaseCollaborator = class {
|
|
499
388
|
constructor(config, loggerPrefix) {
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
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);
|
|
505
394
|
}
|
|
506
395
|
/**
|
|
507
396
|
* Log debug message if debug mode is enabled
|
|
@@ -523,8 +412,8 @@ var BaseCollaborator = class {
|
|
|
523
412
|
}
|
|
524
413
|
};
|
|
525
414
|
|
|
526
|
-
// src/lib/
|
|
527
|
-
var logger2 =
|
|
415
|
+
// src/lib/wallet/authenticity-verifier.ts
|
|
416
|
+
var logger2 = chunkDSUCH44G_js.createLogger("WalletAuthenticity"), WalletAuthenticityVerifier = class {
|
|
528
417
|
/**
|
|
529
418
|
* Verify a wallet's authenticity using dynamic heuristics
|
|
530
419
|
*
|
|
@@ -733,8 +622,8 @@ var logger2 = chunkI64FD2EH_js.createLogger("WalletAuthenticity"), WalletAuthent
|
|
|
733
622
|
}
|
|
734
623
|
};
|
|
735
624
|
|
|
736
|
-
// src/lib/
|
|
737
|
-
var logger3 =
|
|
625
|
+
// src/lib/wallet/detector.ts
|
|
626
|
+
var logger3 = chunkDSUCH44G_js.createLogger("WalletDetector");
|
|
738
627
|
function hasFeature(wallet, featureName) {
|
|
739
628
|
return wallet.features != null && wallet.features[featureName] !== void 0;
|
|
740
629
|
}
|
|
@@ -756,10 +645,17 @@ function verifyWalletName(wallet, requestedName) {
|
|
|
756
645
|
var WalletDetector = class extends BaseCollaborator {
|
|
757
646
|
constructor(stateManager, eventEmitter, debug = false) {
|
|
758
647
|
super({ stateManager, eventEmitter, debug }, "WalletDetector");
|
|
759
|
-
|
|
648
|
+
chunkDSUCH44G_js.__publicField(this, "unsubscribers", []);
|
|
760
649
|
}
|
|
761
650
|
/**
|
|
762
|
-
* 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.
|
|
763
659
|
*/
|
|
764
660
|
initialize() {
|
|
765
661
|
if (!(typeof window > "u"))
|
|
@@ -782,6 +678,24 @@ var WalletDetector = class extends BaseCollaborator {
|
|
|
782
678
|
} catch {
|
|
783
679
|
}
|
|
784
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
|
+
}
|
|
785
699
|
/**
|
|
786
700
|
* Check if a specific wallet is available immediately via direct window object detection
|
|
787
701
|
*/
|
|
@@ -868,7 +782,7 @@ var WalletDetector = class extends BaseCollaborator {
|
|
|
868
782
|
}
|
|
869
783
|
};
|
|
870
784
|
|
|
871
|
-
// src/lib/
|
|
785
|
+
// src/lib/wallet/connection-manager.ts
|
|
872
786
|
function getConnectFeature(wallet) {
|
|
873
787
|
return wallet.features["standard:connect"]?.connect ?? null;
|
|
874
788
|
}
|
|
@@ -881,10 +795,10 @@ function getEventsFeature(wallet) {
|
|
|
881
795
|
var ConnectionManager = class extends BaseCollaborator {
|
|
882
796
|
constructor(stateManager, eventEmitter, walletStorage, debug = false) {
|
|
883
797
|
super({ stateManager, eventEmitter, debug }, "ConnectionManager");
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
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);
|
|
888
802
|
this.walletStorage = walletStorage;
|
|
889
803
|
}
|
|
890
804
|
/**
|
|
@@ -1078,14 +992,14 @@ var ConnectionManager = class extends BaseCollaborator {
|
|
|
1078
992
|
}
|
|
1079
993
|
};
|
|
1080
994
|
|
|
1081
|
-
// src/lib/
|
|
1082
|
-
var logger4 =
|
|
995
|
+
// src/lib/wallet/auto-connector.ts
|
|
996
|
+
var logger4 = chunkDSUCH44G_js.createLogger("AutoConnector"), MIN_ADDRESS_LENGTH = 30, AutoConnector = class {
|
|
1083
997
|
constructor(walletDetector, connectionManager, stateManager, walletStorage, debug = false) {
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
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");
|
|
1089
1003
|
this.walletDetector = walletDetector, this.connectionManager = connectionManager, this.stateManager = stateManager, this.walletStorage = walletStorage, this.debug = debug;
|
|
1090
1004
|
}
|
|
1091
1005
|
async attemptAutoConnect() {
|
|
@@ -1192,7 +1106,7 @@ var logger4 = chunkI64FD2EH_js.createLogger("AutoConnector"), MIN_ADDRESS_LENGTH
|
|
|
1192
1106
|
]
|
|
1193
1107
|
},
|
|
1194
1108
|
true
|
|
1195
|
-
);
|
|
1109
|
+
), await ready;
|
|
1196
1110
|
let walletsApi = getWalletsRegistry(), registryWallet = walletsApi.get().find((w) => w.name === storedWalletName), walletToUse = registryWallet || wallet;
|
|
1197
1111
|
return this.debug && logger4.info("Attempting to connect via instant auto-connect", {
|
|
1198
1112
|
walletName: storedWalletName,
|
|
@@ -1239,7 +1153,7 @@ var logger4 = chunkI64FD2EH_js.createLogger("AutoConnector"), MIN_ADDRESS_LENGTH
|
|
|
1239
1153
|
var ClusterManager = class extends BaseCollaborator {
|
|
1240
1154
|
constructor(stateManager, eventEmitter, clusterStorage, config, debug = false) {
|
|
1241
1155
|
super({ stateManager, eventEmitter, debug }, "ClusterManager");
|
|
1242
|
-
|
|
1156
|
+
chunkDSUCH44G_js.__publicField(this, "clusterStorage");
|
|
1243
1157
|
if (this.clusterStorage = clusterStorage, config) {
|
|
1244
1158
|
let clusters = config.clusters ?? [], initialClusterId = this.clusterStorage?.get() ?? config.initialCluster ?? "solana:mainnet", initialCluster = clusters.find((c) => c.id === initialClusterId) ?? clusters[0] ?? null;
|
|
1245
1159
|
this.stateManager.updateState({
|
|
@@ -1254,7 +1168,7 @@ var ClusterManager = class extends BaseCollaborator {
|
|
|
1254
1168
|
async setCluster(clusterId) {
|
|
1255
1169
|
let state = this.getState(), previousClusterId = state.cluster?.id || null, cluster = state.clusters.find((c) => c.id === clusterId);
|
|
1256
1170
|
if (!cluster)
|
|
1257
|
-
throw Errors.clusterNotFound(
|
|
1171
|
+
throw chunkDSUCH44G_js.Errors.clusterNotFound(
|
|
1258
1172
|
clusterId,
|
|
1259
1173
|
state.clusters.map((c) => c.id)
|
|
1260
1174
|
);
|
|
@@ -1283,9 +1197,9 @@ var ClusterManager = class extends BaseCollaborator {
|
|
|
1283
1197
|
var TransactionTracker = class extends BaseCollaborator {
|
|
1284
1198
|
constructor(stateManager, eventEmitter, maxTransactions = 20, debug = false) {
|
|
1285
1199
|
super({ stateManager, eventEmitter, debug }, "TransactionTracker");
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1200
|
+
chunkDSUCH44G_js.__publicField(this, "transactions", []);
|
|
1201
|
+
chunkDSUCH44G_js.__publicField(this, "totalTransactions", 0);
|
|
1202
|
+
chunkDSUCH44G_js.__publicField(this, "maxTransactions");
|
|
1289
1203
|
this.maxTransactions = maxTransactions;
|
|
1290
1204
|
}
|
|
1291
1205
|
/**
|
|
@@ -1339,10 +1253,10 @@ var TransactionTracker = class extends BaseCollaborator {
|
|
|
1339
1253
|
// src/lib/health/health-monitor.ts
|
|
1340
1254
|
var HealthMonitor = class {
|
|
1341
1255
|
constructor(stateManager, walletStorage, clusterStorage, isInitialized) {
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1256
|
+
chunkDSUCH44G_js.__publicField(this, "stateManager");
|
|
1257
|
+
chunkDSUCH44G_js.__publicField(this, "walletStorage");
|
|
1258
|
+
chunkDSUCH44G_js.__publicField(this, "clusterStorage");
|
|
1259
|
+
chunkDSUCH44G_js.__publicField(this, "isInitialized");
|
|
1346
1260
|
this.stateManager = stateManager, this.walletStorage = walletStorage, this.clusterStorage = clusterStorage, this.isInitialized = isInitialized ?? (() => true);
|
|
1347
1261
|
}
|
|
1348
1262
|
/**
|
|
@@ -1394,19 +1308,19 @@ var HealthMonitor = class {
|
|
|
1394
1308
|
};
|
|
1395
1309
|
|
|
1396
1310
|
// src/lib/core/connector-client.ts
|
|
1397
|
-
var logger5 =
|
|
1311
|
+
var logger5 = chunkDSUCH44G_js.createLogger("ConnectorClient"), ConnectorClient = class {
|
|
1398
1312
|
constructor(config = {}) {
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
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");
|
|
1410
1324
|
this.config = config;
|
|
1411
1325
|
let initialState = {
|
|
1412
1326
|
wallets: [],
|
|
@@ -1448,16 +1362,15 @@ var logger5 = chunkI64FD2EH_js.createLogger("ConnectorClient"), ConnectorClient
|
|
|
1448
1362
|
), this.initialize();
|
|
1449
1363
|
}
|
|
1450
1364
|
initialize() {
|
|
1451
|
-
if (
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
}
|
|
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 });
|
|
1461
1374
|
}
|
|
1462
1375
|
async select(walletName) {
|
|
1463
1376
|
let wallet = this.stateManager.getSnapshot().wallets.find((w) => w.wallet.name === walletName)?.wallet;
|
|
@@ -1482,11 +1395,8 @@ var logger5 = chunkI64FD2EH_js.createLogger("ConnectorClient"), ConnectorClient
|
|
|
1482
1395
|
getRpcUrl() {
|
|
1483
1396
|
let cluster = this.clusterManager.getCluster();
|
|
1484
1397
|
if (!cluster) return null;
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
} catch (error) {
|
|
1488
|
-
return this.config.debug && logger5.error("Failed to get RPC URL", { error }), null;
|
|
1489
|
-
}
|
|
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;
|
|
1490
1400
|
}
|
|
1491
1401
|
subscribe(listener) {
|
|
1492
1402
|
return this.stateManager.subscribe(listener);
|
|
@@ -1499,12 +1409,10 @@ var logger5 = chunkI64FD2EH_js.createLogger("ConnectorClient"), ConnectorClient
|
|
|
1499
1409
|
let storageKeys = ["account", "wallet", "cluster"];
|
|
1500
1410
|
for (let key of storageKeys) {
|
|
1501
1411
|
let storage = this.config.storage?.[key];
|
|
1502
|
-
if (storage && "reset" in storage && typeof storage.reset == "function")
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
this.config.debug && logger5.error("Failed to reset storage", { key, error });
|
|
1507
|
-
}
|
|
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
|
+
}
|
|
1508
1416
|
}
|
|
1509
1417
|
this.eventEmitter.emit({
|
|
1510
1418
|
type: "storage:reset",
|
|
@@ -1560,7 +1468,7 @@ var logger5 = chunkI64FD2EH_js.createLogger("ConnectorClient"), ConnectorClient
|
|
|
1560
1468
|
}), this.walletDetector.destroy(), this.eventEmitter.offAll(), this.stateManager.clear();
|
|
1561
1469
|
}
|
|
1562
1470
|
};
|
|
1563
|
-
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 {
|
|
1564
1472
|
static log(error, errorInfo, context) {
|
|
1565
1473
|
if (process.env.NODE_ENV === "development" && logger6.error(error.message, {
|
|
1566
1474
|
error,
|
|
@@ -1579,7 +1487,7 @@ var logger6 = chunkI64FD2EH_js.createLogger("ErrorBoundary"), WalletErrorType =
|
|
|
1579
1487
|
}
|
|
1580
1488
|
};
|
|
1581
1489
|
function classifyError(error) {
|
|
1582
|
-
if (isConnectorError(error))
|
|
1490
|
+
if (chunkDSUCH44G_js.isConnectorError(error))
|
|
1583
1491
|
return {
|
|
1584
1492
|
...error,
|
|
1585
1493
|
type: {
|
|
@@ -1608,8 +1516,8 @@ function classifyError(error) {
|
|
|
1608
1516
|
var ConnectorErrorBoundary = class extends react.Component {
|
|
1609
1517
|
constructor(props) {
|
|
1610
1518
|
super(props);
|
|
1611
|
-
|
|
1612
|
-
|
|
1519
|
+
chunkDSUCH44G_js.__publicField(this, "retryTimeouts", /* @__PURE__ */ new Set());
|
|
1520
|
+
chunkDSUCH44G_js.__publicField(this, "retry", () => {
|
|
1613
1521
|
let { maxRetries = 3 } = this.props;
|
|
1614
1522
|
this.state.retryCount >= maxRetries || this.setState((prevState) => ({
|
|
1615
1523
|
hasError: false,
|
|
@@ -1831,7 +1739,7 @@ function withErrorBoundary(Component2, errorBoundaryProps) {
|
|
|
1831
1739
|
let WrappedComponent = (props) => /* @__PURE__ */ jsxRuntime.jsx(ConnectorErrorBoundary, { ...errorBoundaryProps, children: /* @__PURE__ */ jsxRuntime.jsx(Component2, { ...props }) });
|
|
1832
1740
|
return WrappedComponent.displayName = `withErrorBoundary(${Component2.displayName || Component2.name})`, WrappedComponent;
|
|
1833
1741
|
}
|
|
1834
|
-
var logger7 =
|
|
1742
|
+
var logger7 = chunkDSUCH44G_js.createLogger("Polyfills"), installed = false;
|
|
1835
1743
|
function installPolyfills() {
|
|
1836
1744
|
if (!(installed || typeof window > "u"))
|
|
1837
1745
|
try {
|
|
@@ -2069,7 +1977,7 @@ async function copySignatureToClipboard(signature, options) {
|
|
|
2069
1977
|
}
|
|
2070
1978
|
|
|
2071
1979
|
// src/lib/transaction/transaction-validator.ts
|
|
2072
|
-
var logger8 =
|
|
1980
|
+
var logger8 = chunkDSUCH44G_js.createLogger("TransactionValidator"), MAX_TRANSACTION_SIZE = 1232, MIN_TRANSACTION_SIZE = 64, TransactionValidator = class {
|
|
2073
1981
|
/**
|
|
2074
1982
|
* Validate a transaction before signing
|
|
2075
1983
|
*
|
|
@@ -2172,9 +2080,28 @@ var logger8 = chunkI64FD2EH_js.createLogger("TransactionValidator"), MAX_TRANSAC
|
|
|
2172
2080
|
return transactions.map((tx, index) => (logger8.debug(`Validating transaction ${index + 1}/${transactions.length}`), this.validate(tx, options)));
|
|
2173
2081
|
}
|
|
2174
2082
|
};
|
|
2175
|
-
|
|
2176
|
-
|
|
2177
|
-
|
|
2083
|
+
var logger9 = chunkDSUCH44G_js.createLogger("TransactionSigner");
|
|
2084
|
+
function signatureBytesToBase58(bytes) {
|
|
2085
|
+
if (bytes.length !== 64)
|
|
2086
|
+
throw new Error(`Invalid signature length: expected 64 bytes, got ${bytes.length}`);
|
|
2087
|
+
return codecs.getBase58Decoder().decode(bytes);
|
|
2088
|
+
}
|
|
2089
|
+
function extractSignatureString(result) {
|
|
2090
|
+
if (typeof result == "string")
|
|
2091
|
+
return result;
|
|
2092
|
+
if (result instanceof Uint8Array)
|
|
2093
|
+
return signatureBytesToBase58(result);
|
|
2094
|
+
if (Array.isArray(result) && result.length > 0)
|
|
2095
|
+
return extractSignatureString(result[0]);
|
|
2096
|
+
if (result && typeof result == "object") {
|
|
2097
|
+
let record = result;
|
|
2098
|
+
if ("signature" in record)
|
|
2099
|
+
return extractSignatureString(record.signature);
|
|
2100
|
+
if (Array.isArray(record.signatures) && record.signatures.length > 0)
|
|
2101
|
+
return extractSignatureString(record.signatures[0]);
|
|
2102
|
+
}
|
|
2103
|
+
throw new Error("Unexpected wallet response format for signAndSendTransaction");
|
|
2104
|
+
}
|
|
2178
2105
|
function createTransactionSigner(config) {
|
|
2179
2106
|
let { wallet, account, cluster, eventEmitter } = config;
|
|
2180
2107
|
if (!wallet || !account)
|
|
@@ -2188,13 +2115,13 @@ function createTransactionSigner(config) {
|
|
|
2188
2115
|
address,
|
|
2189
2116
|
async signTransaction(transaction) {
|
|
2190
2117
|
if (!capabilities.canSign)
|
|
2191
|
-
throw Errors.featureNotSupported("transaction signing");
|
|
2118
|
+
throw chunkDSUCH44G_js.Errors.featureNotSupported("transaction signing");
|
|
2192
2119
|
let validation = TransactionValidator.validate(transaction);
|
|
2193
2120
|
if (!validation.valid)
|
|
2194
|
-
throw logger9.error("Transaction validation failed", { errors: validation.errors }), Errors.invalidTransaction(validation.errors.join(", "));
|
|
2121
|
+
throw logger9.error("Transaction validation failed", { errors: validation.errors }), chunkDSUCH44G_js.Errors.invalidTransaction(validation.errors.join(", "));
|
|
2195
2122
|
validation.warnings.length > 0 && logger9.warn("Transaction validation warnings", { warnings: validation.warnings });
|
|
2196
2123
|
try {
|
|
2197
|
-
let signFeature = features["solana:signTransaction"], { serialized, wasWeb3js } =
|
|
2124
|
+
let signFeature = features["solana:signTransaction"], { serialized, wasWeb3js } = chunkDSUCH44G_js.prepareTransactionForWallet(transaction);
|
|
2198
2125
|
logger9.debug("Signing transaction", {
|
|
2199
2126
|
wasWeb3js,
|
|
2200
2127
|
serializedLength: serialized.length,
|
|
@@ -2247,19 +2174,19 @@ function createTransactionSigner(config) {
|
|
|
2247
2174
|
logger9.debug("Found signedTransaction property");
|
|
2248
2175
|
let bytes = signedTx.signedTransaction;
|
|
2249
2176
|
if (bytes instanceof Uint8Array)
|
|
2250
|
-
return await
|
|
2177
|
+
return await chunkDSUCH44G_js.convertSignedTransaction(bytes, wasWeb3js);
|
|
2251
2178
|
}
|
|
2252
2179
|
if (signedTx instanceof Uint8Array)
|
|
2253
|
-
return await
|
|
2180
|
+
return await chunkDSUCH44G_js.convertSignedTransaction(signedTx, wasWeb3js);
|
|
2254
2181
|
throw logger9.error("Unexpected wallet response format", {
|
|
2255
2182
|
type: typeof signedTx,
|
|
2256
2183
|
constructor: signedTx?.constructor?.name
|
|
2257
|
-
}), new ValidationError(
|
|
2184
|
+
}), new chunkDSUCH44G_js.ValidationError(
|
|
2258
2185
|
"INVALID_FORMAT",
|
|
2259
2186
|
"Wallet returned unexpected format - not a Transaction or Uint8Array"
|
|
2260
2187
|
);
|
|
2261
2188
|
} catch (error) {
|
|
2262
|
-
throw Errors.signingFailed(error);
|
|
2189
|
+
throw chunkDSUCH44G_js.Errors.signingFailed(error);
|
|
2263
2190
|
}
|
|
2264
2191
|
},
|
|
2265
2192
|
async signAllTransactions(transactions) {
|
|
@@ -2267,18 +2194,18 @@ function createTransactionSigner(config) {
|
|
|
2267
2194
|
return [];
|
|
2268
2195
|
if (capabilities.supportsBatchSigning)
|
|
2269
2196
|
try {
|
|
2270
|
-
let signFeature = features["solana:signAllTransactions"], prepared = transactions.map((tx) =>
|
|
2197
|
+
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({
|
|
2271
2198
|
account,
|
|
2272
2199
|
transactions: serializedTxs,
|
|
2273
2200
|
...cluster ? { chain: cluster.id } : {}
|
|
2274
2201
|
});
|
|
2275
2202
|
return await Promise.all(
|
|
2276
2203
|
result.signedTransactions.map(
|
|
2277
|
-
(signedBytes) =>
|
|
2204
|
+
(signedBytes) => chunkDSUCH44G_js.convertSignedTransaction(signedBytes, wasWeb3js)
|
|
2278
2205
|
)
|
|
2279
2206
|
);
|
|
2280
2207
|
} catch (error) {
|
|
2281
|
-
throw new TransactionError(
|
|
2208
|
+
throw new chunkDSUCH44G_js.TransactionError(
|
|
2282
2209
|
"SIGNING_FAILED",
|
|
2283
2210
|
"Failed to sign transactions in batch",
|
|
2284
2211
|
{ count: transactions.length },
|
|
@@ -2286,14 +2213,14 @@ function createTransactionSigner(config) {
|
|
|
2286
2213
|
);
|
|
2287
2214
|
}
|
|
2288
2215
|
if (!capabilities.canSign)
|
|
2289
|
-
throw Errors.featureNotSupported("transaction signing");
|
|
2216
|
+
throw chunkDSUCH44G_js.Errors.featureNotSupported("transaction signing");
|
|
2290
2217
|
let signed = [];
|
|
2291
2218
|
for (let i = 0; i < transactions.length; i++)
|
|
2292
2219
|
try {
|
|
2293
2220
|
let signedTx = await signer.signTransaction(transactions[i]);
|
|
2294
2221
|
signed.push(signedTx);
|
|
2295
2222
|
} catch (error) {
|
|
2296
|
-
throw new TransactionError(
|
|
2223
|
+
throw new chunkDSUCH44G_js.TransactionError(
|
|
2297
2224
|
"SIGNING_FAILED",
|
|
2298
2225
|
`Failed to sign transaction ${i + 1} of ${transactions.length}`,
|
|
2299
2226
|
{ index: i, total: transactions.length },
|
|
@@ -2304,9 +2231,9 @@ function createTransactionSigner(config) {
|
|
|
2304
2231
|
},
|
|
2305
2232
|
async signAndSendTransaction(transaction, options) {
|
|
2306
2233
|
if (!capabilities.canSend)
|
|
2307
|
-
throw Errors.featureNotSupported("sending transactions");
|
|
2234
|
+
throw chunkDSUCH44G_js.Errors.featureNotSupported("sending transactions");
|
|
2308
2235
|
try {
|
|
2309
|
-
let sendFeature = features["solana:signAndSendTransaction"], { serialized } =
|
|
2236
|
+
let sendFeature = features["solana:signAndSendTransaction"], { serialized } = chunkDSUCH44G_js.prepareTransactionForWallet(transaction);
|
|
2310
2237
|
eventEmitter && eventEmitter.emit({
|
|
2311
2238
|
type: "transaction:preparing",
|
|
2312
2239
|
transaction: serialized,
|
|
@@ -2334,28 +2261,28 @@ function createTransactionSigner(config) {
|
|
|
2334
2261
|
transaction: serialized
|
|
2335
2262
|
});
|
|
2336
2263
|
}
|
|
2337
|
-
let signature =
|
|
2264
|
+
let signature = extractSignatureString(result);
|
|
2338
2265
|
return eventEmitter && eventEmitter.emit({
|
|
2339
2266
|
type: "transaction:sent",
|
|
2340
2267
|
signature,
|
|
2341
2268
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
2342
2269
|
}), signature;
|
|
2343
2270
|
} catch (error) {
|
|
2344
|
-
throw new TransactionError("SEND_FAILED", "Failed to send transaction", void 0, error);
|
|
2271
|
+
throw new chunkDSUCH44G_js.TransactionError("SEND_FAILED", "Failed to send transaction", void 0, error);
|
|
2345
2272
|
}
|
|
2346
2273
|
},
|
|
2347
2274
|
async signAndSendTransactions(transactions, options) {
|
|
2348
2275
|
if (transactions.length === 0)
|
|
2349
2276
|
return [];
|
|
2350
2277
|
if (!capabilities.canSend)
|
|
2351
|
-
throw Errors.featureNotSupported("sending transactions");
|
|
2278
|
+
throw chunkDSUCH44G_js.Errors.featureNotSupported("sending transactions");
|
|
2352
2279
|
let signatures = [];
|
|
2353
2280
|
for (let i = 0; i < transactions.length; i++)
|
|
2354
2281
|
try {
|
|
2355
2282
|
let sig = await signer.signAndSendTransaction(transactions[i], options);
|
|
2356
2283
|
signatures.push(sig);
|
|
2357
2284
|
} catch (error) {
|
|
2358
|
-
throw new TransactionError(
|
|
2285
|
+
throw new chunkDSUCH44G_js.TransactionError(
|
|
2359
2286
|
"SEND_FAILED",
|
|
2360
2287
|
`Failed to send transaction ${i + 1} of ${transactions.length}`,
|
|
2361
2288
|
{ index: i, total: transactions.length },
|
|
@@ -2373,7 +2300,7 @@ function createTransactionSigner(config) {
|
|
|
2373
2300
|
...cluster ? { chain: cluster.id } : {}
|
|
2374
2301
|
})).signature;
|
|
2375
2302
|
} catch (error) {
|
|
2376
|
-
throw new TransactionError("SIGNING_FAILED", "Failed to sign message", void 0, error);
|
|
2303
|
+
throw new chunkDSUCH44G_js.TransactionError("SIGNING_FAILED", "Failed to sign message", void 0, error);
|
|
2377
2304
|
}
|
|
2378
2305
|
}
|
|
2379
2306
|
},
|
|
@@ -2383,16 +2310,16 @@ function createTransactionSigner(config) {
|
|
|
2383
2310
|
};
|
|
2384
2311
|
return signer;
|
|
2385
2312
|
}
|
|
2386
|
-
var TransactionSignerError = class extends TransactionError {
|
|
2313
|
+
var TransactionSignerError = class extends chunkDSUCH44G_js.TransactionError {
|
|
2387
2314
|
constructor(message, code, originalError) {
|
|
2388
2315
|
let newCode = code === "WALLET_NOT_CONNECTED" ? "FEATURE_NOT_SUPPORTED" : code;
|
|
2389
2316
|
super(newCode, message, void 0, originalError), this.name = "TransactionSignerError";
|
|
2390
2317
|
}
|
|
2391
2318
|
};
|
|
2392
2319
|
function isTransactionSignerError(error) {
|
|
2393
|
-
return error instanceof TransactionSignerError || error instanceof TransactionError;
|
|
2320
|
+
return error instanceof TransactionSignerError || error instanceof chunkDSUCH44G_js.TransactionError;
|
|
2394
2321
|
}
|
|
2395
|
-
var logger10 =
|
|
2322
|
+
var logger10 = chunkDSUCH44G_js.createLogger("KitTransactionSigner");
|
|
2396
2323
|
function encodeShortVecLength(value) {
|
|
2397
2324
|
let bytes = [], remaining = value;
|
|
2398
2325
|
for (; remaining >= 128; )
|
|
@@ -2412,6 +2339,29 @@ function decodeShortVecLength(data) {
|
|
|
2412
2339
|
}
|
|
2413
2340
|
return { length, bytesConsumed: size };
|
|
2414
2341
|
}
|
|
2342
|
+
function parseMessageSigners(messageBytes) {
|
|
2343
|
+
let offset = 0;
|
|
2344
|
+
if (messageBytes.length < 4)
|
|
2345
|
+
throw new Error("Invalid message: too short for header");
|
|
2346
|
+
if (messageBytes[0] === 128 && (offset = 1), offset + 3 > messageBytes.length)
|
|
2347
|
+
throw new Error("Invalid message: incomplete header");
|
|
2348
|
+
let numSignerAccounts = messageBytes[offset];
|
|
2349
|
+
if (offset += 3, offset >= messageBytes.length)
|
|
2350
|
+
throw new Error("Invalid message: no static accounts section");
|
|
2351
|
+
let { length: numStaticAccounts, bytesConsumed } = decodeShortVecLength(messageBytes.subarray(offset));
|
|
2352
|
+
offset += bytesConsumed;
|
|
2353
|
+
let staticAccounts = [], base58Decoder = codecs.getBase58Decoder();
|
|
2354
|
+
for (let i = 0; i < numStaticAccounts && i < numSignerAccounts; i++) {
|
|
2355
|
+
if (offset + 32 > messageBytes.length)
|
|
2356
|
+
throw new Error(`Invalid message: incomplete account ${i}`);
|
|
2357
|
+
let accountBytes = messageBytes.subarray(offset, offset + 32), accountAddress = base58Decoder.decode(accountBytes);
|
|
2358
|
+
staticAccounts.push(accountAddress), offset += 32;
|
|
2359
|
+
}
|
|
2360
|
+
return {
|
|
2361
|
+
numSigners: numSignerAccounts,
|
|
2362
|
+
staticAccounts
|
|
2363
|
+
};
|
|
2364
|
+
}
|
|
2415
2365
|
function createTransactionBytesForSigning(messageBytes, numSigners) {
|
|
2416
2366
|
let numSignaturesBytes = encodeShortVecLength(numSigners), signatureSlots = new Uint8Array(numSigners * 64), totalLength = numSignaturesBytes.length + signatureSlots.length + messageBytes.length, transactionBytes = new Uint8Array(totalLength), offset = 0;
|
|
2417
2367
|
return transactionBytes.set(numSignaturesBytes, offset), offset += numSignaturesBytes.length, transactionBytes.set(signatureSlots, offset), offset += signatureSlots.length, transactionBytes.set(messageBytes, offset), transactionBytes;
|
|
@@ -2424,7 +2374,7 @@ function extractSignature(signedTx) {
|
|
|
2424
2374
|
let signatureStart = bytesConsumed;
|
|
2425
2375
|
return signedTx.slice(signatureStart, signatureStart + 64);
|
|
2426
2376
|
}
|
|
2427
|
-
if (
|
|
2377
|
+
if (chunkDSUCH44G_js.isWeb3jsTransaction(signedTx)) {
|
|
2428
2378
|
let signatures = signedTx.signatures;
|
|
2429
2379
|
if (!signatures || signatures.length === 0)
|
|
2430
2380
|
throw new Error("No signatures found in web3.js transaction");
|
|
@@ -2443,7 +2393,7 @@ function createKitTransactionSigner(connectorSigner) {
|
|
|
2443
2393
|
address: signerAddress,
|
|
2444
2394
|
async modifyAndSignTransactions(transactions$1) {
|
|
2445
2395
|
let transactionData = transactions$1.map((tx) => {
|
|
2446
|
-
let messageBytes = new Uint8Array(tx.messageBytes), numSigners =
|
|
2396
|
+
let messageBytes = new Uint8Array(tx.messageBytes), { numSigners } = parseMessageSigners(messageBytes), wireFormat = createTransactionBytesForSigning(messageBytes, numSigners);
|
|
2447
2397
|
return logger10.debug("Preparing wire format for wallet", {
|
|
2448
2398
|
signerAddress,
|
|
2449
2399
|
messageBytesLength: messageBytes.length,
|
|
@@ -2465,7 +2415,7 @@ function createKitTransactionSigner(connectorSigner) {
|
|
|
2465
2415
|
let signedTxBytes;
|
|
2466
2416
|
if (signedTx instanceof Uint8Array)
|
|
2467
2417
|
signedTxBytes = signedTx;
|
|
2468
|
-
else if (
|
|
2418
|
+
else if (chunkDSUCH44G_js.isWeb3jsTransaction(signedTx)) {
|
|
2469
2419
|
let txObj = signedTx;
|
|
2470
2420
|
if (typeof txObj.serialize == "function")
|
|
2471
2421
|
signedTxBytes = txObj.serialize();
|
|
@@ -2521,18 +2471,11 @@ function createKitTransactionSigner(connectorSigner) {
|
|
|
2521
2471
|
var createGillTransactionSigner = createKitTransactionSigner;
|
|
2522
2472
|
|
|
2523
2473
|
exports.ClipboardErrorType = ClipboardErrorType;
|
|
2524
|
-
exports.ConfigurationError = ConfigurationError;
|
|
2525
|
-
exports.ConnectionError = ConnectionError;
|
|
2526
2474
|
exports.ConnectorClient = ConnectorClient;
|
|
2527
|
-
exports.ConnectorError = ConnectorError;
|
|
2528
2475
|
exports.ConnectorErrorBoundary = ConnectorErrorBoundary;
|
|
2529
2476
|
exports.DEFAULT_MAX_RETRIES = DEFAULT_MAX_RETRIES;
|
|
2530
|
-
exports.Errors = Errors;
|
|
2531
|
-
exports.NetworkError = NetworkError;
|
|
2532
2477
|
exports.PUBLIC_RPC_ENDPOINTS = PUBLIC_RPC_ENDPOINTS;
|
|
2533
|
-
exports.TransactionError = TransactionError;
|
|
2534
2478
|
exports.TransactionSignerError = TransactionSignerError;
|
|
2535
|
-
exports.ValidationError = ValidationError;
|
|
2536
2479
|
exports.WalletErrorType = WalletErrorType;
|
|
2537
2480
|
exports.copyAddressToClipboard = copyAddressToClipboard;
|
|
2538
2481
|
exports.copySignatureToClipboard = copySignatureToClipboard;
|
|
@@ -2561,13 +2504,9 @@ exports.getNetworkDisplayName = getNetworkDisplayName;
|
|
|
2561
2504
|
exports.getPolyfillStatus = getPolyfillStatus;
|
|
2562
2505
|
exports.getTokenUrl = getTokenUrl;
|
|
2563
2506
|
exports.getTransactionUrl = getTransactionUrl;
|
|
2564
|
-
exports.getUserFriendlyMessage = getUserFriendlyMessage;
|
|
2565
2507
|
exports.getWalletsRegistry = getWalletsRegistry;
|
|
2566
2508
|
exports.installPolyfills = installPolyfills;
|
|
2567
2509
|
exports.isClipboardAvailable = isClipboardAvailable;
|
|
2568
|
-
exports.isConfigurationError = isConfigurationError;
|
|
2569
|
-
exports.isConnectionError = isConnectionError;
|
|
2570
|
-
exports.isConnectorError = isConnectorError;
|
|
2571
2510
|
exports.isCryptoAvailable = isCryptoAvailable;
|
|
2572
2511
|
exports.isDevnet = isDevnet;
|
|
2573
2512
|
exports.isDevnetCluster = isDevnetCluster;
|
|
@@ -2575,17 +2514,14 @@ exports.isLocalCluster = isLocalCluster;
|
|
|
2575
2514
|
exports.isLocalnet = isLocalnet;
|
|
2576
2515
|
exports.isMainnet = isMainnet;
|
|
2577
2516
|
exports.isMainnetCluster = isMainnetCluster;
|
|
2578
|
-
exports.isNetworkError = isNetworkError;
|
|
2579
2517
|
exports.isPolyfillInstalled = isPolyfillInstalled;
|
|
2580
2518
|
exports.isTestnet = isTestnet;
|
|
2581
2519
|
exports.isTestnetCluster = isTestnetCluster;
|
|
2582
|
-
exports.isTransactionError = isTransactionError;
|
|
2583
2520
|
exports.isTransactionSignerError = isTransactionSignerError;
|
|
2584
|
-
exports.isValidationError = isValidationError;
|
|
2585
2521
|
exports.normalizeNetwork = normalizeNetwork;
|
|
2522
|
+
exports.ready = ready;
|
|
2586
2523
|
exports.toClusterId = toClusterId;
|
|
2587
|
-
exports.toConnectorError = toConnectorError;
|
|
2588
2524
|
exports.truncate = truncate;
|
|
2589
2525
|
exports.withErrorBoundary = withErrorBoundary;
|
|
2590
|
-
//# sourceMappingURL=chunk-
|
|
2591
|
-
//# sourceMappingURL=chunk-
|
|
2526
|
+
//# sourceMappingURL=chunk-5HRJKCIL.js.map
|
|
2527
|
+
//# sourceMappingURL=chunk-5HRJKCIL.js.map
|