/** * Drift Account Summary API * * Returns comprehensive account information from Drift Protocol */ import { NextResponse } from 'next/server' import { initializeDriftService } from '@/lib/drift/client' import { getPrismaClient } from '@/lib/database/trades' export async function GET() { try { const driftService = await initializeDriftService() const prisma = getPrismaClient() // Get account health from Drift const health = await driftService.getAccountHealth() // Get user account details const driftClient = driftService.getClient() const userAccount = driftClient.getUserAccount() // Get spot position (USDC collateral) const spotPositions = userAccount?.spotPositions || [] const usdcPosition = spotPositions.find(p => p.marketIndex === 0) // USDC is market 0 // Get all perp positions const perpPositions = userAccount?.perpPositions || [] const activePerps = perpPositions.filter(p => p.baseAssetAmount.toNumber() !== 0) // Calculate total from database const trades = await prisma.trade.findMany({ where: { exitReason: { not: null } }, select: { realizedPnL: true }, }) const totalPnL = trades.reduce((sum, trade) => sum + (trade.realizedPnL || 0), 0) return NextResponse.json({ success: true, drift: { freeCollateral: health.freeCollateral, totalCollateral: health.totalCollateral, marginUsed: health.totalCollateral - health.freeCollateral, marginRatio: health.marginRatio, accountValue: health.totalCollateral, }, spotPositions: { usdc: usdcPosition ? { scaledBalance: usdcPosition.scaledBalance.toString(), cumulativeDeposits: usdcPosition.cumulativeDeposits.toString(), } : null, }, perpPositions: activePerps.map(p => ({ marketIndex: p.marketIndex, baseAssetAmount: p.baseAssetAmount.toString(), quoteAssetAmount: p.quoteAssetAmount.toString(), })), database: { totalTrades: trades.length, totalPnL: Math.round(totalPnL * 100) / 100, }, calculated: { // This is what user actually has available to withdraw currentBalance: health.freeCollateral, // This would be from tracking deposits (we hardcoded $546) estimatedDeposits: 546, // Difference = profit/loss estimatedProfit: health.freeCollateral - 546, } }) } catch (error: any) { console.error('Failed to get account summary:', error) return NextResponse.json({ success: false, error: error.message, }, { status: 500 }) } }