Quellcode durchsuchen

Merge pull request #2291 from pyth-network/cprussin/update-endponits-for-cmc

fix(staking): match cmc endpoint format to expected format
Connor Prussin vor 10 Monaten
Ursprung
Commit
853f018b0d
1 geänderte Dateien mit 35 neuen und 33 gelöschten Zeilen
  1. 35 33
      apps/staking/src/app/api/v1/cmc/supply/route.ts

+ 35 - 33
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);