import { TickMath } from '@/lib/byreal-clmm-sdk/src/instructions/utils/tickMath' import { NextRequest, NextResponse } from 'next/server' export async function GET(request: NextRequest) { try { const searchParams = request.nextUrl.searchParams const address = searchParams.get('address') const response = await fetch( `https://api2.byreal.io/byreal/api/dex/v2/position/detail?address=${address}`, { method: 'GET', headers: { accept: 'application/json', }, } ) if (!response.ok) { return NextResponse.json( { retCode: response.status, retMsg: '外部 API 请求失败' }, { status: response.status } ) } const data = await response.json() const { pool, lowerTick, upperTick } = data.result?.data as { lowerTick: number upperTick: number pool: { mintA: { decimals: number; price: string } mintB: { decimals: number; price: string } baseMint: { decimals: number; price: string } displayReversed?: boolean } } const displayReversed = pool.displayReversed || false let priceLower = TickMath.getPriceFromTick({ tick: lowerTick, decimalsA: pool.mintA.decimals, decimalsB: pool.mintB.decimals, // baseIn: !displayReversed, }) let priceUpper = TickMath.getPriceFromTick({ tick: upperTick, decimalsA: pool.mintA.decimals, decimalsB: pool.mintB.decimals, baseIn: !displayReversed, }) // 如果 displayReversed 为 true,调换 priceLower 和 priceUpper if (displayReversed) { const temp = priceLower priceLower = priceUpper priceUpper = temp } const isInRange = Number(pool.baseMint.price) < priceUpper.toNumber() && Number(pool.baseMint.price) > priceLower.toNumber() const newData = { ...data, result: { data: { ...data.result.data, priceLower: priceLower.toString(), priceUpper: priceUpper.toString(), isInRange, displayReversed, priceOutType: isInRange ? 'inRange' : Number(pool.baseMint.price) > priceUpper.toNumber() ? 'priceUp' : 'priceDown', }, }, } return NextResponse.json(newData) } catch (error) { console.error('API Route Error:', error) return NextResponse.json( { retCode: 500, retMsg: '服务器内部错误' }, { status: 500 } ) } }