@solana/connector 0.1.9 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +403 -50
- package/dist/chunk-4KD6HQQG.js +69 -0
- package/dist/chunk-4KD6HQQG.js.map +1 -0
- package/dist/chunk-BJAVJQLK.js +230 -0
- package/dist/chunk-BJAVJQLK.js.map +1 -0
- package/dist/{chunk-5HRJKCIL.js → chunk-BZ2VBJCZ.js} +1061 -424
- package/dist/chunk-BZ2VBJCZ.js.map +1 -0
- package/dist/{chunk-WDXEP4AJ.js → chunk-EM4KNOKG.js} +658 -190
- package/dist/chunk-EM4KNOKG.js.map +1 -0
- package/dist/chunk-HN5AJF7F.js +507 -0
- package/dist/chunk-HN5AJF7F.js.map +1 -0
- package/dist/chunk-HO6QNKFM.mjs +61 -0
- package/dist/chunk-HO6QNKFM.mjs.map +1 -0
- package/dist/chunk-HPQ5T32K.mjs +178 -0
- package/dist/chunk-HPQ5T32K.mjs.map +1 -0
- package/dist/{chunk-MAXA3HEP.mjs → chunk-IDTUFDNB.mjs} +962 -344
- package/dist/chunk-IDTUFDNB.mjs.map +1 -0
- package/dist/{chunk-P5LXUDP6.mjs → chunk-RTXUS5KG.mjs} +579 -119
- package/dist/chunk-RTXUS5KG.mjs.map +1 -0
- package/dist/{chunk-DSUCH44G.js → chunk-SITQ4JWM.js} +23 -67
- package/dist/chunk-SITQ4JWM.js.map +1 -0
- package/dist/chunk-UCISIAOG.mjs +501 -0
- package/dist/chunk-UCISIAOG.mjs.map +1 -0
- package/dist/{chunk-J7DHGLW6.mjs → chunk-ZZTY3O4N.mjs} +21 -61
- package/dist/chunk-ZZTY3O4N.mjs.map +1 -0
- package/dist/compat.d.mts +1 -1
- package/dist/compat.d.ts +1 -1
- package/dist/compat.js +10 -9
- package/dist/compat.js.map +1 -1
- package/dist/compat.mjs +2 -1
- package/dist/compat.mjs.map +1 -1
- package/dist/headless.d.mts +239 -104
- package/dist/headless.d.ts +239 -104
- package/dist/headless.js +255 -169
- package/dist/headless.mjs +5 -3
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +316 -206
- package/dist/index.mjs +6 -4
- package/dist/react.d.mts +299 -9
- package/dist/react.d.ts +299 -9
- package/dist/react.js +90 -38
- package/dist/react.mjs +2 -2
- package/dist/{standard-shim-CT49DM5l.d.mts → standard-shim-CGB88PPO.d.mts} +673 -52
- package/dist/{standard-shim-D9guL5fz.d.ts → standard-shim-tmnQelaJ.d.ts} +673 -52
- package/dist/{transaction-signer-T-KVQFi8.d.mts → transaction-signer-7NaYmP5w.d.mts} +1 -0
- package/dist/{transaction-signer-T-KVQFi8.d.ts → transaction-signer-7NaYmP5w.d.ts} +1 -0
- package/dist/walletconnect-447EY3OJ.js +28 -0
- package/dist/walletconnect-447EY3OJ.js.map +1 -0
- package/dist/walletconnect-U455PO4I.mjs +3 -0
- package/dist/walletconnect-U455PO4I.mjs.map +1 -0
- package/package.json +6 -2
- package/dist/chunk-5HRJKCIL.js.map +0 -1
- package/dist/chunk-DSUCH44G.js.map +0 -1
- package/dist/chunk-I6TJLYNA.js +0 -535
- package/dist/chunk-I6TJLYNA.js.map +0 -1
- package/dist/chunk-J7DHGLW6.mjs.map +0 -1
- package/dist/chunk-JOBLG62A.mjs +0 -476
- package/dist/chunk-JOBLG62A.mjs.map +0 -1
- package/dist/chunk-MAXA3HEP.mjs.map +0 -1
- package/dist/chunk-P5LXUDP6.mjs.map +0 -1
- package/dist/chunk-WDXEP4AJ.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/connector-provider.tsx","../src/ui/unified-provider.tsx","../src/hooks/use-cluster.ts","../src/hooks/use-account.ts","../src/hooks/use-wallet-info.ts","../src/hooks/use-transaction-signer.ts","../src/hooks/use-kit-transaction-signer.ts","../src/hooks/use-kit-solana-client.ts","../src/hooks/use-transaction-preparer.ts","../src/hooks/_internal/use-shared-query.ts","../src/hooks/_internal/use-wallet-assets.ts","../src/hooks/use-balance.ts","../src/utils/abort.ts","../src/hooks/_internal/solana-token-list.ts","../src/utils/image.ts","../src/hooks/use-transactions.ts","../src/hooks/use-tokens.ts","../src/components/elements/disconnect-element.tsx","../src/components/elements/account-element.tsx","../src/components/elements/cluster-element.tsx","../src/components/elements/wallet-list-element.tsx","../src/components/elements/skeleton-shine.tsx","../src/components/elements/balance-element.tsx","../src/components/elements/transaction-history-element.tsx","../src/components/elements/token-list-element.tsx"],"names":["jsx","useMemo","React","logger","useCallback","useRef","useSyncExternalStore","address","toAddress","LAMPORTS_PER_SOL","useState","key","useEffect","toSignature","jitter","Fragment","jsxs"],"mappings":"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","file":"chunk-P5LXUDP6.mjs","sourcesContent":["'use client';\n\nimport React, { createContext, useContext, useMemo, useRef, useSyncExternalStore } from 'react';\nimport type { ReactNode } from 'react';\nimport { ConnectorClient } from '../lib/core/connector-client';\nimport type { ConnectorConfig } from '../types/connector';\nimport type { ExtendedConnectorConfig } from '../config/default-config';\nimport { ConnectorErrorBoundary } from './error-boundary';\nimport { installPolyfills } from '../lib/utils/polyfills';\nimport { createLogger } from '../lib/utils/secure-logger';\nimport type {\n AuthorizationCache,\n ChainSelector,\n SolanaMobileWalletAdapterWallet,\n} from '@solana-mobile/wallet-standard-mobile';\nimport type { IdentifierArray } from '@wallet-standard/base';\n\n/** Configuration for registerMwa - defined locally as the package doesn't export this type */\ninterface RegisterMwaConfig {\n appIdentity: {\n name: string;\n uri?: string;\n icon?: string;\n };\n authorizationCache: AuthorizationCache;\n chains: IdentifierArray;\n chainSelector: ChainSelector;\n remoteHostAuthority?: string;\n onWalletNotFound: (mobileWalletAdapter: SolanaMobileWalletAdapterWallet) => Promise<void>;\n}\n\nconst logger = createLogger('ConnectorProvider');\n\ninstallPolyfills();\n\ndeclare global {\n interface Window {\n __connectorClient?: ConnectorClient;\n }\n}\n\nexport type ConnectorSnapshot = ReturnType<ConnectorClient['getSnapshot']> & {\n select: (walletName: string) => Promise<void>;\n disconnect: () => Promise<void>;\n selectAccount: (address: string) => Promise<void>;\n};\n\nexport const ConnectorContext = createContext<ConnectorClient | null>(null);\nConnectorContext.displayName = 'ConnectorContext';\n\nexport interface MobileWalletAdapterConfig {\n appIdentity: {\n name: string;\n uri?: string;\n icon?: string;\n };\n remoteHostAuthority?: string;\n chains?: RegisterMwaConfig['chains'];\n authorizationCache?: AuthorizationCache;\n chainSelector?: ChainSelector;\n onWalletNotFound?: (wallet: SolanaMobileWalletAdapterWallet) => Promise<void>;\n}\n\nfunction ConnectorProviderInternal({\n children,\n config,\n mobile,\n}: {\n children: ReactNode;\n config?: ConnectorConfig;\n mobile?: MobileWalletAdapterConfig;\n}) {\n const clientRef = useRef<ConnectorClient | null>(null);\n\n const getClient = React.useCallback(() => {\n if (!clientRef.current) {\n try {\n clientRef.current = new ConnectorClient(config);\n\n if (typeof window !== 'undefined') {\n window.__connectorClient = clientRef.current;\n }\n\n if (config?.debug) {\n logger.info('Client initialized successfully');\n }\n } catch (error) {\n const err = error as Error;\n logger.error('Failed to initialize client', { error: err });\n\n const extendedConfig = config as ExtendedConnectorConfig;\n if (extendedConfig?.errorBoundary?.onError) {\n extendedConfig.errorBoundary.onError(err, {\n componentStack: 'client-initialization',\n digest: `constructor-${new Date().toISOString()}`,\n });\n }\n\n return null;\n }\n }\n return clientRef.current;\n }, [config]);\n\n const client = getClient();\n\n React.useEffect(() => {\n const currentClient = clientRef.current;\n\n if (currentClient) {\n const privateClient = currentClient as unknown as { initialize?: () => void };\n if (privateClient.initialize && typeof privateClient.initialize === 'function') {\n privateClient.initialize();\n }\n }\n\n return () => {\n if (typeof window !== 'undefined') {\n window.__connectorClient = undefined;\n }\n if (currentClient && typeof currentClient.destroy === 'function') {\n currentClient.destroy();\n }\n };\n }, []);\n\n React.useEffect(() => {\n if (!mobile) return;\n let cancelled = false;\n (async () => {\n try {\n const mod = (await import(\n '@solana-mobile/wallet-standard-mobile'\n )) as typeof import('@solana-mobile/wallet-standard-mobile');\n if (cancelled) return;\n const {\n registerMwa,\n createDefaultAuthorizationCache,\n createDefaultChainSelector,\n createDefaultWalletNotFoundHandler,\n } = mod;\n const defaultChains: RegisterMwaConfig['chains'] = [\n 'solana:mainnet',\n 'solana:devnet',\n 'solana:testnet',\n ];\n\n const mwaConfig: RegisterMwaConfig = {\n appIdentity: mobile.appIdentity,\n authorizationCache: mobile.authorizationCache ?? createDefaultAuthorizationCache(),\n chains: mobile.chains ?? defaultChains,\n chainSelector: mobile.chainSelector ?? createDefaultChainSelector(),\n remoteHostAuthority: mobile.remoteHostAuthority,\n onWalletNotFound: mobile.onWalletNotFound ?? createDefaultWalletNotFoundHandler(),\n };\n\n registerMwa(mwaConfig);\n } catch (e) {\n // Failed to register Mobile Wallet Adapter\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [mobile]);\n\n return <ConnectorContext.Provider value={client}>{children}</ConnectorContext.Provider>;\n}\n\nexport function ConnectorProvider({\n children,\n config,\n mobile,\n}: {\n children: ReactNode;\n config?: ExtendedConnectorConfig;\n mobile?: MobileWalletAdapterConfig;\n}) {\n const extendedConfig = config as ExtendedConnectorConfig;\n const errorBoundaryConfig = extendedConfig?.errorBoundary;\n\n if (!errorBoundaryConfig?.enabled) {\n return (\n <ConnectorProviderInternal config={config} mobile={mobile}>\n {children}\n </ConnectorProviderInternal>\n );\n }\n\n return (\n <ConnectorErrorBoundary\n maxRetries={errorBoundaryConfig.maxRetries ?? 3}\n onError={errorBoundaryConfig.onError}\n fallback={errorBoundaryConfig.fallback}\n >\n <ConnectorProviderInternal config={config} mobile={mobile}>\n {children}\n </ConnectorProviderInternal>\n </ConnectorErrorBoundary>\n );\n}\n\nexport function useConnector(): ConnectorSnapshot {\n const client = useContext(ConnectorContext);\n if (!client) {\n throw new Error(\n 'useConnector must be used within ConnectorProvider. ' +\n 'Wrap your app with <ConnectorProvider> or <UnifiedProvider> to use connector hooks.',\n );\n }\n\n const state = useSyncExternalStore(\n React.useCallback(cb => client.subscribe(cb), [client]),\n React.useCallback(() => client.getSnapshot(), [client]),\n React.useCallback(() => client.getSnapshot(), [client]),\n );\n\n const methods = useMemo(\n () => ({\n select: client.select.bind(client),\n disconnect: client.disconnect.bind(client),\n selectAccount: client.selectAccount.bind(client),\n }),\n [client],\n );\n\n return useMemo(\n () => ({\n ...state,\n ...methods,\n }),\n [state, methods],\n );\n}\n\nexport function useConnectorClient(): ConnectorClient | null {\n return useContext(ConnectorContext);\n}\n","'use client';\n\nimport type { ReactNode, ComponentType, PropsWithChildren } from 'react';\nimport { ConnectorProvider } from './connector-provider';\nimport type { MobileWalletAdapterConfig } from './connector-provider';\nimport type { ConnectorConfig } from '../types/connector';\n\nexport interface AppProviderProps {\n children: ReactNode;\n\n /** ConnectorKit configuration */\n connectorConfig?: ConnectorConfig;\n\n /** Mobile Wallet Adapter configuration */\n mobile?: MobileWalletAdapterConfig;\n\n /** Optional additional providers to wrap around children */\n providers?: Array<{\n component: ComponentType<PropsWithChildren>;\n props?: Record<string, unknown>;\n }>;\n}\n\nexport function AppProvider({ children, connectorConfig, mobile, providers = [] }: AppProviderProps) {\n // Start with connector provider as the base\n let content = (\n <ConnectorProvider config={connectorConfig} mobile={mobile}>\n {children}\n </ConnectorProvider>\n );\n\n // Wrap with additional providers in reverse order\n // so they nest properly (first provider is outermost)\n for (let i = providers.length - 1; i >= 0; i--) {\n const { component: Provider, props = {} } = providers[i];\n content = <Provider {...props}>{content}</Provider>;\n }\n\n return content;\n}\n\n/** @deprecated Use `AppProvider` instead */\nexport const UnifiedProvider = AppProvider;\n\n/** @deprecated Use `AppProviderProps` instead */\nexport type UnifiedProviderProps = AppProviderProps;\n","/**\n * @solana/connector - useCluster hook\n *\n * React hook for managing Solana cluster (network) state\n */\n\n'use client';\n\nimport { useMemo } from 'react';\nimport type { SolanaCluster, SolanaClusterId } from '@wallet-ui/core';\nimport { useConnector, useConnectorClient } from '../ui/connector-provider';\nimport {\n getClusterExplorerUrl,\n isMainnetCluster,\n isDevnetCluster,\n isTestnetCluster,\n isLocalCluster,\n getClusterType,\n type ClusterType,\n} from '../utils/cluster';\n\nexport interface UseClusterReturn {\n /** Currently active cluster */\n cluster: SolanaCluster | null;\n /** All available clusters */\n clusters: SolanaCluster[];\n /** Set the active cluster */\n setCluster: (id: SolanaClusterId) => Promise<void>;\n /** Whether the current cluster is mainnet */\n isMainnet: boolean;\n /** Whether the current cluster is devnet */\n isDevnet: boolean;\n /** Whether the current cluster is testnet */\n isTestnet: boolean;\n /** Whether the current cluster is running locally */\n isLocal: boolean;\n /** Solana Explorer base URL for the current cluster */\n explorerUrl: string;\n /** Cluster type (mainnet, devnet, testnet, localnet, custom) */\n type: ClusterType | null;\n}\n\n/**\n * Hook for managing Solana cluster (network) selection\n *\n * @example\n * ```tsx\n * function ClusterSwitcher() {\n * const { cluster, clusters, setCluster, isMainnet } = useCluster()\n *\n * return (\n * <select\n * value={cluster?.id}\n * onChange={(e) => setCluster(e.target.value as SolanaClusterId)}\n * >\n * {clusters.map(c => (\n * <option key={c.id} value={c.id}>{c.label}</option>\n * ))}\n * </select>\n * )\n * }\n * ```\n */\nexport function useCluster(): UseClusterReturn {\n const { cluster, clusters } = useConnector();\n const client = useConnectorClient();\n\n if (!client) {\n throw new Error('useCluster must be used within ConnectorProvider');\n }\n\n const setCluster = useMemo(\n () => async (id: SolanaClusterId) => {\n await client.setCluster(id);\n },\n [client],\n );\n\n return useMemo(() => {\n const isMainnet = cluster ? isMainnetCluster(cluster) : false;\n const isDevnet = cluster ? isDevnetCluster(cluster) : false;\n const isTestnet = cluster ? isTestnetCluster(cluster) : false;\n const isLocal = cluster ? isLocalCluster(cluster) : false;\n const explorerUrl = cluster ? getClusterExplorerUrl(cluster) : '';\n const type = cluster ? getClusterType(cluster) : null;\n\n return {\n cluster,\n clusters,\n setCluster,\n isMainnet,\n isDevnet,\n isTestnet,\n isLocal,\n explorerUrl,\n type,\n };\n }, [cluster, clusters, setCluster]);\n}\n","/**\n * useAccount hook\n */\n\n'use client';\n\nimport React, { useState, useCallback, useMemo } from 'react';\nimport { useConnector } from '../ui/connector-provider';\nimport { copyAddressToClipboard, formatAddress, ClipboardErrorType, type ClipboardResult } from '../utils';\nimport type { AccountInfo } from '../types/accounts';\nimport { COPY_FEEDBACK_DURATION_MS } from '../lib/constants';\n\nexport interface UseAccountReturn {\n /** The connected wallet address */\n address: string | null;\n /** Full account info object */\n account: AccountInfo | null;\n /** Whether a wallet is connected */\n connected: boolean;\n /** Shortened formatted address for display */\n formatted: string;\n /** Copy the address to clipboard with enhanced result */\n copy: () => Promise<ClipboardResult>;\n /** Whether the address was recently copied */\n copied: boolean;\n /** All available accounts from the connected wallet */\n accounts: AccountInfo[];\n /** Select a different account from the connected wallet */\n selectAccount: (address: string) => Promise<void>;\n}\n\nexport function useAccount(): UseAccountReturn {\n const { selectedAccount, accounts, connected, selectAccount } = useConnector();\n const [copied, setCopied] = useState(false);\n const copyTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n const account = useMemo(\n () => accounts.find((a: AccountInfo) => a.address === selectedAccount) ?? null,\n [accounts, selectedAccount],\n );\n\n const formatted = useMemo(() => (selectedAccount ? formatAddress(selectedAccount) : ''), [selectedAccount]);\n\n const copy = useCallback(async (): Promise<ClipboardResult> => {\n if (!selectedAccount) {\n return {\n success: false,\n error: ClipboardErrorType.EMPTY_VALUE,\n errorMessage: 'No account selected',\n };\n }\n\n if (copyTimeoutRef.current) {\n clearTimeout(copyTimeoutRef.current);\n }\n\n const result = await copyAddressToClipboard(selectedAccount, {\n onSuccess: () => {\n setCopied(true);\n copyTimeoutRef.current = setTimeout(() => setCopied(false), COPY_FEEDBACK_DURATION_MS);\n },\n });\n\n return result;\n }, [selectedAccount]);\n\n React.useEffect(() => {\n return () => {\n if (copyTimeoutRef.current) {\n clearTimeout(copyTimeoutRef.current);\n }\n };\n }, []);\n\n return useMemo(\n () => ({\n address: selectedAccount,\n account,\n connected,\n formatted,\n copy,\n copied,\n accounts,\n selectAccount,\n }),\n [selectedAccount, account, connected, formatted, copy, copied, accounts, selectAccount],\n );\n}\n","/**\n * @solana/connector - useWalletInfo hook\n *\n * React hook for getting information about the connected wallet\n */\n\n'use client';\n\nimport { useMemo } from 'react';\nimport { useConnector } from '../ui/connector-provider';\nimport type { WalletInfo } from '../types/wallets';\n\n/**\n * Simplified wallet information for display purposes\n */\nexport interface WalletDisplayInfo {\n /** Wallet name */\n name: string;\n /** Wallet icon/logo URL if available */\n icon?: string;\n /** Whether the wallet extension is installed */\n installed: boolean;\n /** Whether the wallet supports Solana connections */\n connectable?: boolean;\n}\n\n/**\n * Return value from useWalletInfo hook\n */\nexport interface UseWalletInfoReturn {\n /** Name of the connected wallet (e.g., 'Phantom', 'Solflare') */\n name: string | null;\n /** Wallet icon/logo URL if available */\n icon: string | null;\n /** Whether the wallet extension is installed */\n installed: boolean;\n /** Whether the wallet supports Solana connections */\n connectable: boolean;\n /** Whether currently connected to the wallet */\n connected: boolean;\n /** Whether a connection attempt is in progress */\n connecting: boolean;\n /** All available wallets */\n wallets: WalletDisplayInfo[];\n}\n\n/**\n * Hook for getting information about the connected wallet\n * Provides wallet metadata, connection status, and capabilities\n *\n * @example\n * ```tsx\n * function WalletBadge() {\n * const { name, icon, connected, connecting } = useWalletInfo()\n *\n * if (connecting) return <p>Connecting...</p>\n * if (!connected) return <p>No wallet connected</p>\n *\n * return (\n * <div>\n * {icon && <img src={icon} alt={name} />}\n * <span>{name}</span>\n * </div>\n * )\n * }\n * ```\n */\nexport function useWalletInfo(): UseWalletInfoReturn {\n const { selectedWallet, wallets, connected, connecting } = useConnector();\n\n // Map WalletInfo[] to WalletDisplayInfo[] for simplified consumption\n const mappedWallets = useMemo<WalletDisplayInfo[]>(\n () =>\n wallets.map(\n (walletInfo: WalletInfo): WalletDisplayInfo => ({\n name: walletInfo.wallet.name,\n icon: walletInfo.wallet.icon,\n installed: walletInfo.installed,\n connectable: walletInfo.connectable,\n }),\n ),\n [wallets],\n );\n\n // Extract information about the currently selected wallet\n const selectedWalletInfo = useMemo(() => {\n if (!selectedWallet) {\n return {\n name: null,\n icon: null,\n installed: false,\n connectable: false,\n };\n }\n\n // Find the WalletInfo for the selected wallet\n const walletInfo = wallets.find((w: WalletInfo) => w.wallet.name === selectedWallet.name);\n\n return {\n name: selectedWallet.name,\n icon: selectedWallet.icon ?? null,\n installed: walletInfo?.installed ?? false,\n connectable: walletInfo?.connectable ?? false,\n };\n }, [selectedWallet, wallets]);\n\n return useMemo(\n () => ({\n ...selectedWalletInfo,\n connected,\n connecting,\n wallets: mappedWallets,\n }),\n [selectedWalletInfo, connected, connecting, mappedWallets],\n );\n}\n","/**\n * useTransactionSigner hook\n */\n\n'use client';\n\nimport { useMemo } from 'react';\nimport { useConnector } from '../ui/connector-provider';\nimport { useConnectorClient } from '../ui/connector-provider';\nimport { createTransactionSigner, type TransactionSigner } from '../lib/transaction/transaction-signer';\nimport type { TransactionSignerCapabilities } from '../types/transactions';\n\n/**\n * Return value from useTransactionSigner hook\n */\nexport interface UseTransactionSignerReturn {\n /**\n * Transaction signer instance (null if not connected)\n * Use this to sign and send transactions\n */\n signer: TransactionSigner | null;\n\n /**\n * Whether a signer is available and ready to use\n * Useful for disabling transaction buttons\n */\n ready: boolean;\n\n /**\n * Current wallet address that will sign transactions\n * Null if no wallet connected\n */\n address: string | null;\n\n /**\n * Signer capabilities (what operations are supported)\n * Always available even if signer is null (shows all false)\n */\n capabilities: TransactionSignerCapabilities;\n}\n\nexport function useTransactionSigner(): UseTransactionSignerReturn {\n const { selectedWallet, selectedAccount, accounts, cluster, connected } = useConnector();\n const client = useConnectorClient();\n\n const account = useMemo(\n () => accounts.find(a => a.address === selectedAccount)?.raw ?? null,\n [accounts, selectedAccount],\n );\n\n const signer = useMemo(() => {\n if (!connected || !selectedWallet || !account) {\n return null;\n }\n\n return createTransactionSigner({\n wallet: selectedWallet,\n account,\n cluster: cluster ?? undefined,\n eventEmitter: client\n ? {\n emit: (event: unknown) => {\n client.emitEvent(event as import('../types/events').ConnectorEvent);\n },\n }\n : undefined,\n });\n }, [connected, selectedWallet, account, cluster, client]);\n\n const capabilities = useMemo(\n () =>\n signer?.getCapabilities() ?? {\n canSign: false,\n canSend: false,\n canSignMessage: false,\n supportsBatchSigning: false,\n },\n [signer],\n );\n\n return {\n signer,\n ready: Boolean(signer),\n address: selectedAccount,\n capabilities,\n };\n}\n","/**\n * @solana/connector - useKitTransactionSigner hook\n *\n * React hook for kit-compatible transaction signing\n * Use this when working with modern Solana libraries (@solana/kit)\n */\n\n'use client';\n\nimport { useMemo } from 'react';\nimport type { TransactionModifyingSigner } from '@solana/signers';\nimport { useTransactionSigner } from './use-transaction-signer';\nimport { createKitTransactionSigner } from '../lib/transaction/kit-transaction-signer';\n\n/**\n * Return value from useKitTransactionSigner hook\n */\nexport interface UseKitTransactionSignerReturn {\n /**\n * Kit-compatible TransactionModifyingSigner instance (null if not connected)\n * Use this with modern Solana libraries (@solana/kit)\n */\n signer: TransactionModifyingSigner | null;\n\n /**\n * Whether a signer is available and ready to use\n * Useful for disabling transaction buttons\n */\n ready: boolean;\n}\n\n/**\n * @deprecated Use `UseKitTransactionSignerReturn` instead\n */\nexport type UseGillTransactionSignerReturn = UseKitTransactionSignerReturn;\n\n/**\n * Hook for kit-compatible transaction signing\n *\n * Creates a TransactionPartialSigner that's compatible with @solana/kit,\n * enabling seamless integration with modern Solana development patterns.\n *\n * This hook wraps the standard useTransactionSigner and adapts it to kit's\n * interface, allowing you to use modern libraries without type incompatibilities.\n *\n * @example\n * ```tsx\n * import { useKitTransactionSigner } from '@solana/connector';\n * import { getTransferSolInstruction } from '@solana-program/system';\n * import { address, pipe, createTransactionMessage } from '@solana/kit';\n *\n * function ModernTransfer() {\n * const { signer, ready } = useKitTransactionSigner();\n *\n * const handleTransfer = async (recipient: string, amount: number) => {\n * if (!signer) return;\n *\n * // Fully type-safe with @solana/kit!\n * const instruction = getTransferSolInstruction({\n * source: signer, // No type errors\n * destination: address(recipient),\n * amount\n * });\n *\n * const txMessage = pipe(\n * createTransactionMessage({ version: 0 }),\n * (tx) => setTransactionMessageFeePayerSigner(signer, tx), // Works!\n * // ...\n * );\n * };\n *\n * return (\n * <button onClick={handleTransfer} disabled={!ready}>\n * Send with Kit\n * </button>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // For backward compatibility, continue using useTransactionSigner\n * import { useTransactionSigner } from '@solana/connector';\n *\n * function LegacyTransfer() {\n * const { signer } = useTransactionSigner(); // Wallet adapter compatible\n * // Works with @solana/web3.js v1 and wallet-adapter\n * }\n * ```\n */\nexport function useKitTransactionSigner(): UseKitTransactionSignerReturn {\n const { signer: connectorSigner, ready } = useTransactionSigner();\n\n const kitSigner = useMemo(() => {\n if (!connectorSigner) return null;\n return createKitTransactionSigner(connectorSigner);\n }, [connectorSigner]);\n\n return {\n signer: kitSigner,\n ready,\n };\n}\n\n/**\n * @deprecated Use `useKitTransactionSigner` instead. This alias is provided for backward compatibility.\n */\nexport const useGillTransactionSigner = useKitTransactionSigner;\n","/**\n * @solana/connector - useSolanaClient hook\n *\n * React hook for Kit's SolanaClient with built-in RPC and WebSocket subscriptions\n * Provides rpc and rpcSubscriptions\n */\n\n'use client';\n\nimport { useMemo } from 'react';\nimport { createSolanaClient, type SolanaClient, type ModifiedClusterUrl } from '../lib/kit';\nimport { useCluster } from './use-cluster';\nimport { useConnectorClient } from '../ui/connector-provider';\nimport type { ClusterType } from '../utils/cluster';\nimport { createLogger } from '../lib/utils/secure-logger';\n\nconst logger = createLogger('useSolanaClient');\n\n/**\n * Return value from useSolanaClient hook\n */\nexport interface UseSolanaClientReturn {\n /**\n * Kit SolanaClient instance with RPC and subscriptions (null if not available)\n * Includes: rpc, rpcSubscriptions\n */\n client: SolanaClient | null;\n\n /**\n * Whether a client is available and ready to use\n */\n ready: boolean;\n\n /**\n * Cluster type (mainnet, devnet, testnet, localnet, custom)\n */\n clusterType: ClusterType | null;\n}\n\n/**\n * @deprecated Use `UseSolanaClientReturn` instead\n */\nexport type UseGillSolanaClientReturn = UseSolanaClientReturn;\n\n/**\n * Hook for Kit's SolanaClient with automatic RPC and WebSocket subscription management\n *\n * Creates a fully configured SolanaClient based on the current cluster, providing:\n * - Type-safe RPC client\n * - WebSocket subscription client\n *\n * The client is automatically recreated when the cluster changes.\n *\n * @example\n * ```tsx\n * import { useSolanaClient, useKitTransactionSigner } from '@solana/connector';\n * import { signTransactionMessageWithSigners } from '@solana/kit';\n *\n * function SendTransaction() {\n * const { client, ready } = useSolanaClient();\n * const { signer } = useKitTransactionSigner();\n *\n * const handleSend = async (transaction) => {\n * if (!client || !signer) return;\n *\n * // Sign the transaction\n * const signed = await signTransactionMessageWithSigners(transaction);\n *\n * // Send using RPC client\n * const signature = await client.rpc.sendTransaction(signed).send();\n * };\n *\n * return (\n * <button onClick={handleSend} disabled={!ready}>\n * Send Transaction\n * </button>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // Direct RPC access\n * function GetBalance() {\n * const { client } = useSolanaClient();\n *\n * const fetchBalance = async (address: Address) => {\n * if (!client) return;\n *\n * const balance = await client.rpc.getBalance(address).send();\n * console.log('Balance:', balance);\n * };\n * }\n * ```\n */\nexport function useSolanaClient(): UseSolanaClientReturn {\n const { type } = useCluster();\n const connectorClient = useConnectorClient();\n\n const client = useMemo(() => {\n if (!type || !connectorClient) return null;\n\n try {\n // ALWAYS prefer the configured RPC URL from cluster config\n const rpcUrl = connectorClient.getRpcUrl();\n if (rpcUrl) {\n return createSolanaClient({\n urlOrMoniker: rpcUrl as ModifiedClusterUrl,\n });\n }\n\n // Fallback to moniker only if no RPC URL configured\n if (type !== 'custom') {\n return createSolanaClient({\n urlOrMoniker: type,\n });\n }\n\n return null;\n } catch (error) {\n logger.error('Failed to create Solana client', { error });\n return null;\n }\n }, [type, connectorClient]);\n\n // Memoize return object to prevent infinite re-renders in consumers\n return useMemo(\n () => ({\n client,\n ready: Boolean(client),\n clusterType: type,\n }),\n [client, type],\n );\n}\n\n/**\n * @deprecated Use `useSolanaClient` instead. This alias is provided for backward compatibility.\n */\nexport const useGillSolanaClient = useSolanaClient;\n","/**\n * @solana/connector - useTransactionPreparer hook\n *\n * React hook for preparing transactions with automatic optimization\n * Handles blockhash fetching, compute unit limits, and transaction simulation\n */\n\n'use client';\n\nimport { useCallback, useMemo } from 'react';\nimport type {\n TransactionMessage,\n TransactionMessageWithFeePayer,\n TransactionMessageWithBlockhashLifetime,\n} from '@solana/kit';\n\n/**\n * A transaction message that can be compiled for signing.\n * Replaces the deprecated CompilableTransactionMessage type.\n */\ntype CompilableTransactionMessage = TransactionMessage & TransactionMessageWithFeePayer;\nimport { prepareTransaction } from '../lib/kit';\nimport { useSolanaClient } from './use-kit-solana-client';\nimport { NetworkError } from '../lib/errors';\n\n/**\n * Options for transaction preparation\n */\nexport interface TransactionPrepareOptions {\n /**\n * Multiplier applied to the simulated compute unit value\n * @default 1.1 (10% buffer)\n */\n computeUnitLimitMultiplier?: number;\n\n /**\n * Whether to force reset the compute unit limit value (if one is already set)\n * using the simulation response and computeUnitLimitMultiplier\n * @default false\n */\n computeUnitLimitReset?: boolean;\n\n /**\n * Whether to force reset the latest blockhash (if one is already set)\n * @default true\n */\n blockhashReset?: boolean;\n}\n\n/**\n * Return value from useTransactionPreparer hook\n */\nexport interface UseTransactionPreparerReturn {\n /**\n * Prepare a transaction for sending\n * Automatically adds:\n * - Compute unit limit (via simulation with optional multiplier)\n * - Latest blockhash (if not already set)\n *\n * @param transaction - The transaction to prepare\n * @param options - Optional preparation settings\n * @returns Prepared transaction with blockhash lifetime set\n */\n prepare: <TMessage extends CompilableTransactionMessage>(\n transaction: TMessage,\n options?: TransactionPrepareOptions,\n ) => Promise<TMessage & TransactionMessageWithBlockhashLifetime>;\n\n /**\n * Whether the preparer is ready to use\n * False if Solana client is not available\n */\n ready: boolean;\n}\n\n/**\n * Hook for preparing transactions with automatic optimization\n *\n * Uses kit's prepareTransaction utility to:\n * 1. Simulate the transaction to determine optimal compute units\n * 2. Set compute unit limit (with configurable multiplier for safety margin)\n * 3. Fetch and set the latest blockhash (if not already present)\n *\n * This significantly improves transaction landing rates by ensuring proper\n * compute budget allocation and fresh blockhashes.\n *\n * @example\n * ```tsx\n * import { useTransactionPreparer, useKitTransactionSigner } from '@solana/connector';\n * import { pipe, createTransactionMessage, appendTransactionMessageInstructions } from '@solana/kit';\n * import { getTransferSolInstruction } from '@solana-program/system';\n *\n * function SendOptimizedTransaction() {\n * const { prepare, ready } = useTransactionPreparer();\n * const { signer } = useKitTransactionSigner();\n * const { client } = useSolanaClient();\n *\n * const handleSend = async (recipient: string, amount: bigint) => {\n * if (!ready || !signer || !client) return;\n *\n * // Build transaction message\n * const tx = pipe(\n * createTransactionMessage({ version: 0 }),\n * tx => setTransactionMessageFeePayerSigner(signer, tx),\n * tx => appendTransactionMessageInstructions([\n * getTransferSolInstruction({\n * source: signer,\n * destination: address(recipient),\n * amount: lamports(amount),\n * })\n * ], tx)\n * );\n *\n * // Prepare: auto-adds compute units + blockhash\n * const prepared = await prepare(tx);\n *\n * // Sign\n * const signed = await signTransactionMessageWithSigners(prepared);\n *\n * // Send and confirm\n * await client.sendAndConfirmTransaction(signed);\n * };\n *\n * return (\n * <button onClick={handleSend} disabled={!ready}>\n * Send Optimized Transaction\n * </button>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom compute unit multiplier for high-priority transactions\n * const { prepare } = useTransactionPreparer();\n *\n * const prepared = await prepare(transaction, {\n * computeUnitLimitMultiplier: 1.3, // 30% buffer instead of default 10%\n * blockhashReset: true // Always fetch fresh blockhash\n * });\n * ```\n *\n * @example\n * ```tsx\n * // Force reset compute units even if already set\n * const { prepare } = useTransactionPreparer();\n *\n * const prepared = await prepare(transaction, {\n * computeUnitLimitReset: true, // Re-simulate and reset compute units\n * computeUnitLimitMultiplier: 1.2\n * });\n * ```\n */\nexport function useTransactionPreparer(): UseTransactionPreparerReturn {\n const { client, ready } = useSolanaClient();\n\n const prepare = useCallback(\n async <TMessage extends CompilableTransactionMessage>(\n transaction: TMessage,\n options: TransactionPrepareOptions = {},\n ): Promise<TMessage & TransactionMessageWithBlockhashLifetime> => {\n if (!client) {\n throw new NetworkError('RPC_ERROR', 'Solana client not available. Cannot prepare transaction.');\n }\n\n return prepareTransaction({\n transaction,\n rpc: client.rpc,\n computeUnitLimitMultiplier: options.computeUnitLimitMultiplier,\n computeUnitLimitReset: options.computeUnitLimitReset,\n blockhashReset: options.blockhashReset,\n });\n },\n [client],\n );\n\n // Memoize return object to prevent unnecessary re-renders in consumers\n return useMemo(\n () => ({\n prepare,\n ready,\n }),\n [prepare, ready],\n );\n}\n","'use client';\n\nimport { useCallback, useEffect, useMemo, useRef, useSyncExternalStore } from 'react';\n\n/**\n * Snapshot of a shared query's current state\n */\nexport interface SharedQuerySnapshot<TData> {\n /** The fetched data, undefined if not yet loaded */\n data: TData | undefined;\n /** Error from the last fetch attempt */\n error: Error | null;\n /** Current status of the query */\n status: 'idle' | 'loading' | 'success' | 'error';\n /** Timestamp of last successful update */\n updatedAt: number | null;\n /** Whether a fetch is currently in progress */\n isFetching: boolean;\n}\n\n/**\n * Options for useSharedQuery hook\n */\nexport interface SharedQueryOptions<TData = unknown, TSelected = TData> {\n /** Whether the query is enabled (default: true) */\n enabled?: boolean;\n /** Time in ms to consider data fresh (default: 0) */\n staleTimeMs?: number;\n /** Time in ms to keep cache after last subscriber unmounts (default: 300000) */\n cacheTimeMs?: number;\n /** Whether to refetch on mount (default: 'stale') */\n refetchOnMount?: boolean | 'stale';\n /** Polling interval in ms, or false to disable (default: false) */\n refetchIntervalMs?: number | false;\n /** Transform/select a subset of data (reduces rerenders) */\n select?: (data: TData | undefined) => TSelected;\n}\n\n/**\n * Options for fetch operations\n */\ninterface SharedQueryFetchOptions {\n staleTimeMs?: number;\n force?: boolean;\n signal?: AbortSignal;\n}\n\n/**\n * Internal cache entry for a query\n */\ninterface SharedQueryEntry<TData> {\n snapshot: SharedQuerySnapshot<TData>;\n subscribers: Set<() => void>;\n promise: Promise<TData> | null;\n abortController: AbortController | null;\n\n cacheTimeMs: number;\n gcTimeoutId: ReturnType<typeof setTimeout> | null;\n\n queryFn: ((signal: AbortSignal) => Promise<TData>) | null;\n\n // Ref-counted polling intervals\n intervalCounts: Map<number, number>;\n activeIntervalMs: number | null;\n intervalId: ReturnType<typeof setInterval> | null;\n\n // LRU tracking\n lastAccessedAt: number;\n}\n\n/** Default cache time: 5 minutes */\nconst DEFAULT_CACHE_TIME_MS = 5 * 60 * 1000;\n\n/** Maximum store size before LRU eviction triggers */\nconst MAX_STORE_SIZE = 100;\n\n/** Global cache store */\nconst store = new Map<string, SharedQueryEntry<unknown>>();\n\n/**\n * Evict least-recently-accessed entries without active subscribers.\n * Called when store size exceeds MAX_STORE_SIZE.\n */\nfunction evictStaleEntries(): void {\n if (store.size <= MAX_STORE_SIZE) return;\n\n // Collect entries without subscribers, sorted by lastAccessedAt (oldest first)\n const evictable: Array<[string, SharedQueryEntry<unknown>]> = [];\n for (const [key, entry] of store) {\n if (entry.subscribers.size === 0) {\n evictable.push([key, entry]);\n }\n }\n\n // Sort by lastAccessedAt ascending (oldest first)\n evictable.sort((a, b) => a[1].lastAccessedAt - b[1].lastAccessedAt);\n\n // Evict oldest entries until we're under the limit\n for (const [key, entry] of evictable) {\n if (store.size <= MAX_STORE_SIZE) break;\n\n // Clean up timers before deleting\n if (entry.gcTimeoutId) clearTimeout(entry.gcTimeoutId);\n if (entry.intervalId) clearInterval(entry.intervalId);\n if (entry.abortController) entry.abortController.abort();\n\n store.delete(key);\n }\n}\n\n/**\n * Get or create a cache entry for a key\n */\nfunction getOrCreateEntry<TData>(key: string): SharedQueryEntry<TData> {\n const existing = store.get(key) as SharedQueryEntry<TData> | undefined;\n if (existing) {\n // Update LRU timestamp on access\n existing.lastAccessedAt = Date.now();\n return existing;\n }\n\n const entry: SharedQueryEntry<TData> = {\n snapshot: {\n data: undefined,\n error: null,\n status: 'idle',\n updatedAt: null,\n isFetching: false,\n },\n subscribers: new Set(),\n promise: null,\n abortController: null,\n\n cacheTimeMs: DEFAULT_CACHE_TIME_MS,\n gcTimeoutId: null,\n\n queryFn: null,\n\n intervalCounts: new Map(),\n activeIntervalMs: null,\n intervalId: null,\n\n lastAccessedAt: Date.now(),\n };\n\n store.set(key, entry as SharedQueryEntry<unknown>);\n\n // Trigger LRU eviction if needed\n evictStaleEntries();\n\n return entry;\n}\n\n/**\n * Notify all subscribers of a state change\n */\nfunction emit(entry: SharedQueryEntry<unknown>): void {\n for (const cb of entry.subscribers) {\n cb();\n }\n}\n\n/**\n * Update snapshot and notify subscribers if changed\n */\nfunction setSnapshot<TData>(entry: SharedQueryEntry<TData>, next: SharedQuerySnapshot<TData>): void {\n const prev = entry.snapshot;\n const isEqual =\n prev.status === next.status &&\n prev.isFetching === next.isFetching &&\n prev.updatedAt === next.updatedAt &&\n prev.error === next.error &&\n prev.data === next.data;\n\n if (isEqual) return;\n entry.snapshot = next;\n emit(entry as SharedQueryEntry<unknown>);\n}\n\n/**\n * Get the minimum polling interval from all subscribers\n */\nfunction getMinIntervalMs(entry: SharedQueryEntry<unknown>): number | null {\n let min: number | null = null;\n for (const [ms, count] of entry.intervalCounts) {\n if (count <= 0) continue;\n if (min === null || ms < min) min = ms;\n }\n return min;\n}\n\n/**\n * Start or restart the polling interval based on subscriber requirements\n */\nfunction startOrRestartInterval(key: string, entry: SharedQueryEntry<unknown>): void {\n const nextMs = getMinIntervalMs(entry);\n\n if (nextMs === null) {\n if (entry.intervalId) clearInterval(entry.intervalId);\n entry.intervalId = null;\n entry.activeIntervalMs = null;\n return;\n }\n\n if (entry.activeIntervalMs === nextMs && entry.intervalId) return;\n\n if (entry.intervalId) clearInterval(entry.intervalId);\n entry.activeIntervalMs = nextMs;\n entry.intervalId = setInterval(() => {\n const fn = entry.queryFn;\n if (!fn) return;\n void fetchSharedQuery(key, fn, { force: true });\n }, nextMs);\n}\n\n/**\n * Subscribe to a query's state changes\n */\nfunction subscribeSharedQuery(key: string, onChange: () => void, cacheTimeMs?: number): () => void {\n const entry = getOrCreateEntry(key);\n entry.subscribers.add(onChange);\n\n if (typeof cacheTimeMs === 'number') {\n entry.cacheTimeMs = Math.max(entry.cacheTimeMs, cacheTimeMs);\n }\n\n // Cancel pending GC if re-subscribing\n if (entry.gcTimeoutId) {\n clearTimeout(entry.gcTimeoutId);\n entry.gcTimeoutId = null;\n }\n\n return () => {\n entry.subscribers.delete(onChange);\n if (entry.subscribers.size > 0) return;\n\n // Last subscriber unmounting - stop background work\n if (entry.abortController) {\n entry.abortController.abort();\n }\n entry.abortController = null;\n entry.promise = null;\n\n if (entry.intervalId) clearInterval(entry.intervalId);\n entry.intervalId = null;\n entry.activeIntervalMs = null;\n entry.intervalCounts.clear();\n\n // Schedule GC\n const gcDelayMs = entry.cacheTimeMs ?? DEFAULT_CACHE_TIME_MS;\n entry.gcTimeoutId = setTimeout(() => {\n if (entry.subscribers.size === 0) {\n store.delete(key);\n }\n }, gcDelayMs);\n };\n}\n\n/**\n * Fetch data for a query, with deduplication and caching\n */\nasync function fetchSharedQuery<TData>(\n key: string,\n queryFn: (signal: AbortSignal) => Promise<TData>,\n options: SharedQueryFetchOptions = {},\n): Promise<TData> {\n const entry = getOrCreateEntry<TData>(key);\n entry.queryFn = queryFn;\n\n const staleTimeMs = options.staleTimeMs ?? 0;\n const now = Date.now();\n\n // Check if data is fresh\n const isFresh =\n options.force !== true &&\n entry.snapshot.status === 'success' &&\n entry.snapshot.updatedAt !== null &&\n now - entry.snapshot.updatedAt < staleTimeMs;\n\n if (isFresh && entry.snapshot.data !== undefined) {\n return entry.snapshot.data;\n }\n\n // Deduplicate: return existing promise if in-flight\n if (entry.promise) {\n return entry.promise;\n }\n\n const controller = new AbortController();\n entry.abortController = controller;\n\n // Link external abort signal if provided\n if (options.signal) {\n if (options.signal.aborted) {\n controller.abort();\n } else {\n options.signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n }\n\n // Update loading state\n const isFirstLoad = entry.snapshot.status === 'idle' && entry.snapshot.updatedAt === null;\n setSnapshot(entry, {\n ...entry.snapshot,\n status: isFirstLoad ? 'loading' : entry.snapshot.status,\n isFetching: true,\n error: null,\n });\n\n const promise = (async () => {\n try {\n const data = await queryFn(controller.signal);\n setSnapshot(entry, {\n data,\n error: null,\n status: 'success',\n updatedAt: Date.now(),\n isFetching: false,\n });\n return data;\n } catch (cause) {\n const aborted = controller.signal.aborted;\n\n // On abort, preserve previous data and DON'T throw (avoids unhandled rejections)\n if (aborted) {\n setSnapshot(entry, {\n data: entry.snapshot.data,\n error: null,\n status: entry.snapshot.status === 'idle' ? 'idle' : entry.snapshot.status,\n updatedAt: entry.snapshot.updatedAt,\n isFetching: false,\n });\n // Return previous data instead of throwing\n return entry.snapshot.data as TData;\n }\n\n // Non-abort error: store error but keep previous data\n const error = cause instanceof Error ? cause : new Error(String(cause));\n setSnapshot(entry, {\n data: entry.snapshot.data,\n error,\n status: 'error',\n updatedAt: entry.snapshot.updatedAt,\n isFetching: false,\n });\n throw error;\n } finally {\n entry.promise = null;\n entry.abortController = null;\n }\n })();\n\n entry.promise = promise;\n return promise;\n}\n\n/**\n * Return type for useSharedQuery hook\n */\nexport interface UseSharedQueryReturn<TData> extends SharedQuerySnapshot<TData> {\n /** Refetch the query, optionally with an abort signal */\n refetch: (options?: { signal?: AbortSignal }) => Promise<TData | undefined>;\n /** Abort any in-flight request */\n abort: () => void;\n}\n\n/**\n * Return type for useSharedQuery hook with select\n */\nexport interface UseSharedQueryReturnSelected<TSelected> {\n /** The selected/transformed data */\n data: TSelected;\n /** Error from the last fetch attempt */\n error: Error | null;\n /** Current status of the query */\n status: 'idle' | 'loading' | 'success' | 'error';\n /** Timestamp of last successful update */\n updatedAt: number | null;\n /** Whether a fetch is currently in progress */\n isFetching: boolean;\n /** Refetch the query, optionally with an abort signal */\n refetch: (options?: { signal?: AbortSignal }) => Promise<unknown>;\n /** Abort any in-flight request */\n abort: () => void;\n}\n\n/**\n * Hook for shared, deduplicated data fetching with caching and polling support.\n *\n * @param key - Unique cache key, or null to disable\n * @param queryFn - Async function to fetch data, receives AbortSignal\n * @param options - Query options\n * @returns Query snapshot with refetch and abort methods\n *\n * @example Basic usage\n * ```tsx\n * const { data, isLoading, refetch, abort } = useSharedQuery(\n * ['balance', address],\n * async (signal) => {\n * const result = await rpc.getBalance(address).send();\n * return result.value;\n * },\n * { refetchIntervalMs: 30000 }\n * );\n * ```\n *\n * @example With select (reduces rerenders)\n * ```tsx\n * const { data: solBalance } = useSharedQuery(\n * ['wallet-assets', address],\n * fetchWalletAssets,\n * {\n * select: (assets) => assets?.lamports ?? 0n,\n * }\n * );\n * ```\n */\nexport function useSharedQuery<TData, TSelected = TData>(\n key: string | null,\n queryFn: (signal: AbortSignal) => Promise<TData>,\n options: SharedQueryOptions<TData, TSelected> = {},\n): TSelected extends TData ? UseSharedQueryReturn<TData> : UseSharedQueryReturnSelected<TSelected> {\n const {\n enabled = true,\n staleTimeMs = 0,\n cacheTimeMs,\n refetchOnMount = 'stale',\n refetchIntervalMs = false,\n select,\n } = options;\n\n // Stable reference to queryFn - update on every render but don't trigger effects\n const queryFnRef = useRef(queryFn);\n queryFnRef.current = queryFn;\n\n // Create a stable wrapper that reads from ref\n const stableQueryFn = useCallback((signal: AbortSignal) => queryFnRef.current(signal), []);\n\n // Memoize subscribe to avoid infinite loops\n const subscribe = useCallback(\n (onChange: () => void) => {\n if (!key) return () => {};\n return subscribeSharedQuery(key, onChange, cacheTimeMs);\n },\n [key, cacheTimeMs],\n );\n\n // Memoize getSnapshot to return stable reference when key is null\n const emptySnapshot = useMemo<SharedQuerySnapshot<TData>>(\n () => ({\n data: undefined,\n error: null,\n status: 'idle',\n updatedAt: null,\n isFetching: false,\n }),\n [],\n );\n\n const getSnapshot = useCallback((): SharedQuerySnapshot<TData> => {\n if (!key) return emptySnapshot;\n return getOrCreateEntry<TData>(key).snapshot;\n }, [key, emptySnapshot]);\n\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n // Apply select transform if provided\n const selectedData = useMemo(() => {\n if (!select) return snapshot.data as unknown as TSelected;\n return select(snapshot.data);\n }, [snapshot.data, select]);\n\n // Track previous selected value for referential stability\n const prevSelectedRef = useRef<TSelected>(selectedData);\n const stableSelectedData = useMemo(() => {\n // Use Object.is for comparison (handles primitives and objects)\n if (Object.is(prevSelectedRef.current, selectedData)) {\n return prevSelectedRef.current;\n }\n prevSelectedRef.current = selectedData;\n return selectedData;\n }, [selectedData]);\n\n // Track if we've successfully fetched for this key (used to prevent duplicate fetches)\n const fetchedKeyRef = useRef<string | null>(null);\n\n // Initial fetch effect - only runs once per key change\n useEffect(() => {\n if (!key || !enabled) {\n fetchedKeyRef.current = null;\n return;\n }\n\n // Register queryFn for background refetching\n const entry = getOrCreateEntry<TData>(key);\n entry.queryFn = stableQueryFn;\n\n // Skip if we already successfully fetched for this key\n // (checking status === 'success' prevents skipping after aborted fetches in StrictMode)\n if (fetchedKeyRef.current === key && entry.snapshot.status === 'success') {\n return;\n }\n\n // Determine if we should fetch\n const current = entry.snapshot;\n const isStale = current.updatedAt === null || Date.now() - current.updatedAt >= staleTimeMs;\n const shouldFetch =\n refetchOnMount === true || current.status === 'idle' || (refetchOnMount === 'stale' && isStale);\n\n if (shouldFetch) {\n // Mark as fetched for this key (will be validated by status check on re-runs)\n fetchedKeyRef.current = key;\n // Fire-and-forget - errors are stored in snapshot, not re-thrown\n fetchSharedQuery(key, stableQueryFn, {\n staleTimeMs,\n force: refetchOnMount === true,\n }).catch(() => {\n // Error is already stored in snapshot, no need to handle here\n });\n } else {\n // Data is fresh, mark as fetched\n fetchedKeyRef.current = key;\n }\n }, [key, enabled, staleTimeMs, refetchOnMount, stableQueryFn]);\n\n // Polling effect - separate from initial fetch\n useEffect(() => {\n if (!key || !enabled || refetchIntervalMs === false) return;\n\n const entry = getOrCreateEntry<TData>(key);\n entry.queryFn = stableQueryFn;\n\n const prev = entry.intervalCounts.get(refetchIntervalMs) ?? 0;\n entry.intervalCounts.set(refetchIntervalMs, prev + 1);\n startOrRestartInterval(key, entry as SharedQueryEntry<unknown>);\n\n return () => {\n const count = entry.intervalCounts.get(refetchIntervalMs) ?? 0;\n if (count <= 1) {\n entry.intervalCounts.delete(refetchIntervalMs);\n } else {\n entry.intervalCounts.set(refetchIntervalMs, count - 1);\n }\n startOrRestartInterval(key, entry as SharedQueryEntry<unknown>);\n };\n }, [key, enabled, refetchIntervalMs, stableQueryFn]);\n\n const refetch = useCallback(\n async (refetchOptions?: { signal?: AbortSignal }) => {\n if (!key) return undefined;\n return fetchSharedQuery(key, stableQueryFn, {\n force: true,\n signal: refetchOptions?.signal,\n });\n },\n [key, stableQueryFn],\n );\n\n const abort = useCallback(() => {\n if (!key) return;\n const entry = store.get(key);\n if (entry?.abortController) {\n entry.abortController.abort();\n }\n }, [key]);\n\n // Return type depends on whether select is provided\n return useMemo(\n () =>\n ({\n data: stableSelectedData,\n error: snapshot.error,\n status: snapshot.status,\n updatedAt: snapshot.updatedAt,\n isFetching: snapshot.isFetching,\n refetch,\n abort,\n }) as TSelected extends TData ? UseSharedQueryReturn<TData> : UseSharedQueryReturnSelected<TSelected>,\n [stableSelectedData, snapshot.error, snapshot.status, snapshot.updatedAt, snapshot.isFetching, refetch, abort],\n );\n}\n\n/**\n * Invalidate a query, causing it to refetch on next access\n */\nexport function invalidateSharedQuery(key: string): void {\n const entry = store.get(key);\n if (!entry) return;\n\n setSnapshot(entry as SharedQueryEntry<unknown>, {\n ...entry.snapshot,\n updatedAt: null, // Mark as stale\n });\n}\n\n/**\n * Clear all cached queries (useful for logout/disconnect)\n */\nexport function clearSharedQueryCache(): void {\n for (const [, entry] of store) {\n if (entry.intervalId) clearInterval(entry.intervalId);\n if (entry.gcTimeoutId) clearTimeout(entry.gcTimeoutId);\n if (entry.abortController) entry.abortController.abort();\n }\n store.clear();\n}\n\n/**\n * Get the current store size (for testing/debugging)\n */\nexport function getSharedQueryStoreSize(): number {\n return store.size;\n}\n","'use client';\n\nimport { useCallback, useMemo } from 'react';\nimport { address as toAddress } from '@solana/addresses';\nimport { useAccount } from '../use-account';\nimport { useSolanaClient } from '../use-kit-solana-client';\nimport { useSharedQuery } from './use-shared-query';\nimport type { SharedQueryOptions } from './use-shared-query';\nimport type { SolanaClient } from '../../lib/kit';\n\n/**\n * Token Program IDs\n */\nexport const TOKEN_PROGRAM_ID = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA';\nexport const TOKEN_2022_PROGRAM_ID = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb';\n\n/**\n * Native SOL mint address (wrapped SOL)\n */\nexport const NATIVE_SOL_MINT = 'So11111111111111111111111111111111111111112';\n\n/**\n * Information about a single token account\n */\nexport interface TokenAccountInfo {\n /** Token account public key */\n pubkey: string;\n /** Token mint address */\n mint: string;\n /** Owner address */\n owner: string;\n /** Raw balance in smallest unit */\n amount: bigint;\n /** Token decimals */\n decimals: number;\n /** Whether the account is frozen */\n isFrozen: boolean;\n /** Which token program this account belongs to */\n programId: 'token' | 'token-2022';\n}\n\n/**\n * Combined wallet assets data\n */\nexport interface WalletAssetsData {\n /** SOL balance in lamports */\n lamports: bigint;\n /** All token accounts (Token Program + Token-2022) */\n tokenAccounts: TokenAccountInfo[];\n}\n\n/**\n * Options for useWalletAssets hook\n */\nexport interface UseWalletAssetsOptions<TSelected = WalletAssetsData>\n extends Omit<SharedQueryOptions<WalletAssetsData, TSelected>, 'select'> {\n /** Override the Solana client from provider */\n client?: SolanaClient | null;\n /** Transform/select a subset of data (reduces rerenders) */\n select?: (data: WalletAssetsData | undefined) => TSelected;\n}\n\n/**\n * Return type for useWalletAssets hook\n */\nexport interface UseWalletAssetsReturn<TSelected = WalletAssetsData> {\n /** The wallet assets data (or selected subset) */\n data: TSelected;\n /** Whether data is loading */\n isLoading: boolean;\n /** Whether a fetch is in progress */\n isFetching: boolean;\n /** Error if fetch failed */\n error: Error | null;\n /** Refetch assets */\n refetch: (options?: { signal?: AbortSignal }) => Promise<unknown>;\n /** Abort in-flight request */\n abort: () => void;\n /** Last updated timestamp */\n updatedAt: number | null;\n}\n\n/**\n * Parse a token account from RPC response\n */\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction parseBigInt(value: unknown): bigint {\n if (typeof value === 'bigint') return value;\n if (typeof value === 'number' && Number.isSafeInteger(value)) return BigInt(value);\n if (typeof value === 'string') {\n try {\n return BigInt(value);\n } catch {\n return 0n;\n }\n }\n return 0n;\n}\n\ninterface ParsedTokenAmount {\n amount?: unknown;\n decimals?: unknown;\n}\n\ninterface ParsedTokenAccountInfo {\n mint?: unknown;\n owner?: unknown;\n tokenAmount?: unknown;\n state?: unknown;\n}\n\nfunction getParsedTokenAccountInfo(data: unknown): ParsedTokenAccountInfo | null {\n if (!isRecord(data)) return null;\n\n const parsed = data.parsed;\n if (!isRecord(parsed)) return null;\n\n const info = parsed.info;\n if (!isRecord(info)) return null;\n\n return info as ParsedTokenAccountInfo;\n}\n\nfunction parseTokenAccount(\n account: { pubkey: unknown; account: { data: unknown } },\n programId: 'token' | 'token-2022',\n): TokenAccountInfo | null {\n const info = getParsedTokenAccountInfo(account.account.data);\n if (!info) return null;\n\n const mint = typeof info.mint === 'string' ? info.mint : null;\n const owner = typeof info.owner === 'string' ? info.owner : null;\n if (!mint || !owner) return null;\n\n const tokenAmount = isRecord(info.tokenAmount) ? (info.tokenAmount as ParsedTokenAmount) : null;\n const amount = parseBigInt(tokenAmount?.amount);\n const decimals = typeof tokenAmount?.decimals === 'number' ? tokenAmount.decimals : 0;\n const state = typeof info.state === 'string' ? info.state : undefined;\n\n return {\n pubkey: String(account.pubkey),\n mint,\n owner,\n amount,\n decimals,\n isFrozen: state === 'frozen',\n programId,\n };\n}\n\n/**\n * Generate the query key for wallet assets.\n * Use this to invalidate the cache externally.\n *\n * @param rpcUrl - The RPC URL being used\n * @param address - The wallet address\n * @returns The stringified query key, or null if params are invalid\n *\n * @example\n * ```tsx\n * // Invalidate wallet assets after a transaction\n * const key = getWalletAssetsQueryKey(rpcUrl, address);\n * if (key) invalidateSharedQuery(key);\n * ```\n */\nexport function getWalletAssetsQueryKey(rpcUrl: string | null, address: string | null): string | null {\n if (!rpcUrl || !address) return null;\n return JSON.stringify(['wallet-assets', rpcUrl, address]);\n}\n\n/**\n * Internal hook that fetches both SOL balance and all token accounts.\n * Queries both Token Program and Token-2022 in parallel.\n *\n * This hook is used internally by `useBalance` and `useTokens` to share\n * a single RPC query, preventing duplicate requests.\n *\n * @internal\n *\n * @example Basic usage\n * ```tsx\n * const { data, isLoading } = useWalletAssets();\n * // data.lamports - SOL balance\n * // data.tokenAccounts - all token accounts\n * ```\n *\n * @example With select (reduces rerenders)\n * ```tsx\n * const { data: lamports } = useWalletAssets({\n * select: (assets) => assets?.lamports ?? 0n,\n * });\n * ```\n */\nexport function useWalletAssets<TSelected = WalletAssetsData>(\n options: UseWalletAssetsOptions<TSelected> = {},\n): UseWalletAssetsReturn<TSelected> {\n const {\n enabled = true,\n staleTimeMs = 0,\n cacheTimeMs = 5 * 60 * 1000, // 5 minutes\n refetchOnMount = 'stale',\n refetchIntervalMs = false,\n client: clientOverride,\n select,\n } = options;\n\n const { address, connected } = useAccount();\n const { client: providerClient } = useSolanaClient();\n\n // Use override client if provided, otherwise use provider client\n const rpcClient = clientOverride ?? providerClient;\n\n // Generate cache key based on RPC URL and address only\n // This ensures useBalance and useTokens share the same cache entry\n const key = useMemo(() => {\n if (!enabled || !connected || !address || !rpcClient) return null;\n const rpcUrl =\n rpcClient.urlOrMoniker instanceof URL ? rpcClient.urlOrMoniker.toString() : String(rpcClient.urlOrMoniker);\n return getWalletAssetsQueryKey(rpcUrl, address);\n }, [enabled, connected, address, rpcClient]);\n\n // Query function that fetches SOL balance and all token accounts\n const queryFn = useCallback(\n async (signal: AbortSignal): Promise<WalletAssetsData> => {\n if (!connected || !address || !rpcClient) {\n return { lamports: 0n, tokenAccounts: [] };\n }\n\n // Throw on abort - fetchSharedQuery will preserve previous data\n if (signal.aborted) {\n throw new DOMException('Query aborted', 'AbortError');\n }\n\n const rpc = rpcClient.rpc;\n const walletAddress = toAddress(address);\n const tokenProgramId = toAddress(TOKEN_PROGRAM_ID);\n const token2022ProgramId = toAddress(TOKEN_2022_PROGRAM_ID);\n\n // Fetch SOL balance and both token programs in parallel\n const [balanceResult, tokenAccountsResult, token2022AccountsResult] = await Promise.all([\n rpc.getBalance(walletAddress).send(),\n rpc\n .getTokenAccountsByOwner(walletAddress, { programId: tokenProgramId }, { encoding: 'jsonParsed' })\n .send(),\n rpc\n .getTokenAccountsByOwner(\n walletAddress,\n { programId: token2022ProgramId },\n { encoding: 'jsonParsed' },\n )\n .send(),\n ]);\n\n // Check abort after async operations\n if (signal.aborted) {\n throw new DOMException('Query aborted', 'AbortError');\n }\n\n // Parse Token Program accounts\n const tokenAccounts: TokenAccountInfo[] = [];\n\n for (const account of tokenAccountsResult.value) {\n const parsed = parseTokenAccount(account, 'token');\n if (parsed) {\n tokenAccounts.push(parsed);\n }\n }\n\n // Parse Token-2022 accounts\n for (const account of token2022AccountsResult.value) {\n const parsed = parseTokenAccount(account, 'token-2022');\n if (parsed) {\n tokenAccounts.push(parsed);\n }\n }\n\n return {\n lamports: balanceResult.value,\n tokenAccounts,\n };\n },\n [connected, address, rpcClient],\n );\n\n // Use shared query with optional select\n const { data, error, status, updatedAt, isFetching, refetch, abort } = useSharedQuery<WalletAssetsData, TSelected>(\n key,\n queryFn,\n {\n enabled,\n staleTimeMs,\n cacheTimeMs,\n refetchOnMount,\n refetchIntervalMs,\n select: select as ((data: WalletAssetsData | undefined) => TSelected) | undefined,\n },\n );\n\n const isLoading = status === 'loading' || status === 'idle';\n\n return useMemo(\n () => ({\n data: data as TSelected,\n isLoading,\n isFetching,\n error,\n refetch,\n abort,\n updatedAt,\n }),\n [data, isLoading, isFetching, error, refetch, abort, updatedAt],\n );\n}\n","'use client';\n\nimport { useCallback, useMemo } from 'react';\nimport {\n useWalletAssets,\n getWalletAssetsQueryKey,\n type WalletAssetsData,\n type TokenAccountInfo,\n} from './_internal/use-wallet-assets';\nimport { formatLamportsToSolSafe, formatBigIntBalance } from '../utils/formatting';\nimport type { SolanaClient } from '../lib/kit';\n\n/**\n * Generate the query key for balance data.\n * Use this to invalidate the balance cache externally.\n *\n * Note: Balance and tokens share the same underlying cache (wallet-assets).\n *\n * @param rpcUrl - The RPC URL being used\n * @param address - The wallet address\n * @returns The query key string, or null if params are invalid\n *\n * @example\n * ```tsx\n * // Invalidate balance after sending a transaction\n * const key = getBalanceQueryKey(rpcUrl, address);\n * if (key) invalidateSharedQuery(key);\n * ```\n */\nexport function getBalanceQueryKey(rpcUrl: string | null, address: string | null): string | null {\n return getWalletAssetsQueryKey(rpcUrl, address);\n}\n\nexport interface TokenBalance {\n /** Token mint address */\n mint: string;\n /** Token balance (in smallest unit) */\n amount: bigint;\n /** Token decimals */\n decimals: number;\n /** Formatted balance (human readable) */\n formatted: string;\n /** Token symbol if known */\n symbol?: string;\n /** Token name if known */\n name?: string;\n /** Token logo URL if known */\n logo?: string;\n}\n\n/**\n * Options for useBalance hook\n */\nexport interface UseBalanceOptions {\n /** Whether the hook is enabled (default: true) */\n enabled?: boolean;\n /** Whether to auto-refresh balance (default: true) */\n autoRefresh?: boolean;\n /** Refresh interval in milliseconds (default: 30000) */\n refreshInterval?: number;\n /** Time in ms to consider data fresh (default: 0) */\n staleTimeMs?: number;\n /** Time in ms to keep cache after unmount (default: 300000) */\n cacheTimeMs?: number;\n /** Whether to refetch on mount (default: 'stale') */\n refetchOnMount?: boolean | 'stale';\n /** Override the Solana client from provider */\n client?: SolanaClient | null;\n}\n\nexport interface UseBalanceReturn {\n /** SOL balance in SOL (not lamports) */\n solBalance: number;\n /** SOL balance in lamports */\n lamports: bigint;\n /** Formatted SOL balance string */\n formattedSol: string;\n /** Token balances */\n tokens: TokenBalance[];\n /** Whether balance is loading */\n isLoading: boolean;\n /** Error if balance fetch failed */\n error: Error | null;\n /** Refetch balance, optionally with an abort signal */\n refetch: (options?: { signal?: AbortSignal }) => Promise<void>;\n /** Abort any in-flight balance fetch */\n abort: () => void;\n /** Last updated timestamp */\n lastUpdated: Date | null;\n}\n\nconst LAMPORTS_PER_SOL = 1_000_000_000n;\n\n/**\n * Format a token account into a TokenBalance (BigInt-safe)\n */\nfunction formatTokenAccount(account: TokenAccountInfo): TokenBalance {\n const formatted = formatBigIntBalance(account.amount, account.decimals, {\n maxDecimals: Math.min(account.decimals, 6),\n });\n\n return {\n mint: account.mint,\n amount: account.amount,\n decimals: account.decimals,\n formatted,\n };\n}\n\n/** Selected data type for balance hook */\ninterface BalanceSelection {\n lamports: bigint;\n tokens: TokenBalance[];\n}\n\n/**\n * Select function to transform wallet assets into balance data\n */\nfunction selectBalance(assets: WalletAssetsData | undefined): BalanceSelection {\n if (!assets) {\n return { lamports: 0n, tokens: [] };\n }\n\n // Filter to only non-zero balances and format\n const tokens = assets.tokenAccounts.filter(account => account.amount > 0n).map(formatTokenAccount);\n\n return {\n lamports: assets.lamports,\n tokens,\n };\n}\n\n/**\n * Hook for fetching wallet balance (SOL and tokens).\n *\n * Features:\n * - Automatic request deduplication across components\n * - Shared data with useTokens (single RPC query)\n * - Token-2022 support\n * - Shared polling interval (ref-counted)\n * - Configurable auto-refresh behavior\n * - Abort support for in-flight requests\n * - Optional client override\n *\n * @example Basic usage\n * ```tsx\n * function Balance() {\n * const { solBalance, formattedSol, isLoading } = useBalance();\n *\n * if (isLoading) return <div>Loading...</div>;\n * return <div>{formattedSol}</div>;\n * }\n * ```\n *\n * @example With options\n * ```tsx\n * function Balance() {\n * const { formattedSol, refetch, abort } = useBalance({\n * autoRefresh: false, // Disable polling\n * staleTimeMs: 10000, // Consider data fresh for 10s\n * });\n *\n * return (\n * <div>\n * {formattedSol}\n * <button onClick={() => refetch()}>Refresh</button>\n * </div>\n * );\n * }\n * ```\n *\n * @example With token balances\n * ```tsx\n * function TokenBalances() {\n * const { tokens, isLoading } = useBalance();\n *\n * return (\n * <div>\n * {tokens.map(token => (\n * <div key={token.mint}>\n * {token.symbol}: {token.formatted}\n * </div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useBalance(options: UseBalanceOptions = {}): UseBalanceReturn {\n const {\n enabled = true,\n autoRefresh = true,\n refreshInterval = 30000,\n staleTimeMs = 0,\n cacheTimeMs = 5 * 60 * 1000, // 5 minutes\n refetchOnMount = 'stale',\n client: clientOverride,\n } = options;\n\n // Use shared wallet assets with select for reduced rerenders\n const {\n data,\n error,\n isFetching,\n updatedAt,\n refetch: sharedRefetch,\n abort,\n } = useWalletAssets<BalanceSelection>({\n enabled,\n staleTimeMs,\n cacheTimeMs,\n refetchOnMount,\n refetchIntervalMs: autoRefresh ? refreshInterval : false,\n client: clientOverride,\n select: selectBalance,\n });\n\n const lamports = data?.lamports ?? 0n;\n const tokens = data?.tokens ?? [];\n\n const solBalance = useMemo(() => Number(lamports) / Number(LAMPORTS_PER_SOL), [lamports]);\n\n const formattedSol = useMemo(() => formatLamportsToSolSafe(lamports, { maxDecimals: 4, suffix: true }), [lamports]);\n\n // Preserve old behavior: don't surface \"refresh failed\" errors if we already have data\n const visibleError = updatedAt ? null : error;\n\n // Wrap refetch to match expected signature\n const refetch = useCallback(\n async (opts?: { signal?: AbortSignal }) => {\n await sharedRefetch(opts);\n },\n [sharedRefetch],\n );\n\n return useMemo(\n () => ({\n solBalance,\n lamports,\n formattedSol,\n tokens,\n isLoading: isFetching,\n error: visibleError,\n refetch,\n abort,\n lastUpdated: updatedAt ? new Date(updatedAt) : null,\n }),\n [solBalance, lamports, formattedSol, tokens, isFetching, visibleError, refetch, abort, updatedAt],\n );\n}\n","/**\n * Abort / timeout helpers.\n */\n\n/**\n * Creates a timeout signal with a browser compatibility fallback.\n *\n * - Uses `AbortSignal.timeout` when available.\n * - Falls back to a local `AbortController` + `setTimeout` when not.\n */\nexport function createTimeoutSignal(ms: number): { signal: AbortSignal; cleanup: () => void } {\n if (typeof AbortSignal.timeout === 'function') {\n return { signal: AbortSignal.timeout(ms), cleanup: () => {} };\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), ms);\n\n return {\n signal: controller.signal,\n cleanup: () => clearTimeout(timeoutId),\n };\n}\n","/**\n * Shared Solana Token List metadata fetch + cache.\n *\n * Used by multiple hooks (e.g. useTokens, useTransactions) to avoid duplicate\n * token-list network calls and to share a single in-memory cache.\n */\n\n'use client';\n\nimport { createTimeoutSignal } from '../../utils/abort';\nimport type { ClusterType } from '../../utils/cluster';\n\nexport interface SolanaTokenListMetadata {\n address: string;\n name: string;\n symbol: string;\n decimals: number;\n logoURI: string;\n extensions?: {\n coingeckoId?: string;\n };\n}\n\ninterface SolanaTokenListApiResponse {\n content: SolanaTokenListMetadata[];\n}\n\n/**\n * Solana Token List API chain IDs for different networks\n * - 101: mainnet-beta\n * - 102: testnet\n * - 103: devnet\n */\nconst CLUSTER_CHAIN_IDS: Record<ClusterType, number> = {\n mainnet: 101,\n testnet: 102,\n devnet: 103,\n localnet: 103, // Use devnet tokens for localnet\n custom: 101, // Default to mainnet for custom clusters\n};\n\nconst TOKEN_LIST_API_BASE_URL = 'https://token-list-api.solana.cloud/v1/mints';\n\n/**\n * Build the token list API URL for a specific cluster\n */\nfunction getTokenListApiUrl(cluster: ClusterType = 'mainnet'): string {\n const chainId = CLUSTER_CHAIN_IDS[cluster];\n return `${TOKEN_LIST_API_BASE_URL}?chainId=${chainId}`;\n}\n\nconst DEFAULT_TIMEOUT_MS = 10000;\nconst TOKEN_LIST_CACHE_MAX_SIZE = 1500;\nconst MAX_ADDRESSES_PER_REQUEST = 100;\n\n// Simple LRU-ish Map: delete+set on get to bump recency.\nconst tokenListCache = new Map<string, SolanaTokenListMetadata>();\n\nfunction getCachedTokenListMetadata(mint: string): SolanaTokenListMetadata | undefined {\n const value = tokenListCache.get(mint);\n if (!value) return undefined;\n tokenListCache.delete(mint);\n tokenListCache.set(mint, value);\n return value;\n}\n\nfunction setCachedTokenListMetadata(mint: string, value: SolanaTokenListMetadata): void {\n if (tokenListCache.has(mint)) {\n tokenListCache.delete(mint);\n }\n\n tokenListCache.set(mint, value);\n\n if (tokenListCache.size > TOKEN_LIST_CACHE_MAX_SIZE) {\n const oldestKey = tokenListCache.keys().next().value as string | undefined;\n if (oldestKey) tokenListCache.delete(oldestKey);\n }\n}\n\nfunction createLinkedSignal(\n externalSignal: AbortSignal | undefined,\n timeoutMs: number,\n): { signal: AbortSignal; cleanup: () => void } {\n const controller = new AbortController();\n\n const onAbort = () => controller.abort();\n if (externalSignal) {\n if (externalSignal.aborted) controller.abort();\n else externalSignal.addEventListener('abort', onAbort, { once: true });\n }\n\n const { signal: timeoutSignal, cleanup: cleanupTimeout } = createTimeoutSignal(timeoutMs);\n const onTimeoutAbort = () => controller.abort();\n if (timeoutSignal.aborted) controller.abort();\n else timeoutSignal.addEventListener('abort', onTimeoutAbort, { once: true });\n\n return {\n signal: controller.signal,\n cleanup: () => {\n cleanupTimeout();\n if (externalSignal) {\n externalSignal.removeEventListener('abort', onAbort);\n }\n timeoutSignal.removeEventListener('abort', onTimeoutAbort);\n },\n };\n}\n\nexport interface FetchSolanaTokenListMetadataOptions {\n /** Timeout in milliseconds for each batch request */\n timeoutMs?: number;\n /** External abort signal */\n signal?: AbortSignal;\n /** Cluster type to fetch tokens for (determines chainId in API URL) */\n cluster?: ClusterType;\n}\n\nexport async function fetchSolanaTokenListMetadata(\n mints: string[],\n options: FetchSolanaTokenListMetadataOptions = {},\n): Promise<Map<string, SolanaTokenListMetadata>> {\n const results = new Map<string, SolanaTokenListMetadata>();\n\n if (!mints.length) return results;\n\n const seen = new Set<string>();\n const uncached: string[] = [];\n\n for (const mint of mints) {\n const normalized = mint?.trim();\n if (!normalized) continue;\n if (seen.has(normalized)) continue;\n seen.add(normalized);\n\n const cached = getCachedTokenListMetadata(normalized);\n if (cached) results.set(normalized, cached);\n else uncached.push(normalized);\n }\n\n if (!uncached.length) return results;\n\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const apiUrl = getTokenListApiUrl(options.cluster);\n\n // Batch requests to avoid very large POST bodies/timeouts on wallets with many mints.\n for (let i = 0; i < uncached.length; i += MAX_ADDRESSES_PER_REQUEST) {\n if (options.signal?.aborted) break;\n\n const batch = uncached.slice(i, i + MAX_ADDRESSES_PER_REQUEST);\n const { signal, cleanup } = createLinkedSignal(options.signal, timeoutMs);\n\n try {\n const response = await fetch(apiUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ addresses: batch }),\n signal,\n });\n\n if (!response.ok) {\n console.warn('[token-list] Solana Token List API error:', response.status, response.statusText);\n continue;\n }\n\n const data: SolanaTokenListApiResponse = await response.json();\n if (!data?.content?.length) continue;\n\n for (const item of data.content) {\n if (!item?.address) continue;\n results.set(item.address, item);\n setCachedTokenListMetadata(item.address, item);\n }\n } catch (error) {\n console.warn('[token-list] Solana Token List API failed:', error);\n } finally {\n cleanup();\n }\n }\n\n return results;\n}\n\nexport function clearSolanaTokenListCache(): void {\n tokenListCache.clear();\n}\n","/**\n * Image URL helpers.\n */\n\n/**\n * Transform an image URL through a proxy prefix if configured.\n *\n * Matches `ConnectorConfig.imageProxy` semantics:\n * `${imageProxy}${encodeURIComponent(originalUrl)}`\n */\nexport function transformImageUrl(url: string | undefined, imageProxy: string | undefined): string | undefined {\n if (!url) return undefined;\n if (!imageProxy) return url;\n return `${imageProxy}${encodeURIComponent(url)}`;\n}\n","'use client';\n\nimport { useState, useEffect, useCallback, useMemo, useRef } from 'react';\nimport { address as toAddress } from '@solana/addresses';\nimport { signature as toSignature } from '@solana/keys';\nimport type { SolanaCluster, SolanaClusterId } from '@wallet-ui/core';\nimport { useAccount } from './use-account';\nimport { useCluster } from './use-cluster';\nimport { useSolanaClient } from './use-kit-solana-client';\nimport { useConnectorClient } from '../ui/connector-provider';\nimport { useSharedQuery } from './_internal/use-shared-query';\nimport { fetchSolanaTokenListMetadata } from './_internal/solana-token-list';\nimport { getTransactionUrl, getClusterType, type ClusterType } from '../utils/cluster';\nimport { LAMPORTS_PER_SOL } from '../lib/kit';\nimport type { SolanaClient } from '../lib/kit';\nimport { transformImageUrl } from '../utils/image';\n\n/**\n * Options for generating the transactions query key\n */\nexport interface TransactionsQueryKeyOptions {\n rpcUrl: string;\n address: string;\n clusterId: SolanaClusterId;\n limit?: number;\n fetchDetails?: boolean;\n}\n\n/**\n * Generate the query key for transactions data.\n * Use this to invalidate the transactions cache externally.\n *\n * @param options - Query key options\n * @returns The query key string, or null if required params are missing\n *\n * @example\n * ```tsx\n * // Invalidate transactions after sending a new transaction\n * const key = getTransactionsQueryKey({\n * rpcUrl: 'https://api.mainnet-beta.solana.com',\n * address: 'ABC123...',\n * clusterId: 'solana:mainnet',\n * });\n * if (key) invalidateSharedQuery(key);\n * ```\n */\nexport function getTransactionsQueryKey(options: TransactionsQueryKeyOptions): string | null {\n const { rpcUrl, address, clusterId, limit = 20, fetchDetails = false } = options;\n if (!rpcUrl || !address || !clusterId) return null;\n return JSON.stringify(['wallet-transactions', rpcUrl, address, clusterId, limit, fetchDetails]);\n}\n\nexport interface TransactionInfo {\n /** Transaction signature */\n signature: string;\n /** Block time (unix timestamp) */\n blockTime: number | null;\n /** Slot number */\n slot: number;\n /** Transaction status */\n status: 'success' | 'failed';\n /** Error message if failed */\n error?: string;\n /** Transaction type (if detected) */\n type: 'sent' | 'received' | 'swap' | 'nft' | 'stake' | 'program' | 'tokenAccountClosed' | 'unknown';\n /** Direction for transfers */\n direction?: 'in' | 'out';\n /** Amount in SOL (for transfers) */\n amount?: number;\n /** Formatted amount string */\n formattedAmount?: string;\n /** Token mint address (for token transfers) */\n tokenMint?: string;\n /** Token symbol (if known) */\n tokenSymbol?: string;\n /** Token icon URL (if known) */\n tokenIcon?: string;\n /** Counterparty address (who you sent to or received from) */\n counterparty?: string;\n /** Formatted date string */\n formattedDate: string;\n /** Formatted time string */\n formattedTime: string;\n /** Explorer URL */\n explorerUrl: string;\n /** Swap from token (only for swap transactions) */\n swapFromToken?: {\n mint: string;\n symbol?: string;\n icon?: string;\n };\n /** Swap to token (only for swap transactions) */\n swapToToken?: {\n mint: string;\n symbol?: string;\n icon?: string;\n };\n /** Primary program ID involved in the transaction (best-effort) */\n programId?: string;\n /** Friendly name for the primary program if known */\n programName?: string;\n /** All program IDs involved in the transaction (best-effort) */\n programIds?: string[];\n /** Parsed instruction types (best-effort, only available for some programs in `jsonParsed` mode) */\n instructionTypes?: string[];\n /** Number of top-level instructions in the transaction message (best-effort) */\n instructionCount?: number;\n}\n\nexport interface UseTransactionsOptions {\n /** Whether the hook is enabled (default: true) */\n enabled?: boolean;\n /** Number of transactions to fetch */\n limit?: number;\n /** Whether to auto-refresh */\n autoRefresh?: boolean;\n /** Refresh interval in milliseconds */\n refreshInterval?: number;\n /** Fetch full transaction details (slower but more info) */\n fetchDetails?: boolean;\n /**\n * Max concurrent `getTransaction` RPC calls when `fetchDetails` is true.\n * Lower this if you see throttling on public RPCs.\n *\n * @default 6\n */\n detailsConcurrency?: number;\n /** Time in ms to consider data fresh (default: 0) */\n staleTimeMs?: number;\n /** Time in ms to keep cache after unmount (default: 300000) */\n cacheTimeMs?: number;\n /** Whether to refetch on mount (default: 'stale') */\n refetchOnMount?: boolean | 'stale';\n /** Override the Solana client from provider */\n client?: SolanaClient | null;\n}\n\nexport interface UseTransactionsReturn {\n /** List of transactions */\n transactions: TransactionInfo[];\n /** Whether transactions are loading */\n isLoading: boolean;\n /** Error if fetch failed */\n error: Error | null;\n /** Whether there are more transactions to load */\n hasMore: boolean;\n /** Load more transactions */\n loadMore: () => Promise<void>;\n /** Refetch transactions, optionally with an abort signal */\n refetch: (options?: { signal?: AbortSignal }) => Promise<void>;\n /** Abort any in-flight transaction fetch */\n abort: () => void;\n /** Last updated timestamp */\n lastUpdated: Date | null;\n}\n\nfunction formatDate(timestamp: number | null): { date: string; time: string } {\n if (!timestamp) {\n return { date: 'Unknown', time: '' };\n }\n\n const date = new Date(timestamp * 1000);\n const now = new Date();\n const diffDays = Math.floor((now.getTime() - date.getTime()) / (1000 * 60 * 60 * 24));\n\n let formattedDate: string;\n if (diffDays === 0) {\n formattedDate = 'Today';\n } else if (diffDays === 1) {\n formattedDate = 'Yesterday';\n } else if (diffDays < 7) {\n formattedDate = `${diffDays} days ago`;\n } else {\n formattedDate = date.toLocaleDateString();\n }\n\n const formattedTime = date.toLocaleTimeString(undefined, {\n hour: '2-digit',\n minute: '2-digit',\n });\n\n return { date: formattedDate, time: formattedTime };\n}\n\n// Known program IDs for detection\nconst KNOWN_PROGRAMS: Record<string, string> = {\n '11111111111111111111111111111111': 'System Program',\n TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA: 'Token Program',\n ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL: 'Associated Token',\n JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4: 'Jupiter',\n whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc: 'Orca Whirlpool',\n '675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8': 'Raydium AMM',\n Stake11111111111111111111111111111111111111: 'Stake Program',\n metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s: 'Metaplex',\n};\n\nconst DEFAULT_IGNORED_PROGRAM_IDS = new Set<string>([\n '11111111111111111111111111111111', // System Program\n 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA', // Token Program\n 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL', // Associated Token\n]);\n\nfunction resolveProgramName(programId: string, programLabels: Record<string, string> | undefined): string | undefined {\n return programLabels?.[programId] ?? KNOWN_PROGRAMS[programId];\n}\n\nfunction pickPrimaryProgramId(programIds: Set<string>): string | undefined {\n // Prefer the first non-trivial program (exclude System/Token/ATA).\n for (const id of programIds) {\n if (!DEFAULT_IGNORED_PROGRAM_IDS.has(id)) return id;\n }\n // Fallback to the first program ID (if any).\n return programIds.values().next().value;\n}\n\nfunction getParsedInstructionTypes(message: TransactionMessage): string[] | undefined {\n if (!Array.isArray(message.instructions)) return undefined;\n\n const types: string[] = [];\n for (const ix of message.instructions) {\n if (!ix || typeof ix !== 'object') continue;\n const parsed = (ix as Instruction).parsed;\n if (!parsed || typeof parsed !== 'object') continue;\n if (!('type' in parsed)) continue;\n const t = (parsed as { type?: unknown }).type;\n if (typeof t !== 'string') continue;\n types.push(t);\n if (types.length >= 10) break;\n }\n\n const unique = [...new Set(types)];\n return unique.length ? unique : undefined;\n}\n\n// TypeScript interfaces for RPC transaction structures\ninterface AccountKey {\n pubkey: string;\n writable?: boolean;\n signer?: boolean;\n}\n\ninterface UiTokenAmount {\n amount: string | bigint;\n decimals: number;\n uiAmount: number | null;\n uiAmountString?: string;\n}\n\ninterface TokenBalance {\n accountIndex: number;\n mint: string;\n owner?: string;\n programId?: string;\n uiTokenAmount: UiTokenAmount;\n}\n\ninterface TransactionMeta {\n err: unknown;\n fee: number | bigint;\n innerInstructions?: unknown[];\n loadedAddresses?: unknown;\n logMessages?: string[];\n postBalances: (number | bigint)[];\n postTokenBalances?: TokenBalance[];\n preBalances: (number | bigint)[];\n preTokenBalances?: TokenBalance[];\n rewards?: unknown[];\n returnData?: unknown;\n}\n\ninterface Instruction {\n programId?: string;\n programIdIndex?: number;\n accounts?: unknown[];\n data?: string;\n parsed?: unknown;\n}\n\ninterface TransactionMessage {\n accountKeys: (string | AccountKey)[];\n instructions?: Instruction[];\n recentBlockhash?: string;\n header?: {\n numReadonlySignedAccounts?: number;\n numReadonlyUnsignedAccounts?: number;\n numRequiredSignatures?: number;\n };\n}\n\ninterface RpcTransaction {\n meta: TransactionMeta | null;\n transaction: {\n message: TransactionMessage;\n signatures?: string[];\n };\n version?: 'legacy' | number;\n}\n\ninterface ParsedTokenTransfer {\n tokenMint: string;\n tokenAmount: number;\n tokenDecimals: number;\n direction: 'in' | 'out';\n type: 'sent' | 'received';\n}\n\n// Type guards\nfunction isAccountKey(value: unknown): value is AccountKey {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'pubkey' in value &&\n typeof (value as AccountKey).pubkey === 'string'\n );\n}\n\nfunction isTransactionMeta(value: unknown): value is TransactionMeta {\n if (typeof value !== 'object' || value === null || !('preBalances' in value) || !('postBalances' in value)) {\n return false;\n }\n\n const meta = value as TransactionMeta;\n if (!Array.isArray(meta.preBalances) || !Array.isArray(meta.postBalances)) {\n return false;\n }\n\n // Validate that balance arrays contain numbers or bigints\n const isValidBalance = (b: unknown): b is number | bigint => typeof b === 'number' || typeof b === 'bigint';\n\n return meta.preBalances.every(isValidBalance) && meta.postBalances.every(isValidBalance);\n}\n\nfunction isTokenBalance(value: unknown): value is TokenBalance {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'accountIndex' in value &&\n 'mint' in value &&\n 'uiTokenAmount' in value &&\n typeof (value as TokenBalance).accountIndex === 'number' &&\n typeof (value as TokenBalance).mint === 'string' &&\n typeof (value as TokenBalance).uiTokenAmount === 'object' &&\n (value as TokenBalance).uiTokenAmount !== null\n );\n}\n\nfunction isUiTokenAmount(value: unknown): value is UiTokenAmount {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'amount' in value &&\n 'decimals' in value &&\n typeof (value as UiTokenAmount).amount === 'string' &&\n typeof (value as UiTokenAmount).decimals === 'number'\n );\n}\n\nfunction isTransactionWithMeta(value: unknown): value is RpcTransaction {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'meta' in value &&\n 'transaction' in value &&\n (value as RpcTransaction).meta !== null &&\n typeof (value as RpcTransaction).transaction === 'object' &&\n (value as RpcTransaction).transaction !== null &&\n 'message' in (value as RpcTransaction).transaction\n );\n}\n\nfunction isTransactionMessage(value: unknown): value is TransactionMessage {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'accountKeys' in value &&\n Array.isArray((value as TransactionMessage).accountKeys)\n );\n}\n\nfunction coerceMaybeAddressString(value: unknown): string | undefined {\n if (typeof value === 'string') return value;\n if (value && typeof value === 'object') {\n const str = String(value);\n if (str && str !== '[object Object]') return str;\n }\n return undefined;\n}\n\n// Helper functions\nfunction getAccountKeys(message: TransactionMessage): string[] {\n if (!Array.isArray(message.accountKeys)) {\n return [];\n }\n\n return message.accountKeys\n .map(key => {\n if (typeof key === 'string') {\n return key;\n }\n if (isAccountKey(key)) {\n return key.pubkey;\n }\n return '';\n })\n .filter(Boolean);\n}\n\nfunction detectProgramIds(message: TransactionMessage, accountKeys: string[]): Set<string> {\n const programIds = new Set<string>();\n\n if (!Array.isArray(message.instructions)) {\n return programIds;\n }\n\n for (const instruction of message.instructions) {\n if (typeof instruction === 'object' && instruction !== null) {\n // Try programIdIndex first\n if (typeof instruction.programIdIndex === 'number' && accountKeys[instruction.programIdIndex]) {\n programIds.add(accountKeys[instruction.programIdIndex]);\n }\n // Fallback to programId string\n else if (typeof instruction.programId === 'string') {\n programIds.add(instruction.programId);\n }\n // Handle case where programId might be an Address object (Web3.js 2.0 kit)\n else if (instruction.programId && typeof instruction.programId === 'object') {\n const programIdStr = String(instruction.programId);\n if (programIdStr && programIdStr !== '[object Object]') {\n programIds.add(programIdStr);\n }\n }\n }\n }\n\n return programIds;\n}\n\nfunction parseSolChange(meta: TransactionMeta, walletIndex: number): { balanceChange: number; solChange: number } {\n if (!isTransactionMeta(meta) || !Array.isArray(meta.preBalances) || !Array.isArray(meta.postBalances)) {\n return { balanceChange: 0, solChange: 0 };\n }\n\n const preBalanceRaw = meta.preBalances[walletIndex];\n const postBalanceRaw = meta.postBalances[walletIndex];\n\n // Handle both number and bigint (Web3.js 2.0 returns bigint)\n const preBalance =\n typeof preBalanceRaw === 'number'\n ? preBalanceRaw\n : typeof preBalanceRaw === 'bigint'\n ? Number(preBalanceRaw)\n : 0;\n const postBalance =\n typeof postBalanceRaw === 'number'\n ? postBalanceRaw\n : typeof postBalanceRaw === 'bigint'\n ? Number(postBalanceRaw)\n : 0;\n\n const balanceChange = postBalance - preBalance;\n const solChange = balanceChange / LAMPORTS_PER_SOL;\n\n return { balanceChange, solChange };\n}\n\nfunction parseTokenTransfers(\n meta: TransactionMeta,\n accountKeys: string[],\n walletAddress: string,\n): ParsedTokenTransfer | null {\n if (!isTransactionMeta(meta)) {\n return null;\n }\n\n const preTokenBalances = Array.isArray(meta.preTokenBalances) ? meta.preTokenBalances : [];\n const postTokenBalances = Array.isArray(meta.postTokenBalances) ? meta.postTokenBalances : [];\n\n // Filter token balances for our wallet\n const ourPreTokens = preTokenBalances.filter(balance => {\n if (!isTokenBalance(balance)) return false;\n const accountKey = accountKeys[balance.accountIndex];\n const owner = coerceMaybeAddressString(balance.owner);\n return (\n (accountKey && accountKey.trim() === walletAddress.trim()) ||\n (owner && owner.trim() === walletAddress.trim())\n );\n });\n\n const ourPostTokens = postTokenBalances.filter(balance => {\n if (!isTokenBalance(balance)) return false;\n const accountKey = accountKeys[balance.accountIndex];\n const owner = coerceMaybeAddressString(balance.owner);\n return (\n (accountKey && accountKey.trim() === walletAddress.trim()) ||\n (owner && owner.trim() === walletAddress.trim())\n );\n });\n\n // Collect all unique mints\n const allMints = new Set<string>();\n for (const token of ourPreTokens) {\n if (isTokenBalance(token)) {\n allMints.add(token.mint);\n }\n }\n for (const token of ourPostTokens) {\n if (isTokenBalance(token)) {\n allMints.add(token.mint);\n }\n }\n\n // Check for token balance changes\n for (const mint of allMints) {\n const preBal = ourPreTokens.find(b => isTokenBalance(b) && b.mint === mint);\n const postBal = ourPostTokens.find(b => isTokenBalance(b) && b.mint === mint);\n\n if (!isTokenBalance(preBal) && !isTokenBalance(postBal)) {\n continue;\n }\n\n const preAmount =\n isTokenBalance(preBal) && isUiTokenAmount(preBal.uiTokenAmount) ? Number(preBal.uiTokenAmount.amount) : 0;\n const postAmount =\n isTokenBalance(postBal) && isUiTokenAmount(postBal.uiTokenAmount)\n ? Number(postBal.uiTokenAmount.amount)\n : 0;\n\n const change = postAmount - preAmount;\n\n if (change !== 0) {\n const decimals =\n isTokenBalance(postBal) && isUiTokenAmount(postBal.uiTokenAmount)\n ? postBal.uiTokenAmount.decimals\n : isTokenBalance(preBal) && isUiTokenAmount(preBal.uiTokenAmount)\n ? preBal.uiTokenAmount.decimals\n : 0;\n\n if (typeof decimals !== 'number' || decimals < 0) {\n continue;\n }\n\n return {\n tokenMint: mint,\n tokenAmount: Math.abs(change) / Math.pow(10, decimals),\n tokenDecimals: decimals,\n direction: change > 0 ? 'in' : 'out',\n type: change > 0 ? 'received' : 'sent',\n };\n }\n }\n\n // If no change detected but new token account created\n if (ourPostTokens.length > ourPreTokens.length) {\n const newToken = ourPostTokens.find(\n b => isTokenBalance(b) && !ourPreTokens.some(p => isTokenBalance(p) && p.mint === b.mint),\n );\n\n if (isTokenBalance(newToken) && isUiTokenAmount(newToken.uiTokenAmount)) {\n const decimals = newToken.uiTokenAmount.decimals;\n if (typeof decimals === 'number' && decimals >= 0) {\n const amount = Number(newToken.uiTokenAmount.amount) / Math.pow(10, decimals);\n return {\n tokenMint: newToken.mint,\n tokenAmount: amount,\n tokenDecimals: decimals,\n direction: 'in',\n type: 'received',\n };\n }\n }\n }\n\n return null;\n}\n\ninterface ParsedTokenAccountClosure {\n tokenMint: string;\n}\n\nfunction parseTokenAccountClosure(\n meta: TransactionMeta,\n accountKeys: string[],\n walletAddress: string,\n): ParsedTokenAccountClosure | null {\n if (!isTransactionMeta(meta)) {\n return null;\n }\n\n const preTokenBalances = Array.isArray(meta.preTokenBalances) ? meta.preTokenBalances : [];\n const postTokenBalances = Array.isArray(meta.postTokenBalances) ? meta.postTokenBalances : [];\n\n const ourPreTokens = preTokenBalances.filter(balance => {\n if (!isTokenBalance(balance)) return false;\n const accountKey = accountKeys[balance.accountIndex];\n const owner = coerceMaybeAddressString(balance.owner);\n return (\n (accountKey && accountKey.trim() === walletAddress.trim()) ||\n (owner && owner.trim() === walletAddress.trim())\n );\n });\n\n const ourPostTokens = postTokenBalances.filter(balance => {\n if (!isTokenBalance(balance)) return false;\n const accountKey = accountKeys[balance.accountIndex];\n const owner = coerceMaybeAddressString(balance.owner);\n return (\n (accountKey && accountKey.trim() === walletAddress.trim()) ||\n (owner && owner.trim() === walletAddress.trim())\n );\n });\n\n const postKeys = new Set<string>();\n for (const token of ourPostTokens) {\n if (!isTokenBalance(token)) continue;\n postKeys.add(`${token.accountIndex}:${token.mint}`);\n }\n\n for (const token of ourPreTokens) {\n if (!isTokenBalance(token)) continue;\n const key = `${token.accountIndex}:${token.mint}`;\n if (!postKeys.has(key)) {\n return { tokenMint: token.mint };\n }\n }\n\n return null;\n}\n\ninterface ParsedSwapTokens {\n fromToken?: { mint: string };\n toToken?: { mint: string };\n}\n\nfunction parseSwapTokens(\n meta: TransactionMeta,\n accountKeys: string[],\n walletAddress: string,\n solChange: number,\n): ParsedSwapTokens {\n if (!isTransactionMeta(meta)) {\n return {};\n }\n\n const preTokenBalances = Array.isArray(meta.preTokenBalances) ? meta.preTokenBalances : [];\n const postTokenBalances = Array.isArray(meta.postTokenBalances) ? meta.postTokenBalances : [];\n\n // Filter token balances for our wallet\n const ourPreTokens = preTokenBalances.filter(balance => {\n if (!isTokenBalance(balance)) return false;\n const accountKey = accountKeys[balance.accountIndex];\n const owner = coerceMaybeAddressString(balance.owner);\n return (\n (accountKey && accountKey.trim() === walletAddress.trim()) ||\n (owner && owner.trim() === walletAddress.trim())\n );\n });\n\n const ourPostTokens = postTokenBalances.filter(balance => {\n if (!isTokenBalance(balance)) return false;\n const accountKey = accountKeys[balance.accountIndex];\n const owner = coerceMaybeAddressString(balance.owner);\n return (\n (accountKey && accountKey.trim() === walletAddress.trim()) ||\n (owner && owner.trim() === walletAddress.trim())\n );\n });\n\n // Collect all unique mints\n const allMints = new Set<string>();\n for (const token of ourPreTokens) {\n if (isTokenBalance(token)) {\n allMints.add(token.mint);\n }\n }\n for (const token of ourPostTokens) {\n if (isTokenBalance(token)) {\n allMints.add(token.mint);\n }\n }\n\n // Find tokens that decreased (from) and increased (to)\n let fromToken: { mint: string } | undefined;\n let toToken: { mint: string } | undefined;\n\n for (const mint of allMints) {\n const preBal = ourPreTokens.find(b => isTokenBalance(b) && b.mint === mint);\n const postBal = ourPostTokens.find(b => isTokenBalance(b) && b.mint === mint);\n\n const preAmount =\n isTokenBalance(preBal) && isUiTokenAmount(preBal.uiTokenAmount) ? Number(preBal.uiTokenAmount.amount) : 0;\n const postAmount =\n isTokenBalance(postBal) && isUiTokenAmount(postBal.uiTokenAmount)\n ? Number(postBal.uiTokenAmount.amount)\n : 0;\n\n const change = postAmount - preAmount;\n\n if (change < 0 && !fromToken) {\n // Token decreased - this is the \"from\" token\n fromToken = { mint };\n } else if (change > 0 && !toToken) {\n // Token increased - this is the \"to\" token\n toToken = { mint };\n }\n }\n\n // Handle SOL as from/to token (wrapped SOL mint)\n const WRAPPED_SOL_MINT = 'So11111111111111111111111111111111111111112';\n if (solChange < -0.001 && !fromToken) {\n // SOL decreased significantly (more than just fees)\n fromToken = { mint: WRAPPED_SOL_MINT };\n } else if (solChange > 0.001 && !toToken) {\n // SOL increased\n toToken = { mint: WRAPPED_SOL_MINT };\n }\n\n return { fromToken, toToken };\n}\n\nfunction formatAmount(\n tokenAmount: number | undefined,\n tokenDecimals: number | undefined,\n direction: 'in' | 'out' | undefined,\n solChange: number,\n): string | undefined {\n if (tokenAmount !== undefined && tokenDecimals !== undefined && direction !== undefined) {\n const sign = direction === 'in' ? '+' : '-';\n const maxDecimals = Math.min(tokenDecimals, 6);\n return `${sign}${tokenAmount.toLocaleString(undefined, { maximumFractionDigits: maxDecimals })}`;\n }\n\n if (solChange !== 0) {\n return `${solChange > 0 ? '+' : ''}${solChange.toFixed(4)} SOL`;\n }\n\n return undefined;\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (!signal?.aborted) return;\n throw new DOMException('Query aborted', 'AbortError');\n}\n\n/**\n * Clamp an integer to a safe range.\n */\nfunction clampInt(value: number, min: number, max: number): number {\n if (!Number.isFinite(value)) return min;\n return Math.min(max, Math.max(min, Math.floor(value)));\n}\n\n/**\n * Run async work over a list with bounded concurrency.\n * Preserves input order.\n */\nasync function mapWithConcurrency<TIn, TOut>(\n inputs: readonly TIn[],\n worker: (input: TIn, index: number) => Promise<TOut>,\n options: { concurrency: number; signal?: AbortSignal },\n): Promise<TOut[]> {\n const concurrency = clampInt(options.concurrency, 1, 32);\n const results = new Array<TOut>(inputs.length);\n let nextIndex = 0;\n\n async function run(): Promise<void> {\n while (true) {\n throwIfAborted(options.signal);\n const index = nextIndex;\n nextIndex += 1;\n if (index >= inputs.length) return;\n results[index] = await worker(inputs[index], index);\n }\n }\n\n const runners = Array.from({ length: Math.min(concurrency, inputs.length) }, () => run());\n await Promise.all(runners);\n return results;\n}\n\n/**\n * Fetch token metadata for transaction display (shared token-list cache).\n */\nasync function fetchTransactionTokenMetadata(\n mints: string[],\n options: { signal?: AbortSignal; cluster?: ClusterType } = {},\n): Promise<Map<string, { symbol: string; icon: string }>> {\n const results = new Map<string, { symbol: string; icon: string }>();\n if (!mints.length) return results;\n\n const tokenList = await fetchSolanaTokenListMetadata(mints, {\n timeoutMs: 5000,\n signal: options.signal,\n cluster: options.cluster,\n });\n\n for (const [mint, meta] of tokenList) {\n results.set(mint, { symbol: meta.symbol, icon: meta.logoURI });\n }\n\n return results;\n}\n\n/**\n * Hook for fetching wallet transaction history.\n * Parses transactions to detect type (sent/received/swap) and amounts.\n *\n * @example Basic usage\n * ```tsx\n * function TransactionList() {\n * const { transactions, isLoading } = useTransactions({ limit: 10 });\n *\n * if (isLoading) return <div>Loading...</div>;\n *\n * return (\n * <div>\n * {transactions.map(tx => (\n * <div key={tx.signature}>\n * {tx.type} {tx.formattedAmount} - {tx.formattedDate}\n * </div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useTransactions(options: UseTransactionsOptions = {}): UseTransactionsReturn {\n const {\n enabled = true,\n limit = 10,\n autoRefresh = false,\n refreshInterval = 60000,\n fetchDetails = true,\n detailsConcurrency = 6,\n staleTimeMs = 0,\n cacheTimeMs = 5 * 60 * 1000, // 5 minutes\n refetchOnMount = 'stale',\n client: clientOverride,\n } = options;\n\n const { address, connected } = useAccount();\n const { cluster } = useCluster();\n const { client: providerClient } = useSolanaClient();\n const connectorClient = useConnectorClient();\n\n // Pagination state (local, not shared)\n const [paginatedTransactions, setPaginatedTransactions] = useState<TransactionInfo[]>([]);\n const [isPaginationLoading, setIsPaginationLoading] = useState(false);\n const [hasMore, setHasMore] = useState(true);\n const beforeSignatureRef = useRef<string | undefined>(undefined);\n\n // Use override client if provided, otherwise use provider client\n const rpcClient = clientOverride ?? providerClient;\n\n // Get imageProxy from connector config\n const connectorConfig = connectorClient?.getConfig();\n const imageProxy = connectorConfig?.imageProxy;\n const programLabels = connectorConfig?.programLabels;\n\n const parseTransaction = useCallback(\n (\n tx: unknown,\n walletAddress: string,\n sig: string,\n blockTime: number | null,\n slot: number,\n err: unknown,\n explorerUrl: string,\n ): TransactionInfo => {\n const { date, time } = formatDate(blockTime);\n\n const baseInfo: TransactionInfo = {\n signature: sig,\n blockTime,\n slot,\n status: err ? 'failed' : 'success',\n error: err\n ? JSON.stringify(err, (_key, value) => (typeof value === 'bigint' ? value.toString() : value))\n : undefined,\n type: 'unknown',\n formattedDate: date,\n formattedTime: time,\n explorerUrl,\n };\n\n // Early return if transaction structure is invalid\n if (!isTransactionWithMeta(tx)) {\n return baseInfo;\n }\n\n try {\n const { meta, transaction } = tx;\n\n // Type guard ensures meta is not null, but double-check for safety\n if (!isTransactionMeta(meta)) {\n return baseInfo;\n }\n\n const { message } = transaction;\n\n // Early return if message structure is invalid\n if (!isTransactionMessage(message)) {\n return baseInfo;\n }\n\n // Get account keys using helper\n const accountKeys = getAccountKeys(message);\n\n // Find wallet index\n const walletIndex = accountKeys.findIndex(key => key.trim() === walletAddress.trim());\n\n if (walletIndex === -1) {\n return baseInfo;\n }\n\n // Calculate SOL balance change using helper\n const { balanceChange, solChange } = parseSolChange(meta, walletIndex);\n\n // Detect program IDs using helper\n const programIds = detectProgramIds(message, accountKeys);\n\n // Check for known programs\n const hasJupiter = programIds.has('JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4');\n const hasOrca = programIds.has('whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc');\n const hasRaydium = programIds.has('675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8');\n const hasStake = programIds.has('Stake11111111111111111111111111111111111111');\n const hasMetaplex = programIds.has('metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s');\n const hasSystemProgram = programIds.has('11111111111111111111111111111111');\n const hasTokenProgram = programIds.has('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA');\n\n // Precompute token program derived signals (used for transfers and closures)\n const tokenTransfer = hasTokenProgram ? parseTokenTransfers(meta, accountKeys, walletAddress) : null;\n const tokenAccountClosure = hasTokenProgram\n ? parseTokenAccountClosure(meta, accountKeys, walletAddress)\n : null;\n\n // Infer swap tokens from balance deltas (works even when program IDs are unknown)\n const inferredSwapTokens = parseSwapTokens(meta, accountKeys, walletAddress, solChange);\n const inferredSwapFromMint = inferredSwapTokens.fromToken?.mint;\n const inferredSwapToMint = inferredSwapTokens.toToken?.mint;\n const hasNonTrivialProgram = [...programIds].some(id => !DEFAULT_IGNORED_PROGRAM_IDS.has(id));\n const hasInferredSwap =\n Boolean(inferredSwapFromMint && inferredSwapToMint) &&\n inferredSwapFromMint !== inferredSwapToMint &&\n hasNonTrivialProgram &&\n !tokenAccountClosure;\n\n const programId = pickPrimaryProgramId(programIds);\n const programName = programId ? resolveProgramName(programId, programLabels) : undefined;\n const programIdsArray = [...programIds];\n const instructionTypes = getParsedInstructionTypes(message);\n const instructionCount = Array.isArray(message.instructions) ? message.instructions.length : undefined;\n\n // Determine transaction type\n let type: TransactionInfo['type'] = 'unknown';\n let direction: 'in' | 'out' | undefined;\n let counterparty: string | undefined;\n let tokenMint: string | undefined;\n let tokenAmount: number | undefined;\n let tokenDecimals: number | undefined;\n let swapFromToken: TransactionInfo['swapFromToken'];\n let swapToToken: TransactionInfo['swapToToken'];\n\n if (hasJupiter || hasOrca || hasRaydium) {\n type = 'swap';\n // Parse swap tokens\n if (inferredSwapTokens.fromToken) swapFromToken = { mint: inferredSwapTokens.fromToken.mint };\n if (inferredSwapTokens.toToken) swapToToken = { mint: inferredSwapTokens.toToken.mint };\n } else if (hasStake) {\n type = 'stake';\n } else if (hasMetaplex) {\n type = 'nft';\n } else if (hasInferredSwap) {\n type = 'swap';\n swapFromToken = { mint: inferredSwapFromMint! };\n swapToToken = { mint: inferredSwapToMint! };\n } else if (tokenTransfer) {\n type = tokenTransfer.type;\n direction = tokenTransfer.direction;\n tokenMint = tokenTransfer.tokenMint;\n tokenAmount = tokenTransfer.tokenAmount;\n tokenDecimals = tokenTransfer.tokenDecimals;\n } else if (tokenAccountClosure) {\n type = 'tokenAccountClosed';\n tokenMint = tokenAccountClosure.tokenMint;\n direction = solChange > 0 ? 'in' : undefined;\n } else if (hasSystemProgram && Math.abs(balanceChange) > 0) {\n // Simple SOL transfer\n type = balanceChange > 0 ? 'received' : 'sent';\n direction = balanceChange > 0 ? 'in' : 'out';\n // SOL is native, use wrapped SOL mint for icon\n tokenMint = 'So11111111111111111111111111111111111111112';\n\n // Try to find counterparty\n if (accountKeys.length >= 2) {\n counterparty = accountKeys.find(\n (key, idx) => idx !== walletIndex && key !== '11111111111111111111111111111111',\n );\n }\n } else if (programIds.size > 0) {\n type = 'program';\n }\n\n // Format amount string using helper\n const formattedAmount = formatAmount(tokenAmount, tokenDecimals, direction, solChange);\n\n return {\n ...baseInfo,\n type,\n direction,\n amount: tokenAmount ?? Math.abs(solChange),\n formattedAmount,\n tokenMint,\n counterparty: counterparty ? `${counterparty.slice(0, 4)}...${counterparty.slice(-4)}` : undefined,\n swapFromToken,\n swapToToken,\n programId,\n programName,\n programIds: programIdsArray.length ? programIdsArray : undefined,\n instructionTypes,\n instructionCount,\n };\n } catch (parseError) {\n console.warn('Failed to parse transaction:', parseError);\n return baseInfo;\n }\n },\n [programLabels],\n );\n\n // Generate cache key based on RPC URL, address, cluster, and options\n const key = useMemo(() => {\n if (!enabled || !connected || !address || !rpcClient || !cluster) return null;\n const rpcUrl =\n rpcClient.urlOrMoniker instanceof URL ? rpcClient.urlOrMoniker.toString() : String(rpcClient.urlOrMoniker);\n return getTransactionsQueryKey({ rpcUrl, address, clusterId: cluster.id, limit, fetchDetails });\n }, [enabled, connected, address, rpcClient, cluster, limit, fetchDetails]);\n\n // Reset pagination immediately when the query key changes.\n // This prevents \"old paginated transactions\" flashing while the new key loads.\n useEffect(() => {\n beforeSignatureRef.current = undefined;\n setPaginatedTransactions([]);\n setIsPaginationLoading(false);\n setHasMore(true);\n }, [key]);\n\n // Helper to fetch and enrich transactions\n const fetchAndEnrichTransactions = useCallback(\n async (\n beforeSignature: string | undefined,\n currentCluster: SolanaCluster,\n signal?: AbortSignal,\n ): Promise<{ transactions: TransactionInfo[]; hasMore: boolean }> => {\n if (!rpcClient || !address) {\n return { transactions: [], hasMore: false };\n }\n\n throwIfAborted(signal);\n\n const rpc = rpcClient.rpc;\n const walletAddress = toAddress(address);\n\n const signaturesResult = await rpc\n .getSignaturesForAddress(walletAddress, {\n limit,\n ...(beforeSignature ? { before: toSignature(beforeSignature) } : {}),\n })\n .send();\n\n throwIfAborted(signal);\n\n let newTransactions: TransactionInfo[];\n\n if (fetchDetails && signaturesResult.length > 0) {\n // Fetch full transaction details with bounded concurrency (prevents RPC throttling).\n const txDetails = await mapWithConcurrency(\n signaturesResult,\n async sig =>\n rpc\n .getTransaction(toSignature(String(sig.signature)), {\n encoding: 'jsonParsed',\n maxSupportedTransactionVersion: 0,\n })\n .send()\n .catch(() => null),\n { concurrency: detailsConcurrency, signal },\n );\n\n throwIfAborted(signal);\n\n newTransactions = signaturesResult.map((sig, idx) => {\n const blockTimeNum = sig.blockTime ? Number(sig.blockTime) : null;\n const tx = txDetails[idx];\n\n return parseTransaction(\n tx,\n address,\n String(sig.signature),\n blockTimeNum,\n Number(sig.slot),\n sig.err,\n getTransactionUrl(String(sig.signature), currentCluster),\n );\n });\n } else {\n // Basic info only\n newTransactions = signaturesResult.map(sig => {\n const blockTimeNum = sig.blockTime ? Number(sig.blockTime) : null;\n const { date, time } = formatDate(blockTimeNum);\n\n return {\n signature: String(sig.signature),\n blockTime: blockTimeNum,\n slot: Number(sig.slot),\n status: sig.err ? ('failed' as const) : ('success' as const),\n error: sig.err ? JSON.stringify(sig.err) : undefined,\n type: 'unknown' as const,\n formattedDate: date,\n formattedTime: time,\n explorerUrl: getTransactionUrl(String(sig.signature), currentCluster),\n };\n });\n }\n\n // Fetch token metadata for transactions that have token mints\n const mintsToFetch = [\n ...new Set([\n ...newTransactions.filter(tx => tx.tokenMint).map(tx => tx.tokenMint!),\n ...newTransactions.filter(tx => tx.swapFromToken?.mint).map(tx => tx.swapFromToken!.mint),\n ...newTransactions.filter(tx => tx.swapToToken?.mint).map(tx => tx.swapToToken!.mint),\n ]),\n ];\n\n if (mintsToFetch.length > 0) {\n throwIfAborted(signal);\n\n const tokenMetadata = await fetchTransactionTokenMetadata(mintsToFetch, {\n signal,\n cluster: getClusterType(currentCluster),\n });\n\n if (tokenMetadata.size > 0) {\n newTransactions = newTransactions.map(tx => {\n let enrichedTx = { ...tx };\n\n if (tx.tokenMint && tokenMetadata.has(tx.tokenMint)) {\n const meta = tokenMetadata.get(tx.tokenMint)!;\n enrichedTx = {\n ...enrichedTx,\n tokenSymbol: meta.symbol,\n tokenIcon: transformImageUrl(meta.icon, imageProxy),\n formattedAmount: tx.formattedAmount\n ? `${tx.formattedAmount} ${meta.symbol}`\n : tx.formattedAmount,\n };\n }\n\n if (tx.swapFromToken?.mint && tokenMetadata.has(tx.swapFromToken.mint)) {\n const meta = tokenMetadata.get(tx.swapFromToken.mint)!;\n enrichedTx = {\n ...enrichedTx,\n swapFromToken: {\n ...tx.swapFromToken,\n symbol: meta.symbol,\n icon: transformImageUrl(meta.icon, imageProxy),\n },\n };\n }\n\n if (tx.swapToToken?.mint && tokenMetadata.has(tx.swapToToken.mint)) {\n const meta = tokenMetadata.get(tx.swapToToken.mint)!;\n enrichedTx = {\n ...enrichedTx,\n swapToToken: {\n ...tx.swapToToken,\n symbol: meta.symbol,\n icon: transformImageUrl(meta.icon, imageProxy),\n },\n };\n }\n\n return enrichedTx;\n });\n }\n }\n\n return {\n transactions: newTransactions,\n hasMore: newTransactions.length === limit,\n };\n },\n [rpcClient, address, limit, fetchDetails, detailsConcurrency, parseTransaction, imageProxy],\n );\n\n // Query function for initial page (deduped via useSharedQuery)\n const queryFn = useCallback(\n async (signal: AbortSignal): Promise<TransactionInfo[]> => {\n if (!connected || !address || !rpcClient || !cluster) {\n return [];\n }\n\n // Throw on abort - fetchSharedQuery will preserve previous data\n throwIfAborted(signal);\n\n const result = await fetchAndEnrichTransactions(undefined, cluster, signal);\n\n // Re-check abort after awaited work (prevents publishing results after abort)\n throwIfAborted(signal);\n\n return result.transactions;\n },\n [connected, address, rpcClient, cluster, fetchAndEnrichTransactions],\n );\n\n // Use shared query for initial fetch (deduped across components)\n const {\n data: initialTransactions,\n error,\n isFetching: isInitialLoading,\n updatedAt,\n refetch: sharedRefetch,\n abort,\n } = useSharedQuery<TransactionInfo[]>(key, queryFn, {\n enabled,\n staleTimeMs,\n cacheTimeMs,\n refetchOnMount,\n refetchIntervalMs: autoRefresh ? refreshInterval : false,\n });\n\n // When the initial page changes (refetch/key change), update cursor + hasMore,\n // and drop any prior pagination results (keeps list consistent).\n useEffect(() => {\n if (!initialTransactions) return;\n\n beforeSignatureRef.current = initialTransactions.length\n ? initialTransactions[initialTransactions.length - 1].signature\n : undefined;\n\n setHasMore(initialTransactions.length === limit);\n setPaginatedTransactions(prev => (prev.length ? [] : prev));\n }, [initialTransactions, limit]);\n\n // Load more transactions (pagination - local only)\n const loadMoreFn = useCallback(async () => {\n if (!hasMore || isPaginationLoading || !cluster) return;\n\n setIsPaginationLoading(true);\n try {\n const result = await fetchAndEnrichTransactions(beforeSignatureRef.current, cluster);\n\n if (result.transactions.length > 0) {\n beforeSignatureRef.current = result.transactions[result.transactions.length - 1].signature;\n setPaginatedTransactions(prev => [...prev, ...result.transactions]);\n }\n setHasMore(result.hasMore);\n } catch (err) {\n console.error('Failed to load more transactions:', err);\n } finally {\n setIsPaginationLoading(false);\n }\n }, [hasMore, isPaginationLoading, cluster, fetchAndEnrichTransactions]);\n\n // Wrap refetch to reset pagination\n const refetch = useCallback(\n async (opts?: { signal?: AbortSignal }) => {\n beforeSignatureRef.current = undefined;\n setPaginatedTransactions([]);\n setHasMore(true);\n await sharedRefetch(opts);\n },\n [sharedRefetch],\n );\n\n // Combine initial transactions with paginated ones\n const transactions = useMemo(() => {\n const initial = initialTransactions ?? [];\n return [...initial, ...paginatedTransactions];\n }, [initialTransactions, paginatedTransactions]);\n\n // Combined loading state\n const isLoading = isInitialLoading || isPaginationLoading;\n\n // Preserve old behavior: don't surface \"refresh failed\" errors if we already have data\n const visibleError = updatedAt ? null : error;\n\n return useMemo(\n () => ({\n transactions,\n isLoading,\n error: visibleError,\n hasMore,\n loadMore: loadMoreFn,\n refetch,\n abort,\n lastUpdated: updatedAt ? new Date(updatedAt) : null,\n }),\n [transactions, isLoading, visibleError, hasMore, loadMoreFn, refetch, abort, updatedAt],\n );\n}\n","'use client';\n\nimport { useCallback, useMemo, useEffect, useRef, useState } from 'react';\nimport { useAccount } from './use-account';\nimport { useCluster } from './use-cluster';\nimport { useConnectorClient } from '../ui/connector-provider';\nimport { createTimeoutSignal } from '../utils/abort';\nimport { transformImageUrl } from '../utils/image';\nimport { formatBigIntBalance, formatBigIntUsd } from '../utils/formatting';\nimport {\n useWalletAssets,\n getWalletAssetsQueryKey,\n NATIVE_SOL_MINT,\n type WalletAssetsData,\n type TokenAccountInfo,\n} from './_internal/use-wallet-assets';\nimport { fetchSolanaTokenListMetadata } from './_internal/solana-token-list';\nimport type { CoinGeckoConfig } from '../types/connector';\nimport type { SolanaClient } from '../lib/kit';\nimport type { ClusterType } from '../utils/cluster';\n\n/**\n * Generate the query key for tokens data.\n * Use this to invalidate the tokens cache externally.\n *\n * Note: Balance and tokens share the same underlying cache (wallet-assets).\n *\n * @param rpcUrl - The RPC URL being used\n * @param address - The wallet address\n * @returns The query key string, or null if params are invalid\n *\n * @example\n * ```tsx\n * // Invalidate tokens after receiving new tokens\n * const key = getTokensQueryKey(rpcUrl, address);\n * if (key) invalidateSharedQuery(key);\n * ```\n */\nexport function getTokensQueryKey(rpcUrl: string | null, address: string | null): string | null {\n return getWalletAssetsQueryKey(rpcUrl, address);\n}\n\nexport interface Token {\n /** Token mint address */\n mint: string;\n /** Token account address */\n tokenAccount: string;\n /** Token balance (in smallest unit) */\n amount: bigint;\n /** Token decimals */\n decimals: number;\n /** Formatted balance (human readable) */\n formatted: string;\n /** Token symbol if known */\n symbol?: string;\n /** Token name if known */\n name?: string;\n /** Token logo URL if known */\n logo?: string;\n /** USD price if available */\n usdPrice?: number;\n /** Formatted USD value */\n formattedUsd?: string;\n /** Whether token is frozen */\n isFrozen: boolean;\n /** Owner address */\n owner: string;\n /** Which token program (token or token-2022) */\n programId?: 'token' | 'token-2022';\n}\n\nexport interface UseTokensOptions {\n /** Whether the hook is enabled (default: true) */\n enabled?: boolean;\n /** Whether to include zero balance tokens */\n includeZeroBalance?: boolean;\n /** Whether to auto-refresh */\n autoRefresh?: boolean;\n /** Refresh interval in milliseconds */\n refreshInterval?: number;\n /** Fetch metadata (name, symbol, logo) and USD prices */\n fetchMetadata?: boolean;\n /** Include native SOL balance */\n includeNativeSol?: boolean;\n /** Time in ms to consider data fresh (default: 0) */\n staleTimeMs?: number;\n /** Time in ms to keep cache after unmount (default: 300000) */\n cacheTimeMs?: number;\n /** Whether to refetch on mount (default: 'stale') */\n refetchOnMount?: boolean | 'stale';\n /** Override the Solana client from provider */\n client?: SolanaClient | null;\n}\n\nexport interface UseTokensReturn {\n /** List of tokens */\n tokens: Token[];\n /** Whether tokens are loading */\n isLoading: boolean;\n /** Error if fetch failed */\n error: Error | null;\n /** Refetch tokens, optionally with an abort signal */\n refetch: (options?: { signal?: AbortSignal }) => Promise<void>;\n /** Abort any in-flight token fetch */\n abort: () => void;\n /** Last updated timestamp */\n lastUpdated: Date | null;\n /** Total number of token accounts */\n totalAccounts: number;\n}\n\n// Combined token metadata (Solana Token List + CoinGecko price)\ninterface TokenMetadata {\n address: string;\n name: string;\n symbol: string;\n decimals: number;\n logoURI: string;\n coingeckoId?: string;\n usdPrice?: number;\n}\n\n// Cache configuration\nconst CACHE_MAX_SIZE = 500;\nconst PRICE_CACHE_TTL = 60000; // 60 seconds\nconst STALE_CLEANUP_INTERVAL = 120000; // 2 minutes\n\n/**\n * CoinGecko API defaults\n */\nconst COINGECKO_DEFAULT_MAX_RETRIES = 3;\nconst COINGECKO_DEFAULT_BASE_DELAY = 1000;\nconst COINGECKO_DEFAULT_MAX_TIMEOUT = 30000;\nconst COINGECKO_API_BASE_URL = 'https://api.coingecko.com/api/v3';\n\n/**\n * LRU Cache with optional TTL support.\n */\nclass LRUCache<K, V> {\n private cache = new Map<K, V>();\n private readonly maxSize: number;\n private readonly getTtl?: (value: V) => number | undefined;\n private readonly getTimestamp?: (value: V) => number | undefined;\n\n constructor(\n maxSize: number,\n options?: {\n getTtl?: (value: V) => number | undefined;\n getTimestamp?: (value: V) => number | undefined;\n },\n ) {\n this.maxSize = maxSize;\n this.getTtl = options?.getTtl;\n this.getTimestamp = options?.getTimestamp;\n }\n\n get(key: K): V | undefined {\n const value = this.cache.get(key);\n if (value === undefined) return undefined;\n\n if (this.getTtl && this.getTimestamp) {\n const ttl = this.getTtl(value);\n const timestamp = this.getTimestamp(value);\n if (ttl !== undefined && timestamp !== undefined) {\n if (Date.now() - timestamp >= ttl) {\n this.cache.delete(key);\n return undefined;\n }\n }\n }\n\n this.cache.delete(key);\n this.cache.set(key, value);\n return value;\n }\n\n set(key: K, value: V): void {\n if (this.cache.has(key)) {\n this.cache.delete(key);\n }\n\n if (this.cache.size >= this.maxSize) {\n const oldestKey = this.cache.keys().next().value;\n if (oldestKey !== undefined) {\n this.cache.delete(oldestKey);\n }\n }\n\n this.cache.set(key, value);\n }\n\n has(key: K): boolean {\n return this.cache.has(key);\n }\n\n delete(key: K): boolean {\n return this.cache.delete(key);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n get size(): number {\n return this.cache.size;\n }\n\n pruneStale(): number {\n if (!this.getTtl || !this.getTimestamp) return 0;\n\n const now = Date.now();\n let pruned = 0;\n\n for (const [key, value] of this.cache) {\n const ttl = this.getTtl(value);\n const timestamp = this.getTimestamp(value);\n if (ttl !== undefined && timestamp !== undefined) {\n if (now - timestamp >= ttl) {\n this.cache.delete(key);\n pruned++;\n }\n }\n }\n\n return pruned;\n }\n}\n\n// Cache for metadata (LRU, no TTL - metadata rarely changes)\nconst metadataCache = new LRUCache<string, TokenMetadata>(CACHE_MAX_SIZE);\n\n// Price cache with TTL (LRU + TTL - prices change frequently)\nconst priceCache = new LRUCache<string, { price: number; timestamp: number }>(CACHE_MAX_SIZE, {\n getTtl: () => PRICE_CACHE_TTL,\n getTimestamp: entry => entry.timestamp,\n});\n\n// Periodic stale entry cleanup for price cache\nlet cleanupIntervalId: ReturnType<typeof setInterval> | null = null;\nlet cleanupRefCount = 0;\n\nfunction startCacheCleanup(): void {\n cleanupRefCount++;\n if (cleanupIntervalId === null) {\n cleanupIntervalId = setInterval(() => {\n priceCache.pruneStale();\n }, STALE_CLEANUP_INTERVAL);\n }\n}\n\nfunction stopCacheCleanup(): void {\n cleanupRefCount = Math.max(0, cleanupRefCount - 1);\n if (cleanupRefCount === 0 && cleanupIntervalId !== null) {\n clearInterval(cleanupIntervalId);\n cleanupIntervalId = null;\n }\n}\n\n/**\n * Clear all token caches. Called on disconnect/session end.\n */\nexport function clearTokenCaches(): void {\n metadataCache.clear();\n priceCache.clear();\n}\n\n/**\n * Calculate exponential backoff delay with jitter.\n */\nfunction calculateBackoffDelay(attempt: number, baseDelay: number, retryAfter?: number): number {\n if (retryAfter !== undefined && retryAfter > 0) {\n const jitter = Math.random() * 500;\n return retryAfter * 1000 + jitter;\n }\n\n const exponentialDelay = baseDelay * Math.pow(2, attempt);\n const jitter = Math.random() * 500;\n return exponentialDelay + jitter;\n}\n\n/**\n * Parse Retry-After header value.\n */\nfunction parseRetryAfter(retryAfterHeader: string | null): number | undefined {\n if (!retryAfterHeader) return undefined;\n\n const seconds = parseInt(retryAfterHeader, 10);\n if (!isNaN(seconds) && seconds >= 0) {\n return seconds;\n }\n\n const date = Date.parse(retryAfterHeader);\n if (!isNaN(date)) {\n const waitMs = date - Date.now();\n return waitMs > 0 ? Math.ceil(waitMs / 1000) : 0;\n }\n\n return undefined;\n}\n\n/**\n * Fetch prices from CoinGecko API with rate limit handling.\n */\nasync function fetchCoinGeckoPrices(coingeckoIds: string[], config?: CoinGeckoConfig): Promise<Map<string, number>> {\n const results = new Map<string, number>();\n\n if (coingeckoIds.length === 0) return results;\n\n const now = Date.now();\n const uncachedIds: string[] = [];\n\n for (const id of coingeckoIds) {\n const cached = priceCache.get(id);\n if (cached && now - cached.timestamp < PRICE_CACHE_TTL) {\n results.set(id, cached.price);\n } else {\n uncachedIds.push(id);\n }\n }\n\n if (uncachedIds.length === 0) return results;\n\n const maxRetries = config?.maxRetries ?? COINGECKO_DEFAULT_MAX_RETRIES;\n const baseDelay = config?.baseDelay ?? COINGECKO_DEFAULT_BASE_DELAY;\n const maxTimeout = config?.maxTimeout ?? COINGECKO_DEFAULT_MAX_TIMEOUT;\n const apiKey = config?.apiKey;\n const isPro = config?.isPro ?? false;\n\n const url = `${COINGECKO_API_BASE_URL}/simple/price?ids=${uncachedIds.join(',')}&vs_currencies=usd`;\n\n const headers: HeadersInit = {};\n if (apiKey) {\n headers[isPro ? 'x-cg-pro-api-key' : 'x-cg-demo-api-key'] = apiKey;\n }\n\n const startTime = Date.now();\n let attempt = 0;\n let lastError: Error | null = null;\n\n while (attempt <= maxRetries) {\n const elapsedTime = Date.now() - startTime;\n if (elapsedTime >= maxTimeout) {\n console.warn(\n `[useTokens] CoinGecko API: Total timeout (${maxTimeout}ms) exceeded after ${attempt} attempts.`,\n );\n break;\n }\n\n const remainingTimeout = maxTimeout - elapsedTime;\n const requestTimeout = Math.min(10000, remainingTimeout);\n const { signal, cleanup } = createTimeoutSignal(requestTimeout);\n\n try {\n const response = await fetch(url, { headers, signal });\n cleanup();\n\n if (response.status === 429) {\n const retryAfter = parseRetryAfter(response.headers.get('Retry-After'));\n const delay = calculateBackoffDelay(attempt, baseDelay, retryAfter);\n\n console.warn(`[useTokens] CoinGecko API rate limited (429). Waiting ${Math.round(delay)}ms.`);\n\n if (Date.now() - startTime + delay >= maxTimeout) {\n break;\n }\n\n await new Promise(resolve => setTimeout(resolve, delay));\n attempt++;\n continue;\n }\n\n if (!response.ok) {\n throw new Error(`CoinGecko API error: ${response.status} ${response.statusText}`);\n }\n\n const data: Record<string, { usd: number }> = await response.json();\n const fetchTime = Date.now();\n\n for (const [id, priceData] of Object.entries(data)) {\n if (priceData?.usd !== undefined) {\n results.set(id, priceData.usd);\n priceCache.set(id, { price: priceData.usd, timestamp: fetchTime });\n }\n }\n\n return results;\n } catch (error) {\n cleanup();\n lastError = error as Error;\n\n if (attempt < maxRetries) {\n const delay = calculateBackoffDelay(attempt, baseDelay);\n if (Date.now() - startTime + delay < maxTimeout) {\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n attempt++;\n }\n }\n\n if (attempt > maxRetries && lastError) {\n console.warn(`[useTokens] CoinGecko API: All attempts failed. Last error: ${lastError.message}`);\n }\n\n return results;\n}\n\n/**\n * Fetch token metadata from Solana Token List API and prices from CoinGecko.\n */\nasync function fetchTokenMetadataHybrid(\n mints: string[],\n coingeckoConfig?: CoinGeckoConfig,\n options?: { onUpdate?: () => void; cluster?: ClusterType },\n): Promise<boolean> {\n if (mints.length === 0) return false;\n\n const now = Date.now();\n\n const mintsNeedingTokenList: string[] = [];\n const staleCoingeckoIdToMint = new Map<string, string>();\n\n for (const mint of mints) {\n const cached = metadataCache.get(mint);\n if (!cached) {\n mintsNeedingTokenList.push(mint);\n continue;\n }\n\n if (!cached.coingeckoId) continue;\n\n const priceEntry = priceCache.get(cached.coingeckoId);\n const isFresh = Boolean(priceEntry && now - priceEntry.timestamp < PRICE_CACHE_TTL);\n if (!isFresh) {\n staleCoingeckoIdToMint.set(cached.coingeckoId, mint);\n }\n }\n\n let didUpdate = false;\n\n // 1. Fetch token list metadata ONLY for mints missing metadata\n const tokenListMetadata = await fetchSolanaTokenListMetadata(mintsNeedingTokenList, {\n timeoutMs: 10000,\n cluster: options?.cluster,\n });\n\n // 2. Store token-list metadata into cache immediately (so logos show ASAP).\n for (const [mint, meta] of tokenListMetadata) {\n const coingeckoId = meta.extensions?.coingeckoId;\n const cachedPrice = coingeckoId ? priceCache.get(coingeckoId) : undefined;\n const usdPrice = cachedPrice?.price;\n\n const combined: TokenMetadata = {\n address: meta.address,\n name: meta.address === NATIVE_SOL_MINT ? 'Solana' : meta.name,\n symbol: meta.symbol,\n decimals: meta.decimals,\n logoURI: meta.logoURI,\n coingeckoId,\n usdPrice,\n };\n\n const existing = metadataCache.get(mint);\n const isDifferent =\n !existing ||\n existing.name !== combined.name ||\n existing.symbol !== combined.symbol ||\n existing.decimals !== combined.decimals ||\n existing.logoURI !== combined.logoURI ||\n existing.coingeckoId !== combined.coingeckoId ||\n existing.usdPrice !== combined.usdPrice;\n\n if (isDifferent) {\n didUpdate = true;\n metadataCache.set(mint, combined);\n }\n }\n\n if (didUpdate) {\n options?.onUpdate?.();\n }\n\n // 3. Collect CoinGecko IDs needing price refresh (from new + cached metadata)\n const coingeckoIdToMint = new Map<string, string>(staleCoingeckoIdToMint);\n for (const [mint, meta] of tokenListMetadata) {\n if (meta.extensions?.coingeckoId) {\n coingeckoIdToMint.set(meta.extensions.coingeckoId, mint);\n }\n }\n\n if (coingeckoIdToMint.size === 0) {\n return didUpdate;\n }\n\n // 4. Fetch prices (only stale/missing thanks to TTL in fetchCoinGeckoPrices)\n const prices = await fetchCoinGeckoPrices([...coingeckoIdToMint.keys()], coingeckoConfig);\n\n // 5. Update prices for cached mints (only bump if the displayed price changes)\n let didUpdatePrices = false;\n for (const [coingeckoId, mint] of coingeckoIdToMint) {\n const cached = metadataCache.get(mint);\n if (cached) {\n const usdPrice = prices.get(coingeckoId);\n if (usdPrice !== undefined) {\n if (cached.usdPrice !== usdPrice) {\n didUpdate = true;\n didUpdatePrices = true;\n cached.usdPrice = usdPrice;\n metadataCache.set(mint, cached);\n }\n }\n }\n }\n\n if (didUpdatePrices) {\n options?.onUpdate?.();\n }\n\n return didUpdate;\n}\n\n/**\n * Format balance for display (BigInt-safe)\n */\nfunction formatBalance(amount: bigint, decimals: number): string {\n return formatBigIntBalance(amount, decimals, {\n maxDecimals: Math.min(decimals, 6),\n });\n}\n\n/**\n * Format USD value for display (BigInt-safe)\n */\nfunction formatUsd(amount: bigint, decimals: number, usdPrice: number): string {\n return formatBigIntUsd(amount, decimals, usdPrice);\n}\n\n/** Selection type for wallet assets */\ninterface TokensSelection {\n lamports: bigint;\n tokenAccounts: TokenAccountInfo[];\n address: string;\n}\n\n/**\n * Select function to get token-relevant data from wallet assets\n */\nfunction selectTokens(assets: WalletAssetsData | undefined, address: string): TokensSelection {\n return {\n lamports: assets?.lamports ?? 0n,\n tokenAccounts: assets?.tokenAccounts ?? [],\n address,\n };\n}\n\n/**\n * Sort tokens by USD value (highest first), tokens with metadata first\n */\nfunction sortByValueDesc(a: Token, b: Token): number {\n const metadataSort = (b.logo ? 1 : 0) - (a.logo ? 1 : 0);\n if (metadataSort !== 0) return metadataSort;\n\n const aValue = (Number(a.amount) / Math.pow(10, a.decimals)) * (a.usdPrice ?? 0);\n const bValue = (Number(b.amount) / Math.pow(10, b.decimals)) * (b.usdPrice ?? 0);\n return bValue - aValue;\n}\n\n/**\n * Hook for fetching wallet token holdings.\n * Fetches metadata (name, symbol, icon) from Solana Token List API and USD prices from CoinGecko.\n *\n * Features:\n * - Automatic request deduplication across components\n * - Shared data with useBalance (single RPC query)\n * - Token-2022 support\n * - Shared polling interval (ref-counted)\n * - Configurable auto-refresh behavior\n * - Abort support for in-flight requests\n * - Optional client override\n *\n * @example Basic usage\n * ```tsx\n * function TokenList() {\n * const { tokens, isLoading } = useTokens();\n *\n * if (isLoading) return <div>Loading...</div>;\n *\n * return (\n * <div>\n * {tokens.map(token => (\n * <div key={token.mint}>\n * <img src={token.logo} />\n * {token.symbol}: {token.formatted}\n * {token.formattedUsd && <span>({token.formattedUsd})</span>}\n * </div>\n * ))}\n * </div>\n * );\n * }\n * ```\n *\n * @example With options\n * ```tsx\n * function TokenList() {\n * const { tokens, refetch, abort } = useTokens({\n * autoRefresh: true,\n * refreshInterval: 30000,\n * includeNativeSol: true,\n * });\n *\n * return (\n * <div>\n * {tokens.map(token => (\n * <div key={token.mint}>{token.symbol}: {token.formatted}</div>\n * ))}\n * <button onClick={() => refetch()}>Refresh</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useTokens(options: UseTokensOptions = {}): UseTokensReturn {\n const {\n enabled = true,\n includeZeroBalance = false,\n autoRefresh = false,\n refreshInterval = 60000,\n fetchMetadata = true,\n includeNativeSol = true,\n staleTimeMs = 0,\n cacheTimeMs = 5 * 60 * 1000, // 5 minutes\n refetchOnMount = 'stale',\n client: clientOverride,\n } = options;\n\n const { address, connected } = useAccount();\n const { type: clusterType } = useCluster();\n const connectorClient = useConnectorClient();\n\n // Get imageProxy and coingecko config from connector config\n const connectorConfig = connectorClient?.getConfig();\n const imageProxy = connectorConfig?.imageProxy;\n const coingeckoConfig = connectorConfig?.coingecko;\n\n // Memoize select function to avoid new function reference on every render\n const selectFn = useCallback(\n (assets: WalletAssetsData | undefined) => selectTokens(assets, address ?? ''),\n [address],\n );\n\n // Use shared wallet assets query\n const {\n data: selection,\n error,\n isFetching,\n updatedAt,\n refetch: sharedRefetch,\n abort,\n } = useWalletAssets<TokensSelection>({\n enabled,\n staleTimeMs,\n cacheTimeMs,\n refetchOnMount,\n refetchIntervalMs: autoRefresh ? refreshInterval : false,\n client: clientOverride,\n select: selectFn,\n });\n\n const lamports = selection?.lamports ?? 0n;\n const tokenAccounts = selection?.tokenAccounts ?? [];\n const walletAddress = selection?.address ?? '';\n\n // Build base tokens from raw data (without metadata)\n const baseTokens = useMemo((): Token[] => {\n const result: Token[] = [];\n\n // Add native SOL if requested\n if (includeNativeSol && walletAddress) {\n if (includeZeroBalance || lamports > 0n) {\n result.push({\n mint: NATIVE_SOL_MINT,\n tokenAccount: walletAddress,\n amount: lamports,\n decimals: 9,\n formatted: formatBalance(lamports, 9),\n isFrozen: false,\n owner: walletAddress,\n });\n }\n }\n\n // Add SPL tokens\n for (const account of tokenAccounts) {\n if (!includeZeroBalance && account.amount === 0n) {\n continue;\n }\n\n result.push({\n mint: account.mint,\n tokenAccount: account.pubkey,\n amount: account.amount,\n decimals: account.decimals,\n formatted: formatBalance(account.amount, account.decimals),\n isFrozen: account.isFrozen,\n owner: account.owner,\n programId: account.programId,\n });\n }\n\n return result;\n }, [lamports, tokenAccounts, walletAddress, includeNativeSol, includeZeroBalance]);\n\n // Extract mints for metadata fetching\n const mints = useMemo(() => {\n const unique = new Set<string>();\n for (const token of baseTokens) {\n unique.add(token.mint);\n }\n return [...unique].sort();\n }, [baseTokens]);\n const mintsKey = useMemo(() => mints.join(','), [mints]);\n\n // Metadata version counter - bumped when metadata cache is updated\n // This triggers re-derivation of tokens with fresh metadata\n const [metadataVersion, setMetadataVersion] = useState(0);\n\n // Fetch metadata/prices when mint set changes.\n // The shared token-list cache prevents duplicate network requests, so we don't need\n // an in-flight guard here. This ensures setMetadataVersion is always called reliably.\n useEffect(() => {\n if (!fetchMetadata || !mintsKey) return;\n\n let isMounted = true;\n\n (async () => {\n try {\n const mintList = mintsKey.split(',');\n\n // Fetch and cache metadata; onUpdate is called immediately when logos arrive\n await fetchTokenMetadataHybrid(mintList, coingeckoConfig, {\n onUpdate: () => {\n if (isMounted) setMetadataVersion(v => v + 1);\n },\n cluster: clusterType ?? undefined,\n });\n\n // Final bump in case onUpdate wasn't called (e.g., only prices updated)\n if (isMounted) setMetadataVersion(v => v + 1);\n } catch (err) {\n console.error('[useTokens] Failed to fetch metadata:', err);\n }\n })();\n\n return () => {\n isMounted = false;\n };\n }, [mintsKey, fetchMetadata, coingeckoConfig, clusterType]);\n\n // Derive final tokens from baseTokens + metadata cache\n // This ensures balances always stay current (derived from latest baseTokens)\n const tokens = useMemo(() => {\n if (!fetchMetadata) {\n return baseTokens.slice().sort(sortByValueDesc);\n }\n\n // Apply metadata from cache\n const enriched = baseTokens.map(token => {\n const meta = metadataCache.get(token.mint);\n if (!meta) return token;\n\n const cachedPrice = meta.coingeckoId ? priceCache.get(meta.coingeckoId) : undefined;\n const usdPrice = cachedPrice?.price ?? meta.usdPrice;\n\n return {\n ...token,\n name: meta.name,\n symbol: meta.symbol,\n logo: transformImageUrl(meta.logoURI, imageProxy),\n usdPrice,\n formattedUsd: usdPrice ? formatUsd(token.amount, token.decimals, usdPrice) : undefined,\n };\n });\n\n return enriched.sort(sortByValueDesc);\n // metadataVersion triggers re-derivation when cache is updated\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [baseTokens, fetchMetadata, imageProxy, metadataVersion]);\n\n const totalAccounts = tokenAccounts.length + (includeNativeSol ? 1 : 0);\n\n // Start/stop cache cleanup interval based on hook lifecycle\n useEffect(() => {\n startCacheCleanup();\n return () => stopCacheCleanup();\n }, []);\n\n // Track previous connection state to detect disconnect\n const wasConnectedRef = useRef(connected);\n\n // Clear caches on disconnect/session end\n useEffect(() => {\n if (wasConnectedRef.current && !connected) {\n clearTokenCaches();\n }\n wasConnectedRef.current = connected;\n }, [connected]);\n\n // Preserve old behavior: don't surface \"refresh failed\" errors if we already have data\n const visibleError = updatedAt ? null : error;\n\n // Wrap refetch to match expected signature\n const refetch = useCallback(\n async (opts?: { signal?: AbortSignal }) => {\n await sharedRefetch(opts);\n },\n [sharedRefetch],\n );\n\n return useMemo(\n () => ({\n tokens,\n isLoading: isFetching,\n error: visibleError,\n refetch,\n abort,\n lastUpdated: updatedAt ? new Date(updatedAt) : null,\n totalAccounts,\n }),\n [tokens, isFetching, visibleError, refetch, abort, updatedAt, totalAccounts],\n );\n}\n","'use client';\n\nimport React from 'react';\nimport type { ReactNode } from 'react';\nimport { useConnector } from '../../ui/connector-provider';\n\nexport interface DisconnectElementProps {\n /** Display variant */\n variant?: 'button' | 'menuitem' | 'link';\n /** Custom className */\n className?: string;\n /** Custom label */\n label?: string;\n /** Custom icon (render function) */\n icon?: ReactNode;\n /** Show icon */\n showIcon?: boolean;\n /** Callback after disconnect */\n onDisconnect?: () => void;\n /** Custom render function for full control */\n render?: (props: { disconnect: () => Promise<void>; disconnecting: boolean }) => ReactNode;\n}\n\n/**\n * Element for disconnecting the current wallet.\n *\n * @example Basic usage\n * ```tsx\n * <DisconnectElement />\n * ```\n *\n * @example Button variant\n * ```tsx\n * <DisconnectElement variant=\"button\" />\n * ```\n *\n * @example Custom render\n * ```tsx\n * <DisconnectElement\n * render={({ disconnect }) => (\n * <DropdownMenuItem onClick={disconnect}>\n * <LogOut className=\"mr-2 h-4 w-4\" />\n * Sign Out\n * </DropdownMenuItem>\n * )}\n * />\n * ```\n */\nexport function DisconnectElement({\n variant = 'menuitem',\n className,\n label = 'Disconnect',\n icon,\n showIcon = true,\n onDisconnect,\n render,\n}: DisconnectElementProps) {\n const { disconnect, connecting } = useConnector();\n const [disconnecting, setDisconnecting] = React.useState(false);\n\n const handleDisconnect = async () => {\n setDisconnecting(true);\n try {\n await disconnect();\n onDisconnect?.();\n } finally {\n setDisconnecting(false);\n }\n };\n\n // Custom render\n if (render) {\n return <>{render({ disconnect: handleDisconnect, disconnecting })}</>;\n }\n\n const isDisabled = connecting || disconnecting;\n\n const defaultIcon = showIcon && !icon && (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"ck-block-icon\"\n data-slot=\"disconnect-element-icon\"\n >\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\n <polyline points=\"16 17 21 12 16 7\" />\n <line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\" />\n </svg>\n );\n\n const content = (\n <>\n {showIcon && (icon || defaultIcon)}\n <span data-slot=\"disconnect-element-label\">{label}</span>\n </>\n );\n\n // Button variant\n if (variant === 'button') {\n return (\n <button\n type=\"button\"\n className={`ck-disconnect-block ck-disconnect-block--button ${className || ''}`}\n onClick={handleDisconnect}\n disabled={isDisabled}\n data-slot=\"disconnect-element\"\n data-variant=\"button\"\n data-disconnecting={disconnecting}\n >\n {content}\n </button>\n );\n }\n\n // Link variant\n if (variant === 'link') {\n return (\n <button\n type=\"button\"\n className={`ck-disconnect-block ck-disconnect-block--link ${className || ''}`}\n onClick={handleDisconnect}\n disabled={isDisabled}\n data-slot=\"disconnect-element\"\n data-variant=\"link\"\n data-disconnecting={disconnecting}\n >\n {content}\n </button>\n );\n }\n\n // Menu item variant (default)\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n className={`ck-disconnect-block ck-disconnect-block--menuitem ${className || ''}`}\n onClick={handleDisconnect}\n disabled={isDisabled}\n data-slot=\"disconnect-element\"\n data-variant=\"menuitem\"\n data-disconnecting={disconnecting}\n >\n {content}\n </button>\n );\n}\n\nDisconnectElement.displayName = 'DisconnectElement';\n","'use client';\n\nimport React from 'react';\nimport type { ReactNode } from 'react';\nimport { useAccount } from '../../hooks/use-account';\nimport { useWalletInfo } from '../../hooks/use-wallet-info';\n\nexport interface AccountElementRenderProps {\n address: string | null;\n formatted: string;\n walletName: string | null;\n walletIcon: string | null;\n copy: () => Promise<{ success: boolean }>;\n copied: boolean;\n}\n\nexport interface AccountElementProps {\n /** Show wallet avatar/icon */\n showAvatar?: boolean;\n /** Show copy button */\n showCopy?: boolean;\n /** Show full address instead of truncated */\n showFullAddress?: boolean;\n /** Custom className */\n className?: string;\n /** Custom avatar size (in pixels) */\n avatarSize?: number;\n /** Layout variant */\n variant?: 'compact' | 'expanded' | 'inline';\n /** Custom render function for full control */\n render?: (props: AccountElementRenderProps) => ReactNode;\n}\n\n/**\n * Element for displaying connected account information.\n *\n * @example Basic usage\n * ```tsx\n * <AccountElement />\n * ```\n *\n * @example With full address\n * ```tsx\n * <AccountElement showFullAddress />\n * ```\n *\n * @example Custom render\n * ```tsx\n * <AccountElement\n * render={({ formatted, walletIcon, copy, copied }) => (\n * <DropdownMenuLabel>\n * <img src={walletIcon} className=\"w-5 h-5\" />\n * <button onClick={copy}>\n * {copied ? 'Copied!' : formatted}\n * </button>\n * </DropdownMenuLabel>\n * )}\n * />\n * ```\n */\nexport function AccountElement({\n showAvatar = true,\n showCopy = true,\n showFullAddress = false,\n className,\n avatarSize = 32,\n variant = 'compact',\n render,\n}: AccountElementProps) {\n const { address, formatted, copy, copied } = useAccount();\n const { name: walletName, icon: walletIcon } = useWalletInfo();\n\n // Custom render\n if (render) {\n return <>{render({ address, formatted, walletName, walletIcon, copy, copied })}</>;\n }\n\n if (!address) return null;\n\n const displayAddress = showFullAddress ? address : formatted;\n\n const handleCopy = async (e: React.MouseEvent) => {\n e.stopPropagation();\n await copy();\n };\n\n const copyIcon = (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"ck-block-icon\"\n data-slot=\"account-element-copy-icon\"\n >\n {copied ? (\n <polyline points=\"20 6 9 17 4 12\" />\n ) : (\n <>\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </>\n )}\n </svg>\n );\n\n // Inline variant\n if (variant === 'inline') {\n return (\n <div\n className={`ck-account-block ck-account-block--inline ${className || ''}`}\n data-slot=\"account-element\"\n data-variant=\"inline\"\n >\n {showAvatar && walletIcon && (\n <img\n src={walletIcon}\n alt={walletName || 'Wallet'}\n className=\"ck-account-block-avatar\"\n style={{ width: avatarSize, height: avatarSize }}\n data-slot=\"account-element-avatar\"\n />\n )}\n <span className=\"ck-account-block-address\" data-slot=\"account-element-address\">\n {displayAddress}\n </span>\n {showCopy && (\n <button\n type=\"button\"\n className=\"ck-account-block-copy\"\n onClick={handleCopy}\n title={copied ? 'Copied!' : 'Copy address'}\n data-slot=\"account-element-copy\"\n data-copied={copied}\n >\n {copyIcon}\n </button>\n )}\n </div>\n );\n }\n\n // Expanded variant\n if (variant === 'expanded') {\n return (\n <div\n className={`ck-account-block ck-account-block--expanded ${className || ''}`}\n data-slot=\"account-element\"\n data-variant=\"expanded\"\n >\n <div className=\"ck-account-block-header\" data-slot=\"account-element-header\">\n {showAvatar && walletIcon && (\n <img\n src={walletIcon}\n alt={walletName || 'Wallet'}\n className=\"ck-account-block-avatar\"\n style={{ width: avatarSize, height: avatarSize }}\n data-slot=\"account-element-avatar\"\n />\n )}\n <div className=\"ck-account-block-info\" data-slot=\"account-element-info\">\n {walletName && (\n <span className=\"ck-account-block-wallet-name\" data-slot=\"account-element-wallet-name\">\n {walletName}\n </span>\n )}\n <span className=\"ck-account-block-address\" data-slot=\"account-element-address\">\n {displayAddress}\n </span>\n </div>\n </div>\n {showCopy && (\n <button\n type=\"button\"\n className=\"ck-account-block-copy\"\n onClick={handleCopy}\n data-slot=\"account-element-copy\"\n data-copied={copied}\n >\n {copyIcon}\n <span>{copied ? 'Copied!' : 'Copy'}</span>\n </button>\n )}\n </div>\n );\n }\n\n // Compact variant (default)\n return (\n <div\n className={`ck-account-block ck-account-block--compact ${className || ''}`}\n data-slot=\"account-element\"\n data-variant=\"compact\"\n >\n {showAvatar && walletIcon && (\n <img\n src={walletIcon}\n alt={walletName || 'Wallet'}\n className=\"ck-account-block-avatar\"\n style={{ width: avatarSize, height: avatarSize }}\n data-slot=\"account-element-avatar\"\n />\n )}\n <div className=\"ck-account-block-content\" data-slot=\"account-element-content\">\n {walletName && (\n <span className=\"ck-account-block-wallet-name\" data-slot=\"account-element-wallet-name\">\n {walletName}\n </span>\n )}\n <span className=\"ck-account-block-address\" data-slot=\"account-element-address\">\n {displayAddress}\n </span>\n </div>\n {showCopy && (\n <button\n type=\"button\"\n className=\"ck-account-block-copy\"\n onClick={handleCopy}\n title={copied ? 'Copied!' : 'Copy address'}\n data-slot=\"account-element-copy\"\n data-copied={copied}\n >\n {copyIcon}\n </button>\n )}\n </div>\n );\n}\n\nAccountElement.displayName = 'AccountElement';\n","'use client';\n\nimport React from 'react';\nimport type { ReactNode } from 'react';\nimport { useCluster } from '../../hooks/use-cluster';\nimport type { SolanaCluster, SolanaClusterId } from '@wallet-ui/core';\n\nexport interface ClusterElementRenderProps {\n cluster: SolanaCluster | null;\n clusters: SolanaCluster[];\n setCluster: (id: SolanaClusterId) => Promise<void>;\n isMainnet: boolean;\n isDevnet: boolean;\n isTestnet: boolean;\n isLocal: boolean;\n}\n\nexport interface ClusterElementProps {\n /** Display variant */\n variant?: 'badge' | 'select' | 'menuitem';\n /** Custom className */\n className?: string;\n /** Whether the cluster can be changed */\n allowChange?: boolean;\n /** Show cluster icon/indicator */\n showIndicator?: boolean;\n /** Custom cluster labels */\n labels?: Partial<Record<string, string>>;\n /** Custom render function for full control */\n render?: (props: ClusterElementRenderProps) => ReactNode;\n}\n\nconst DEFAULT_LABELS: Record<string, string> = {\n 'mainnet-beta': 'Mainnet',\n devnet: 'Devnet',\n testnet: 'Testnet',\n localnet: 'Localnet',\n};\n\nfunction getClusterColor(clusterId: string): string {\n switch (clusterId) {\n case 'mainnet-beta':\n return 'var(--ck-cluster-mainnet, #22c55e)';\n case 'devnet':\n return 'var(--ck-cluster-devnet, #3b82f6)';\n case 'testnet':\n return 'var(--ck-cluster-testnet, #eab308)';\n case 'localnet':\n return 'var(--ck-cluster-localnet, #ef4444)';\n default:\n return 'var(--ck-cluster-custom, #8b5cf6)';\n }\n}\n\n/**\n * Element for displaying and optionally changing the current cluster/network.\n *\n * @example Badge (read-only)\n * ```tsx\n * <ClusterElement variant=\"badge\" />\n * ```\n *\n * @example Select (changeable)\n * ```tsx\n * <ClusterElement variant=\"select\" allowChange />\n * ```\n *\n * @example Custom render\n * ```tsx\n * <ClusterElement\n * render={({ cluster, clusters, setCluster }) => (\n * <Select value={cluster?.id} onValueChange={setCluster}>\n * {clusters.map(c => (\n * <SelectItem key={c.id} value={c.id}>\n * {c.label}\n * </SelectItem>\n * ))}\n * </Select>\n * )}\n * />\n * ```\n */\nexport function ClusterElement({\n variant = 'badge',\n className,\n allowChange = false,\n showIndicator = true,\n labels = {},\n render,\n}: ClusterElementProps) {\n const { cluster, clusters, setCluster, isMainnet, isDevnet, isTestnet, isLocal } = useCluster();\n const [isOpen, setIsOpen] = React.useState(false);\n\n // Custom render\n if (render) {\n return <>{render({ cluster, clusters, setCluster, isMainnet, isDevnet, isTestnet, isLocal })}</>;\n }\n\n if (!cluster) return null;\n\n const allLabels = { ...DEFAULT_LABELS, ...labels };\n const displayLabel = allLabels[cluster.id] || cluster.label || cluster.id;\n const color = getClusterColor(cluster.id);\n\n const indicator = showIndicator && (\n <span\n className=\"ck-cluster-indicator\"\n style={{ backgroundColor: color }}\n data-slot=\"cluster-element-indicator\"\n aria-hidden=\"true\"\n />\n );\n\n // Badge variant\n if (variant === 'badge') {\n return (\n <span\n className={`ck-cluster-block ck-cluster-block--badge ${className || ''}`}\n data-slot=\"cluster-element\"\n data-variant=\"badge\"\n data-cluster={cluster.id}\n >\n {indicator}\n <span data-slot=\"cluster-element-label\">{displayLabel}</span>\n </span>\n );\n }\n\n // Menu item variant (for dropdowns)\n if (variant === 'menuitem') {\n if (!allowChange) {\n return (\n <div\n className={`ck-cluster-block ck-cluster-block--menuitem ${className || ''}`}\n role=\"menuitem\"\n data-slot=\"cluster-element\"\n data-variant=\"menuitem\"\n data-cluster={cluster.id}\n >\n {indicator}\n <span data-slot=\"cluster-element-label\">{displayLabel}</span>\n </div>\n );\n }\n\n // Submenu for changing cluster\n return (\n <div\n className={`ck-cluster-block ck-cluster-block--menuitem ${className || ''}`}\n data-slot=\"cluster-element\"\n data-variant=\"menuitem\"\n data-cluster={cluster.id}\n >\n <button\n type=\"button\"\n className=\"ck-cluster-block-trigger\"\n onClick={() => setIsOpen(!isOpen)}\n data-slot=\"cluster-element-trigger\"\n >\n {indicator}\n <span data-slot=\"cluster-element-label\">{displayLabel}</span>\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={`ck-cluster-block-chevron ${isOpen ? 'ck-cluster-block-chevron--open' : ''}`}\n data-slot=\"cluster-element-chevron\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </button>\n {isOpen && (\n <div className=\"ck-cluster-block-options\" data-slot=\"cluster-element-options\">\n {clusters.map((c: SolanaCluster) => {\n const cLabel = allLabels[c.id] || c.label || c.id;\n const cColor = getClusterColor(c.id);\n const isSelected = c.id === cluster.id;\n\n return (\n <button\n key={c.id}\n type=\"button\"\n className={`ck-cluster-block-option ${isSelected ? 'ck-cluster-block-option--selected' : ''}`}\n onClick={() => {\n setCluster(c.id as SolanaClusterId);\n setIsOpen(false);\n }}\n data-slot=\"cluster-element-option\"\n data-selected={isSelected}\n >\n <span\n className=\"ck-cluster-indicator\"\n style={{ backgroundColor: cColor }}\n data-slot=\"cluster-element-indicator\"\n />\n <span>{cLabel}</span>\n {isSelected && (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n className=\"ck-cluster-block-check\"\n data-slot=\"cluster-element-check\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )}\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n }\n\n // Select variant\n return (\n <div\n className={`ck-cluster-block ck-cluster-block--select ${className || ''}`}\n data-slot=\"cluster-element\"\n data-variant=\"select\"\n data-cluster={cluster.id}\n >\n <button\n type=\"button\"\n className=\"ck-cluster-block-trigger\"\n onClick={() => setIsOpen(!isOpen)}\n disabled={!allowChange}\n data-slot=\"cluster-element-trigger\"\n >\n {indicator}\n <span data-slot=\"cluster-element-label\">{displayLabel}</span>\n {allowChange && (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={`ck-cluster-block-chevron ${isOpen ? 'ck-cluster-block-chevron--open' : ''}`}\n data-slot=\"cluster-element-chevron\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n )}\n </button>\n {isOpen && allowChange && (\n <>\n <div className=\"ck-cluster-block-backdrop\" onClick={() => setIsOpen(false)} aria-hidden=\"true\" />\n <div className=\"ck-cluster-block-options\" data-slot=\"cluster-element-options\">\n {clusters.map((c: SolanaCluster) => {\n const cLabel = allLabels[c.id] || c.label || c.id;\n const cColor = getClusterColor(c.id);\n const isSelected = c.id === cluster.id;\n\n return (\n <button\n key={c.id}\n type=\"button\"\n className={`ck-cluster-block-option ${isSelected ? 'ck-cluster-block-option--selected' : ''}`}\n onClick={() => {\n setCluster(c.id as SolanaClusterId);\n setIsOpen(false);\n }}\n data-slot=\"cluster-element-option\"\n data-selected={isSelected}\n >\n <span\n className=\"ck-cluster-indicator\"\n style={{ backgroundColor: cColor }}\n data-slot=\"cluster-element-indicator\"\n />\n <span>{cLabel}</span>\n {isSelected && (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n className=\"ck-cluster-block-check\"\n data-slot=\"cluster-element-check\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )}\n </button>\n );\n })}\n </div>\n </>\n )}\n </div>\n );\n}\n\nClusterElement.displayName = 'ClusterElement';\n","'use client';\n\nimport React from 'react';\nimport type { ReactNode } from 'react';\nimport { useWalletInfo, type WalletDisplayInfo } from '../../hooks/use-wallet-info';\nimport { useConnector } from '../../ui/connector-provider';\n\nexport interface WalletListElementRenderProps {\n wallets: WalletDisplayInfo[];\n installedWallets: WalletDisplayInfo[];\n select: (walletName: string) => Promise<void>;\n connecting: boolean;\n}\n\nexport interface WalletListElementWalletProps {\n wallet: WalletDisplayInfo;\n select: () => Promise<void>;\n connecting: boolean;\n}\n\nexport interface WalletListElementProps {\n /** Filter to only show installed wallets */\n installedOnly?: boolean;\n /** Custom className */\n className?: string;\n /** Layout variant */\n variant?: 'list' | 'grid' | 'compact';\n /** Show wallet status badge */\n showStatus?: boolean;\n /** Callback when a wallet is selected */\n onSelect?: (walletName: string) => void;\n /** Custom render function for full control */\n render?: (props: WalletListElementRenderProps) => ReactNode;\n /** Custom render function for individual wallet items */\n renderWallet?: (props: WalletListElementWalletProps) => ReactNode;\n}\n\n/**\n * Element for displaying available wallets and selecting one to connect.\n *\n * @example Basic usage\n * ```tsx\n * <WalletListElement />\n * ```\n *\n * @example Installed wallets only (most common)\n * ```tsx\n * <WalletListElement installedOnly />\n * ```\n *\n * @example Grid layout\n * ```tsx\n * <WalletListElement variant=\"grid\" installedOnly />\n * ```\n *\n * @example With custom wallet render\n * ```tsx\n * <WalletListElement\n * installedOnly\n * renderWallet={({ wallet, select }) => (\n * <Button key={wallet.name} onClick={select}>\n * <img src={wallet.icon} alt={wallet.name} />\n * {wallet.name}\n * </Button>\n * )}\n * />\n * ```\n *\n * @example Full custom render\n * ```tsx\n * <WalletListElement\n * render={({ installedWallets, select, connecting }) => (\n * <div className=\"grid grid-cols-2 gap-2\">\n * {installedWallets.map(w => (\n * <button key={w.name} onClick={() => select(w.name)} disabled={connecting}>\n * {w.name}\n * </button>\n * ))}\n * </div>\n * )}\n * />\n * ```\n */\nexport function WalletListElement({\n installedOnly = false,\n className,\n variant = 'list',\n showStatus = true,\n onSelect,\n render,\n renderWallet,\n}: WalletListElementProps) {\n const { wallets, connecting } = useWalletInfo();\n const { select } = useConnector();\n\n const installedWallets = wallets.filter(w => w.installed);\n const displayWallets = installedOnly ? installedWallets : wallets;\n\n const handleSelect = async (walletName: string) => {\n await select(walletName);\n onSelect?.(walletName);\n };\n\n // Full custom render\n if (render) {\n return <>{render({ wallets, installedWallets, select: handleSelect, connecting })}</>;\n }\n\n if (displayWallets.length === 0) {\n return (\n <div\n className={`ck-wallet-list-block ck-wallet-list-block--empty ${className || ''}`}\n data-slot=\"wallet-list-element\"\n data-empty=\"true\"\n >\n <div className=\"ck-wallet-list-empty\" data-slot=\"wallet-list-empty\">\n <svg\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"ck-wallet-list-empty-icon\"\n data-slot=\"wallet-list-empty-icon\"\n >\n <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\" />\n <path d=\"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\" />\n </svg>\n <p className=\"ck-wallet-list-empty-text\" data-slot=\"wallet-list-empty-text\">\n {installedOnly ? 'No wallets detected' : 'No wallets available'}\n </p>\n <p className=\"ck-wallet-list-empty-hint\" data-slot=\"wallet-list-empty-hint\">\n Install a Solana wallet extension to continue\n </p>\n </div>\n </div>\n );\n }\n\n const walletIcon = (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"ck-wallet-list-item-fallback-icon\"\n data-slot=\"wallet-list-item-fallback-icon\"\n >\n <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\" />\n <path d=\"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\" />\n </svg>\n );\n\n // Grid variant\n if (variant === 'grid') {\n return (\n <div\n className={`ck-wallet-list-block ck-wallet-list-block--grid ${className || ''}`}\n data-slot=\"wallet-list-element\"\n data-variant=\"grid\"\n >\n {displayWallets.map(wallet => {\n if (renderWallet) {\n return (\n <React.Fragment key={wallet.name}>\n {renderWallet({\n wallet,\n select: () => handleSelect(wallet.name),\n connecting,\n })}\n </React.Fragment>\n );\n }\n\n return (\n <button\n key={wallet.name}\n type=\"button\"\n className=\"ck-wallet-list-item ck-wallet-list-item--grid\"\n onClick={() => handleSelect(wallet.name)}\n disabled={connecting || (!wallet.installed && installedOnly)}\n data-slot=\"wallet-list-item\"\n data-wallet={wallet.name}\n data-installed={wallet.installed}\n >\n <div className=\"ck-wallet-list-item-icon\" data-slot=\"wallet-list-item-icon\">\n {wallet.icon ? <img src={wallet.icon} alt={wallet.name} /> : walletIcon}\n </div>\n <span className=\"ck-wallet-list-item-name\" data-slot=\"wallet-list-item-name\">\n {wallet.name}\n </span>\n {showStatus && !wallet.installed && (\n <span className=\"ck-wallet-list-item-status\" data-slot=\"wallet-list-item-status\">\n Not installed\n </span>\n )}\n </button>\n );\n })}\n </div>\n );\n }\n\n // Compact variant\n if (variant === 'compact') {\n return (\n <div\n className={`ck-wallet-list-block ck-wallet-list-block--compact ${className || ''}`}\n data-slot=\"wallet-list-element\"\n data-variant=\"compact\"\n >\n {displayWallets.map(wallet => {\n if (renderWallet) {\n return (\n <React.Fragment key={wallet.name}>\n {renderWallet({\n wallet,\n select: () => handleSelect(wallet.name),\n connecting,\n })}\n </React.Fragment>\n );\n }\n\n return (\n <button\n key={wallet.name}\n type=\"button\"\n className=\"ck-wallet-list-item ck-wallet-list-item--compact\"\n onClick={() => handleSelect(wallet.name)}\n disabled={connecting || (!wallet.installed && installedOnly)}\n data-slot=\"wallet-list-item\"\n data-wallet={wallet.name}\n data-installed={wallet.installed}\n >\n <div className=\"ck-wallet-list-item-icon\" data-slot=\"wallet-list-item-icon\">\n {wallet.icon ? <img src={wallet.icon} alt={wallet.name} /> : walletIcon}\n </div>\n <span className=\"ck-wallet-list-item-name\" data-slot=\"wallet-list-item-name\">\n {wallet.name}\n </span>\n </button>\n );\n })}\n </div>\n );\n }\n\n // List variant (default)\n return (\n <div\n className={`ck-wallet-list-block ck-wallet-list-block--list ${className || ''}`}\n data-slot=\"wallet-list-element\"\n data-variant=\"list\"\n >\n {displayWallets.map(wallet => {\n if (renderWallet) {\n return (\n <React.Fragment key={wallet.name}>\n {renderWallet({\n wallet,\n select: () => handleSelect(wallet.name),\n connecting,\n })}\n </React.Fragment>\n );\n }\n\n return (\n <button\n key={wallet.name}\n type=\"button\"\n className=\"ck-wallet-list-item ck-wallet-list-item--list\"\n onClick={() => handleSelect(wallet.name)}\n disabled={connecting || (!wallet.installed && installedOnly)}\n data-slot=\"wallet-list-item\"\n data-wallet={wallet.name}\n data-installed={wallet.installed}\n >\n <div className=\"ck-wallet-list-item-icon\" data-slot=\"wallet-list-item-icon\">\n {wallet.icon ? <img src={wallet.icon} alt={wallet.name} /> : walletIcon}\n </div>\n <div className=\"ck-wallet-list-item-info\" data-slot=\"wallet-list-item-info\">\n <span className=\"ck-wallet-list-item-name\" data-slot=\"wallet-list-item-name\">\n {wallet.name}\n </span>\n {showStatus && (\n <span\n className=\"ck-wallet-list-item-status\"\n data-slot=\"wallet-list-item-status\"\n data-installed={wallet.installed}\n >\n {wallet.installed ? 'Detected' : 'Not installed'}\n </span>\n )}\n </div>\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"ck-wallet-list-item-arrow\"\n data-slot=\"wallet-list-item-arrow\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n </button>\n );\n })}\n </div>\n );\n}\n\nWalletListElement.displayName = 'WalletListElement';\n","'use client';\n\nimport React from 'react';\n\nconst shineStyles = `\n .ck-skeleton {\n position: relative;\n overflow: hidden;\n }\n .ck-skeleton-shine {\n position: absolute;\n top: 0;\n left: 0;\n width: 500%;\n height: 500%;\n background: linear-gradient(135deg, rgba(255,255,255,0) 0%, rgba(255,255,255,0.1) 50%, rgba(255,255,255,0) 100%);\n animation: ck-skeleton-slide 0.5s infinite;\n z-index: 1;\n pointer-events: none;\n }\n @keyframes ck-skeleton-slide {\n 0% { transform: translate(-100%, -100%); }\n 100% { transform: translate(100%, 100%); }\n }\n`;\n\nlet stylesInjected = false;\n\nfunction injectStyles() {\n if (stylesInjected) return;\n\n if (typeof document !== 'undefined') {\n const styleId = 'ck-skeleton-shine-styles';\n if (!document.getElementById(styleId)) {\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = shineStyles;\n document.head.appendChild(style);\n }\n stylesInjected = true;\n }\n}\n\n/**\n * Shine overlay component for skeleton loading states.\n * Injects CSS styles once and provides the animated shine effect.\n */\nexport function SkeletonShine() {\n React.useEffect(() => {\n injectStyles();\n }, []);\n\n return <div className=\"ck-skeleton-shine\" data-slot=\"skeleton-shine\" />;\n}\n\nSkeletonShine.displayName = 'SkeletonShine';\n","'use client';\n\nimport React from 'react';\nimport type { ReactNode } from 'react';\nimport { useBalance, type TokenBalance } from '../../hooks/use-balance';\nimport { SkeletonShine } from './skeleton-shine';\n\nexport interface BalanceElementRenderProps {\n solBalance: number;\n formattedSol: string;\n tokens: TokenBalance[];\n isLoading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n}\n\nexport interface BalanceElementProps {\n /** Show SOL balance */\n showSol?: boolean;\n /** Show token balances */\n showTokens?: boolean;\n /** Maximum number of tokens to display */\n tokenCount?: number;\n /** Custom className */\n className?: string;\n /** Display variant */\n variant?: 'compact' | 'expanded' | 'inline';\n /** Show refresh button */\n showRefresh?: boolean;\n /** Show loading skeleton */\n showSkeleton?: boolean;\n /** Custom render function for full control */\n render?: (props: BalanceElementRenderProps) => ReactNode;\n}\n\n/**\n * Element for displaying wallet balance (SOL and tokens).\n *\n * @example Basic usage\n * ```tsx\n * <BalanceElement />\n * ```\n *\n * @example With tokens\n * ```tsx\n * <BalanceElement showTokens tokenCount={5} />\n * ```\n *\n * @example Custom render\n * ```tsx\n * <BalanceElement\n * render={({ formattedSol, isLoading }) => (\n * <div className=\"text-2xl font-bold\">\n * {isLoading ? 'Loading...' : formattedSol}\n * </div>\n * )}\n * />\n * ```\n */\nexport function BalanceElement({\n showSol = true,\n showTokens = false,\n tokenCount = 3,\n className,\n variant = 'compact',\n showRefresh = false,\n showSkeleton = true,\n render,\n}: BalanceElementProps) {\n const { solBalance, formattedSol, tokens, isLoading, error, refetch } = useBalance();\n\n // Custom render\n if (render) {\n return <>{render({ solBalance, formattedSol, tokens, isLoading, error, refetch })}</>;\n }\n\n const displayTokens = tokens.slice(0, tokenCount);\n\n const refreshIcon = (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={`ck-block-icon ${isLoading ? 'ck-block-icon--spinning' : ''}`}\n data-slot=\"balance-element-refresh-icon\"\n >\n <path d=\"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n <path d=\"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16\" />\n <path d=\"M16 16h5v5\" />\n </svg>\n );\n\n // Loading skeleton\n if (isLoading && showSkeleton && solBalance === 0) {\n return (\n <div\n className={`ck-balance-block ck-balance-block--${variant} ck-balance-block--loading ${className || ''}`}\n data-slot=\"balance-element\"\n data-variant={variant}\n data-loading=\"true\"\n >\n <div className=\"ck-balance-block-skeleton\" data-slot=\"balance-element-skeleton\">\n <div className=\"ck-skeleton ck-skeleton--text\">\n <SkeletonShine />\n </div>\n {showTokens && (\n <>\n <div className=\"ck-skeleton ck-skeleton--text ck-skeleton--short\">\n <SkeletonShine />\n </div>\n <div className=\"ck-skeleton ck-skeleton--text ck-skeleton--short\">\n <SkeletonShine />\n </div>\n </>\n )}\n </div>\n </div>\n );\n }\n\n // Error state\n if (error) {\n return (\n <div\n className={`ck-balance-block ck-balance-block--${variant} ck-balance-block--error ${className || ''}`}\n data-slot=\"balance-element\"\n data-variant={variant}\n data-error=\"true\"\n >\n <span className=\"ck-balance-block-error\" data-slot=\"balance-element-error\">\n Failed to load balance\n </span>\n {showRefresh && (\n <button\n type=\"button\"\n className=\"ck-balance-block-refresh\"\n onClick={() => refetch()}\n data-slot=\"balance-element-refresh\"\n >\n {refreshIcon}\n </button>\n )}\n </div>\n );\n }\n\n // Inline variant\n if (variant === 'inline') {\n return (\n <div\n className={`ck-balance-block ck-balance-block--inline ${className || ''}`}\n data-slot=\"balance-element\"\n data-variant=\"inline\"\n >\n {showSol && (\n <span className=\"ck-balance-block-sol\" data-slot=\"balance-element-sol\">\n {formattedSol}\n </span>\n )}\n {showRefresh && (\n <button\n type=\"button\"\n className=\"ck-balance-block-refresh\"\n onClick={() => refetch()}\n disabled={isLoading}\n data-slot=\"balance-element-refresh\"\n >\n {refreshIcon}\n </button>\n )}\n </div>\n );\n }\n\n // Expanded variant\n if (variant === 'expanded') {\n return (\n <div\n className={`ck-balance-block ck-balance-block--expanded ${className || ''}`}\n data-slot=\"balance-element\"\n data-variant=\"expanded\"\n >\n {showSol && (\n <div className=\"ck-balance-block-sol-section\" data-slot=\"balance-element-sol-section\">\n <span className=\"ck-balance-block-label\" data-slot=\"balance-element-label\">\n SOL Balance\n </span>\n <span className=\"ck-balance-block-sol\" data-slot=\"balance-element-sol\">\n {formattedSol}\n </span>\n </div>\n )}\n\n {showTokens && displayTokens.length > 0 && (\n <div className=\"ck-balance-block-tokens-section\" data-slot=\"balance-element-tokens-section\">\n <span className=\"ck-balance-block-label\" data-slot=\"balance-element-label\">\n Tokens ({tokens.length})\n </span>\n <div className=\"ck-balance-block-tokens\" data-slot=\"balance-element-tokens\">\n {displayTokens.map(token => (\n <div\n key={token.mint}\n className=\"ck-balance-block-token\"\n data-slot=\"balance-element-token\"\n >\n {token.logo && (\n <img\n src={token.logo}\n alt={token.symbol || 'Token'}\n className=\"ck-balance-block-token-logo\"\n data-slot=\"balance-element-token-logo\"\n />\n )}\n <span\n className=\"ck-balance-block-token-info\"\n data-slot=\"balance-element-token-info\"\n >\n <span\n className=\"ck-balance-block-token-symbol\"\n data-slot=\"balance-element-token-symbol\"\n >\n {token.symbol || token.mint.slice(0, 4) + '...' + token.mint.slice(-4)}\n </span>\n <span\n className=\"ck-balance-block-token-amount\"\n data-slot=\"balance-element-token-amount\"\n >\n {token.formatted}\n </span>\n </span>\n </div>\n ))}\n {tokens.length > tokenCount && (\n <div className=\"ck-balance-block-more\" data-slot=\"balance-element-more\">\n +{tokens.length - tokenCount} more\n </div>\n )}\n </div>\n </div>\n )}\n\n {showRefresh && (\n <button\n type=\"button\"\n className=\"ck-balance-block-refresh\"\n onClick={() => refetch()}\n disabled={isLoading}\n data-slot=\"balance-element-refresh\"\n >\n {refreshIcon}\n <span>Refresh</span>\n </button>\n )}\n </div>\n );\n }\n\n // Compact variant (default)\n return (\n <div\n className={`ck-balance-block ck-balance-block--compact ${className || ''}`}\n data-slot=\"balance-element\"\n data-variant=\"compact\"\n >\n {showSol && (\n <span className=\"ck-balance-block-sol\" data-slot=\"balance-element-sol\">\n {formattedSol}\n </span>\n )}\n\n {showTokens && displayTokens.length > 0 && (\n <span className=\"ck-balance-block-token-count\" data-slot=\"balance-element-token-count\">\n +{tokens.length} tokens\n </span>\n )}\n\n {showRefresh && (\n <button\n type=\"button\"\n className=\"ck-balance-block-refresh\"\n onClick={() => refetch()}\n disabled={isLoading}\n data-slot=\"balance-element-refresh\"\n >\n {refreshIcon}\n </button>\n )}\n </div>\n );\n}\n\nBalanceElement.displayName = 'BalanceElement';\n","'use client';\n\nimport React from 'react';\nimport type { ReactNode } from 'react';\nimport { useTransactions, type TransactionInfo } from '../../hooks/use-transactions';\nimport { SkeletonShine } from './skeleton-shine';\n\nexport interface TransactionHistoryElementRenderProps {\n transactions: TransactionInfo[];\n isLoading: boolean;\n error: Error | null;\n hasMore: boolean;\n loadMore: () => Promise<void>;\n refetch: () => Promise<void>;\n}\n\nexport interface TransactionHistoryElementProps {\n /** Number of transactions to display */\n limit?: number;\n /**\n * Fetch full transaction details (slower, but enables richer parsing like token icons + swap detection).\n *\n * Passed through to `useTransactions({ fetchDetails })`.\n * @default true\n */\n fetchDetails?: boolean;\n /**\n * Max concurrent `getTransaction` RPC calls when `fetchDetails` is true.\n *\n * Passed through to `useTransactions({ detailsConcurrency })`.\n * @default 6\n */\n detailsConcurrency?: number;\n /** Show transaction status */\n showStatus?: boolean;\n /** Show transaction time */\n showTime?: boolean;\n /** Custom className */\n className?: string;\n /** Display variant */\n variant?: 'compact' | 'expanded' | 'list';\n /** Show load more button */\n showLoadMore?: boolean;\n /** Show skeleton while loading */\n showSkeleton?: boolean;\n /** Custom render function for full control */\n render?: (props: TransactionHistoryElementRenderProps) => ReactNode;\n /** Custom render for individual transaction item */\n renderItem?: (transaction: TransactionInfo) => ReactNode;\n}\n\n/**\n * Element for displaying recent transaction history.\n *\n * @example Basic usage\n * ```tsx\n * <TransactionHistoryElement limit={5} />\n * ```\n *\n * @example With load more\n * ```tsx\n * <TransactionHistoryElement limit={10} showLoadMore />\n * ```\n *\n * @example Throttle-safe details fetching (recommended for public RPCs)\n * ```tsx\n * <TransactionHistoryElement limit={10} fetchDetails detailsConcurrency={4} />\n * ```\n *\n * @example Custom item render\n * ```tsx\n * <TransactionHistoryElement\n * renderItem={(tx) => (\n * <a href={tx.explorerUrl} target=\"_blank\">\n * {tx.signature.slice(0, 8)}... - {tx.status}\n * </a>\n * )}\n * />\n * ```\n */\nexport function TransactionHistoryElement({\n limit = 5,\n fetchDetails = true,\n detailsConcurrency,\n showStatus = true,\n showTime = true,\n className,\n variant = 'list',\n showLoadMore = false,\n showSkeleton = true,\n render,\n renderItem,\n}: TransactionHistoryElementProps) {\n const { transactions, isLoading, error, hasMore, loadMore, refetch } = useTransactions({\n limit,\n fetchDetails,\n detailsConcurrency,\n });\n\n // Custom render\n if (render) {\n return <>{render({ transactions, isLoading, error, hasMore, loadMore, refetch })}</>;\n }\n\n const statusIcon = (status: 'success' | 'failed') => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={`ck-tx-status-icon ck-tx-status-icon--${status}`}\n data-slot=\"tx-status-icon\"\n data-status={status}\n >\n {status === 'success' ? (\n <polyline points=\"20 6 9 17 4 12\" />\n ) : (\n <>\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </>\n )}\n </svg>\n );\n\n const externalLinkIcon = (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"ck-block-icon\"\n data-slot=\"tx-external-link-icon\"\n >\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n <polyline points=\"15 3 21 3 21 9\" />\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\" />\n </svg>\n );\n\n // Loading skeleton\n if (isLoading && showSkeleton && transactions.length === 0) {\n return (\n <div\n className={`ck-tx-history-block ck-tx-history-block--${variant} ck-tx-history-block--loading ${className || ''}`}\n data-slot=\"tx-history-element\"\n data-variant={variant}\n data-loading=\"true\"\n >\n <div className=\"ck-tx-history-skeleton\" data-slot=\"tx-history-skeleton\">\n {Array.from({ length: Math.min(limit, 3) }).map((_, i) => (\n <div key={i} className=\"ck-skeleton ck-skeleton--tx\">\n <SkeletonShine />\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n // Error state\n if (error) {\n return (\n <div\n className={`ck-tx-history-block ck-tx-history-block--${variant} ck-tx-history-block--error ${className || ''}`}\n data-slot=\"tx-history-element\"\n data-variant={variant}\n data-error=\"true\"\n >\n <span className=\"ck-tx-history-error\" data-slot=\"tx-history-error\">\n Failed to load transactions\n </span>\n <button\n type=\"button\"\n className=\"ck-tx-history-retry\"\n onClick={() => refetch()}\n data-slot=\"tx-history-retry\"\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Empty state\n if (transactions.length === 0) {\n return (\n <div\n className={`ck-tx-history-block ck-tx-history-block--${variant} ck-tx-history-block--empty ${className || ''}`}\n data-slot=\"tx-history-element\"\n data-variant={variant}\n data-empty=\"true\"\n >\n <span className=\"ck-tx-history-empty\" data-slot=\"tx-history-empty\">\n No transactions yet\n </span>\n </div>\n );\n }\n\n // Default item renderer\n const defaultRenderItem = (tx: TransactionInfo) => (\n <a\n key={tx.signature}\n href={tx.explorerUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"ck-tx-item\"\n data-slot=\"tx-item\"\n data-status={tx.status}\n >\n <div className=\"ck-tx-item-main\" data-slot=\"tx-item-main\">\n {showStatus && (\n <span\n className={`ck-tx-status ck-tx-status--${tx.status}`}\n data-slot=\"tx-status\"\n data-status={tx.status}\n >\n {statusIcon(tx.status)}\n </span>\n )}\n <span className=\"ck-tx-signature\" data-slot=\"tx-signature\">\n {tx.signature.slice(0, 8)}...{tx.signature.slice(-8)}\n </span>\n </div>\n <div className=\"ck-tx-item-meta\" data-slot=\"tx-item-meta\">\n {showTime && (\n <span className=\"ck-tx-time\" data-slot=\"tx-time\">\n {tx.formattedDate} {tx.formattedTime}\n </span>\n )}\n {externalLinkIcon}\n </div>\n </a>\n );\n\n const itemRenderer = renderItem || defaultRenderItem;\n\n return (\n <div\n className={`ck-tx-history-block ck-tx-history-block--${variant} ${className || ''}`}\n data-slot=\"tx-history-element\"\n data-variant={variant}\n >\n {variant === 'expanded' && (\n <div className=\"ck-tx-history-header\" data-slot=\"tx-history-header\">\n <span className=\"ck-tx-history-title\" data-slot=\"tx-history-title\">\n Recent Transactions\n </span>\n <span className=\"ck-tx-history-count\" data-slot=\"tx-history-count\">\n {transactions.length}\n </span>\n </div>\n )}\n\n <div className=\"ck-tx-history-list\" data-slot=\"tx-history-list\">\n {transactions.map(itemRenderer)}\n </div>\n\n {showLoadMore && hasMore && (\n <button\n type=\"button\"\n className=\"ck-tx-history-load-more\"\n onClick={() => loadMore()}\n disabled={isLoading}\n data-slot=\"tx-history-load-more\"\n >\n {isLoading ? 'Loading...' : 'Load more'}\n </button>\n )}\n </div>\n );\n}\n\nTransactionHistoryElement.displayName = 'TransactionHistoryElement';\n","'use client';\n\nimport React from 'react';\nimport type { ReactNode } from 'react';\nimport { useTokens, type Token } from '../../hooks/use-tokens';\nimport { SkeletonShine } from './skeleton-shine';\n\nexport interface TokenListElementRenderProps {\n tokens: Token[];\n isLoading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n totalAccounts: number;\n}\n\nexport interface TokenListElementProps {\n /** Maximum number of tokens to display */\n limit?: number;\n /** Show USD value (requires price API integration) */\n showValue?: boolean;\n /** Custom className */\n className?: string;\n /** Display variant */\n variant?: 'compact' | 'expanded' | 'grid';\n /** Show refresh button */\n showRefresh?: boolean;\n /** Show skeleton while loading */\n showSkeleton?: boolean;\n /** Custom render function for full control */\n render?: (props: TokenListElementRenderProps) => ReactNode;\n /** Custom render for individual token item */\n renderItem?: (token: Token) => ReactNode;\n}\n\n/**\n * Element for displaying token holdings.\n *\n * @example Basic usage\n * ```tsx\n * <TokenListElement limit={10} />\n * ```\n *\n * @example Grid layout\n * ```tsx\n * <TokenListElement variant=\"grid\" limit={6} />\n * ```\n *\n * @example Custom item render\n * ```tsx\n * <TokenListElement\n * renderItem={(token) => (\n * <div className=\"token-card\">\n * <img src={token.logo} alt={token.symbol} />\n * <span>{token.formatted}</span>\n * </div>\n * )}\n * />\n * ```\n */\nexport function TokenListElement({\n limit = 10,\n showValue = false,\n className,\n variant = 'compact',\n showRefresh = false,\n showSkeleton = true,\n render,\n renderItem,\n}: TokenListElementProps) {\n const { tokens, isLoading, error, refetch, totalAccounts } = useTokens();\n\n // Custom render\n if (render) {\n return <>{render({ tokens, isLoading, error, refetch, totalAccounts })}</>;\n }\n\n const displayTokens = tokens.slice(0, limit);\n\n const refreshIcon = (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={`ck-block-icon ${isLoading ? 'ck-block-icon--spinning' : ''}`}\n data-slot=\"token-list-refresh-icon\"\n >\n <path d=\"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n <path d=\"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16\" />\n <path d=\"M16 16h5v5\" />\n </svg>\n );\n\n const tokenIcon = (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"ck-token-placeholder-icon\"\n data-slot=\"token-placeholder-icon\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 6v12\" />\n <path d=\"M6 12h12\" />\n </svg>\n );\n\n // Loading skeleton\n if (isLoading && showSkeleton && tokens.length === 0) {\n return (\n <div\n className={`ck-token-list-block ck-token-list-block--${variant} ck-token-list-block--loading ${className || ''}`}\n data-slot=\"token-list-element\"\n data-variant={variant}\n data-loading=\"true\"\n >\n <div className=\"ck-token-list-skeleton\" data-slot=\"token-list-skeleton\">\n {Array.from({ length: Math.min(limit, 3) }).map((_, i) => (\n <div key={i} className=\"ck-skeleton ck-skeleton--token\">\n <SkeletonShine />\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n // Error state\n if (error) {\n return (\n <div\n className={`ck-token-list-block ck-token-list-block--${variant} ck-token-list-block--error ${className || ''}`}\n data-slot=\"token-list-element\"\n data-variant={variant}\n data-error=\"true\"\n >\n <span className=\"ck-token-list-error\" data-slot=\"token-list-error\">\n Failed to load tokens\n </span>\n <button\n type=\"button\"\n className=\"ck-token-list-retry\"\n onClick={() => refetch()}\n data-slot=\"token-list-retry\"\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Empty state\n if (tokens.length === 0) {\n return (\n <div\n className={`ck-token-list-block ck-token-list-block--${variant} ck-token-list-block--empty ${className || ''}`}\n data-slot=\"token-list-element\"\n data-variant={variant}\n data-empty=\"true\"\n >\n <span className=\"ck-token-list-empty\" data-slot=\"token-list-empty\">\n No tokens found\n </span>\n </div>\n );\n }\n\n // Default item renderer\n const defaultRenderItem = (token: Token) => (\n <div key={token.mint} className=\"ck-token-item\" data-slot=\"token-item\">\n <div className=\"ck-token-item-icon\" data-slot=\"token-item-icon\">\n {token.logo ? (\n <img\n src={token.logo}\n alt={token.symbol || 'Token'}\n className=\"ck-token-logo\"\n data-slot=\"token-logo\"\n onError={e => {\n e.currentTarget.style.display = 'none';\n }}\n />\n ) : (\n tokenIcon\n )}\n </div>\n <div className=\"ck-token-item-info\" data-slot=\"token-item-info\">\n <span className=\"ck-token-symbol\" data-slot=\"token-symbol\">\n {token.symbol || token.mint.slice(0, 4) + '...' + token.mint.slice(-4)}\n </span>\n {token.name && (\n <span className=\"ck-token-name\" data-slot=\"token-name\">\n {token.name}\n </span>\n )}\n </div>\n <div className=\"ck-token-item-balance\" data-slot=\"token-item-balance\">\n <span className=\"ck-token-amount\" data-slot=\"token-amount\">\n {token.formatted}\n </span>\n {showValue && (\n <span className=\"ck-token-value\" data-slot=\"token-value\">\n {/* Price integration would go here */}-\n </span>\n )}\n </div>\n </div>\n );\n\n const itemRenderer = renderItem || defaultRenderItem;\n\n return (\n <div\n className={`ck-token-list-block ck-token-list-block--${variant} ${className || ''}`}\n data-slot=\"token-list-element\"\n data-variant={variant}\n >\n {variant === 'expanded' && (\n <div className=\"ck-token-list-header\" data-slot=\"token-list-header\">\n <span className=\"ck-token-list-title\" data-slot=\"token-list-title\">\n Tokens\n </span>\n <span className=\"ck-token-list-count\" data-slot=\"token-list-count\">\n {totalAccounts}\n </span>\n {showRefresh && (\n <button\n type=\"button\"\n className=\"ck-token-list-refresh\"\n onClick={() => refetch()}\n disabled={isLoading}\n data-slot=\"token-list-refresh\"\n >\n {refreshIcon}\n </button>\n )}\n </div>\n )}\n\n <div className={`ck-token-list ${variant === 'grid' ? 'ck-token-list--grid' : ''}`} data-slot=\"token-list\">\n {displayTokens.map(itemRenderer)}\n </div>\n\n {tokens.length > limit && (\n <div className=\"ck-token-list-more\" data-slot=\"token-list-more\">\n +{tokens.length - limit} more tokens\n </div>\n )}\n </div>\n );\n}\n\nTokenListElement.displayName = 'TokenListElement';\n"]}
|