{"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/instructions/collectFees.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","getCollectFeesInstruction","TOKEN_PROGRAM_ADDRESS","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 */\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 SDK CPMM_PROGRAM_ID) */\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, TradeDirection } 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  /** Trade direction (0 = token0->token1, 1 = token1->token0) */\n  tradeDirection: TradeDirection;\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 trade direction\n  const tradeDirection = useMemo<TradeDirection | 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 || tradeDirection === 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          tradeDirection,\n          isValid: false,\n          error: null,\n        };\n      }\n\n      try {\n        const swapQuote = getSwapQuote(pool, state.inputAmount, tradeDirection);\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          tradeDirection,\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          tradeDirection,\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          tradeDirection,\n          isValid: false,\n          error: null,\n        };\n      }\n\n      try {\n        const { amountIn, feeTotal } = getSwapQuoteExactOut(\n          pool,\n          state.outputAmount,\n          tradeDirection,\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, tradeDirection);\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          tradeDirection,\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          tradeDirection,\n          isValid: false,\n          error:\n            err instanceof Error ? err.message : 'Failed to calculate quote',\n        };\n      }\n    }\n  }, [\n    pool,\n    tradeDirection,\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","import type { Address, Instruction, TransactionSigner } from '@solana/kit';\nimport { createNoopSigner } from '@solana/kit';\nimport { CPMM_PROGRAM_ID, TOKEN_PROGRAM_ADDRESS } from '../core/constants.js';\nimport type { CollectFeesArgs } from '../core/types.js';\nimport { getCollectFeesInstruction } from '../generated/cpmm/instructions/collectFees.js';\n\n/**\n * Accounts required for collect_fees instruction\n */\nexport interface CollectFeesAccounts {\n  /** Pool account (writable) */\n  pool: Address;\n  /** User's position account (writable) */\n  position: Address;\n  /** Position owner (signer) */\n  owner: Address | TransactionSigner;\n  /** Pool authority PDA (read-only) */\n  authority: Address;\n  /** Pool vault for token0 (writable) */\n  vault0: Address;\n  /** Pool vault for token1 (writable) */\n  vault1: Address;\n  /** Token0 mint (read-only) */\n  token0Mint: Address;\n  /** Token1 mint (read-only) */\n  token1Mint: Address;\n  /** User's token0 account (writable) */\n  user0: Address;\n  /** User's token1 account (writable) */\n  user1: Address;\n  /** Token0 program; defaults to tokenProgram or classic SPL Token */\n  token0Program?: Address;\n  /** Token1 program; defaults to tokenProgram or classic SPL Token */\n  token1Program?: Address;\n  /** Shared SPL Token program fallback */\n  tokenProgram?: Address;\n}\n\n/**\n * Create a collect_fees instruction\n *\n * Collects accrued LP fees from a position. Fees are first accrued from the global\n * fee growth, then transferred from the pool vaults to the user's token accounts.\n * You can specify max amounts to partially collect fees.\n *\n * @param accounts - Required accounts for collecting fees\n * @param args - Instruction arguments (max0, max1)\n * @param programId - Program ID (defaults to CPMM program)\n * @returns Instruction to collect fees\n *\n * @example\n * ```ts\n * // Collect all accrued fees\n * const ix = createCollectFeesInstruction(\n *   {\n *     pool: poolAddress,\n *     position: positionAddress,\n *     owner: userPublicKey,\n *     authority: authorityPda,\n *     vault0: vault0Address,\n *     vault1: vault1Address,\n *     token0Mint: mint0,\n *     token1Mint: mint1,\n *     user0: userToken0Account,\n *     user1: userToken1Account,\n *   },\n *   {\n *     max0: BigInt('18446744073709551615'), // u64::MAX to collect all\n *     max1: BigInt('18446744073709551615'),\n *   }\n * );\n * ```\n */\nexport function createCollectFeesInstruction(\n  accounts: CollectFeesAccounts,\n  args: CollectFeesArgs,\n  programId: Address = CPMM_PROGRAM_ID,\n): Instruction {\n  const {\n    pool,\n    position,\n    owner,\n    authority,\n    vault0,\n    vault1,\n    token0Mint,\n    token1Mint,\n    user0,\n    user1,\n    token0Program,\n    token1Program,\n    tokenProgram = TOKEN_PROGRAM_ADDRESS,\n  } = accounts;\n  const ownerSigner =\n    typeof owner === 'string' ? createNoopSigner(owner) : owner;\n\n  return getCollectFeesInstruction(\n    {\n      pool,\n      position,\n      owner: ownerSigner,\n      authority,\n      vault0,\n      vault1,\n      token0Mint,\n      token1Mint,\n      user0,\n      user1,\n      token0Program: token0Program ?? tokenProgram,\n      token1Program: token1Program ?? tokenProgram,\n      max0: args.max0,\n      max1: args.max1,\n    },\n    { programAddress: programId },\n  );\n}\n\n/**\n * Convenience constant for collecting all fees (u64::MAX)\n */\nexport const MAX_FEE_AMOUNT = BigInt('18446744073709551615');\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 { TOKEN_PROGRAM_ADDRESS } from '../../core/constants.js';\nimport { fetchPosition } from '../../client/position.js';\nimport { fetchPool } from '../../client/pool.js';\nimport { MAX_FEE_AMOUNT } from '../../instructions/collectFees.js';\nimport { getCollectFeesInstruction } from '../../generated/cpmm/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  /** Token0 program; defaults to tokenProgram or classic SPL Token */\n  token0Program?: Address;\n  /** Token1 program; defaults to tokenProgram or classic SPL Token */\n  token1Program?: Address;\n  /** Shared SPL Token program fallback */\n  tokenProgram?: Address;\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          token0Program,\n          token1Program,\n          tokenProgram,\n          userToken0,\n          userToken1,\n        } = collectOptions;\n\n        // Build the collect fees instruction\n        const ix = getCollectFeesInstruction(\n          {\n            pool: poolAddress,\n            position: positionAddress,\n            owner: wallet.signer,\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            token0Program:\n              token0Program ?? tokenProgram ?? TOKEN_PROGRAM_ADDRESS,\n            token1Program:\n              token1Program ?? tokenProgram ?? TOKEN_PROGRAM_ADDRESS,\n            max0,\n            max1,\n          },\n          { programAddress: 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"]}