route.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import { TickMath } from '@/lib/byreal-clmm-sdk/src/instructions/utils/tickMath'
  2. import { NextRequest, NextResponse } from 'next/server'
  3. export async function GET(request: NextRequest) {
  4. try {
  5. const searchParams = request.nextUrl.searchParams
  6. const address = searchParams.get('address')
  7. const response = await fetch(
  8. `https://api2.byreal.io/byreal/api/dex/v2/position/detail?address=${address}`,
  9. {
  10. method: 'GET',
  11. headers: {
  12. accept: 'application/json',
  13. },
  14. }
  15. )
  16. if (!response.ok) {
  17. return NextResponse.json(
  18. { retCode: response.status, retMsg: '外部 API 请求失败' },
  19. { status: response.status }
  20. )
  21. }
  22. const data = await response.json()
  23. const { pool, lowerTick, upperTick } = data.result?.data as {
  24. lowerTick: number
  25. upperTick: number
  26. pool: {
  27. mintA: { decimals: number; price: string }
  28. mintB: { decimals: number; price: string }
  29. baseMint: { decimals: number; price: string }
  30. displayReversed?: boolean
  31. }
  32. }
  33. const displayReversed = pool.displayReversed || false
  34. let priceLower = TickMath.getPriceFromTick({
  35. tick: lowerTick,
  36. decimalsA: pool.mintA.decimals,
  37. decimalsB: pool.mintB.decimals,
  38. // baseIn: !displayReversed,
  39. })
  40. let priceUpper = TickMath.getPriceFromTick({
  41. tick: upperTick,
  42. decimalsA: pool.mintA.decimals,
  43. decimalsB: pool.mintB.decimals,
  44. baseIn: !displayReversed,
  45. })
  46. // 如果 displayReversed 为 true,调换 priceLower 和 priceUpper
  47. if (displayReversed) {
  48. const temp = priceLower
  49. priceLower = priceUpper
  50. priceUpper = temp
  51. }
  52. const isInRange =
  53. Number(pool.baseMint.price) < priceUpper.toNumber() &&
  54. Number(pool.baseMint.price) > priceLower.toNumber()
  55. const newData = {
  56. ...data,
  57. result: {
  58. data: {
  59. ...data.result.data,
  60. priceLower: priceLower.toString(),
  61. priceUpper: priceUpper.toString(),
  62. isInRange,
  63. displayReversed,
  64. priceOutType: isInRange
  65. ? 'inRange'
  66. : Number(pool.baseMint.price) > priceUpper.toNumber()
  67. ? 'priceUp'
  68. : 'priceDown',
  69. },
  70. },
  71. }
  72. return NextResponse.json(newData)
  73. } catch (error) {
  74. console.error('API Route Error:', error)
  75. return NextResponse.json(
  76. { retCode: 500, retMsg: '服务器内部错误' },
  77. { status: 500 }
  78. )
  79. }
  80. }