@whetstone-research/doppler-sdk 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/solana/react/providers/AmmContext.tsx","../../../src/solana/react/providers/WalletContext.tsx","../../../src/solana/react/providers/AmmProvider.tsx","../../../src/solana/react/providers/WalletProvider.tsx","../../../src/solana/react/hooks/usePool.ts","../../../src/solana/react/hooks/useSwap.ts","../../../src/solana/react/hooks/useLiquidity.ts","../../../src/solana/react/hooks/usePosition.ts","../../../src/solana/react/hooks/useFees.ts","../../../src/solana/react/hooks/useOracle.ts"],"names":["createContext","CPMM_PROGRAM_ID","useMemo","jsx","useContext","AmmContext","useAmm","createSolanaRpc","AmmProvider","WalletContext","useWallet","WalletProvider","useState","useEffect","useCallback","error","useRef","fetchPool","getSwapQuote","BPS_DENOM","getSwapQuoteExactOut","ratioToNumber","getAddLiquidityQuote","getRemoveLiquidityQuote","fetchPosition","getPendingFees","getPositionValue","fetchUserPositions","MAX_FEE_AMOUNT","createCollectFeesInstruction","createTransactionMessage","setTransactionMessageFeePayerSigner","setTransactionMessageLifetimeUsingBlockhash","appendTransactionMessageInstruction","signTransactionMessageWithSigners","getBase64EncodedWireTransaction","getOracleAddress","fetchOracle","consultTwap","getOracleSpotPrices","getOracleDeviation","getOracleAge","isOracleStale","getOracleBufferStats","comparePoolAndOraclePrices","getOracleForPool"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * AMM Context Provider\n *\n * Provides RPC connection and program configuration for CPMM SDK hooks.\n */\n\nimport { createContext, useContext, useMemo, type ReactNode } from 'react';\nimport type { Address } from '@solana/kit';\nimport type { Rpc, SolanaRpcApi } from '@solana/kit';\nimport { CPMM_PROGRAM_ID } from '../../core/constants.js';\n\n/**\n * Configuration for the AMM provider\n */\nexport interface AmmConfig {\n /** Solana RPC client */\n rpc: Rpc<SolanaRpcApi>;\n /** CPMM Program ID (defaults to mainnet program) */\n programId?: Address;\n /** Default commitment level for queries */\n commitment?: 'processed' | 'confirmed' | 'finalized';\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval?: number;\n /** Default slippage tolerance in basis points (default: 50 = 0.5%) */\n defaultSlippageBps?: number;\n}\n\n/**\n * Context value provided to consumers\n */\nexport interface AmmContextValue extends Required<Omit<AmmConfig, 'rpc'>> {\n /** Solana RPC client */\n rpc: Rpc<SolanaRpcApi>;\n}\n\nexport const AmmContext = createContext<AmmContextValue | null>(null);\n\n/**\n * Props for the AmmProvider component\n */\nexport interface AmmProviderProps extends AmmConfig {\n children: ReactNode;\n}\n\n/**\n * Provider component for CPMM SDK hooks\n *\n * @example\n * ```tsx\n * import { createSolanaRpc } from '@solana/kit';\n *\n * const rpc = createSolanaRpc('https://api.mainnet-beta.solana.com');\n *\n * function App() {\n * return (\n * <AmmProvider rpc={rpc}>\n * <YourApp />\n * </AmmProvider>\n * );\n * }\n * ```\n */\nexport function AmmProvider({\n rpc,\n programId = CPMM_PROGRAM_ID,\n commitment = 'confirmed',\n refreshInterval = 30000,\n defaultSlippageBps = 50,\n children,\n}: AmmProviderProps) {\n const value = useMemo<AmmContextValue>(\n () => ({\n rpc,\n programId,\n commitment,\n refreshInterval,\n defaultSlippageBps,\n }),\n [rpc, programId, commitment, refreshInterval, defaultSlippageBps],\n );\n\n return <AmmContext.Provider value={value}>{children}</AmmContext.Provider>;\n}\n\n/**\n * Hook to access the AMM context\n *\n * @throws Error if used outside of AmmProvider\n */\nexport function useAmm(): AmmContextValue {\n const context = useContext(AmmContext);\n if (!context) {\n throw new Error('useAmm must be used within an AmmProvider');\n }\n return context;\n}\n\n/**\n * Hook to access the AMM context, returning null if not available\n */\nexport function useAmmOptional(): AmmContextValue | null {\n return useContext(AmmContext);\n}\n","/**\n * Wallet Context Provider\n *\n * Provides wallet connection state and transaction signing for CPMM SDK hooks.\n */\n\nimport { createContext, useContext, useMemo, type ReactNode } from 'react';\nimport type { Address } from '@solana/kit';\nimport type { TransactionSigner } from '@solana/kit';\n\n/**\n * Wallet state and capabilities\n */\nexport interface WalletState {\n /** Whether a wallet is connected */\n connected: boolean;\n /** Connected wallet address (undefined if not connected) */\n address?: Address;\n /** Transaction signer (undefined if not connected) */\n signer?: TransactionSigner;\n /** Connect wallet function */\n connect?: () => Promise<void>;\n /** Disconnect wallet function */\n disconnect?: () => Promise<void>;\n}\n\n/**\n * Context value provided to consumers\n */\nexport interface WalletContextValue extends WalletState {\n /** Sign and send a transaction */\n signAndSendTransaction?: (transaction: unknown) => Promise<string>;\n}\n\nexport const WalletContext = createContext<WalletContextValue | null>(null);\n\n/**\n * Props for the WalletProvider component\n */\nexport interface WalletProviderProps {\n /** Wallet state from your wallet adapter */\n wallet: WalletState;\n /** Optional sign and send transaction handler */\n signAndSendTransaction?: WalletContextValue['signAndSendTransaction'];\n children: ReactNode;\n}\n\n/**\n * Provider component for wallet state\n *\n * This provider wraps your existing wallet adapter to provide\n * a consistent interface for CPMM SDK hooks.\n *\n * @example\n * ```tsx\n * // With @solana/wallet-adapter-react\n * import { useWallet } from '@solana/wallet-adapter-react';\n *\n * function WalletBridge({ children }) {\n * const { connected, publicKey, signTransaction } = useWallet();\n *\n * const wallet = useMemo(() => ({\n * connected,\n * address: publicKey?.toBase58() as Address | undefined,\n * signer: signTransaction ? { signTransactions: async (txs) => txs.map(signTransaction) } : undefined,\n * }), [connected, publicKey, signTransaction]);\n *\n * return (\n * <WalletProvider wallet={wallet}>\n * {children}\n * </WalletProvider>\n * );\n * }\n * ```\n */\nexport function WalletProvider({\n wallet,\n signAndSendTransaction,\n children,\n}: WalletProviderProps) {\n const value = useMemo<WalletContextValue>(\n () => ({\n ...wallet,\n signAndSendTransaction,\n }),\n [wallet, signAndSendTransaction],\n );\n\n return (\n <WalletContext.Provider value={value}>{children}</WalletContext.Provider>\n );\n}\n\n/**\n * Hook to access the wallet context\n *\n * @throws Error if used outside of WalletProvider\n */\nexport function useWallet(): WalletContextValue {\n const context = useContext(WalletContext);\n if (!context) {\n throw new Error('useWallet must be used within a WalletProvider');\n }\n return context;\n}\n\n/**\n * Hook to access the wallet context, returning null if not available\n */\nexport function useWalletOptional(): WalletContextValue | null {\n return useContext(WalletContext);\n}\n\n/**\n * Hook to get connected wallet address\n *\n * @throws Error if wallet is not connected\n */\nexport function useWalletAddress(): Address {\n const { connected, address } = useWallet();\n if (!connected || !address) {\n throw new Error('Wallet is not connected');\n }\n return address;\n}\n","/**\n * AMM Context Provider for CPMM SDK\n *\n * Provides RPC connection and program configuration to child components.\n */\nimport { createContext, useContext, useMemo, type ReactNode } from 'react';\nimport type { Address } from '@solana/kit';\nimport type { Rpc, SolanaRpcApi } from '@solana/kit';\nimport { createSolanaRpc } from '@solana/kit';\nimport { CPMM_PROGRAM_ID } from '../../core/constants.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Commitment level for RPC requests\n */\nexport type Commitment = 'processed' | 'confirmed' | 'finalized';\n\n/**\n * AMM context value exposed to consumers\n */\nexport interface AmmContextValue {\n /** RPC client for Solana interactions */\n rpc: Rpc<SolanaRpcApi>;\n /** RPC endpoint URL */\n endpoint: string;\n /** CPMM program ID */\n programId: Address;\n /** Default commitment level */\n commitment: Commitment;\n /** Auto-refresh interval in milliseconds (0 to disable) */\n refreshInterval: number;\n /** Default slippage tolerance in basis points */\n defaultSlippageBps: number;\n}\n\n/**\n * Props for AmmProvider component\n */\nexport interface AmmProviderProps {\n /** Child components */\n children: ReactNode;\n /** Solana RPC endpoint URL */\n endpoint: string;\n /** Custom CPMM program ID (defaults to mainnet program) */\n programId?: Address;\n /** Default commitment level (defaults to 'confirmed') */\n commitment?: Commitment;\n /** Auto-refresh interval in milliseconds (defaults to 30000) */\n refreshInterval?: number;\n /** Default slippage tolerance in basis points (defaults to 50 = 0.5%) */\n defaultSlippageBps?: number;\n}\n\n/**\n * Configuration for creating AMM context value\n */\nexport interface AmmContextConfig {\n /** Solana RPC endpoint URL */\n endpoint: string;\n /** Custom CPMM program ID */\n programId?: Address;\n /** Default commitment level */\n commitment?: Commitment;\n /** Auto-refresh interval in milliseconds */\n refreshInterval?: number;\n /** Default slippage tolerance in basis points */\n defaultSlippageBps?: number;\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\n/**\n * React context for AMM configuration\n */\nexport const AmmContext = createContext<AmmContextValue | null>(null);\n\nAmmContext.displayName = 'AmmContext';\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook to access AMM context\n *\n * @returns AMM context value with RPC client and configuration\n * @throws Error if used outside AmmProvider\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { rpc, programId } = useAmm();\n * // Use rpc to fetch pool data, etc.\n * }\n * ```\n */\nexport function useAmm(): AmmContextValue {\n const ctx = useContext(AmmContext);\n if (!ctx) {\n throw new Error('useAmm must be used within AmmProvider');\n }\n return ctx;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Create AMM context value from configuration\n *\n * This is exposed for testing purposes and internal use.\n *\n * @param config - Configuration for the AMM context\n * @returns AMM context value\n */\nexport function createAmmContextValue(\n config: AmmContextConfig,\n): AmmContextValue {\n const {\n endpoint,\n programId,\n commitment = 'confirmed',\n refreshInterval = 30000,\n defaultSlippageBps = 50,\n } = config;\n\n // Create RPC client using @solana/rpc\n const rpc = createSolanaRpc(endpoint);\n\n return {\n rpc,\n endpoint,\n programId: programId ?? CPMM_PROGRAM_ID,\n commitment,\n refreshInterval,\n defaultSlippageBps,\n };\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\n/**\n * AMM Provider component\n *\n * Provides RPC connection and program configuration to child components.\n *\n * @example\n * ```tsx\n * function App() {\n * return (\n * <AmmProvider endpoint=\"https://api.mainnet-beta.solana.com\">\n * <SwapForm />\n * </AmmProvider>\n * );\n * }\n * ```\n *\n * @example\n * With custom program ID:\n * ```tsx\n * import { address } from '@solana/kit';\n *\n * function App() {\n * return (\n * <AmmProvider\n * endpoint=\"https://api.devnet.solana.com\"\n * programId={address('DevnetProgramId...')}\n * commitment=\"confirmed\"\n * >\n * <SwapForm />\n * </AmmProvider>\n * );\n * }\n * ```\n */\nexport function AmmProvider({\n children,\n endpoint,\n programId,\n commitment = 'confirmed',\n refreshInterval = 30000,\n defaultSlippageBps = 50,\n}: AmmProviderProps): JSX.Element {\n const value = useMemo(\n () =>\n createAmmContextValue({\n endpoint,\n programId,\n commitment,\n refreshInterval,\n defaultSlippageBps,\n }),\n [endpoint, programId, commitment, refreshInterval, defaultSlippageBps],\n );\n\n return <AmmContext.Provider value={value}>{children}</AmmContext.Provider>;\n}\n","/**\n * Wallet Context Provider for CPMM SDK\n *\n * Provides wallet connection state and methods using wallet-standard.\n */\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\nimport type { Wallet, WalletAccount } from '@wallet-standard/base';\nimport type {\n StandardConnectFeature,\n StandardDisconnectFeature,\n} from '@wallet-standard/features';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Wallet with required Solana features\n */\nexport type SolanaWallet = Wallet & {\n features: StandardConnectFeature & Partial<StandardDisconnectFeature>;\n};\n\n/**\n * Wallet context value exposed to consumers\n */\nexport interface WalletContextValue {\n /** Currently selected wallet (null if none selected) */\n wallet: SolanaWallet | null;\n /** Currently connected account (null if not connected) */\n account: WalletAccount | null;\n /** Whether a wallet is currently connected */\n connected: boolean;\n /** Whether connection is in progress */\n connecting: boolean;\n /** List of available wallets */\n wallets: readonly SolanaWallet[];\n /** Select a wallet for connection */\n select: (wallet: SolanaWallet | null) => void;\n /** Connect to the selected wallet */\n connect: () => Promise<void>;\n /** Disconnect from the current wallet */\n disconnect: () => Promise<void>;\n /** Error from last operation */\n error: Error | null;\n}\n\n/**\n * Props for WalletProvider component\n */\nexport interface WalletProviderProps {\n /** Child components */\n children: ReactNode;\n /** Auto-connect to previously connected wallet */\n autoConnect?: boolean;\n /** Callback when wallet connects */\n onConnect?: (account: WalletAccount) => void;\n /** Callback when wallet disconnects */\n onDisconnect?: () => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\n// ============================================================================\n// Wallet Standard Detection\n// ============================================================================\n\n/**\n * Check if a wallet supports the standard:connect feature\n */\nfunction isConnectableWallet(wallet: Wallet): wallet is SolanaWallet {\n return 'standard:connect' in wallet.features;\n}\n\n/**\n * Get available wallets from the wallet-standard registry\n */\nfunction getWallets(): SolanaWallet[] {\n // Check for wallet-standard global registry\n if (typeof window === 'undefined') {\n return [];\n }\n\n const registry = (window as any).navigator?.wallets;\n if (!registry) {\n return [];\n }\n\n // Get registered wallets that support Solana\n const wallets: SolanaWallet[] = [];\n\n try {\n const registered = registry.get?.() ?? [];\n for (const wallet of registered) {\n // Check if wallet supports Solana chains and connect feature\n const supportsSolana = wallet.chains?.some((chain: string) =>\n chain.startsWith('solana:'),\n );\n if (supportsSolana && isConnectableWallet(wallet)) {\n wallets.push(wallet);\n }\n }\n } catch {\n // Registry access failed, return empty array\n }\n\n return wallets;\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\n/**\n * React context for wallet state\n */\nexport const WalletContext = createContext<WalletContextValue | null>(null);\n\nWalletContext.displayName = 'WalletContext';\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook to access wallet context\n *\n * @returns Wallet context value with connection state and methods\n * @throws Error if used outside WalletProvider\n *\n * @example\n * ```tsx\n * function ConnectButton() {\n * const { connected, connect, disconnect, account } = useWallet();\n *\n * if (connected) {\n * return (\n * <button onClick={disconnect}>\n * Disconnect {account?.address.slice(0, 8)}...\n * </button>\n * );\n * }\n *\n * return <button onClick={connect}>Connect Wallet</button>;\n * }\n * ```\n */\nexport function useWallet(): WalletContextValue {\n const ctx = useContext(WalletContext);\n if (!ctx) {\n throw new Error('useWallet must be used within WalletProvider');\n }\n return ctx;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Create initial wallet context value\n *\n * This is exposed for testing purposes.\n */\nexport function createWalletContextValue(): WalletContextValue {\n return {\n wallet: null,\n account: null,\n connected: false,\n connecting: false,\n wallets: [],\n select: () => {},\n connect: async () => {},\n disconnect: async () => {},\n error: null,\n };\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\n/**\n * Wallet Provider component\n *\n * Provides wallet connection state and methods to child components.\n * Uses the wallet-standard API for cross-wallet compatibility.\n *\n * @example\n * ```tsx\n * function App() {\n * return (\n * <WalletProvider autoConnect>\n * <AmmProvider endpoint=\"https://api.mainnet-beta.solana.com\">\n * <SwapForm />\n * </AmmProvider>\n * </WalletProvider>\n * );\n * }\n * ```\n *\n * @example\n * With callbacks:\n * ```tsx\n * function App() {\n * return (\n * <WalletProvider\n * onConnect={(account) => console.log('Connected:', account.address)}\n * onDisconnect={() => console.log('Disconnected')}\n * onError={(err) => console.error('Wallet error:', err)}\n * >\n * <YourApp />\n * </WalletProvider>\n * );\n * }\n * ```\n */\nexport function WalletProvider({\n children,\n autoConnect = false,\n onConnect,\n onDisconnect,\n onError,\n}: WalletProviderProps): JSX.Element {\n // State\n const [wallets, setWallets] = useState<SolanaWallet[]>([]);\n const [wallet, setWallet] = useState<SolanaWallet | null>(null);\n const [account, setAccount] = useState<WalletAccount | null>(null);\n const [connecting, setConnecting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Derived state\n const connected = account !== null;\n\n // Discover available wallets on mount\n useEffect(() => {\n const discovered = getWallets();\n setWallets(discovered);\n\n // Listen for new wallets (wallet-standard events)\n if (typeof window !== 'undefined') {\n const registry = (window as any).navigator?.wallets;\n if (registry?.on) {\n const unsubscribe = registry.on('register', () => {\n setWallets(getWallets());\n });\n return () => {\n unsubscribe?.();\n };\n }\n }\n return undefined;\n }, []);\n\n // Select wallet\n const select = useCallback((newWallet: SolanaWallet | null) => {\n setWallet(newWallet);\n setError(null);\n }, []);\n\n // Connect to selected wallet\n const connect = useCallback(async () => {\n if (!wallet) {\n const err = new Error('No wallet selected');\n setError(err);\n onError?.(err);\n return;\n }\n\n setConnecting(true);\n setError(null);\n\n try {\n const connectFeature = wallet.features['standard:connect'];\n const result = await connectFeature.connect();\n\n if (result.accounts.length > 0) {\n const connectedAccount = result.accounts[0];\n setAccount(connectedAccount);\n onConnect?.(connectedAccount);\n } else {\n throw new Error('No accounts returned from wallet');\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n onError?.(error);\n } finally {\n setConnecting(false);\n }\n }, [wallet, onConnect, onError]);\n\n // Disconnect from wallet\n const disconnect = useCallback(async () => {\n if (!wallet) {\n return;\n }\n\n try {\n const disconnectFeature = wallet.features['standard:disconnect'];\n if (disconnectFeature) {\n await disconnectFeature.disconnect();\n }\n } catch (err) {\n // Disconnect errors are typically not critical\n console.warn('Disconnect error:', err);\n } finally {\n setAccount(null);\n onDisconnect?.();\n }\n }, [wallet, onDisconnect]);\n\n // Auto-connect on mount if enabled\n useEffect(() => {\n if (autoConnect && wallet && !connected && !connecting) {\n // Try silent connect first\n const connectFeature = wallet.features['standard:connect'];\n connectFeature\n .connect({ silent: true })\n .then(\n (\n result: Awaited<\n ReturnType<StandardConnectFeature['standard:connect']['connect']>\n >,\n ) => {\n if (result.accounts.length > 0) {\n setAccount(result.accounts[0]);\n onConnect?.(result.accounts[0]);\n }\n },\n )\n .catch(() => {\n // Silent connect failed, that's okay\n });\n }\n }, [autoConnect, wallet, connected, connecting, onConnect]);\n\n // Listen for account changes\n useEffect(() => {\n if (!wallet) return undefined;\n\n // Listen for standard:events if supported\n const eventsFeature = (wallet.features as any)['standard:events'];\n if (eventsFeature?.on) {\n const unsubscribe = eventsFeature.on('change', () => {\n // Re-check accounts\n if (wallet.accounts.length > 0) {\n setAccount(wallet.accounts[0]);\n } else {\n setAccount(null);\n onDisconnect?.();\n }\n });\n return () => {\n unsubscribe?.();\n };\n }\n return undefined;\n }, [wallet, onDisconnect]);\n\n // Build context value\n const value = useMemo<WalletContextValue>(\n () => ({\n wallet,\n account,\n connected,\n connecting,\n wallets,\n select,\n connect,\n disconnect,\n error,\n }),\n [\n wallet,\n account,\n connected,\n connecting,\n wallets,\n select,\n connect,\n disconnect,\n error,\n ],\n );\n\n return (\n <WalletContext.Provider value={value}>{children}</WalletContext.Provider>\n );\n}\n","/**\n * usePool Hook\n *\n * Fetches and auto-refreshes pool data from the CPMM program.\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport type { Address } from '@solana/kit';\nimport type { Pool } from '../../core/types.js';\nimport { fetchPool } from '../../client/pool.js';\nimport { useAmm } from '../providers/AmmContext.js';\n\n/**\n * Pool data with loading state\n */\nexport interface UsePoolResult {\n /** Pool account data (null if not loaded or not found) */\n pool: Pool | null;\n /** Whether the initial load is in progress */\n loading: boolean;\n /** Error that occurred during fetching */\n error: Error | null;\n /** Manually trigger a refetch */\n refetch: () => Promise<void>;\n /** Whether a refetch is in progress */\n refetching: boolean;\n}\n\n/**\n * Options for usePool hook\n */\nexport interface UsePoolOptions {\n /** Override auto-refresh interval (ms). Set to 0 to disable. */\n refreshInterval?: number;\n /** Whether to fetch immediately on mount. Default: true */\n fetchOnMount?: boolean;\n /** Commitment level override */\n commitment?: 'processed' | 'confirmed' | 'finalized';\n}\n\n/**\n * Hook to fetch and auto-refresh pool data\n *\n * @param poolAddress - Address of the pool to fetch\n * @param options - Optional configuration\n * @returns Pool data with loading/error states\n *\n * @example\n * ```tsx\n * function PoolInfo({ poolAddress }: { poolAddress: Address }) {\n * const { pool, loading, error, refetch } = usePool(poolAddress);\n *\n * if (loading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * if (!pool) return <div>Pool not found</div>;\n *\n * return (\n * <div>\n * <p>Reserve 0: {pool.reserve0.toString()}</p>\n * <p>Reserve 1: {pool.reserve1.toString()}</p>\n * <button onClick={refetch}>Refresh</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function usePool(\n poolAddress: Address | undefined,\n options: UsePoolOptions = {},\n): UsePoolResult {\n const {\n rpc,\n programId,\n commitment: defaultCommitment,\n refreshInterval: defaultRefreshInterval,\n } = useAmm();\n\n const {\n refreshInterval = defaultRefreshInterval,\n fetchOnMount = true,\n commitment = defaultCommitment,\n } = options;\n\n const [pool, setPool] = useState<Pool | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const [refetching, setRefetching] = useState(false);\n\n // Track if component is mounted to avoid state updates after unmount\n const mountedRef = useRef(true);\n\n const fetchPoolData = useCallback(\n async (isRefetch = false) => {\n if (!poolAddress) {\n setPool(null);\n setLoading(false);\n return;\n }\n\n if (isRefetch) {\n setRefetching(true);\n } else {\n setLoading(true);\n }\n setError(null);\n\n try {\n const poolData = await fetchPool(rpc, poolAddress, {\n programId,\n commitment,\n });\n\n if (mountedRef.current) {\n setPool(poolData);\n }\n } catch (err) {\n if (mountedRef.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n setRefetching(false);\n }\n }\n },\n [poolAddress, rpc, programId, commitment],\n );\n\n const refetch = useCallback(async () => {\n await fetchPoolData(true);\n }, [fetchPoolData]);\n\n // Initial fetch\n useEffect(() => {\n mountedRef.current = true;\n\n if (fetchOnMount) {\n fetchPoolData(false);\n }\n\n return () => {\n mountedRef.current = false;\n };\n }, [fetchPoolData, fetchOnMount]);\n\n // Auto-refresh interval\n useEffect(() => {\n if (refreshInterval <= 0 || !poolAddress) {\n return;\n }\n\n const intervalId = setInterval(() => {\n fetchPoolData(true);\n }, refreshInterval);\n\n return () => {\n clearInterval(intervalId);\n };\n }, [fetchPoolData, refreshInterval, poolAddress]);\n\n return {\n pool,\n loading,\n error,\n refetch,\n refetching,\n };\n}\n\n/**\n * Hook to fetch multiple pools\n *\n * @param poolAddresses - Array of pool addresses to fetch\n * @param options - Optional configuration\n * @returns Map of pool address to pool data\n */\nexport function usePools(\n poolAddresses: Address[],\n options: UsePoolOptions = {},\n): {\n pools: Map<Address, Pool>;\n loading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n} {\n const {\n rpc,\n programId,\n commitment: defaultCommitment,\n refreshInterval: defaultRefreshInterval,\n } = useAmm();\n\n const {\n refreshInterval = defaultRefreshInterval,\n fetchOnMount = true,\n commitment = defaultCommitment,\n } = options;\n\n const [pools, setPools] = useState<Map<Address, Pool>>(new Map());\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const mountedRef = useRef(true);\n\n const fetchPools = useCallback(async () => {\n if (poolAddresses.length === 0) {\n setPools(new Map());\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const results = await Promise.all(\n poolAddresses.map((addr) =>\n fetchPool(rpc, addr, { programId, commitment })\n .then((pool) => [addr, pool] as const)\n .catch(() => [addr, null] as const),\n ),\n );\n\n if (mountedRef.current) {\n const poolMap = new Map<Address, Pool>();\n for (const [addr, pool] of results) {\n if (pool) {\n poolMap.set(addr, pool);\n }\n }\n setPools(poolMap);\n }\n } catch (err) {\n if (mountedRef.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n }, [poolAddresses, rpc, programId, commitment]);\n\n useEffect(() => {\n mountedRef.current = true;\n\n if (fetchOnMount) {\n fetchPools();\n }\n\n return () => {\n mountedRef.current = false;\n };\n }, [fetchPools, fetchOnMount]);\n\n useEffect(() => {\n if (refreshInterval <= 0 || poolAddresses.length === 0) {\n return;\n }\n\n const intervalId = setInterval(fetchPools, refreshInterval);\n return () => clearInterval(intervalId);\n }, [fetchPools, refreshInterval, poolAddresses.length]);\n\n return {\n pools,\n loading,\n error,\n refetch: fetchPools,\n };\n}\n","/**\n * useSwap Hook\n *\n * Provides swap quote calculations and execution for the CPMM program.\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport type { Address } from '@solana/kit';\nimport type { Pool, SwapQuote, SwapDirection } from '../../core/types.js';\nimport {\n getSwapQuote,\n getSwapQuoteExactOut,\n ratioToNumber,\n} from '../../core/math.js';\nimport { BPS_DENOM } from '../../core/constants.js';\nimport { useAmm } from '../providers/AmmContext.js';\n\n/**\n * Swap state\n */\nexport interface SwapState {\n /** Input token address */\n inputToken: Address | null;\n /** Output token address */\n outputToken: Address | null;\n /** Input amount (raw bigint) */\n inputAmount: bigint;\n /** Output amount (raw bigint) */\n outputAmount: bigint;\n /** Whether input is exact (vs exact output) */\n exactInput: boolean;\n /** Slippage tolerance in basis points */\n slippageBps: number;\n}\n\n/**\n * Swap quote with additional computed fields\n */\nexport interface SwapQuoteResult extends SwapQuote {\n /** Minimum output amount (after slippage) */\n minAmountOut: bigint;\n /** Maximum input amount (after slippage, for exact output) */\n maxAmountIn: bigint;\n /** Swap direction (0 = token0->token1, 1 = token1->token0) */\n direction: SwapDirection;\n /** Whether the quote is valid */\n isValid: boolean;\n /** Error message if invalid */\n error: string | null;\n}\n\n/**\n * Result from useSwap hook\n */\nexport interface UseSwapResult {\n /** Current swap state */\n state: SwapState;\n /** Computed quote based on current state */\n quote: SwapQuoteResult | null;\n /** Whether a quote calculation is in progress */\n quoting: boolean;\n /** Set input token */\n setInputToken: (token: Address | null) => void;\n /** Set output token */\n setOutputToken: (token: Address | null) => void;\n /** Set input amount */\n setInputAmount: (amount: bigint) => void;\n /** Set output amount (switches to exact output mode) */\n setOutputAmount: (amount: bigint) => void;\n /** Set slippage tolerance */\n setSlippage: (bps: number) => void;\n /** Swap input and output tokens */\n flipTokens: () => void;\n /** Reset all state */\n reset: () => void;\n /** Whether swap can be executed */\n canSwap: boolean;\n}\n\n/**\n * Options for useSwap hook\n */\nexport interface UseSwapOptions {\n /** Initial slippage tolerance in basis points (default: 50 = 0.5%) */\n defaultSlippageBps?: number;\n /** Pool to swap on */\n pool: Pool | null;\n /** Token0 mint address */\n token0Mint: Address | null;\n /** Token1 mint address */\n token1Mint: Address | null;\n}\n\n/**\n * Hook for swap quote calculation and state management\n *\n * @param options - Configuration options\n * @returns Swap state and helpers\n *\n * @example\n * ```tsx\n * function SwapInterface({ pool }: { pool: Pool }) {\n * const {\n * state,\n * quote,\n * setInputAmount,\n * setInputToken,\n * setOutputToken,\n * flipTokens,\n * } = useSwap({\n * pool,\n * token0Mint: pool.token0Mint,\n * token1Mint: pool.token1Mint,\n * });\n *\n * return (\n * <div>\n * <input\n * type=\"number\"\n * onChange={(e) => setInputAmount(BigInt(e.target.value))}\n * />\n * {quote && (\n * <div>\n * Output: {quote.amountOut.toString()}\n * Price Impact: {(quote.priceImpact * 100).toFixed(2)}%\n * </div>\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function useSwap(options: UseSwapOptions): UseSwapResult {\n const { defaultSlippageBps: contextSlippage } = useAmm();\n const {\n defaultSlippageBps = contextSlippage ?? 50,\n pool,\n token0Mint,\n token1Mint,\n } = options;\n\n const [state, setState] = useState<SwapState>({\n inputToken: token0Mint,\n outputToken: token1Mint,\n inputAmount: 0n,\n outputAmount: 0n,\n exactInput: true,\n slippageBps: defaultSlippageBps,\n });\n\n const [quoting] = useState(false);\n\n // Calculate swap direction\n const direction = useMemo<SwapDirection | null>(() => {\n if (!token0Mint || !token1Mint || !state.inputToken) return null;\n if (state.inputToken === token0Mint) return 0;\n if (state.inputToken === token1Mint) return 1;\n return null;\n }, [token0Mint, token1Mint, state.inputToken]);\n\n // Calculate quote\n const quote = useMemo<SwapQuoteResult | null>(() => {\n if (!pool || direction === null) {\n return null;\n }\n\n if (state.exactInput) {\n if (state.inputAmount === 0n) {\n return {\n amountOut: 0n,\n feeTotal: 0n,\n feeDist: 0n,\n feeComp: 0n,\n priceImpact: 0,\n executionPrice: 0,\n minAmountOut: 0n,\n maxAmountIn: 0n,\n direction,\n isValid: false,\n error: null,\n };\n }\n\n try {\n const swapQuote = getSwapQuote(pool, state.inputAmount, direction);\n\n // Calculate min output with slippage\n const slippageFactor = BPS_DENOM - BigInt(state.slippageBps);\n const minAmountOut = (swapQuote.amountOut * slippageFactor) / BPS_DENOM;\n\n return {\n ...swapQuote,\n minAmountOut,\n maxAmountIn: state.inputAmount,\n direction,\n isValid: swapQuote.amountOut > 0n,\n error: null,\n };\n } catch (err) {\n return {\n amountOut: 0n,\n feeTotal: 0n,\n feeDist: 0n,\n feeComp: 0n,\n priceImpact: 0,\n executionPrice: 0,\n minAmountOut: 0n,\n maxAmountIn: 0n,\n direction,\n isValid: false,\n error:\n err instanceof Error ? err.message : 'Failed to calculate quote',\n };\n }\n } else {\n // Exact output mode\n if (state.outputAmount === 0n) {\n return {\n amountOut: 0n,\n feeTotal: 0n,\n feeDist: 0n,\n feeComp: 0n,\n priceImpact: 0,\n executionPrice: 0,\n minAmountOut: 0n,\n maxAmountIn: 0n,\n direction,\n isValid: false,\n error: null,\n };\n }\n\n try {\n const { amountIn, feeTotal } = getSwapQuoteExactOut(\n pool,\n state.outputAmount,\n direction,\n );\n\n // Calculate max input with slippage\n const slippageFactor = BPS_DENOM + BigInt(state.slippageBps);\n const maxAmountIn = (amountIn * slippageFactor) / BPS_DENOM;\n\n // Get price impact from forward quote\n const forwardQuote = getSwapQuote(pool, amountIn, direction);\n\n return {\n amountOut: state.outputAmount,\n feeTotal,\n feeDist: 0n, // Not calculated for exact out\n feeComp: 0n,\n priceImpact: forwardQuote.priceImpact,\n executionPrice: ratioToNumber(state.outputAmount, amountIn),\n minAmountOut: state.outputAmount,\n maxAmountIn,\n direction,\n isValid: amountIn > 0n,\n error: null,\n };\n } catch (err) {\n return {\n amountOut: 0n,\n feeTotal: 0n,\n feeDist: 0n,\n feeComp: 0n,\n priceImpact: 0,\n executionPrice: 0,\n minAmountOut: 0n,\n maxAmountIn: 0n,\n direction,\n isValid: false,\n error:\n err instanceof Error ? err.message : 'Failed to calculate quote',\n };\n }\n }\n }, [\n pool,\n direction,\n state.inputAmount,\n state.outputAmount,\n state.exactInput,\n state.slippageBps,\n ]);\n\n const setInputToken = useCallback((token: Address | null) => {\n setState((s) => ({ ...s, inputToken: token }));\n }, []);\n\n const setOutputToken = useCallback((token: Address | null) => {\n setState((s) => ({ ...s, outputToken: token }));\n }, []);\n\n const setInputAmount = useCallback((amount: bigint) => {\n setState((s) => ({\n ...s,\n inputAmount: amount,\n exactInput: true,\n }));\n }, []);\n\n const setOutputAmount = useCallback((amount: bigint) => {\n setState((s) => ({\n ...s,\n outputAmount: amount,\n exactInput: false,\n }));\n }, []);\n\n const setSlippage = useCallback((bps: number) => {\n setState((s) => ({ ...s, slippageBps: bps }));\n }, []);\n\n const flipTokens = useCallback(() => {\n setState((s) => ({\n ...s,\n inputToken: s.outputToken,\n outputToken: s.inputToken,\n inputAmount: s.outputAmount,\n outputAmount: s.inputAmount,\n }));\n }, []);\n\n const reset = useCallback(() => {\n setState({\n inputToken: token0Mint,\n outputToken: token1Mint,\n inputAmount: 0n,\n outputAmount: 0n,\n exactInput: true,\n slippageBps: defaultSlippageBps,\n });\n }, [token0Mint, token1Mint, defaultSlippageBps]);\n\n const canSwap = useMemo(() => {\n return !!(\n quote?.isValid &&\n state.inputToken &&\n state.outputToken &&\n (state.exactInput ? state.inputAmount > 0n : state.outputAmount > 0n)\n );\n }, [quote, state]);\n\n return {\n state,\n quote,\n quoting,\n setInputToken,\n setOutputToken,\n setInputAmount,\n setOutputAmount,\n setSlippage,\n flipTokens,\n reset,\n canSwap,\n };\n}\n","/**\n * useLiquidity Hook\n *\n * Provides liquidity quote calculations for adding/removing liquidity.\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport type {\n Pool,\n AddLiquidityQuote,\n RemoveLiquidityQuote,\n} from '../../core/types.js';\nimport {\n getAddLiquidityQuote,\n getRemoveLiquidityQuote,\n} from '../../core/math.js';\nimport { BPS_DENOM } from '../../core/constants.js';\nimport { useAmm } from '../providers/AmmContext.js';\n\n/**\n * Liquidity operation mode\n */\nexport type LiquidityMode = 'add' | 'remove';\n\n/**\n * Add liquidity state\n */\nexport interface AddLiquidityState {\n /** Amount of token0 to deposit */\n amount0: bigint;\n /** Amount of token1 to deposit */\n amount1: bigint;\n /** Slippage tolerance in basis points */\n slippageBps: number;\n}\n\n/**\n * Remove liquidity state\n */\nexport interface RemoveLiquidityState {\n /** Shares to burn */\n shares: bigint;\n /** Percentage of position to remove (0-100) */\n percentage: number;\n /** Slippage tolerance in basis points */\n slippageBps: number;\n}\n\n/**\n * Add liquidity quote with computed fields\n */\nexport interface AddLiquidityQuoteResult extends AddLiquidityQuote {\n /** Minimum shares to receive (after slippage) */\n minSharesOut: bigint;\n /** Whether the quote is valid */\n isValid: boolean;\n /** Error message if invalid */\n error: string | null;\n}\n\n/**\n * Remove liquidity quote with computed fields\n */\nexport interface RemoveLiquidityQuoteResult extends RemoveLiquidityQuote {\n /** Minimum token0 to receive (after slippage) */\n minAmount0Out: bigint;\n /** Minimum token1 to receive (after slippage) */\n minAmount1Out: bigint;\n /** Whether the quote is valid */\n isValid: boolean;\n /** Error message if invalid */\n error: string | null;\n}\n\n/**\n * Result from useLiquidity hook\n */\nexport interface UseLiquidityResult {\n /** Current mode (add or remove) */\n mode: LiquidityMode;\n /** Set mode */\n setMode: (mode: LiquidityMode) => void;\n\n // Add liquidity\n /** Add liquidity state */\n addState: AddLiquidityState;\n /** Add liquidity quote */\n addQuote: AddLiquidityQuoteResult | null;\n /** Set amount0 for add */\n setAmount0: (amount: bigint) => void;\n /** Set amount1 for add */\n setAmount1: (amount: bigint) => void;\n /** Whether can add liquidity */\n canAdd: boolean;\n\n // Remove liquidity\n /** Remove liquidity state */\n removeState: RemoveLiquidityState;\n /** Remove liquidity quote */\n removeQuote: RemoveLiquidityQuoteResult | null;\n /** Set shares for remove */\n setShares: (shares: bigint) => void;\n /** Set percentage for remove (calculates shares from position) */\n setPercentage: (percentage: number) => void;\n /** Whether can remove liquidity */\n canRemove: boolean;\n\n /** Set slippage tolerance */\n setSlippage: (bps: number) => void;\n /** Reset all state */\n reset: () => void;\n}\n\n/**\n * Options for useLiquidity hook\n */\nexport interface UseLiquidityOptions {\n /** Pool to add/remove liquidity from */\n pool: Pool | null;\n /** User's current position shares (for remove percentage calculation) */\n userShares?: bigint;\n /** Initial slippage tolerance in basis points (default: 50 = 0.5%) */\n defaultSlippageBps?: number;\n /** Initial mode */\n defaultMode?: LiquidityMode;\n}\n\n/**\n * Hook for liquidity quote calculation and state management\n *\n * @param options - Configuration options\n * @returns Liquidity state and helpers\n *\n * @example\n * ```tsx\n * function LiquidityInterface({ pool, position }) {\n * const {\n * mode,\n * setMode,\n * addState,\n * addQuote,\n * setAmount0,\n * removeState,\n * removeQuote,\n * setPercentage,\n * } = useLiquidity({\n * pool,\n * userShares: position?.shares,\n * });\n *\n * return (\n * <div>\n * <button onClick={() => setMode('add')}>Add</button>\n * <button onClick={() => setMode('remove')}>Remove</button>\n *\n * {mode === 'add' && addQuote && (\n * <div>Shares out: {addQuote.sharesOut.toString()}</div>\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function useLiquidity(options: UseLiquidityOptions): UseLiquidityResult {\n const { defaultSlippageBps: contextSlippage } = useAmm();\n const {\n pool,\n userShares = 0n,\n defaultSlippageBps = contextSlippage ?? 50,\n defaultMode = 'add',\n } = options;\n\n const [mode, setMode] = useState<LiquidityMode>(defaultMode);\n\n const [addState, setAddState] = useState<AddLiquidityState>({\n amount0: 0n,\n amount1: 0n,\n slippageBps: defaultSlippageBps,\n });\n\n const [removeState, setRemoveState] = useState<RemoveLiquidityState>({\n shares: 0n,\n percentage: 0,\n slippageBps: defaultSlippageBps,\n });\n\n // Calculate add liquidity quote\n const addQuote = useMemo<AddLiquidityQuoteResult | null>(() => {\n if (!pool) {\n return null;\n }\n\n if (addState.amount0 === 0n && addState.amount1 === 0n) {\n return {\n sharesOut: 0n,\n amount0: 0n,\n amount1: 0n,\n poolShare: 0,\n minSharesOut: 0n,\n isValid: false,\n error: null,\n };\n }\n\n try {\n const quote = getAddLiquidityQuote(\n pool,\n addState.amount0,\n addState.amount1,\n );\n\n // Calculate min shares with slippage\n const slippageFactor = BPS_DENOM - BigInt(addState.slippageBps);\n const minSharesOut = (quote.sharesOut * slippageFactor) / BPS_DENOM;\n\n return {\n ...quote,\n minSharesOut,\n isValid: quote.sharesOut > 0n,\n error: null,\n };\n } catch (err) {\n return {\n sharesOut: 0n,\n amount0: 0n,\n amount1: 0n,\n poolShare: 0,\n minSharesOut: 0n,\n isValid: false,\n error: err instanceof Error ? err.message : 'Failed to calculate quote',\n };\n }\n }, [pool, addState.amount0, addState.amount1, addState.slippageBps]);\n\n // Calculate remove liquidity quote\n const removeQuote = useMemo<RemoveLiquidityQuoteResult | null>(() => {\n if (!pool) {\n return null;\n }\n\n if (removeState.shares === 0n) {\n return {\n amount0: 0n,\n amount1: 0n,\n minAmount0Out: 0n,\n minAmount1Out: 0n,\n isValid: false,\n error: null,\n };\n }\n\n try {\n const quote = getRemoveLiquidityQuote(pool, removeState.shares);\n\n // Calculate min amounts with slippage\n const slippageFactor = BPS_DENOM - BigInt(removeState.slippageBps);\n const minAmount0Out = (quote.amount0 * slippageFactor) / BPS_DENOM;\n const minAmount1Out = (quote.amount1 * slippageFactor) / BPS_DENOM;\n\n return {\n ...quote,\n minAmount0Out,\n minAmount1Out,\n isValid: quote.amount0 > 0n || quote.amount1 > 0n,\n error: null,\n };\n } catch (err) {\n return {\n amount0: 0n,\n amount1: 0n,\n minAmount0Out: 0n,\n minAmount1Out: 0n,\n isValid: false,\n error: err instanceof Error ? err.message : 'Failed to calculate quote',\n };\n }\n }, [pool, removeState.shares, removeState.slippageBps]);\n\n const setAmount0 = useCallback((amount: bigint) => {\n setAddState((s) => ({ ...s, amount0: amount }));\n }, []);\n\n const setAmount1 = useCallback((amount: bigint) => {\n setAddState((s) => ({ ...s, amount1: amount }));\n }, []);\n\n const setShares = useCallback(\n (shares: bigint) => {\n setRemoveState((s) => ({\n ...s,\n shares,\n percentage: userShares > 0n ? Number((shares * 100n) / userShares) : 0,\n }));\n },\n [userShares],\n );\n\n const setPercentage = useCallback(\n (percentage: number) => {\n const clampedPercentage = Math.min(100, Math.max(0, percentage));\n const shares =\n (userShares * BigInt(Math.round(clampedPercentage))) / 100n;\n setRemoveState((s) => ({\n ...s,\n shares,\n percentage: clampedPercentage,\n }));\n },\n [userShares],\n );\n\n const setSlippage = useCallback((bps: number) => {\n setAddState((s) => ({ ...s, slippageBps: bps }));\n setRemoveState((s) => ({ ...s, slippageBps: bps }));\n }, []);\n\n const reset = useCallback(() => {\n setAddState({\n amount0: 0n,\n amount1: 0n,\n slippageBps: defaultSlippageBps,\n });\n setRemoveState({\n shares: 0n,\n percentage: 0,\n slippageBps: defaultSlippageBps,\n });\n }, [defaultSlippageBps]);\n\n const canAdd = useMemo(() => {\n return !!(\n addQuote?.isValid &&\n (addState.amount0 > 0n || addState.amount1 > 0n)\n );\n }, [addQuote, addState]);\n\n const canRemove = useMemo(() => {\n return !!(\n removeQuote?.isValid &&\n removeState.shares > 0n &&\n removeState.shares <= userShares\n );\n }, [removeQuote, removeState.shares, userShares]);\n\n return {\n mode,\n setMode,\n addState,\n addQuote,\n setAmount0,\n setAmount1,\n canAdd,\n removeState,\n removeQuote,\n setShares,\n setPercentage,\n canRemove,\n setSlippage,\n reset,\n };\n}\n","/**\n * usePosition Hook\n *\n * Fetches and manages user position data from the CPMM program.\n */\n\nimport { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport type { Address } from '@solana/kit';\nimport type { Position, Pool } from '../../core/types.js';\nimport {\n fetchPosition,\n fetchUserPositions,\n getPositionValue,\n type PositionWithAddress,\n type PositionValue,\n} from '../../client/position.js';\nimport { fetchPool } from '../../client/pool.js';\nimport { getPendingFees } from '../../core/math.js';\nimport { useAmm } from '../providers/AmmContext.js';\nimport { useWalletOptional } from '../providers/WalletContext.js';\n\n/**\n * Position data with calculated values\n */\nexport interface UsePositionResult {\n /** Position account data (null if not loaded or not found) */\n position: Position | null;\n /** Position address */\n positionAddress?: Address;\n /** Whether the initial load is in progress */\n loading: boolean;\n /** Error that occurred during fetching */\n error: Error | null;\n /** Manually trigger a refetch */\n refetch: () => Promise<void>;\n /** Pending uncollected fees */\n pendingFees: { pending0: bigint; pending1: bigint } | null;\n /** Position value breakdown (requires pool data) */\n value: PositionValue | null;\n}\n\n/**\n * Options for usePosition hook\n */\nexport interface UsePositionOptions {\n /** Override auto-refresh interval (ms). Set to 0 to disable. */\n refreshInterval?: number;\n /** Whether to fetch immediately on mount. Default: true */\n fetchOnMount?: boolean;\n /** Commitment level override */\n commitment?: 'processed' | 'confirmed' | 'finalized';\n /** Pool data (if already fetched) to calculate position value */\n pool?: Pool;\n}\n\n/**\n * Hook to fetch user's position in a pool\n *\n * @param poolAddress - Address of the pool\n * @param positionId - Position ID (default: 0 for first position)\n * @param options - Optional configuration\n * @returns Position data with loading/error states\n *\n * @example\n * ```tsx\n * function MyPosition({ poolAddress }: { poolAddress: Address }) {\n * const { position, loading, error, pendingFees, value } = usePosition(poolAddress);\n *\n * if (loading) return <div>Loading...</div>;\n * if (!position) return <div>No position found</div>;\n *\n * return (\n * <div>\n * <p>Shares: {position.shares.toString()}</p>\n * {pendingFees && (\n * <p>Pending fees: {pendingFees.pending0.toString()} / {pendingFees.pending1.toString()}</p>\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function usePosition(\n poolAddress: Address | undefined,\n positionId: bigint = 0n,\n options: UsePositionOptions = {},\n): UsePositionResult {\n const {\n rpc,\n programId,\n commitment: defaultCommitment,\n refreshInterval: defaultRefreshInterval,\n } = useAmm();\n const wallet = useWalletOptional();\n\n const {\n refreshInterval = defaultRefreshInterval,\n fetchOnMount = true,\n commitment = defaultCommitment,\n pool: providedPool,\n } = options;\n\n const [position, setPosition] = useState<Position | null>(null);\n const [positionAddress, setPositionAddress] = useState<Address | undefined>();\n const [pool, setPool] = useState<Pool | null>(providedPool ?? null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const mountedRef = useRef(true);\n\n const ownerAddress = wallet?.address;\n\n const fetchPositionData = useCallback(async () => {\n if (!poolAddress || !ownerAddress) {\n setPosition(null);\n setPositionAddress(undefined);\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n // Import PDA derivation\n const { getPositionAddress } = await import('../../core/pda.js');\n const [posAddr] = await getPositionAddress(\n poolAddress,\n ownerAddress,\n positionId,\n programId,\n );\n setPositionAddress(posAddr);\n\n // Fetch position and pool in parallel\n const [positionData, poolData] = await Promise.all([\n fetchPosition(rpc, posAddr, { programId, commitment }),\n providedPool\n ? Promise.resolve(providedPool)\n : fetchPool(rpc, poolAddress, { programId, commitment }),\n ]);\n\n if (mountedRef.current) {\n setPosition(positionData);\n setPool(poolData);\n }\n } catch (err) {\n if (mountedRef.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n }, [\n poolAddress,\n ownerAddress,\n positionId,\n rpc,\n programId,\n commitment,\n providedPool,\n ]);\n\n const refetch = useCallback(async () => {\n await fetchPositionData();\n }, [fetchPositionData]);\n\n // Calculate pending fees\n const pendingFees = useMemo(() => {\n if (!pool || !position) return null;\n return getPendingFees(pool, position);\n }, [pool, position]);\n\n // Calculate position value\n const value = useMemo(() => {\n if (!pool || !position) return null;\n return getPositionValue(pool, position);\n }, [pool, position]);\n\n // Initial fetch\n useEffect(() => {\n mountedRef.current = true;\n\n if (fetchOnMount) {\n fetchPositionData();\n }\n\n return () => {\n mountedRef.current = false;\n };\n }, [fetchPositionData, fetchOnMount]);\n\n // Auto-refresh interval\n useEffect(() => {\n if (refreshInterval <= 0 || !poolAddress || !ownerAddress) {\n return;\n }\n\n const intervalId = setInterval(fetchPositionData, refreshInterval);\n return () => clearInterval(intervalId);\n }, [fetchPositionData, refreshInterval, poolAddress, ownerAddress]);\n\n return {\n position,\n positionAddress,\n loading,\n error,\n refetch,\n pendingFees,\n value,\n };\n}\n\n/**\n * Result for useUserPositions hook\n */\nexport interface UseUserPositionsResult {\n /** Array of user positions with addresses */\n positions: PositionWithAddress[];\n /** Whether loading */\n loading: boolean;\n /** Error if any */\n error: Error | null;\n /** Manually trigger refetch */\n refetch: () => Promise<void>;\n}\n\n/**\n * Hook to fetch all positions for the connected user\n *\n * @param poolFilter - Optional pool address to filter positions\n * @param options - Optional configuration\n * @returns Array of user positions\n *\n * @example\n * ```tsx\n * function AllPositions() {\n * const { positions, loading } = useUserPositions();\n *\n * if (loading) return <div>Loading...</div>;\n *\n * return (\n * <ul>\n * {positions.map(({ address, account }) => (\n * <li key={address}>\n * Pool: {account.pool} - Shares: {account.shares.toString()}\n * </li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useUserPositions(\n poolFilter?: Address,\n options: Omit<UsePositionOptions, 'pool'> = {},\n): UseUserPositionsResult {\n const {\n rpc,\n programId,\n commitment: defaultCommitment,\n refreshInterval: defaultRefreshInterval,\n } = useAmm();\n const wallet = useWalletOptional();\n\n const {\n refreshInterval = defaultRefreshInterval,\n fetchOnMount = true,\n commitment = defaultCommitment,\n } = options;\n\n const [positions, setPositions] = useState<PositionWithAddress[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const mountedRef = useRef(true);\n const ownerAddress = wallet?.address;\n\n const fetchPositions = useCallback(async () => {\n if (!ownerAddress) {\n setPositions([]);\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const positionsData = await fetchUserPositions(\n rpc,\n ownerAddress,\n poolFilter,\n {\n programId,\n commitment,\n },\n );\n\n if (mountedRef.current) {\n // Filter out positions with zero shares by default\n setPositions(positionsData.filter((p) => p.account.shares > 0n));\n }\n } catch (err) {\n if (mountedRef.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n }, [ownerAddress, poolFilter, rpc, programId, commitment]);\n\n useEffect(() => {\n mountedRef.current = true;\n\n if (fetchOnMount) {\n fetchPositions();\n }\n\n return () => {\n mountedRef.current = false;\n };\n }, [fetchPositions, fetchOnMount]);\n\n useEffect(() => {\n if (refreshInterval <= 0 || !ownerAddress) {\n return;\n }\n\n const intervalId = setInterval(fetchPositions, refreshInterval);\n return () => clearInterval(intervalId);\n }, [fetchPositions, refreshInterval, ownerAddress]);\n\n return {\n positions,\n loading,\n error,\n refetch: fetchPositions,\n };\n}\n","/**\n * useFees Hook\n *\n * Calculates and tracks pending fees for a user's position, with collection capability.\n */\n\nimport { useState, useEffect, useCallback, useMemo, useRef } from 'react';\nimport type { Address } from '@solana/kit';\nimport type { Position, Pool } from '../../core/types.js';\nimport { getPendingFees } from '../../core/math.js';\nimport { fetchPosition } from '../../client/position.js';\nimport { fetchPool } from '../../client/pool.js';\nimport {\n createCollectFeesInstruction,\n MAX_FEE_AMOUNT,\n} from '../../instructions/collectFees.js';\nimport {\n appendTransactionMessageInstruction,\n createTransactionMessage,\n setTransactionMessageLifetimeUsingBlockhash,\n} from '@solana/kit';\nimport {\n setTransactionMessageFeePayerSigner,\n signTransactionMessageWithSigners,\n} from '@solana/kit';\nimport { getBase64EncodedWireTransaction } from '@solana/kit';\nimport { useAmm } from '../providers/AmmContext.js';\nimport { useWalletOptional } from '../providers/WalletContext.js';\n\n/**\n * Transaction status\n */\nexport type TransactionStatus =\n | 'idle'\n | 'signing'\n | 'sending'\n | 'confirming'\n | 'success'\n | 'error';\n\n/**\n * Pending fees data\n */\nexport interface PendingFees {\n /** Pending fees in token0 */\n pending0: bigint;\n /** Pending fees in token1 */\n pending1: bigint;\n /** Whether there are any fees to collect */\n hasFees: boolean;\n}\n\n/**\n * Options for collecting fees\n */\nexport interface CollectFeesOptions {\n /** Maximum amount of token0 to collect (default: all) */\n max0?: bigint;\n /** Maximum amount of token1 to collect (default: all) */\n max1?: bigint;\n /** User's token0 account */\n userToken0: Address;\n /** User's token1 account */\n userToken1: Address;\n}\n\n/**\n * Result from useFees hook\n */\nexport interface UseFeesResult {\n /** Pending fees data */\n fees: PendingFees | null;\n /** Whether loading */\n loading: boolean;\n /** Error if any */\n error: Error | null;\n /** Manually trigger refetch */\n refetch: () => Promise<void>;\n /** Whether a refetch is in progress */\n refetching: boolean;\n\n // Collection functionality\n /** Collect pending fees */\n collect: (options: CollectFeesOptions) => Promise<string>;\n /** Current transaction status */\n status: TransactionStatus;\n /** Transaction error */\n txError: Error | null;\n /** Last transaction signature */\n txSignature: string | null;\n /** Reset transaction status */\n reset: () => void;\n /** Whether fees can be collected */\n canCollect: boolean;\n}\n\n/**\n * Options for useFees hook\n */\nexport interface UseFeesOptions {\n /** Override auto-refresh interval (ms). Set to 0 to disable. */\n refreshInterval?: number;\n /** Whether to fetch immediately on mount. Default: true */\n fetchOnMount?: boolean;\n /** Commitment level override */\n commitment?: 'processed' | 'confirmed' | 'finalized';\n /** Pre-fetched pool data */\n pool?: Pool | null;\n /** Pre-fetched position data */\n position?: Position | null;\n}\n\n/**\n * Hook to calculate and track pending fees for a position\n *\n * @param positionAddress - Address of the position\n * @param poolAddress - Address of the pool (needed if position not provided)\n * @param options - Optional configuration\n * @returns Pending fees with loading/error states\n *\n * @example\n * ```tsx\n * function PositionFees({ positionAddress, poolAddress }: Props) {\n * const { fees, loading, refetch } = useFees(positionAddress, poolAddress);\n *\n * if (loading) return <div>Loading...</div>;\n * if (!fees) return <div>No fees data</div>;\n *\n * return (\n * <div>\n * <p>Token0 fees: {fees.pending0.toString()}</p>\n * <p>Token1 fees: {fees.pending1.toString()}</p>\n * {fees.hasFees && <button onClick={() => {}}>Collect Fees</button>}\n * <button onClick={refetch}>Refresh</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useFees(\n positionAddress: Address | undefined,\n poolAddress: Address | undefined,\n options: UseFeesOptions = {},\n): UseFeesResult {\n const {\n rpc,\n programId,\n commitment: defaultCommitment,\n refreshInterval: defaultRefreshInterval,\n } = useAmm();\n const wallet = useWalletOptional();\n\n const {\n refreshInterval = defaultRefreshInterval,\n fetchOnMount = true,\n commitment = defaultCommitment,\n pool: providedPool,\n position: providedPosition,\n } = options;\n\n const [pool, setPool] = useState<Pool | null>(providedPool ?? null);\n const [position, setPosition] = useState<Position | null>(\n providedPosition ?? null,\n );\n const [loading, setLoading] = useState(true);\n const [refetching, setRefetching] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Transaction state\n const [status, setStatus] = useState<TransactionStatus>('idle');\n const [txError, setTxError] = useState<Error | null>(null);\n const [txSignature, setTxSignature] = useState<string | null>(null);\n\n const mountedRef = useRef(true);\n\n // Update from provided data\n useEffect(() => {\n if (providedPool) setPool(providedPool);\n if (providedPosition) setPosition(providedPosition);\n }, [providedPool, providedPosition]);\n\n // Calculate pending fees\n const fees = useMemo<PendingFees | null>(() => {\n if (!pool || !position) return null;\n\n const { pending0, pending1 } = getPendingFees(pool, position);\n\n return {\n pending0,\n pending1,\n hasFees: pending0 > 0n || pending1 > 0n,\n };\n }, [pool, position]);\n\n const fetchFeesData = useCallback(\n async (isRefetch = false) => {\n // If both pool and position are provided, no need to fetch\n if (providedPool && providedPosition) {\n setLoading(false);\n return;\n }\n\n if (!positionAddress && !providedPosition) {\n setLoading(false);\n return;\n }\n\n if (isRefetch) {\n setRefetching(true);\n } else {\n setLoading(true);\n }\n setError(null);\n\n try {\n // Fetch what we need\n const promises: Promise<any>[] = [];\n\n if (!providedPosition && positionAddress) {\n promises.push(\n fetchPosition(rpc, positionAddress, { programId, commitment }),\n );\n } else {\n promises.push(Promise.resolve(providedPosition));\n }\n\n if (!providedPool && poolAddress) {\n promises.push(fetchPool(rpc, poolAddress, { programId, commitment }));\n } else {\n promises.push(Promise.resolve(providedPool));\n }\n\n const [posData, poolData] = await Promise.all(promises);\n\n if (mountedRef.current) {\n if (posData && !providedPosition) setPosition(posData);\n if (poolData && !providedPool) setPool(poolData);\n }\n } catch (err) {\n if (mountedRef.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n setRefetching(false);\n }\n }\n },\n [\n positionAddress,\n poolAddress,\n providedPool,\n providedPosition,\n rpc,\n programId,\n commitment,\n ],\n );\n\n const refetch = useCallback(async () => {\n await fetchFeesData(true);\n }, [fetchFeesData]);\n\n // Collect fees\n const collect = useCallback(\n async (collectOptions: CollectFeesOptions): Promise<string> => {\n if (\n !pool ||\n !poolAddress ||\n !position ||\n !positionAddress ||\n !wallet?.address\n ) {\n throw new Error('Pool, position, or wallet not available');\n }\n\n if (!wallet.signer) {\n throw new Error('Wallet signer is not available');\n }\n\n setStatus('signing');\n setTxError(null);\n setTxSignature(null);\n\n try {\n const {\n max0 = MAX_FEE_AMOUNT,\n max1 = MAX_FEE_AMOUNT,\n userToken0,\n userToken1,\n } = collectOptions;\n\n // Build the collect fees instruction\n const ix = createCollectFeesInstruction(\n {\n pool: poolAddress,\n position: positionAddress,\n owner: wallet.address,\n authority: pool.authority,\n vault0: pool.vault0,\n vault1: pool.vault1,\n token0Mint: pool.token0Mint,\n token1Mint: pool.token1Mint,\n user0: userToken0,\n user1: userToken1,\n },\n { max0, max1 },\n programId,\n );\n\n const { value: latestBlockhash } = await rpc\n .getLatestBlockhash({ commitment })\n .send();\n\n const baseMessage = createTransactionMessage({ version: 'legacy' });\n const messageWithPayer = setTransactionMessageFeePayerSigner(\n wallet.signer,\n baseMessage,\n );\n const messageWithLifetime = setTransactionMessageLifetimeUsingBlockhash(\n latestBlockhash,\n messageWithPayer,\n );\n const messageWithIx = appendTransactionMessageInstruction(\n ix,\n messageWithLifetime,\n );\n\n setStatus('sending');\n\n const signedTransaction =\n await signTransactionMessageWithSigners(messageWithIx);\n const wireTransaction =\n getBase64EncodedWireTransaction(signedTransaction);\n const signature = await rpc\n .sendTransaction(wireTransaction, { encoding: 'base64' })\n .send();\n\n setStatus('success');\n setTxSignature(signature);\n\n // Refresh fee data after successful collection\n await fetchFeesData(true);\n\n return signature;\n } catch (err) {\n setStatus('error');\n const error = err instanceof Error ? err : new Error(String(err));\n setTxError(error);\n throw error;\n }\n },\n [\n pool,\n poolAddress,\n position,\n positionAddress,\n wallet,\n programId,\n rpc,\n commitment,\n fetchFeesData,\n ],\n );\n\n // Reset transaction status\n const reset = useCallback(() => {\n setStatus('idle');\n setTxError(null);\n setTxSignature(null);\n }, []);\n\n // Can collect check\n const canCollect = useMemo(() => {\n return !!(\n fees?.hasFees &&\n wallet?.connected &&\n wallet?.signer &&\n pool &&\n position\n );\n }, [fees, wallet, pool, position]);\n\n // Initial fetch\n useEffect(() => {\n mountedRef.current = true;\n\n if (fetchOnMount) {\n fetchFeesData(false);\n }\n\n return () => {\n mountedRef.current = false;\n };\n }, [fetchFeesData, fetchOnMount]);\n\n // Auto-refresh interval\n useEffect(() => {\n if (refreshInterval <= 0) {\n return;\n }\n\n const intervalId = setInterval(() => {\n fetchFeesData(true);\n }, refreshInterval);\n\n return () => {\n clearInterval(intervalId);\n };\n }, [fetchFeesData, refreshInterval]);\n\n return {\n fees,\n loading,\n error,\n refetch,\n refetching,\n collect,\n status,\n txError,\n txSignature,\n reset,\n canCollect,\n };\n}\n\n/**\n * Hook to calculate fees from pre-fetched data (no RPC calls)\n *\n * @param pool - Pool data\n * @param position - Position data\n * @returns Pending fees\n */\nexport function useFeesFromData(\n pool: Pool | null | undefined,\n position: Position | null | undefined,\n): PendingFees | null {\n return useMemo<PendingFees | null>(() => {\n if (!pool || !position) return null;\n\n const { pending0, pending1 } = getPendingFees(pool, position);\n\n return {\n pending0,\n pending1,\n hasFees: pending0 > 0n || pending1 > 0n,\n };\n }, [pool, position]);\n}\n","/**\n * useOracle Hook\n *\n * Fetches oracle data and provides TWAP calculations for CPMM pools.\n */\n\nimport { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport type { Address } from '@solana/kit';\nimport type { OracleState, TwapResult, Pool } from '../../core/types.js';\nimport {\n fetchOracle,\n getOracleForPool,\n consultTwap,\n getOracleSpotPrices,\n getOracleDeviation,\n getOracleAge,\n isOracleStale,\n getOracleBufferStats,\n comparePoolAndOraclePrices,\n type OracleWithAddress,\n} from '../../client/oracle.js';\nimport { getOracleAddress } from '../../core/pda.js';\nimport { useAmm } from '../providers/AmmContext.js';\n\n/**\n * Oracle data with computed metrics\n */\nexport interface UseOracleResult {\n /** Oracle state data (null if not loaded or not initialized) */\n oracle: OracleState | null;\n /** Oracle account address */\n oracleAddress: Address | null;\n /** Whether the initial load is in progress */\n loading: boolean;\n /** Error that occurred during fetching */\n error: Error | null;\n /** Manually trigger a refetch */\n refetch: () => Promise<void>;\n\n // TWAP calculations\n /** Calculate TWAP for a given window (seconds) */\n twap: (windowSeconds: number) => TwapResult | null;\n /** Current spot prices from oracle */\n spotPrice: { price0: number; price1: number } | null;\n /** Price deviation metrics */\n deviation: { deviation0: number; deviation1: number } | null;\n\n // Oracle health metrics\n /** Oracle age in seconds */\n age: number | null;\n /** Whether oracle is stale */\n isStale: (maxAgeSeconds: number) => boolean;\n /** Buffer statistics */\n bufferStats: {\n capacity: number;\n filledCount: number;\n currentIndex: number;\n timeSpanSeconds: number;\n } | null;\n\n // Price comparison\n /** Compare oracle price with pool spot price (requires pool data) */\n compareWithPool: (pool: Pool) => {\n poolPrice0: number;\n oraclePrice0: number;\n divergencePct: number;\n } | null;\n}\n\n/**\n * Options for useOracle hook\n */\nexport interface UseOracleOptions {\n /** Override auto-refresh interval (ms). Set to 0 to disable. */\n refreshInterval?: number;\n /** Whether to fetch immediately on mount. Default: true */\n fetchOnMount?: boolean;\n /** Commitment level override */\n commitment?: 'processed' | 'confirmed' | 'finalized';\n}\n\n/**\n * Hook to fetch oracle data and calculate TWAPs\n *\n * @param poolAddress - Address of the pool (oracle is derived from pool)\n * @param options - Optional configuration\n * @returns Oracle data with TWAP calculations\n *\n * @example\n * ```tsx\n * function OracleInfo({ poolAddress }: { poolAddress: Address }) {\n * const { oracle, loading, twap, spotPrice, age, isStale } = useOracle(poolAddress);\n *\n * if (loading) return <div>Loading oracle...</div>;\n * if (!oracle) return <div>Oracle not initialized</div>;\n *\n * const twap5min = twap(300); // 5-minute TWAP\n *\n * return (\n * <div>\n * <p>Spot Price: {spotPrice?.price0.toFixed(6)}</p>\n * <p>5min TWAP: {twap5min?.price0.toFixed(6)}</p>\n * <p>Oracle Age: {age}s {isStale(60) && '(STALE)'}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useOracle(\n poolAddress: Address | undefined,\n options: UseOracleOptions = {},\n): UseOracleResult {\n const {\n rpc,\n programId,\n commitment: defaultCommitment,\n refreshInterval: defaultRefreshInterval,\n } = useAmm();\n\n const {\n refreshInterval = defaultRefreshInterval,\n fetchOnMount = true,\n commitment = defaultCommitment,\n } = options;\n\n const [oracle, setOracle] = useState<OracleState | null>(null);\n const [oracleAddress, setOracleAddress] = useState<Address | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const mountedRef = useRef(true);\n\n const fetchOracleData = useCallback(async () => {\n if (!poolAddress) {\n setOracle(null);\n setOracleAddress(null);\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n // Derive oracle address from pool\n const [oracleAddr] = await getOracleAddress(poolAddress, programId);\n setOracleAddress(oracleAddr);\n\n const oracleData = await fetchOracle(rpc, oracleAddr, {\n programId,\n commitment,\n });\n\n if (mountedRef.current) {\n setOracle(oracleData);\n }\n } catch (err) {\n if (mountedRef.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n }, [poolAddress, rpc, programId, commitment]);\n\n const refetch = useCallback(async () => {\n await fetchOracleData();\n }, [fetchOracleData]);\n\n // TWAP calculation function\n const twap = useCallback(\n (windowSeconds: number): TwapResult | null => {\n if (!oracle || !oracle.initialized) return null;\n return consultTwap(oracle, windowSeconds);\n },\n [oracle],\n );\n\n // Current spot prices\n const spotPrice = useMemo(() => {\n if (!oracle || !oracle.initialized) return null;\n const prices = getOracleSpotPrices(oracle);\n return { price0: prices.price0, price1: prices.price1 };\n }, [oracle]);\n\n // Price deviation\n const deviation = useMemo(() => {\n if (!oracle || !oracle.initialized) return null;\n const dev = getOracleDeviation(oracle);\n return { deviation0: dev.deviation0, deviation1: dev.deviation1 };\n }, [oracle]);\n\n // Oracle age\n const age = useMemo(() => {\n if (!oracle || !oracle.initialized) return null;\n return getOracleAge(oracle);\n }, [oracle]);\n\n // Stale check function\n const isStaleCheck = useCallback(\n (maxAgeSeconds: number): boolean => {\n if (!oracle || !oracle.initialized) return true;\n return isOracleStale(oracle, maxAgeSeconds);\n },\n [oracle],\n );\n\n // Buffer stats\n const bufferStats = useMemo(() => {\n if (!oracle || !oracle.initialized) return null;\n const stats = getOracleBufferStats(oracle);\n return {\n capacity: stats.capacity,\n filledCount: stats.filledCount,\n currentIndex: stats.currentIndex,\n timeSpanSeconds: stats.timeSpanSeconds,\n };\n }, [oracle]);\n\n // Compare with pool function\n const compareWithPool = useCallback(\n (pool: Pool) => {\n if (!oracle || !oracle.initialized) return null;\n return comparePoolAndOraclePrices(pool, oracle);\n },\n [oracle],\n );\n\n // Initial fetch\n useEffect(() => {\n mountedRef.current = true;\n\n if (fetchOnMount) {\n fetchOracleData();\n }\n\n return () => {\n mountedRef.current = false;\n };\n }, [fetchOracleData, fetchOnMount]);\n\n // Auto-refresh interval\n useEffect(() => {\n if (refreshInterval <= 0 || !poolAddress) {\n return;\n }\n\n const intervalId = setInterval(fetchOracleData, refreshInterval);\n return () => clearInterval(intervalId);\n }, [fetchOracleData, refreshInterval, poolAddress]);\n\n return {\n oracle,\n oracleAddress,\n loading,\n error,\n refetch,\n twap,\n spotPrice,\n deviation,\n age,\n isStale: isStaleCheck,\n bufferStats,\n compareWithPool,\n };\n}\n\n/**\n * Hook to get TWAP for a specific window with automatic updates\n *\n * @param poolAddress - Pool address\n * @param windowSeconds - TWAP window in seconds\n * @param options - Optional configuration\n */\nexport function useTwap(\n poolAddress: Address | undefined,\n windowSeconds: number,\n options: UseOracleOptions = {},\n): {\n twap: TwapResult | null;\n loading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n} {\n const { oracle, loading, error, refetch } = useOracle(poolAddress, options);\n\n const twap = useMemo(() => {\n if (!oracle || !oracle.initialized) return null;\n return consultTwap(oracle, windowSeconds);\n }, [oracle, windowSeconds]);\n\n return {\n twap,\n loading,\n error,\n refetch,\n };\n}\n\n/**\n * Hook to fetch oracle data for multiple pools\n */\nexport function useOracles(\n poolAddresses: Address[],\n options: UseOracleOptions = {},\n): {\n oracles: Map<Address, OracleWithAddress>;\n loading: boolean;\n error: Error | null;\n refetch: () => Promise<void>;\n} {\n const {\n rpc,\n programId,\n commitment: defaultCommitment,\n refreshInterval: defaultRefreshInterval,\n } = useAmm();\n\n const {\n refreshInterval = defaultRefreshInterval,\n fetchOnMount = true,\n commitment = defaultCommitment,\n } = options;\n\n const [oracles, setOracles] = useState<Map<Address, OracleWithAddress>>(\n new Map(),\n );\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const mountedRef = useRef(true);\n\n const fetchOracles = useCallback(async () => {\n if (poolAddresses.length === 0) {\n setOracles(new Map());\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const results = await Promise.all(\n poolAddresses.map(async (poolAddr) => {\n try {\n const result = await getOracleForPool(rpc, poolAddr, {\n programId,\n commitment,\n });\n return [poolAddr, result] as const;\n } catch {\n return [poolAddr, null] as const;\n }\n }),\n );\n\n if (mountedRef.current) {\n const oracleMap = new Map<Address, OracleWithAddress>();\n for (const [poolAddr, oracleData] of results) {\n if (oracleData) {\n oracleMap.set(poolAddr, oracleData);\n }\n }\n setOracles(oracleMap);\n }\n } catch (err) {\n if (mountedRef.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n if (mountedRef.current) {\n setLoading(false);\n }\n }\n }, [poolAddresses, rpc, programId, commitment]);\n\n useEffect(() => {\n mountedRef.current = true;\n\n if (fetchOnMount) {\n fetchOracles();\n }\n\n return () => {\n mountedRef.current = false;\n };\n }, [fetchOracles, fetchOnMount]);\n\n useEffect(() => {\n if (refreshInterval <= 0 || poolAddresses.length === 0) {\n return;\n }\n\n const intervalId = setInterval(fetchOracles, refreshInterval);\n return () => clearInterval(intervalId);\n }, [fetchOracles, refreshInterval, poolAddresses.length]);\n\n return {\n oracles,\n loading,\n error,\n refetch: fetchOracles,\n };\n}\n"]}