@solana/client 1.1.2 → 1.1.4

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.
@@ -1,3644 +1,3 @@
1
- import { createSolanaRpc, createSolanaRpcSubscriptions, address, getBase64EncodedWireTransaction, compileTransaction, partiallySignTransactionMessageWithSigners, appendTransactionMessageInstruction, setTransactionMessageLifetimeUsingBlockhash, isTransactionSendingSigner, getMessagePackerInstructionPlanFromInstructions, signature, AccountRole, pipe, createTransactionMessage, setTransactionMessageFeePayer, singleTransactionPlan, signAndSendTransactionMessageWithSigners, createTransactionPlanExecutor, signTransactionMessageWithSigners, isSolanaError, SOLANA_ERROR__TRANSACTION_ERROR__ALREADY_PROCESSED, generateKeyPairSigner, appendTransactionMessageInstructions, createTransactionPlanner, setTransactionMessageFeePayerSigner, isTransactionPartialSigner, SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED, isInstructionForProgram, isInstructionWithData, SolanaError, SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR, isSome, airdropFactory, signatureBytes } from '@solana/kit';
2
- import { createBlockHeightExceedencePromiseFactory, createRecentSignatureConfirmationPromiseFactory, waitForRecentTransactionConfirmation } from '@solana/transaction-confirmation';
3
- import { fetchAddressLookupTable, fetchAllAddressLookupTable } from '@solana-program/address-lookup-table';
4
- import { getTransferSolInstruction, getCreateAccountInstruction, fetchNonce } from '@solana-program/system';
5
- import { getBase58Decoder, getBase58Encoder } from '@solana/codecs-strings';
6
- import { TOKEN_PROGRAM_ADDRESS, fetchMint, findAssociatedTokenPda, getCreateAssociatedTokenInstruction, getTransferCheckedInstruction } from '@solana-program/token';
7
- import { getInitializeInstruction, getDelegateStakeInstruction, getDeactivateInstruction, getWithdrawInstruction } from '@solana-program/stake';
8
- import { getSetComputeUnitLimitInstruction, getSetComputeUnitPriceInstruction, COMPUTE_BUDGET_PROGRAM_ADDRESS, ComputeBudgetInstruction } from '@solana-program/compute-budget';
9
- import { createStore } from 'zustand/vanilla';
10
- import { getWallets } from '@wallet-standard/app';
11
- import { StandardConnect, StandardEvents, StandardDisconnect } from '@wallet-standard/features';
12
- import { getTransactionDecoder, getTransactionEncoder } from '@solana/transactions';
13
- import { SolanaSignMessage, SolanaSignTransaction, SolanaSignAndSendTransaction } from '@solana/wallet-standard-features';
14
-
15
- var __defProp = Object.defineProperty;
16
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
17
-
18
- // src/actions.ts
19
- function connectWallet(client, params) {
20
- return client.actions.connectWallet(params.connectorId, params.options);
21
- }
22
- __name(connectWallet, "connectWallet");
23
- function disconnectWallet(client, _params) {
24
- return client.actions.disconnectWallet();
25
- }
26
- __name(disconnectWallet, "disconnectWallet");
27
- function fetchAccount(client, params) {
28
- return client.actions.fetchAccount(params.address, params.commitment);
29
- }
30
- __name(fetchAccount, "fetchAccount");
31
- function fetchBalance(client, params) {
32
- return client.actions.fetchBalance(params.address, params.commitment);
33
- }
34
- __name(fetchBalance, "fetchBalance");
35
- function fetchLookupTable(client, params) {
36
- return client.actions.fetchLookupTable(params.address, params.commitment);
37
- }
38
- __name(fetchLookupTable, "fetchLookupTable");
39
- function fetchLookupTables(client, params) {
40
- return client.actions.fetchLookupTables(params.addresses, params.commitment);
41
- }
42
- __name(fetchLookupTables, "fetchLookupTables");
43
- function fetchNonceAccount(client, params) {
44
- return client.actions.fetchNonceAccount(params.address, params.commitment);
45
- }
46
- __name(fetchNonceAccount, "fetchNonceAccount");
47
- function requestAirdrop(client, params) {
48
- return client.actions.requestAirdrop(params.address, params.lamports);
49
- }
50
- __name(requestAirdrop, "requestAirdrop");
51
- function sendTransaction(client, params) {
52
- return client.actions.sendTransaction(params.transaction, params.commitment);
53
- }
54
- __name(sendTransaction, "sendTransaction");
55
- function setCluster(client, params) {
56
- return client.actions.setCluster(params.endpoint, params.config);
57
- }
58
- __name(setCluster, "setCluster");
59
-
60
- // src/utils.ts
61
- function deepFreeze(value) {
62
- if (typeof value !== "object" || value === null) {
63
- return value;
64
- }
65
- const objectValue = value;
66
- for (const key of Reflect.ownKeys(objectValue)) {
67
- const property = objectValue[key];
68
- deepFreeze(property);
69
- }
70
- return Object.freeze(value);
71
- }
72
- __name(deepFreeze, "deepFreeze");
73
- function now() {
74
- return Date.now();
75
- }
76
- __name(now, "now");
77
- function toErrorMessage(error) {
78
- if (error instanceof Error) {
79
- return error.message;
80
- }
81
- if (typeof error === "string") {
82
- return error;
83
- }
84
- try {
85
- return JSON.stringify(error);
86
- } catch {
87
- return String(error);
88
- }
89
- }
90
- __name(toErrorMessage, "toErrorMessage");
91
-
92
- // src/logging/logger.ts
93
- function createLogger(logger) {
94
- if (logger) {
95
- return logger;
96
- }
97
- return ({ data, level, message }) => {
98
- const payload = data ? { ...data } : {};
99
- switch (level) {
100
- case "error":
101
- console.error(`[react-core] ${message}`, payload);
102
- break;
103
- case "warn":
104
- console.warn(`[react-core] ${message}`, payload);
105
- break;
106
- case "info":
107
- console.info(`[react-core] ${message}`, payload);
108
- break;
109
- default:
110
- console.debug(`[react-core] ${message}`, payload);
111
- }
112
- };
113
- }
114
- __name(createLogger, "createLogger");
115
- function formatError(error) {
116
- return {
117
- error,
118
- message: toErrorMessage(error)
119
- };
120
- }
121
- __name(formatError, "formatError");
122
- function createChainedAbortController(parent) {
123
- const controller = new AbortController();
124
- if (!parent) {
125
- return controller;
126
- }
127
- if (parent.aborted) {
128
- controller.abort(parent.reason);
129
- return controller;
130
- }
131
- const onAbort = /* @__PURE__ */ __name(() => {
132
- controller.abort(parent.reason);
133
- parent.removeEventListener("abort", onAbort);
134
- }, "onAbort");
135
- parent.addEventListener("abort", onAbort, { once: true });
136
- return controller;
137
- }
138
- __name(createChainedAbortController, "createChainedAbortController");
139
- function toBigint(value) {
140
- if (value === void 0) {
141
- return void 0;
142
- }
143
- return typeof value === "bigint" ? value : BigInt(Math.floor(value));
144
- }
145
- __name(toBigint, "toBigint");
146
- var DEFAULT_SIMULATION_CONFIG = Object.freeze({
147
- encoding: "base64",
148
- replaceRecentBlockhash: true,
149
- sigVerify: false
150
- });
151
- function createSolanaRpcClient(config) {
152
- const endpoint = config.endpoint;
153
- const websocketEndpoint = config.websocketEndpoint ?? endpoint;
154
- const commitment = config.commitment ?? "confirmed";
155
- const rpc = createSolanaRpc(endpoint, config.rpcConfig);
156
- const rpcSubscriptions = createSolanaRpcSubscriptions(websocketEndpoint, config.rpcSubscriptionsConfig);
157
- async function sendAndConfirmTransaction(transaction, options = {}) {
158
- const abortController = createChainedAbortController(options.abortSignal);
159
- const targetCommitment = options.commitment ?? commitment;
160
- const wireTransaction = getBase64EncodedWireTransaction(transaction);
161
- const response = await rpc.sendTransaction(wireTransaction, {
162
- encoding: "base64",
163
- maxRetries: toBigint(options.maxRetries),
164
- minContextSlot: toBigint(options.minContextSlot),
165
- preflightCommitment: targetCommitment,
166
- skipPreflight: options.skipPreflight
167
- }).send({ abortSignal: abortController.signal });
168
- const getBlockHeightExceedencePromise = createBlockHeightExceedencePromiseFactory({
169
- rpc,
170
- rpcSubscriptions
171
- });
172
- const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory({
173
- rpc,
174
- rpcSubscriptions
175
- });
176
- await waitForRecentTransactionConfirmation({
177
- abortSignal: abortController.signal,
178
- commitment: targetCommitment,
179
- getBlockHeightExceedencePromise,
180
- getRecentSignatureConfirmationPromise,
181
- transaction
182
- });
183
- return response;
184
- }
185
- __name(sendAndConfirmTransaction, "sendAndConfirmTransaction");
186
- async function simulateTransaction(transaction, options = {}) {
187
- const wireTransaction = getBase64EncodedWireTransaction(transaction);
188
- const baseConfig = options.config ?? {};
189
- const mergedConfig = {
190
- ...DEFAULT_SIMULATION_CONFIG,
191
- ...baseConfig,
192
- commitment: baseConfig.commitment ?? options.commitment ?? commitment
193
- };
194
- const normalizedConfig = mergedConfig.sigVerify === true && mergedConfig.replaceRecentBlockhash !== false ? { ...mergedConfig, replaceRecentBlockhash: false } : mergedConfig;
195
- return rpc.simulateTransaction(wireTransaction, normalizedConfig).send({ abortSignal: options.abortSignal });
196
- }
197
- __name(simulateTransaction, "simulateTransaction");
198
- return {
199
- commitment,
200
- endpoint,
201
- rpc,
202
- rpcSubscriptions,
203
- sendAndConfirmTransaction,
204
- simulateTransaction,
205
- websocketEndpoint
206
- };
207
- }
208
- __name(createSolanaRpcClient, "createSolanaRpcClient");
209
-
210
- // src/serialization/state.ts
211
- var SERIALIZABLE_STATE_VERSION = 1;
212
- function getInitialSerializableState(config) {
213
- return {
214
- autoconnect: false,
215
- commitment: config.commitment,
216
- endpoint: config.endpoint,
217
- lastConnectorId: null,
218
- lastPublicKey: null,
219
- version: SERIALIZABLE_STATE_VERSION,
220
- websocketEndpoint: config.websocketEndpoint
221
- };
222
- }
223
- __name(getInitialSerializableState, "getInitialSerializableState");
224
- function applySerializableState(config, state) {
225
- if (!state) {
226
- return config;
227
- }
228
- return {
229
- ...config,
230
- commitment: state.commitment ?? config.commitment,
231
- endpoint: state.endpoint ?? config.endpoint,
232
- websocketEndpoint: state.websocketEndpoint ?? config.websocketEndpoint
233
- };
234
- }
235
- __name(applySerializableState, "applySerializableState");
236
- function serializeSolanaState(state) {
237
- return JSON.stringify(state);
238
- }
239
- __name(serializeSolanaState, "serializeSolanaState");
240
- function deserializeSolanaState(json) {
241
- if (!json) return null;
242
- try {
243
- const parsed = JSON.parse(json);
244
- if (typeof parsed !== "object" || parsed === null) return null;
245
- const state = parsed;
246
- return {
247
- autoconnect: state.autoconnect ?? false,
248
- commitment: state.commitment,
249
- endpoint: state.endpoint,
250
- lastConnectorId: state.lastConnectorId ?? null,
251
- lastPublicKey: state.lastPublicKey ?? null,
252
- version: state.version ?? SERIALIZABLE_STATE_VERSION,
253
- websocketEndpoint: state.websocketEndpoint
254
- };
255
- } catch {
256
- return null;
257
- }
258
- }
259
- __name(deserializeSolanaState, "deserializeSolanaState");
260
- function getSerializableStateSnapshot(client) {
261
- const state = client.store.getState();
262
- const wallet = state.wallet;
263
- const autoConnectPreference = wallet.autoConnect;
264
- let lastConnectorId = null;
265
- let lastPublicKey = null;
266
- if ("connectorId" in wallet) {
267
- lastConnectorId = wallet.connectorId ?? null;
268
- if (wallet.status === "connected") {
269
- lastPublicKey = wallet.session.account.address.toString();
270
- }
271
- }
272
- return {
273
- autoconnect: autoConnectPreference ?? Boolean(lastConnectorId),
274
- commitment: state.cluster.commitment,
275
- endpoint: state.cluster.endpoint,
276
- lastConnectorId,
277
- lastPublicKey,
278
- version: SERIALIZABLE_STATE_VERSION,
279
- websocketEndpoint: state.cluster.websocketEndpoint
280
- };
281
- }
282
- __name(getSerializableStateSnapshot, "getSerializableStateSnapshot");
283
- function subscribeSolanaState(client, listener) {
284
- let previous = serializeSolanaState(getSerializableStateSnapshot(client));
285
- listener(JSON.parse(previous));
286
- const unsubscribe = client.store.subscribe(() => {
287
- const snapshot = getSerializableStateSnapshot(client);
288
- const serialized = serializeSolanaState(snapshot);
289
- if (serialized === previous) {
290
- return;
291
- }
292
- previous = serialized;
293
- listener(snapshot);
294
- });
295
- return unsubscribe;
296
- }
297
- __name(subscribeSolanaState, "subscribeSolanaState");
298
-
299
- // src/utils/cluster.ts
300
- function ensureHttpProtocol(endpoint) {
301
- if (endpoint.startsWith("http://") || endpoint.startsWith("https://") || endpoint.startsWith("ws://") || endpoint.startsWith("wss://")) {
302
- return endpoint;
303
- }
304
- return `https://${endpoint}`;
305
- }
306
- __name(ensureHttpProtocol, "ensureHttpProtocol");
307
- var MONIKER_ENDPOINTS = {
308
- devnet: {
309
- endpoint: "https://api.devnet.solana.com",
310
- websocketEndpoint: "wss://api.devnet.solana.com"
311
- },
312
- localhost: {
313
- endpoint: "http://127.0.0.1:8899",
314
- websocketEndpoint: "ws://127.0.0.1:8900"
315
- },
316
- localnet: {
317
- endpoint: "http://127.0.0.1:8899",
318
- websocketEndpoint: "ws://127.0.0.1:8900"
319
- },
320
- "mainnet-beta": {
321
- endpoint: "https://api.mainnet-beta.solana.com",
322
- websocketEndpoint: "wss://api.mainnet-beta.solana.com"
323
- },
324
- mainnet: {
325
- endpoint: "https://api.mainnet-beta.solana.com",
326
- websocketEndpoint: "wss://api.mainnet-beta.solana.com"
327
- },
328
- testnet: {
329
- endpoint: "https://api.testnet.solana.com",
330
- websocketEndpoint: "wss://api.testnet.solana.com"
331
- }
332
- };
333
- function inferWebsocketEndpoint(endpoint) {
334
- if (endpoint.startsWith("https://")) {
335
- return endpoint.replace("https://", "wss://");
336
- }
337
- if (endpoint.startsWith("http://")) {
338
- return endpoint.replace("http://", "ws://");
339
- }
340
- if (endpoint.startsWith("ws://") || endpoint.startsWith("wss://")) {
341
- return endpoint;
342
- }
343
- return endpoint;
344
- }
345
- __name(inferWebsocketEndpoint, "inferWebsocketEndpoint");
346
- function resolveCluster(config) {
347
- const moniker = config.moniker ?? (config.endpoint ? "custom" : "devnet");
348
- const mapped = moniker === "custom" ? void 0 : MONIKER_ENDPOINTS[moniker];
349
- const endpoint = ensureHttpProtocol(config.endpoint ?? mapped?.endpoint);
350
- const rawWebsocket = config.websocketEndpoint ? ensureHttpProtocol(config.websocketEndpoint) : void 0;
351
- const websocketEndpoint = inferWebsocketEndpoint(
352
- rawWebsocket ?? mapped?.websocketEndpoint ?? endpoint
353
- );
354
- return {
355
- endpoint,
356
- moniker,
357
- websocketEndpoint
358
- };
359
- }
360
- __name(resolveCluster, "resolveCluster");
361
-
362
- // src/wallet/registry.ts
363
- function createWalletRegistry(connectors) {
364
- const byId = /* @__PURE__ */ new Map();
365
- for (const connector of connectors) {
366
- if (!byId.has(connector.id)) {
367
- byId.set(connector.id, connector);
368
- }
369
- }
370
- return {
371
- all: [...byId.values()],
372
- /**
373
- * Looks up a connector by identifier.
374
- *
375
- * @param id - Unique connector identifier.
376
- * @returns The registered connector, if present.
377
- */
378
- get(id) {
379
- return byId.get(id);
380
- }
381
- };
382
- }
383
- __name(createWalletRegistry, "createWalletRegistry");
384
- function updateState(store, update) {
385
- store.setState((state) => ({
386
- ...state,
387
- ...update,
388
- lastUpdatedAt: now()
389
- }));
390
- }
391
- __name(updateState, "updateState");
392
- function createActions({ connectors, logger: inputLogger, runtime, store }) {
393
- const logger = inputLogger ?? createLogger();
394
- let walletEventsCleanup;
395
- function getCommitment(commitment) {
396
- return commitment ?? store.getState().cluster.commitment;
397
- }
398
- __name(getCommitment, "getCommitment");
399
- async function warmupCluster(endpoint, commitment) {
400
- try {
401
- const start = now();
402
- await runtime.rpc.getLatestBlockhash({ commitment }).send({ abortSignal: AbortSignal.timeout(1e4) });
403
- return now() - start;
404
- } catch (error) {
405
- logger({
406
- data: { endpoint, ...formatError(error) },
407
- level: "warn",
408
- message: "cluster warmup failed"
409
- });
410
- return void 0;
411
- }
412
- }
413
- __name(warmupCluster, "warmupCluster");
414
- async function setCluster2(endpoint, config) {
415
- const nextCommitment = config?.commitment ?? store.getState().cluster.commitment;
416
- const websocketEndpoint = config?.websocketEndpoint ?? endpoint;
417
- store.setState((state) => ({
418
- ...state,
419
- cluster: {
420
- commitment: nextCommitment,
421
- endpoint,
422
- status: { status: "connecting" },
423
- websocketEndpoint
424
- },
425
- lastUpdatedAt: now()
426
- }));
427
- try {
428
- const newRpcClient = createSolanaRpcClient({
429
- commitment: nextCommitment,
430
- endpoint,
431
- websocketEndpoint
432
- });
433
- runtime.rpc = newRpcClient.rpc;
434
- runtime.rpcSubscriptions = newRpcClient.rpcSubscriptions;
435
- const latencyMs = await warmupCluster(endpoint, nextCommitment);
436
- store.setState((state) => ({
437
- ...state,
438
- cluster: {
439
- commitment: nextCommitment,
440
- endpoint,
441
- status: { latencyMs, status: "ready" },
442
- websocketEndpoint
443
- },
444
- lastUpdatedAt: now()
445
- }));
446
- } catch (error) {
447
- store.setState((state) => ({
448
- ...state,
449
- cluster: {
450
- commitment: nextCommitment,
451
- endpoint,
452
- status: { error, status: "error" },
453
- websocketEndpoint
454
- },
455
- lastUpdatedAt: now()
456
- }));
457
- logger({
458
- data: { endpoint, ...formatError(error) },
459
- level: "error",
460
- message: "cluster setup failed"
461
- });
462
- throw error;
463
- }
464
- }
465
- __name(setCluster2, "setCluster");
466
- async function connectWallet2(connectorId, options = {}) {
467
- walletEventsCleanup?.();
468
- walletEventsCleanup = void 0;
469
- const connector = connectors.get(connectorId);
470
- if (!connector) {
471
- throw new Error(`No wallet connector registered for id "${connectorId}".`);
472
- }
473
- if (!connector.isSupported()) {
474
- throw new Error(`Wallet connector "${connectorId}" is not supported in this environment.`);
475
- }
476
- const autoConnectPreference = options.autoConnect ?? false;
477
- store.setState((state) => ({
478
- ...state,
479
- lastUpdatedAt: now(),
480
- wallet: { autoConnect: autoConnectPreference, connectorId, status: "connecting" }
481
- }));
482
- try {
483
- const session = await connector.connect(options);
484
- store.setState((state) => ({
485
- ...state,
486
- lastUpdatedAt: now(),
487
- wallet: { autoConnect: autoConnectPreference, connectorId, session, status: "connected" }
488
- }));
489
- if (session.onAccountsChanged) {
490
- walletEventsCleanup = session.onAccountsChanged((accounts) => {
491
- if (accounts.length === 0) {
492
- walletEventsCleanup?.();
493
- walletEventsCleanup = void 0;
494
- void disconnectWallet3();
495
- }
496
- });
497
- }
498
- logger({
499
- data: { address: session.account.address.toString(), connectorId },
500
- level: "info",
501
- message: "wallet connected"
502
- });
503
- } catch (error) {
504
- store.setState((state) => ({
505
- ...state,
506
- lastUpdatedAt: now(),
507
- wallet: { autoConnect: autoConnectPreference, connectorId, error, status: "error" }
508
- }));
509
- logger({
510
- data: { connectorId, ...formatError(error) },
511
- level: "error",
512
- message: "wallet connection failed"
513
- });
514
- throw error;
515
- }
516
- }
517
- __name(connectWallet2, "connectWallet");
518
- async function disconnectWallet3() {
519
- const wallet = store.getState().wallet;
520
- if (wallet.status === "disconnected") {
521
- return;
522
- }
523
- walletEventsCleanup?.();
524
- walletEventsCleanup = void 0;
525
- try {
526
- if (wallet.status === "connected") {
527
- await wallet.session.disconnect();
528
- const connector = connectors.get(wallet.connectorId);
529
- if (connector) {
530
- await connector.disconnect();
531
- }
532
- } else if (wallet.status === "connecting") {
533
- const connector = connectors.get(wallet.connectorId);
534
- if (connector) {
535
- await connector.disconnect();
536
- }
537
- }
538
- } finally {
539
- updateState(store, { wallet: { status: "disconnected" } });
540
- }
541
- }
542
- __name(disconnectWallet3, "disconnectWallet");
543
- async function fetchBalance2(address5, commitment) {
544
- const key = address5.toString();
545
- store.setState((state) => ({
546
- ...state,
547
- accounts: {
548
- ...state.accounts,
549
- [key]: {
550
- address: address5,
551
- data: state.accounts[key]?.data,
552
- error: void 0,
553
- fetching: true,
554
- lamports: state.accounts[key]?.lamports ?? null,
555
- lastFetchedAt: now(),
556
- slot: state.accounts[key]?.slot ?? null
557
- }
558
- },
559
- lastUpdatedAt: now()
560
- }));
561
- try {
562
- const response = await runtime.rpc.getBalance(address5, { commitment: getCommitment(commitment) }).send({ abortSignal: AbortSignal.timeout(1e4) });
563
- const lamports2 = response.value;
564
- store.setState((state) => ({
565
- ...state,
566
- accounts: {
567
- ...state.accounts,
568
- [key]: {
569
- address: address5,
570
- data: state.accounts[key]?.data,
571
- error: void 0,
572
- fetching: false,
573
- lamports: lamports2,
574
- lastFetchedAt: now(),
575
- slot: response.context.slot
576
- }
577
- },
578
- lastUpdatedAt: now()
579
- }));
580
- return lamports2;
581
- } catch (error) {
582
- store.setState((state) => ({
583
- ...state,
584
- accounts: {
585
- ...state.accounts,
586
- [key]: {
587
- address: address5,
588
- data: state.accounts[key]?.data,
589
- error,
590
- fetching: false,
591
- lamports: state.accounts[key]?.lamports ?? null,
592
- lastFetchedAt: now(),
593
- slot: state.accounts[key]?.slot ?? null
594
- }
595
- },
596
- lastUpdatedAt: now()
597
- }));
598
- logger({
599
- data: { address: key, ...formatError(error) },
600
- level: "error",
601
- message: "balance fetch failed"
602
- });
603
- throw error;
604
- }
605
- }
606
- __name(fetchBalance2, "fetchBalance");
607
- async function fetchAccount2(address5, commitment) {
608
- const key = address5.toString();
609
- store.setState((state) => ({
610
- ...state,
611
- accounts: {
612
- ...state.accounts,
613
- [key]: {
614
- address: address5,
615
- data: state.accounts[key]?.data,
616
- error: void 0,
617
- fetching: true,
618
- lamports: state.accounts[key]?.lamports ?? null,
619
- lastFetchedAt: now(),
620
- slot: state.accounts[key]?.slot ?? null
621
- }
622
- },
623
- lastUpdatedAt: now()
624
- }));
625
- try {
626
- const response = await runtime.rpc.getAccountInfo(address5, { commitment: getCommitment(commitment), encoding: "base64" }).send({ abortSignal: AbortSignal.timeout(1e4) });
627
- const value = response.value;
628
- const lamports2 = value?.lamports ?? null;
629
- store.setState((state) => ({
630
- ...state,
631
- accounts: {
632
- ...state.accounts,
633
- [key]: {
634
- address: address5,
635
- data: value,
636
- error: void 0,
637
- fetching: false,
638
- lamports: lamports2,
639
- lastFetchedAt: now(),
640
- slot: response.context.slot
641
- }
642
- },
643
- lastUpdatedAt: now()
644
- }));
645
- return store.getState().accounts[key];
646
- } catch (error) {
647
- store.setState((state) => ({
648
- ...state,
649
- accounts: {
650
- ...state.accounts,
651
- [key]: {
652
- address: address5,
653
- data: state.accounts[key]?.data,
654
- error,
655
- fetching: false,
656
- lamports: state.accounts[key]?.lamports ?? null,
657
- lastFetchedAt: now(),
658
- slot: state.accounts[key]?.slot ?? null
659
- }
660
- },
661
- lastUpdatedAt: now()
662
- }));
663
- logger({
664
- data: { address: key, ...formatError(error) },
665
- level: "error",
666
- message: "account fetch failed"
667
- });
668
- throw error;
669
- }
670
- }
671
- __name(fetchAccount2, "fetchAccount");
672
- async function fetchLookupTable2(addr, commitment) {
673
- const account = await fetchAddressLookupTable(runtime.rpc, addr, {
674
- commitment: getCommitment(commitment)
675
- });
676
- const { addresses, authority, deactivationSlot, lastExtendedSlot, lastExtendedSlotStartIndex } = account.data;
677
- return {
678
- addresses,
679
- authority: isSome(authority) ? authority.value : void 0,
680
- deactivationSlot,
681
- lastExtendedSlot,
682
- lastExtendedSlotStartIndex
683
- };
684
- }
685
- __name(fetchLookupTable2, "fetchLookupTable");
686
- async function fetchLookupTables2(addresses, commitment) {
687
- if (addresses.length === 0) return [];
688
- const accounts = await fetchAllAddressLookupTable(runtime.rpc, addresses, {
689
- commitment: getCommitment(commitment)
690
- });
691
- return accounts.map(({ data }) => ({
692
- addresses: data.addresses,
693
- authority: isSome(data.authority) ? data.authority.value : void 0,
694
- deactivationSlot: data.deactivationSlot,
695
- lastExtendedSlot: data.lastExtendedSlot,
696
- lastExtendedSlotStartIndex: data.lastExtendedSlotStartIndex
697
- }));
698
- }
699
- __name(fetchLookupTables2, "fetchLookupTables");
700
- async function fetchNonceAccount2(addr, commitment) {
701
- const account = await fetchNonce(runtime.rpc, addr, {
702
- commitment: getCommitment(commitment)
703
- });
704
- return { authority: account.data.authority, blockhash: account.data.blockhash };
705
- }
706
- __name(fetchNonceAccount2, "fetchNonceAccount");
707
- async function sendTransaction2(transaction, commitment) {
708
- const targetCommitment = getCommitment(commitment);
709
- const abortController = new AbortController();
710
- const signature5 = await runtime.rpc.sendTransaction(getBase64EncodedWireTransaction(transaction), {
711
- encoding: "base64",
712
- preflightCommitment: targetCommitment
713
- }).send({ abortSignal: abortController.signal });
714
- const key = signature5.toString();
715
- store.setState((state) => ({
716
- ...state,
717
- lastUpdatedAt: now(),
718
- transactions: {
719
- ...state.transactions,
720
- [key]: {
721
- lastUpdatedAt: now(),
722
- signature: signature5,
723
- status: "sending"
724
- }
725
- }
726
- }));
727
- const getBlockHeightExceedencePromise = createBlockHeightExceedencePromiseFactory({
728
- rpc: runtime.rpc,
729
- rpcSubscriptions: runtime.rpcSubscriptions
730
- });
731
- const getRecentSignatureConfirmationPromise = createRecentSignatureConfirmationPromiseFactory({
732
- rpc: runtime.rpc,
733
- rpcSubscriptions: runtime.rpcSubscriptions
734
- });
735
- try {
736
- await waitForRecentTransactionConfirmation({
737
- abortSignal: abortController.signal,
738
- commitment: targetCommitment,
739
- getBlockHeightExceedencePromise,
740
- getRecentSignatureConfirmationPromise,
741
- transaction
742
- });
743
- store.setState((state) => ({
744
- ...state,
745
- lastUpdatedAt: now(),
746
- transactions: {
747
- ...state.transactions,
748
- [key]: {
749
- lastUpdatedAt: now(),
750
- signature: signature5,
751
- status: "confirmed"
752
- }
753
- }
754
- }));
755
- return signature5;
756
- } catch (error) {
757
- store.setState((state) => ({
758
- ...state,
759
- lastUpdatedAt: now(),
760
- transactions: {
761
- ...state.transactions,
762
- [key]: {
763
- error,
764
- lastUpdatedAt: now(),
765
- signature: signature5,
766
- status: "failed"
767
- }
768
- }
769
- }));
770
- logger({
771
- data: { signature: key, ...formatError(error) },
772
- level: "error",
773
- message: "transaction failed to confirm"
774
- });
775
- throw error;
776
- }
777
- }
778
- __name(sendTransaction2, "sendTransaction");
779
- async function requestAirdrop2(address5, lamports2) {
780
- try {
781
- const factory = airdropFactory({
782
- rpc: runtime.rpc,
783
- rpcSubscriptions: runtime.rpcSubscriptions
784
- });
785
- const signature5 = await factory({
786
- commitment: getCommitment("confirmed"),
787
- lamports: lamports2,
788
- recipientAddress: address5
789
- });
790
- logger({
791
- data: { address: address5.toString(), lamports: lamports2.toString(), signature: signature5 },
792
- level: "info",
793
- message: "airdrop requested"
794
- });
795
- return signature5;
796
- } catch (error) {
797
- logger({
798
- data: { address: address5.toString(), lamports: lamports2.toString(), ...formatError(error) },
799
- level: "error",
800
- message: "airdrop request failed"
801
- });
802
- throw error;
803
- }
804
- }
805
- __name(requestAirdrop2, "requestAirdrop");
806
- return {
807
- connectWallet: connectWallet2,
808
- disconnectWallet: disconnectWallet3,
809
- fetchAccount: fetchAccount2,
810
- fetchBalance: fetchBalance2,
811
- fetchLookupTable: fetchLookupTable2,
812
- fetchLookupTables: fetchLookupTables2,
813
- fetchNonceAccount: fetchNonceAccount2,
814
- requestAirdrop: requestAirdrop2,
815
- sendTransaction: sendTransaction2,
816
- setCluster: setCluster2
817
- };
818
- }
819
- __name(createActions, "createActions");
820
-
821
- // src/numeric/math.ts
822
- var TEN = 10n;
823
- function pow10(exponent) {
824
- assertDecimals(exponent, "exponent");
825
- return TEN ** BigInt(exponent);
826
- }
827
- __name(pow10, "pow10");
828
- function assertNonNegative(value, label = "value") {
829
- if (value < 0n) {
830
- throw new RangeError(`${label} must be non-negative`);
831
- }
832
- }
833
- __name(assertNonNegative, "assertNonNegative");
834
- function assertDecimals(decimals, label = "decimals") {
835
- if (!Number.isInteger(decimals) || decimals < 0 || decimals > 38) {
836
- throw new RangeError(`${label} must be an integer between 0 and 38`);
837
- }
838
- }
839
- __name(assertDecimals, "assertDecimals");
840
- function toBigint2(value, label = "value") {
841
- if (typeof value === "bigint") {
842
- return value;
843
- }
844
- if (typeof value === "number") {
845
- if (!Number.isFinite(value) || !Number.isInteger(value)) {
846
- throw new RangeError(`${label} must be a finite integer when provided as a number`);
847
- }
848
- if (!Number.isSafeInteger(value)) {
849
- throw new RangeError(`${label} must be within the safe integer range when provided as a number`);
850
- }
851
- return BigInt(value);
852
- }
853
- const trimmed = value.trim();
854
- const match = /^[-+]?\d+$/.exec(trimmed);
855
- if (!match) {
856
- throw new SyntaxError(`${label} must be an integer string`);
857
- }
858
- return BigInt(match[0]);
859
- }
860
- __name(toBigint2, "toBigint");
861
- function checkedAdd(lhs, rhs, label = "result") {
862
- const result = lhs + rhs;
863
- assertNonNegative(result, label);
864
- return result;
865
- }
866
- __name(checkedAdd, "checkedAdd");
867
- function checkedSubtract(lhs, rhs, label = "result") {
868
- const result = lhs - rhs;
869
- assertNonNegative(result, label);
870
- return result;
871
- }
872
- __name(checkedSubtract, "checkedSubtract");
873
- function checkedMultiply(lhs, rhs, label = "result") {
874
- const result = lhs * rhs;
875
- assertNonNegative(result, label);
876
- return result;
877
- }
878
- __name(checkedMultiply, "checkedMultiply");
879
- function checkedDivide(dividend, divisor, label = "result") {
880
- if (divisor === 0n) {
881
- throw new RangeError("divisor must be non-zero");
882
- }
883
- const result = dividend / divisor;
884
- assertNonNegative(result, label);
885
- return result;
886
- }
887
- __name(checkedDivide, "checkedDivide");
888
-
889
- // src/numeric/rational.ts
890
- function divideWithRounding(dividend, divisor, rounding) {
891
- if (divisor <= 0n) {
892
- throw new RangeError("divisor must be positive");
893
- }
894
- const base = dividend / divisor;
895
- const remainder = dividend % divisor;
896
- if (remainder === 0n) {
897
- return base;
898
- }
899
- switch (rounding) {
900
- case "ceil":
901
- return base + 1n;
902
- case "round": {
903
- const twice = remainder * 2n;
904
- return twice >= divisor ? base + 1n : base;
905
- }
906
- default:
907
- return base;
908
- }
909
- }
910
- __name(divideWithRounding, "divideWithRounding");
911
- function createRatio(numeratorInput, denominatorInput) {
912
- const numerator = toBigint2(numeratorInput, "numerator");
913
- const denominator = toBigint2(denominatorInput, "denominator");
914
- if (denominator <= 0n) {
915
- throw new RangeError("denominator must be positive");
916
- }
917
- assertNonNegative(numerator, "numerator");
918
- return Object.freeze({ denominator, numerator });
919
- }
920
- __name(createRatio, "createRatio");
921
- function applyRatio(amount, ratio, options = {}) {
922
- assertNonNegative(amount, "amount");
923
- const dividend = amount * ratio.numerator;
924
- const rounding = options.rounding ?? "floor";
925
- return divideWithRounding(dividend, ratio.denominator, rounding);
926
- }
927
- __name(applyRatio, "applyRatio");
928
-
929
- // src/numeric/amounts.ts
930
- var DECIMAL_PATTERN = /^\d+(?:\.\d+)?$/;
931
- function normalizeNumberInput(value, decimals, label) {
932
- if (!Number.isFinite(value)) {
933
- throw new RangeError(`${label} must be a finite number`);
934
- }
935
- if (Number.isInteger(value)) {
936
- return value.toString(10);
937
- }
938
- const stringValue = value.toString(10);
939
- if (stringValue.includes("e") || stringValue.includes("E")) {
940
- throw new RangeError(`${label} cannot use exponential notation; provide a string instead`);
941
- }
942
- const parts = stringValue.split(".");
943
- if (parts[1] && parts[1].length > decimals + 6) {
944
- throw new RangeError(`${label} exceeds safe precision; provide a string instead`);
945
- }
946
- return stringValue;
947
- }
948
- __name(normalizeNumberInput, "normalizeNumberInput");
949
- function decimalToBaseUnits(value, decimals, scale, options) {
950
- const label = options.label ?? "value";
951
- const rounding = options.rounding ?? "floor";
952
- const sanitized = value.replace(/_/g, "").trim();
953
- if (sanitized === "") {
954
- throw new SyntaxError(`${label} must not be empty`);
955
- }
956
- if (!DECIMAL_PATTERN.test(sanitized)) {
957
- throw new SyntaxError(`${label} must be a non-negative decimal string`);
958
- }
959
- const [integerPartRaw, fractionalRaw] = sanitized.split(".");
960
- const integerPart = integerPartRaw || "0";
961
- assertNonNegative(BigInt(integerPart), label);
962
- let result = BigInt(integerPart) * scale;
963
- const fractionalDigits = fractionalRaw ?? "";
964
- if (decimals === 0) {
965
- if (fractionalDigits.length === 0) {
966
- return result;
967
- }
968
- const hasFractional = /[1-9]/.test(fractionalDigits);
969
- if (rounding === "ceil" && hasFractional) {
970
- return result + 1n;
971
- }
972
- if (rounding === "round" && fractionalDigits[0] !== void 0 && fractionalDigits[0] >= "5") {
973
- return result + 1n;
974
- }
975
- return result;
976
- }
977
- const truncatedFractional = fractionalDigits.slice(0, decimals).padEnd(decimals, "0");
978
- const fractionalComponent = truncatedFractional === "" ? 0n : BigInt(truncatedFractional);
979
- result += fractionalComponent;
980
- if (fractionalDigits.length > decimals) {
981
- const remainderDigits = fractionalDigits.slice(decimals);
982
- const hasRemainder = /[1-9]/.test(remainderDigits);
983
- if (rounding === "ceil" && hasRemainder) {
984
- result += 1n;
985
- } else if (rounding === "round") {
986
- const firstRemainderDigit = remainderDigits[0];
987
- if (firstRemainderDigit !== void 0 && firstRemainderDigit >= "5") {
988
- result += 1n;
989
- }
990
- }
991
- }
992
- return result;
993
- }
994
- __name(decimalToBaseUnits, "decimalToBaseUnits");
995
- function formatBaseUnits(amount, decimals, scale, options) {
996
- assertNonNegative(amount, "amount");
997
- const minimumFractionDigits = options.minimumFractionDigits ?? 0;
998
- if (minimumFractionDigits < 0 || minimumFractionDigits > decimals) {
999
- throw new RangeError("minimumFractionDigits must be between 0 and the token decimals");
1000
- }
1001
- const trimTrailingZeros = options.trimTrailingZeros ?? true;
1002
- if (decimals === 0) {
1003
- return amount.toString();
1004
- }
1005
- const whole = amount / scale;
1006
- let fraction = (amount % scale).toString().padStart(decimals, "0");
1007
- if (trimTrailingZeros) {
1008
- fraction = fraction.replace(/0+$/, "");
1009
- }
1010
- if (fraction.length < minimumFractionDigits) {
1011
- fraction = fraction.padEnd(minimumFractionDigits, "0");
1012
- }
1013
- if (fraction.length === 0) {
1014
- return whole.toString();
1015
- }
1016
- return `${whole.toString()}.${fraction}`;
1017
- }
1018
- __name(formatBaseUnits, "formatBaseUnits");
1019
- function createTokenAmount(decimals) {
1020
- assertDecimals(decimals, "decimals");
1021
- const scale = pow10(decimals);
1022
- function fromBaseUnits(value, label) {
1023
- const amount = toBigint2(value, label ?? "amount");
1024
- assertNonNegative(amount, label ?? "amount");
1025
- return amount;
1026
- }
1027
- __name(fromBaseUnits, "fromBaseUnits");
1028
- function fromDecimal(value, options = {}) {
1029
- const label = options.label ?? "value";
1030
- if (typeof value === "number") {
1031
- if (Number.isInteger(value)) {
1032
- if (!Number.isSafeInteger(value)) {
1033
- throw new RangeError(`${label} must be within the safe integer range when provided as a number`);
1034
- }
1035
- return fromBaseUnits(BigInt(value) * scale, label);
1036
- }
1037
- if (decimals === 0) {
1038
- throw new RangeError(`${label} cannot include fractional digits for a token with 0 decimals`);
1039
- }
1040
- const normalized = normalizeNumberInput(value, decimals, label);
1041
- return decimalToBaseUnits(normalized, decimals, scale, options);
1042
- }
1043
- return decimalToBaseUnits(value, decimals, scale, options);
1044
- }
1045
- __name(fromDecimal, "fromDecimal");
1046
- function toDecimalString(amount, options = {}) {
1047
- return formatBaseUnits(fromBaseUnits(amount), decimals, scale, options);
1048
- }
1049
- __name(toDecimalString, "toDecimalString");
1050
- function add(lhs, rhs) {
1051
- return checkedAdd(fromBaseUnits(lhs), fromBaseUnits(rhs));
1052
- }
1053
- __name(add, "add");
1054
- function subtract(lhs, rhs) {
1055
- return checkedSubtract(fromBaseUnits(lhs), fromBaseUnits(rhs));
1056
- }
1057
- __name(subtract, "subtract");
1058
- function multiplyByRatio(amount, ratio, options) {
1059
- return applyRatio(fromBaseUnits(amount), ratio, options);
1060
- }
1061
- __name(multiplyByRatio, "multiplyByRatio");
1062
- function isZero(amount) {
1063
- return fromBaseUnits(amount) === 0n;
1064
- }
1065
- __name(isZero, "isZero");
1066
- function compare(lhs, rhs) {
1067
- const left = fromBaseUnits(lhs);
1068
- const right = fromBaseUnits(rhs);
1069
- if (left > right) {
1070
- return 1;
1071
- }
1072
- if (left < right) {
1073
- return -1;
1074
- }
1075
- return 0;
1076
- }
1077
- __name(compare, "compare");
1078
- return Object.freeze({
1079
- add,
1080
- compare,
1081
- decimals,
1082
- fromBaseUnits,
1083
- fromDecimal,
1084
- isZero,
1085
- multiplyByRatio,
1086
- scale,
1087
- subtract,
1088
- toDecimalString
1089
- });
1090
- }
1091
- __name(createTokenAmount, "createTokenAmount");
1092
-
1093
- // src/numeric/lamports.ts
1094
- var BASE_LAMPORTS = createTokenAmount(9);
1095
- var LAMPORTS_PER_SOL = BASE_LAMPORTS.scale;
1096
- var lamportsMath = Object.freeze({
1097
- /**
1098
- * Adds two lamport amounts.
1099
- *
1100
- * @param lhs - First lamport operand.
1101
- * @param rhs - Second lamport operand.
1102
- * @returns Sum as lamports.
1103
- */
1104
- add(lhs, rhs) {
1105
- return BASE_LAMPORTS.add(lhs, rhs);
1106
- },
1107
- /**
1108
- * Compares two lamport amounts.
1109
- *
1110
- * @param lhs - First lamport operand.
1111
- * @param rhs - Second lamport operand.
1112
- * @returns `1`, `0`, or `-1` corresponding to the comparison result.
1113
- */
1114
- compare(lhs, rhs) {
1115
- return BASE_LAMPORTS.compare(lhs, rhs);
1116
- },
1117
- decimals: BASE_LAMPORTS.decimals,
1118
- /**
1119
- * Validates and converts raw lamport inputs.
1120
- *
1121
- * @param value - Integer-like lamport amount.
1122
- * @param label - Optional label used for error reporting.
1123
- * @returns Normalized lamport bigint.
1124
- */
1125
- fromLamports(value, label) {
1126
- return BASE_LAMPORTS.fromBaseUnits(value, label);
1127
- },
1128
- /**
1129
- * Converts SOL denominated values into lamports.
1130
- *
1131
- * @param value - Decimal representation of SOL.
1132
- * @param options - Optional rounding and labelling configuration.
1133
- * @returns Lamport amount.
1134
- */
1135
- fromSol(value, options) {
1136
- return BASE_LAMPORTS.fromDecimal(value, options);
1137
- },
1138
- /**
1139
- * Determines whether a lamport amount equals zero.
1140
- *
1141
- * @param amount - Lamports to inspect.
1142
- * @returns `true` when the amount is zero.
1143
- */
1144
- isZero(amount) {
1145
- return BASE_LAMPORTS.isZero(amount);
1146
- },
1147
- /**
1148
- * Applies a ratio to lamports.
1149
- *
1150
- * @param amount - Lamport amount to scale.
1151
- * @param ratio - Ratio produced by {@link createRatio}.
1152
- * @param options - Optional rounding configuration.
1153
- * @returns Scaled lamport amount.
1154
- */
1155
- multiplyByRatio(amount, ratio, options) {
1156
- return BASE_LAMPORTS.multiplyByRatio(amount, ratio, options);
1157
- },
1158
- raw: BASE_LAMPORTS,
1159
- scale: BASE_LAMPORTS.scale,
1160
- /**
1161
- * Subtracts two lamport amounts.
1162
- *
1163
- * @param lhs - First lamport operand.
1164
- * @param rhs - Second lamport operand.
1165
- * @returns Difference as lamports.
1166
- */
1167
- subtract(lhs, rhs) {
1168
- return BASE_LAMPORTS.subtract(lhs, rhs);
1169
- },
1170
- /**
1171
- * Formats lamports into a human-readable SOL string.
1172
- *
1173
- * @param amount - Lamport amount to format.
1174
- * @param options - Formatting preferences.
1175
- * @returns SOL string representation.
1176
- */
1177
- toSolString(amount, options) {
1178
- return BASE_LAMPORTS.toDecimalString(amount, options);
1179
- }
1180
- });
1181
- function lamports(value, label) {
1182
- return lamportsMath.fromLamports(value, label);
1183
- }
1184
- __name(lamports, "lamports");
1185
- function lamportsFromSol(value, options) {
1186
- return lamportsMath.fromSol(value, options);
1187
- }
1188
- __name(lamportsFromSol, "lamportsFromSol");
1189
- function lamportsToSolString(amount, options) {
1190
- return lamportsMath.toSolString(amount, options);
1191
- }
1192
- __name(lamportsToSolString, "lamportsToSolString");
1193
- function isWalletSession(value) {
1194
- if (typeof value !== "object" || value === null) {
1195
- return false;
1196
- }
1197
- return "account" in value && "connector" in value && "disconnect" in value;
1198
- }
1199
- __name(isWalletSession, "isWalletSession");
1200
- function createWalletTransactionSigner(session, config = {}) {
1201
- const { commitment } = config;
1202
- const address5 = session.account.address;
1203
- if (session.signTransaction) {
1204
- const signTransaction = session.signTransaction.bind(session);
1205
- const modifyingSigner = Object.freeze({
1206
- address: address5,
1207
- async modifyAndSignTransactions(transactions) {
1208
- const signedTransactions = [];
1209
- for (const transaction of transactions) {
1210
- const castTransaction = transaction;
1211
- const signed = await signTransaction(
1212
- castTransaction
1213
- );
1214
- const signature5 = signed.signatures[address5];
1215
- if (!signature5) {
1216
- throw new Error("Wallet did not populate the expected fee payer signature.");
1217
- }
1218
- const mergedTransaction = Object.freeze({
1219
- ...castTransaction,
1220
- messageBytes: signed.messageBytes,
1221
- signatures: Object.freeze({
1222
- ...castTransaction.signatures,
1223
- ...signed.signatures
1224
- })
1225
- });
1226
- signedTransactions.push(mergedTransaction);
1227
- }
1228
- return Object.freeze(signedTransactions);
1229
- },
1230
- async signTransactions(transactions) {
1231
- const signedTransactions = await this.modifyAndSignTransactions(transactions);
1232
- return Object.freeze(
1233
- signedTransactions.map((signedTransaction) => {
1234
- const signature5 = signedTransaction.signatures[address5];
1235
- if (!signature5) {
1236
- throw new Error("Expected signer to produce a signature for the provided address.");
1237
- }
1238
- return Object.freeze({ [address5]: signature5 });
1239
- })
1240
- );
1241
- }
1242
- });
1243
- return {
1244
- mode: "partial",
1245
- signer: modifyingSigner
1246
- };
1247
- }
1248
- if (session.sendTransaction) {
1249
- const base58Encoder = getBase58Encoder();
1250
- const sendTransaction2 = session.sendTransaction.bind(session);
1251
- const sendingSigner = Object.freeze({
1252
- address: address5,
1253
- async signAndSendTransactions(transactions) {
1254
- const signatures = [];
1255
- for (const transaction of transactions) {
1256
- const signatureString = await sendTransaction2(
1257
- transaction,
1258
- commitment ? { commitment } : void 0
1259
- );
1260
- const bytes = base58Encoder.encode(signatureString);
1261
- signatures.push(signatureBytes(bytes));
1262
- }
1263
- return signatures;
1264
- }
1265
- });
1266
- return {
1267
- mode: "send",
1268
- signer: sendingSigner
1269
- };
1270
- }
1271
- throw new Error("Wallet session does not support signing or sending transactions.");
1272
- }
1273
- __name(createWalletTransactionSigner, "createWalletTransactionSigner");
1274
- function resolveSignerMode(signer) {
1275
- if (isTransactionPartialSigner(signer)) {
1276
- return "partial";
1277
- }
1278
- if (isTransactionSendingSigner(signer)) {
1279
- return "send";
1280
- }
1281
- return "partial";
1282
- }
1283
- __name(resolveSignerMode, "resolveSignerMode");
1284
-
1285
- // src/features/sol.ts
1286
- function ensureAddress(value) {
1287
- return typeof value === "string" ? address(value) : value;
1288
- }
1289
- __name(ensureAddress, "ensureAddress");
1290
- async function resolveLifetime(runtime, commitment, fallback) {
1291
- if (fallback) {
1292
- return fallback;
1293
- }
1294
- const { value } = await runtime.rpc.getLatestBlockhash({ commitment }).send();
1295
- return value;
1296
- }
1297
- __name(resolveLifetime, "resolveLifetime");
1298
- function resolveSigner(authority, commitment) {
1299
- if (isWalletSession(authority)) {
1300
- const { signer, mode } = createWalletTransactionSigner(authority, { commitment });
1301
- return { mode, signer };
1302
- }
1303
- return { mode: resolveSignerMode(authority), signer: authority };
1304
- }
1305
- __name(resolveSigner, "resolveSigner");
1306
- function toLamportAmount(input) {
1307
- return lamportsMath.fromLamports(input);
1308
- }
1309
- __name(toLamportAmount, "toLamportAmount");
1310
- function createSolTransferHelper(runtime) {
1311
- async function prepareTransfer(config) {
1312
- const commitment = config.commitment;
1313
- const lifetime = await resolveLifetime(runtime, commitment, config.lifetime);
1314
- const { signer, mode } = resolveSigner(config.authority, commitment);
1315
- const destination = ensureAddress(config.destination);
1316
- const amount = toLamportAmount(config.amount);
1317
- const message = pipe(
1318
- createTransactionMessage({ version: config.transactionVersion ?? 0 }),
1319
- (m) => setTransactionMessageFeePayer(signer.address, m),
1320
- (m) => setTransactionMessageLifetimeUsingBlockhash(lifetime, m),
1321
- (m) => appendTransactionMessageInstruction(
1322
- getTransferSolInstruction({ amount, destination, source: signer }),
1323
- m
1324
- )
1325
- );
1326
- return {
1327
- commitment,
1328
- lifetime,
1329
- message,
1330
- mode,
1331
- signer,
1332
- plan: singleTransactionPlan(message)
1333
- };
1334
- }
1335
- __name(prepareTransfer, "prepareTransfer");
1336
- async function sendPreparedTransfer(prepared, options = {}) {
1337
- if (prepared.mode === "send" && isTransactionSendingSigner(prepared.signer)) {
1338
- const signatureBytes2 = await signAndSendTransactionMessageWithSigners(prepared.message, {
1339
- abortSignal: options.abortSignal,
1340
- minContextSlot: options.minContextSlot
1341
- });
1342
- const base58Decoder2 = getBase58Decoder();
1343
- return signature(base58Decoder2.decode(signatureBytes2));
1344
- }
1345
- const commitment = options.commitment ?? prepared.commitment;
1346
- const maxRetries = options.maxRetries === void 0 ? void 0 : typeof options.maxRetries === "bigint" ? options.maxRetries : BigInt(options.maxRetries);
1347
- let latestSignature = null;
1348
- const executor = createTransactionPlanExecutor({
1349
- async executeTransactionMessage(message, config = {}) {
1350
- const signed = await signTransactionMessageWithSigners(message, {
1351
- abortSignal: config.abortSignal ?? options.abortSignal,
1352
- minContextSlot: options.minContextSlot
1353
- });
1354
- const wire = getBase64EncodedWireTransaction(signed);
1355
- const response = await runtime.rpc.sendTransaction(wire, {
1356
- encoding: "base64",
1357
- maxRetries,
1358
- preflightCommitment: commitment,
1359
- skipPreflight: options.skipPreflight
1360
- }).send({ abortSignal: config.abortSignal ?? options.abortSignal });
1361
- latestSignature = signature(response);
1362
- return { transaction: signed };
1363
- }
1364
- });
1365
- await executor(prepared.plan ?? singleTransactionPlan(prepared.message), { abortSignal: options.abortSignal });
1366
- if (!latestSignature) {
1367
- throw new Error("Failed to resolve transaction signature.");
1368
- }
1369
- return latestSignature;
1370
- }
1371
- __name(sendPreparedTransfer, "sendPreparedTransfer");
1372
- async function sendTransfer(config, options) {
1373
- const prepared = await prepareTransfer(config);
1374
- return await sendPreparedTransfer(prepared, options);
1375
- }
1376
- __name(sendTransfer, "sendTransfer");
1377
- return {
1378
- prepareTransfer,
1379
- sendPreparedTransfer,
1380
- sendTransfer
1381
- };
1382
- }
1383
- __name(createSolTransferHelper, "createSolTransferHelper");
1384
- function ensureAddress2(value, fallback) {
1385
- if (value) {
1386
- return typeof value === "string" ? address(value) : value;
1387
- }
1388
- if (!fallback) {
1389
- throw new Error("An address value was expected but not provided.");
1390
- }
1391
- return fallback;
1392
- }
1393
- __name(ensureAddress2, "ensureAddress");
1394
- async function resolveLifetime2(runtime, commitment, fallback) {
1395
- if (fallback) {
1396
- return fallback;
1397
- }
1398
- const { value } = await runtime.rpc.getLatestBlockhash({ commitment }).send();
1399
- return value;
1400
- }
1401
- __name(resolveLifetime2, "resolveLifetime");
1402
- function resolveSigner2(authority, commitment) {
1403
- if (isWalletSession(authority)) {
1404
- const { signer, mode } = createWalletTransactionSigner(authority, { commitment });
1405
- return { mode, signer };
1406
- }
1407
- return { mode: resolveSignerMode(authority), signer: authority };
1408
- }
1409
- __name(resolveSigner2, "resolveSigner");
1410
- function createSplTokenHelper(runtime, config) {
1411
- const mintAddress = ensureAddress2(config.mint);
1412
- const tokenProgram = ensureAddress2(config.tokenProgram, address(TOKEN_PROGRAM_ADDRESS));
1413
- let cachedDecimals = config.decimals;
1414
- let cachedMath;
1415
- async function resolveDecimals(commitment) {
1416
- if (cachedDecimals !== void 0) {
1417
- return cachedDecimals;
1418
- }
1419
- const account = await fetchMint(runtime.rpc, mintAddress, { commitment });
1420
- cachedDecimals = account.data.decimals;
1421
- return cachedDecimals;
1422
- }
1423
- __name(resolveDecimals, "resolveDecimals");
1424
- async function getTokenMath(commitment) {
1425
- if (cachedMath) {
1426
- return cachedMath;
1427
- }
1428
- const decimals = await resolveDecimals(commitment);
1429
- cachedMath = createTokenAmount(decimals);
1430
- return cachedMath;
1431
- }
1432
- __name(getTokenMath, "getTokenMath");
1433
- async function deriveAssociatedTokenAddress(owner) {
1434
- const [ata] = await findAssociatedTokenPda({
1435
- mint: mintAddress,
1436
- owner: ensureAddress2(owner),
1437
- tokenProgram
1438
- });
1439
- return ata;
1440
- }
1441
- __name(deriveAssociatedTokenAddress, "deriveAssociatedTokenAddress");
1442
- async function fetchBalance2(owner, commitment) {
1443
- const ataAddress = await deriveAssociatedTokenAddress(owner);
1444
- const decimals = await resolveDecimals(commitment);
1445
- try {
1446
- const { value } = await runtime.rpc.getTokenAccountBalance(ataAddress, { commitment }).send();
1447
- const math = await getTokenMath(commitment);
1448
- const amount = math.fromBaseUnits(value.amount, "balance");
1449
- const uiAmount = value.uiAmountString ?? value.amount;
1450
- return {
1451
- amount,
1452
- ataAddress,
1453
- decimals,
1454
- exists: true,
1455
- uiAmount
1456
- };
1457
- } catch {
1458
- return {
1459
- amount: 0n,
1460
- ataAddress,
1461
- decimals,
1462
- exists: false,
1463
- uiAmount: "0"
1464
- };
1465
- }
1466
- }
1467
- __name(fetchBalance2, "fetchBalance");
1468
- async function prepareTransfer(config2) {
1469
- const commitment = config2.commitment;
1470
- const lifetime = await resolveLifetime2(runtime, commitment, config2.lifetime);
1471
- const { signer, mode } = resolveSigner2(config2.authority, commitment);
1472
- const sourceOwner = ensureAddress2(config2.sourceOwner, signer.address);
1473
- const destinationOwner = ensureAddress2(config2.destinationOwner);
1474
- const sourceAta = ensureAddress2(config2.sourceToken, await deriveAssociatedTokenAddress(sourceOwner));
1475
- const destinationAta = ensureAddress2(
1476
- config2.destinationToken,
1477
- await deriveAssociatedTokenAddress(destinationOwner)
1478
- );
1479
- const math = await getTokenMath(commitment);
1480
- const decimals = await resolveDecimals(commitment);
1481
- const amount = config2.amountInBaseUnits ? math.fromBaseUnits(config2.amount, "amount") : math.fromDecimal(config2.amount, { label: "amount" });
1482
- const instructionList = [];
1483
- if (config2.ensureDestinationAta ?? true) {
1484
- const { value } = await runtime.rpc.getAccountInfo(destinationAta, {
1485
- commitment,
1486
- dataSlice: { length: 0, offset: 0 },
1487
- encoding: "base64"
1488
- }).send();
1489
- if (!value) {
1490
- instructionList.push(
1491
- getCreateAssociatedTokenInstruction({
1492
- ata: destinationAta,
1493
- mint: mintAddress,
1494
- owner: destinationOwner,
1495
- payer: signer,
1496
- tokenProgram
1497
- })
1498
- );
1499
- }
1500
- }
1501
- instructionList.push(
1502
- getTransferCheckedInstruction({
1503
- amount,
1504
- authority: signer,
1505
- decimals,
1506
- destination: destinationAta,
1507
- mint: mintAddress,
1508
- source: sourceAta
1509
- })
1510
- );
1511
- let message = pipe(
1512
- createTransactionMessage({ version: config2.transactionVersion ?? 0 }),
1513
- (m) => setTransactionMessageFeePayer(signer.address, m),
1514
- (m) => setTransactionMessageLifetimeUsingBlockhash(lifetime, m)
1515
- );
1516
- for (const instruction of instructionList) {
1517
- message = appendTransactionMessageInstruction(instruction, message);
1518
- }
1519
- return {
1520
- amount,
1521
- commitment,
1522
- decimals,
1523
- destinationAta,
1524
- lifetime,
1525
- message,
1526
- mode,
1527
- signer,
1528
- sourceAta,
1529
- plan: singleTransactionPlan(message)
1530
- };
1531
- }
1532
- __name(prepareTransfer, "prepareTransfer");
1533
- async function sendPreparedTransfer(prepared, options = {}) {
1534
- if (prepared.mode === "send" && isTransactionSendingSigner(prepared.signer)) {
1535
- const signatureBytes2 = await signAndSendTransactionMessageWithSigners(prepared.message, {
1536
- abortSignal: options.abortSignal,
1537
- minContextSlot: options.minContextSlot
1538
- });
1539
- const base58Decoder2 = getBase58Decoder();
1540
- return signature(base58Decoder2.decode(signatureBytes2));
1541
- }
1542
- const commitment = options.commitment ?? prepared.commitment;
1543
- const maxRetries = options.maxRetries === void 0 ? void 0 : typeof options.maxRetries === "bigint" ? options.maxRetries : BigInt(options.maxRetries);
1544
- let latestSignature = null;
1545
- const executor = createTransactionPlanExecutor({
1546
- async executeTransactionMessage(message, config2 = {}) {
1547
- const signed = await signTransactionMessageWithSigners(message, {
1548
- abortSignal: config2.abortSignal ?? options.abortSignal,
1549
- minContextSlot: options.minContextSlot
1550
- });
1551
- const wire = getBase64EncodedWireTransaction(signed);
1552
- const response = await runtime.rpc.sendTransaction(wire, {
1553
- encoding: "base64",
1554
- maxRetries,
1555
- preflightCommitment: commitment,
1556
- skipPreflight: options.skipPreflight
1557
- }).send({ abortSignal: config2.abortSignal ?? options.abortSignal });
1558
- latestSignature = signature(response);
1559
- return { transaction: signed };
1560
- }
1561
- });
1562
- await executor(prepared.plan ?? singleTransactionPlan(prepared.message), { abortSignal: options.abortSignal });
1563
- if (!latestSignature) {
1564
- throw new Error("Failed to resolve transaction signature.");
1565
- }
1566
- return latestSignature;
1567
- }
1568
- __name(sendPreparedTransfer, "sendPreparedTransfer");
1569
- async function sendTransfer(config2, options) {
1570
- const prepared = await prepareTransfer(config2);
1571
- try {
1572
- return await sendPreparedTransfer(prepared, options);
1573
- } catch (error) {
1574
- if (isSolanaError(error, SOLANA_ERROR__TRANSACTION_ERROR__ALREADY_PROCESSED)) {
1575
- const retriedPrepared = await prepareTransfer({ ...config2, lifetime: void 0 });
1576
- return await sendPreparedTransfer(retriedPrepared, options);
1577
- }
1578
- throw error;
1579
- }
1580
- }
1581
- __name(sendTransfer, "sendTransfer");
1582
- return {
1583
- deriveAssociatedTokenAddress,
1584
- fetchBalance: fetchBalance2,
1585
- prepareTransfer,
1586
- sendPreparedTransfer,
1587
- sendTransfer
1588
- };
1589
- }
1590
- __name(createSplTokenHelper, "createSplTokenHelper");
1591
- var STAKE_PROGRAM_ID = "Stake11111111111111111111111111111111111111";
1592
- var SYSVAR_CLOCK = "SysvarC1ock11111111111111111111111111111111";
1593
- var SYSVAR_STAKE_HISTORY = "SysvarStakeHistory1111111111111111111111111";
1594
- var UNUSED_STAKE_CONFIG_ACC = "StakeConfig11111111111111111111111111111111";
1595
- var STAKE_STATE_LEN = 200;
1596
- function ensureAddress3(value) {
1597
- return typeof value === "string" ? address(value) : value;
1598
- }
1599
- __name(ensureAddress3, "ensureAddress");
1600
- async function resolveLifetime3(runtime, commitment, fallback) {
1601
- if (fallback) {
1602
- return fallback;
1603
- }
1604
- const { value } = await runtime.rpc.getLatestBlockhash({ commitment }).send();
1605
- return value;
1606
- }
1607
- __name(resolveLifetime3, "resolveLifetime");
1608
- function resolveSigner3(authority, commitment) {
1609
- if (isWalletSession(authority)) {
1610
- const { signer, mode } = createWalletTransactionSigner(authority, { commitment });
1611
- return { mode, signer };
1612
- }
1613
- return { mode: resolveSignerMode(authority), signer: authority };
1614
- }
1615
- __name(resolveSigner3, "resolveSigner");
1616
- function toLamportAmount2(input) {
1617
- return lamportsMath.fromLamports(input);
1618
- }
1619
- __name(toLamportAmount2, "toLamportAmount");
1620
- function createStakeHelper(runtime) {
1621
- async function prepareStake(config) {
1622
- const commitment = config.commitment;
1623
- const lifetime = await resolveLifetime3(runtime, commitment, config.lifetime);
1624
- const { signer, mode } = resolveSigner3(config.authority, commitment);
1625
- const validatorAddress = ensureAddress3(config.validatorId);
1626
- const amount = toLamportAmount2(config.amount);
1627
- const rentExempt = await runtime.rpc.getMinimumBalanceForRentExemption(BigInt(STAKE_STATE_LEN)).send();
1628
- const totalLamports = rentExempt + amount;
1629
- const stakeAccount = await generateKeyPairSigner();
1630
- const createIx = getCreateAccountInstruction({
1631
- payer: signer,
1632
- newAccount: stakeAccount,
1633
- lamports: totalLamports,
1634
- space: BigInt(STAKE_STATE_LEN),
1635
- programAddress: STAKE_PROGRAM_ID
1636
- });
1637
- const initializeIx = getInitializeInstruction({
1638
- stake: stakeAccount.address,
1639
- arg0: {
1640
- staker: signer.address,
1641
- withdrawer: signer.address
1642
- },
1643
- arg1: {
1644
- unixTimestamp: 0n,
1645
- epoch: 0n,
1646
- custodian: signer.address
1647
- }
1648
- });
1649
- const delegateIx = getDelegateStakeInstruction({
1650
- stake: stakeAccount.address,
1651
- vote: validatorAddress,
1652
- stakeHistory: SYSVAR_STAKE_HISTORY,
1653
- unused: UNUSED_STAKE_CONFIG_ACC,
1654
- stakeAuthority: signer
1655
- });
1656
- const message = pipe(
1657
- createTransactionMessage({ version: config.transactionVersion ?? 0 }),
1658
- (m) => setTransactionMessageFeePayer(signer.address, m),
1659
- (m) => setTransactionMessageLifetimeUsingBlockhash(lifetime, m),
1660
- (m) => appendTransactionMessageInstructions([createIx, initializeIx, delegateIx], m)
1661
- );
1662
- return {
1663
- commitment,
1664
- lifetime,
1665
- message,
1666
- mode,
1667
- signer,
1668
- stakeAccount,
1669
- plan: singleTransactionPlan(message)
1670
- };
1671
- }
1672
- __name(prepareStake, "prepareStake");
1673
- async function sendPreparedStake(prepared, options = {}) {
1674
- if (prepared.mode === "send" && isTransactionSendingSigner(prepared.signer)) {
1675
- const signatureBytes2 = await signAndSendTransactionMessageWithSigners(prepared.message, {
1676
- abortSignal: options.abortSignal,
1677
- minContextSlot: options.minContextSlot
1678
- });
1679
- const base58Decoder2 = getBase58Decoder();
1680
- return signature(base58Decoder2.decode(signatureBytes2));
1681
- }
1682
- const commitment = options.commitment ?? prepared.commitment;
1683
- const maxRetries = options.maxRetries === void 0 ? void 0 : typeof options.maxRetries === "bigint" ? options.maxRetries : BigInt(options.maxRetries);
1684
- let latestSignature = null;
1685
- const executor = createTransactionPlanExecutor({
1686
- async executeTransactionMessage(message, config = {}) {
1687
- const signed = await signTransactionMessageWithSigners(message, {
1688
- abortSignal: config.abortSignal ?? options.abortSignal,
1689
- minContextSlot: options.minContextSlot
1690
- });
1691
- const wire = getBase64EncodedWireTransaction(signed);
1692
- const response = await runtime.rpc.sendTransaction(wire, {
1693
- encoding: "base64",
1694
- maxRetries,
1695
- preflightCommitment: commitment,
1696
- skipPreflight: options.skipPreflight
1697
- }).send({ abortSignal: config.abortSignal ?? options.abortSignal });
1698
- latestSignature = signature(response);
1699
- return { transaction: signed };
1700
- }
1701
- });
1702
- await executor(prepared.plan ?? singleTransactionPlan(prepared.message), { abortSignal: options.abortSignal });
1703
- if (!latestSignature) {
1704
- throw new Error("Failed to resolve transaction signature.");
1705
- }
1706
- return latestSignature;
1707
- }
1708
- __name(sendPreparedStake, "sendPreparedStake");
1709
- async function sendStake(config, options) {
1710
- const prepared = await prepareStake(config);
1711
- return await sendPreparedStake(prepared, options);
1712
- }
1713
- __name(sendStake, "sendStake");
1714
- async function prepareUnstake(config) {
1715
- const commitment = config.commitment;
1716
- const lifetime = await resolveLifetime3(runtime, commitment, config.lifetime);
1717
- const { signer, mode } = resolveSigner3(config.authority, commitment);
1718
- const stakeAccountAddress = ensureAddress3(config.stakeAccount);
1719
- const deactivateIx = getDeactivateInstruction({
1720
- stake: stakeAccountAddress,
1721
- clockSysvar: SYSVAR_CLOCK,
1722
- stakeAuthority: signer
1723
- });
1724
- const message = pipe(
1725
- createTransactionMessage({ version: config.transactionVersion ?? 0 }),
1726
- (m) => setTransactionMessageFeePayer(signer.address, m),
1727
- (m) => setTransactionMessageLifetimeUsingBlockhash(lifetime, m),
1728
- (m) => appendTransactionMessageInstructions([deactivateIx], m)
1729
- );
1730
- return {
1731
- commitment,
1732
- lifetime,
1733
- message,
1734
- mode,
1735
- signer,
1736
- plan: singleTransactionPlan(message)
1737
- };
1738
- }
1739
- __name(prepareUnstake, "prepareUnstake");
1740
- async function sendPreparedUnstake(prepared, options = {}) {
1741
- if (prepared.mode === "send" && isTransactionSendingSigner(prepared.signer)) {
1742
- const signatureBytes2 = await signAndSendTransactionMessageWithSigners(prepared.message, {
1743
- abortSignal: options.abortSignal,
1744
- minContextSlot: options.minContextSlot
1745
- });
1746
- const base58Decoder2 = getBase58Decoder();
1747
- return signature(base58Decoder2.decode(signatureBytes2));
1748
- }
1749
- const commitment = options.commitment ?? prepared.commitment;
1750
- const maxRetries = options.maxRetries === void 0 ? void 0 : typeof options.maxRetries === "bigint" ? options.maxRetries : BigInt(options.maxRetries);
1751
- let latestSignature = null;
1752
- const executor = createTransactionPlanExecutor({
1753
- async executeTransactionMessage(message, config = {}) {
1754
- const signed = await signTransactionMessageWithSigners(message, {
1755
- abortSignal: config.abortSignal ?? options.abortSignal,
1756
- minContextSlot: options.minContextSlot
1757
- });
1758
- const wire = getBase64EncodedWireTransaction(signed);
1759
- const response = await runtime.rpc.sendTransaction(wire, {
1760
- encoding: "base64",
1761
- maxRetries,
1762
- preflightCommitment: commitment,
1763
- skipPreflight: options.skipPreflight
1764
- }).send({ abortSignal: config.abortSignal ?? options.abortSignal });
1765
- latestSignature = signature(response);
1766
- return { transaction: signed };
1767
- }
1768
- });
1769
- await executor(prepared.plan);
1770
- if (!latestSignature) {
1771
- throw new Error("Failed to resolve transaction signature.");
1772
- }
1773
- return latestSignature;
1774
- }
1775
- __name(sendPreparedUnstake, "sendPreparedUnstake");
1776
- async function sendUnstake(config, options) {
1777
- const prepared = await prepareUnstake(config);
1778
- return await sendPreparedUnstake(prepared, options);
1779
- }
1780
- __name(sendUnstake, "sendUnstake");
1781
- async function prepareWithdraw(config) {
1782
- const commitment = config.commitment;
1783
- const lifetime = await resolveLifetime3(runtime, commitment, config.lifetime);
1784
- const { signer, mode } = resolveSigner3(config.authority, commitment);
1785
- const stakeAccountAddress = ensureAddress3(config.stakeAccount);
1786
- const destinationAddress = ensureAddress3(config.destination);
1787
- const amount = toLamportAmount2(config.amount);
1788
- const withdrawIx = getWithdrawInstruction({
1789
- stake: stakeAccountAddress,
1790
- recipient: destinationAddress,
1791
- clockSysvar: SYSVAR_CLOCK,
1792
- stakeHistory: SYSVAR_STAKE_HISTORY,
1793
- withdrawAuthority: signer,
1794
- args: amount
1795
- });
1796
- const message = pipe(
1797
- createTransactionMessage({ version: config.transactionVersion ?? 0 }),
1798
- (m) => setTransactionMessageFeePayer(signer.address, m),
1799
- (m) => setTransactionMessageLifetimeUsingBlockhash(lifetime, m),
1800
- (m) => appendTransactionMessageInstructions([withdrawIx], m)
1801
- );
1802
- return {
1803
- commitment,
1804
- lifetime,
1805
- message,
1806
- mode,
1807
- signer,
1808
- plan: singleTransactionPlan(message)
1809
- };
1810
- }
1811
- __name(prepareWithdraw, "prepareWithdraw");
1812
- async function sendPreparedWithdraw(prepared, options = {}) {
1813
- if (prepared.mode === "send" && isTransactionSendingSigner(prepared.signer)) {
1814
- const signatureBytes2 = await signAndSendTransactionMessageWithSigners(prepared.message, {
1815
- abortSignal: options.abortSignal,
1816
- minContextSlot: options.minContextSlot
1817
- });
1818
- const base58Decoder2 = getBase58Decoder();
1819
- return signature(base58Decoder2.decode(signatureBytes2));
1820
- }
1821
- const commitment = options.commitment ?? prepared.commitment;
1822
- const maxRetries = options.maxRetries === void 0 ? void 0 : typeof options.maxRetries === "bigint" ? options.maxRetries : BigInt(options.maxRetries);
1823
- let latestSignature = null;
1824
- const executor = createTransactionPlanExecutor({
1825
- async executeTransactionMessage(message, config = {}) {
1826
- const signed = await signTransactionMessageWithSigners(message, {
1827
- abortSignal: config.abortSignal ?? options.abortSignal,
1828
- minContextSlot: options.minContextSlot
1829
- });
1830
- const wire = getBase64EncodedWireTransaction(signed);
1831
- const response = await runtime.rpc.sendTransaction(wire, {
1832
- encoding: "base64",
1833
- maxRetries,
1834
- preflightCommitment: commitment,
1835
- skipPreflight: options.skipPreflight
1836
- }).send({ abortSignal: config.abortSignal ?? options.abortSignal });
1837
- latestSignature = signature(response);
1838
- return { transaction: signed };
1839
- }
1840
- });
1841
- await executor(prepared.plan);
1842
- if (!latestSignature) {
1843
- throw new Error("Failed to resolve transaction signature.");
1844
- }
1845
- return latestSignature;
1846
- }
1847
- __name(sendPreparedWithdraw, "sendPreparedWithdraw");
1848
- async function sendWithdraw(config, options) {
1849
- const prepared = await prepareWithdraw(config);
1850
- return await sendPreparedWithdraw(prepared, options);
1851
- }
1852
- __name(sendWithdraw, "sendWithdraw");
1853
- async function getStakeAccounts(wallet, validatorId) {
1854
- const walletAddress = typeof wallet === "string" ? wallet : String(wallet);
1855
- const accounts = await runtime.rpc.getProgramAccounts(STAKE_PROGRAM_ID, {
1856
- encoding: "jsonParsed",
1857
- filters: [
1858
- {
1859
- memcmp: {
1860
- offset: 44n,
1861
- bytes: walletAddress,
1862
- encoding: "base58"
1863
- }
1864
- }
1865
- ]
1866
- }).send();
1867
- if (!validatorId) {
1868
- return accounts;
1869
- }
1870
- const validatorIdStr = typeof validatorId === "string" ? validatorId : String(validatorId);
1871
- return accounts.filter((acc) => {
1872
- const data = acc.account?.data;
1873
- if (data && "parsed" in data) {
1874
- const info = data.parsed?.info;
1875
- return info?.stake?.delegation?.voter === validatorIdStr;
1876
- }
1877
- return false;
1878
- });
1879
- }
1880
- __name(getStakeAccounts, "getStakeAccounts");
1881
- return {
1882
- getStakeAccounts,
1883
- prepareStake,
1884
- prepareUnstake,
1885
- prepareWithdraw,
1886
- sendPreparedStake,
1887
- sendPreparedUnstake,
1888
- sendPreparedWithdraw,
1889
- sendStake,
1890
- sendUnstake,
1891
- sendWithdraw
1892
- };
1893
- }
1894
- __name(createStakeHelper, "createStakeHelper");
1895
- function transactionToBase64(tx) {
1896
- if ("messageBytes" in tx) {
1897
- return getBase64EncodedWireTransaction(tx);
1898
- }
1899
- return getBase64EncodedWireTransaction(compileTransaction(tx));
1900
- }
1901
- __name(transactionToBase64, "transactionToBase64");
1902
- async function transactionToBase64WithSigners(tx) {
1903
- if ("messageBytes" in tx) {
1904
- return transactionToBase64(tx);
1905
- }
1906
- const signed = await partiallySignTransactionMessageWithSigners(tx);
1907
- return transactionToBase64(signed);
1908
- }
1909
- __name(transactionToBase64WithSigners, "transactionToBase64WithSigners");
1910
-
1911
- // src/transactions/prepareTransaction.ts
1912
- var DEFAULT_COMPUTE_UNIT_LIMIT_MULTIPLIER = 1.1;
1913
- var DEFAULT_COMPUTE_UNIT_LIMIT = 2e5;
1914
- var MAX_COMPUTE_UNIT_LIMIT = 14e5;
1915
- function isComputeUnitLimitInstruction(instruction) {
1916
- return instruction.programAddress === COMPUTE_BUDGET_PROGRAM_ADDRESS && instruction.data?.[0] === 2;
1917
- }
1918
- __name(isComputeUnitLimitInstruction, "isComputeUnitLimitInstruction");
1919
- function didExceedComputeBudget(error) {
1920
- let current = error;
1921
- while (isSolanaError(current)) {
1922
- if (isSolanaError(current, SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED)) {
1923
- return true;
1924
- }
1925
- current = current.cause;
1926
- }
1927
- return false;
1928
- }
1929
- __name(didExceedComputeBudget, "didExceedComputeBudget");
1930
- async function estimateComputeUnits(rpc, transaction) {
1931
- let target = transaction;
1932
- const hasLifetime = transaction.lifetimeConstraint !== void 0;
1933
- if (!hasLifetime) {
1934
- const latest = await rpc.getLatestBlockhash().send();
1935
- target = setTransactionMessageLifetimeUsingBlockhash(
1936
- latest.value,
1937
- transaction
1938
- );
1939
- }
1940
- const base64Transaction = transactionToBase64(target);
1941
- try {
1942
- const { value } = await rpc.simulateTransaction(base64Transaction, {
1943
- encoding: "base64",
1944
- replaceRecentBlockhash: false,
1945
- sigVerify: false
1946
- }).send();
1947
- return Number(value.unitsConsumed ?? 0) || 0;
1948
- } catch (error) {
1949
- if (didExceedComputeBudget(error)) {
1950
- return MAX_COMPUTE_UNIT_LIMIT;
1951
- }
1952
- throw error;
1953
- }
1954
- }
1955
- __name(estimateComputeUnits, "estimateComputeUnits");
1956
- async function prepareTransaction(config) {
1957
- const multiplier = config.computeUnitLimitMultiplier ?? DEFAULT_COMPUTE_UNIT_LIMIT_MULTIPLIER;
1958
- const shouldResetBlockhash = config.blockhashReset !== false;
1959
- const shouldResetComputeUnits = config.computeUnitLimitReset ?? false;
1960
- let transaction = config.transaction;
1961
- const computeLimitIndex = transaction.instructions.findIndex(isComputeUnitLimitInstruction);
1962
- if (computeLimitIndex === -1 || shouldResetComputeUnits) {
1963
- const unitsFromSimulation = await estimateComputeUnits(config.rpc, transaction);
1964
- const estimatedUnits = unitsFromSimulation ? Math.ceil(unitsFromSimulation * multiplier) : DEFAULT_COMPUTE_UNIT_LIMIT;
1965
- const units = Math.min(
1966
- MAX_COMPUTE_UNIT_LIMIT,
1967
- Math.max(DEFAULT_COMPUTE_UNIT_LIMIT, Math.max(1, estimatedUnits))
1968
- );
1969
- const instruction = getSetComputeUnitLimitInstruction({ units });
1970
- if (computeLimitIndex === -1) {
1971
- transaction = appendTransactionMessageInstruction(instruction, transaction);
1972
- } else {
1973
- const nextInstructions = [...transaction.instructions];
1974
- nextInstructions.splice(computeLimitIndex, 1, instruction);
1975
- transaction = Object.freeze({
1976
- ...transaction,
1977
- instructions: Object.freeze(nextInstructions)
1978
- });
1979
- }
1980
- }
1981
- let transactionHasLifetime = transaction.lifetimeConstraint !== void 0;
1982
- if (shouldResetBlockhash || !transactionHasLifetime) {
1983
- const latest = await config.rpc.getLatestBlockhash().send();
1984
- if (!transactionHasLifetime) {
1985
- transaction = setTransactionMessageLifetimeUsingBlockhash(latest.value, transaction);
1986
- } else if (shouldResetBlockhash) {
1987
- transaction = Object.freeze({
1988
- ...transaction,
1989
- lifetimeConstraint: latest.value
1990
- });
1991
- }
1992
- transactionHasLifetime = true;
1993
- }
1994
- if (config.logRequest) {
1995
- config.logRequest({ base64WireTransaction: transactionToBase64(transaction) });
1996
- }
1997
- return transaction;
1998
- }
1999
- __name(prepareTransaction, "prepareTransaction");
2000
-
2001
- // src/features/transactions.ts
2002
- function toAddress(value) {
2003
- return typeof value === "string" ? address(value) : value;
2004
- }
2005
- __name(toAddress, "toAddress");
2006
- function hasSetComputeUnitLimitInstruction(instructions) {
2007
- return instructions.some(
2008
- (instruction) => isInstructionForProgram(instruction, COMPUTE_BUDGET_PROGRAM_ADDRESS) && isInstructionWithData(instruction) && instruction.data[0] === ComputeBudgetInstruction.SetComputeUnitLimit
2009
- );
2010
- }
2011
- __name(hasSetComputeUnitLimitInstruction, "hasSetComputeUnitLimitInstruction");
2012
- function hasSetComputeUnitPriceInstruction(instructions) {
2013
- return instructions.some(
2014
- (instruction) => isInstructionForProgram(instruction, COMPUTE_BUDGET_PROGRAM_ADDRESS) && isInstructionWithData(instruction) && instruction.data[0] === ComputeBudgetInstruction.SetComputeUnitPrice
2015
- );
2016
- }
2017
- __name(hasSetComputeUnitPriceInstruction, "hasSetComputeUnitPriceInstruction");
2018
- function instructionUsesAddressLookup(instruction) {
2019
- if ("addressTableLookup" in instruction && instruction.addressTableLookup != null) {
2020
- return true;
2021
- }
2022
- if ("addressTableLookups" in instruction && Array.isArray(instruction.addressTableLookups) && instruction.addressTableLookups.length > 0) {
2023
- return true;
2024
- }
2025
- return false;
2026
- }
2027
- __name(instructionUsesAddressLookup, "instructionUsesAddressLookup");
2028
- function resolveVersion(requested, instructions) {
2029
- if (requested && requested !== "auto") {
2030
- return requested;
2031
- }
2032
- return instructions.some(instructionUsesAddressLookup) ? 0 : "legacy";
2033
- }
2034
- __name(resolveVersion, "resolveVersion");
2035
- function normaliseCommitment(request, getFallbackCommitment) {
2036
- return request.commitment ?? getFallbackCommitment();
2037
- }
2038
- __name(normaliseCommitment, "normaliseCommitment");
2039
- function resolveFeePayerAddress(feePayer, authoritySigner) {
2040
- if (!feePayer && !authoritySigner) {
2041
- throw new Error("A fee payer must be provided via `feePayer` or `authority`.");
2042
- }
2043
- if (feePayer && typeof feePayer === "object" && "address" in feePayer) {
2044
- return { address: feePayer.address, signer: feePayer };
2045
- }
2046
- if (feePayer) {
2047
- const address5 = toAddress(feePayer);
2048
- if (authoritySigner && authoritySigner.address === address5) {
2049
- return { address: address5, signer: authoritySigner };
2050
- }
2051
- return { address: address5 };
2052
- }
2053
- if (!authoritySigner) {
2054
- throw new Error("Unable to resolve authority signer for the fee payer.");
2055
- }
2056
- const authorityAddress = authoritySigner.address;
2057
- return { address: authorityAddress, signer: authoritySigner };
2058
- }
2059
- __name(resolveFeePayerAddress, "resolveFeePayerAddress");
2060
- function resolveComputeUnitLimit(request, instructions) {
2061
- const value = request.computeUnitLimit;
2062
- if (value === void 0 || hasSetComputeUnitLimitInstruction(instructions)) {
2063
- return void 0;
2064
- }
2065
- return typeof value === "bigint" ? value : BigInt(Math.floor(value));
2066
- }
2067
- __name(resolveComputeUnitLimit, "resolveComputeUnitLimit");
2068
- function resolveComputeUnitPrice(request, instructions) {
2069
- if (request.computeUnitPrice === void 0 || hasSetComputeUnitPriceInstruction(instructions)) {
2070
- return void 0;
2071
- }
2072
- if (typeof request.computeUnitPrice === "bigint") {
2073
- return request.computeUnitPrice;
2074
- }
2075
- return BigInt(Math.floor(request.computeUnitPrice));
2076
- }
2077
- __name(resolveComputeUnitPrice, "resolveComputeUnitPrice");
2078
- async function createTransactionRecipe(request, context) {
2079
- if (!request.instructions.length) {
2080
- throw new Error("Add at least one instruction before preparing a transaction.");
2081
- }
2082
- const { getFallbackCommitment, runtime } = context;
2083
- request.abortSignal?.throwIfAborted();
2084
- const commitment = normaliseCommitment(request, getFallbackCommitment);
2085
- let authoritySigner;
2086
- let mode = "partial";
2087
- if (request.authority) {
2088
- if (isWalletSession(request.authority)) {
2089
- const { signer, mode: walletMode } = createWalletTransactionSigner(request.authority, { commitment });
2090
- authoritySigner = signer;
2091
- mode = walletMode;
2092
- } else {
2093
- authoritySigner = request.authority;
2094
- mode = resolveSignerMode(authoritySigner);
2095
- }
2096
- }
2097
- const { address: feePayer, signer: feePayerSigner } = resolveFeePayerAddress(request.feePayer, authoritySigner);
2098
- if (mode === "send") {
2099
- if (!feePayerSigner || !isTransactionSendingSigner(feePayerSigner)) {
2100
- mode = "partial";
2101
- }
2102
- }
2103
- const baseInstructions = [...request.instructions];
2104
- const version = resolveVersion(request.version, baseInstructions);
2105
- const lifetime = request.lifetime ?? (await runtime.rpc.getLatestBlockhash({ commitment }).send({ abortSignal: request.abortSignal })).value;
2106
- request.abortSignal?.throwIfAborted();
2107
- const resolvedComputeUnitLimit = resolveComputeUnitLimit(request, baseInstructions);
2108
- const computeUnitPrice = resolveComputeUnitPrice(request, baseInstructions);
2109
- const prefixInstructions = [];
2110
- if (resolvedComputeUnitLimit !== void 0) {
2111
- prefixInstructions.push(getSetComputeUnitLimitInstruction({ units: Number(resolvedComputeUnitLimit) }));
2112
- }
2113
- if (computeUnitPrice !== void 0) {
2114
- prefixInstructions.push(getSetComputeUnitPriceInstruction({ microLamports: Number(computeUnitPrice) }));
2115
- }
2116
- const instructionSequence = [...prefixInstructions, ...baseInstructions];
2117
- const createMessage = /* @__PURE__ */ __name(async () => pipe(
2118
- createTransactionMessage({ version }),
2119
- (message) => feePayerSigner ? setTransactionMessageFeePayerSigner(feePayerSigner, message) : setTransactionMessageFeePayer(feePayer, message),
2120
- (message) => setTransactionMessageLifetimeUsingBlockhash(lifetime, message)
2121
- ), "createMessage");
2122
- return Object.freeze({
2123
- commitment,
2124
- computeUnitLimit: resolvedComputeUnitLimit,
2125
- computeUnitPrice,
2126
- createTransactionMessage: createMessage,
2127
- feePayer,
2128
- instructionPlan: getMessagePackerInstructionPlanFromInstructions(instructionSequence),
2129
- instructions: Object.freeze(baseInstructions),
2130
- lifetime,
2131
- mode,
2132
- version
2133
- });
2134
- }
2135
- __name(createTransactionRecipe, "createTransactionRecipe");
2136
- function assertSingleTransactionPlan(plan) {
2137
- if (plan.kind !== "single") {
2138
- throw new Error("Transaction recipe produced a multi-transaction plan which is not supported.");
2139
- }
2140
- return plan;
2141
- }
2142
- __name(assertSingleTransactionPlan, "assertSingleTransactionPlan");
2143
- function createTransactionHelper(runtime, getFallbackCommitment) {
2144
- async function prepare(request) {
2145
- const recipe = await createTransactionRecipe(request, { getFallbackCommitment, runtime });
2146
- const planner = createTransactionPlanner({
2147
- createTransactionMessage: recipe.createTransactionMessage
2148
- });
2149
- const plan = await planner(recipe.instructionPlan, { abortSignal: request.abortSignal });
2150
- const singlePlan = assertSingleTransactionPlan(plan);
2151
- const prepared = Object.freeze({
2152
- commitment: recipe.commitment,
2153
- computeUnitLimit: recipe.computeUnitLimit,
2154
- computeUnitPrice: recipe.computeUnitPrice,
2155
- feePayer: recipe.feePayer,
2156
- instructions: recipe.instructions,
2157
- lifetime: recipe.lifetime,
2158
- message: singlePlan.message,
2159
- mode: recipe.mode,
2160
- plan,
2161
- version: recipe.version
2162
- });
2163
- return prepared;
2164
- }
2165
- __name(prepare, "prepare");
2166
- async function sign(prepared, options = {}) {
2167
- return await signTransactionMessageWithSigners(prepared.message, {
2168
- abortSignal: options.abortSignal,
2169
- minContextSlot: options.minContextSlot
2170
- });
2171
- }
2172
- __name(sign, "sign");
2173
- async function toWire(prepared, options = {}) {
2174
- const signed = await sign(prepared, options);
2175
- return getBase64EncodedWireTransaction(signed);
2176
- }
2177
- __name(toWire, "toWire");
2178
- async function send(prepared, options = {}) {
2179
- if (!prepared.plan || prepared.mode === "send") {
2180
- return sendDirect(prepared, options);
2181
- }
2182
- return sendWithExecutor(prepared, options);
2183
- }
2184
- __name(send, "send");
2185
- async function sendDirect(prepared, options) {
2186
- const commitment = options.commitment ?? prepared.commitment;
2187
- if (prepared.mode === "send") {
2188
- const signatureBytes2 = await signAndSendTransactionMessageWithSigners(prepared.message, {
2189
- abortSignal: options.abortSignal,
2190
- minContextSlot: options.minContextSlot
2191
- });
2192
- const base58Decoder2 = getBase58Decoder();
2193
- return signature(base58Decoder2.decode(signatureBytes2));
2194
- }
2195
- const signed = await sign(prepared, {
2196
- abortSignal: options.abortSignal,
2197
- minContextSlot: options.minContextSlot
2198
- });
2199
- const wire = getBase64EncodedWireTransaction(signed);
2200
- const maxRetries = options.maxRetries === void 0 ? void 0 : typeof options.maxRetries === "bigint" ? options.maxRetries : BigInt(options.maxRetries);
2201
- const response = await runtime.rpc.sendTransaction(wire, {
2202
- encoding: "base64",
2203
- maxRetries,
2204
- preflightCommitment: commitment,
2205
- skipPreflight: options.skipPreflight
2206
- }).send({ abortSignal: options.abortSignal });
2207
- return signature(response);
2208
- }
2209
- __name(sendDirect, "sendDirect");
2210
- async function sendWithExecutor(prepared, options) {
2211
- if (!prepared.plan) {
2212
- return sendDirect(prepared, options);
2213
- }
2214
- const commitment = options.commitment ?? prepared.commitment;
2215
- const maxRetries = options.maxRetries === void 0 ? void 0 : typeof options.maxRetries === "bigint" ? options.maxRetries : BigInt(options.maxRetries);
2216
- let latestSignature = null;
2217
- const executor = createTransactionPlanExecutor({
2218
- async executeTransactionMessage(message, config = {}) {
2219
- const signed = await signTransactionMessageWithSigners(message, {
2220
- abortSignal: config.abortSignal ?? options.abortSignal,
2221
- minContextSlot: options.minContextSlot
2222
- });
2223
- const wire = getBase64EncodedWireTransaction(signed);
2224
- const response = await runtime.rpc.sendTransaction(wire, {
2225
- encoding: "base64",
2226
- maxRetries,
2227
- preflightCommitment: commitment,
2228
- skipPreflight: options.skipPreflight
2229
- }).send({ abortSignal: config.abortSignal ?? options.abortSignal });
2230
- latestSignature = signature(response);
2231
- return { transaction: signed };
2232
- }
2233
- });
2234
- await executor(prepared.plan, { abortSignal: options.abortSignal });
2235
- if (!latestSignature) {
2236
- throw new Error("Failed to resolve transaction signature.");
2237
- }
2238
- return latestSignature;
2239
- }
2240
- __name(sendWithExecutor, "sendWithExecutor");
2241
- async function prepareAndSend(request, options = {}) {
2242
- const { prepareTransaction: overrides, ...rest } = request;
2243
- const prepared = await prepare(rest);
2244
- if (overrides === false) {
2245
- return send(prepared, options);
2246
- }
2247
- const prepareConfig = overrides ?? {};
2248
- const tunedMessage = await prepareTransaction({
2249
- blockhashReset: prepareConfig.blockhashReset ?? false,
2250
- ...prepareConfig,
2251
- rpc: runtime.rpc,
2252
- transaction: prepared.message
2253
- });
2254
- const tunedPrepared = Object.freeze({
2255
- ...prepared,
2256
- message: tunedMessage,
2257
- plan: singleTransactionPlan(tunedMessage)
2258
- });
2259
- return send(tunedPrepared, options);
2260
- }
2261
- __name(prepareAndSend, "prepareAndSend");
2262
- return Object.freeze({
2263
- prepare,
2264
- sign,
2265
- toWire,
2266
- send,
2267
- prepareAndSend
2268
- });
2269
- }
2270
- __name(createTransactionHelper, "createTransactionHelper");
2271
-
2272
- // src/client/createClientHelpers.ts
2273
- function withDefaultCommitment(config, getFallback, baseCommitment) {
2274
- if (config.commitment !== void 0) {
2275
- return config;
2276
- }
2277
- const commitment = baseCommitment ?? getFallback();
2278
- return {
2279
- ...config,
2280
- commitment
2281
- };
2282
- }
2283
- __name(withDefaultCommitment, "withDefaultCommitment");
2284
- function wrapSolTransferHelper(helper, getFallback) {
2285
- return {
2286
- prepareTransfer: /* @__PURE__ */ __name((config) => helper.prepareTransfer(withDefaultCommitment(config, getFallback)), "prepareTransfer"),
2287
- sendPreparedTransfer: helper.sendPreparedTransfer,
2288
- sendTransfer: /* @__PURE__ */ __name((config, options) => helper.sendTransfer(withDefaultCommitment(config, getFallback), options), "sendTransfer")
2289
- };
2290
- }
2291
- __name(wrapSolTransferHelper, "wrapSolTransferHelper");
2292
- function wrapSplTokenHelper(helper, getFallback, baseCommitment) {
2293
- const resolveCommitment = /* @__PURE__ */ __name((commitment) => commitment ?? baseCommitment ?? getFallback(), "resolveCommitment");
2294
- return {
2295
- deriveAssociatedTokenAddress: helper.deriveAssociatedTokenAddress,
2296
- fetchBalance: /* @__PURE__ */ __name((owner, commitment) => helper.fetchBalance(owner, resolveCommitment(commitment)), "fetchBalance"),
2297
- prepareTransfer: /* @__PURE__ */ __name((config) => helper.prepareTransfer(withDefaultCommitment(config, getFallback, baseCommitment)), "prepareTransfer"),
2298
- sendPreparedTransfer: helper.sendPreparedTransfer,
2299
- sendTransfer: /* @__PURE__ */ __name((config, options) => helper.sendTransfer(withDefaultCommitment(config, getFallback, baseCommitment), options), "sendTransfer")
2300
- };
2301
- }
2302
- __name(wrapSplTokenHelper, "wrapSplTokenHelper");
2303
- function wrapStakeHelper(helper, getFallback) {
2304
- return {
2305
- getStakeAccounts: helper.getStakeAccounts,
2306
- prepareStake: /* @__PURE__ */ __name((config) => helper.prepareStake(withDefaultCommitment(config, getFallback)), "prepareStake"),
2307
- prepareUnstake: /* @__PURE__ */ __name((config) => helper.prepareUnstake(withDefaultCommitment(config, getFallback)), "prepareUnstake"),
2308
- prepareWithdraw: /* @__PURE__ */ __name((config) => helper.prepareWithdraw(withDefaultCommitment(config, getFallback)), "prepareWithdraw"),
2309
- sendPreparedStake: helper.sendPreparedStake,
2310
- sendPreparedUnstake: helper.sendPreparedUnstake,
2311
- sendPreparedWithdraw: helper.sendPreparedWithdraw,
2312
- sendStake: /* @__PURE__ */ __name((config, options) => helper.sendStake(withDefaultCommitment(config, getFallback), options), "sendStake"),
2313
- sendUnstake: /* @__PURE__ */ __name((config, options) => helper.sendUnstake(withDefaultCommitment(config, getFallback), options), "sendUnstake"),
2314
- sendWithdraw: /* @__PURE__ */ __name((config, options) => helper.sendWithdraw(withDefaultCommitment(config, getFallback), options), "sendWithdraw")
2315
- };
2316
- }
2317
- __name(wrapStakeHelper, "wrapStakeHelper");
2318
- function normaliseConfigValue(value) {
2319
- if (value === null || value === void 0) {
2320
- return void 0;
2321
- }
2322
- if (typeof value === "string") {
2323
- return value;
2324
- }
2325
- if (typeof value === "object" && "toString" in value) {
2326
- return String(value.toString());
2327
- }
2328
- return JSON.stringify(value);
2329
- }
2330
- __name(normaliseConfigValue, "normaliseConfigValue");
2331
- function serialiseSplConfig(config) {
2332
- return JSON.stringify({
2333
- associatedTokenProgram: normaliseConfigValue(config.associatedTokenProgram),
2334
- commitment: normaliseConfigValue(config.commitment),
2335
- decimals: config.decimals,
2336
- mint: normaliseConfigValue(config.mint),
2337
- tokenProgram: normaliseConfigValue(config.tokenProgram)
2338
- });
2339
- }
2340
- __name(serialiseSplConfig, "serialiseSplConfig");
2341
- function createClientHelpers(runtime, store) {
2342
- const getFallbackCommitment = /* @__PURE__ */ __name(() => store.getState().cluster.commitment, "getFallbackCommitment");
2343
- const splTokenCache = /* @__PURE__ */ new Map();
2344
- let solTransfer;
2345
- let stake;
2346
- let transaction;
2347
- const getSolTransfer = /* @__PURE__ */ __name(() => {
2348
- if (!solTransfer) {
2349
- solTransfer = wrapSolTransferHelper(createSolTransferHelper(runtime), getFallbackCommitment);
2350
- }
2351
- return solTransfer;
2352
- }, "getSolTransfer");
2353
- const getStake = /* @__PURE__ */ __name(() => {
2354
- if (!stake) {
2355
- stake = wrapStakeHelper(createStakeHelper(runtime), getFallbackCommitment);
2356
- }
2357
- return stake;
2358
- }, "getStake");
2359
- const getTransaction = /* @__PURE__ */ __name(() => {
2360
- if (!transaction) {
2361
- transaction = createTransactionHelper(runtime, getFallbackCommitment);
2362
- }
2363
- return transaction;
2364
- }, "getTransaction");
2365
- function getSplTokenHelper(config) {
2366
- const cacheKey = serialiseSplConfig(config);
2367
- const cached = splTokenCache.get(cacheKey);
2368
- if (cached) {
2369
- return cached.scoped;
2370
- }
2371
- const helper = createSplTokenHelper(runtime, config);
2372
- const scoped = wrapSplTokenHelper(helper, getFallbackCommitment, config.commitment);
2373
- splTokenCache.set(cacheKey, {
2374
- baseCommitment: config.commitment,
2375
- scoped
2376
- });
2377
- return scoped;
2378
- }
2379
- __name(getSplTokenHelper, "getSplTokenHelper");
2380
- const prepareTransactionWithRuntime = /* @__PURE__ */ __name((options) => prepareTransaction({
2381
- ...options,
2382
- rpc: runtime.rpc
2383
- }), "prepareTransactionWithRuntime");
2384
- return Object.freeze({
2385
- get solTransfer() {
2386
- return getSolTransfer();
2387
- },
2388
- splToken: getSplTokenHelper,
2389
- get stake() {
2390
- return getStake();
2391
- },
2392
- get transaction() {
2393
- return getTransaction();
2394
- },
2395
- prepareTransaction: prepareTransactionWithRuntime
2396
- });
2397
- }
2398
- __name(createClientHelpers, "createClientHelpers");
2399
- function createClusterStatus() {
2400
- return { status: "idle" };
2401
- }
2402
- __name(createClusterStatus, "createClusterStatus");
2403
- function createInitialClientState(config) {
2404
- const { commitment, endpoint, websocketEndpoint } = config;
2405
- const timestamp = Date.now();
2406
- return deepFreeze({
2407
- accounts: {},
2408
- cluster: {
2409
- commitment,
2410
- endpoint,
2411
- status: createClusterStatus(),
2412
- websocketEndpoint
2413
- },
2414
- lastUpdatedAt: timestamp,
2415
- subscriptions: {
2416
- account: {},
2417
- signature: {}
2418
- },
2419
- transactions: {},
2420
- wallet: { status: "disconnected" }
2421
- });
2422
- }
2423
- __name(createInitialClientState, "createInitialClientState");
2424
- function createClientStore(initialState) {
2425
- return createStore(() => initialState);
2426
- }
2427
- __name(createClientStore, "createClientStore");
2428
- function createDefaultClientStore(config) {
2429
- return createClientStore(createInitialClientState(config));
2430
- }
2431
- __name(createDefaultClientStore, "createDefaultClientStore");
2432
-
2433
- // src/client/watchers.ts
2434
- function createWatchers({ logger: inputLogger, runtime, store }) {
2435
- const logger = inputLogger ?? createLogger();
2436
- function setSubscriptionStatus(kind, id, status) {
2437
- store.setState((state) => ({
2438
- ...state,
2439
- lastUpdatedAt: now(),
2440
- subscriptions: {
2441
- ...state.subscriptions,
2442
- [kind]: {
2443
- ...state.subscriptions[kind],
2444
- [id]: status
2445
- }
2446
- }
2447
- }));
2448
- }
2449
- __name(setSubscriptionStatus, "setSubscriptionStatus");
2450
- function onAbort(kind, id) {
2451
- setSubscriptionStatus(kind, id, { status: "inactive" });
2452
- }
2453
- __name(onAbort, "onAbort");
2454
- function createSubscriptionHandle(kind, id, abortController) {
2455
- function abort() {
2456
- abortController.abort();
2457
- onAbort(kind, id);
2458
- }
2459
- __name(abort, "abort");
2460
- return { abort };
2461
- }
2462
- __name(createSubscriptionHandle, "createSubscriptionHandle");
2463
- async function handleAccountNotifications(config, listener, abortController) {
2464
- const commitment = config.commitment ?? store.getState().cluster.commitment;
2465
- const plan = runtime.rpcSubscriptions.accountNotifications(config.address, { commitment });
2466
- const key = config.address.toString();
2467
- setSubscriptionStatus("account", key, { status: "activating" });
2468
- abortController.signal.addEventListener("abort", () => onAbort("account", key));
2469
- try {
2470
- const iterator = await plan.subscribe({ abortSignal: abortController.signal });
2471
- setSubscriptionStatus("account", key, { status: "active" });
2472
- for await (const notification of iterator) {
2473
- const lamports2 = notification.value?.lamports ?? null;
2474
- const slot = notification.context?.slot ?? null;
2475
- const entry = {
2476
- address: config.address,
2477
- data: notification.value?.data,
2478
- error: void 0,
2479
- fetching: false,
2480
- lamports: lamports2,
2481
- lastFetchedAt: now(),
2482
- slot
2483
- };
2484
- listener(entry);
2485
- store.setState((state) => ({
2486
- ...state,
2487
- accounts: {
2488
- ...state.accounts,
2489
- [key]: entry
2490
- },
2491
- lastUpdatedAt: now()
2492
- }));
2493
- }
2494
- } catch (error) {
2495
- if (!abortController.signal.aborted) {
2496
- logger({
2497
- data: { address: key, ...formatError(error) },
2498
- level: "error",
2499
- message: "account subscription failed"
2500
- });
2501
- setSubscriptionStatus("account", key, { error, status: "error" });
2502
- }
2503
- }
2504
- }
2505
- __name(handleAccountNotifications, "handleAccountNotifications");
2506
- function watchAccount(config, listener) {
2507
- const abortController = new AbortController();
2508
- handleAccountNotifications(config, listener, abortController).catch((error) => {
2509
- if (!abortController.signal.aborted) {
2510
- logger({
2511
- data: { address: config.address.toString(), ...formatError(error) },
2512
- level: "error",
2513
- message: "account watcher error"
2514
- });
2515
- }
2516
- });
2517
- return createSubscriptionHandle("account", config.address.toString(), abortController);
2518
- }
2519
- __name(watchAccount, "watchAccount");
2520
- function watchBalance(config, listener) {
2521
- return watchAccount(config, (account) => {
2522
- if (account.lamports !== null) {
2523
- listener(account.lamports);
2524
- }
2525
- });
2526
- }
2527
- __name(watchBalance, "watchBalance");
2528
- async function handleSignatureNotifications(config, listener, abortController) {
2529
- const commitment = config.commitment ?? store.getState().cluster.commitment;
2530
- const plan = runtime.rpcSubscriptions.signatureNotifications(config.signature, {
2531
- commitment,
2532
- enableReceivedNotification: config.enableReceivedNotification
2533
- });
2534
- const key = config.signature.toString();
2535
- setSubscriptionStatus("signature", key, { status: "activating" });
2536
- abortController.signal.addEventListener("abort", () => onAbort("signature", key));
2537
- try {
2538
- const iterator = await plan.subscribe({ abortSignal: abortController.signal });
2539
- setSubscriptionStatus("signature", key, { status: "active" });
2540
- for await (const notification of iterator) {
2541
- listener(notification);
2542
- store.setState((state) => ({
2543
- ...state,
2544
- lastUpdatedAt: now(),
2545
- transactions: {
2546
- ...state.transactions,
2547
- [key]: {
2548
- lastUpdatedAt: now(),
2549
- signature: config.signature,
2550
- status: "waiting"
2551
- }
2552
- }
2553
- }));
2554
- }
2555
- } catch (error) {
2556
- if (!abortController.signal.aborted) {
2557
- logger({
2558
- data: { signature: key, ...formatError(error) },
2559
- level: "error",
2560
- message: "signature subscription failed"
2561
- });
2562
- setSubscriptionStatus("signature", key, { error, status: "error" });
2563
- }
2564
- }
2565
- }
2566
- __name(handleSignatureNotifications, "handleSignatureNotifications");
2567
- function watchSignature(config, listener) {
2568
- const abortController = new AbortController();
2569
- handleSignatureNotifications(config, listener, abortController).catch((error) => {
2570
- if (!abortController.signal.aborted) {
2571
- logger({
2572
- data: { signature: config.signature.toString(), ...formatError(error) },
2573
- level: "error",
2574
- message: "signature watcher error"
2575
- });
2576
- }
2577
- });
2578
- return createSubscriptionHandle("signature", config.signature.toString(), abortController);
2579
- }
2580
- __name(watchSignature, "watchSignature");
2581
- return {
2582
- watchAccount,
2583
- watchBalance,
2584
- watchSignature
2585
- };
2586
- }
2587
- __name(createWatchers, "createWatchers");
2588
-
2589
- // src/client/createClient.ts
2590
- function createClient(config) {
2591
- const hydratedConfig = config.initialState ? applySerializableState(config, config.initialState) : config;
2592
- const resolvedCluster = resolveCluster({
2593
- endpoint: hydratedConfig.rpc ?? hydratedConfig.endpoint,
2594
- moniker: hydratedConfig.cluster,
2595
- websocketEndpoint: hydratedConfig.websocket ?? hydratedConfig.websocketEndpoint
2596
- });
2597
- const commitment = hydratedConfig.commitment ?? "confirmed";
2598
- const initialState = createInitialClientState({
2599
- commitment,
2600
- endpoint: resolvedCluster.endpoint,
2601
- websocketEndpoint: resolvedCluster.websocketEndpoint
2602
- });
2603
- const store = config.createStore ? config.createStore(initialState) : createClientStore(initialState);
2604
- const rpcClient = hydratedConfig.rpcClient ?? createSolanaRpcClient({
2605
- commitment,
2606
- endpoint: resolvedCluster.endpoint,
2607
- websocketEndpoint: resolvedCluster.websocketEndpoint
2608
- });
2609
- const runtime = {
2610
- rpc: rpcClient.rpc,
2611
- rpcSubscriptions: rpcClient.rpcSubscriptions
2612
- };
2613
- const connectors = createWalletRegistry(hydratedConfig.walletConnectors ?? []);
2614
- const logger = createLogger(hydratedConfig.logger);
2615
- const actions = createActions({ connectors, logger, runtime, store });
2616
- const watchers = createWatchers({ logger, runtime, store });
2617
- const helpers = createClientHelpers(runtime, store);
2618
- store.setState((state) => ({
2619
- ...state,
2620
- cluster: {
2621
- ...state.cluster,
2622
- status: { status: "connecting" }
2623
- },
2624
- lastUpdatedAt: now()
2625
- }));
2626
- actions.setCluster(resolvedCluster.endpoint, {
2627
- commitment,
2628
- websocketEndpoint: resolvedCluster.websocketEndpoint
2629
- }).catch(
2630
- (error) => logger({
2631
- data: formatError(error),
2632
- level: "error",
2633
- message: "initial cluster setup failed"
2634
- })
2635
- );
2636
- function destroy() {
2637
- store.setState(() => initialState);
2638
- }
2639
- __name(destroy, "destroy");
2640
- return {
2641
- actions,
2642
- config,
2643
- connectors,
2644
- destroy,
2645
- get helpers() {
2646
- return helpers;
2647
- },
2648
- runtime,
2649
- store,
2650
- get solTransfer() {
2651
- return helpers.solTransfer;
2652
- },
2653
- get SolTransfer() {
2654
- return helpers.solTransfer;
2655
- },
2656
- splToken: helpers.splToken,
2657
- SplToken: helpers.splToken,
2658
- SplHelper: helpers.splToken,
2659
- get stake() {
2660
- return helpers.stake;
2661
- },
2662
- get transaction() {
2663
- return helpers.transaction;
2664
- },
2665
- prepareTransaction: helpers.prepareTransaction,
2666
- watchers
2667
- };
2668
- }
2669
- __name(createClient, "createClient");
2670
- var base58Decoder = getBase58Decoder();
2671
- var transactionDecoder = getTransactionDecoder();
2672
- var transactionEncoder = getTransactionEncoder();
2673
- function deriveConnectorId(wallet) {
2674
- const kebab = wallet.name.toLowerCase().replace(/[^a-z0-9]+/g, "-");
2675
- return `wallet-standard:${kebab}`;
2676
- }
2677
- __name(deriveConnectorId, "deriveConnectorId");
2678
- function getPrimaryAccount(accounts) {
2679
- const primary = accounts[0];
2680
- if (!primary) {
2681
- throw new Error("Wallet returned no accounts.");
2682
- }
2683
- return primary;
2684
- }
2685
- __name(getPrimaryAccount, "getPrimaryAccount");
2686
- function mapCommitment(commitment) {
2687
- if (commitment === "processed" || commitment === "confirmed" || commitment === "finalized") {
2688
- return commitment;
2689
- }
2690
- return void 0;
2691
- }
2692
- __name(mapCommitment, "mapCommitment");
2693
- function toSessionAccount(walletAccount) {
2694
- return {
2695
- address: address(walletAccount.address),
2696
- label: walletAccount.label,
2697
- publicKey: new Uint8Array(walletAccount.publicKey)
2698
- };
2699
- }
2700
- __name(toSessionAccount, "toSessionAccount");
2701
- function getChain(account) {
2702
- const [preferred] = account.chains ?? [];
2703
- return preferred;
2704
- }
2705
- __name(getChain, "getChain");
2706
- async function disconnectWallet2(wallet) {
2707
- const disconnectFeature = wallet.features[StandardDisconnect];
2708
- if (disconnectFeature) {
2709
- await disconnectFeature.disconnect();
2710
- }
2711
- }
2712
- __name(disconnectWallet2, "disconnectWallet");
2713
- function createWalletStandardConnector(wallet, options = {}) {
2714
- const metadata = {
2715
- canAutoConnect: options.canAutoConnect ?? Boolean(wallet.features[StandardConnect]),
2716
- icon: options.icon ?? wallet.icon,
2717
- id: options.id ?? deriveConnectorId(wallet),
2718
- kind: options.kind ?? "wallet-standard",
2719
- name: options.name ?? wallet.name,
2720
- ready: typeof window !== "undefined"
2721
- };
2722
- async function connect(connectionOptions = {}) {
2723
- const connectFeature = wallet.features[StandardConnect];
2724
- const eventsFeature = wallet.features[StandardEvents];
2725
- const shouldConnectSilently = Boolean(connectionOptions.autoConnect);
2726
- const allowInteractiveFallback = connectionOptions.allowInteractiveFallback ?? true;
2727
- let walletAccounts = wallet.accounts;
2728
- if (connectFeature) {
2729
- const connectWithMode = /* @__PURE__ */ __name(async (silent) => connectFeature.connect({
2730
- silent
2731
- }), "connectWithMode");
2732
- try {
2733
- const { accounts } = await connectWithMode(shouldConnectSilently);
2734
- if (accounts.length) {
2735
- walletAccounts = accounts;
2736
- }
2737
- } catch (error) {
2738
- if (!shouldConnectSilently || !allowInteractiveFallback) {
2739
- throw error;
2740
- }
2741
- const { accounts } = await connectWithMode(false);
2742
- if (accounts.length) {
2743
- walletAccounts = accounts;
2744
- }
2745
- }
2746
- }
2747
- let currentAccount = getPrimaryAccount(walletAccounts);
2748
- let sessionAccount = toSessionAccount(currentAccount);
2749
- const signMessageFeature = wallet.features[SolanaSignMessage];
2750
- const signTransactionFeature = wallet.features[SolanaSignTransaction];
2751
- const signAndSendFeature = wallet.features[SolanaSignAndSendTransaction];
2752
- const resolvedChain = options.defaultChain ?? getChain(currentAccount);
2753
- const signMessage = signMessageFeature ? async (message) => {
2754
- const [output] = await signMessageFeature.signMessage({
2755
- account: currentAccount,
2756
- message
2757
- });
2758
- return output.signature;
2759
- } : void 0;
2760
- const signTransaction = signTransactionFeature ? async (transaction) => {
2761
- const wireBytes = new Uint8Array(transactionEncoder.encode(transaction));
2762
- const request = resolvedChain ? {
2763
- account: currentAccount,
2764
- chain: resolvedChain,
2765
- transaction: wireBytes
2766
- } : {
2767
- account: currentAccount,
2768
- transaction: wireBytes
2769
- };
2770
- const [output] = await signTransactionFeature.signTransaction(request);
2771
- return transactionDecoder.decode(output.signedTransaction);
2772
- } : void 0;
2773
- const sendTransaction2 = signAndSendFeature ? async (transaction, config) => {
2774
- const wireBytes = new Uint8Array(transactionEncoder.encode(transaction));
2775
- const chain = options.defaultChain ?? getChain(currentAccount) ?? "solana:mainnet-beta";
2776
- const [output] = await signAndSendFeature.signAndSendTransaction({
2777
- account: currentAccount,
2778
- chain,
2779
- options: {
2780
- commitment: mapCommitment(config?.commitment)
2781
- },
2782
- transaction: wireBytes
2783
- });
2784
- return base58Decoder.decode(output.signature);
2785
- } : void 0;
2786
- async function disconnectSession() {
2787
- changeUnsubscribe?.();
2788
- await disconnectWallet2(wallet);
2789
- }
2790
- __name(disconnectSession, "disconnectSession");
2791
- let changeUnsubscribe;
2792
- const onAccountsChanged = eventsFeature ? (listener) => {
2793
- const off = eventsFeature.on("change", ({ accounts }) => {
2794
- if (!accounts) return;
2795
- if (!accounts.length) {
2796
- listener([]);
2797
- return;
2798
- }
2799
- currentAccount = accounts[0];
2800
- sessionAccount = toSessionAccount(currentAccount);
2801
- listener(accounts.map(toSessionAccount));
2802
- });
2803
- return off;
2804
- } : void 0;
2805
- return {
2806
- account: sessionAccount,
2807
- connector: metadata,
2808
- disconnect: disconnectSession,
2809
- onAccountsChanged: onAccountsChanged ? (listener) => {
2810
- changeUnsubscribe = onAccountsChanged(listener);
2811
- return () => {
2812
- changeUnsubscribe?.();
2813
- changeUnsubscribe = void 0;
2814
- };
2815
- } : void 0,
2816
- sendTransaction: sendTransaction2,
2817
- signMessage,
2818
- signTransaction
2819
- };
2820
- }
2821
- __name(connect, "connect");
2822
- async function disconnect() {
2823
- await disconnectWallet2(wallet);
2824
- }
2825
- __name(disconnect, "disconnect");
2826
- function isSupported() {
2827
- return typeof window !== "undefined";
2828
- }
2829
- __name(isSupported, "isSupported");
2830
- return {
2831
- ...metadata,
2832
- connect,
2833
- disconnect,
2834
- isSupported
2835
- };
2836
- }
2837
- __name(createWalletStandardConnector, "createWalletStandardConnector");
2838
- function mapWalletToConnector(wallet, overrides) {
2839
- return createWalletStandardConnector(wallet, overrides?.(wallet));
2840
- }
2841
- __name(mapWalletToConnector, "mapWalletToConnector");
2842
- function getWalletStandardConnectors(options = {}) {
2843
- const { get } = getWallets();
2844
- const connectors = get().map((wallet) => mapWalletToConnector(wallet, options.overrides));
2845
- const seen = /* @__PURE__ */ new Set();
2846
- return connectors.filter((connector) => {
2847
- if (seen.has(connector.id)) {
2848
- return false;
2849
- }
2850
- seen.add(connector.id);
2851
- return true;
2852
- });
2853
- }
2854
- __name(getWalletStandardConnectors, "getWalletStandardConnectors");
2855
- function watchWalletStandardConnectors(onChange, options = {}) {
2856
- const { get, on } = getWallets();
2857
- const emit = /* @__PURE__ */ __name(() => {
2858
- const connectors = get().map((wallet) => mapWalletToConnector(wallet, options.overrides));
2859
- const seen = /* @__PURE__ */ new Set();
2860
- const deduplicated = connectors.filter((connector) => {
2861
- if (seen.has(connector.id)) {
2862
- return false;
2863
- }
2864
- seen.add(connector.id);
2865
- return true;
2866
- });
2867
- onChange(deduplicated);
2868
- }, "emit");
2869
- emit();
2870
- const offRegister = on("register", emit);
2871
- const offUnregister = on("unregister", emit);
2872
- return () => {
2873
- offRegister();
2874
- offUnregister();
2875
- };
2876
- }
2877
- __name(watchWalletStandardConnectors, "watchWalletStandardConnectors");
2878
-
2879
- // src/wallet/connectors.ts
2880
- function autoDiscover(options = {}) {
2881
- const { get } = getWallets();
2882
- const wallets = get().filter((wallet) => options.filter ? options.filter(wallet) : true);
2883
- const connectors = wallets.map((wallet) => createWalletStandardConnector(wallet, options.overrides?.(wallet)));
2884
- const seen = /* @__PURE__ */ new Set();
2885
- return connectors.filter((connector) => {
2886
- if (seen.has(connector.id)) return false;
2887
- seen.add(connector.id);
2888
- return true;
2889
- });
2890
- }
2891
- __name(autoDiscover, "autoDiscover");
2892
- function injected(options) {
2893
- const connector = {
2894
- canAutoConnect: true,
2895
- id: "wallet-standard:injected",
2896
- kind: "wallet-standard",
2897
- name: "Injected Wallet",
2898
- ready: typeof window !== "undefined",
2899
- async connect() {
2900
- const wallets = getWallets().get();
2901
- const first = wallets.find((wallet) => StandardConnect in wallet.features);
2902
- if (!first) {
2903
- throw new Error("No Wallet Standard wallets available.");
2904
- }
2905
- return createWalletStandardConnector(first, options).connect();
2906
- },
2907
- async disconnect() {
2908
- },
2909
- isSupported() {
2910
- return typeof window !== "undefined";
2911
- }
2912
- };
2913
- return connector;
2914
- }
2915
- __name(injected, "injected");
2916
- function filterByName(name) {
2917
- const lower = name.toLowerCase();
2918
- return (wallet) => wallet.name.toLowerCase().includes(lower);
2919
- }
2920
- __name(filterByName, "filterByName");
2921
- function phantom(options) {
2922
- return autoDiscover({
2923
- filter: filterByName("phantom"),
2924
- overrides: /* @__PURE__ */ __name(() => ({ ...options, id: "wallet-standard:phantom" }), "overrides")
2925
- });
2926
- }
2927
- __name(phantom, "phantom");
2928
- function solflare(options) {
2929
- return autoDiscover({
2930
- filter: filterByName("solflare"),
2931
- overrides: /* @__PURE__ */ __name(() => ({ ...options, id: "wallet-standard:solflare" }), "overrides")
2932
- });
2933
- }
2934
- __name(solflare, "solflare");
2935
- function backpack(options) {
2936
- return autoDiscover({
2937
- filter: filterByName("backpack"),
2938
- overrides: /* @__PURE__ */ __name(() => ({ ...options, id: "wallet-standard:backpack" }), "overrides")
2939
- });
2940
- }
2941
- __name(backpack, "backpack");
2942
-
2943
- // src/client/defaultClient.ts
2944
- function defaultWalletConnectors() {
2945
- return [...phantom(), ...solflare(), ...backpack(), ...autoDiscover()];
2946
- }
2947
- __name(defaultWalletConnectors, "defaultWalletConnectors");
2948
- function normalizeUrl(value) {
2949
- if (!value) return void 0;
2950
- const trimmed = value.trim();
2951
- return trimmed.length ? trimmed : void 0;
2952
- }
2953
- __name(normalizeUrl, "normalizeUrl");
2954
- function resolveClientConfig(config = {}) {
2955
- const {
2956
- cluster,
2957
- endpoint: endpointOverride,
2958
- rpc,
2959
- websocket,
2960
- websocketEndpoint,
2961
- walletConnectors,
2962
- ...passthrough
2963
- } = config;
2964
- const resolvedEndpoint = normalizeUrl(rpc) ?? normalizeUrl(endpointOverride) ?? normalizeUrl(config.endpoint);
2965
- const resolvedCluster = resolveCluster({
2966
- endpoint: resolvedEndpoint,
2967
- moniker: cluster ?? void 0,
2968
- websocketEndpoint: normalizeUrl(websocket ?? websocketEndpoint)
2969
- });
2970
- const resolvedConnectors = walletConnectors === void 0 || walletConnectors === "default" ? defaultWalletConnectors() : walletConnectors;
2971
- return {
2972
- ...passthrough,
2973
- endpoint: resolvedCluster.endpoint,
2974
- websocketEndpoint: resolvedCluster.websocketEndpoint,
2975
- walletConnectors: resolvedConnectors
2976
- };
2977
- }
2978
- __name(resolveClientConfig, "resolveClientConfig");
2979
- function createDefaultClient(config = {}) {
2980
- return createClient(resolveClientConfig(config));
2981
- }
2982
- __name(createDefaultClient, "createDefaultClient");
2983
-
2984
- // src/state/asyncState.ts
2985
- function createInitialAsyncState() {
2986
- return { status: "idle" };
2987
- }
2988
- __name(createInitialAsyncState, "createInitialAsyncState");
2989
- function createAsyncState(status, payload = {}) {
2990
- return {
2991
- data: payload.data,
2992
- error: payload.error,
2993
- status
2994
- };
2995
- }
2996
- __name(createAsyncState, "createAsyncState");
2997
-
2998
- // src/controllers/solTransferController.ts
2999
- function ensureAuthority(input, resolveDefault) {
3000
- const authority = input.authority ?? resolveDefault?.();
3001
- if (!authority) {
3002
- throw new Error("Connect a wallet or supply an `authority` before sending SOL transfers.");
3003
- }
3004
- return {
3005
- ...input,
3006
- authority
3007
- };
3008
- }
3009
- __name(ensureAuthority, "ensureAuthority");
3010
- function createSolTransferController(config) {
3011
- const listeners = /* @__PURE__ */ new Set();
3012
- const helper = config.helper;
3013
- const authorityProvider = config.authorityProvider;
3014
- let state = createInitialAsyncState();
3015
- function notify() {
3016
- for (const listener of listeners) {
3017
- listener();
3018
- }
3019
- }
3020
- __name(notify, "notify");
3021
- function setState(next) {
3022
- state = next;
3023
- notify();
3024
- }
3025
- __name(setState, "setState");
3026
- async function send(config2, options) {
3027
- const request = ensureAuthority(config2, authorityProvider);
3028
- setState(createAsyncState("loading"));
3029
- try {
3030
- const signature5 = await helper.sendTransfer(request, options);
3031
- setState(createAsyncState("success", { data: signature5 }));
3032
- return signature5;
3033
- } catch (error) {
3034
- setState(createAsyncState("error", { error }));
3035
- throw error;
3036
- }
3037
- }
3038
- __name(send, "send");
3039
- function subscribe(listener) {
3040
- listeners.add(listener);
3041
- return () => {
3042
- listeners.delete(listener);
3043
- };
3044
- }
3045
- __name(subscribe, "subscribe");
3046
- function reset() {
3047
- setState(createInitialAsyncState());
3048
- }
3049
- __name(reset, "reset");
3050
- return {
3051
- getHelper: /* @__PURE__ */ __name(() => helper, "getHelper"),
3052
- getState: /* @__PURE__ */ __name(() => state, "getState"),
3053
- reset,
3054
- send,
3055
- subscribe
3056
- };
3057
- }
3058
- __name(createSolTransferController, "createSolTransferController");
3059
-
3060
- // src/controllers/splTransferController.ts
3061
- function ensureTransferConfig(input, resolveAuthority, resolveSourceOwner) {
3062
- const authority = input.authority ?? resolveAuthority?.();
3063
- if (!authority) {
3064
- throw new Error("Connect a wallet or supply an `authority` before sending SPL tokens.");
3065
- }
3066
- const sourceOwner = input.sourceOwner ?? resolveSourceOwner?.();
3067
- if (!sourceOwner) {
3068
- throw new Error("Unable to resolve a source owner for the SPL token transfer.");
3069
- }
3070
- return {
3071
- ...input,
3072
- authority,
3073
- sourceOwner
3074
- };
3075
- }
3076
- __name(ensureTransferConfig, "ensureTransferConfig");
3077
- function createSplTransferController(config) {
3078
- const helper = config.helper;
3079
- const authorityProvider = config.authorityProvider;
3080
- const sourceOwnerProvider = config.sourceOwnerProvider;
3081
- const listeners = /* @__PURE__ */ new Set();
3082
- let state = createInitialAsyncState();
3083
- function notify() {
3084
- for (const listener of listeners) {
3085
- listener();
3086
- }
3087
- }
3088
- __name(notify, "notify");
3089
- function setState(next) {
3090
- state = next;
3091
- notify();
3092
- }
3093
- __name(setState, "setState");
3094
- async function send(config2, options) {
3095
- const resolvedConfig = ensureTransferConfig(
3096
- config2,
3097
- config2.authority ? void 0 : authorityProvider,
3098
- config2.sourceOwner ? void 0 : sourceOwnerProvider
3099
- );
3100
- setState(createAsyncState("loading"));
3101
- try {
3102
- const signature5 = await helper.sendTransfer(resolvedConfig, options);
3103
- setState(createAsyncState("success", { data: signature5 }));
3104
- return signature5;
3105
- } catch (error) {
3106
- setState(createAsyncState("error", { error }));
3107
- throw error;
3108
- }
3109
- }
3110
- __name(send, "send");
3111
- function subscribe(listener) {
3112
- listeners.add(listener);
3113
- return () => {
3114
- listeners.delete(listener);
3115
- };
3116
- }
3117
- __name(subscribe, "subscribe");
3118
- function reset() {
3119
- setState(createInitialAsyncState());
3120
- }
3121
- __name(reset, "reset");
3122
- return {
3123
- getHelper: /* @__PURE__ */ __name(() => helper, "getHelper"),
3124
- getState: /* @__PURE__ */ __name(() => state, "getState"),
3125
- reset,
3126
- send,
3127
- subscribe
3128
- };
3129
- }
3130
- __name(createSplTransferController, "createSplTransferController");
3131
-
3132
- // src/controllers/stakeController.ts
3133
- function ensureAuthority2(input, resolveDefault) {
3134
- const authority = input.authority ?? resolveDefault?.();
3135
- if (!authority) {
3136
- throw new Error("Connect a wallet or supply an `authority` before staking SOL.");
3137
- }
3138
- return {
3139
- ...input,
3140
- authority
3141
- };
3142
- }
3143
- __name(ensureAuthority2, "ensureAuthority");
3144
- function ensureUnstakeAuthority(input, resolveDefault) {
3145
- const authority = input.authority ?? resolveDefault?.();
3146
- if (!authority) {
3147
- throw new Error("Connect a wallet or supply an `authority` before unstaking SOL.");
3148
- }
3149
- return {
3150
- ...input,
3151
- authority
3152
- };
3153
- }
3154
- __name(ensureUnstakeAuthority, "ensureUnstakeAuthority");
3155
- function ensureWithdrawAuthority(input, resolveDefault) {
3156
- const authority = input.authority ?? resolveDefault?.();
3157
- if (!authority) {
3158
- throw new Error("Connect a wallet or supply an `authority` before withdrawing SOL.");
3159
- }
3160
- return {
3161
- ...input,
3162
- authority
3163
- };
3164
- }
3165
- __name(ensureWithdrawAuthority, "ensureWithdrawAuthority");
3166
- function createStakeController(config) {
3167
- const listeners = /* @__PURE__ */ new Set();
3168
- const unstakeListeners = /* @__PURE__ */ new Set();
3169
- const withdrawListeners = /* @__PURE__ */ new Set();
3170
- const helper = config.helper;
3171
- const authorityProvider = config.authorityProvider;
3172
- let state = createInitialAsyncState();
3173
- let unstakeState = createInitialAsyncState();
3174
- let withdrawState = createInitialAsyncState();
3175
- function notify() {
3176
- for (const listener of listeners) {
3177
- listener();
3178
- }
3179
- }
3180
- __name(notify, "notify");
3181
- function notifyUnstake() {
3182
- for (const listener of unstakeListeners) {
3183
- listener();
3184
- }
3185
- }
3186
- __name(notifyUnstake, "notifyUnstake");
3187
- function notifyWithdraw() {
3188
- for (const listener of withdrawListeners) {
3189
- listener();
3190
- }
3191
- }
3192
- __name(notifyWithdraw, "notifyWithdraw");
3193
- function setState(next) {
3194
- state = next;
3195
- notify();
3196
- }
3197
- __name(setState, "setState");
3198
- function setUnstakeState(next) {
3199
- unstakeState = next;
3200
- notifyUnstake();
3201
- }
3202
- __name(setUnstakeState, "setUnstakeState");
3203
- function setWithdrawState(next) {
3204
- withdrawState = next;
3205
- notifyWithdraw();
3206
- }
3207
- __name(setWithdrawState, "setWithdrawState");
3208
- async function stake(config2, options) {
3209
- const request = ensureAuthority2(config2, authorityProvider);
3210
- setState(createAsyncState("loading"));
3211
- try {
3212
- const signature5 = await helper.sendStake(request, options);
3213
- setState(createAsyncState("success", { data: signature5 }));
3214
- return signature5;
3215
- } catch (error) {
3216
- setState(createAsyncState("error", { error }));
3217
- throw error;
3218
- }
3219
- }
3220
- __name(stake, "stake");
3221
- async function unstake(config2, options) {
3222
- const request = ensureUnstakeAuthority(config2, authorityProvider);
3223
- setUnstakeState(createAsyncState("loading"));
3224
- try {
3225
- const signature5 = await helper.sendUnstake(request, options);
3226
- setUnstakeState(createAsyncState("success", { data: signature5 }));
3227
- return signature5;
3228
- } catch (error) {
3229
- setUnstakeState(createAsyncState("error", { error }));
3230
- throw error;
3231
- }
3232
- }
3233
- __name(unstake, "unstake");
3234
- async function withdraw(config2, options) {
3235
- const request = ensureWithdrawAuthority(config2, authorityProvider);
3236
- setWithdrawState(createAsyncState("loading"));
3237
- try {
3238
- const signature5 = await helper.sendWithdraw(request, options);
3239
- setWithdrawState(createAsyncState("success", { data: signature5 }));
3240
- return signature5;
3241
- } catch (error) {
3242
- setWithdrawState(createAsyncState("error", { error }));
3243
- throw error;
3244
- }
3245
- }
3246
- __name(withdraw, "withdraw");
3247
- function subscribe(listener) {
3248
- listeners.add(listener);
3249
- return () => {
3250
- listeners.delete(listener);
3251
- };
3252
- }
3253
- __name(subscribe, "subscribe");
3254
- function subscribeUnstake(listener) {
3255
- unstakeListeners.add(listener);
3256
- return () => {
3257
- unstakeListeners.delete(listener);
3258
- };
3259
- }
3260
- __name(subscribeUnstake, "subscribeUnstake");
3261
- function subscribeWithdraw(listener) {
3262
- withdrawListeners.add(listener);
3263
- return () => {
3264
- withdrawListeners.delete(listener);
3265
- };
3266
- }
3267
- __name(subscribeWithdraw, "subscribeWithdraw");
3268
- function reset() {
3269
- setState(createInitialAsyncState());
3270
- }
3271
- __name(reset, "reset");
3272
- function resetUnstake() {
3273
- setUnstakeState(createInitialAsyncState());
3274
- }
3275
- __name(resetUnstake, "resetUnstake");
3276
- function resetWithdraw() {
3277
- setWithdrawState(createInitialAsyncState());
3278
- }
3279
- __name(resetWithdraw, "resetWithdraw");
3280
- return {
3281
- getHelper: /* @__PURE__ */ __name(() => helper, "getHelper"),
3282
- getState: /* @__PURE__ */ __name(() => state, "getState"),
3283
- getUnstakeState: /* @__PURE__ */ __name(() => unstakeState, "getUnstakeState"),
3284
- getWithdrawState: /* @__PURE__ */ __name(() => withdrawState, "getWithdrawState"),
3285
- reset,
3286
- resetUnstake,
3287
- resetWithdraw,
3288
- stake,
3289
- unstake,
3290
- withdraw,
3291
- subscribe,
3292
- subscribeUnstake,
3293
- subscribeWithdraw
3294
- };
3295
- }
3296
- __name(createStakeController, "createStakeController");
3297
-
3298
- // src/serialization/json.ts
3299
- function bigintToJson(value) {
3300
- return value.toString();
3301
- }
3302
- __name(bigintToJson, "bigintToJson");
3303
- function bigintFromJson(value) {
3304
- return toBigint2(value, "bigint");
3305
- }
3306
- __name(bigintFromJson, "bigintFromJson");
3307
- function lamportsToJson(value) {
3308
- return value.toString();
3309
- }
3310
- __name(lamportsToJson, "lamportsToJson");
3311
- function lamportsFromJson(value) {
3312
- return lamports(value, "lamports");
3313
- }
3314
- __name(lamportsFromJson, "lamportsFromJson");
3315
- var COMMITMENT_PRIORITY = {
3316
- processed: 0,
3317
- confirmed: 1,
3318
- finalized: 2
3319
- };
3320
- var SIGNATURE_STATUS_TIMEOUT_MS = 2e4;
3321
- function normalizeSignature(input) {
3322
- if (!input) {
3323
- return void 0;
3324
- }
3325
- return typeof input === "string" ? signature(input) : input;
3326
- }
3327
- __name(normalizeSignature, "normalizeSignature");
3328
- function deriveConfirmationStatus(status) {
3329
- if (!status) {
3330
- return null;
3331
- }
3332
- if (status.confirmationStatus === "processed" || status.confirmationStatus === "confirmed" || status.confirmationStatus === "finalized") {
3333
- return status.confirmationStatus;
3334
- }
3335
- if (status.confirmations === null) {
3336
- return "finalized";
3337
- }
3338
- if (typeof status.confirmations === "number" && status.confirmations > 0) {
3339
- return "confirmed";
3340
- }
3341
- return "processed";
3342
- }
3343
- __name(deriveConfirmationStatus, "deriveConfirmationStatus");
3344
- function confirmationMeetsCommitment(confirmation, target) {
3345
- if (!confirmation) {
3346
- return false;
3347
- }
3348
- return COMMITMENT_PRIORITY[confirmation] >= COMMITMENT_PRIORITY[target];
3349
- }
3350
- __name(confirmationMeetsCommitment, "confirmationMeetsCommitment");
3351
- var MEMO_PROGRAM_ADDRESS = "MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr";
3352
- function ensureNonMemoInstructionIndex(instructions) {
3353
- const index = instructions.findIndex((instruction) => instruction.programAddress !== MEMO_PROGRAM_ADDRESS);
3354
- if (instructions.length === 0 || index === -1) {
3355
- throw new SolanaError(SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR, {
3356
- cause: "At least one non-memo instruction is required.",
3357
- index: instructions.length || index
3358
- });
3359
- }
3360
- return index;
3361
- }
3362
- __name(ensureNonMemoInstructionIndex, "ensureNonMemoInstructionIndex");
3363
- function insertReferenceKey(reference, transaction) {
3364
- return insertReferenceKeys([reference], transaction);
3365
- }
3366
- __name(insertReferenceKey, "insertReferenceKey");
3367
- function insertReferenceKeys(references, transaction) {
3368
- const index = ensureNonMemoInstructionIndex(transaction.instructions);
3369
- const targetInstruction = transaction.instructions[index];
3370
- const accounts = [
3371
- ...targetInstruction.accounts ?? [],
3372
- ...references.map((address5) => ({ address: address5, role: AccountRole.READONLY }))
3373
- ];
3374
- const updatedInstructions = [...transaction.instructions];
3375
- updatedInstructions.splice(index, 1, { ...targetInstruction, accounts });
3376
- return Object.freeze({
3377
- ...transaction,
3378
- instructions: Object.freeze(updatedInstructions)
3379
- });
3380
- }
3381
- __name(insertReferenceKeys, "insertReferenceKeys");
3382
-
3383
- // src/transactions/transactionPoolController.ts
3384
- function createStore2(initial) {
3385
- let snapshot = initial;
3386
- const listeners = /* @__PURE__ */ new Set();
3387
- return {
3388
- getSnapshot: /* @__PURE__ */ __name(() => snapshot, "getSnapshot"),
3389
- setSnapshot(next) {
3390
- snapshot = next;
3391
- for (const listener of listeners) {
3392
- listener();
3393
- }
3394
- },
3395
- subscribe(listener) {
3396
- listeners.add(listener);
3397
- return () => {
3398
- listeners.delete(listener);
3399
- };
3400
- }
3401
- };
3402
- }
3403
- __name(createStore2, "createStore");
3404
- function freezeInstructions(list) {
3405
- return Object.freeze([...list]);
3406
- }
3407
- __name(freezeInstructions, "freezeInstructions");
3408
- function createTransactionPoolController(config) {
3409
- const helper = config.helper;
3410
- const initialInstructions = freezeInstructions(config.initialInstructions ?? []);
3411
- const blockhashMaxAgeMs = config.blockhashMaxAgeMs ?? 3e4;
3412
- let latestBlockhashCache;
3413
- const instructionsStore = createStore2(initialInstructions);
3414
- const preparedStore = createStore2(null);
3415
- const prepareStateStore = createStore2(
3416
- createInitialAsyncState()
3417
- );
3418
- const sendStateStore = createStore2(
3419
- createInitialAsyncState()
3420
- );
3421
- function resetDerivedState() {
3422
- preparedStore.setSnapshot(null);
3423
- prepareStateStore.setSnapshot(createInitialAsyncState());
3424
- sendStateStore.setSnapshot(createInitialAsyncState());
3425
- }
3426
- __name(resetDerivedState, "resetDerivedState");
3427
- function commitInstructions(next) {
3428
- instructionsStore.setSnapshot(freezeInstructions(next));
3429
- resetDerivedState();
3430
- }
3431
- __name(commitInstructions, "commitInstructions");
3432
- function addInstruction(instruction) {
3433
- const next = [...instructionsStore.getSnapshot(), instruction];
3434
- commitInstructions(next);
3435
- }
3436
- __name(addInstruction, "addInstruction");
3437
- function addInstructions(instructionSet) {
3438
- if (!instructionSet.length) {
3439
- return;
3440
- }
3441
- const next = [...instructionsStore.getSnapshot(), ...instructionSet];
3442
- commitInstructions(next);
3443
- }
3444
- __name(addInstructions, "addInstructions");
3445
- function replaceInstructions(instructionSet) {
3446
- commitInstructions(instructionSet);
3447
- }
3448
- __name(replaceInstructions, "replaceInstructions");
3449
- function clearInstructions() {
3450
- commitInstructions([]);
3451
- }
3452
- __name(clearInstructions, "clearInstructions");
3453
- function removeInstruction(index) {
3454
- const current = instructionsStore.getSnapshot();
3455
- if (index < 0 || index >= current.length) {
3456
- return;
3457
- }
3458
- const next = current.filter((_, ii) => ii !== index);
3459
- commitInstructions(next);
3460
- }
3461
- __name(removeInstruction, "removeInstruction");
3462
- function reset() {
3463
- commitInstructions(initialInstructions);
3464
- }
3465
- __name(reset, "reset");
3466
- function ensureInstructions(instructionList) {
3467
- if (!instructionList.length) {
3468
- throw new Error("Add at least one instruction before preparing a transaction.");
3469
- }
3470
- }
3471
- __name(ensureInstructions, "ensureInstructions");
3472
- function resolveCachedLifetime() {
3473
- if (!latestBlockhashCache) {
3474
- return void 0;
3475
- }
3476
- if (Date.now() - latestBlockhashCache.updatedAt > blockhashMaxAgeMs) {
3477
- return void 0;
3478
- }
3479
- return latestBlockhashCache.value;
3480
- }
3481
- __name(resolveCachedLifetime, "resolveCachedLifetime");
3482
- async function prepare(options = {}) {
3483
- const { instructions: overrideInstructions, ...rest } = options;
3484
- const nextInstructions = overrideInstructions ?? instructionsStore.getSnapshot();
3485
- ensureInstructions(nextInstructions);
3486
- prepareStateStore.setSnapshot(createAsyncState("loading"));
3487
- try {
3488
- const cachedLifetime = rest.lifetime ?? resolveCachedLifetime();
3489
- const restWithLifetime = cachedLifetime && !rest.lifetime ? { ...rest, lifetime: cachedLifetime } : rest;
3490
- const prepared = await helper.prepare({
3491
- ...restWithLifetime,
3492
- instructions: nextInstructions
3493
- });
3494
- preparedStore.setSnapshot(prepared);
3495
- prepareStateStore.setSnapshot(createAsyncState("success", { data: prepared }));
3496
- return prepared;
3497
- } catch (error) {
3498
- prepareStateStore.setSnapshot(createAsyncState("error", { error }));
3499
- throw error;
3500
- }
3501
- }
3502
- __name(prepare, "prepare");
3503
- function resolvePrepared(override) {
3504
- const target = override ?? preparedStore.getSnapshot();
3505
- if (!target) {
3506
- throw new Error("Prepare a transaction before sending.");
3507
- }
3508
- return target;
3509
- }
3510
- __name(resolvePrepared, "resolvePrepared");
3511
- function resolveLifetimeOptions(options) {
3512
- if (options.lifetime) {
3513
- return options;
3514
- }
3515
- const cachedLifetime = resolveCachedLifetime();
3516
- if (!cachedLifetime) {
3517
- return options;
3518
- }
3519
- return { ...options, lifetime: cachedLifetime };
3520
- }
3521
- __name(resolveLifetimeOptions, "resolveLifetimeOptions");
3522
- async function send(options = {}) {
3523
- const { prepared: overridePrepared, ...rest } = options;
3524
- const target = resolvePrepared(overridePrepared);
3525
- sendStateStore.setSnapshot(createAsyncState("loading"));
3526
- try {
3527
- const signature5 = await helper.send(target, rest);
3528
- sendStateStore.setSnapshot(createAsyncState("success", { data: signature5 }));
3529
- return signature5;
3530
- } catch (error) {
3531
- sendStateStore.setSnapshot(createAsyncState("error", { error }));
3532
- throw error;
3533
- }
3534
- }
3535
- __name(send, "send");
3536
- async function prepareAndSend(request = {}, sendOptions) {
3537
- const { instructions: overrideInstructions, ...rest } = request;
3538
- const nextInstructions = overrideInstructions ?? instructionsStore.getSnapshot();
3539
- ensureInstructions(nextInstructions);
3540
- sendStateStore.setSnapshot(createAsyncState("loading"));
3541
- try {
3542
- const restWithLifetime = resolveLifetimeOptions(rest);
3543
- const signature5 = await helper.prepareAndSend(
3544
- {
3545
- ...restWithLifetime,
3546
- instructions: nextInstructions
3547
- },
3548
- sendOptions
3549
- );
3550
- sendStateStore.setSnapshot(createAsyncState("success", { data: signature5 }));
3551
- return signature5;
3552
- } catch (error) {
3553
- sendStateStore.setSnapshot(createAsyncState("error", { error }));
3554
- throw error;
3555
- }
3556
- }
3557
- __name(prepareAndSend, "prepareAndSend");
3558
- function sign(options = {}) {
3559
- const { prepared: overridePrepared, ...rest } = options;
3560
- const target = resolvePrepared(overridePrepared);
3561
- return helper.sign(target, rest);
3562
- }
3563
- __name(sign, "sign");
3564
- function toWire(options = {}) {
3565
- const { prepared: overridePrepared, ...rest } = options;
3566
- const target = resolvePrepared(overridePrepared);
3567
- return helper.toWire(target, rest);
3568
- }
3569
- __name(toWire, "toWire");
3570
- function subscribeInstructions(listener) {
3571
- return instructionsStore.subscribe(listener);
3572
- }
3573
- __name(subscribeInstructions, "subscribeInstructions");
3574
- function subscribePrepared(listener) {
3575
- return preparedStore.subscribe(listener);
3576
- }
3577
- __name(subscribePrepared, "subscribePrepared");
3578
- function subscribePrepareState(listener) {
3579
- return prepareStateStore.subscribe(listener);
3580
- }
3581
- __name(subscribePrepareState, "subscribePrepareState");
3582
- function subscribeSendState(listener) {
3583
- return sendStateStore.subscribe(listener);
3584
- }
3585
- __name(subscribeSendState, "subscribeSendState");
3586
- function setLatestBlockhashCache(cache) {
3587
- latestBlockhashCache = cache;
3588
- }
3589
- __name(setLatestBlockhashCache, "setLatestBlockhashCache");
3590
- return {
3591
- addInstruction,
3592
- addInstructions,
3593
- clearInstructions,
3594
- get helper() {
3595
- return helper;
3596
- },
3597
- getInstructions: instructionsStore.getSnapshot,
3598
- getPrepareState: prepareStateStore.getSnapshot,
3599
- getPrepared: preparedStore.getSnapshot,
3600
- getSendState: sendStateStore.getSnapshot,
3601
- getLatestBlockhashCache: /* @__PURE__ */ __name(() => latestBlockhashCache, "getLatestBlockhashCache"),
3602
- prepare,
3603
- prepareAndSend,
3604
- removeInstruction,
3605
- replaceInstructions,
3606
- reset,
3607
- send,
3608
- setLatestBlockhashCache,
3609
- sign,
3610
- subscribeInstructions,
3611
- subscribePrepareState,
3612
- subscribePrepared,
3613
- subscribeSendState,
3614
- toWire
3615
- };
3616
- }
3617
- __name(createTransactionPoolController, "createTransactionPoolController");
3618
- function toAddress2(addressLike) {
3619
- return typeof addressLike === "string" ? address(addressLike) : addressLike;
3620
- }
3621
- __name(toAddress2, "toAddress");
3622
- function toAddressString(addressLike) {
3623
- return toAddress2(addressLike).toString();
3624
- }
3625
- __name(toAddressString, "toAddressString");
3626
-
3627
- // src/utils/stableStringify.ts
3628
- function stableStringify(value) {
3629
- const result = JSON.stringify(value, (_key, candidate) => {
3630
- if (typeof candidate === "bigint") {
3631
- return { __type: "bigint", value: candidate.toString() };
3632
- }
3633
- if (candidate instanceof Uint8Array) {
3634
- return Array.from(candidate);
3635
- }
3636
- return candidate;
3637
- });
3638
- return result ?? "undefined";
3639
- }
3640
- __name(stableStringify, "stableStringify");
3641
-
3642
- export { LAMPORTS_PER_SOL, SIGNATURE_STATUS_TIMEOUT_MS, applyRatio, applySerializableState, assertDecimals, assertNonNegative, autoDiscover, backpack, bigintFromJson, bigintToJson, checkedAdd, checkedDivide, checkedMultiply, checkedSubtract, confirmationMeetsCommitment, connectWallet, createAsyncState, createClient, createClientStore, createDefaultClient, createDefaultClientStore, createInitialAsyncState, createInitialClientState, createRatio, createSolTransferController, createSolTransferHelper, createSolanaRpcClient, createSplTokenHelper, createSplTransferController, createStakeController, createStakeHelper, createTokenAmount, createTransactionHelper, createTransactionPoolController, createTransactionRecipe, createWalletRegistry, createWalletStandardConnector, defaultWalletConnectors, deriveConfirmationStatus, deserializeSolanaState, disconnectWallet, fetchAccount, fetchBalance, fetchLookupTable, fetchLookupTables, fetchNonceAccount, getInitialSerializableState, getWalletStandardConnectors, injected, insertReferenceKey, insertReferenceKeys, lamports, lamportsFromJson, lamportsFromSol, lamportsMath, lamportsToJson, lamportsToSolString, normalizeSignature, phantom, pow10, prepareTransaction, requestAirdrop, resolveClientConfig, resolveCluster, sendTransaction, serializeSolanaState, setCluster, solflare, stableStringify, subscribeSolanaState, toAddress2 as toAddress, toAddressString, toBigint2 as toBigint, transactionToBase64, transactionToBase64WithSigners, watchWalletStandardConnectors };
3643
- //# sourceMappingURL=index.browser.mjs.map
1
+ import {createSolanaRpc,createSolanaRpcSubscriptions,address,getBase64EncodedWireTransaction,compileTransaction,partiallySignTransactionMessageWithSigners,appendTransactionMessageInstruction,setTransactionMessageLifetimeUsingBlockhash,isTransactionSendingSigner,getMessagePackerInstructionPlanFromInstructions,pipe,createTransactionMessage,setTransactionMessageFeePayerSigner,setTransactionMessageFeePayer,signature,AccountRole,singleTransactionPlan,signAndSendTransactionMessageWithSigners,createTransactionPlanExecutor,signTransactionMessageWithSigners,isSolanaError,SOLANA_ERROR__TRANSACTION_ERROR__ALREADY_PROCESSED,generateKeyPairSigner,appendTransactionMessageInstructions,createTransactionPlanner,signatureBytes,isTransactionPartialSigner,SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED,isInstructionForProgram,isInstructionWithData,SolanaError,SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR,isSome,airdropFactory}from'@solana/kit';import {createBlockHeightExceedencePromiseFactory,createRecentSignatureConfirmationPromiseFactory,waitForRecentTransactionConfirmation}from'@solana/transaction-confirmation';import {fetchAddressLookupTable,fetchAllAddressLookupTable}from'@solana-program/address-lookup-table';import {getTransferSolInstruction,getCreateAccountInstruction,fetchNonce}from'@solana-program/system';import {getBase58Decoder,getBase58Encoder}from'@solana/codecs-strings';import {TOKEN_PROGRAM_ADDRESS,fetchMint,findAssociatedTokenPda,getCreateAssociatedTokenInstruction,getTransferCheckedInstruction}from'@solana-program/token';import {getInitializeInstruction,getDelegateStakeInstruction,getDeactivateInstruction,getWithdrawInstruction}from'@solana-program/stake';import {getSetComputeUnitLimitInstruction,getSetComputeUnitPriceInstruction,COMPUTE_BUDGET_PROGRAM_ADDRESS,ComputeBudgetInstruction}from'@solana-program/compute-budget';import {createStore}from'zustand/vanilla';import {getWallets}from'@wallet-standard/app';import {StandardConnect,StandardEvents,StandardDisconnect}from'@wallet-standard/features';import {getTransactionDecoder,getTransactionEncoder}from'@solana/transactions';import {SolanaSignMessage,SolanaSignTransaction,SolanaSignAndSendTransaction}from'@solana/wallet-standard-features';var Ht=Object.defineProperty;var n=(e,t)=>Ht(e,"name",{value:t,configurable:true});function _t(e,t){return e.actions.connectWallet(t.connectorId,t.options)}n(_t,"connectWallet");function Nt(e,t){return e.actions.disconnectWallet()}n(Nt,"disconnectWallet");function zt(e,t){return e.actions.fetchAccount(t.address,t.commitment)}n(zt,"fetchAccount");function Vt(e,t){return e.actions.fetchBalance(t.address,t.commitment)}n(Vt,"fetchBalance");function jt(e,t){return e.actions.fetchLookupTable(t.address,t.commitment)}n(jt,"fetchLookupTable");function qt(e,t){return e.actions.fetchLookupTables(t.addresses,t.commitment)}n(qt,"fetchLookupTables");function Kt(e,t){return e.actions.fetchNonceAccount(t.address,t.commitment)}n(Kt,"fetchNonceAccount");function $t(e,t){return e.actions.requestAirdrop(t.address,t.lamports)}n($t,"requestAirdrop");function Jt(e,t){return e.actions.sendTransaction(t.transaction,t.commitment)}n(Jt,"sendTransaction");function Gt(e,t){return e.actions.setCluster(t.endpoint,t.config)}n(Gt,"setCluster");function me(e){if(typeof e!="object"||e===null)return e;let t=e;for(let r of Reflect.ownKeys(t)){let a=t[r];me(a);}return Object.freeze(e)}n(me,"deepFreeze");function L(){return Date.now()}n(L,"now");function $e(e){if(e instanceof Error)return e.message;if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}n($e,"toErrorMessage");function G(e){return e||(({data:t,level:r,message:a})=>{let i=t?{...t}:{};switch(r){case "error":console.error(`[react-core] ${a}`,i);break;case "warn":console.warn(`[react-core] ${a}`,i);break;case "info":console.info(`[react-core] ${a}`,i);break;default:console.debug(`[react-core] ${a}`,i);}})}n(G,"createLogger");function B(e){return {error:e,message:$e(e)}}n(B,"formatError");function tn(e){let t=new AbortController;if(!e)return t;if(e.aborted)return t.abort(e.reason),t;let r=n(()=>{t.abort(e.reason),e.removeEventListener("abort",r);},"onAbort");return e.addEventListener("abort",r,{once:true}),t}n(tn,"createChainedAbortController");function Ge(e){if(e!==void 0)return typeof e=="bigint"?e:BigInt(Math.floor(e))}n(Ge,"toBigint");var nn=Object.freeze({encoding:"base64",replaceRecentBlockhash:true,sigVerify:false});function Q(e){let t=e.endpoint,r=e.websocketEndpoint??t,a=e.commitment??"confirmed",i=createSolanaRpc(t,e.rpcConfig),l=createSolanaRpcSubscriptions(r,e.rpcSubscriptionsConfig);async function g(T,m={}){let s=tn(m.abortSignal),c=m.commitment??a,o=getBase64EncodedWireTransaction(T),p=await i.sendTransaction(o,{encoding:"base64",maxRetries:Ge(m.maxRetries),minContextSlot:Ge(m.minContextSlot),preflightCommitment:c,skipPreflight:m.skipPreflight}).send({abortSignal:s.signal}),u=createBlockHeightExceedencePromiseFactory({rpc:i,rpcSubscriptions:l}),C=createRecentSignatureConfirmationPromiseFactory({rpc:i,rpcSubscriptions:l});return await waitForRecentTransactionConfirmation({abortSignal:s.signal,commitment:c,getBlockHeightExceedencePromise:u,getRecentSignatureConfirmationPromise:C,transaction:T}),p}n(g,"sendAndConfirmTransaction");async function y(T,m={}){let s=getBase64EncodedWireTransaction(T),c=m.config??{},o={...nn,...c,commitment:c.commitment??m.commitment??a},p=o.sigVerify===true&&o.replaceRecentBlockhash!==false?{...o,replaceRecentBlockhash:false}:o;return i.simulateTransaction(s,p).send({abortSignal:m.abortSignal})}return n(y,"simulateTransaction"),{commitment:a,endpoint:t,rpc:i,rpcSubscriptions:l,sendAndConfirmTransaction:g,simulateTransaction:y,websocketEndpoint:r}}n(Q,"createSolanaRpcClient");function rn(e){return {autoconnect:false,commitment:e.commitment,endpoint:e.endpoint,lastConnectorId:null,lastPublicKey:null,version:1,websocketEndpoint:e.websocketEndpoint}}n(rn,"getInitialSerializableState");function ge(e,t){return t?{...e,commitment:t.commitment??e.commitment,endpoint:t.endpoint??e.endpoint,websocketEndpoint:t.websocketEndpoint??e.websocketEndpoint}:e}n(ge,"applySerializableState");function fe(e){return JSON.stringify(e)}n(fe,"serializeSolanaState");function an(e){if(!e)return null;try{let t=JSON.parse(e);if(typeof t!="object"||t===null)return null;let r=t;return {autoconnect:r.autoconnect??!1,commitment:r.commitment,endpoint:r.endpoint,lastConnectorId:r.lastConnectorId??null,lastPublicKey:r.lastPublicKey??null,version:r.version??1,websocketEndpoint:r.websocketEndpoint}}catch{return null}}n(an,"deserializeSolanaState");function Ze(e){let t=e.store.getState(),r=t.wallet,a=r.autoConnect,i=null,l=null;return "connectorId"in r&&(i=r.connectorId??null,r.status==="connected"&&(l=r.session.account.address.toString())),{autoconnect:a??!!i,commitment:t.cluster.commitment,endpoint:t.cluster.endpoint,lastConnectorId:i,lastPublicKey:l,version:1,websocketEndpoint:t.cluster.websocketEndpoint}}n(Ze,"getSerializableStateSnapshot");function on(e,t){let r=fe(Ze(e));return t(JSON.parse(r)),e.store.subscribe(()=>{let i=Ze(e),l=fe(i);l!==r&&(r=l,t(i));})}n(on,"subscribeSolanaState");function Ye(e){return e.startsWith("http://")||e.startsWith("https://")||e.startsWith("ws://")||e.startsWith("wss://")?e:`https://${e}`}n(Ye,"ensureHttpProtocol");var sn={devnet:{endpoint:"https://api.devnet.solana.com",websocketEndpoint:"wss://api.devnet.solana.com"},localhost:{endpoint:"http://127.0.0.1:8899",websocketEndpoint:"ws://127.0.0.1:8900"},localnet:{endpoint:"http://127.0.0.1:8899",websocketEndpoint:"ws://127.0.0.1:8900"},"mainnet-beta":{endpoint:"https://api.mainnet-beta.solana.com",websocketEndpoint:"wss://api.mainnet-beta.solana.com"},mainnet:{endpoint:"https://api.mainnet-beta.solana.com",websocketEndpoint:"wss://api.mainnet-beta.solana.com"},testnet:{endpoint:"https://api.testnet.solana.com",websocketEndpoint:"wss://api.testnet.solana.com"}};function cn(e){return e.startsWith("https://")?e.replace("https://","wss://"):e.startsWith("http://")?e.replace("http://","ws://"):(e.startsWith("ws://")||e.startsWith("wss://"),e)}n(cn,"inferWebsocketEndpoint");function ee(e){let t=e.moniker??(e.endpoint?"custom":"devnet"),r=t==="custom"?void 0:sn[t],a=Ye(e.endpoint??r?.endpoint),i=e.websocketEndpoint?Ye(e.websocketEndpoint):void 0,l=cn(i??r?.websocketEndpoint??a);return {endpoint:a,moniker:t,websocketEndpoint:l}}n(ee,"resolveCluster");function Se(e){let t=new Map;for(let r of e)t.has(r.id)||t.set(r.id,r);return {all:[...t.values()],get(r){return t.get(r)}}}n(Se,"createWalletRegistry");function yn(e,t){e.setState(r=>({...r,...t,lastUpdatedAt:L()}));}n(yn,"updateState");function Qe({connectors:e,logger:t,runtime:r,store:a}){let i=t??G(),l;function g(d){return d??a.getState().cluster.commitment}n(g,"getCommitment");async function y(d,h){try{let f=L();return await r.rpc.getLatestBlockhash({commitment:h}).send({abortSignal:AbortSignal.timeout(1e4)}),L()-f}catch(f){i({data:{endpoint:d,...B(f)},level:"warn",message:"cluster warmup failed"});return}}n(y,"warmupCluster");async function T(d,h){let f=h?.commitment??a.getState().cluster.commitment,S=h?.websocketEndpoint??d;a.setState(k=>({...k,cluster:{commitment:f,endpoint:d,status:{status:"connecting"},websocketEndpoint:S},lastUpdatedAt:L()}));try{let k=Q({commitment:f,endpoint:d,websocketEndpoint:S});r.rpc=k.rpc,r.rpcSubscriptions=k.rpcSubscriptions;let R=await y(d,f);a.setState(P=>({...P,cluster:{commitment:f,endpoint:d,status:{latencyMs:R,status:"ready"},websocketEndpoint:S},lastUpdatedAt:L()}));}catch(k){throw a.setState(R=>({...R,cluster:{commitment:f,endpoint:d,status:{error:k,status:"error"},websocketEndpoint:S},lastUpdatedAt:L()})),i({data:{endpoint:d,...B(k)},level:"error",message:"cluster setup failed"}),k}}n(T,"setCluster");async function m(d,h={}){l?.(),l=void 0;let f=e.get(d);if(!f)throw new Error(`No wallet connector registered for id "${d}".`);if(!f.isSupported())throw new Error(`Wallet connector "${d}" is not supported in this environment.`);let S=h.autoConnect??false;a.setState(k=>({...k,lastUpdatedAt:L(),wallet:{autoConnect:S,connectorId:d,status:"connecting"}}));try{let k=await f.connect(h);a.setState(R=>({...R,lastUpdatedAt:L(),wallet:{autoConnect:S,connectorId:d,session:k,status:"connected"}})),k.onAccountsChanged&&(l=k.onAccountsChanged(R=>{R.length===0&&(l?.(),l=void 0,s());})),i({data:{address:k.account.address.toString(),connectorId:d},level:"info",message:"wallet connected"});}catch(k){throw a.setState(R=>({...R,lastUpdatedAt:L(),wallet:{autoConnect:S,connectorId:d,error:k,status:"error"}})),i({data:{connectorId:d,...B(k)},level:"error",message:"wallet connection failed"}),k}}n(m,"connectWallet");async function s(){let d=a.getState().wallet;if(d.status!=="disconnected"){l?.(),l=void 0;try{if(d.status==="connected"){await d.session.disconnect();let h=e.get(d.connectorId);h&&await h.disconnect();}else if(d.status==="connecting"){let h=e.get(d.connectorId);h&&await h.disconnect();}}finally{yn(a,{wallet:{status:"disconnected"}});}}}n(s,"disconnectWallet");async function c(d,h){let f=d.toString();a.setState(S=>({...S,accounts:{...S.accounts,[f]:{address:d,data:S.accounts[f]?.data,error:void 0,fetching:true,lamports:S.accounts[f]?.lamports??null,lastFetchedAt:L(),slot:S.accounts[f]?.slot??null}},lastUpdatedAt:L()}));try{let S=await r.rpc.getBalance(d,{commitment:g(h)}).send({abortSignal:AbortSignal.timeout(1e4)}),k=S.value;return a.setState(R=>({...R,accounts:{...R.accounts,[f]:{address:d,data:R.accounts[f]?.data,error:void 0,fetching:!1,lamports:k,lastFetchedAt:L(),slot:S.context.slot}},lastUpdatedAt:L()})),k}catch(S){throw a.setState(k=>({...k,accounts:{...k.accounts,[f]:{address:d,data:k.accounts[f]?.data,error:S,fetching:false,lamports:k.accounts[f]?.lamports??null,lastFetchedAt:L(),slot:k.accounts[f]?.slot??null}},lastUpdatedAt:L()})),i({data:{address:f,...B(S)},level:"error",message:"balance fetch failed"}),S}}n(c,"fetchBalance");async function o(d,h){let f=d.toString();a.setState(S=>({...S,accounts:{...S.accounts,[f]:{address:d,data:S.accounts[f]?.data,error:void 0,fetching:true,lamports:S.accounts[f]?.lamports??null,lastFetchedAt:L(),slot:S.accounts[f]?.slot??null}},lastUpdatedAt:L()}));try{let S=await r.rpc.getAccountInfo(d,{commitment:g(h),encoding:"base64"}).send({abortSignal:AbortSignal.timeout(1e4)}),k=S.value,R=k?.lamports??null;return a.setState(P=>({...P,accounts:{...P.accounts,[f]:{address:d,data:k,error:void 0,fetching:!1,lamports:R,lastFetchedAt:L(),slot:S.context.slot}},lastUpdatedAt:L()})),a.getState().accounts[f]}catch(S){throw a.setState(k=>({...k,accounts:{...k.accounts,[f]:{address:d,data:k.accounts[f]?.data,error:S,fetching:false,lamports:k.accounts[f]?.lamports??null,lastFetchedAt:L(),slot:k.accounts[f]?.slot??null}},lastUpdatedAt:L()})),i({data:{address:f,...B(S)},level:"error",message:"account fetch failed"}),S}}n(o,"fetchAccount");async function p(d,h){let f=await fetchAddressLookupTable(r.rpc,d,{commitment:g(h)}),{addresses:S,authority:k,deactivationSlot:R,lastExtendedSlot:P,lastExtendedSlotStartIndex:x}=f.data;return {addresses:S,authority:isSome(k)?k.value:void 0,deactivationSlot:R,lastExtendedSlot:P,lastExtendedSlotStartIndex:x}}n(p,"fetchLookupTable");async function u(d,h){return d.length===0?[]:(await fetchAllAddressLookupTable(r.rpc,d,{commitment:g(h)})).map(({data:S})=>({addresses:S.addresses,authority:isSome(S.authority)?S.authority.value:void 0,deactivationSlot:S.deactivationSlot,lastExtendedSlot:S.lastExtendedSlot,lastExtendedSlotStartIndex:S.lastExtendedSlotStartIndex}))}n(u,"fetchLookupTables");async function C(d,h){let f=await fetchNonce(r.rpc,d,{commitment:g(h)});return {authority:f.data.authority,blockhash:f.data.blockhash}}n(C,"fetchNonceAccount");async function w(d,h){let f=g(h),S=new AbortController,k=await r.rpc.sendTransaction(getBase64EncodedWireTransaction(d),{encoding:"base64",preflightCommitment:f}).send({abortSignal:S.signal}),R=k.toString();a.setState(W=>({...W,lastUpdatedAt:L(),transactions:{...W.transactions,[R]:{lastUpdatedAt:L(),signature:k,status:"sending"}}}));let P=createBlockHeightExceedencePromiseFactory({rpc:r.rpc,rpcSubscriptions:r.rpcSubscriptions}),x=createRecentSignatureConfirmationPromiseFactory({rpc:r.rpc,rpcSubscriptions:r.rpcSubscriptions});try{return await waitForRecentTransactionConfirmation({abortSignal:S.signal,commitment:f,getBlockHeightExceedencePromise:P,getRecentSignatureConfirmationPromise:x,transaction:d}),a.setState(W=>({...W,lastUpdatedAt:L(),transactions:{...W.transactions,[R]:{lastUpdatedAt:L(),signature:k,status:"confirmed"}}})),k}catch(W){throw a.setState(O=>({...O,lastUpdatedAt:L(),transactions:{...O.transactions,[R]:{error:W,lastUpdatedAt:L(),signature:k,status:"failed"}}})),i({data:{signature:R,...B(W)},level:"error",message:"transaction failed to confirm"}),W}}n(w,"sendTransaction");async function b(d,h){try{let S=await airdropFactory({rpc:r.rpc,rpcSubscriptions:r.rpcSubscriptions})({commitment:g("confirmed"),lamports:h,recipientAddress:d});return i({data:{address:d.toString(),lamports:h.toString(),signature:S},level:"info",message:"airdrop requested"}),S}catch(f){throw i({data:{address:d.toString(),lamports:h.toString(),...B(f)},level:"error",message:"airdrop request failed"}),f}}return n(b,"requestAirdrop"),{connectWallet:m,disconnectWallet:s,fetchAccount:o,fetchBalance:c,fetchLookupTable:p,fetchLookupTables:u,fetchNonceAccount:C,requestAirdrop:b,sendTransaction:w,setCluster:T}}n(Qe,"createActions");var Tn=10n;function ye(e){return ae(e,"exponent"),Tn**BigInt(e)}n(ye,"pow10");function F(e,t="value"){if(e<0n)throw new RangeError(`${t} must be non-negative`)}n(F,"assertNonNegative");function ae(e,t="decimals"){if(!Number.isInteger(e)||e<0||e>38)throw new RangeError(`${t} must be an integer between 0 and 38`)}n(ae,"assertDecimals");function N(e,t="value"){if(typeof e=="bigint")return e;if(typeof e=="number"){if(!Number.isFinite(e)||!Number.isInteger(e))throw new RangeError(`${t} must be a finite integer when provided as a number`);if(!Number.isSafeInteger(e))throw new RangeError(`${t} must be within the safe integer range when provided as a number`);return BigInt(e)}let r=e.trim(),a=/^[-+]?\d+$/.exec(r);if(!a)throw new SyntaxError(`${t} must be an integer string`);return BigInt(a[0])}n(N,"toBigint");function Te(e,t,r="result"){let a=e+t;return F(a,r),a}n(Te,"checkedAdd");function he(e,t,r="result"){let a=e-t;return F(a,r),a}n(he,"checkedSubtract");function hn(e,t,r="result"){let a=e*t;return F(a,r),a}n(hn,"checkedMultiply");function bn(e,t,r="result"){if(t===0n)throw new RangeError("divisor must be non-zero");let a=e/t;return F(a,r),a}n(bn,"checkedDivide");function Cn(e,t,r){if(t<=0n)throw new RangeError("divisor must be positive");let a=e/t,i=e%t;if(i===0n)return a;switch(r){case "ceil":return a+1n;case "round":return i*2n>=t?a+1n:a;default:return a}}n(Cn,"divideWithRounding");function kn(e,t){let r=N(e,"numerator"),a=N(t,"denominator");if(a<=0n)throw new RangeError("denominator must be positive");return F(r,"numerator"),Object.freeze({denominator:a,numerator:r})}n(kn,"createRatio");function be(e,t,r={}){F(e,"amount");let a=e*t.numerator,i=r.rounding??"floor";return Cn(a,t.denominator,i)}n(be,"applyRatio");var Pn=/^\d+(?:\.\d+)?$/;function wn(e,t,r){if(!Number.isFinite(e))throw new RangeError(`${r} must be a finite number`);if(Number.isInteger(e))return e.toString(10);let a=e.toString(10);if(a.includes("e")||a.includes("E"))throw new RangeError(`${r} cannot use exponential notation; provide a string instead`);let i=a.split(".");if(i[1]&&i[1].length>t+6)throw new RangeError(`${r} exceeds safe precision; provide a string instead`);return a}n(wn,"normalizeNumberInput");function et(e,t,r,a){let i=a.label??"value",l=a.rounding??"floor",g=e.replace(/_/g,"").trim();if(g==="")throw new SyntaxError(`${i} must not be empty`);if(!Pn.test(g))throw new SyntaxError(`${i} must be a non-negative decimal string`);let[y,T]=g.split("."),m=y||"0";F(BigInt(m),i);let s=BigInt(m)*r,c=T??"";if(t===0){if(c.length===0)return s;let u=/[1-9]/.test(c);return l==="ceil"&&u||l==="round"&&c[0]!==void 0&&c[0]>="5"?s+1n:s}let o=c.slice(0,t).padEnd(t,"0"),p=o===""?0n:BigInt(o);if(s+=p,c.length>t){let u=c.slice(t),C=/[1-9]/.test(u);if(l==="ceil"&&C)s+=1n;else if(l==="round"){let w=u[0];w!==void 0&&w>="5"&&(s+=1n);}}return s}n(et,"decimalToBaseUnits");function An(e,t,r,a){F(e,"amount");let i=a.minimumFractionDigits??0;if(i<0||i>t)throw new RangeError("minimumFractionDigits must be between 0 and the token decimals");let l=a.trimTrailingZeros??true;if(t===0)return e.toString();let g=e/r,y=(e%r).toString().padStart(t,"0");return l&&(y=y.replace(/0+$/,"")),y.length<i&&(y=y.padEnd(i,"0")),y.length===0?g.toString():`${g.toString()}.${y}`}n(An,"formatBaseUnits");function te(e){ae(e,"decimals");let t=ye(e);function r(s,c){let o=N(s,c??"amount");return F(o,c??"amount"),o}n(r,"fromBaseUnits");function a(s,c={}){let o=c.label??"value";if(typeof s=="number"){if(Number.isInteger(s)){if(!Number.isSafeInteger(s))throw new RangeError(`${o} must be within the safe integer range when provided as a number`);return r(BigInt(s)*t,o)}if(e===0)throw new RangeError(`${o} cannot include fractional digits for a token with 0 decimals`);let p=wn(s,e,o);return et(p,e,t,c)}return et(s,e,t,c)}n(a,"fromDecimal");function i(s,c={}){return An(r(s),e,t,c)}n(i,"toDecimalString");function l(s,c){return Te(r(s),r(c))}n(l,"add");function g(s,c){return he(r(s),r(c))}n(g,"subtract");function y(s,c,o){return be(r(s),c,o)}n(y,"multiplyByRatio");function T(s){return r(s)===0n}n(T,"isZero");function m(s,c){let o=r(s),p=r(c);return o>p?1:o<p?-1:0}return n(m,"compare"),Object.freeze({add:l,compare:m,decimals:e,fromBaseUnits:r,fromDecimal:a,isZero:T,multiplyByRatio:y,scale:t,subtract:g,toDecimalString:i})}n(te,"createTokenAmount");var D=te(9),Rn=D.scale,z=Object.freeze({add(e,t){return D.add(e,t)},compare(e,t){return D.compare(e,t)},decimals:D.decimals,fromLamports(e,t){return D.fromBaseUnits(e,t)},fromSol(e,t){return D.fromDecimal(e,t)},isZero(e){return D.isZero(e)},multiplyByRatio(e,t,r){return D.multiplyByRatio(e,t,r)},raw:D,scale:D.scale,subtract(e,t){return D.subtract(e,t)},toSolString(e,t){return D.toDecimalString(e,t)}});function Ce(e,t){return z.fromLamports(e,t)}n(Ce,"lamports");function xn(e,t){return z.fromSol(e,t)}n(xn,"lamportsFromSol");function Ln(e,t){return z.toSolString(e,t)}n(Ln,"lamportsToSolString");function V(e){return typeof e!="object"||e===null?false:"account"in e&&"connector"in e&&"disconnect"in e}n(V,"isWalletSession");function j(e,t={}){let{commitment:r}=t,a=e.account.address;if(e.signTransaction){let i=e.signTransaction.bind(e);return {mode:"partial",signer:Object.freeze({address:a,async modifyAndSignTransactions(g){let y=[];for(let T of g){let m=T,s=await i(m);if(!s.signatures[a])throw new Error("Wallet did not populate the expected fee payer signature.");let o=Object.freeze({...m,messageBytes:s.messageBytes,signatures:Object.freeze({...m.signatures,...s.signatures})});y.push(o);}return Object.freeze(y)},async signTransactions(g){let y=await this.modifyAndSignTransactions(g);return Object.freeze(y.map(T=>{let m=T.signatures[a];if(!m)throw new Error("Expected signer to produce a signature for the provided address.");return Object.freeze({[a]:m})}))}})}}if(e.sendTransaction){let i=getBase58Encoder(),l=e.sendTransaction.bind(e);return {mode:"send",signer:Object.freeze({address:a,async signAndSendTransactions(y){let T=[];for(let m of y){let s=await l(m,r?{commitment:r}:void 0),c=i.encode(s);T.push(signatureBytes(c));}return T}})}}throw new Error("Wallet session does not support signing or sending transactions.")}n(j,"createWalletTransactionSigner");function q(e){return isTransactionPartialSigner(e)?"partial":isTransactionSendingSigner(e)?"send":"partial"}n(q,"resolveSignerMode");function Kn(e){return typeof e=="string"?address(e):e}n(Kn,"ensureAddress");async function $n(e,t,r){if(r)return r;let{value:a}=await e.rpc.getLatestBlockhash({commitment:t}).send();return a}n($n,"resolveLifetime");function Jn(e,t){if(V(e)){let{signer:r,mode:a}=j(e,{commitment:t});return {mode:a,signer:r}}return {mode:q(e),signer:e}}n(Jn,"resolveSigner");function Gn(e){return z.fromLamports(e)}n(Gn,"toLamportAmount");function ke(e){async function t(i){let l=i.commitment,g=await $n(e,l,i.lifetime),{signer:y,mode:T}=Jn(i.authority,l),m=Kn(i.destination),s=Gn(i.amount),c=pipe(createTransactionMessage({version:i.transactionVersion??0}),o=>setTransactionMessageFeePayer(y.address,o),o=>setTransactionMessageLifetimeUsingBlockhash(g,o),o=>appendTransactionMessageInstruction(getTransferSolInstruction({amount:s,destination:m,source:y}),o));return {commitment:l,lifetime:g,message:c,mode:T,signer:y,plan:singleTransactionPlan(c)}}n(t,"prepareTransfer");async function r(i,l={}){if(i.mode==="send"&&isTransactionSendingSigner(i.signer)){let s=await signAndSendTransactionMessageWithSigners(i.message,{abortSignal:l.abortSignal,minContextSlot:l.minContextSlot}),c=getBase58Decoder();return signature(c.decode(s))}let g=l.commitment??i.commitment,y=l.maxRetries===void 0?void 0:typeof l.maxRetries=="bigint"?l.maxRetries:BigInt(l.maxRetries),T=null;if(await createTransactionPlanExecutor({async executeTransactionMessage(s,c={}){let o=await signTransactionMessageWithSigners(s,{abortSignal:c.abortSignal??l.abortSignal,minContextSlot:l.minContextSlot}),p=getBase64EncodedWireTransaction(o),u=await e.rpc.sendTransaction(p,{encoding:"base64",maxRetries:y,preflightCommitment:g,skipPreflight:l.skipPreflight}).send({abortSignal:c.abortSignal??l.abortSignal});return T=signature(u),{transaction:o}}})(i.plan??singleTransactionPlan(i.message),{abortSignal:l.abortSignal}),!T)throw new Error("Failed to resolve transaction signature.");return T}n(r,"sendPreparedTransfer");async function a(i,l){let g=await t(i);return await r(g,l)}return n(a,"sendTransfer"),{prepareTransfer:t,sendPreparedTransfer:r,sendTransfer:a}}n(ke,"createSolTransferHelper");function K(e,t){if(e)return typeof e=="string"?address(e):e;if(!t)throw new Error("An address value was expected but not provided.");return t}n(K,"ensureAddress");async function fr(e,t,r){if(r)return r;let{value:a}=await e.rpc.getLatestBlockhash({commitment:t}).send();return a}n(fr,"resolveLifetime");function gr(e,t){if(V(e)){let{signer:r,mode:a}=j(e,{commitment:t});return {mode:a,signer:r}}return {mode:q(e),signer:e}}n(gr,"resolveSigner");function Pe(e,t){let r=K(t.mint),a=K(t.tokenProgram,address(TOKEN_PROGRAM_ADDRESS)),i=t.decimals,l;async function g(p){return i!==void 0||(i=(await fetchMint(e.rpc,r,{commitment:p})).data.decimals),i}n(g,"resolveDecimals");async function y(p){if(l)return l;let u=await g(p);return l=te(u),l}n(y,"getTokenMath");async function T(p){let[u]=await findAssociatedTokenPda({mint:r,owner:K(p),tokenProgram:a});return u}n(T,"deriveAssociatedTokenAddress");async function m(p,u){let C=await T(p),w=await g(u);try{let{value:b}=await e.rpc.getTokenAccountBalance(C,{commitment:u}).send(),h=(await y(u)).fromBaseUnits(b.amount,"balance"),f=b.uiAmountString??b.amount;return {amount:h,ataAddress:C,decimals:w,exists:!0,uiAmount:f}}catch{return {amount:0n,ataAddress:C,decimals:w,exists:false,uiAmount:"0"}}}n(m,"fetchBalance");async function s(p){let u=p.commitment,C=await fr(e,u,p.lifetime),{signer:w,mode:b}=gr(p.authority,u),d=K(p.sourceOwner,w.address),h=K(p.destinationOwner),f=K(p.sourceToken,await T(d)),S=K(p.destinationToken,await T(h)),k=await y(u),R=await g(u),P=p.amountInBaseUnits?k.fromBaseUnits(p.amount,"amount"):k.fromDecimal(p.amount,{label:"amount"}),x=[];if(p.ensureDestinationAta??true){let{value:O}=await e.rpc.getAccountInfo(S,{commitment:u,dataSlice:{length:0,offset:0},encoding:"base64"}).send();O||x.push(getCreateAssociatedTokenInstruction({ata:S,mint:r,owner:h,payer:w,tokenProgram:a}));}x.push(getTransferCheckedInstruction({amount:P,authority:w,decimals:R,destination:S,mint:r,source:f}));let W=pipe(createTransactionMessage({version:p.transactionVersion??0}),O=>setTransactionMessageFeePayer(w.address,O),O=>setTransactionMessageLifetimeUsingBlockhash(C,O));for(let O of x)W=appendTransactionMessageInstruction(O,W);return {amount:P,commitment:u,decimals:R,destinationAta:S,lifetime:C,message:W,mode:b,signer:w,sourceAta:f,plan:singleTransactionPlan(W)}}n(s,"prepareTransfer");async function c(p,u={}){if(p.mode==="send"&&isTransactionSendingSigner(p.signer)){let h=await signAndSendTransactionMessageWithSigners(p.message,{abortSignal:u.abortSignal,minContextSlot:u.minContextSlot}),f=getBase58Decoder();return signature(f.decode(h))}let C=u.commitment??p.commitment,w=u.maxRetries===void 0?void 0:typeof u.maxRetries=="bigint"?u.maxRetries:BigInt(u.maxRetries),b=null;if(await createTransactionPlanExecutor({async executeTransactionMessage(h,f={}){let S=await signTransactionMessageWithSigners(h,{abortSignal:f.abortSignal??u.abortSignal,minContextSlot:u.minContextSlot}),k=getBase64EncodedWireTransaction(S),R=await e.rpc.sendTransaction(k,{encoding:"base64",maxRetries:w,preflightCommitment:C,skipPreflight:u.skipPreflight}).send({abortSignal:f.abortSignal??u.abortSignal});return b=signature(R),{transaction:S}}})(p.plan??singleTransactionPlan(p.message),{abortSignal:u.abortSignal}),!b)throw new Error("Failed to resolve transaction signature.");return b}n(c,"sendPreparedTransfer");async function o(p,u){let C=await s(p);try{return await c(C,u)}catch(w){if(isSolanaError(w,SOLANA_ERROR__TRANSACTION_ERROR__ALREADY_PROCESSED)){let b=await s({...p,lifetime:void 0});return await c(b,u)}throw w}}return n(o,"sendTransfer"),{deriveAssociatedTokenAddress:T,fetchBalance:m,prepareTransfer:s,sendPreparedTransfer:c,sendTransfer:o}}n(Pe,"createSplTokenHelper");var it="Stake11111111111111111111111111111111111111",st="SysvarC1ock11111111111111111111111111111111",ct="SysvarStakeHistory1111111111111111111111111",Pr="StakeConfig11111111111111111111111111111111",lt=200;function ie(e){return typeof e=="string"?address(e):e}n(ie,"ensureAddress");async function Be(e,t,r){if(r)return r;let{value:a}=await e.rpc.getLatestBlockhash({commitment:t}).send();return a}n(Be,"resolveLifetime");function Ue(e,t){if(V(e)){let{signer:r,mode:a}=j(e,{commitment:t});return {mode:a,signer:r}}return {mode:q(e),signer:e}}n(Ue,"resolveSigner");function ut(e){return z.fromLamports(e)}n(ut,"toLamportAmount");function Fe(e){async function t(c){let o=c.commitment,p=await Be(e,o,c.lifetime),{signer:u,mode:C}=Ue(c.authority,o),w=ie(c.validatorId),b=ut(c.amount),h=await e.rpc.getMinimumBalanceForRentExemption(BigInt(lt)).send()+b,f=await generateKeyPairSigner(),S=getCreateAccountInstruction({payer:u,newAccount:f,lamports:h,space:BigInt(lt),programAddress:it}),k=getInitializeInstruction({stake:f.address,arg0:{staker:u.address,withdrawer:u.address},arg1:{unixTimestamp:0n,epoch:0n,custodian:u.address}}),R=getDelegateStakeInstruction({stake:f.address,vote:w,stakeHistory:ct,unused:Pr,stakeAuthority:u}),P=pipe(createTransactionMessage({version:c.transactionVersion??0}),x=>setTransactionMessageFeePayer(u.address,x),x=>setTransactionMessageLifetimeUsingBlockhash(p,x),x=>appendTransactionMessageInstructions([S,k,R],x));return {commitment:o,lifetime:p,message:P,mode:C,signer:u,stakeAccount:f,plan:singleTransactionPlan(P)}}n(t,"prepareStake");async function r(c,o={}){if(c.mode==="send"&&isTransactionSendingSigner(c.signer)){let b=await signAndSendTransactionMessageWithSigners(c.message,{abortSignal:o.abortSignal,minContextSlot:o.minContextSlot}),d=getBase58Decoder();return signature(d.decode(b))}let p=o.commitment??c.commitment,u=o.maxRetries===void 0?void 0:typeof o.maxRetries=="bigint"?o.maxRetries:BigInt(o.maxRetries),C=null;if(await createTransactionPlanExecutor({async executeTransactionMessage(b,d={}){let h=await signTransactionMessageWithSigners(b,{abortSignal:d.abortSignal??o.abortSignal,minContextSlot:o.minContextSlot}),f=getBase64EncodedWireTransaction(h),S=await e.rpc.sendTransaction(f,{encoding:"base64",maxRetries:u,preflightCommitment:p,skipPreflight:o.skipPreflight}).send({abortSignal:d.abortSignal??o.abortSignal});return C=signature(S),{transaction:h}}})(c.plan??singleTransactionPlan(c.message),{abortSignal:o.abortSignal}),!C)throw new Error("Failed to resolve transaction signature.");return C}n(r,"sendPreparedStake");async function a(c,o){let p=await t(c);return await r(p,o)}n(a,"sendStake");async function i(c){let o=c.commitment,p=await Be(e,o,c.lifetime),{signer:u,mode:C}=Ue(c.authority,o),w=ie(c.stakeAccount),b=getDeactivateInstruction({stake:w,clockSysvar:st,stakeAuthority:u}),d=pipe(createTransactionMessage({version:c.transactionVersion??0}),h=>setTransactionMessageFeePayer(u.address,h),h=>setTransactionMessageLifetimeUsingBlockhash(p,h),h=>appendTransactionMessageInstructions([b],h));return {commitment:o,lifetime:p,message:d,mode:C,signer:u,plan:singleTransactionPlan(d)}}n(i,"prepareUnstake");async function l(c,o={}){if(c.mode==="send"&&isTransactionSendingSigner(c.signer)){let b=await signAndSendTransactionMessageWithSigners(c.message,{abortSignal:o.abortSignal,minContextSlot:o.minContextSlot}),d=getBase58Decoder();return signature(d.decode(b))}let p=o.commitment??c.commitment,u=o.maxRetries===void 0?void 0:typeof o.maxRetries=="bigint"?o.maxRetries:BigInt(o.maxRetries),C=null;if(await createTransactionPlanExecutor({async executeTransactionMessage(b,d={}){let h=await signTransactionMessageWithSigners(b,{abortSignal:d.abortSignal??o.abortSignal,minContextSlot:o.minContextSlot}),f=getBase64EncodedWireTransaction(h),S=await e.rpc.sendTransaction(f,{encoding:"base64",maxRetries:u,preflightCommitment:p,skipPreflight:o.skipPreflight}).send({abortSignal:d.abortSignal??o.abortSignal});return C=signature(S),{transaction:h}}})(c.plan),!C)throw new Error("Failed to resolve transaction signature.");return C}n(l,"sendPreparedUnstake");async function g(c,o){let p=await i(c);return await l(p,o)}n(g,"sendUnstake");async function y(c){let o=c.commitment,p=await Be(e,o,c.lifetime),{signer:u,mode:C}=Ue(c.authority,o),w=ie(c.stakeAccount),b=ie(c.destination),d=ut(c.amount),h=getWithdrawInstruction({stake:w,recipient:b,clockSysvar:st,stakeHistory:ct,withdrawAuthority:u,args:d}),f=pipe(createTransactionMessage({version:c.transactionVersion??0}),S=>setTransactionMessageFeePayer(u.address,S),S=>setTransactionMessageLifetimeUsingBlockhash(p,S),S=>appendTransactionMessageInstructions([h],S));return {commitment:o,lifetime:p,message:f,mode:C,signer:u,plan:singleTransactionPlan(f)}}n(y,"prepareWithdraw");async function T(c,o={}){if(c.mode==="send"&&isTransactionSendingSigner(c.signer)){let b=await signAndSendTransactionMessageWithSigners(c.message,{abortSignal:o.abortSignal,minContextSlot:o.minContextSlot}),d=getBase58Decoder();return signature(d.decode(b))}let p=o.commitment??c.commitment,u=o.maxRetries===void 0?void 0:typeof o.maxRetries=="bigint"?o.maxRetries:BigInt(o.maxRetries),C=null;if(await createTransactionPlanExecutor({async executeTransactionMessage(b,d={}){let h=await signTransactionMessageWithSigners(b,{abortSignal:d.abortSignal??o.abortSignal,minContextSlot:o.minContextSlot}),f=getBase64EncodedWireTransaction(h),S=await e.rpc.sendTransaction(f,{encoding:"base64",maxRetries:u,preflightCommitment:p,skipPreflight:o.skipPreflight}).send({abortSignal:d.abortSignal??o.abortSignal});return C=signature(S),{transaction:h}}})(c.plan),!C)throw new Error("Failed to resolve transaction signature.");return C}n(T,"sendPreparedWithdraw");async function m(c,o){let p=await y(c);return await T(p,o)}n(m,"sendWithdraw");async function s(c,o){let p=typeof c=="string"?c:String(c),u=await e.rpc.getProgramAccounts(it,{encoding:"jsonParsed",filters:[{memcmp:{offset:44n,bytes:p,encoding:"base58"}}]}).send();if(!o)return u;let C=typeof o=="string"?o:String(o);return u.filter(w=>{let b=w.account?.data;return b&&"parsed"in b?b.parsed?.info?.stake?.delegation?.voter===C:false})}return n(s,"getStakeAccounts"),{getStakeAccounts:s,prepareStake:t,prepareUnstake:i,prepareWithdraw:y,sendPreparedStake:r,sendPreparedUnstake:l,sendPreparedWithdraw:T,sendStake:a,sendUnstake:g,sendWithdraw:m}}n(Fe,"createStakeHelper");function Y(e){return "messageBytes"in e?getBase64EncodedWireTransaction(e):getBase64EncodedWireTransaction(compileTransaction(e))}n(Y,"transactionToBase64");async function Rr(e){if("messageBytes"in e)return Y(e);let t=await partiallySignTransactionMessageWithSigners(e);return Y(t)}n(Rr,"transactionToBase64WithSigners");var vr=1.1,mt=2e5,gt=14e5;function Ir(e){return e.programAddress===COMPUTE_BUDGET_PROGRAM_ADDRESS&&e.data?.[0]===2}n(Ir,"isComputeUnitLimitInstruction");function Mr(e){let t=e;for(;isSolanaError(t);){if(isSolanaError(t,SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED))return true;t=t.cause;}return false}n(Mr,"didExceedComputeBudget");async function Er(e,t){let r=t;if(!(t.lifetimeConstraint!==void 0)){let l=await e.getLatestBlockhash().send();r=setTransactionMessageLifetimeUsingBlockhash(l.value,t);}let i=Y(r);try{let{value:l}=await e.simulateTransaction(i,{encoding:"base64",replaceRecentBlockhash:!1,sigVerify:!1}).send();return Number(l.unitsConsumed??0)||0}catch(l){if(Mr(l))return gt;throw l}}n(Er,"estimateComputeUnits");async function ne(e){let t=e.computeUnitLimitMultiplier??vr,r=e.blockhashReset!==false,a=e.computeUnitLimitReset??false,i=e.transaction,l=i.instructions.findIndex(Ir);if(l===-1||a){let y=await Er(e.rpc,i),T=y?Math.ceil(y*t):mt,m=Math.min(gt,Math.max(mt,Math.max(1,T))),s=getSetComputeUnitLimitInstruction({units:m});if(l===-1)i=appendTransactionMessageInstruction(s,i);else {let c=[...i.instructions];c.splice(l,1,s),i=Object.freeze({...i,instructions:Object.freeze(c)});}}let g=i.lifetimeConstraint!==void 0;if(r||!g){let y=await e.rpc.getLatestBlockhash().send();g?r&&(i=Object.freeze({...i,lifetimeConstraint:y.value})):i=setTransactionMessageLifetimeUsingBlockhash(y.value,i),g=true;}return e.logRequest&&e.logRequest({base64WireTransaction:Y(i)}),i}n(ne,"prepareTransaction");function Zr(e){return typeof e=="string"?address(e):e}n(Zr,"toAddress");function Yr(e){return e.some(t=>isInstructionForProgram(t,COMPUTE_BUDGET_PROGRAM_ADDRESS)&&isInstructionWithData(t)&&t.data[0]===ComputeBudgetInstruction.SetComputeUnitLimit)}n(Yr,"hasSetComputeUnitLimitInstruction");function Xr(e){return e.some(t=>isInstructionForProgram(t,COMPUTE_BUDGET_PROGRAM_ADDRESS)&&isInstructionWithData(t)&&t.data[0]===ComputeBudgetInstruction.SetComputeUnitPrice)}n(Xr,"hasSetComputeUnitPriceInstruction");function Qr(e){return !!("addressTableLookup"in e&&e.addressTableLookup!=null||"addressTableLookups"in e&&Array.isArray(e.addressTableLookups)&&e.addressTableLookups.length>0)}n(Qr,"instructionUsesAddressLookup");function ea(e,t){return e&&e!=="auto"?e:t.some(Qr)?0:"legacy"}n(ea,"resolveVersion");function ta(e,t){return e.commitment??t()}n(ta,"normaliseCommitment");function na(e,t){if(!e&&!t)throw new Error("A fee payer must be provided via `feePayer` or `authority`.");if(e&&typeof e=="object"&&"address"in e)return {address:e.address,signer:e};if(e){let a=Zr(e);return t&&t.address===a?{address:a,signer:t}:{address:a}}if(!t)throw new Error("Unable to resolve authority signer for the fee payer.");return {address:t.address,signer:t}}n(na,"resolveFeePayerAddress");function ra(e,t){let r=e.computeUnitLimit;if(!(r===void 0||Yr(t)))return typeof r=="bigint"?r:BigInt(Math.floor(r))}n(ra,"resolveComputeUnitLimit");function aa(e,t){if(!(e.computeUnitPrice===void 0||Xr(t)))return typeof e.computeUnitPrice=="bigint"?e.computeUnitPrice:BigInt(Math.floor(e.computeUnitPrice))}n(aa,"resolveComputeUnitPrice");async function Ct(e,t){if(!e.instructions.length)throw new Error("Add at least one instruction before preparing a transaction.");let{getFallbackCommitment:r,runtime:a}=t;e.abortSignal?.throwIfAborted();let i=ta(e,r),l,g="partial";if(e.authority)if(V(e.authority)){let{signer:b,mode:d}=j(e.authority,{commitment:i});l=b,g=d;}else l=e.authority,g=q(l);let{address:y,signer:T}=na(e.feePayer,l);g==="send"&&(!T||!isTransactionSendingSigner(T))&&(g="partial");let m=[...e.instructions],s=ea(e.version,m),c=e.lifetime??(await a.rpc.getLatestBlockhash({commitment:i}).send({abortSignal:e.abortSignal})).value;e.abortSignal?.throwIfAborted();let o=ra(e,m),p=aa(e,m),u=[];o!==void 0&&u.push(getSetComputeUnitLimitInstruction({units:Number(o)})),p!==void 0&&u.push(getSetComputeUnitPriceInstruction({microLamports:Number(p)}));let C=[...u,...m];return Object.freeze({commitment:i,computeUnitLimit:o,computeUnitPrice:p,createTransactionMessage:n(async()=>pipe(createTransactionMessage({version:s}),b=>T?setTransactionMessageFeePayerSigner(T,b):setTransactionMessageFeePayer(y,b),b=>setTransactionMessageLifetimeUsingBlockhash(c,b)),"createMessage"),feePayer:y,instructionPlan:getMessagePackerInstructionPlanFromInstructions(C),instructions:Object.freeze(m),lifetime:c,mode:g,version:s})}n(Ct,"createTransactionRecipe");function oa(e){if(e.kind!=="single")throw new Error("Transaction recipe produced a multi-transaction plan which is not supported.");return e}n(oa,"assertSingleTransactionPlan");function _e(e,t){async function r(m){let s=await Ct(m,{getFallbackCommitment:t,runtime:e}),o=await createTransactionPlanner({createTransactionMessage:s.createTransactionMessage})(s.instructionPlan,{abortSignal:m.abortSignal}),p=oa(o);return Object.freeze({commitment:s.commitment,computeUnitLimit:s.computeUnitLimit,computeUnitPrice:s.computeUnitPrice,feePayer:s.feePayer,instructions:s.instructions,lifetime:s.lifetime,message:p.message,mode:s.mode,plan:o,version:s.version})}n(r,"prepare");async function a(m,s={}){return await signTransactionMessageWithSigners(m.message,{abortSignal:s.abortSignal,minContextSlot:s.minContextSlot})}n(a,"sign");async function i(m,s={}){let c=await a(m,s);return getBase64EncodedWireTransaction(c)}n(i,"toWire");async function l(m,s={}){return !m.plan||m.mode==="send"?g(m,s):y(m,s)}n(l,"send");async function g(m,s){let c=s.commitment??m.commitment;if(m.mode==="send"){let w=await signAndSendTransactionMessageWithSigners(m.message,{abortSignal:s.abortSignal,minContextSlot:s.minContextSlot}),b=getBase58Decoder();return signature(b.decode(w))}let o=await a(m,{abortSignal:s.abortSignal,minContextSlot:s.minContextSlot}),p=getBase64EncodedWireTransaction(o),u=s.maxRetries===void 0?void 0:typeof s.maxRetries=="bigint"?s.maxRetries:BigInt(s.maxRetries),C=await e.rpc.sendTransaction(p,{encoding:"base64",maxRetries:u,preflightCommitment:c,skipPreflight:s.skipPreflight}).send({abortSignal:s.abortSignal});return signature(C)}n(g,"sendDirect");async function y(m,s){if(!m.plan)return g(m,s);let c=s.commitment??m.commitment,o=s.maxRetries===void 0?void 0:typeof s.maxRetries=="bigint"?s.maxRetries:BigInt(s.maxRetries),p=null;if(await createTransactionPlanExecutor({async executeTransactionMessage(C,w={}){let b=await signTransactionMessageWithSigners(C,{abortSignal:w.abortSignal??s.abortSignal,minContextSlot:s.minContextSlot}),d=getBase64EncodedWireTransaction(b),h=await e.rpc.sendTransaction(d,{encoding:"base64",maxRetries:o,preflightCommitment:c,skipPreflight:s.skipPreflight}).send({abortSignal:w.abortSignal??s.abortSignal});return p=signature(h),{transaction:b}}})(m.plan,{abortSignal:s.abortSignal}),!p)throw new Error("Failed to resolve transaction signature.");return p}n(y,"sendWithExecutor");async function T(m,s={}){let{prepareTransaction:c,...o}=m,p=await r(o);if(c===false)return l(p,s);let u=c??{},C=await ne({blockhashReset:u.blockhashReset??false,...u,rpc:e.rpc,transaction:p.message}),w=Object.freeze({...p,message:C,plan:singleTransactionPlan(C)});return l(w,s)}return n(T,"prepareAndSend"),Object.freeze({prepare:r,sign:a,toWire:i,send:l,prepareAndSend:T})}n(_e,"createTransactionHelper");function _(e,t,r){if(e.commitment!==void 0)return e;let a=r??t();return {...e,commitment:a}}n(_,"withDefaultCommitment");function ia(e,t){return {prepareTransfer:n(r=>e.prepareTransfer(_(r,t)),"prepareTransfer"),sendPreparedTransfer:e.sendPreparedTransfer,sendTransfer:n((r,a)=>e.sendTransfer(_(r,t),a),"sendTransfer")}}n(ia,"wrapSolTransferHelper");function sa(e,t,r){let a=n(i=>i??r??t(),"resolveCommitment");return {deriveAssociatedTokenAddress:e.deriveAssociatedTokenAddress,fetchBalance:n((i,l)=>e.fetchBalance(i,a(l)),"fetchBalance"),prepareTransfer:n(i=>e.prepareTransfer(_(i,t,r)),"prepareTransfer"),sendPreparedTransfer:e.sendPreparedTransfer,sendTransfer:n((i,l)=>e.sendTransfer(_(i,t,r),l),"sendTransfer")}}n(sa,"wrapSplTokenHelper");function ca(e,t){return {getStakeAccounts:e.getStakeAccounts,prepareStake:n(r=>e.prepareStake(_(r,t)),"prepareStake"),prepareUnstake:n(r=>e.prepareUnstake(_(r,t)),"prepareUnstake"),prepareWithdraw:n(r=>e.prepareWithdraw(_(r,t)),"prepareWithdraw"),sendPreparedStake:e.sendPreparedStake,sendPreparedUnstake:e.sendPreparedUnstake,sendPreparedWithdraw:e.sendPreparedWithdraw,sendStake:n((r,a)=>e.sendStake(_(r,t),a),"sendStake"),sendUnstake:n((r,a)=>e.sendUnstake(_(r,t),a),"sendUnstake"),sendWithdraw:n((r,a)=>e.sendWithdraw(_(r,t),a),"sendWithdraw")}}n(ca,"wrapStakeHelper");function se(e){if(e!=null)return typeof e=="string"?e:typeof e=="object"&&"toString"in e?String(e.toString()):JSON.stringify(e)}n(se,"normaliseConfigValue");function la(e){return JSON.stringify({associatedTokenProgram:se(e.associatedTokenProgram),commitment:se(e.commitment),decimals:e.decimals,mint:se(e.mint),tokenProgram:se(e.tokenProgram)})}n(la,"serialiseSplConfig");function kt(e,t){let r=n(()=>t.getState().cluster.commitment,"getFallbackCommitment"),a=new Map,i,l,g,y=n(()=>(i||(i=ia(ke(e),r)),i),"getSolTransfer"),T=n(()=>(l||(l=ca(Fe(e),r)),l),"getStake"),m=n(()=>(g||(g=_e(e,r)),g),"getTransaction");function s(o){let p=la(o),u=a.get(p);if(u)return u.scoped;let C=Pe(e,o),w=sa(C,r,o.commitment);return a.set(p,{baseCommitment:o.commitment,scoped:w}),w}return n(s,"getSplTokenHelper"),Object.freeze({get solTransfer(){return y()},splToken:s,get stake(){return T()},get transaction(){return m()},prepareTransaction:n(o=>ne({...o,rpc:e.rpc}),"prepareTransactionWithRuntime")})}n(kt,"createClientHelpers");function pa(){return {status:"idle"}}n(pa,"createClusterStatus");function ce(e){let{commitment:t,endpoint:r,websocketEndpoint:a}=e,i=Date.now();return me({accounts:{},cluster:{commitment:t,endpoint:r,status:pa(),websocketEndpoint:a},lastUpdatedAt:i,subscriptions:{account:{},signature:{}},transactions:{},wallet:{status:"disconnected"}})}n(ce,"createInitialClientState");function le(e){return createStore(()=>e)}n(le,"createClientStore");function da(e){return le(ce(e))}n(da,"createDefaultClientStore");function Pt({logger:e,runtime:t,store:r}){let a=e??G();function i(o,p,u){r.setState(C=>({...C,lastUpdatedAt:L(),subscriptions:{...C.subscriptions,[o]:{...C.subscriptions[o],[p]:u}}}));}n(i,"setSubscriptionStatus");function l(o,p){i(o,p,{status:"inactive"});}n(l,"onAbort");function g(o,p,u){function C(){u.abort(),l(o,p);}return n(C,"abort"),{abort:C}}n(g,"createSubscriptionHandle");async function y(o,p,u){let C=o.commitment??r.getState().cluster.commitment,w=t.rpcSubscriptions.accountNotifications(o.address,{commitment:C}),b=o.address.toString();i("account",b,{status:"activating"}),u.signal.addEventListener("abort",()=>l("account",b));try{let d=await w.subscribe({abortSignal:u.signal});i("account",b,{status:"active"});for await(let h of d){let f=h.value?.lamports??null,S=h.context?.slot??null,k={address:o.address,data:h.value?.data,error:void 0,fetching:!1,lamports:f,lastFetchedAt:L(),slot:S};p(k),r.setState(R=>({...R,accounts:{...R.accounts,[b]:k},lastUpdatedAt:L()}));}}catch(d){u.signal.aborted||(a({data:{address:b,...B(d)},level:"error",message:"account subscription failed"}),i("account",b,{error:d,status:"error"}));}}n(y,"handleAccountNotifications");function T(o,p){let u=new AbortController;return y(o,p,u).catch(C=>{u.signal.aborted||a({data:{address:o.address.toString(),...B(C)},level:"error",message:"account watcher error"});}),g("account",o.address.toString(),u)}n(T,"watchAccount");function m(o,p){return T(o,u=>{u.lamports!==null&&p(u.lamports);})}n(m,"watchBalance");async function s(o,p,u){let C=o.commitment??r.getState().cluster.commitment,w=t.rpcSubscriptions.signatureNotifications(o.signature,{commitment:C,enableReceivedNotification:o.enableReceivedNotification}),b=o.signature.toString();i("signature",b,{status:"activating"}),u.signal.addEventListener("abort",()=>l("signature",b));try{let d=await w.subscribe({abortSignal:u.signal});i("signature",b,{status:"active"});for await(let h of d)p(h),r.setState(f=>({...f,lastUpdatedAt:L(),transactions:{...f.transactions,[b]:{lastUpdatedAt:L(),signature:o.signature,status:"waiting"}}}));}catch(d){u.signal.aborted||(a({data:{signature:b,...B(d)},level:"error",message:"signature subscription failed"}),i("signature",b,{error:d,status:"error"}));}}n(s,"handleSignatureNotifications");function c(o,p){let u=new AbortController;return s(o,p,u).catch(C=>{u.signal.aborted||a({data:{signature:o.signature.toString(),...B(C)},level:"error",message:"signature watcher error"});}),g("signature",o.signature.toString(),u)}return n(c,"watchSignature"),{watchAccount:T,watchBalance:m,watchSignature:c}}n(Pt,"createWatchers");function Ne(e){let t=e.initialState?ge(e,e.initialState):e,r=ee({endpoint:t.rpc??t.endpoint,moniker:t.cluster,websocketEndpoint:t.websocket??t.websocketEndpoint}),a=t.commitment??"confirmed",i=ce({commitment:a,endpoint:r.endpoint,websocketEndpoint:r.websocketEndpoint}),l=e.createStore?e.createStore(i):le(i),g=t.rpcClient??Q({commitment:a,endpoint:r.endpoint,websocketEndpoint:r.websocketEndpoint}),y={rpc:g.rpc,rpcSubscriptions:g.rpcSubscriptions},T=Se(t.walletConnectors??[]),m=G(t.logger),s=Qe({connectors:T,logger:m,runtime:y,store:l}),c=Pt({logger:m,runtime:y,store:l}),o=kt(y,l);l.setState(u=>({...u,cluster:{...u.cluster,status:{status:"connecting"}},lastUpdatedAt:L()})),s.setCluster(r.endpoint,{commitment:a,websocketEndpoint:r.websocketEndpoint}).catch(u=>m({data:B(u),level:"error",message:"initial cluster setup failed"}));function p(){l.setState(()=>i);}return n(p,"destroy"),{actions:s,config:e,connectors:T,destroy:p,get helpers(){return o},runtime:y,store:l,get solTransfer(){return o.solTransfer},get SolTransfer(){return o.solTransfer},splToken:o.splToken,SplToken:o.splToken,SplHelper:o.splToken,get stake(){return o.stake},get transaction(){return o.transaction},prepareTransaction:o.prepareTransaction,watchers:c}}n(Ne,"createClient");var ka=getBase58Decoder(),Pa=getTransactionDecoder(),At=getTransactionEncoder();function wa(e){return `wallet-standard:${e.name.toLowerCase().replace(/[^a-z0-9]+/g,"-")}`}n(wa,"deriveConnectorId");function Aa(e){let t=e[0];if(!t)throw new Error("Wallet returned no accounts.");return t}n(Aa,"getPrimaryAccount");function Ra(e){if(e==="processed"||e==="confirmed"||e==="finalized")return e}n(Ra,"mapCommitment");function ze(e){return {address:address(e.address),label:e.label,publicKey:new Uint8Array(e.publicKey)}}n(ze,"toSessionAccount");function Rt(e){let[t]=e.chains??[];return t}n(Rt,"getChain");async function xt(e){let t=e.features[StandardDisconnect];t&&await t.disconnect();}n(xt,"disconnectWallet");function re(e,t={}){let r={canAutoConnect:t.canAutoConnect??!!e.features[StandardConnect],icon:t.icon??e.icon,id:t.id??wa(e),kind:t.kind??"wallet-standard",name:t.name??e.name,ready:typeof window<"u"};async function a(g={}){let y=e.features[StandardConnect],T=e.features[StandardEvents],m=!!g.autoConnect,s=g.allowInteractiveFallback??true,c=e.accounts;if(y){let P=n(async x=>y.connect({silent:x}),"connectWithMode");try{let{accounts:x}=await P(m);x.length&&(c=x);}catch(x){if(!m||!s)throw x;let{accounts:W}=await P(false);W.length&&(c=W);}}let o=Aa(c),p=ze(o),u=e.features[SolanaSignMessage],C=e.features[SolanaSignTransaction],w=e.features[SolanaSignAndSendTransaction],b=t.defaultChain??Rt(o),d=u?async P=>{let[x]=await u.signMessage({account:o,message:P});return x.signature}:void 0,h=C?async P=>{let x=new Uint8Array(At.encode(P)),W=b?{account:o,chain:b,transaction:x}:{account:o,transaction:x},[O]=await C.signTransaction(W);return Pa.decode(O.signedTransaction)}:void 0,f=w?async(P,x)=>{let W=new Uint8Array(At.encode(P)),O=t.defaultChain??Rt(o)??"solana:mainnet-beta",[de]=await w.signAndSendTransaction({account:o,chain:O,options:{commitment:Ra(x?.commitment)},transaction:W});return ka.decode(de.signature)}:void 0;async function S(){k?.(),await xt(e);}n(S,"disconnectSession");let k,R=T?P=>T.on("change",({accounts:W})=>{if(W){if(!W.length){P([]);return}o=W[0],p=ze(o),P(W.map(ze));}}):void 0;return {account:p,connector:r,disconnect:S,onAccountsChanged:R?P=>(k=R(P),()=>{k?.(),k=void 0;}):void 0,sendTransaction:f,signMessage:d,signTransaction:h}}n(a,"connect");async function i(){await xt(e);}n(i,"disconnect");function l(){return typeof window<"u"}return n(l,"isSupported"),{...r,connect:a,disconnect:i,isSupported:l}}n(re,"createWalletStandardConnector");function Wt(e,t){return re(e,t?.(e))}n(Wt,"mapWalletToConnector");function xa(e={}){let{get:t}=getWallets(),r=t().map(i=>Wt(i,e.overrides)),a=new Set;return r.filter(i=>a.has(i.id)?false:(a.add(i.id),true))}n(xa,"getWalletStandardConnectors");function La(e,t={}){let{get:r,on:a}=getWallets(),i=n(()=>{let y=r().map(s=>Wt(s,t.overrides)),T=new Set,m=y.filter(s=>T.has(s.id)?false:(T.add(s.id),true));e(m);},"emit");i();let l=a("register",i),g=a("unregister",i);return ()=>{l(),g();}}n(La,"watchWalletStandardConnectors");function X(e={}){let{get:t}=getWallets(),a=t().filter(l=>e.filter?e.filter(l):true).map(l=>re(l,e.overrides?.(l))),i=new Set;return a.filter(l=>i.has(l.id)?false:(i.add(l.id),true))}n(X,"autoDiscover");function Oa(e){return {canAutoConnect:true,id:"wallet-standard:injected",kind:"wallet-standard",name:"Injected Wallet",ready:typeof window<"u",async connect(){let a=getWallets().get().find(i=>StandardConnect in i.features);if(!a)throw new Error("No Wallet Standard wallets available.");return re(a,e).connect()},async disconnect(){},isSupported(){return typeof window<"u"}}}n(Oa,"injected");function Ve(e){let t=e.toLowerCase();return r=>r.name.toLowerCase().includes(t)}n(Ve,"filterByName");function je(e){return X({filter:Ve("phantom"),overrides:n(()=>({...e,id:"wallet-standard:phantom"}),"overrides")})}n(je,"phantom");function qe(e){return X({filter:Ve("solflare"),overrides:n(()=>({...e,id:"wallet-standard:solflare"}),"overrides")})}n(qe,"solflare");function Ke(e){return X({filter:Ve("backpack"),overrides:n(()=>({...e,id:"wallet-standard:backpack"}),"overrides")})}n(Ke,"backpack");function vt(){return [...je(),...qe(),...Ke(),...X()]}n(vt,"defaultWalletConnectors");function ue(e){if(!e)return;let t=e.trim();return t.length?t:void 0}n(ue,"normalizeUrl");function It(e={}){let{cluster:t,endpoint:r,rpc:a,websocket:i,websocketEndpoint:l,walletConnectors:g,...y}=e,T=ue(a)??ue(r)??ue(e.endpoint),m=ee({endpoint:T,moniker:t??void 0,websocketEndpoint:ue(i??l)}),s=g===void 0||g==="default"?vt():g;return {...y,endpoint:m.endpoint,websocketEndpoint:m.websocketEndpoint,walletConnectors:s}}n(It,"resolveClientConfig");function va(e={}){return Ne(It(e))}n(va,"createDefaultClient");function M(){return {status:"idle"}}n(M,"createInitialAsyncState");function v(e,t={}){return {data:t.data,error:t.error,status:e}}n(v,"createAsyncState");function Ia(e,t){let r=e.authority??t?.();if(!r)throw new Error("Connect a wallet or supply an `authority` before sending SOL transfers.");return {...e,authority:r}}n(Ia,"ensureAuthority");function Ma(e){let t=new Set,r=e.helper,a=e.authorityProvider,i=M();function l(){for(let s of t)s();}n(l,"notify");function g(s){i=s,l();}n(g,"setState");async function y(s,c){let o=Ia(s,a);g(v("loading"));try{let p=await r.sendTransfer(o,c);return g(v("success",{data:p})),p}catch(p){throw g(v("error",{error:p})),p}}n(y,"send");function T(s){return t.add(s),()=>{t.delete(s);}}n(T,"subscribe");function m(){g(M());}return n(m,"reset"),{getHelper:n(()=>r,"getHelper"),getState:n(()=>i,"getState"),reset:m,send:y,subscribe:T}}n(Ma,"createSolTransferController");function Ea(e,t,r){let a=e.authority??t?.();if(!a)throw new Error("Connect a wallet or supply an `authority` before sending SPL tokens.");let i=e.sourceOwner??r?.();if(!i)throw new Error("Unable to resolve a source owner for the SPL token transfer.");return {...e,authority:a,sourceOwner:i}}n(Ea,"ensureTransferConfig");function Ba(e){let t=e.helper,r=e.authorityProvider,a=e.sourceOwnerProvider,i=new Set,l=M();function g(){for(let c of i)c();}n(g,"notify");function y(c){l=c,g();}n(y,"setState");async function T(c,o){let p=Ea(c,c.authority?void 0:r,c.sourceOwner?void 0:a);y(v("loading"));try{let u=await t.sendTransfer(p,o);return y(v("success",{data:u})),u}catch(u){throw y(v("error",{error:u})),u}}n(T,"send");function m(c){return i.add(c),()=>{i.delete(c);}}n(m,"subscribe");function s(){y(M());}return n(s,"reset"),{getHelper:n(()=>t,"getHelper"),getState:n(()=>l,"getState"),reset:s,send:T,subscribe:m}}n(Ba,"createSplTransferController");function Ua(e,t){let r=e.authority??t?.();if(!r)throw new Error("Connect a wallet or supply an `authority` before staking SOL.");return {...e,authority:r}}n(Ua,"ensureAuthority");function Fa(e,t){let r=e.authority??t?.();if(!r)throw new Error("Connect a wallet or supply an `authority` before unstaking SOL.");return {...e,authority:r}}n(Fa,"ensureUnstakeAuthority");function Da(e,t){let r=e.authority??t?.();if(!r)throw new Error("Connect a wallet or supply an `authority` before withdrawing SOL.");return {...e,authority:r}}n(Da,"ensureWithdrawAuthority");function Ha(e){let t=new Set,r=new Set,a=new Set,i=e.helper,l=e.authorityProvider,g=M(),y=M(),T=M();function m(){for(let P of t)P();}n(m,"notify");function s(){for(let P of r)P();}n(s,"notifyUnstake");function c(){for(let P of a)P();}n(c,"notifyWithdraw");function o(P){g=P,m();}n(o,"setState");function p(P){y=P,s();}n(p,"setUnstakeState");function u(P){T=P,c();}n(u,"setWithdrawState");async function C(P,x){let W=Ua(P,l);o(v("loading"));try{let O=await i.sendStake(W,x);return o(v("success",{data:O})),O}catch(O){throw o(v("error",{error:O})),O}}n(C,"stake");async function w(P,x){let W=Fa(P,l);p(v("loading"));try{let O=await i.sendUnstake(W,x);return p(v("success",{data:O})),O}catch(O){throw p(v("error",{error:O})),O}}n(w,"unstake");async function b(P,x){let W=Da(P,l);u(v("loading"));try{let O=await i.sendWithdraw(W,x);return u(v("success",{data:O})),O}catch(O){throw u(v("error",{error:O})),O}}n(b,"withdraw");function d(P){return t.add(P),()=>{t.delete(P);}}n(d,"subscribe");function h(P){return r.add(P),()=>{r.delete(P);}}n(h,"subscribeUnstake");function f(P){return a.add(P),()=>{a.delete(P);}}n(f,"subscribeWithdraw");function S(){o(M());}n(S,"reset");function k(){p(M());}n(k,"resetUnstake");function R(){u(M());}return n(R,"resetWithdraw"),{getHelper:n(()=>i,"getHelper"),getState:n(()=>g,"getState"),getUnstakeState:n(()=>y,"getUnstakeState"),getWithdrawState:n(()=>T,"getWithdrawState"),reset:S,resetUnstake:k,resetWithdraw:R,stake:C,unstake:w,withdraw:b,subscribe:d,subscribeUnstake:h,subscribeWithdraw:f}}n(Ha,"createStakeController");function _a(e){return e.toString()}n(_a,"bigintToJson");function Na(e){return N(e,"bigint")}n(Na,"bigintFromJson");function za(e){return e.toString()}n(za,"lamportsToJson");function Va(e){return Ce(e,"lamports")}n(Va,"lamportsFromJson");var Mt={processed:0,confirmed:1,finalized:2},qa=2e4;function Ka(e){if(e)return typeof e=="string"?signature(e):e}n(Ka,"normalizeSignature");function $a(e){return e?e.confirmationStatus==="processed"||e.confirmationStatus==="confirmed"||e.confirmationStatus==="finalized"?e.confirmationStatus:e.confirmations===null?"finalized":typeof e.confirmations=="number"&&e.confirmations>0?"confirmed":"processed":null}n($a,"deriveConfirmationStatus");function Ja(e,t){return e?Mt[e]>=Mt[t]:false}n(Ja,"confirmationMeetsCommitment");var Xa="MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr";function Qa(e){let t=e.findIndex(r=>r.programAddress!==Xa);if(e.length===0||t===-1)throw new SolanaError(SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR,{cause:"At least one non-memo instruction is required.",index:e.length||t});return t}n(Qa,"ensureNonMemoInstructionIndex");function eo(e,t){return Et([e],t)}n(eo,"insertReferenceKey");function Et(e,t){let r=Qa(t.instructions),a=t.instructions[r],i=[...a.accounts??[],...e.map(g=>({address:g,role:AccountRole.READONLY}))],l=[...t.instructions];return l.splice(r,1,{...a,accounts:i}),Object.freeze({...t,instructions:Object.freeze(l)})}n(Et,"insertReferenceKeys");function pe(e){let t=e,r=new Set;return {getSnapshot:n(()=>t,"getSnapshot"),setSnapshot(a){t=a;for(let i of r)i();},subscribe(a){return r.add(a),()=>{r.delete(a);}}}}n(pe,"createStore");function Bt(e){return Object.freeze([...e])}n(Bt,"freezeInstructions");function to(e){let t=e.helper,r=Bt(e.initialInstructions??[]),a=e.blockhashMaxAgeMs??3e4,i,l=pe(r),g=pe(null),y=pe(M()),T=pe(M());function m(){g.setSnapshot(null),y.setSnapshot(M()),T.setSnapshot(M());}n(m,"resetDerivedState");function s(A){l.setSnapshot(Bt(A)),m();}n(s,"commitInstructions");function c(A){let I=[...l.getSnapshot(),A];s(I);}n(c,"addInstruction");function o(A){if(!A.length)return;let I=[...l.getSnapshot(),...A];s(I);}n(o,"addInstructions");function p(A){s(A);}n(p,"replaceInstructions");function u(){s([]);}n(u,"clearInstructions");function C(A){let I=l.getSnapshot();if(A<0||A>=I.length)return;let U=I.filter((H,E)=>E!==A);s(U);}n(C,"removeInstruction");function w(){s(r);}n(w,"reset");function b(A){if(!A.length)throw new Error("Add at least one instruction before preparing a transaction.")}n(b,"ensureInstructions");function d(){if(i&&!(Date.now()-i.updatedAt>a))return i.value}n(d,"resolveCachedLifetime");async function h(A={}){let{instructions:I,...U}=A,H=I??l.getSnapshot();b(H),y.setSnapshot(v("loading"));try{let E=U.lifetime??d(),$=E&&!U.lifetime?{...U,lifetime:E}:U,J=await t.prepare({...$,instructions:H});return g.setSnapshot(J),y.setSnapshot(v("success",{data:J})),J}catch(E){throw y.setSnapshot(v("error",{error:E})),E}}n(h,"prepare");function f(A){let I=A??g.getSnapshot();if(!I)throw new Error("Prepare a transaction before sending.");return I}n(f,"resolvePrepared");function S(A){if(A.lifetime)return A;let I=d();return I?{...A,lifetime:I}:A}n(S,"resolveLifetimeOptions");async function k(A={}){let{prepared:I,...U}=A,H=f(I);T.setSnapshot(v("loading"));try{let E=await t.send(H,U);return T.setSnapshot(v("success",{data:E})),E}catch(E){throw T.setSnapshot(v("error",{error:E})),E}}n(k,"send");async function R(A={},I){let{instructions:U,...H}=A,E=U??l.getSnapshot();b(E),T.setSnapshot(v("loading"));try{let $=S(H),J=await t.prepareAndSend({...$,instructions:E},I);return T.setSnapshot(v("success",{data:J})),J}catch($){throw T.setSnapshot(v("error",{error:$})),$}}n(R,"prepareAndSend");function P(A={}){let{prepared:I,...U}=A,H=f(I);return t.sign(H,U)}n(P,"sign");function x(A={}){let{prepared:I,...U}=A,H=f(I);return t.toWire(H,U)}n(x,"toWire");function W(A){return l.subscribe(A)}n(W,"subscribeInstructions");function O(A){return g.subscribe(A)}n(O,"subscribePrepared");function de(A){return y.subscribe(A)}n(de,"subscribePrepareState");function Ft(A){return T.subscribe(A)}n(Ft,"subscribeSendState");function Dt(A){i=A;}return n(Dt,"setLatestBlockhashCache"),{addInstruction:c,addInstructions:o,clearInstructions:u,get helper(){return t},getInstructions:l.getSnapshot,getPrepareState:y.getSnapshot,getPrepared:g.getSnapshot,getSendState:T.getSnapshot,getLatestBlockhashCache:n(()=>i,"getLatestBlockhashCache"),prepare:h,prepareAndSend:R,removeInstruction:C,replaceInstructions:p,reset:w,send:k,setLatestBlockhashCache:Dt,sign:P,subscribeInstructions:W,subscribePrepareState:de,subscribePrepared:O,subscribeSendState:Ft,toWire:x}}n(to,"createTransactionPoolController");function Ut(e){return typeof e=="string"?address(e):e}n(Ut,"toAddress");function ro(e){return Ut(e).toString()}n(ro,"toAddressString");function ao(e){return JSON.stringify(e,(r,a)=>typeof a=="bigint"?{__type:"bigint",value:a.toString()}:a instanceof Uint8Array?Array.from(a):a)??"undefined"}n(ao,"stableStringify");
2
+ export{Rn as LAMPORTS_PER_SOL,qa as SIGNATURE_STATUS_TIMEOUT_MS,be as applyRatio,ge as applySerializableState,ae as assertDecimals,F as assertNonNegative,X as autoDiscover,Ke as backpack,Na as bigintFromJson,_a as bigintToJson,Te as checkedAdd,bn as checkedDivide,hn as checkedMultiply,he as checkedSubtract,Ja as confirmationMeetsCommitment,_t as connectWallet,v as createAsyncState,Ne as createClient,le as createClientStore,va as createDefaultClient,da as createDefaultClientStore,M as createInitialAsyncState,ce as createInitialClientState,kn as createRatio,Ma as createSolTransferController,ke as createSolTransferHelper,Q as createSolanaRpcClient,Pe as createSplTokenHelper,Ba as createSplTransferController,Ha as createStakeController,Fe as createStakeHelper,te as createTokenAmount,_e as createTransactionHelper,to as createTransactionPoolController,Ct as createTransactionRecipe,Se as createWalletRegistry,re as createWalletStandardConnector,vt as defaultWalletConnectors,$a as deriveConfirmationStatus,an as deserializeSolanaState,Nt as disconnectWallet,zt as fetchAccount,Vt as fetchBalance,jt as fetchLookupTable,qt as fetchLookupTables,Kt as fetchNonceAccount,rn as getInitialSerializableState,xa as getWalletStandardConnectors,Oa as injected,eo as insertReferenceKey,Et as insertReferenceKeys,Ce as lamports,Va as lamportsFromJson,xn as lamportsFromSol,z as lamportsMath,za as lamportsToJson,Ln as lamportsToSolString,Ka as normalizeSignature,je as phantom,ye as pow10,ne as prepareTransaction,$t as requestAirdrop,It as resolveClientConfig,ee as resolveCluster,Jt as sendTransaction,fe as serializeSolanaState,Gt as setCluster,qe as solflare,ao as stableStringify,on as subscribeSolanaState,Ut as toAddress,ro as toAddressString,N as toBigint,Y as transactionToBase64,Rr as transactionToBase64WithSigners,La as watchWalletStandardConnectors};//# sourceMappingURL=index.browser.mjs.map
3644
3
  //# sourceMappingURL=index.browser.mjs.map