diff --git a/apps/staking/src/app/api/v1/cmc/supply/route.ts b/apps/staking/src/app/api/v1/cmc/supply/route.ts index ce7f88d39d..5b128cc167 100644 --- a/apps/staking/src/app/api/v1/cmc/supply/route.ts +++ b/apps/staking/src/app/api/v1/cmc/supply/route.ts @@ -1,48 +1,50 @@ import { PythStakingClient } from "@pythnetwork/staking-sdk"; import { WalletAdapterNetwork } from "@solana/wallet-adapter-base"; import { clusterApiUrl, Connection } from "@solana/web3.js"; +import { toNumber } from "dnum"; import type { NextRequest } from "next/server"; import { z } from "zod"; import { MAINNET_API_RPC } from "../../../../../config/server"; -import { tokensToString } from "../../../../../tokens"; - -const querySchema = z.enum(["totalSupply", "circulatingSupply"]); +import { DECIMALS } from "../../../../../tokens"; export async function GET(req: NextRequest) { - const isMainnet = req.nextUrl.searchParams.get("devnet") !== "true"; - const asDecimal = req.nextUrl.searchParams.get("as_decimal") === "true"; - const stakingClient = new PythStakingClient({ - connection: new Connection( - isMainnet && MAINNET_API_RPC !== undefined - ? MAINNET_API_RPC - : clusterApiUrl(WalletAdapterNetwork.Devnet), - ), - }); - const query = querySchema.safeParse(req.nextUrl.searchParams.get("q")); - if (!query.success) { - return Response.json( - { - error: - "The 'q' query parameter must be one of 'totalSupply' or 'circulatingSupply'.", - }, - { - status: 400, - }, + if (query.error) { + return new Response( + "The 'q' query parameter must be one of 'totalSupply' or 'circulatingSupply'.", + { status: 400 }, ); + } else { + const isMainnet = req.nextUrl.searchParams.get("devnet") !== "true"; + const asDecimal = req.nextUrl.searchParams.get("as_decimal") === "true"; + const circulating = query.data === "circulatingSupply"; + const supply = await getSupply(isMainnet, circulating); + return Response.json(formatAmount(asDecimal, supply)); } - const q = query.data; +} - if (q === "circulatingSupply") { - const circulatingSupply = await stakingClient.getCirculatingSupply(); - return Response.json( - asDecimal ? tokensToString(circulatingSupply) : Number(circulatingSupply), - ); +const querySchema = z.enum(["totalSupply", "circulatingSupply"]); + +const getSupply = async (isMainnet: boolean, circulating: boolean) => { + const client = isMainnet ? mainnetClient : devnetClient; + if (circulating) { + return client.getCirculatingSupply(); } else { - const pythMint = await stakingClient.getPythTokenMint(); - return Response.json( - asDecimal ? tokensToString(pythMint.supply) : Number(pythMint.supply), - ); + const { supply } = await client.getPythTokenMint(); + return supply; } -} +}; + +const mainnetClient = new PythStakingClient({ + connection: new Connection( + MAINNET_API_RPC ?? clusterApiUrl(WalletAdapterNetwork.Mainnet), + ), +}); + +const devnetClient = new PythStakingClient({ + connection: new Connection(clusterApiUrl(WalletAdapterNetwork.Devnet)), +}); + +const formatAmount = (asDecimal: boolean, amount: bigint) => + asDecimal ? toNumber([amount, DECIMALS]) : Number(amount);