@solana/connector 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +236 -0
  2. package/dist/{chunk-U64YZRJL.mjs → chunk-3STZXVXD.mjs} +254 -53
  3. package/dist/chunk-3STZXVXD.mjs.map +1 -0
  4. package/dist/{chunk-RIQH5W7D.js → chunk-I64FD2EH.js} +4 -3
  5. package/dist/chunk-I64FD2EH.js.map +1 -0
  6. package/dist/{chunk-CLXM6UEE.js → chunk-JUZVCBAI.js} +91 -85
  7. package/dist/chunk-JUZVCBAI.js.map +1 -0
  8. package/dist/{chunk-D6PZY5G6.js → chunk-NQXK7PGX.js} +30 -26
  9. package/dist/chunk-NQXK7PGX.js.map +1 -0
  10. package/dist/{chunk-N3Q2J2FG.mjs → chunk-QKVL45F6.mjs} +10 -6
  11. package/dist/chunk-QKVL45F6.mjs.map +1 -0
  12. package/dist/{chunk-P5MWBDFG.mjs → chunk-QL3IT3TS.mjs} +4 -3
  13. package/dist/chunk-QL3IT3TS.mjs.map +1 -0
  14. package/dist/{chunk-LUZWUZ5N.js → chunk-ULUYX23Q.js} +268 -67
  15. package/dist/chunk-ULUYX23Q.js.map +1 -0
  16. package/dist/{chunk-YTCSTE3Q.mjs → chunk-VMSZJPR5.mjs} +10 -4
  17. package/dist/chunk-VMSZJPR5.mjs.map +1 -0
  18. package/dist/compat.js +3 -3
  19. package/dist/compat.mjs +1 -1
  20. package/dist/headless.d.mts +2 -2
  21. package/dist/headless.d.ts +2 -2
  22. package/dist/headless.js +120 -120
  23. package/dist/headless.mjs +3 -3
  24. package/dist/index.d.mts +1 -1
  25. package/dist/index.d.ts +1 -1
  26. package/dist/index.js +147 -147
  27. package/dist/index.mjs +4 -4
  28. package/dist/react.d.mts +4 -4
  29. package/dist/react.d.ts +4 -4
  30. package/dist/react.js +28 -28
  31. package/dist/react.mjs +2 -2
  32. package/dist/{wallet-standard-shim-DC_Z7DS-.d.ts → wallet-standard-shim--YcrQNRt.d.ts} +83 -0
  33. package/dist/{wallet-standard-shim-Cp4vF4oo.d.mts → wallet-standard-shim-Dx7H8Ctf.d.mts} +83 -0
  34. package/package.json +1 -1
  35. package/dist/chunk-CLXM6UEE.js.map +0 -1
  36. package/dist/chunk-D6PZY5G6.js.map +0 -1
  37. package/dist/chunk-LUZWUZ5N.js.map +0 -1
  38. package/dist/chunk-N3Q2J2FG.mjs.map +0 -1
  39. package/dist/chunk-P5MWBDFG.mjs.map +0 -1
  40. package/dist/chunk-RIQH5W7D.js.map +0 -1
  41. package/dist/chunk-U64YZRJL.mjs.map +0 -1
  42. package/dist/chunk-YTCSTE3Q.mjs.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/use-balance.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/balance-element.tsx","../src/components/elements/transaction-history-element.tsx","../src/components/elements/token-list-element.tsx"],"names":["jsx","useMemo","React","logger","useCallback","LAMPORTS_PER_SOL","address","useState","toAddress","useRef","toSignature","useEffect","Fragment","jsxs"],"mappings":"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","file":"chunk-U64YZRJL.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';\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?: readonly string[];\n authorizationCache?: unknown;\n chainSelector?: unknown;\n onWalletNotFound?: (wallet: unknown) => 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: readonly `${string}:${string}`[] = [\n 'solana:mainnet',\n 'solana:devnet',\n 'solana:testnet',\n ];\n registerMwa({\n appIdentity: mobile.appIdentity,\n authorizationCache: mobile.authorizationCache ?? (createDefaultAuthorizationCache() as any),\n chains: (mobile.chains ?? defaultChains) as `${string}:${string}`[],\n chainSelector: mobile.chainSelector ?? (createDefaultChainSelector() as any),\n remoteHostAuthority: mobile.remoteHostAuthority,\n onWalletNotFound: mobile.onWalletNotFound ?? createDefaultWalletNotFoundHandler(),\n });\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';\nimport type { UnifiedConfig } from '../config/unified-config';\n\nexport interface UnifiedProviderProps {\n children: ReactNode;\n\n // NEW: Option 1 - Pass UnifiedConfig directly (recommended)\n config?: UnifiedConfig;\n\n // OLD: Option 2 - Pass configs separately (backward compatible)\n connectorConfig?: ConnectorConfig;\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 UnifiedProvider({ children, config, connectorConfig, mobile, providers = [] }: UnifiedProviderProps) {\n // Handle both new and old patterns\n const actualConnectorConfig = config?.connectorConfig ?? connectorConfig;\n const actualMobile = config?.mobile ?? mobile;\n\n // Start with connector provider as the base\n let content = (\n <ConnectorProvider config={actualConnectorConfig} mobile={actualMobile}>\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// Export with practical alias\nexport { UnifiedProvider as AppProvider };\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<NodeJS.Timeout | 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-utils';\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-utils';\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 { useState, useEffect, useCallback, useMemo } from 'react';\nimport { address as toAddress } from '@solana/addresses';\nimport { useAccount } from './use-account';\nimport { useCluster } from './use-cluster';\nimport { useSolanaClient } from './use-kit-solana-client';\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\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 */\n refetch: () => Promise<void>;\n /** Last updated timestamp */\n lastUpdated: Date | null;\n}\n\nconst LAMPORTS_PER_SOL = 1_000_000_000n;\n\nfunction formatSol(lamports: bigint, decimals: number = 4): string {\n const sol = Number(lamports) / Number(LAMPORTS_PER_SOL);\n return (\n sol.toLocaleString(undefined, {\n minimumFractionDigits: 0,\n maximumFractionDigits: decimals,\n }) + ' SOL'\n );\n}\n\n/**\n * Hook for fetching wallet balance (SOL and tokens).\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 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(): UseBalanceReturn {\n const { address, connected } = useAccount();\n const { cluster } = useCluster();\n const client = useSolanaClient();\n\n const [lamports, setLamports] = useState<bigint>(0n);\n const [tokens, setTokens] = useState<TokenBalance[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastUpdated, setLastUpdated] = useState<Date | null>(null);\n\n // Extract the actual client to use as a stable dependency\n const rpcClient = client?.client ?? null;\n\n const fetchBalance = useCallback(async () => {\n if (!connected || !address || !rpcClient) {\n setLamports(0n);\n setTokens([]);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n // Fetch SOL balance using the Kit client\n const rpc = rpcClient.rpc;\n const walletAddress = toAddress(address);\n\n // Get SOL balance\n const balanceResult = await rpc.getBalance(walletAddress).send();\n setLamports(balanceResult.value);\n\n // Fetch token accounts\n try {\n const tokenProgramId = toAddress('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA');\n const tokenAccountsResult = await rpc\n .getTokenAccountsByOwner(walletAddress, { programId: tokenProgramId }, { encoding: 'jsonParsed' })\n .send();\n\n const tokenBalances: TokenBalance[] = [];\n\n for (const account of tokenAccountsResult.value) {\n const parsed = account.account.data as any;\n if (parsed?.parsed?.info) {\n const info = parsed.parsed.info;\n const amount = BigInt(info.tokenAmount?.amount || '0');\n const decimals = info.tokenAmount?.decimals || 0;\n const formatted = (Number(amount) / Math.pow(10, decimals)).toLocaleString(undefined, {\n minimumFractionDigits: 0,\n maximumFractionDigits: Math.min(decimals, 6),\n });\n\n if (amount > 0n) {\n tokenBalances.push({\n mint: info.mint,\n amount,\n decimals,\n formatted,\n });\n }\n }\n }\n\n setTokens(tokenBalances);\n } catch (tokenError) {\n // Token fetch failed but SOL balance succeeded\n console.warn('Failed to fetch token balances:', tokenError);\n setTokens([]);\n }\n\n setLastUpdated(new Date());\n } catch (err) {\n setError(err as Error);\n console.error('Failed to fetch balance:', err);\n } finally {\n setIsLoading(false);\n }\n }, [connected, address, rpcClient]);\n\n // Fetch on mount and when dependencies change\n useEffect(() => {\n fetchBalance();\n }, [fetchBalance]);\n\n // Auto-refresh every 30 seconds when connected\n useEffect(() => {\n if (!connected) return;\n\n const interval = setInterval(fetchBalance, 30000);\n return () => clearInterval(interval);\n }, [connected, fetchBalance]);\n\n const solBalance = useMemo(() => Number(lamports) / Number(LAMPORTS_PER_SOL), [lamports]);\n\n const formattedSol = useMemo(() => formatSol(lamports), [lamports]);\n\n return useMemo(\n () => ({\n solBalance,\n lamports,\n formattedSol,\n tokens,\n isLoading,\n error,\n refetch: fetchBalance,\n lastUpdated,\n }),\n [solBalance, lamports, formattedSol, tokens, isLoading, error, fetchBalance, lastUpdated],\n );\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 } from '@wallet-ui/core';\nimport { useAccount } from './use-account';\nimport { useCluster } from './use-cluster';\nimport { useSolanaClient } from './use-kit-solana-client';\nimport { getTransactionUrl } from '../utils/cluster';\nimport { LAMPORTS_PER_SOL } from '../lib/kit-utils';\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' | '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}\n\nexport interface UseTransactionsOptions {\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\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 */\n refetch: () => Promise<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\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\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 return (\n (accountKey && accountKey.trim() === walletAddress.trim()) ||\n (balance.owner && balance.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 return (\n (accountKey && accountKey.trim() === walletAddress.trim()) ||\n (balance.owner && balance.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\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\n// Cache for token metadata\nconst tokenMetadataCache = new Map<string, { symbol: string; icon: string }>();\n\n/**\n * Fetch token metadata from Jupiter for transaction display\n */\nasync function fetchTokenMetadata(mints: string[]): Promise<Map<string, { symbol: string; icon: string }>> {\n const results = new Map<string, { symbol: string; icon: string }>();\n if (mints.length === 0) return results;\n\n // Check cache\n const uncachedMints: string[] = [];\n for (const mint of mints) {\n const cached = tokenMetadataCache.get(mint);\n if (cached) {\n results.set(mint, cached);\n } else {\n uncachedMints.push(mint);\n }\n }\n\n if (uncachedMints.length === 0) return results;\n\n try {\n const url = new URL('https://lite-api.jup.ag/tokens/v2/search');\n url.searchParams.append('query', uncachedMints.join(','));\n\n const response = await fetch(url.toString(), {\n signal: AbortSignal.timeout(5000),\n });\n\n if (!response.ok) return results;\n\n const items: Array<{ id: string; symbol: string; icon: string }> = await response.json();\n\n for (const item of items) {\n const metadata = { symbol: item.symbol, icon: item.icon };\n results.set(item.id, metadata);\n tokenMetadataCache.set(item.id, metadata);\n }\n } catch (error) {\n console.warn('[useTransactions] Failed to fetch token metadata:', error);\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 { limit = 10, autoRefresh = false, refreshInterval = 60000, fetchDetails = true } = options;\n\n const { address, connected } = useAccount();\n const { cluster } = useCluster();\n const client = useSolanaClient();\n\n const [transactions, setTransactions] = useState<TransactionInfo[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [hasMore, setHasMore] = useState(true);\n const [lastUpdated, setLastUpdated] = useState<Date | null>(null);\n const beforeSignatureRef = useRef<string | undefined>(undefined);\n const prevDepsRef = useRef<{ connected: boolean; address: string | null; cluster: SolanaCluster | null } | null>(\n null,\n );\n\n // Extract the actual client to use as a stable dependency\n const rpcClient = client?.client ?? null;\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 ? JSON.stringify(err) : 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 // 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\n if (hasJupiter || hasOrca || hasRaydium) {\n type = 'swap';\n } else if (hasStake) {\n type = 'stake';\n } else if (hasMetaplex) {\n type = 'nft';\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 (hasTokenProgram) {\n // Token transfer - parse using helper\n const tokenTransfer = parseTokenTransfers(meta, accountKeys, walletAddress);\n\n if (tokenTransfer) {\n type = tokenTransfer.type;\n direction = tokenTransfer.direction;\n tokenMint = tokenTransfer.tokenMint;\n tokenAmount = tokenTransfer.tokenAmount;\n tokenDecimals = tokenTransfer.tokenDecimals;\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 };\n } catch (parseError) {\n console.warn('Failed to parse transaction:', parseError);\n return baseInfo;\n }\n },\n [],\n );\n\n const fetchTransactions = useCallback(\n async (loadMore = false) => {\n if (!connected || !address || !rpcClient || !cluster) {\n setTransactions([]);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const rpc = rpcClient.rpc;\n const walletAddress = toAddress(address);\n\n const signaturesResult = await rpc\n .getSignaturesForAddress(walletAddress, {\n limit,\n ...(loadMore && beforeSignatureRef.current\n ? { before: toSignature(beforeSignatureRef.current) }\n : {}),\n })\n .send();\n\n let newTransactions: TransactionInfo[];\n\n if (fetchDetails && signaturesResult.length > 0) {\n // Fetch full transaction details in parallel\n const txPromises = signaturesResult.map(s =>\n rpc\n .getTransaction(toSignature(String(s.signature)), {\n encoding: 'jsonParsed',\n maxSupportedTransactionVersion: 0,\n })\n .send()\n .catch(() => null),\n );\n\n const txDetails = await Promise.all(txPromises);\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), cluster),\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), cluster),\n };\n });\n }\n\n // Set transactions immediately for fast UI\n if (loadMore) {\n setTransactions(prev => [...prev, ...newTransactions]);\n } else {\n setTransactions(newTransactions);\n }\n\n // Fetch token metadata for transactions that have token mints\n const mintsToFetch = [...new Set(newTransactions.filter(tx => tx.tokenMint).map(tx => tx.tokenMint!))];\n\n if (mintsToFetch.length > 0) {\n const tokenMetadata = await fetchTokenMetadata(mintsToFetch);\n\n // Update transactions with token metadata\n if (tokenMetadata.size > 0) {\n const enrichedTransactions = newTransactions.map(tx => {\n if (tx.tokenMint && tokenMetadata.has(tx.tokenMint)) {\n const meta = tokenMetadata.get(tx.tokenMint)!;\n return {\n ...tx,\n tokenSymbol: meta.symbol,\n tokenIcon: meta.icon,\n // Update formatted amount with symbol\n formattedAmount: tx.formattedAmount\n ? `${tx.formattedAmount} ${meta.symbol}`\n : tx.formattedAmount,\n };\n }\n return tx;\n });\n\n if (loadMore) {\n setTransactions(prev => {\n // Replace only the newly loaded transactions\n const oldTransactions = prev.slice(0, -newTransactions.length);\n return [...oldTransactions, ...enrichedTransactions];\n });\n } else {\n setTransactions(enrichedTransactions);\n }\n }\n }\n\n // Update pagination\n if (typeof newTransactions !== 'undefined' && Array.isArray(newTransactions)) {\n if (newTransactions.length > 0) {\n const newBeforeSignature = newTransactions[newTransactions.length - 1].signature;\n beforeSignatureRef.current = newBeforeSignature;\n }\n setHasMore(newTransactions.length === limit);\n }\n\n setLastUpdated(new Date());\n } catch (err) {\n setError(err as Error);\n console.error('Failed to fetch transactions:', err);\n } finally {\n setIsLoading(false);\n }\n },\n [connected, address, rpcClient, cluster, limit, fetchDetails, parseTransaction],\n );\n\n const refetch = useCallback(async () => {\n beforeSignatureRef.current = undefined;\n await fetchTransactions(false);\n }, [fetchTransactions]);\n\n const loadMoreFn = useCallback(async () => {\n if (hasMore && !isLoading) {\n await fetchTransactions(true);\n }\n }, [hasMore, isLoading, fetchTransactions]);\n\n // Fetch on mount and when dependencies change\n useEffect(() => {\n const prevDeps = prevDepsRef.current;\n const currentDeps = { connected, address, cluster };\n\n // Only reset and fetch if connected, address, or cluster actually changed\n const shouldReset =\n !prevDeps ||\n prevDeps.connected !== connected ||\n prevDeps.address !== address ||\n prevDeps.cluster !== cluster;\n\n if (shouldReset) {\n prevDepsRef.current = currentDeps;\n beforeSignatureRef.current = undefined;\n fetchTransactions(false);\n }\n }, [connected, address, cluster, fetchTransactions]);\n\n // Auto-refresh\n useEffect(() => {\n if (!connected || !autoRefresh) return;\n\n const interval = setInterval(refetch, refreshInterval);\n return () => clearInterval(interval);\n }, [connected, autoRefresh, refreshInterval, refetch]);\n\n return useMemo(\n () => ({\n transactions,\n isLoading,\n error,\n hasMore,\n loadMore: loadMoreFn,\n refetch,\n lastUpdated,\n }),\n [transactions, isLoading, error, hasMore, loadMoreFn, refetch, lastUpdated],\n );\n}\n","'use client';\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { address as toAddress } from '@solana/addresses';\nimport { useAccount } from './use-account';\nimport { useSolanaClient } from './use-kit-solana-client';\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}\n\nexport interface UseTokensOptions {\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) from Jupiter */\n fetchMetadata?: boolean;\n /** Include native SOL balance */\n includeNativeSol?: boolean;\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 */\n refetch: () => Promise<void>;\n /** Last updated timestamp */\n lastUpdated: Date | null;\n /** Total number of token accounts */\n totalAccounts: number;\n}\n\n// Jupiter token metadata response\ninterface JupiterTokenMetadata {\n id: string;\n name: string;\n symbol: string;\n decimals: number;\n icon: string;\n usdPrice: number;\n}\n\n// Native SOL mint address\nconst NATIVE_MINT = 'So11111111111111111111111111111111111111112';\n\n// Cache for metadata (to avoid refetching)\nconst metadataCache = new Map<string, JupiterTokenMetadata>();\n\n/**\n * Fetch token metadata from Jupiter's lite API\n * This API is fast and includes icons + USD prices\n */\nasync function fetchJupiterMetadata(mints: string[]): Promise<Map<string, JupiterTokenMetadata>> {\n const results = new Map<string, JupiterTokenMetadata>();\n\n if (mints.length === 0) return results;\n\n // Check cache first\n const uncachedMints: string[] = [];\n for (const mint of mints) {\n const cached = metadataCache.get(mint);\n if (cached) {\n results.set(mint, cached);\n } else {\n uncachedMints.push(mint);\n }\n }\n\n // If all mints are cached, return early\n if (uncachedMints.length === 0) return results;\n\n try {\n const url = new URL('https://lite-api.jup.ag/tokens/v2/search');\n url.searchParams.append('query', uncachedMints.join(','));\n\n const response = await fetch(url.toString(), {\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) {\n throw new Error(`Jupiter API error: ${response.status}`);\n }\n\n const items: JupiterTokenMetadata[] = await response.json();\n\n for (const item of items) {\n const metadata: JupiterTokenMetadata = {\n id: item.id,\n name: item.id === NATIVE_MINT ? 'Solana' : item.name,\n symbol: item.symbol,\n decimals: item.decimals,\n icon: item.icon,\n usdPrice: item.usdPrice,\n };\n\n results.set(item.id, metadata);\n metadataCache.set(item.id, metadata);\n }\n } catch (error) {\n console.warn('[useTokens] Jupiter API failed:', error);\n }\n\n return results;\n}\n\n/**\n * Format balance for display\n */\nfunction formatBalance(amount: bigint, decimals: number): string {\n const value = Number(amount) / Math.pow(10, decimals);\n return value.toLocaleString(undefined, {\n minimumFractionDigits: 0,\n maximumFractionDigits: Math.min(decimals, 6),\n });\n}\n\n/**\n * Format USD value for display\n */\nfunction formatUsd(amount: bigint, decimals: number, usdPrice: number): string {\n const value = (Number(amount) / Math.pow(10, decimals)) * usdPrice;\n return value.toLocaleString(undefined, {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n}\n\n/**\n * Hook for fetching wallet token holdings.\n * Fetches metadata (name, symbol, icon, USD price) from Jupiter's API.\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 */\nexport function useTokens(options: UseTokensOptions = {}): UseTokensReturn {\n const {\n includeZeroBalance = false,\n autoRefresh = false,\n refreshInterval = 60000,\n fetchMetadata = true,\n includeNativeSol = true,\n } = options;\n\n const { address, connected } = useAccount();\n const client = useSolanaClient();\n\n const [tokens, setTokens] = useState<Token[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [lastUpdated, setLastUpdated] = useState<Date | null>(null);\n const [totalAccounts, setTotalAccounts] = useState(0);\n\n // Extract the actual client to use as a stable dependency\n const rpcClient = client?.client ?? null;\n\n const fetchTokens = useCallback(async () => {\n if (!connected || !address || !rpcClient) {\n setTokens([]);\n setTotalAccounts(0);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const rpc = rpcClient.rpc;\n const walletAddress = toAddress(address);\n const tokenProgramId = toAddress('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA');\n\n // Fetch SOL balance and token accounts in parallel\n const [balanceResult, tokenAccountsResult] = await Promise.all([\n includeNativeSol ? rpc.getBalance(walletAddress).send() : Promise.resolve(null),\n rpc\n .getTokenAccountsByOwner(walletAddress, { programId: tokenProgramId }, { encoding: 'jsonParsed' })\n .send(),\n ]);\n\n const tokenList: Token[] = [];\n const mints: string[] = [];\n\n // Add native SOL if requested\n if (includeNativeSol && balanceResult !== null) {\n const solBalance = balanceResult.value;\n if (includeZeroBalance || solBalance > 0n) {\n tokenList.push({\n mint: NATIVE_MINT,\n tokenAccount: address, // SOL uses wallet address\n amount: solBalance,\n decimals: 9,\n formatted: formatBalance(solBalance, 9),\n isFrozen: false,\n owner: address,\n });\n mints.push(NATIVE_MINT);\n }\n }\n\n // Add SPL tokens\n for (const account of tokenAccountsResult.value) {\n const parsed = account.account.data as any;\n if (parsed?.parsed?.info) {\n const info = parsed.parsed.info;\n const amount = BigInt(info.tokenAmount?.amount || '0');\n const decimals = info.tokenAmount?.decimals || 0;\n\n // Skip zero balance tokens unless requested\n if (!includeZeroBalance && amount === 0n) {\n continue;\n }\n\n tokenList.push({\n mint: info.mint,\n tokenAccount: account.pubkey,\n amount,\n decimals,\n formatted: formatBalance(amount, decimals),\n isFrozen: info.state === 'frozen',\n owner: info.owner,\n });\n\n mints.push(info.mint);\n }\n }\n\n // Set initial tokens immediately so UI is responsive\n setTokens([...tokenList]);\n setTotalAccounts(tokenAccountsResult.value.length + (includeNativeSol ? 1 : 0));\n setLastUpdated(new Date());\n\n // Fetch metadata from Jupiter\n if (fetchMetadata && mints.length > 0) {\n const metadata = await fetchJupiterMetadata(mints);\n\n // Apply metadata to tokens\n for (let i = 0; i < tokenList.length; i++) {\n const meta = metadata.get(tokenList[i].mint);\n if (meta) {\n tokenList[i] = {\n ...tokenList[i],\n name: meta.name,\n symbol: meta.symbol,\n logo: meta.icon,\n usdPrice: meta.usdPrice,\n formattedUsd: formatUsd(tokenList[i].amount, tokenList[i].decimals, meta.usdPrice),\n };\n }\n }\n\n // Sort by USD value (highest first), tokens with metadata first\n tokenList.sort((a, b) => {\n // Tokens with metadata come first\n const metadataSort = (b.logo ? 1 : 0) - (a.logo ? 1 : 0);\n if (metadataSort !== 0) return metadataSort;\n\n // Then sort by USD value\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 setTokens([...tokenList]);\n }\n } catch (err) {\n setError(err as Error);\n console.error('[useTokens] Failed to fetch tokens:', err);\n } finally {\n setIsLoading(false);\n }\n }, [connected, address, rpcClient, includeZeroBalance, fetchMetadata, includeNativeSol]);\n\n // Fetch on mount and when dependencies change\n useEffect(() => {\n fetchTokens();\n }, [fetchTokens]);\n\n // Auto-refresh\n useEffect(() => {\n if (!connected || !autoRefresh) return;\n\n const interval = setInterval(fetchTokens, refreshInterval);\n return () => clearInterval(interval);\n }, [connected, autoRefresh, refreshInterval, fetchTokens]);\n\n return useMemo(\n () => ({\n tokens,\n isLoading,\n error,\n refetch: fetchTokens,\n lastUpdated,\n totalAccounts,\n }),\n [tokens, isLoading, error, fetchTokens, lastUpdated, 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';\nimport type { ReactNode } from 'react';\nimport { useBalance, type TokenBalance } from '../../hooks/use-balance';\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 {showTokens && (\n <>\n <div className=\"ck-skeleton ck-skeleton--text ck-skeleton--short\" />\n <div className=\"ck-skeleton ck-skeleton--text ck-skeleton--short\" />\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';\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 /** 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 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 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({ limit });\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 ))}\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';\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 ))}\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"]}