import { NextRequest, NextResponse } from 'next/server' import { initializeDriftService, getDriftService } from '@/lib/drift/client' /** * GET /api/drift/markets * * Query Drift Protocol perpetual markets * Optional query param: ?search=FARTCOIN to filter by symbol */ export async function GET(request: NextRequest) { try { const searchParams = request.nextUrl.searchParams const searchSymbol = searchParams.get('search')?.toUpperCase() await initializeDriftService() const driftService = getDriftService() const driftClient = driftService.getClient() const perpMarketAccounts = driftClient.getPerpMarketAccounts() if (!perpMarketAccounts || perpMarketAccounts.length === 0) { return NextResponse.json({ markets: [] }) } const markets = perpMarketAccounts.map((market, index) => { if (!market) return null // Decode market name from bytes const nameBytes = market.name as unknown as number[] const symbol = nameBytes ? String.fromCharCode(...Array.from(nameBytes).filter((b: number) => b !== 0)).trim() : `Market-${index}` const minOrderSize = market.amm?.minOrderSize ? Number(market.amm.minOrderSize) / 1e9 : 0 const tickSize = market.amm?.orderTickSize ? Number(market.amm.orderTickSize) / 1e6 : 0.0001 const oracleAddress = market.amm?.oracle?.toString() || 'N/A' return { index, symbol, oracleAddress, minOrderSize, tickSize, marginRatioInitial: market.marginRatioInitial ? Number(market.marginRatioInitial) / 10000 : 0, marginRatioMaintenance: market.marginRatioMaintenance ? Number(market.marginRatioMaintenance) / 10000 : 0, } }).filter(Boolean) // Filter by search if provided const filtered = searchSymbol ? markets.filter(m => m && m.symbol.toUpperCase().includes(searchSymbol)) : markets await driftService.disconnect() return NextResponse.json({ total: markets.length, filtered: filtered.length, markets: filtered, }) } catch (error: any) { console.error('❌ Error fetching markets:', error) return NextResponse.json( { error: 'Failed to fetch markets', message: error.message }, { status: 500 } ) } }