@tbookdev/vault-react 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/provider.tsx","../src/hooks/use-vault-info.ts","../src/hooks/use-vault-user.ts","../src/hooks/use-share-price.ts","../src/hooks/use-usdc-balance.ts","../src/hooks/use-transaction-history.ts","../src/hooks/use-vault-actions.ts","../src/components/styles.ts","../src/components/DepositWidget.tsx","../src/components/PortfolioCard.tsx","../src/components/YieldBadge.tsx","../src/components/EpochStatusBadge.tsx","../src/components/VaultErrorBoundary.tsx","../src/components/TransactionHistory.tsx"],"names":["createContext","useConnection","useMemo","TBookVault","jsx","useContext","useQuery","useWallet","getAssociatedTokenAddress","PublicKey","useInfiniteQuery","useQueryClient","useMutation","confirmTransactionWithRetry","useState","useCallback","err","jsxs","Fragment","RpcTimeoutError","VaultPausedError","SharePriceUnavailableError","VaultSdkError","React","explorerUrl"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * TBook Vault React context provider.\n *\n * Wraps your app to provide a shared {@link TBookVault} client instance\n * to all hooks. Must be placed inside Solana wallet adapter providers.\n *\n * ```tsx\n * import { TBookVaultProvider } from \"@tbookdev/vault-react\";\n *\n * <ConnectionProvider endpoint={rpcUrl}>\n * <WalletProvider wallets={wallets}>\n * <TBookVaultProvider network=\"devnet\">\n * <App />\n * </TBookVaultProvider>\n * </WalletProvider>\n * </ConnectionProvider>\n * ```\n *\n * @module provider\n */\n\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport { useConnection } from \"@solana/wallet-adapter-react\";\nimport { TBookVault, type SolanaNetwork } from \"@tbookdev/vault-sdk\";\n\n/** Props for {@link TBookVaultProvider}. */\nexport interface TBookVaultProviderProps {\n /** Solana network. */\n network: SolanaNetwork;\n /** Optional TBook API key for higher rate limits. */\n apiKey?: string;\n /** Optional custom RPC URL (overrides the connection from wallet adapter). */\n rpcUrl?: string;\n children: ReactNode;\n}\n\ninterface TBookVaultContextValue {\n /** The SDK client instance. */\n vault: TBookVault;\n /** Current network. */\n network: SolanaNetwork;\n}\n\nconst TBookVaultContext = createContext<TBookVaultContextValue | null>(null);\n\n/**\n * Provides a shared {@link TBookVault} instance to all descendant hooks.\n *\n * The client is memoized and only re-created when network or rpcUrl changes.\n */\nexport function TBookVaultProvider({\n network,\n apiKey,\n rpcUrl,\n children,\n}: TBookVaultProviderProps) {\n const { connection } = useConnection();\n\n const vault = useMemo(() => {\n return new TBookVault({\n network,\n apiKey,\n // Use the wallet adapter's RPC URL if no explicit rpcUrl provided\n rpcUrl: rpcUrl ?? connection.rpcEndpoint,\n });\n }, [network, apiKey, rpcUrl, connection.rpcEndpoint]);\n\n const value = useMemo(\n () => ({ vault, network }),\n [vault, network],\n );\n\n return (\n <TBookVaultContext.Provider value={value}>\n {children}\n </TBookVaultContext.Provider>\n );\n}\n\n/**\n * Access the TBook Vault SDK client from context.\n *\n * @throws Error if used outside a {@link TBookVaultProvider}\n */\nexport function useTBookVault(): TBookVaultContextValue {\n const ctx = useContext(TBookVaultContext);\n if (!ctx) {\n throw new Error(\n \"useTBookVault must be used within a <TBookVaultProvider>. \" +\n \"Wrap your app with <TBookVaultProvider network=\\\"devnet\\\"> to fix this.\",\n );\n }\n return ctx;\n}\n","/**\n * React Query hook for global vault state.\n *\n * Fetches VaultMirror + current deposit and redeem epochs.\n * Works with or without a connected wallet.\n *\n * @module hooks/use-vault-info\n */\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport type { VaultInfoResult } from \"@tbookdev/vault-sdk\";\nimport { useTBookVault } from \"../provider.js\";\n\n/**\n * Fetch vault state, current deposit epoch, and current redeem epoch.\n *\n * Query key: `[\"tbook\", \"vault\", vaultId]`\n *\n * @param vaultId - Vault identifier (default: \"rcUSDP\")\n */\nexport function useVaultInfo(vaultId?: string) {\n const { vault } = useTBookVault();\n\n return useQuery<VaultInfoResult>({\n queryKey: [\"tbook\", \"vault\", vaultId],\n queryFn: () => vault.getVaultInfo(vaultId),\n staleTime: 30_000,\n refetchInterval: 60_000,\n });\n}\n\n/** Convenience: vault data only. */\nexport function useVault(vaultId?: string) {\n const { data, ...rest } = useVaultInfo(vaultId);\n return { vault: data?.vault ?? null, ...rest };\n}\n\n/** Convenience: current deposit epoch only. */\nexport function useCurrentDepositEpoch(vaultId?: string) {\n const { data, ...rest } = useVaultInfo(vaultId);\n return { epoch: data?.depositEpoch ?? null, ...rest };\n}\n\n/** Convenience: current redeem epoch only. */\nexport function useCurrentRedeemEpoch(vaultId?: string) {\n const { data, ...rest } = useVaultInfo(vaultId);\n return { epoch: data?.redeemEpoch ?? null, ...rest };\n}\n","/**\n * React Query hook for the connected user's vault account.\n *\n * Returns shares, pending operations, claimable USDC, and\n * effective balances (accounting for lazy settlement).\n *\n * Only enabled when a wallet is connected.\n *\n * @module hooks/use-vault-user\n */\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useWallet } from \"@solana/wallet-adapter-react\";\nimport type { UserAccount } from \"@tbookdev/vault-sdk\";\nimport { useTBookVault } from \"../provider.js\";\n\n/**\n * Fetch the connected user's vault account.\n *\n * Query key: `[\"tbook\", \"user\", walletAddress, vaultId]`\n * Only enabled when wallet is connected.\n *\n * @param vaultId - Vault identifier (default: \"rcUSDP\")\n */\nexport function useVaultUser(vaultId?: string) {\n const { vault } = useTBookVault();\n const { publicKey } = useWallet();\n\n return useQuery<UserAccount | null>({\n queryKey: [\"tbook\", \"user\", publicKey?.toString(), vaultId],\n queryFn: () => vault.getUserAccount(publicKey!, vaultId),\n enabled: !!publicKey,\n staleTime: 30_000,\n refetchInterval: 60_000,\n });\n}\n","/**\n * React Query hook for the vault share price from the NAV oracle.\n *\n * Refreshes every 5 minutes. Works without a wallet connection.\n *\n * @module hooks/use-share-price\n */\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport type { SharePriceData } from \"@tbookdev/vault-sdk\";\nimport { useTBookVault } from \"../provider.js\";\n\n/**\n * Fetch current share price and APY.\n *\n * Query key: `[\"tbook\", \"share-price\"]`\n */\nexport function useSharePrice() {\n const { vault } = useTBookVault();\n\n return useQuery<SharePriceData>({\n queryKey: [\"tbook\", \"share-price\"],\n queryFn: () => vault.getSharePrice(),\n staleTime: 60_000,\n refetchInterval: 300_000, // 5 minutes\n retry: 2,\n });\n}\n","/**\n * React Query hook for the connected user's wallet USDC balance.\n *\n * Reads the SPL Associated Token Account for the vault's USDC mint.\n * Only enabled when wallet is connected and vault info is available.\n *\n * @module hooks/use-usdc-balance\n */\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useConnection, useWallet } from \"@solana/wallet-adapter-react\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport { getAssociatedTokenAddress } from \"@solana/spl-token\";\nimport { useVault } from \"./use-vault-info.js\";\n\nasync function fetchUsdcBalance(\n connection: any,\n publicKey: PublicKey,\n usdcMint: PublicKey,\n): Promise<number> {\n try {\n const ata = await getAssociatedTokenAddress(usdcMint, publicKey);\n const balance = await connection.getTokenAccountBalance(ata);\n return balance.value.uiAmount ?? 0;\n } catch {\n return 0; // ATA may not exist yet\n }\n}\n\n/**\n * Fetch the connected user's wallet USDC balance.\n *\n * Query key: `[\"tbook\", \"usdc-balance\", walletAddress]`\n */\nexport function useUsdcBalance() {\n const { connection } = useConnection();\n const { publicKey } = useWallet();\n const { vault } = useVault();\n\n const usdcMint = vault?.usdcMint ?? null;\n\n return useQuery<number>({\n queryKey: [\"tbook\", \"usdc-balance\", publicKey?.toString()],\n queryFn: () =>\n fetchUsdcBalance(\n connection,\n publicKey!,\n usdcMint instanceof PublicKey ? usdcMint : new PublicKey(usdcMint!),\n ),\n enabled: !!publicKey && !!usdcMint,\n staleTime: 30_000,\n refetchInterval: 60_000,\n });\n}\n","/**\n * React Query hook for fetching paginated vault transaction history.\n *\n * Uses `useInfiniteQuery` to provide automatic \"load more\" pagination\n * with cursor-based fetching via transaction signatures.\n *\n * Only enabled when a wallet is connected.\n *\n * @module hooks/use-transaction-history\n */\n\nimport { useInfiniteQuery } from \"@tanstack/react-query\";\nimport { useWallet } from \"@solana/wallet-adapter-react\";\nimport type { VaultTransaction } from \"@tbookdev/vault-sdk\";\nimport { useTBookVault } from \"../provider.js\";\n\nexport interface UseTransactionHistoryOptions {\n /** Maximum transactions per page (default: 20). */\n limit?: number;\n /** Vault identifier (default: \"rcUSDP\"). */\n vaultId?: string;\n}\n\n/**\n * Fetch paginated vault transaction history for the connected wallet.\n *\n * Query key: `[\"tbook\", \"history\", walletAddress, vaultId]`\n *\n * @param options - Pagination and vault options\n * @returns Infinite query result with pages of VaultTransaction arrays\n */\nexport function useTransactionHistory(options?: UseTransactionHistoryOptions) {\n const { vault } = useTBookVault();\n const { publicKey } = useWallet();\n\n const limit = options?.limit ?? 20;\n const vaultId = options?.vaultId;\n\n return useInfiniteQuery<VaultTransaction[]>({\n queryKey: [\"tbook\", \"history\", publicKey?.toString(), vaultId],\n queryFn: ({ pageParam }) =>\n vault.getTransactionHistory(\n publicKey!,\n { limit, before: pageParam as string | undefined },\n vaultId,\n ),\n initialPageParam: undefined as string | undefined,\n getNextPageParam: (lastPage) =>\n lastPage.length > 0\n ? lastPage[lastPage.length - 1].signature\n : undefined,\n enabled: !!publicKey,\n staleTime: 60_000,\n });\n}\n","/**\n * Transaction mutation hooks for vault operations.\n *\n * Each mutation:\n * 1. Builds an unsigned transaction via vault-sdk\n * 2. Sends it to the connected wallet for signing\n * 3. Confirms with retry (exponential backoff, expiry detection)\n * 4. Invalidates relevant queries on success\n *\n * All hooks require a connected wallet (via @solana/wallet-adapter-react).\n *\n * @module hooks/use-vault-actions\n */\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { useConnection, useWallet } from \"@solana/wallet-adapter-react\";\nimport { confirmTransactionWithRetry } from \"@tbookdev/vault-sdk\";\nimport { useTBookVault } from \"../provider.js\";\n\n/**\n * Invalidate all TBook-related queries.\n * Called after any successful mutation.\n */\nfunction useRefreshVaultData() {\n const queryClient = useQueryClient();\n const { publicKey } = useWallet();\n\n return () => {\n queryClient.invalidateQueries({ queryKey: [\"tbook\", \"vault\"] });\n queryClient.invalidateQueries({ queryKey: [\"tbook\", \"share-price\"] });\n if (publicKey) {\n queryClient.invalidateQueries({\n queryKey: [\"tbook\", \"user\", publicKey.toString()],\n });\n queryClient.invalidateQueries({\n queryKey: [\"tbook\", \"usdc-balance\", publicKey.toString()],\n });\n }\n };\n}\n\n/**\n * Deposit USDC into the vault.\n *\n * @param vaultId - Vault identifier (default: \"rcUSDP\")\n *\n * @example\n * ```tsx\n * const { mutate: deposit, isPending } = useDeposit();\n * <button onClick={() => deposit(100)} disabled={isPending}>\n * Deposit $100\n * </button>\n * ```\n */\nexport function useDeposit(vaultId?: string) {\n const { vault } = useTBookVault();\n const { publicKey, sendTransaction } = useWallet();\n const { connection } = useConnection();\n const refreshData = useRefreshVaultData();\n\n return useMutation({\n mutationFn: async (amountUsdc: number) => {\n if (!publicKey) throw new Error(\"Wallet not connected\");\n\n const { transaction, blockhash, lastValidBlockHeight } =\n await vault.buildDeposit({ user: publicKey, amountUsdc }, vaultId);\n const signature = await sendTransaction(transaction, connection);\n\n await confirmTransactionWithRetry({\n connection,\n signature,\n blockhash,\n lastValidBlockHeight,\n });\n return signature;\n },\n onSuccess: () => {\n refreshData();\n },\n });\n}\n\n/**\n * Request redemption of vault shares.\n *\n * @param vaultId - Vault identifier (default: \"rcUSDP\")\n *\n * @example\n * ```tsx\n * const { mutate: redeem, isPending } = useRedeem();\n * <button onClick={() => redeem(50)}>Redeem 50 shares</button>\n * ```\n */\nexport function useRedeem(vaultId?: string) {\n const { vault } = useTBookVault();\n const { publicKey, sendTransaction } = useWallet();\n const { connection } = useConnection();\n const refreshData = useRefreshVaultData();\n\n return useMutation({\n mutationFn: async (shares: number) => {\n if (!publicKey) throw new Error(\"Wallet not connected\");\n\n const { transaction, blockhash, lastValidBlockHeight } =\n await vault.buildRedeem({ user: publicKey, shares }, vaultId);\n const signature = await sendTransaction(transaction, connection);\n\n await confirmTransactionWithRetry({\n connection,\n signature,\n blockhash,\n lastValidBlockHeight,\n });\n return signature;\n },\n onSuccess: () => {\n refreshData();\n },\n });\n}\n\n/**\n * Claim settled USDC from the vault.\n * Works even when the vault is paused.\n *\n * @param vaultId - Vault identifier (default: \"rcUSDP\")\n */\nexport function useClaim(vaultId?: string) {\n const { vault } = useTBookVault();\n const { publicKey, sendTransaction } = useWallet();\n const { connection } = useConnection();\n const refreshData = useRefreshVaultData();\n\n return useMutation({\n mutationFn: async () => {\n if (!publicKey) throw new Error(\"Wallet not connected\");\n\n const { transaction, blockhash, lastValidBlockHeight } =\n await vault.buildClaim({ user: publicKey }, vaultId);\n const signature = await sendTransaction(transaction, connection);\n\n await confirmTransactionWithRetry({\n connection,\n signature,\n blockhash,\n lastValidBlockHeight,\n });\n return signature;\n },\n onSuccess: () => {\n refreshData();\n },\n });\n}\n\n/**\n * Cancel a pending deposit (returns USDC minus 0.1% fee).\n *\n * @param vaultId - Vault identifier (default: \"rcUSDP\")\n */\nexport function useCancelDeposit(vaultId?: string) {\n const { vault } = useTBookVault();\n const { publicKey, sendTransaction } = useWallet();\n const { connection } = useConnection();\n const refreshData = useRefreshVaultData();\n\n return useMutation({\n mutationFn: async () => {\n if (!publicKey) throw new Error(\"Wallet not connected\");\n\n const { transaction, blockhash, lastValidBlockHeight } =\n await vault.buildCancelDeposit({ user: publicKey }, vaultId);\n const signature = await sendTransaction(transaction, connection);\n\n await confirmTransactionWithRetry({\n connection,\n signature,\n blockhash,\n lastValidBlockHeight,\n });\n return signature;\n },\n onSuccess: () => {\n refreshData();\n },\n });\n}\n","/**\n * Base styles for TBook vault components.\n *\n * Uses CSS variables for theming — override these in your app:\n *\n * ```css\n * :root {\n * --tbook-primary: #6366f1;\n * --tbook-primary-hover: #4f46e5;\n * --tbook-bg: #ffffff;\n * --tbook-bg-secondary: #f9fafb;\n * --tbook-text: #111827;\n * --tbook-text-secondary: #6b7280;\n * --tbook-border: #e5e7eb;\n * --tbook-success: #10b981;\n * --tbook-error: #ef4444;\n * --tbook-radius: 8px;\n * --tbook-font: inherit;\n * }\n * ```\n */\n\nexport const baseStyles = {\n container: {\n fontFamily: \"var(--tbook-font, inherit)\",\n color: \"var(--tbook-text, #111827)\",\n background: \"var(--tbook-bg, #ffffff)\",\n border: \"1px solid var(--tbook-border, #e5e7eb)\",\n borderRadius: \"var(--tbook-radius, 8px)\",\n padding: \"16px\",\n },\n label: {\n fontSize: \"12px\",\n fontWeight: 500 as const,\n color: \"var(--tbook-text-secondary, #6b7280)\",\n textTransform: \"uppercase\" as const,\n letterSpacing: \"0.05em\",\n marginBottom: \"4px\",\n },\n value: {\n fontSize: \"24px\",\n fontWeight: 700 as const,\n color: \"var(--tbook-text, #111827)\",\n lineHeight: 1.2,\n },\n smallValue: {\n fontSize: \"14px\",\n fontWeight: 500 as const,\n color: \"var(--tbook-text, #111827)\",\n },\n button: {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"10px 20px\",\n fontSize: \"14px\",\n fontWeight: 600 as const,\n color: \"#ffffff\",\n background: \"var(--tbook-primary, #6366f1)\",\n border: \"none\",\n borderRadius: \"var(--tbook-radius, 8px)\",\n cursor: \"pointer\",\n transition: \"background 0.15s\",\n width: \"100%\",\n },\n buttonDisabled: {\n opacity: 0.5,\n cursor: \"not-allowed\",\n },\n input: {\n width: \"100%\",\n padding: \"10px 12px\",\n fontSize: \"16px\",\n border: \"1px solid var(--tbook-border, #e5e7eb)\",\n borderRadius: \"var(--tbook-radius, 8px)\",\n background: \"var(--tbook-bg, #ffffff)\",\n color: \"var(--tbook-text, #111827)\",\n outline: \"none\",\n boxSizing: \"border-box\" as const,\n },\n badge: {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"4px\",\n padding: \"4px 10px\",\n fontSize: \"13px\",\n fontWeight: 600 as const,\n borderRadius: \"9999px\",\n },\n row: {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n padding: \"8px 0\",\n },\n divider: {\n height: \"1px\",\n background: \"var(--tbook-border, #e5e7eb)\",\n margin: \"12px 0\",\n },\n} as const;\n","/**\n * DepositWidget — Self-contained deposit form.\n *\n * Includes amount input, USDC balance display, validation,\n * and transaction submission. Fully functional out of the box.\n *\n * Usage:\n * ```tsx\n * <DepositWidget />\n * <DepositWidget onSuccess={(sig) => toast(\"Deposited!\")} />\n * ```\n */\n\nimport React, { useState, useCallback } from \"react\";\nimport { useWallet } from \"@solana/wallet-adapter-react\";\nimport { useVault } from \"../hooks/use-vault-info.js\";\nimport { useSharePrice } from \"../hooks/use-share-price.js\";\nimport { useUsdcBalance } from \"../hooks/use-usdc-balance.js\";\nimport { useDeposit } from \"../hooks/use-vault-actions.js\";\nimport { baseStyles } from \"./styles.js\";\n\nexport interface DepositWidgetProps {\n /** Callback on successful deposit. */\n onSuccess?: (signature: string) => void;\n /** Callback on deposit error. */\n onError?: (error: Error) => void;\n /** Override minimum deposit (default from vault config). */\n minAmount?: number;\n /** Override maximum deposit. */\n maxAmount?: number;\n /** Vault ID (default: \"rcUSDP\"). */\n vaultId?: string;\n /** Custom class name. */\n className?: string;\n /** Custom inline styles. */\n style?: React.CSSProperties;\n}\n\nexport function DepositWidget({\n onSuccess,\n onError,\n minAmount,\n maxAmount,\n vaultId,\n className,\n style,\n}: DepositWidgetProps) {\n const { connected } = useWallet();\n const { vault } = useVault(vaultId);\n const { data: price } = useSharePrice();\n const { data: usdcBalance } = useUsdcBalance();\n const deposit = useDeposit(vaultId);\n\n const [amount, setAmount] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n\n const effectiveMin = minAmount ?? vault?.minDeposit ?? 1;\n const effectiveMax = maxAmount ?? vault?.maxEpochDeposit ?? Infinity;\n const amountNum = Number(amount) || 0;\n const estimatedShares = price?.priceNum ? amountNum / price.priceNum : 0;\n const isPaused = vault?.paused ?? false;\n\n const validate = useCallback((): string | null => {\n if (!amount || amountNum <= 0) return \"Enter an amount\";\n if (amountNum < effectiveMin) return `Minimum deposit is ${effectiveMin} USDC`;\n if (amountNum > effectiveMax) return `Maximum deposit is ${effectiveMax} USDC`;\n if (usdcBalance !== undefined && amountNum > usdcBalance) return \"Insufficient USDC balance\";\n if (isPaused) return \"Vault is paused\";\n return null;\n }, [amount, amountNum, effectiveMin, effectiveMax, usdcBalance, isPaused]);\n\n const handleDeposit = async () => {\n const err = validate();\n if (err) { setError(err); return; }\n setError(null);\n try {\n const sig = await deposit.mutateAsync(amountNum);\n setAmount(\"\");\n onSuccess?.(sig);\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err.message);\n onError?.(err);\n }\n };\n\n const handleMax = () => {\n if (usdcBalance !== undefined) {\n const max = Math.min(usdcBalance, effectiveMax);\n setAmount(String(Math.floor(max * 100) / 100));\n }\n };\n\n if (!connected) {\n return (\n <div className={className} style={{ ...baseStyles.container, textAlign: \"center\" as const, ...style }}>\n <p style={{ ...baseStyles.label, marginBottom: 8 }}>Connect wallet to deposit</p>\n </div>\n );\n }\n\n return (\n <div className={className} style={{ ...baseStyles.container, ...style }}>\n {/* Header */}\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginBottom: 16 }}>\n <div style={{ fontSize: 16, fontWeight: 600 }}>Deposit USDC</div>\n {price && (\n <span style={{ ...baseStyles.badge, background: \"var(--tbook-success, #10b981)\", color: \"#fff\", fontSize: 12 }}>\n {price.apy}% APY\n </span>\n )}\n </div>\n\n {/* Amount Input */}\n <div style={{ position: \"relative\", marginBottom: 8 }}>\n <input\n type=\"number\"\n placeholder=\"0.00\"\n value={amount}\n onChange={(e) => { setAmount(e.target.value); setError(null); }}\n style={baseStyles.input}\n min={0}\n step=\"0.01\"\n />\n {usdcBalance !== undefined && (\n <button\n onClick={handleMax}\n style={{\n position: \"absolute\", right: 8, top: \"50%\", transform: \"translateY(-50%)\",\n padding: \"2px 8px\", fontSize: 11, fontWeight: 600,\n background: \"var(--tbook-bg-secondary, #f9fafb)\",\n border: \"1px solid var(--tbook-border, #e5e7eb)\",\n borderRadius: 4, cursor: \"pointer\", color: \"var(--tbook-primary, #6366f1)\",\n }}\n >\n MAX\n </button>\n )}\n </div>\n\n {/* Balance & estimate */}\n <div style={{ ...baseStyles.row, padding: \"4px 0\", marginBottom: 12 }}>\n <span style={{ fontSize: 12, color: \"var(--tbook-text-secondary, #6b7280)\" }}>\n Balance: {usdcBalance !== undefined ? `${usdcBalance.toFixed(2)} USDC` : \"—\"}\n </span>\n {amountNum > 0 && price?.priceNum && (\n <span style={{ fontSize: 12, color: \"var(--tbook-text-secondary, #6b7280)\" }}>\n ≈ {estimatedShares.toFixed(4)} shares\n </span>\n )}\n </div>\n\n {/* Error */}\n {(error || deposit.error) && (\n <div style={{ color: \"var(--tbook-error, #ef4444)\", fontSize: 13, marginBottom: 8 }}>\n {error || deposit.error?.message}\n </div>\n )}\n\n {/* Submit */}\n <button\n onClick={handleDeposit}\n disabled={deposit.isPending || isPaused || !amount}\n style={{\n ...baseStyles.button,\n ...(deposit.isPending || isPaused || !amount ? baseStyles.buttonDisabled : {}),\n }}\n >\n {deposit.isPending ? \"Confirming...\" : isPaused ? \"Vault Paused\" : amountNum > 0 ? `Deposit ${amountNum} USDC` : \"Deposit\"}\n </button>\n\n {/* Success */}\n {deposit.isSuccess && (\n <div style={{ color: \"var(--tbook-success, #10b981)\", fontSize: 13, marginTop: 8, textAlign: \"center\" as const }}>\n Deposit submitted! Settlement typically takes 1-2 days.\n </div>\n )}\n </div>\n );\n}\n","/**\n * PortfolioCard — User's vault portfolio overview.\n *\n * Shows shares balance, portfolio value, pending operations, and claimable USDC.\n * Requires wallet connection and TBookVaultProvider.\n *\n * Usage:\n * ```tsx\n * <PortfolioCard />\n * <PortfolioCard showClaim onClaim={(sig) => console.log(\"Claimed!\", sig)} />\n * ```\n */\n\nimport React from \"react\";\nimport { useVaultUser } from \"../hooks/use-vault-user.js\";\nimport { useSharePrice } from \"../hooks/use-share-price.js\";\nimport { useClaim } from \"../hooks/use-vault-actions.js\";\nimport { useWallet } from \"@solana/wallet-adapter-react\";\nimport { baseStyles } from \"./styles.js\";\n\nexport interface PortfolioCardProps {\n /** Show a Claim button when USDC is claimable. */\n showClaim?: boolean;\n /** Callback after successful claim. */\n onClaim?: (signature: string) => void;\n /** Vault ID (default: \"rcUSDP\"). */\n vaultId?: string;\n /** Custom class name. */\n className?: string;\n /** Custom inline styles. */\n style?: React.CSSProperties;\n}\n\nexport function PortfolioCard({ showClaim, onClaim, vaultId, className, style }: PortfolioCardProps) {\n const { connected } = useWallet();\n const { data: user, isLoading } = useVaultUser(vaultId);\n const { data: price } = useSharePrice();\n const claim = useClaim(vaultId);\n\n if (!connected) {\n return (\n <div className={className} style={{ ...baseStyles.container, textAlign: \"center\" as const, ...style }}>\n <p style={baseStyles.label}>Connect wallet to view portfolio</p>\n </div>\n );\n }\n\n if (isLoading) {\n return (\n <div className={className} style={{ ...baseStyles.container, ...style }}>\n <p style={baseStyles.label}>Loading...</p>\n </div>\n );\n }\n\n if (!user) {\n return (\n <div className={className} style={{ ...baseStyles.container, ...style }}>\n <p style={baseStyles.label}>No vault account found</p>\n </div>\n );\n }\n\n const portfolioValue = (user.effectiveShares ?? user.shares) * (price?.priceNum ?? 1);\n const hasClaimable = (user.effectiveClaimableUsdc ?? user.claimableUsdc) > 0;\n\n const handleClaim = async () => {\n const sig = await claim.mutateAsync(undefined);\n onClaim?.(sig);\n };\n\n return (\n <div className={className} style={{ ...baseStyles.container, ...style }}>\n {/* Portfolio Value */}\n <div style={{ marginBottom: 16 }}>\n <div style={baseStyles.label}>Portfolio Value</div>\n <div style={baseStyles.value}>${portfolioValue.toFixed(2)}</div>\n </div>\n\n <div style={baseStyles.divider} />\n\n {/* Shares Balance */}\n <div style={baseStyles.row}>\n <span style={baseStyles.label}>Shares</span>\n <span style={baseStyles.smallValue}>{(user.effectiveShares ?? user.shares).toFixed(6)}</span>\n </div>\n\n {/* Share Price */}\n {price && (\n <div style={baseStyles.row}>\n <span style={baseStyles.label}>Share Price</span>\n <span style={baseStyles.smallValue}>${Number(price.price).toFixed(6)}</span>\n </div>\n )}\n\n {/* Pending Deposit */}\n {user.pendingDepositUsdc > 0 && (\n <div style={baseStyles.row}>\n <span style={baseStyles.label}>Pending Deposit</span>\n <span style={{ ...baseStyles.smallValue, color: \"var(--tbook-primary, #6366f1)\" }}>\n {user.pendingDepositUsdc.toFixed(2)} USDC\n </span>\n </div>\n )}\n\n {/* Pending Redeem */}\n {user.pendingRedeemShares > 0 && (\n <div style={baseStyles.row}>\n <span style={baseStyles.label}>Pending Redeem</span>\n <span style={{ ...baseStyles.smallValue, color: \"var(--tbook-primary, #6366f1)\" }}>\n {user.pendingRedeemShares.toFixed(6)} shares\n </span>\n </div>\n )}\n\n {/* Claimable */}\n {hasClaimable && (\n <>\n <div style={baseStyles.row}>\n <span style={baseStyles.label}>Claimable</span>\n <span style={{ ...baseStyles.smallValue, color: \"var(--tbook-success, #10b981)\" }}>\n {(user.effectiveClaimableUsdc ?? user.claimableUsdc).toFixed(6)} USDC\n </span>\n </div>\n {showClaim && (\n <button\n onClick={handleClaim}\n disabled={claim.isPending}\n style={{\n ...baseStyles.button,\n marginTop: 8,\n ...(claim.isPending ? baseStyles.buttonDisabled : {}),\n }}\n >\n {claim.isPending ? \"Claiming...\" : \"Claim USDC\"}\n </button>\n )}\n </>\n )}\n </div>\n );\n}\n","/**\n * YieldBadge — Compact APY display badge.\n *\n * Usage:\n * ```tsx\n * <YieldBadge /> // Shows \"8.30% APY\"\n * <YieldBadge showPrice /> // Shows \"8.30% APY · $1.003\"\n * ```\n */\n\nimport React from \"react\";\nimport { useSharePrice } from \"../hooks/use-share-price.js\";\nimport { baseStyles } from \"./styles.js\";\n\nexport interface YieldBadgeProps {\n /** Show share price alongside APY. */\n showPrice?: boolean;\n /** Custom class name. */\n className?: string;\n /** Custom inline styles. */\n style?: React.CSSProperties;\n}\n\nexport function YieldBadge({ showPrice, className, style }: YieldBadgeProps) {\n const { data: price, isLoading } = useSharePrice();\n\n if (isLoading || !price) {\n return (\n <span className={className} style={{ ...baseStyles.badge, background: \"#f3f4f6\", color: \"#9ca3af\", ...style }}>\n Loading...\n </span>\n );\n }\n\n return (\n <span\n className={className}\n style={{\n ...baseStyles.badge,\n background: \"var(--tbook-success, #10b981)\",\n color: \"#ffffff\",\n ...style,\n }}\n >\n {price.apy}% APY\n {showPrice && <span style={{ opacity: 0.85 }}> · ${Number(price.price).toFixed(3)}</span>}\n </span>\n );\n}\n","/**\n * EpochStatusBadge — Shows the current epoch status.\n *\n * Usage:\n * ```tsx\n * <EpochStatusBadge type=\"deposit\" /> // \"Deposit Epoch #5 — Open\"\n * <EpochStatusBadge type=\"redeem\" />\n * ```\n */\n\nimport React from \"react\";\nimport { useVaultInfo } from \"../hooks/use-vault-info.js\";\nimport { baseStyles } from \"./styles.js\";\n\nconst STATUS_COLORS: Record<string, { bg: string; text: string }> = {\n Open: { bg: \"#dcfce7\", text: \"#166534\" },\n Frozen: { bg: \"#fef3c7\", text: \"#92400e\" },\n Bridging: { bg: \"#dbeafe\", text: \"#1e40af\" },\n Settled: { bg: \"#f3e8ff\", text: \"#6b21a8\" },\n RolledBack: { bg: \"#fecaca\", text: \"#991b1b\" },\n};\n\nexport interface EpochStatusBadgeProps {\n /** Which epoch to display. */\n type: \"deposit\" | \"redeem\";\n /** Vault ID (default: \"rcUSDP\"). */\n vaultId?: string;\n /** Custom class name. */\n className?: string;\n /** Custom inline styles. */\n style?: React.CSSProperties;\n}\n\nexport function EpochStatusBadge({ type, vaultId, className, style }: EpochStatusBadgeProps) {\n const { data: vaultResult, isLoading } = useVaultInfo(vaultId);\n\n if (isLoading || !vaultResult) {\n return (\n <span className={className} style={{ ...baseStyles.badge, background: \"#f3f4f6\", color: \"#9ca3af\", ...style }}>\n Loading...\n </span>\n );\n }\n\n const epoch = type === \"deposit\" ? vaultResult.depositEpoch : vaultResult.redeemEpoch;\n if (!epoch) return null;\n const status = epoch.status;\n const colors = STATUS_COLORS[status] ?? { bg: \"#f3f4f6\", text: \"#374151\" };\n const label = type === \"deposit\" ? \"Deposit\" : \"Redeem\";\n\n return (\n <span\n className={className}\n style={{\n ...baseStyles.badge,\n background: colors.bg,\n color: colors.text,\n ...style,\n }}\n >\n {label} #{epoch.epoch} — {status}\n </span>\n );\n}\n","/**\n * VaultErrorBoundary — React Error Boundary for Vault SDK errors.\n *\n * Catches errors thrown by child components and displays a user-friendly\n * fallback UI with categorized error messages and a built-in retry button.\n *\n * Usage:\n * ```tsx\n * <VaultErrorBoundary onError={(err) => logToSentry(err)}>\n * <DepositWidget />\n * </VaultErrorBoundary>\n *\n * // Custom fallback\n * <VaultErrorBoundary fallback={(error, retry) => (\n * <div>\n * <p>{error.message}</p>\n * <button onClick={retry}>Try again</button>\n * </div>\n * )}>\n * <PortfolioCard />\n * </VaultErrorBoundary>\n * ```\n */\n\nimport React from \"react\";\nimport {\n VaultSdkError,\n RpcTimeoutError,\n VaultPausedError,\n SharePriceUnavailableError,\n} from \"@tbookdev/vault-sdk\";\n\nexport interface VaultErrorBoundaryProps {\n children: React.ReactNode;\n /** Custom fallback UI. Can be a ReactNode or a render function receiving the error and a retry callback. */\n fallback?:\n | React.ReactNode\n | ((error: Error, retry: () => void) => React.ReactNode);\n /** Called when an error is caught. */\n onError?: (error: Error, errorInfo: React.ErrorInfo) => void;\n}\n\ninterface VaultErrorBoundaryState {\n error: Error | null;\n}\n\n/**\n * Return a user-friendly message based on the error type.\n */\nfunction getFriendlyMessage(error: Error): string {\n if (error instanceof RpcTimeoutError) {\n return \"Network is slow. Please try again.\";\n }\n if (error instanceof VaultPausedError) {\n return \"The vault is temporarily paused.\";\n }\n if (error instanceof SharePriceUnavailableError) {\n return \"Price data is currently unavailable.\";\n }\n if (error instanceof VaultSdkError) {\n return error.message;\n }\n return \"Something went wrong. Please try again.\";\n}\n\nexport class VaultErrorBoundary extends React.Component<\n VaultErrorBoundaryProps,\n VaultErrorBoundaryState\n> {\n constructor(props: VaultErrorBoundaryProps) {\n super(props);\n this.state = { error: null };\n }\n\n static getDerivedStateFromError(error: Error): VaultErrorBoundaryState {\n return { error };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void {\n this.props.onError?.(error, errorInfo);\n }\n\n /** Reset the error state so children are re-rendered. */\n resetErrorBoundary = (): void => {\n this.setState({ error: null });\n };\n\n render(): React.ReactNode {\n const { error } = this.state;\n const { children, fallback } = this.props;\n\n if (error === null) {\n return children;\n }\n\n // Custom fallback — render function\n if (typeof fallback === \"function\") {\n return fallback(error, this.resetErrorBoundary);\n }\n\n // Custom fallback — ReactNode\n if (fallback !== undefined) {\n return fallback;\n }\n\n // Default fallback UI\n const message = getFriendlyMessage(error);\n\n return (\n <div\n role=\"alert\"\n style={{\n padding: 16,\n borderRadius: 8,\n border: \"1px solid var(--tbook-error, #ef4444)\",\n background: \"var(--tbook-bg-error, #fef2f2)\",\n color: \"var(--tbook-error, #ef4444)\",\n fontSize: 14,\n textAlign: \"center\" as const,\n }}\n >\n <p style={{ margin: \"0 0 12px\" }}>{message}</p>\n <button\n onClick={this.resetErrorBoundary}\n style={{\n padding: \"6px 16px\",\n fontSize: 13,\n fontWeight: 600,\n borderRadius: 6,\n border: \"1px solid var(--tbook-error, #ef4444)\",\n background: \"transparent\",\n color: \"var(--tbook-error, #ef4444)\",\n cursor: \"pointer\",\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n}\n","/**\n * TransactionHistory — Displays a paginated list of vault transactions.\n *\n * Shows transaction type, status, timestamp, and a link to Solana Explorer.\n * Supports infinite scroll via a \"Load more\" button.\n *\n * Usage:\n * ```tsx\n * <TransactionHistory />\n * <TransactionHistory limit={10} vaultId=\"rcUSDP\" network=\"devnet\" />\n * ```\n */\n\nimport React from \"react\";\nimport { useWallet } from \"@solana/wallet-adapter-react\";\nimport { useTransactionHistory } from \"../hooks/use-transaction-history.js\";\nimport { useTBookVault } from \"../provider.js\";\nimport { explorerUrl, type SolanaNetwork } from \"@tbookdev/vault-sdk\";\nimport type { VaultTransaction } from \"@tbookdev/vault-sdk\";\nimport { baseStyles } from \"./styles.js\";\n\nexport interface TransactionHistoryProps {\n /** Max transactions per page (default: 20). */\n limit?: number;\n /** Vault ID (default: \"rcUSDP\"). */\n vaultId?: string;\n /** Custom class name. */\n className?: string;\n /** Custom inline styles. */\n style?: React.CSSProperties;\n}\n\n/** Type icon mapping for transaction types. */\nconst TYPE_ICONS: Record<VaultTransaction[\"type\"], string> = {\n deposit: \"\\u2B06\", // up arrow\n redeem: \"\\u2B07\", // down arrow\n claim: \"\\u2705\", // checkmark\n cancel_deposit: \"\\u274C\", // cross\n unknown: \"\\u2753\", // question mark\n};\n\n/** Type label mapping. */\nconst TYPE_LABELS: Record<VaultTransaction[\"type\"], string> = {\n deposit: \"Deposit\",\n redeem: \"Redeem\",\n claim: \"Claim\",\n cancel_deposit: \"Cancel Deposit\",\n unknown: \"Unknown\",\n};\n\n/** Format a Unix timestamp to a human-readable date string. */\nfunction formatTimestamp(ts: number): string {\n if (ts === 0) return \"Unknown time\";\n return new Date(ts * 1000).toLocaleString();\n}\n\n/** Shorten a transaction signature for display. */\nfunction shortenSig(sig: string): string {\n if (sig.length <= 16) return sig;\n return `${sig.slice(0, 8)}...${sig.slice(-8)}`;\n}\n\nexport function TransactionHistory({\n limit,\n vaultId,\n className,\n style,\n}: TransactionHistoryProps) {\n const { connected } = useWallet();\n const { network } = useTBookVault();\n const {\n data,\n isLoading,\n isError,\n error,\n hasNextPage,\n fetchNextPage,\n isFetchingNextPage,\n } = useTransactionHistory({ limit, vaultId });\n\n if (!connected) {\n return (\n <div className={className} style={{ ...baseStyles.container, textAlign: \"center\" as const, ...style }}>\n <p style={baseStyles.label}>Connect wallet to view transaction history</p>\n </div>\n );\n }\n\n if (isLoading) {\n return (\n <div className={className} style={{ ...baseStyles.container, ...style }}>\n <p style={baseStyles.label}>Loading transaction history...</p>\n </div>\n );\n }\n\n if (isError) {\n return (\n <div className={className} style={{ ...baseStyles.container, ...style }}>\n <p style={{ ...baseStyles.label, color: \"var(--tbook-error, #ef4444)\" }}>\n Failed to load history: {error instanceof Error ? error.message : \"Unknown error\"}\n </p>\n </div>\n );\n }\n\n const transactions = data?.pages.flat() ?? [];\n\n if (transactions.length === 0) {\n return (\n <div className={className} style={{ ...baseStyles.container, textAlign: \"center\" as const, ...style }}>\n <p style={baseStyles.label}>No transactions found</p>\n </div>\n );\n }\n\n return (\n <div className={className} style={{ ...baseStyles.container, ...style }}>\n <div style={{ marginBottom: 12 }}>\n <div style={baseStyles.label}>Transaction History</div>\n </div>\n\n {transactions.map((tx) => (\n <div key={tx.signature} style={txRowStyle}>\n {/* Type icon */}\n <span style={txIconStyle} title={TYPE_LABELS[tx.type]}>\n {TYPE_ICONS[tx.type]}\n </span>\n\n {/* Details */}\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\n <span style={baseStyles.smallValue}>\n {TYPE_LABELS[tx.type]}\n </span>\n <span\n style={{\n ...baseStyles.label,\n fontSize: \"11px\",\n marginBottom: 0,\n textTransform: \"none\" as const,\n }}\n >\n {formatTimestamp(tx.timestamp)}\n </span>\n </div>\n\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginTop: 2 }}>\n <a\n href={explorerUrl(\"tx\", tx.signature, network)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={txLinkStyle}\n title={tx.signature}\n >\n {shortenSig(tx.signature)}\n </a>\n <span\n style={{\n fontSize: \"11px\",\n fontWeight: 600 as const,\n color: tx.success\n ? \"var(--tbook-success, #10b981)\"\n : \"var(--tbook-error, #ef4444)\",\n }}\n >\n {tx.success ? \"Success\" : \"Failed\"}\n </span>\n </div>\n </div>\n </div>\n ))}\n\n {/* Load More */}\n {hasNextPage && (\n <button\n onClick={() => fetchNextPage()}\n disabled={isFetchingNextPage}\n style={{\n ...baseStyles.button,\n marginTop: 12,\n ...(isFetchingNextPage ? baseStyles.buttonDisabled : {}),\n }}\n >\n {isFetchingNextPage ? \"Loading...\" : \"Load More\"}\n </button>\n )}\n </div>\n );\n}\n\n// ── Component-specific styles ──\n\nconst txRowStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: \"12px\",\n padding: \"10px 0\",\n borderBottom: \"1px solid var(--tbook-border, #e5e7eb)\",\n};\n\nconst txIconStyle: React.CSSProperties = {\n fontSize: \"18px\",\n lineHeight: \"24px\",\n flexShrink: 0,\n width: \"24px\",\n textAlign: \"center\",\n};\n\nconst txLinkStyle: React.CSSProperties = {\n fontSize: \"12px\",\n color: \"var(--tbook-primary, #6366f1)\",\n textDecoration: \"none\",\n fontFamily: \"monospace\",\n};\n"]}