@solana/connector 0.1.2 → 0.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.
Files changed (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +460 -1082
  3. package/dist/{chunk-RIBOPAOD.js → chunk-CLXM6UEE.js} +149 -121
  4. package/dist/chunk-CLXM6UEE.js.map +1 -0
  5. package/dist/{chunk-JS4KJ2KK.js → chunk-D6PZY5G6.js} +71 -93
  6. package/dist/chunk-D6PZY5G6.js.map +1 -0
  7. package/dist/chunk-LUZWUZ5N.js +2012 -0
  8. package/dist/chunk-LUZWUZ5N.js.map +1 -0
  9. package/dist/{chunk-WXYUUCSD.mjs → chunk-N3Q2J2FG.mjs} +53 -71
  10. package/dist/chunk-N3Q2J2FG.mjs.map +1 -0
  11. package/dist/chunk-P5MWBDFG.mjs +298 -0
  12. package/dist/chunk-P5MWBDFG.mjs.map +1 -0
  13. package/dist/chunk-RIQH5W7D.js +311 -0
  14. package/dist/chunk-RIQH5W7D.js.map +1 -0
  15. package/dist/chunk-U64YZRJL.mjs +1984 -0
  16. package/dist/chunk-U64YZRJL.mjs.map +1 -0
  17. package/dist/{chunk-4K6QY4HR.mjs → chunk-YTCSTE3Q.mjs} +64 -37
  18. package/dist/chunk-YTCSTE3Q.mjs.map +1 -0
  19. package/dist/compat.d.mts +4 -2
  20. package/dist/compat.d.ts +4 -2
  21. package/dist/compat.js +3 -3
  22. package/dist/compat.mjs +1 -1
  23. package/dist/headless.d.mts +146 -18
  24. package/dist/headless.d.ts +146 -18
  25. package/dist/headless.js +144 -111
  26. package/dist/headless.mjs +3 -2
  27. package/dist/index.d.mts +6 -5
  28. package/dist/index.d.ts +6 -5
  29. package/dist/index.js +207 -126
  30. package/dist/index.mjs +4 -3
  31. package/dist/react.d.mts +707 -67
  32. package/dist/react.d.ts +707 -67
  33. package/dist/react.js +64 -16
  34. package/dist/react.mjs +2 -2
  35. package/dist/{transaction-signer-D3csM_Mf.d.ts → transaction-signer-D9d8nxwb.d.mts} +3 -1
  36. package/dist/{transaction-signer-D3csM_Mf.d.mts → transaction-signer-D9d8nxwb.d.ts} +3 -1
  37. package/dist/{wallet-standard-shim-Cg0GVGwu.d.mts → wallet-standard-shim-Cp4vF4oo.d.mts} +133 -6
  38. package/dist/{wallet-standard-shim-C1tisl9S.d.ts → wallet-standard-shim-DC_Z7DS-.d.ts} +133 -6
  39. package/package.json +16 -12
  40. package/dist/chunk-4K6QY4HR.mjs.map +0 -1
  41. package/dist/chunk-5ZUVZZWU.mjs +0 -180
  42. package/dist/chunk-5ZUVZZWU.mjs.map +0 -1
  43. package/dist/chunk-F2QJH5ED.mjs +0 -298
  44. package/dist/chunk-F2QJH5ED.mjs.map +0 -1
  45. package/dist/chunk-JS4KJ2KK.js.map +0 -1
  46. package/dist/chunk-RIBOPAOD.js.map +0 -1
  47. package/dist/chunk-SJEZHNYF.js +0 -314
  48. package/dist/chunk-SJEZHNYF.js.map +0 -1
  49. package/dist/chunk-SMUUAKC3.js +0 -186
  50. package/dist/chunk-SMUUAKC3.js.map +0 -1
  51. package/dist/chunk-WXYUUCSD.mjs.map +0 -1
@@ -0,0 +1,2012 @@
1
+ 'use strict';
2
+
3
+ var chunkCLXM6UEE_js = require('./chunk-CLXM6UEE.js');
4
+ var chunkRIQH5W7D_js = require('./chunk-RIQH5W7D.js');
5
+ var React = require('react');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+ var addresses = require('@solana/addresses');
8
+ var keys = require('@solana/keys');
9
+
10
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
+
12
+ var React__default = /*#__PURE__*/_interopDefault(React);
13
+
14
+ var logger = chunkRIQH5W7D_js.createLogger("ConnectorProvider");
15
+ chunkCLXM6UEE_js.installPolyfills();
16
+ var ConnectorContext = React.createContext(null);
17
+ ConnectorContext.displayName = "ConnectorContext";
18
+ function ConnectorProviderInternal({
19
+ children,
20
+ config,
21
+ mobile
22
+ }) {
23
+ let clientRef = React.useRef(null), client = React__default.default.useCallback(() => {
24
+ if (!clientRef.current)
25
+ try {
26
+ clientRef.current = new chunkCLXM6UEE_js.ConnectorClient(config), typeof window < "u" && (window.__connectorClient = clientRef.current), config?.debug && logger.info("Client initialized successfully");
27
+ } catch (error) {
28
+ let err = error;
29
+ logger.error("Failed to initialize client", { error: err });
30
+ let extendedConfig = config;
31
+ return extendedConfig?.errorBoundary?.onError && extendedConfig.errorBoundary.onError(err, {
32
+ componentStack: "client-initialization",
33
+ digest: `constructor-${(/* @__PURE__ */ new Date()).toISOString()}`
34
+ }), null;
35
+ }
36
+ return clientRef.current;
37
+ }, [config])();
38
+ return React__default.default.useEffect(() => {
39
+ let currentClient = clientRef.current;
40
+ if (currentClient) {
41
+ let privateClient = currentClient;
42
+ privateClient.initialize && typeof privateClient.initialize == "function" && privateClient.initialize();
43
+ }
44
+ return () => {
45
+ typeof window < "u" && (window.__connectorClient = void 0), currentClient && typeof currentClient.destroy == "function" && currentClient.destroy();
46
+ };
47
+ }, []), React__default.default.useEffect(() => {
48
+ if (!mobile) return;
49
+ let cancelled = false;
50
+ return (async () => {
51
+ try {
52
+ let mod = await import('@solana-mobile/wallet-standard-mobile');
53
+ if (cancelled) return;
54
+ let {
55
+ registerMwa,
56
+ createDefaultAuthorizationCache,
57
+ createDefaultChainSelector,
58
+ createDefaultWalletNotFoundHandler
59
+ } = mod, defaultChains = [
60
+ "solana:mainnet",
61
+ "solana:devnet",
62
+ "solana:testnet"
63
+ ];
64
+ registerMwa({
65
+ appIdentity: mobile.appIdentity,
66
+ authorizationCache: mobile.authorizationCache ?? createDefaultAuthorizationCache(),
67
+ chains: mobile.chains ?? defaultChains,
68
+ chainSelector: mobile.chainSelector ?? createDefaultChainSelector(),
69
+ remoteHostAuthority: mobile.remoteHostAuthority,
70
+ onWalletNotFound: mobile.onWalletNotFound ?? createDefaultWalletNotFoundHandler()
71
+ });
72
+ } catch {
73
+ }
74
+ })(), () => {
75
+ cancelled = true;
76
+ };
77
+ }, [mobile]), /* @__PURE__ */ jsxRuntime.jsx(ConnectorContext.Provider, { value: client, children });
78
+ }
79
+ function ConnectorProvider({
80
+ children,
81
+ config,
82
+ mobile
83
+ }) {
84
+ let errorBoundaryConfig = config?.errorBoundary;
85
+ return errorBoundaryConfig?.enabled ? /* @__PURE__ */ jsxRuntime.jsx(
86
+ chunkCLXM6UEE_js.ConnectorErrorBoundary,
87
+ {
88
+ maxRetries: errorBoundaryConfig.maxRetries ?? 3,
89
+ onError: errorBoundaryConfig.onError,
90
+ fallback: errorBoundaryConfig.fallback,
91
+ children: /* @__PURE__ */ jsxRuntime.jsx(ConnectorProviderInternal, { config, mobile, children })
92
+ }
93
+ ) : /* @__PURE__ */ jsxRuntime.jsx(ConnectorProviderInternal, { config, mobile, children });
94
+ }
95
+ function useConnector() {
96
+ let client = React.useContext(ConnectorContext);
97
+ if (!client)
98
+ throw new Error(
99
+ "useConnector must be used within ConnectorProvider. Wrap your app with <ConnectorProvider> or <UnifiedProvider> to use connector hooks."
100
+ );
101
+ let state = React.useSyncExternalStore(
102
+ React__default.default.useCallback((cb) => client.subscribe(cb), [client]),
103
+ React__default.default.useCallback(() => client.getSnapshot(), [client]),
104
+ React__default.default.useCallback(() => client.getSnapshot(), [client])
105
+ ), methods = React.useMemo(
106
+ () => ({
107
+ select: client.select.bind(client),
108
+ disconnect: client.disconnect.bind(client),
109
+ selectAccount: client.selectAccount.bind(client)
110
+ }),
111
+ [client]
112
+ );
113
+ return React.useMemo(
114
+ () => ({
115
+ ...state,
116
+ ...methods
117
+ }),
118
+ [state, methods]
119
+ );
120
+ }
121
+ function useConnectorClient() {
122
+ return React.useContext(ConnectorContext);
123
+ }
124
+ function UnifiedProvider({ children, config, connectorConfig, mobile, providers = [] }) {
125
+ let actualConnectorConfig = config?.connectorConfig ?? connectorConfig, actualMobile = config?.mobile ?? mobile, content = /* @__PURE__ */ jsxRuntime.jsx(ConnectorProvider, { config: actualConnectorConfig, mobile: actualMobile, children });
126
+ for (let i = providers.length - 1; i >= 0; i--) {
127
+ let { component: Provider, props = {} } = providers[i];
128
+ content = /* @__PURE__ */ jsxRuntime.jsx(Provider, { ...props, children: content });
129
+ }
130
+ return content;
131
+ }
132
+ function useCluster() {
133
+ let { cluster, clusters } = useConnector(), client = useConnectorClient();
134
+ if (!client)
135
+ throw new Error("useCluster must be used within ConnectorProvider");
136
+ let setCluster = React.useMemo(
137
+ () => async (id) => {
138
+ await client.setCluster(id);
139
+ },
140
+ [client]
141
+ );
142
+ return React.useMemo(() => {
143
+ let isMainnet = cluster ? chunkCLXM6UEE_js.isMainnetCluster(cluster) : false, isDevnet = cluster ? chunkCLXM6UEE_js.isDevnetCluster(cluster) : false, isTestnet = cluster ? chunkCLXM6UEE_js.isTestnetCluster(cluster) : false, isLocal = cluster ? chunkCLXM6UEE_js.isLocalCluster(cluster) : false, explorerUrl = cluster ? chunkCLXM6UEE_js.getClusterExplorerUrl(cluster) : "", type = cluster ? chunkCLXM6UEE_js.getClusterType(cluster) : null;
144
+ return {
145
+ cluster,
146
+ clusters,
147
+ setCluster,
148
+ isMainnet,
149
+ isDevnet,
150
+ isTestnet,
151
+ isLocal,
152
+ explorerUrl,
153
+ type
154
+ };
155
+ }, [cluster, clusters, setCluster]);
156
+ }
157
+ function useAccount() {
158
+ let { selectedAccount, accounts, connected, selectAccount } = useConnector(), [copied, setCopied] = React.useState(false), copyTimeoutRef = React__default.default.useRef(void 0), account = React.useMemo(
159
+ () => accounts.find((a) => a.address === selectedAccount) ?? null,
160
+ [accounts, selectedAccount]
161
+ ), formatted = React.useMemo(() => selectedAccount ? chunkCLXM6UEE_js.formatAddress(selectedAccount) : "", [selectedAccount]), copy = React.useCallback(async () => selectedAccount ? (copyTimeoutRef.current && clearTimeout(copyTimeoutRef.current), await chunkCLXM6UEE_js.copyAddressToClipboard(selectedAccount, {
162
+ onSuccess: () => {
163
+ setCopied(true), copyTimeoutRef.current = setTimeout(() => setCopied(false), 2e3);
164
+ }
165
+ })) : {
166
+ success: false,
167
+ error: "empty_value" /* EMPTY_VALUE */,
168
+ errorMessage: "No account selected"
169
+ }, [selectedAccount]);
170
+ return React__default.default.useEffect(() => () => {
171
+ copyTimeoutRef.current && clearTimeout(copyTimeoutRef.current);
172
+ }, []), React.useMemo(
173
+ () => ({
174
+ address: selectedAccount,
175
+ account,
176
+ connected,
177
+ formatted,
178
+ copy,
179
+ copied,
180
+ accounts,
181
+ selectAccount
182
+ }),
183
+ [selectedAccount, account, connected, formatted, copy, copied, accounts, selectAccount]
184
+ );
185
+ }
186
+ function useWalletInfo() {
187
+ let { selectedWallet, wallets, connected, connecting } = useConnector(), mappedWallets = React.useMemo(
188
+ () => wallets.map(
189
+ (walletInfo) => ({
190
+ name: walletInfo.wallet.name,
191
+ icon: walletInfo.wallet.icon,
192
+ installed: walletInfo.installed,
193
+ connectable: walletInfo.connectable
194
+ })
195
+ ),
196
+ [wallets]
197
+ ), selectedWalletInfo = React.useMemo(() => {
198
+ if (!selectedWallet)
199
+ return {
200
+ name: null,
201
+ icon: null,
202
+ installed: false,
203
+ connectable: false
204
+ };
205
+ let walletInfo = wallets.find((w) => w.wallet.name === selectedWallet.name);
206
+ return {
207
+ name: selectedWallet.name,
208
+ icon: selectedWallet.icon ?? null,
209
+ installed: walletInfo?.installed ?? false,
210
+ connectable: walletInfo?.connectable ?? false
211
+ };
212
+ }, [selectedWallet, wallets]);
213
+ return React.useMemo(
214
+ () => ({
215
+ ...selectedWalletInfo,
216
+ connected,
217
+ connecting,
218
+ wallets: mappedWallets
219
+ }),
220
+ [selectedWalletInfo, connected, connecting, mappedWallets]
221
+ );
222
+ }
223
+ function useTransactionSigner() {
224
+ let { selectedWallet, selectedAccount, accounts, cluster, connected } = useConnector(), client = useConnectorClient(), account = React.useMemo(
225
+ () => accounts.find((a) => a.address === selectedAccount)?.raw ?? null,
226
+ [accounts, selectedAccount]
227
+ ), signer = React.useMemo(() => !connected || !selectedWallet || !account ? null : chunkCLXM6UEE_js.createTransactionSigner({
228
+ wallet: selectedWallet,
229
+ account,
230
+ cluster: cluster ?? void 0,
231
+ eventEmitter: client ? {
232
+ emit: (event) => {
233
+ client.emitEvent(event);
234
+ }
235
+ } : void 0
236
+ }), [connected, selectedWallet, account, cluster, client]), capabilities = React.useMemo(
237
+ () => signer?.getCapabilities() ?? {
238
+ canSign: false,
239
+ canSend: false,
240
+ canSignMessage: false,
241
+ supportsBatchSigning: false
242
+ },
243
+ [signer]
244
+ );
245
+ return {
246
+ signer,
247
+ ready: !!signer,
248
+ address: selectedAccount,
249
+ capabilities
250
+ };
251
+ }
252
+ function useKitTransactionSigner() {
253
+ let { signer: connectorSigner, ready } = useTransactionSigner();
254
+ return {
255
+ signer: React.useMemo(() => connectorSigner ? chunkCLXM6UEE_js.createKitTransactionSigner(connectorSigner) : null, [connectorSigner]),
256
+ ready
257
+ };
258
+ }
259
+ var useGillTransactionSigner = useKitTransactionSigner;
260
+ var logger2 = chunkRIQH5W7D_js.createLogger("useSolanaClient");
261
+ function useSolanaClient() {
262
+ let { type } = useCluster(), connectorClient = useConnectorClient(), client = React.useMemo(() => {
263
+ if (!type || !connectorClient) return null;
264
+ try {
265
+ let rpcUrl = connectorClient.getRpcUrl();
266
+ return rpcUrl ? chunkRIQH5W7D_js.createSolanaClient({
267
+ urlOrMoniker: rpcUrl
268
+ }) : type !== "custom" ? chunkRIQH5W7D_js.createSolanaClient({
269
+ urlOrMoniker: type
270
+ }) : null;
271
+ } catch (error) {
272
+ return logger2.error("Failed to create Solana client", { error }), null;
273
+ }
274
+ }, [type, connectorClient]);
275
+ return React.useMemo(
276
+ () => ({
277
+ client,
278
+ ready: !!client,
279
+ clusterType: type
280
+ }),
281
+ [client, type]
282
+ );
283
+ }
284
+ var useGillSolanaClient = useSolanaClient;
285
+ function useTransactionPreparer() {
286
+ let { client, ready } = useSolanaClient(), prepare = React.useCallback(
287
+ async (transaction, options = {}) => {
288
+ if (!client)
289
+ throw new chunkCLXM6UEE_js.NetworkError("RPC_ERROR", "Solana client not available. Cannot prepare transaction.");
290
+ return chunkRIQH5W7D_js.prepareTransaction({
291
+ transaction,
292
+ rpc: client.rpc,
293
+ computeUnitLimitMultiplier: options.computeUnitLimitMultiplier,
294
+ computeUnitLimitReset: options.computeUnitLimitReset,
295
+ blockhashReset: options.blockhashReset
296
+ });
297
+ },
298
+ [client]
299
+ );
300
+ return React.useMemo(
301
+ () => ({
302
+ prepare,
303
+ ready
304
+ }),
305
+ [prepare, ready]
306
+ );
307
+ }
308
+ var LAMPORTS_PER_SOL2 = 1000000000n;
309
+ function formatSol(lamports, decimals = 4) {
310
+ return (Number(lamports) / Number(LAMPORTS_PER_SOL2)).toLocaleString(void 0, {
311
+ minimumFractionDigits: 0,
312
+ maximumFractionDigits: decimals
313
+ }) + " SOL";
314
+ }
315
+ function useBalance() {
316
+ let { address, connected } = useAccount(); useCluster(); let client = useSolanaClient(), [lamports, setLamports] = React.useState(0n), [tokens, setTokens] = React.useState([]), [isLoading, setIsLoading] = React.useState(false), [error, setError] = React.useState(null), [lastUpdated, setLastUpdated] = React.useState(null), rpcClient = client?.client ?? null, fetchBalance = React.useCallback(async () => {
317
+ if (!connected || !address || !rpcClient) {
318
+ setLamports(0n), setTokens([]);
319
+ return;
320
+ }
321
+ setIsLoading(true), setError(null);
322
+ try {
323
+ let rpc = rpcClient.rpc, walletAddress = addresses.address(address), balanceResult = await rpc.getBalance(walletAddress).send();
324
+ setLamports(balanceResult.value);
325
+ try {
326
+ let tokenProgramId = addresses.address("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"), tokenAccountsResult = await rpc.getTokenAccountsByOwner(walletAddress, { programId: tokenProgramId }, { encoding: "jsonParsed" }).send(), tokenBalances = [];
327
+ for (let account of tokenAccountsResult.value) {
328
+ let parsed = account.account.data;
329
+ if (parsed?.parsed?.info) {
330
+ let info = parsed.parsed.info, amount = BigInt(info.tokenAmount?.amount || "0"), decimals = info.tokenAmount?.decimals || 0, formatted = (Number(amount) / Math.pow(10, decimals)).toLocaleString(void 0, {
331
+ minimumFractionDigits: 0,
332
+ maximumFractionDigits: Math.min(decimals, 6)
333
+ });
334
+ amount > 0n && tokenBalances.push({
335
+ mint: info.mint,
336
+ amount,
337
+ decimals,
338
+ formatted
339
+ });
340
+ }
341
+ }
342
+ setTokens(tokenBalances);
343
+ } catch (tokenError) {
344
+ console.warn("Failed to fetch token balances:", tokenError), setTokens([]);
345
+ }
346
+ setLastUpdated(/* @__PURE__ */ new Date());
347
+ } catch (err) {
348
+ setError(err), console.error("Failed to fetch balance:", err);
349
+ } finally {
350
+ setIsLoading(false);
351
+ }
352
+ }, [connected, address, rpcClient]);
353
+ React.useEffect(() => {
354
+ fetchBalance();
355
+ }, [fetchBalance]), React.useEffect(() => {
356
+ if (!connected) return;
357
+ let interval = setInterval(fetchBalance, 3e4);
358
+ return () => clearInterval(interval);
359
+ }, [connected, fetchBalance]);
360
+ let solBalance = React.useMemo(() => Number(lamports) / Number(LAMPORTS_PER_SOL2), [lamports]), formattedSol = React.useMemo(() => formatSol(lamports), [lamports]);
361
+ return React.useMemo(
362
+ () => ({
363
+ solBalance,
364
+ lamports,
365
+ formattedSol,
366
+ tokens,
367
+ isLoading,
368
+ error,
369
+ refetch: fetchBalance,
370
+ lastUpdated
371
+ }),
372
+ [solBalance, lamports, formattedSol, tokens, isLoading, error, fetchBalance, lastUpdated]
373
+ );
374
+ }
375
+ function formatDate(timestamp) {
376
+ if (!timestamp)
377
+ return { date: "Unknown", time: "" };
378
+ let date = new Date(timestamp * 1e3), diffDays = Math.floor(((/* @__PURE__ */ new Date()).getTime() - date.getTime()) / (1e3 * 60 * 60 * 24)), formattedDate;
379
+ diffDays === 0 ? formattedDate = "Today" : diffDays === 1 ? formattedDate = "Yesterday" : diffDays < 7 ? formattedDate = `${diffDays} days ago` : formattedDate = date.toLocaleDateString();
380
+ let formattedTime = date.toLocaleTimeString(void 0, {
381
+ hour: "2-digit",
382
+ minute: "2-digit"
383
+ });
384
+ return { date: formattedDate, time: formattedTime };
385
+ }
386
+ function isAccountKey(value) {
387
+ return typeof value == "object" && value !== null && "pubkey" in value && typeof value.pubkey == "string";
388
+ }
389
+ function isTransactionMeta(value) {
390
+ if (typeof value != "object" || value === null || !("preBalances" in value) || !("postBalances" in value))
391
+ return false;
392
+ let meta = value;
393
+ if (!Array.isArray(meta.preBalances) || !Array.isArray(meta.postBalances))
394
+ return false;
395
+ let isValidBalance = (b) => typeof b == "number" || typeof b == "bigint";
396
+ return meta.preBalances.every(isValidBalance) && meta.postBalances.every(isValidBalance);
397
+ }
398
+ function isTokenBalance(value) {
399
+ return typeof value == "object" && value !== null && "accountIndex" in value && "mint" in value && "uiTokenAmount" in value && typeof value.accountIndex == "number" && typeof value.mint == "string" && typeof value.uiTokenAmount == "object" && value.uiTokenAmount !== null;
400
+ }
401
+ function isUiTokenAmount(value) {
402
+ return typeof value == "object" && value !== null && "amount" in value && "decimals" in value && typeof value.amount == "string" && typeof value.decimals == "number";
403
+ }
404
+ function isTransactionWithMeta(value) {
405
+ return typeof value == "object" && value !== null && "meta" in value && "transaction" in value && value.meta !== null && typeof value.transaction == "object" && value.transaction !== null && "message" in value.transaction;
406
+ }
407
+ function isTransactionMessage(value) {
408
+ return typeof value == "object" && value !== null && "accountKeys" in value && Array.isArray(value.accountKeys);
409
+ }
410
+ function getAccountKeys(message) {
411
+ return Array.isArray(message.accountKeys) ? message.accountKeys.map((key) => typeof key == "string" ? key : isAccountKey(key) ? key.pubkey : "").filter(Boolean) : [];
412
+ }
413
+ function detectProgramIds(message, accountKeys) {
414
+ let programIds = /* @__PURE__ */ new Set();
415
+ if (!Array.isArray(message.instructions))
416
+ return programIds;
417
+ for (let instruction of message.instructions)
418
+ if (typeof instruction == "object" && instruction !== null) {
419
+ if (typeof instruction.programIdIndex == "number" && accountKeys[instruction.programIdIndex])
420
+ programIds.add(accountKeys[instruction.programIdIndex]);
421
+ else if (typeof instruction.programId == "string")
422
+ programIds.add(instruction.programId);
423
+ else if (instruction.programId && typeof instruction.programId == "object") {
424
+ let programIdStr = String(instruction.programId);
425
+ programIdStr && programIdStr !== "[object Object]" && programIds.add(programIdStr);
426
+ }
427
+ }
428
+ return programIds;
429
+ }
430
+ function parseSolChange(meta, walletIndex) {
431
+ if (!isTransactionMeta(meta) || !Array.isArray(meta.preBalances) || !Array.isArray(meta.postBalances))
432
+ return { balanceChange: 0, solChange: 0 };
433
+ let preBalanceRaw = meta.preBalances[walletIndex], postBalanceRaw = meta.postBalances[walletIndex], preBalance = typeof preBalanceRaw == "number" ? preBalanceRaw : typeof preBalanceRaw == "bigint" ? Number(preBalanceRaw) : 0, balanceChange = (typeof postBalanceRaw == "number" ? postBalanceRaw : typeof postBalanceRaw == "bigint" ? Number(postBalanceRaw) : 0) - preBalance, solChange = balanceChange / 1e9;
434
+ return { balanceChange, solChange };
435
+ }
436
+ function parseTokenTransfers(meta, accountKeys, walletAddress) {
437
+ if (!isTransactionMeta(meta))
438
+ return null;
439
+ let preTokenBalances = Array.isArray(meta.preTokenBalances) ? meta.preTokenBalances : [], postTokenBalances = Array.isArray(meta.postTokenBalances) ? meta.postTokenBalances : [], ourPreTokens = preTokenBalances.filter((balance) => {
440
+ if (!isTokenBalance(balance)) return false;
441
+ let accountKey = accountKeys[balance.accountIndex];
442
+ return accountKey && accountKey.trim() === walletAddress.trim() || balance.owner && balance.owner.trim() === walletAddress.trim();
443
+ }), ourPostTokens = postTokenBalances.filter((balance) => {
444
+ if (!isTokenBalance(balance)) return false;
445
+ let accountKey = accountKeys[balance.accountIndex];
446
+ return accountKey && accountKey.trim() === walletAddress.trim() || balance.owner && balance.owner.trim() === walletAddress.trim();
447
+ }), allMints = /* @__PURE__ */ new Set();
448
+ for (let token of ourPreTokens)
449
+ isTokenBalance(token) && allMints.add(token.mint);
450
+ for (let token of ourPostTokens)
451
+ isTokenBalance(token) && allMints.add(token.mint);
452
+ for (let mint of allMints) {
453
+ let preBal = ourPreTokens.find((b) => isTokenBalance(b) && b.mint === mint), postBal = ourPostTokens.find((b) => isTokenBalance(b) && b.mint === mint);
454
+ if (!isTokenBalance(preBal) && !isTokenBalance(postBal))
455
+ continue;
456
+ let preAmount = isTokenBalance(preBal) && isUiTokenAmount(preBal.uiTokenAmount) ? Number(preBal.uiTokenAmount.amount) : 0, change = (isTokenBalance(postBal) && isUiTokenAmount(postBal.uiTokenAmount) ? Number(postBal.uiTokenAmount.amount) : 0) - preAmount;
457
+ if (change !== 0) {
458
+ let decimals = isTokenBalance(postBal) && isUiTokenAmount(postBal.uiTokenAmount) ? postBal.uiTokenAmount.decimals : isTokenBalance(preBal) && isUiTokenAmount(preBal.uiTokenAmount) ? preBal.uiTokenAmount.decimals : 0;
459
+ if (typeof decimals != "number" || decimals < 0)
460
+ continue;
461
+ return {
462
+ tokenMint: mint,
463
+ tokenAmount: Math.abs(change) / Math.pow(10, decimals),
464
+ tokenDecimals: decimals,
465
+ direction: change > 0 ? "in" : "out",
466
+ type: change > 0 ? "received" : "sent"
467
+ };
468
+ }
469
+ }
470
+ if (ourPostTokens.length > ourPreTokens.length) {
471
+ let newToken = ourPostTokens.find(
472
+ (b) => isTokenBalance(b) && !ourPreTokens.some((p) => isTokenBalance(p) && p.mint === b.mint)
473
+ );
474
+ if (isTokenBalance(newToken) && isUiTokenAmount(newToken.uiTokenAmount)) {
475
+ let decimals = newToken.uiTokenAmount.decimals;
476
+ if (typeof decimals == "number" && decimals >= 0) {
477
+ let amount = Number(newToken.uiTokenAmount.amount) / Math.pow(10, decimals);
478
+ return {
479
+ tokenMint: newToken.mint,
480
+ tokenAmount: amount,
481
+ tokenDecimals: decimals,
482
+ direction: "in",
483
+ type: "received"
484
+ };
485
+ }
486
+ }
487
+ }
488
+ return null;
489
+ }
490
+ function formatAmount(tokenAmount, tokenDecimals, direction, solChange) {
491
+ if (tokenAmount !== void 0 && tokenDecimals !== void 0 && direction !== void 0) {
492
+ let sign = direction === "in" ? "+" : "-", maxDecimals = Math.min(tokenDecimals, 6);
493
+ return `${sign}${tokenAmount.toLocaleString(void 0, { maximumFractionDigits: maxDecimals })}`;
494
+ }
495
+ if (solChange !== 0)
496
+ return `${solChange > 0 ? "+" : ""}${solChange.toFixed(4)} SOL`;
497
+ }
498
+ var tokenMetadataCache = /* @__PURE__ */ new Map();
499
+ async function fetchTokenMetadata(mints) {
500
+ let results = /* @__PURE__ */ new Map();
501
+ if (mints.length === 0) return results;
502
+ let uncachedMints = [];
503
+ for (let mint of mints) {
504
+ let cached = tokenMetadataCache.get(mint);
505
+ cached ? results.set(mint, cached) : uncachedMints.push(mint);
506
+ }
507
+ if (uncachedMints.length === 0) return results;
508
+ try {
509
+ let url = new URL("https://lite-api.jup.ag/tokens/v2/search");
510
+ url.searchParams.append("query", uncachedMints.join(","));
511
+ let response = await fetch(url.toString(), {
512
+ signal: AbortSignal.timeout(5e3)
513
+ });
514
+ if (!response.ok) return results;
515
+ let items = await response.json();
516
+ for (let item of items) {
517
+ let metadata = { symbol: item.symbol, icon: item.icon };
518
+ results.set(item.id, metadata), tokenMetadataCache.set(item.id, metadata);
519
+ }
520
+ } catch (error) {
521
+ console.warn("[useTransactions] Failed to fetch token metadata:", error);
522
+ }
523
+ return results;
524
+ }
525
+ function useTransactions(options = {}) {
526
+ let { limit = 10, autoRefresh = false, refreshInterval = 6e4, fetchDetails = true } = options, { address, connected } = useAccount(), { cluster } = useCluster(), client = useSolanaClient(), [transactions, setTransactions] = React.useState([]), [isLoading, setIsLoading] = React.useState(false), [error, setError] = React.useState(null), [hasMore, setHasMore] = React.useState(true), [lastUpdated, setLastUpdated] = React.useState(null), beforeSignatureRef = React.useRef(void 0), prevDepsRef = React.useRef(
527
+ null
528
+ ), rpcClient = client?.client ?? null, parseTransaction = React.useCallback(
529
+ (tx, walletAddress, sig, blockTime, slot, err, explorerUrl) => {
530
+ let { date, time } = formatDate(blockTime), baseInfo = {
531
+ signature: sig,
532
+ blockTime,
533
+ slot,
534
+ status: err ? "failed" : "success",
535
+ error: err ? JSON.stringify(err) : void 0,
536
+ type: "unknown",
537
+ formattedDate: date,
538
+ formattedTime: time,
539
+ explorerUrl
540
+ };
541
+ if (!isTransactionWithMeta(tx))
542
+ return baseInfo;
543
+ try {
544
+ let { meta, transaction } = tx;
545
+ if (!isTransactionMeta(meta))
546
+ return baseInfo;
547
+ let { message } = transaction;
548
+ if (!isTransactionMessage(message))
549
+ return baseInfo;
550
+ let accountKeys = getAccountKeys(message), walletIndex = accountKeys.findIndex((key) => key.trim() === walletAddress.trim());
551
+ if (walletIndex === -1)
552
+ return baseInfo;
553
+ let { balanceChange, solChange } = parseSolChange(meta, walletIndex), programIds = detectProgramIds(message, accountKeys), hasJupiter = programIds.has("JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"), hasOrca = programIds.has("whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc"), hasRaydium = programIds.has("675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8"), hasStake = programIds.has("Stake11111111111111111111111111111111111111"), hasMetaplex = programIds.has("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"), hasSystemProgram = programIds.has("11111111111111111111111111111111"), hasTokenProgram = programIds.has("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"), type = "unknown", direction, counterparty, tokenMint, tokenAmount, tokenDecimals;
554
+ if (hasJupiter || hasOrca || hasRaydium)
555
+ type = "swap";
556
+ else if (hasStake)
557
+ type = "stake";
558
+ else if (hasMetaplex)
559
+ type = "nft";
560
+ else if (hasSystemProgram && Math.abs(balanceChange) > 0)
561
+ type = balanceChange > 0 ? "received" : "sent", direction = balanceChange > 0 ? "in" : "out", tokenMint = "So11111111111111111111111111111111111111112", accountKeys.length >= 2 && (counterparty = accountKeys.find(
562
+ (key, idx) => idx !== walletIndex && key !== "11111111111111111111111111111111"
563
+ ));
564
+ else if (hasTokenProgram) {
565
+ let tokenTransfer = parseTokenTransfers(meta, accountKeys, walletAddress);
566
+ tokenTransfer && (type = tokenTransfer.type, direction = tokenTransfer.direction, tokenMint = tokenTransfer.tokenMint, tokenAmount = tokenTransfer.tokenAmount, tokenDecimals = tokenTransfer.tokenDecimals);
567
+ } else programIds.size > 0 && (type = "program");
568
+ let formattedAmount = formatAmount(tokenAmount, tokenDecimals, direction, solChange);
569
+ return {
570
+ ...baseInfo,
571
+ type,
572
+ direction,
573
+ amount: tokenAmount ?? Math.abs(solChange),
574
+ formattedAmount,
575
+ tokenMint,
576
+ counterparty: counterparty ? `${counterparty.slice(0, 4)}...${counterparty.slice(-4)}` : void 0
577
+ };
578
+ } catch (parseError) {
579
+ return console.warn("Failed to parse transaction:", parseError), baseInfo;
580
+ }
581
+ },
582
+ []
583
+ ), fetchTransactions = React.useCallback(
584
+ async (loadMore = false) => {
585
+ if (!connected || !address || !rpcClient || !cluster) {
586
+ setTransactions([]);
587
+ return;
588
+ }
589
+ setIsLoading(true), setError(null);
590
+ try {
591
+ let rpc = rpcClient.rpc, walletAddress = addresses.address(address), signaturesResult = await rpc.getSignaturesForAddress(walletAddress, {
592
+ limit,
593
+ ...loadMore && beforeSignatureRef.current ? { before: keys.signature(beforeSignatureRef.current) } : {}
594
+ }).send(), newTransactions;
595
+ if (fetchDetails && signaturesResult.length > 0) {
596
+ let txPromises = signaturesResult.map(
597
+ (s) => rpc.getTransaction(keys.signature(String(s.signature)), {
598
+ encoding: "jsonParsed",
599
+ maxSupportedTransactionVersion: 0
600
+ }).send().catch(() => null)
601
+ ), txDetails = await Promise.all(txPromises);
602
+ newTransactions = signaturesResult.map((sig, idx) => {
603
+ let blockTimeNum = sig.blockTime ? Number(sig.blockTime) : null, tx = txDetails[idx];
604
+ return parseTransaction(
605
+ tx,
606
+ address,
607
+ String(sig.signature),
608
+ blockTimeNum,
609
+ Number(sig.slot),
610
+ sig.err,
611
+ chunkCLXM6UEE_js.getTransactionUrl(String(sig.signature), cluster)
612
+ );
613
+ });
614
+ } else
615
+ newTransactions = signaturesResult.map((sig) => {
616
+ let blockTimeNum = sig.blockTime ? Number(sig.blockTime) : null, { date, time } = formatDate(blockTimeNum);
617
+ return {
618
+ signature: String(sig.signature),
619
+ blockTime: blockTimeNum,
620
+ slot: Number(sig.slot),
621
+ status: sig.err ? "failed" : "success",
622
+ error: sig.err ? JSON.stringify(sig.err) : void 0,
623
+ type: "unknown",
624
+ formattedDate: date,
625
+ formattedTime: time,
626
+ explorerUrl: chunkCLXM6UEE_js.getTransactionUrl(String(sig.signature), cluster)
627
+ };
628
+ });
629
+ setTransactions(loadMore ? (prev) => [...prev, ...newTransactions] : newTransactions);
630
+ let mintsToFetch = [...new Set(newTransactions.filter((tx) => tx.tokenMint).map((tx) => tx.tokenMint))];
631
+ if (mintsToFetch.length > 0) {
632
+ let tokenMetadata = await fetchTokenMetadata(mintsToFetch);
633
+ if (tokenMetadata.size > 0) {
634
+ let enrichedTransactions = newTransactions.map((tx) => {
635
+ if (tx.tokenMint && tokenMetadata.has(tx.tokenMint)) {
636
+ let meta = tokenMetadata.get(tx.tokenMint);
637
+ return {
638
+ ...tx,
639
+ tokenSymbol: meta.symbol,
640
+ tokenIcon: meta.icon,
641
+ // Update formatted amount with symbol
642
+ formattedAmount: tx.formattedAmount ? `${tx.formattedAmount} ${meta.symbol}` : tx.formattedAmount
643
+ };
644
+ }
645
+ return tx;
646
+ });
647
+ setTransactions(loadMore ? (prev) => [...prev.slice(0, -newTransactions.length), ...enrichedTransactions] : enrichedTransactions);
648
+ }
649
+ }
650
+ if (typeof newTransactions < "u" && Array.isArray(newTransactions)) {
651
+ if (newTransactions.length > 0) {
652
+ let newBeforeSignature = newTransactions[newTransactions.length - 1].signature;
653
+ beforeSignatureRef.current = newBeforeSignature;
654
+ }
655
+ setHasMore(newTransactions.length === limit);
656
+ }
657
+ setLastUpdated(/* @__PURE__ */ new Date());
658
+ } catch (err) {
659
+ setError(err), console.error("Failed to fetch transactions:", err);
660
+ } finally {
661
+ setIsLoading(false);
662
+ }
663
+ },
664
+ [connected, address, rpcClient, cluster, limit, fetchDetails, parseTransaction]
665
+ ), refetch = React.useCallback(async () => {
666
+ beforeSignatureRef.current = void 0, await fetchTransactions(false);
667
+ }, [fetchTransactions]), loadMoreFn = React.useCallback(async () => {
668
+ hasMore && !isLoading && await fetchTransactions(true);
669
+ }, [hasMore, isLoading, fetchTransactions]);
670
+ return React.useEffect(() => {
671
+ let prevDeps = prevDepsRef.current, currentDeps = { connected, address, cluster };
672
+ (!prevDeps || prevDeps.connected !== connected || prevDeps.address !== address || prevDeps.cluster !== cluster) && (prevDepsRef.current = currentDeps, beforeSignatureRef.current = void 0, fetchTransactions(false));
673
+ }, [connected, address, cluster, fetchTransactions]), React.useEffect(() => {
674
+ if (!connected || !autoRefresh) return;
675
+ let interval = setInterval(refetch, refreshInterval);
676
+ return () => clearInterval(interval);
677
+ }, [connected, autoRefresh, refreshInterval, refetch]), React.useMemo(
678
+ () => ({
679
+ transactions,
680
+ isLoading,
681
+ error,
682
+ hasMore,
683
+ loadMore: loadMoreFn,
684
+ refetch,
685
+ lastUpdated
686
+ }),
687
+ [transactions, isLoading, error, hasMore, loadMoreFn, refetch, lastUpdated]
688
+ );
689
+ }
690
+ var NATIVE_MINT = "So11111111111111111111111111111111111111112", metadataCache = /* @__PURE__ */ new Map();
691
+ async function fetchJupiterMetadata(mints) {
692
+ let results = /* @__PURE__ */ new Map();
693
+ if (mints.length === 0) return results;
694
+ let uncachedMints = [];
695
+ for (let mint of mints) {
696
+ let cached = metadataCache.get(mint);
697
+ cached ? results.set(mint, cached) : uncachedMints.push(mint);
698
+ }
699
+ if (uncachedMints.length === 0) return results;
700
+ try {
701
+ let url = new URL("https://lite-api.jup.ag/tokens/v2/search");
702
+ url.searchParams.append("query", uncachedMints.join(","));
703
+ let response = await fetch(url.toString(), {
704
+ signal: AbortSignal.timeout(1e4)
705
+ });
706
+ if (!response.ok)
707
+ throw new Error(`Jupiter API error: ${response.status}`);
708
+ let items = await response.json();
709
+ for (let item of items) {
710
+ let metadata = {
711
+ id: item.id,
712
+ name: item.id === NATIVE_MINT ? "Solana" : item.name,
713
+ symbol: item.symbol,
714
+ decimals: item.decimals,
715
+ icon: item.icon,
716
+ usdPrice: item.usdPrice
717
+ };
718
+ results.set(item.id, metadata), metadataCache.set(item.id, metadata);
719
+ }
720
+ } catch (error) {
721
+ console.warn("[useTokens] Jupiter API failed:", error);
722
+ }
723
+ return results;
724
+ }
725
+ function formatBalance(amount, decimals) {
726
+ return (Number(amount) / Math.pow(10, decimals)).toLocaleString(void 0, {
727
+ minimumFractionDigits: 0,
728
+ maximumFractionDigits: Math.min(decimals, 6)
729
+ });
730
+ }
731
+ function formatUsd(amount, decimals, usdPrice) {
732
+ return (Number(amount) / Math.pow(10, decimals) * usdPrice).toLocaleString(void 0, {
733
+ style: "currency",
734
+ currency: "USD",
735
+ minimumFractionDigits: 2,
736
+ maximumFractionDigits: 2
737
+ });
738
+ }
739
+ function useTokens(options = {}) {
740
+ let {
741
+ includeZeroBalance = false,
742
+ autoRefresh = false,
743
+ refreshInterval = 6e4,
744
+ fetchMetadata = true,
745
+ includeNativeSol = true
746
+ } = options, { address, connected } = useAccount(), client = useSolanaClient(), [tokens, setTokens] = React.useState([]), [isLoading, setIsLoading] = React.useState(false), [error, setError] = React.useState(null), [lastUpdated, setLastUpdated] = React.useState(null), [totalAccounts, setTotalAccounts] = React.useState(0), rpcClient = client?.client ?? null, fetchTokens = React.useCallback(async () => {
747
+ if (!connected || !address || !rpcClient) {
748
+ setTokens([]), setTotalAccounts(0);
749
+ return;
750
+ }
751
+ setIsLoading(true), setError(null);
752
+ try {
753
+ let rpc = rpcClient.rpc, walletAddress = addresses.address(address), tokenProgramId = addresses.address("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"), [balanceResult, tokenAccountsResult] = await Promise.all([
754
+ includeNativeSol ? rpc.getBalance(walletAddress).send() : Promise.resolve(null),
755
+ rpc.getTokenAccountsByOwner(walletAddress, { programId: tokenProgramId }, { encoding: "jsonParsed" }).send()
756
+ ]), tokenList = [], mints = [];
757
+ if (includeNativeSol && balanceResult !== null) {
758
+ let solBalance = balanceResult.value;
759
+ (includeZeroBalance || solBalance > 0n) && (tokenList.push({
760
+ mint: NATIVE_MINT,
761
+ tokenAccount: address,
762
+ // SOL uses wallet address
763
+ amount: solBalance,
764
+ decimals: 9,
765
+ formatted: formatBalance(solBalance, 9),
766
+ isFrozen: false,
767
+ owner: address
768
+ }), mints.push(NATIVE_MINT));
769
+ }
770
+ for (let account of tokenAccountsResult.value) {
771
+ let parsed = account.account.data;
772
+ if (parsed?.parsed?.info) {
773
+ let info = parsed.parsed.info, amount = BigInt(info.tokenAmount?.amount || "0"), decimals = info.tokenAmount?.decimals || 0;
774
+ if (!includeZeroBalance && amount === 0n)
775
+ continue;
776
+ tokenList.push({
777
+ mint: info.mint,
778
+ tokenAccount: account.pubkey,
779
+ amount,
780
+ decimals,
781
+ formatted: formatBalance(amount, decimals),
782
+ isFrozen: info.state === "frozen",
783
+ owner: info.owner
784
+ }), mints.push(info.mint);
785
+ }
786
+ }
787
+ if (setTokens([...tokenList]), setTotalAccounts(tokenAccountsResult.value.length + (includeNativeSol ? 1 : 0)), setLastUpdated(/* @__PURE__ */ new Date()), fetchMetadata && mints.length > 0) {
788
+ let metadata = await fetchJupiterMetadata(mints);
789
+ for (let i = 0; i < tokenList.length; i++) {
790
+ let meta = metadata.get(tokenList[i].mint);
791
+ meta && (tokenList[i] = {
792
+ ...tokenList[i],
793
+ name: meta.name,
794
+ symbol: meta.symbol,
795
+ logo: meta.icon,
796
+ usdPrice: meta.usdPrice,
797
+ formattedUsd: formatUsd(tokenList[i].amount, tokenList[i].decimals, meta.usdPrice)
798
+ });
799
+ }
800
+ tokenList.sort((a, b) => {
801
+ let metadataSort = (b.logo ? 1 : 0) - (a.logo ? 1 : 0);
802
+ if (metadataSort !== 0) return metadataSort;
803
+ let aValue = Number(a.amount) / Math.pow(10, a.decimals) * (a.usdPrice ?? 0);
804
+ return Number(b.amount) / Math.pow(10, b.decimals) * (b.usdPrice ?? 0) - aValue;
805
+ }), setTokens([...tokenList]);
806
+ }
807
+ } catch (err) {
808
+ setError(err), console.error("[useTokens] Failed to fetch tokens:", err);
809
+ } finally {
810
+ setIsLoading(false);
811
+ }
812
+ }, [connected, address, rpcClient, includeZeroBalance, fetchMetadata, includeNativeSol]);
813
+ return React.useEffect(() => {
814
+ fetchTokens();
815
+ }, [fetchTokens]), React.useEffect(() => {
816
+ if (!connected || !autoRefresh) return;
817
+ let interval = setInterval(fetchTokens, refreshInterval);
818
+ return () => clearInterval(interval);
819
+ }, [connected, autoRefresh, refreshInterval, fetchTokens]), React.useMemo(
820
+ () => ({
821
+ tokens,
822
+ isLoading,
823
+ error,
824
+ refetch: fetchTokens,
825
+ lastUpdated,
826
+ totalAccounts
827
+ }),
828
+ [tokens, isLoading, error, fetchTokens, lastUpdated, totalAccounts]
829
+ );
830
+ }
831
+ function DisconnectElement({
832
+ variant = "menuitem",
833
+ className,
834
+ label = "Disconnect",
835
+ icon,
836
+ showIcon = true,
837
+ onDisconnect,
838
+ render
839
+ }) {
840
+ let { disconnect, connecting } = useConnector(), [disconnecting, setDisconnecting] = React__default.default.useState(false), handleDisconnect = async () => {
841
+ setDisconnecting(true);
842
+ try {
843
+ await disconnect(), onDisconnect?.();
844
+ } finally {
845
+ setDisconnecting(false);
846
+ }
847
+ };
848
+ if (render)
849
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: render({ disconnect: handleDisconnect, disconnecting }) });
850
+ let isDisabled = connecting || disconnecting, content = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
851
+ showIcon && (icon || showIcon && !icon && /* @__PURE__ */ jsxRuntime.jsxs(
852
+ "svg",
853
+ {
854
+ width: "16",
855
+ height: "16",
856
+ viewBox: "0 0 24 24",
857
+ fill: "none",
858
+ stroke: "currentColor",
859
+ strokeWidth: "2",
860
+ strokeLinecap: "round",
861
+ strokeLinejoin: "round",
862
+ className: "ck-block-icon",
863
+ "data-slot": "disconnect-element-icon",
864
+ children: [
865
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4" }),
866
+ /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "16 17 21 12 16 7" }),
867
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "21", y1: "12", x2: "9", y2: "12" })
868
+ ]
869
+ }
870
+ )),
871
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "data-slot": "disconnect-element-label", children: label })
872
+ ] });
873
+ return variant === "button" ? /* @__PURE__ */ jsxRuntime.jsx(
874
+ "button",
875
+ {
876
+ type: "button",
877
+ className: `ck-disconnect-block ck-disconnect-block--button ${className || ""}`,
878
+ onClick: handleDisconnect,
879
+ disabled: isDisabled,
880
+ "data-slot": "disconnect-element",
881
+ "data-variant": "button",
882
+ "data-disconnecting": disconnecting,
883
+ children: content
884
+ }
885
+ ) : variant === "link" ? /* @__PURE__ */ jsxRuntime.jsx(
886
+ "button",
887
+ {
888
+ type: "button",
889
+ className: `ck-disconnect-block ck-disconnect-block--link ${className || ""}`,
890
+ onClick: handleDisconnect,
891
+ disabled: isDisabled,
892
+ "data-slot": "disconnect-element",
893
+ "data-variant": "link",
894
+ "data-disconnecting": disconnecting,
895
+ children: content
896
+ }
897
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
898
+ "button",
899
+ {
900
+ type: "button",
901
+ role: "menuitem",
902
+ className: `ck-disconnect-block ck-disconnect-block--menuitem ${className || ""}`,
903
+ onClick: handleDisconnect,
904
+ disabled: isDisabled,
905
+ "data-slot": "disconnect-element",
906
+ "data-variant": "menuitem",
907
+ "data-disconnecting": disconnecting,
908
+ children: content
909
+ }
910
+ );
911
+ }
912
+ DisconnectElement.displayName = "DisconnectElement";
913
+ function AccountElement({
914
+ showAvatar = true,
915
+ showCopy = true,
916
+ showFullAddress = false,
917
+ className,
918
+ avatarSize = 32,
919
+ variant = "compact",
920
+ render
921
+ }) {
922
+ let { address, formatted, copy, copied } = useAccount(), { name: walletName, icon: walletIcon } = useWalletInfo();
923
+ if (render)
924
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: render({ address, formatted, walletName, walletIcon, copy, copied }) });
925
+ if (!address) return null;
926
+ let displayAddress = showFullAddress ? address : formatted, handleCopy = async (e) => {
927
+ e.stopPropagation(), await copy();
928
+ }, copyIcon = /* @__PURE__ */ jsxRuntime.jsx(
929
+ "svg",
930
+ {
931
+ width: "14",
932
+ height: "14",
933
+ viewBox: "0 0 24 24",
934
+ fill: "none",
935
+ stroke: "currentColor",
936
+ strokeWidth: "2",
937
+ strokeLinecap: "round",
938
+ strokeLinejoin: "round",
939
+ className: "ck-block-icon",
940
+ "data-slot": "account-element-copy-icon",
941
+ children: copied ? /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "20 6 9 17 4 12" }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
942
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2", ry: "2" }),
943
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })
944
+ ] })
945
+ }
946
+ );
947
+ return variant === "inline" ? /* @__PURE__ */ jsxRuntime.jsxs(
948
+ "div",
949
+ {
950
+ className: `ck-account-block ck-account-block--inline ${className || ""}`,
951
+ "data-slot": "account-element",
952
+ "data-variant": "inline",
953
+ children: [
954
+ showAvatar && walletIcon && /* @__PURE__ */ jsxRuntime.jsx(
955
+ "img",
956
+ {
957
+ src: walletIcon,
958
+ alt: walletName || "Wallet",
959
+ className: "ck-account-block-avatar",
960
+ style: { width: avatarSize, height: avatarSize },
961
+ "data-slot": "account-element-avatar"
962
+ }
963
+ ),
964
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ck-account-block-address", "data-slot": "account-element-address", children: displayAddress }),
965
+ showCopy && /* @__PURE__ */ jsxRuntime.jsx(
966
+ "button",
967
+ {
968
+ type: "button",
969
+ className: "ck-account-block-copy",
970
+ onClick: handleCopy,
971
+ title: copied ? "Copied!" : "Copy address",
972
+ "data-slot": "account-element-copy",
973
+ "data-copied": copied,
974
+ children: copyIcon
975
+ }
976
+ )
977
+ ]
978
+ }
979
+ ) : variant === "expanded" ? /* @__PURE__ */ jsxRuntime.jsxs(
980
+ "div",
981
+ {
982
+ className: `ck-account-block ck-account-block--expanded ${className || ""}`,
983
+ "data-slot": "account-element",
984
+ "data-variant": "expanded",
985
+ children: [
986
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ck-account-block-header", "data-slot": "account-element-header", children: [
987
+ showAvatar && walletIcon && /* @__PURE__ */ jsxRuntime.jsx(
988
+ "img",
989
+ {
990
+ src: walletIcon,
991
+ alt: walletName || "Wallet",
992
+ className: "ck-account-block-avatar",
993
+ style: { width: avatarSize, height: avatarSize },
994
+ "data-slot": "account-element-avatar"
995
+ }
996
+ ),
997
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ck-account-block-info", "data-slot": "account-element-info", children: [
998
+ walletName && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ck-account-block-wallet-name", "data-slot": "account-element-wallet-name", children: walletName }),
999
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ck-account-block-address", "data-slot": "account-element-address", children: displayAddress })
1000
+ ] })
1001
+ ] }),
1002
+ showCopy && /* @__PURE__ */ jsxRuntime.jsxs(
1003
+ "button",
1004
+ {
1005
+ type: "button",
1006
+ className: "ck-account-block-copy",
1007
+ onClick: handleCopy,
1008
+ "data-slot": "account-element-copy",
1009
+ "data-copied": copied,
1010
+ children: [
1011
+ copyIcon,
1012
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: copied ? "Copied!" : "Copy" })
1013
+ ]
1014
+ }
1015
+ )
1016
+ ]
1017
+ }
1018
+ ) : /* @__PURE__ */ jsxRuntime.jsxs(
1019
+ "div",
1020
+ {
1021
+ className: `ck-account-block ck-account-block--compact ${className || ""}`,
1022
+ "data-slot": "account-element",
1023
+ "data-variant": "compact",
1024
+ children: [
1025
+ showAvatar && walletIcon && /* @__PURE__ */ jsxRuntime.jsx(
1026
+ "img",
1027
+ {
1028
+ src: walletIcon,
1029
+ alt: walletName || "Wallet",
1030
+ className: "ck-account-block-avatar",
1031
+ style: { width: avatarSize, height: avatarSize },
1032
+ "data-slot": "account-element-avatar"
1033
+ }
1034
+ ),
1035
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ck-account-block-content", "data-slot": "account-element-content", children: [
1036
+ walletName && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ck-account-block-wallet-name", "data-slot": "account-element-wallet-name", children: walletName }),
1037
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ck-account-block-address", "data-slot": "account-element-address", children: displayAddress })
1038
+ ] }),
1039
+ showCopy && /* @__PURE__ */ jsxRuntime.jsx(
1040
+ "button",
1041
+ {
1042
+ type: "button",
1043
+ className: "ck-account-block-copy",
1044
+ onClick: handleCopy,
1045
+ title: copied ? "Copied!" : "Copy address",
1046
+ "data-slot": "account-element-copy",
1047
+ "data-copied": copied,
1048
+ children: copyIcon
1049
+ }
1050
+ )
1051
+ ]
1052
+ }
1053
+ );
1054
+ }
1055
+ AccountElement.displayName = "AccountElement";
1056
+ var DEFAULT_LABELS = {
1057
+ "mainnet-beta": "Mainnet",
1058
+ devnet: "Devnet",
1059
+ testnet: "Testnet",
1060
+ localnet: "Localnet"
1061
+ };
1062
+ function getClusterColor(clusterId) {
1063
+ switch (clusterId) {
1064
+ case "mainnet-beta":
1065
+ return "var(--ck-cluster-mainnet, #22c55e)";
1066
+ case "devnet":
1067
+ return "var(--ck-cluster-devnet, #3b82f6)";
1068
+ case "testnet":
1069
+ return "var(--ck-cluster-testnet, #eab308)";
1070
+ case "localnet":
1071
+ return "var(--ck-cluster-localnet, #ef4444)";
1072
+ default:
1073
+ return "var(--ck-cluster-custom, #8b5cf6)";
1074
+ }
1075
+ }
1076
+ function ClusterElement({
1077
+ variant = "badge",
1078
+ className,
1079
+ allowChange = false,
1080
+ showIndicator = true,
1081
+ labels = {},
1082
+ render
1083
+ }) {
1084
+ let { cluster, clusters, setCluster, isMainnet, isDevnet, isTestnet, isLocal } = useCluster(), [isOpen, setIsOpen] = React__default.default.useState(false);
1085
+ if (render)
1086
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: render({ cluster, clusters, setCluster, isMainnet, isDevnet, isTestnet, isLocal }) });
1087
+ if (!cluster) return null;
1088
+ let allLabels = { ...DEFAULT_LABELS, ...labels }, displayLabel = allLabels[cluster.id] || cluster.label || cluster.id, color = getClusterColor(cluster.id), indicator = showIndicator && /* @__PURE__ */ jsxRuntime.jsx(
1089
+ "span",
1090
+ {
1091
+ className: "ck-cluster-indicator",
1092
+ style: { backgroundColor: color },
1093
+ "data-slot": "cluster-element-indicator",
1094
+ "aria-hidden": "true"
1095
+ }
1096
+ );
1097
+ return variant === "badge" ? /* @__PURE__ */ jsxRuntime.jsxs(
1098
+ "span",
1099
+ {
1100
+ className: `ck-cluster-block ck-cluster-block--badge ${className || ""}`,
1101
+ "data-slot": "cluster-element",
1102
+ "data-variant": "badge",
1103
+ "data-cluster": cluster.id,
1104
+ children: [
1105
+ indicator,
1106
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "data-slot": "cluster-element-label", children: displayLabel })
1107
+ ]
1108
+ }
1109
+ ) : variant === "menuitem" ? allowChange ? /* @__PURE__ */ jsxRuntime.jsxs(
1110
+ "div",
1111
+ {
1112
+ className: `ck-cluster-block ck-cluster-block--menuitem ${className || ""}`,
1113
+ "data-slot": "cluster-element",
1114
+ "data-variant": "menuitem",
1115
+ "data-cluster": cluster.id,
1116
+ children: [
1117
+ /* @__PURE__ */ jsxRuntime.jsxs(
1118
+ "button",
1119
+ {
1120
+ type: "button",
1121
+ className: "ck-cluster-block-trigger",
1122
+ onClick: () => setIsOpen(!isOpen),
1123
+ "data-slot": "cluster-element-trigger",
1124
+ children: [
1125
+ indicator,
1126
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "data-slot": "cluster-element-label", children: displayLabel }),
1127
+ /* @__PURE__ */ jsxRuntime.jsx(
1128
+ "svg",
1129
+ {
1130
+ width: "12",
1131
+ height: "12",
1132
+ viewBox: "0 0 24 24",
1133
+ fill: "none",
1134
+ stroke: "currentColor",
1135
+ strokeWidth: "2",
1136
+ className: `ck-cluster-block-chevron ${isOpen ? "ck-cluster-block-chevron--open" : ""}`,
1137
+ "data-slot": "cluster-element-chevron",
1138
+ children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "6 9 12 15 18 9" })
1139
+ }
1140
+ )
1141
+ ]
1142
+ }
1143
+ ),
1144
+ isOpen && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ck-cluster-block-options", "data-slot": "cluster-element-options", children: clusters.map((c) => {
1145
+ let cLabel = allLabels[c.id] || c.label || c.id, cColor = getClusterColor(c.id), isSelected = c.id === cluster.id;
1146
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1147
+ "button",
1148
+ {
1149
+ type: "button",
1150
+ className: `ck-cluster-block-option ${isSelected ? "ck-cluster-block-option--selected" : ""}`,
1151
+ onClick: () => {
1152
+ setCluster(c.id), setIsOpen(false);
1153
+ },
1154
+ "data-slot": "cluster-element-option",
1155
+ "data-selected": isSelected,
1156
+ children: [
1157
+ /* @__PURE__ */ jsxRuntime.jsx(
1158
+ "span",
1159
+ {
1160
+ className: "ck-cluster-indicator",
1161
+ style: { backgroundColor: cColor },
1162
+ "data-slot": "cluster-element-indicator"
1163
+ }
1164
+ ),
1165
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: cLabel }),
1166
+ isSelected && /* @__PURE__ */ jsxRuntime.jsx(
1167
+ "svg",
1168
+ {
1169
+ width: "12",
1170
+ height: "12",
1171
+ viewBox: "0 0 24 24",
1172
+ fill: "none",
1173
+ stroke: "currentColor",
1174
+ strokeWidth: "3",
1175
+ className: "ck-cluster-block-check",
1176
+ "data-slot": "cluster-element-check",
1177
+ children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "20 6 9 17 4 12" })
1178
+ }
1179
+ )
1180
+ ]
1181
+ },
1182
+ c.id
1183
+ );
1184
+ }) })
1185
+ ]
1186
+ }
1187
+ ) : /* @__PURE__ */ jsxRuntime.jsxs(
1188
+ "div",
1189
+ {
1190
+ className: `ck-cluster-block ck-cluster-block--menuitem ${className || ""}`,
1191
+ role: "menuitem",
1192
+ "data-slot": "cluster-element",
1193
+ "data-variant": "menuitem",
1194
+ "data-cluster": cluster.id,
1195
+ children: [
1196
+ indicator,
1197
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "data-slot": "cluster-element-label", children: displayLabel })
1198
+ ]
1199
+ }
1200
+ ) : /* @__PURE__ */ jsxRuntime.jsxs(
1201
+ "div",
1202
+ {
1203
+ className: `ck-cluster-block ck-cluster-block--select ${className || ""}`,
1204
+ "data-slot": "cluster-element",
1205
+ "data-variant": "select",
1206
+ "data-cluster": cluster.id,
1207
+ children: [
1208
+ /* @__PURE__ */ jsxRuntime.jsxs(
1209
+ "button",
1210
+ {
1211
+ type: "button",
1212
+ className: "ck-cluster-block-trigger",
1213
+ onClick: () => setIsOpen(!isOpen),
1214
+ disabled: !allowChange,
1215
+ "data-slot": "cluster-element-trigger",
1216
+ children: [
1217
+ indicator,
1218
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "data-slot": "cluster-element-label", children: displayLabel }),
1219
+ allowChange && /* @__PURE__ */ jsxRuntime.jsx(
1220
+ "svg",
1221
+ {
1222
+ width: "12",
1223
+ height: "12",
1224
+ viewBox: "0 0 24 24",
1225
+ fill: "none",
1226
+ stroke: "currentColor",
1227
+ strokeWidth: "2",
1228
+ className: `ck-cluster-block-chevron ${isOpen ? "ck-cluster-block-chevron--open" : ""}`,
1229
+ "data-slot": "cluster-element-chevron",
1230
+ children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "6 9 12 15 18 9" })
1231
+ }
1232
+ )
1233
+ ]
1234
+ }
1235
+ ),
1236
+ isOpen && allowChange && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1237
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ck-cluster-block-backdrop", onClick: () => setIsOpen(false), "aria-hidden": "true" }),
1238
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ck-cluster-block-options", "data-slot": "cluster-element-options", children: clusters.map((c) => {
1239
+ let cLabel = allLabels[c.id] || c.label || c.id, cColor = getClusterColor(c.id), isSelected = c.id === cluster.id;
1240
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1241
+ "button",
1242
+ {
1243
+ type: "button",
1244
+ className: `ck-cluster-block-option ${isSelected ? "ck-cluster-block-option--selected" : ""}`,
1245
+ onClick: () => {
1246
+ setCluster(c.id), setIsOpen(false);
1247
+ },
1248
+ "data-slot": "cluster-element-option",
1249
+ "data-selected": isSelected,
1250
+ children: [
1251
+ /* @__PURE__ */ jsxRuntime.jsx(
1252
+ "span",
1253
+ {
1254
+ className: "ck-cluster-indicator",
1255
+ style: { backgroundColor: cColor },
1256
+ "data-slot": "cluster-element-indicator"
1257
+ }
1258
+ ),
1259
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: cLabel }),
1260
+ isSelected && /* @__PURE__ */ jsxRuntime.jsx(
1261
+ "svg",
1262
+ {
1263
+ width: "12",
1264
+ height: "12",
1265
+ viewBox: "0 0 24 24",
1266
+ fill: "none",
1267
+ stroke: "currentColor",
1268
+ strokeWidth: "3",
1269
+ className: "ck-cluster-block-check",
1270
+ "data-slot": "cluster-element-check",
1271
+ children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "20 6 9 17 4 12" })
1272
+ }
1273
+ )
1274
+ ]
1275
+ },
1276
+ c.id
1277
+ );
1278
+ }) })
1279
+ ] })
1280
+ ]
1281
+ }
1282
+ );
1283
+ }
1284
+ ClusterElement.displayName = "ClusterElement";
1285
+ function WalletListElement({
1286
+ installedOnly = false,
1287
+ className,
1288
+ variant = "list",
1289
+ showStatus = true,
1290
+ onSelect,
1291
+ render,
1292
+ renderWallet
1293
+ }) {
1294
+ let { wallets, connecting } = useWalletInfo(), { select } = useConnector(), installedWallets = wallets.filter((w) => w.installed), displayWallets = installedOnly ? installedWallets : wallets, handleSelect = async (walletName) => {
1295
+ await select(walletName), onSelect?.(walletName);
1296
+ };
1297
+ if (render)
1298
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: render({ wallets, installedWallets, select: handleSelect, connecting }) });
1299
+ if (displayWallets.length === 0)
1300
+ return /* @__PURE__ */ jsxRuntime.jsx(
1301
+ "div",
1302
+ {
1303
+ className: `ck-wallet-list-block ck-wallet-list-block--empty ${className || ""}`,
1304
+ "data-slot": "wallet-list-element",
1305
+ "data-empty": "true",
1306
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ck-wallet-list-empty", "data-slot": "wallet-list-empty", children: [
1307
+ /* @__PURE__ */ jsxRuntime.jsxs(
1308
+ "svg",
1309
+ {
1310
+ width: "48",
1311
+ height: "48",
1312
+ viewBox: "0 0 24 24",
1313
+ fill: "none",
1314
+ stroke: "currentColor",
1315
+ strokeWidth: "1.5",
1316
+ strokeLinecap: "round",
1317
+ strokeLinejoin: "round",
1318
+ className: "ck-wallet-list-empty-icon",
1319
+ "data-slot": "wallet-list-empty-icon",
1320
+ children: [
1321
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1" }),
1322
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4" })
1323
+ ]
1324
+ }
1325
+ ),
1326
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "ck-wallet-list-empty-text", "data-slot": "wallet-list-empty-text", children: installedOnly ? "No wallets detected" : "No wallets available" }),
1327
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "ck-wallet-list-empty-hint", "data-slot": "wallet-list-empty-hint", children: "Install a Solana wallet extension to continue" })
1328
+ ] })
1329
+ }
1330
+ );
1331
+ let walletIcon = /* @__PURE__ */ jsxRuntime.jsxs(
1332
+ "svg",
1333
+ {
1334
+ width: "20",
1335
+ height: "20",
1336
+ viewBox: "0 0 24 24",
1337
+ fill: "none",
1338
+ stroke: "currentColor",
1339
+ strokeWidth: "2",
1340
+ strokeLinecap: "round",
1341
+ strokeLinejoin: "round",
1342
+ className: "ck-wallet-list-item-fallback-icon",
1343
+ "data-slot": "wallet-list-item-fallback-icon",
1344
+ children: [
1345
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1" }),
1346
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4" })
1347
+ ]
1348
+ }
1349
+ );
1350
+ return variant === "grid" ? /* @__PURE__ */ jsxRuntime.jsx(
1351
+ "div",
1352
+ {
1353
+ className: `ck-wallet-list-block ck-wallet-list-block--grid ${className || ""}`,
1354
+ "data-slot": "wallet-list-element",
1355
+ "data-variant": "grid",
1356
+ children: displayWallets.map((wallet) => renderWallet ? /* @__PURE__ */ jsxRuntime.jsx(React__default.default.Fragment, { children: renderWallet({
1357
+ wallet,
1358
+ select: () => handleSelect(wallet.name),
1359
+ connecting
1360
+ }) }, wallet.name) : /* @__PURE__ */ jsxRuntime.jsxs(
1361
+ "button",
1362
+ {
1363
+ type: "button",
1364
+ className: "ck-wallet-list-item ck-wallet-list-item--grid",
1365
+ onClick: () => handleSelect(wallet.name),
1366
+ disabled: connecting || !wallet.installed && installedOnly,
1367
+ "data-slot": "wallet-list-item",
1368
+ "data-wallet": wallet.name,
1369
+ "data-installed": wallet.installed,
1370
+ children: [
1371
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ck-wallet-list-item-icon", "data-slot": "wallet-list-item-icon", children: wallet.icon ? /* @__PURE__ */ jsxRuntime.jsx("img", { src: wallet.icon, alt: wallet.name }) : walletIcon }),
1372
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ck-wallet-list-item-name", "data-slot": "wallet-list-item-name", children: wallet.name }),
1373
+ showStatus && !wallet.installed && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ck-wallet-list-item-status", "data-slot": "wallet-list-item-status", children: "Not installed" })
1374
+ ]
1375
+ },
1376
+ wallet.name
1377
+ ))
1378
+ }
1379
+ ) : variant === "compact" ? /* @__PURE__ */ jsxRuntime.jsx(
1380
+ "div",
1381
+ {
1382
+ className: `ck-wallet-list-block ck-wallet-list-block--compact ${className || ""}`,
1383
+ "data-slot": "wallet-list-element",
1384
+ "data-variant": "compact",
1385
+ children: displayWallets.map((wallet) => renderWallet ? /* @__PURE__ */ jsxRuntime.jsx(React__default.default.Fragment, { children: renderWallet({
1386
+ wallet,
1387
+ select: () => handleSelect(wallet.name),
1388
+ connecting
1389
+ }) }, wallet.name) : /* @__PURE__ */ jsxRuntime.jsxs(
1390
+ "button",
1391
+ {
1392
+ type: "button",
1393
+ className: "ck-wallet-list-item ck-wallet-list-item--compact",
1394
+ onClick: () => handleSelect(wallet.name),
1395
+ disabled: connecting || !wallet.installed && installedOnly,
1396
+ "data-slot": "wallet-list-item",
1397
+ "data-wallet": wallet.name,
1398
+ "data-installed": wallet.installed,
1399
+ children: [
1400
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ck-wallet-list-item-icon", "data-slot": "wallet-list-item-icon", children: wallet.icon ? /* @__PURE__ */ jsxRuntime.jsx("img", { src: wallet.icon, alt: wallet.name }) : walletIcon }),
1401
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ck-wallet-list-item-name", "data-slot": "wallet-list-item-name", children: wallet.name })
1402
+ ]
1403
+ },
1404
+ wallet.name
1405
+ ))
1406
+ }
1407
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
1408
+ "div",
1409
+ {
1410
+ className: `ck-wallet-list-block ck-wallet-list-block--list ${className || ""}`,
1411
+ "data-slot": "wallet-list-element",
1412
+ "data-variant": "list",
1413
+ children: displayWallets.map((wallet) => renderWallet ? /* @__PURE__ */ jsxRuntime.jsx(React__default.default.Fragment, { children: renderWallet({
1414
+ wallet,
1415
+ select: () => handleSelect(wallet.name),
1416
+ connecting
1417
+ }) }, wallet.name) : /* @__PURE__ */ jsxRuntime.jsxs(
1418
+ "button",
1419
+ {
1420
+ type: "button",
1421
+ className: "ck-wallet-list-item ck-wallet-list-item--list",
1422
+ onClick: () => handleSelect(wallet.name),
1423
+ disabled: connecting || !wallet.installed && installedOnly,
1424
+ "data-slot": "wallet-list-item",
1425
+ "data-wallet": wallet.name,
1426
+ "data-installed": wallet.installed,
1427
+ children: [
1428
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ck-wallet-list-item-icon", "data-slot": "wallet-list-item-icon", children: wallet.icon ? /* @__PURE__ */ jsxRuntime.jsx("img", { src: wallet.icon, alt: wallet.name }) : walletIcon }),
1429
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ck-wallet-list-item-info", "data-slot": "wallet-list-item-info", children: [
1430
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ck-wallet-list-item-name", "data-slot": "wallet-list-item-name", children: wallet.name }),
1431
+ showStatus && /* @__PURE__ */ jsxRuntime.jsx(
1432
+ "span",
1433
+ {
1434
+ className: "ck-wallet-list-item-status",
1435
+ "data-slot": "wallet-list-item-status",
1436
+ "data-installed": wallet.installed,
1437
+ children: wallet.installed ? "Detected" : "Not installed"
1438
+ }
1439
+ )
1440
+ ] }),
1441
+ /* @__PURE__ */ jsxRuntime.jsx(
1442
+ "svg",
1443
+ {
1444
+ width: "16",
1445
+ height: "16",
1446
+ viewBox: "0 0 24 24",
1447
+ fill: "none",
1448
+ stroke: "currentColor",
1449
+ strokeWidth: "2",
1450
+ strokeLinecap: "round",
1451
+ strokeLinejoin: "round",
1452
+ className: "ck-wallet-list-item-arrow",
1453
+ "data-slot": "wallet-list-item-arrow",
1454
+ children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "9 18 15 12 9 6" })
1455
+ }
1456
+ )
1457
+ ]
1458
+ },
1459
+ wallet.name
1460
+ ))
1461
+ }
1462
+ );
1463
+ }
1464
+ WalletListElement.displayName = "WalletListElement";
1465
+ function BalanceElement({
1466
+ showSol = true,
1467
+ showTokens = false,
1468
+ tokenCount = 3,
1469
+ className,
1470
+ variant = "compact",
1471
+ showRefresh = false,
1472
+ showSkeleton = true,
1473
+ render
1474
+ }) {
1475
+ let { solBalance, formattedSol, tokens, isLoading, error, refetch } = useBalance();
1476
+ if (render)
1477
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: render({ solBalance, formattedSol, tokens, isLoading, error, refetch }) });
1478
+ let displayTokens = tokens.slice(0, tokenCount), refreshIcon = /* @__PURE__ */ jsxRuntime.jsxs(
1479
+ "svg",
1480
+ {
1481
+ width: "14",
1482
+ height: "14",
1483
+ viewBox: "0 0 24 24",
1484
+ fill: "none",
1485
+ stroke: "currentColor",
1486
+ strokeWidth: "2",
1487
+ strokeLinecap: "round",
1488
+ strokeLinejoin: "round",
1489
+ className: `ck-block-icon ${isLoading ? "ck-block-icon--spinning" : ""}`,
1490
+ "data-slot": "balance-element-refresh-icon",
1491
+ children: [
1492
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8" }),
1493
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 3v5h5" }),
1494
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16" }),
1495
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M16 16h5v5" })
1496
+ ]
1497
+ }
1498
+ );
1499
+ return isLoading && showSkeleton && solBalance === 0 ? /* @__PURE__ */ jsxRuntime.jsx(
1500
+ "div",
1501
+ {
1502
+ className: `ck-balance-block ck-balance-block--${variant} ck-balance-block--loading ${className || ""}`,
1503
+ "data-slot": "balance-element",
1504
+ "data-variant": variant,
1505
+ "data-loading": "true",
1506
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ck-balance-block-skeleton", "data-slot": "balance-element-skeleton", children: [
1507
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ck-skeleton ck-skeleton--text" }),
1508
+ showTokens && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1509
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ck-skeleton ck-skeleton--text ck-skeleton--short" }),
1510
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ck-skeleton ck-skeleton--text ck-skeleton--short" })
1511
+ ] })
1512
+ ] })
1513
+ }
1514
+ ) : error ? /* @__PURE__ */ jsxRuntime.jsxs(
1515
+ "div",
1516
+ {
1517
+ className: `ck-balance-block ck-balance-block--${variant} ck-balance-block--error ${className || ""}`,
1518
+ "data-slot": "balance-element",
1519
+ "data-variant": variant,
1520
+ "data-error": "true",
1521
+ children: [
1522
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ck-balance-block-error", "data-slot": "balance-element-error", children: "Failed to load balance" }),
1523
+ showRefresh && /* @__PURE__ */ jsxRuntime.jsx(
1524
+ "button",
1525
+ {
1526
+ type: "button",
1527
+ className: "ck-balance-block-refresh",
1528
+ onClick: () => refetch(),
1529
+ "data-slot": "balance-element-refresh",
1530
+ children: refreshIcon
1531
+ }
1532
+ )
1533
+ ]
1534
+ }
1535
+ ) : variant === "inline" ? /* @__PURE__ */ jsxRuntime.jsxs(
1536
+ "div",
1537
+ {
1538
+ className: `ck-balance-block ck-balance-block--inline ${className || ""}`,
1539
+ "data-slot": "balance-element",
1540
+ "data-variant": "inline",
1541
+ children: [
1542
+ showSol && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ck-balance-block-sol", "data-slot": "balance-element-sol", children: formattedSol }),
1543
+ showRefresh && /* @__PURE__ */ jsxRuntime.jsx(
1544
+ "button",
1545
+ {
1546
+ type: "button",
1547
+ className: "ck-balance-block-refresh",
1548
+ onClick: () => refetch(),
1549
+ disabled: isLoading,
1550
+ "data-slot": "balance-element-refresh",
1551
+ children: refreshIcon
1552
+ }
1553
+ )
1554
+ ]
1555
+ }
1556
+ ) : variant === "expanded" ? /* @__PURE__ */ jsxRuntime.jsxs(
1557
+ "div",
1558
+ {
1559
+ className: `ck-balance-block ck-balance-block--expanded ${className || ""}`,
1560
+ "data-slot": "balance-element",
1561
+ "data-variant": "expanded",
1562
+ children: [
1563
+ showSol && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ck-balance-block-sol-section", "data-slot": "balance-element-sol-section", children: [
1564
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ck-balance-block-label", "data-slot": "balance-element-label", children: "SOL Balance" }),
1565
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ck-balance-block-sol", "data-slot": "balance-element-sol", children: formattedSol })
1566
+ ] }),
1567
+ showTokens && displayTokens.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ck-balance-block-tokens-section", "data-slot": "balance-element-tokens-section", children: [
1568
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ck-balance-block-label", "data-slot": "balance-element-label", children: [
1569
+ "Tokens (",
1570
+ tokens.length,
1571
+ ")"
1572
+ ] }),
1573
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ck-balance-block-tokens", "data-slot": "balance-element-tokens", children: [
1574
+ displayTokens.map((token) => /* @__PURE__ */ jsxRuntime.jsxs(
1575
+ "div",
1576
+ {
1577
+ className: "ck-balance-block-token",
1578
+ "data-slot": "balance-element-token",
1579
+ children: [
1580
+ token.logo && /* @__PURE__ */ jsxRuntime.jsx(
1581
+ "img",
1582
+ {
1583
+ src: token.logo,
1584
+ alt: token.symbol || "Token",
1585
+ className: "ck-balance-block-token-logo",
1586
+ "data-slot": "balance-element-token-logo"
1587
+ }
1588
+ ),
1589
+ /* @__PURE__ */ jsxRuntime.jsxs(
1590
+ "span",
1591
+ {
1592
+ className: "ck-balance-block-token-info",
1593
+ "data-slot": "balance-element-token-info",
1594
+ children: [
1595
+ /* @__PURE__ */ jsxRuntime.jsx(
1596
+ "span",
1597
+ {
1598
+ className: "ck-balance-block-token-symbol",
1599
+ "data-slot": "balance-element-token-symbol",
1600
+ children: token.symbol || token.mint.slice(0, 4) + "..." + token.mint.slice(-4)
1601
+ }
1602
+ ),
1603
+ /* @__PURE__ */ jsxRuntime.jsx(
1604
+ "span",
1605
+ {
1606
+ className: "ck-balance-block-token-amount",
1607
+ "data-slot": "balance-element-token-amount",
1608
+ children: token.formatted
1609
+ }
1610
+ )
1611
+ ]
1612
+ }
1613
+ )
1614
+ ]
1615
+ },
1616
+ token.mint
1617
+ )),
1618
+ tokens.length > tokenCount && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ck-balance-block-more", "data-slot": "balance-element-more", children: [
1619
+ "+",
1620
+ tokens.length - tokenCount,
1621
+ " more"
1622
+ ] })
1623
+ ] })
1624
+ ] }),
1625
+ showRefresh && /* @__PURE__ */ jsxRuntime.jsxs(
1626
+ "button",
1627
+ {
1628
+ type: "button",
1629
+ className: "ck-balance-block-refresh",
1630
+ onClick: () => refetch(),
1631
+ disabled: isLoading,
1632
+ "data-slot": "balance-element-refresh",
1633
+ children: [
1634
+ refreshIcon,
1635
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "Refresh" })
1636
+ ]
1637
+ }
1638
+ )
1639
+ ]
1640
+ }
1641
+ ) : /* @__PURE__ */ jsxRuntime.jsxs(
1642
+ "div",
1643
+ {
1644
+ className: `ck-balance-block ck-balance-block--compact ${className || ""}`,
1645
+ "data-slot": "balance-element",
1646
+ "data-variant": "compact",
1647
+ children: [
1648
+ showSol && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ck-balance-block-sol", "data-slot": "balance-element-sol", children: formattedSol }),
1649
+ showTokens && displayTokens.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ck-balance-block-token-count", "data-slot": "balance-element-token-count", children: [
1650
+ "+",
1651
+ tokens.length,
1652
+ " tokens"
1653
+ ] }),
1654
+ showRefresh && /* @__PURE__ */ jsxRuntime.jsx(
1655
+ "button",
1656
+ {
1657
+ type: "button",
1658
+ className: "ck-balance-block-refresh",
1659
+ onClick: () => refetch(),
1660
+ disabled: isLoading,
1661
+ "data-slot": "balance-element-refresh",
1662
+ children: refreshIcon
1663
+ }
1664
+ )
1665
+ ]
1666
+ }
1667
+ );
1668
+ }
1669
+ BalanceElement.displayName = "BalanceElement";
1670
+ function TransactionHistoryElement({
1671
+ limit = 5,
1672
+ showStatus = true,
1673
+ showTime = true,
1674
+ className,
1675
+ variant = "list",
1676
+ showLoadMore = false,
1677
+ showSkeleton = true,
1678
+ render,
1679
+ renderItem
1680
+ }) {
1681
+ let { transactions, isLoading, error, hasMore, loadMore, refetch } = useTransactions({ limit });
1682
+ if (render)
1683
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: render({ transactions, isLoading, error, hasMore, loadMore, refetch }) });
1684
+ let statusIcon = (status) => /* @__PURE__ */ jsxRuntime.jsx(
1685
+ "svg",
1686
+ {
1687
+ width: "12",
1688
+ height: "12",
1689
+ viewBox: "0 0 24 24",
1690
+ fill: "none",
1691
+ stroke: "currentColor",
1692
+ strokeWidth: "2",
1693
+ strokeLinecap: "round",
1694
+ strokeLinejoin: "round",
1695
+ className: `ck-tx-status-icon ck-tx-status-icon--${status}`,
1696
+ "data-slot": "tx-status-icon",
1697
+ "data-status": status,
1698
+ children: status === "success" ? /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "20 6 9 17 4 12" }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1699
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
1700
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
1701
+ ] })
1702
+ }
1703
+ ), externalLinkIcon = /* @__PURE__ */ jsxRuntime.jsxs(
1704
+ "svg",
1705
+ {
1706
+ width: "12",
1707
+ height: "12",
1708
+ viewBox: "0 0 24 24",
1709
+ fill: "none",
1710
+ stroke: "currentColor",
1711
+ strokeWidth: "2",
1712
+ strokeLinecap: "round",
1713
+ strokeLinejoin: "round",
1714
+ className: "ck-block-icon",
1715
+ "data-slot": "tx-external-link-icon",
1716
+ children: [
1717
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" }),
1718
+ /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "15 3 21 3 21 9" }),
1719
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "10", y1: "14", x2: "21", y2: "3" })
1720
+ ]
1721
+ }
1722
+ );
1723
+ if (isLoading && showSkeleton && transactions.length === 0)
1724
+ return /* @__PURE__ */ jsxRuntime.jsx(
1725
+ "div",
1726
+ {
1727
+ className: `ck-tx-history-block ck-tx-history-block--${variant} ck-tx-history-block--loading ${className || ""}`,
1728
+ "data-slot": "tx-history-element",
1729
+ "data-variant": variant,
1730
+ "data-loading": "true",
1731
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ck-tx-history-skeleton", "data-slot": "tx-history-skeleton", children: Array.from({ length: Math.min(limit, 3) }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ck-skeleton ck-skeleton--tx" }, i)) })
1732
+ }
1733
+ );
1734
+ if (error)
1735
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1736
+ "div",
1737
+ {
1738
+ className: `ck-tx-history-block ck-tx-history-block--${variant} ck-tx-history-block--error ${className || ""}`,
1739
+ "data-slot": "tx-history-element",
1740
+ "data-variant": variant,
1741
+ "data-error": "true",
1742
+ children: [
1743
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ck-tx-history-error", "data-slot": "tx-history-error", children: "Failed to load transactions" }),
1744
+ /* @__PURE__ */ jsxRuntime.jsx(
1745
+ "button",
1746
+ {
1747
+ type: "button",
1748
+ className: "ck-tx-history-retry",
1749
+ onClick: () => refetch(),
1750
+ "data-slot": "tx-history-retry",
1751
+ children: "Retry"
1752
+ }
1753
+ )
1754
+ ]
1755
+ }
1756
+ );
1757
+ if (transactions.length === 0)
1758
+ return /* @__PURE__ */ jsxRuntime.jsx(
1759
+ "div",
1760
+ {
1761
+ className: `ck-tx-history-block ck-tx-history-block--${variant} ck-tx-history-block--empty ${className || ""}`,
1762
+ "data-slot": "tx-history-element",
1763
+ "data-variant": variant,
1764
+ "data-empty": "true",
1765
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ck-tx-history-empty", "data-slot": "tx-history-empty", children: "No transactions yet" })
1766
+ }
1767
+ );
1768
+ let itemRenderer = renderItem || ((tx) => /* @__PURE__ */ jsxRuntime.jsxs(
1769
+ "a",
1770
+ {
1771
+ href: tx.explorerUrl,
1772
+ target: "_blank",
1773
+ rel: "noopener noreferrer",
1774
+ className: "ck-tx-item",
1775
+ "data-slot": "tx-item",
1776
+ "data-status": tx.status,
1777
+ children: [
1778
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ck-tx-item-main", "data-slot": "tx-item-main", children: [
1779
+ showStatus && /* @__PURE__ */ jsxRuntime.jsx(
1780
+ "span",
1781
+ {
1782
+ className: `ck-tx-status ck-tx-status--${tx.status}`,
1783
+ "data-slot": "tx-status",
1784
+ "data-status": tx.status,
1785
+ children: statusIcon(tx.status)
1786
+ }
1787
+ ),
1788
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ck-tx-signature", "data-slot": "tx-signature", children: [
1789
+ tx.signature.slice(0, 8),
1790
+ "...",
1791
+ tx.signature.slice(-8)
1792
+ ] })
1793
+ ] }),
1794
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ck-tx-item-meta", "data-slot": "tx-item-meta", children: [
1795
+ showTime && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ck-tx-time", "data-slot": "tx-time", children: [
1796
+ tx.formattedDate,
1797
+ " ",
1798
+ tx.formattedTime
1799
+ ] }),
1800
+ externalLinkIcon
1801
+ ] })
1802
+ ]
1803
+ },
1804
+ tx.signature
1805
+ ));
1806
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1807
+ "div",
1808
+ {
1809
+ className: `ck-tx-history-block ck-tx-history-block--${variant} ${className || ""}`,
1810
+ "data-slot": "tx-history-element",
1811
+ "data-variant": variant,
1812
+ children: [
1813
+ variant === "expanded" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ck-tx-history-header", "data-slot": "tx-history-header", children: [
1814
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ck-tx-history-title", "data-slot": "tx-history-title", children: "Recent Transactions" }),
1815
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ck-tx-history-count", "data-slot": "tx-history-count", children: transactions.length })
1816
+ ] }),
1817
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ck-tx-history-list", "data-slot": "tx-history-list", children: transactions.map(itemRenderer) }),
1818
+ showLoadMore && hasMore && /* @__PURE__ */ jsxRuntime.jsx(
1819
+ "button",
1820
+ {
1821
+ type: "button",
1822
+ className: "ck-tx-history-load-more",
1823
+ onClick: () => loadMore(),
1824
+ disabled: isLoading,
1825
+ "data-slot": "tx-history-load-more",
1826
+ children: isLoading ? "Loading..." : "Load more"
1827
+ }
1828
+ )
1829
+ ]
1830
+ }
1831
+ );
1832
+ }
1833
+ TransactionHistoryElement.displayName = "TransactionHistoryElement";
1834
+ function TokenListElement({
1835
+ limit = 10,
1836
+ showValue = false,
1837
+ className,
1838
+ variant = "compact",
1839
+ showRefresh = false,
1840
+ showSkeleton = true,
1841
+ render,
1842
+ renderItem
1843
+ }) {
1844
+ let { tokens, isLoading, error, refetch, totalAccounts } = useTokens();
1845
+ if (render)
1846
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: render({ tokens, isLoading, error, refetch, totalAccounts }) });
1847
+ let displayTokens = tokens.slice(0, limit), refreshIcon = /* @__PURE__ */ jsxRuntime.jsxs(
1848
+ "svg",
1849
+ {
1850
+ width: "14",
1851
+ height: "14",
1852
+ viewBox: "0 0 24 24",
1853
+ fill: "none",
1854
+ stroke: "currentColor",
1855
+ strokeWidth: "2",
1856
+ strokeLinecap: "round",
1857
+ strokeLinejoin: "round",
1858
+ className: `ck-block-icon ${isLoading ? "ck-block-icon--spinning" : ""}`,
1859
+ "data-slot": "token-list-refresh-icon",
1860
+ children: [
1861
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8" }),
1862
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 3v5h5" }),
1863
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16" }),
1864
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M16 16h5v5" })
1865
+ ]
1866
+ }
1867
+ ), tokenIcon = /* @__PURE__ */ jsxRuntime.jsxs(
1868
+ "svg",
1869
+ {
1870
+ width: "20",
1871
+ height: "20",
1872
+ viewBox: "0 0 24 24",
1873
+ fill: "none",
1874
+ stroke: "currentColor",
1875
+ strokeWidth: "2",
1876
+ strokeLinecap: "round",
1877
+ strokeLinejoin: "round",
1878
+ className: "ck-token-placeholder-icon",
1879
+ "data-slot": "token-placeholder-icon",
1880
+ children: [
1881
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10" }),
1882
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 6v12" }),
1883
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 12h12" })
1884
+ ]
1885
+ }
1886
+ );
1887
+ if (isLoading && showSkeleton && tokens.length === 0)
1888
+ return /* @__PURE__ */ jsxRuntime.jsx(
1889
+ "div",
1890
+ {
1891
+ className: `ck-token-list-block ck-token-list-block--${variant} ck-token-list-block--loading ${className || ""}`,
1892
+ "data-slot": "token-list-element",
1893
+ "data-variant": variant,
1894
+ "data-loading": "true",
1895
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ck-token-list-skeleton", "data-slot": "token-list-skeleton", children: Array.from({ length: Math.min(limit, 3) }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ck-skeleton ck-skeleton--token" }, i)) })
1896
+ }
1897
+ );
1898
+ if (error)
1899
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1900
+ "div",
1901
+ {
1902
+ className: `ck-token-list-block ck-token-list-block--${variant} ck-token-list-block--error ${className || ""}`,
1903
+ "data-slot": "token-list-element",
1904
+ "data-variant": variant,
1905
+ "data-error": "true",
1906
+ children: [
1907
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ck-token-list-error", "data-slot": "token-list-error", children: "Failed to load tokens" }),
1908
+ /* @__PURE__ */ jsxRuntime.jsx(
1909
+ "button",
1910
+ {
1911
+ type: "button",
1912
+ className: "ck-token-list-retry",
1913
+ onClick: () => refetch(),
1914
+ "data-slot": "token-list-retry",
1915
+ children: "Retry"
1916
+ }
1917
+ )
1918
+ ]
1919
+ }
1920
+ );
1921
+ if (tokens.length === 0)
1922
+ return /* @__PURE__ */ jsxRuntime.jsx(
1923
+ "div",
1924
+ {
1925
+ className: `ck-token-list-block ck-token-list-block--${variant} ck-token-list-block--empty ${className || ""}`,
1926
+ "data-slot": "token-list-element",
1927
+ "data-variant": variant,
1928
+ "data-empty": "true",
1929
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ck-token-list-empty", "data-slot": "token-list-empty", children: "No tokens found" })
1930
+ }
1931
+ );
1932
+ let itemRenderer = renderItem || ((token) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ck-token-item", "data-slot": "token-item", children: [
1933
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ck-token-item-icon", "data-slot": "token-item-icon", children: token.logo ? /* @__PURE__ */ jsxRuntime.jsx(
1934
+ "img",
1935
+ {
1936
+ src: token.logo,
1937
+ alt: token.symbol || "Token",
1938
+ className: "ck-token-logo",
1939
+ "data-slot": "token-logo",
1940
+ onError: (e) => {
1941
+ e.currentTarget.style.display = "none";
1942
+ }
1943
+ }
1944
+ ) : tokenIcon }),
1945
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ck-token-item-info", "data-slot": "token-item-info", children: [
1946
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ck-token-symbol", "data-slot": "token-symbol", children: token.symbol || token.mint.slice(0, 4) + "..." + token.mint.slice(-4) }),
1947
+ token.name && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ck-token-name", "data-slot": "token-name", children: token.name })
1948
+ ] }),
1949
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ck-token-item-balance", "data-slot": "token-item-balance", children: [
1950
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ck-token-amount", "data-slot": "token-amount", children: token.formatted }),
1951
+ showValue && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ck-token-value", "data-slot": "token-value", children: "-" })
1952
+ ] })
1953
+ ] }, token.mint));
1954
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1955
+ "div",
1956
+ {
1957
+ className: `ck-token-list-block ck-token-list-block--${variant} ${className || ""}`,
1958
+ "data-slot": "token-list-element",
1959
+ "data-variant": variant,
1960
+ children: [
1961
+ variant === "expanded" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ck-token-list-header", "data-slot": "token-list-header", children: [
1962
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ck-token-list-title", "data-slot": "token-list-title", children: "Tokens" }),
1963
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ck-token-list-count", "data-slot": "token-list-count", children: totalAccounts }),
1964
+ showRefresh && /* @__PURE__ */ jsxRuntime.jsx(
1965
+ "button",
1966
+ {
1967
+ type: "button",
1968
+ className: "ck-token-list-refresh",
1969
+ onClick: () => refetch(),
1970
+ disabled: isLoading,
1971
+ "data-slot": "token-list-refresh",
1972
+ children: refreshIcon
1973
+ }
1974
+ )
1975
+ ] }),
1976
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: `ck-token-list ${variant === "grid" ? "ck-token-list--grid" : ""}`, "data-slot": "token-list", children: displayTokens.map(itemRenderer) }),
1977
+ tokens.length > limit && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ck-token-list-more", "data-slot": "token-list-more", children: [
1978
+ "+",
1979
+ tokens.length - limit,
1980
+ " more tokens"
1981
+ ] })
1982
+ ]
1983
+ }
1984
+ );
1985
+ }
1986
+ TokenListElement.displayName = "TokenListElement";
1987
+
1988
+ exports.AccountElement = AccountElement;
1989
+ exports.BalanceElement = BalanceElement;
1990
+ exports.ClusterElement = ClusterElement;
1991
+ exports.ConnectorProvider = ConnectorProvider;
1992
+ exports.DisconnectElement = DisconnectElement;
1993
+ exports.TokenListElement = TokenListElement;
1994
+ exports.TransactionHistoryElement = TransactionHistoryElement;
1995
+ exports.UnifiedProvider = UnifiedProvider;
1996
+ exports.WalletListElement = WalletListElement;
1997
+ exports.useAccount = useAccount;
1998
+ exports.useBalance = useBalance;
1999
+ exports.useCluster = useCluster;
2000
+ exports.useConnector = useConnector;
2001
+ exports.useConnectorClient = useConnectorClient;
2002
+ exports.useGillSolanaClient = useGillSolanaClient;
2003
+ exports.useGillTransactionSigner = useGillTransactionSigner;
2004
+ exports.useKitTransactionSigner = useKitTransactionSigner;
2005
+ exports.useSolanaClient = useSolanaClient;
2006
+ exports.useTokens = useTokens;
2007
+ exports.useTransactionPreparer = useTransactionPreparer;
2008
+ exports.useTransactionSigner = useTransactionSigner;
2009
+ exports.useTransactions = useTransactions;
2010
+ exports.useWalletInfo = useWalletInfo;
2011
+ //# sourceMappingURL=chunk-LUZWUZ5N.js.map
2012
+ //# sourceMappingURL=chunk-LUZWUZ5N.js.map