Files
trading_bot_v4/app/api/withdrawals/stats/route.ts
mindesbunister 1c79178aac fix: TypeScript errors in withdrawal system
- Fixed LAST_WITHDRAWAL_TIME type (null | string)
- Removed parseFloat on health.freeCollateral (already number)
- Fixed getDriftClient() → getClient() method name
- Build now compiles successfully

Deployed: Withdrawal system now live on dashboard
2025-11-19 18:25:54 +01:00

84 lines
2.9 KiB
TypeScript

/**
* Withdrawal Stats API
*
* Returns current account statistics for withdrawal calculations
*/
import { NextResponse } from 'next/server'
import { getPrismaClient } from '@/lib/database/trades'
import { initializeDriftService } from '@/lib/drift/client'
export async function GET() {
try {
const prisma = getPrismaClient()
// Get total invested (from roadmap: $546)
const totalInvested = 546
// Get current Drift balance
const driftService = await initializeDriftService()
const health = await driftService.getAccountHealth()
const currentBalance = health.freeCollateral // Already a number
// Calculate total P&L 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)
// Get total withdrawn from .env
const totalWithdrawn = parseFloat(process.env.TOTAL_WITHDRAWN || '0')
// Calculate available profit
const availableProfit = Math.max(0, currentBalance - totalInvested)
// Calculate next withdrawal amount
const withdrawalPercent = parseFloat(process.env.WITHDRAWAL_PROFIT_PERCENT || '10')
const nextWithdrawalAmount = availableProfit * (withdrawalPercent / 100)
// Calculate next withdrawal time
let nextWithdrawalTime: string | null = null
if (process.env.ENABLE_AUTO_WITHDRAWALS === 'true' && process.env.LAST_WITHDRAWAL_TIME) {
const lastWithdrawal = new Date(process.env.LAST_WITHDRAWAL_TIME)
const intervalHours = parseFloat(process.env.WITHDRAWAL_INTERVAL_HOURS || '168')
const nextTime = new Date(lastWithdrawal.getTime() + intervalHours * 60 * 60 * 1000)
nextWithdrawalTime = nextTime.toISOString()
} else if (process.env.ENABLE_AUTO_WITHDRAWALS === 'true') {
// First withdrawal - schedule from now
const intervalHours = parseFloat(process.env.WITHDRAWAL_INTERVAL_HOURS || '168')
const nextTime = new Date(Date.now() + intervalHours * 60 * 60 * 1000)
nextWithdrawalTime = nextTime.toISOString()
}
return NextResponse.json({
success: true,
currentBalance: parseFloat(currentBalance.toFixed(2)),
totalInvested,
totalPnL: parseFloat(totalPnL.toFixed(2)),
totalWithdrawn,
availableProfit: parseFloat(availableProfit.toFixed(2)),
nextWithdrawalAmount: parseFloat(nextWithdrawalAmount.toFixed(2)),
nextWithdrawalTime,
})
} catch (error: any) {
console.error('Failed to load withdrawal stats:', error)
return NextResponse.json({
success: false,
error: error.message,
currentBalance: 0,
totalInvested: 546,
totalPnL: 0,
totalWithdrawn: 0,
availableProfit: 0,
nextWithdrawalAmount: 0,
nextWithdrawalTime: null,
})
}
}