From 237a7f03fffd80510a93259d51cffc856b40faf7 Mon Sep 17 00:00:00 2001 From: wphan Date: Wed, 31 May 2023 12:27:43 -0700 Subject: [PATCH] add /topMakers endpoint --- src/index.ts | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/src/index.ts b/src/index.ts index 7293ce7..4829ff8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -27,6 +27,7 @@ import { SpotMarketConfig, PhoenixSubscriber, SerumSubscriber, + DLOBNode, } from "@drift-labs/sdk"; import { Mutex } from "async-mutex"; @@ -768,6 +769,96 @@ const main = async () => { }; }; + app.get("/topMakers", handleResponseTime, async (req, res, next) => { + try { + const { + marketName, + marketIndex, + marketType, + side, // bid or ask + limit, // number of unique makers to return, if undefined will return all + } = req.query; + + const { normedMarketType, normedMarketIndex, error } = validateDlobQuery( + marketType as string, + marketIndex as string, + marketName as string + ); + if (error) { + res.status(400).send(error); + return; + } + + if (side !== "bid" && side !== "ask") { + res.status(400).send("Bad Request: side must be either bid or ask"); + return; + } + const normedSide = (side as string).toLowerCase(); + const oracle = driftClient.getOracleDataForPerpMarket(normedMarketIndex); + + let normedLimit = undefined; + if (limit) { + if (isNaN(parseInt(limit as string))) { + res + .status(400) + .send("Bad Request: limit must be a number if supplied"); + return; + } + normedLimit = parseInt(limit as string); + } + + const topMakers: Set = new Set(); + let foundMakers = 0; + const findMakers = (sideGenerator: Generator) => { + for (const side of sideGenerator) { + if (limit && foundMakers >= normedLimit) { + break; + } + if (side.userAccount) { + const maker = side.userAccount.toBase58(); + if (topMakers.has(maker)) { + continue; + } else { + topMakers.add(side.userAccount.toBase58()); + foundMakers++; + } + } else { + continue; + } + } + }; + + if (normedSide === "bid") { + findMakers( + dlobSubscriber + .getDLOB() + .getRestingLimitBids( + normedMarketIndex, + slotSubscriber.getSlot(), + normedMarketType, + oracle + ) + ); + } else { + findMakers( + dlobSubscriber + .getDLOB() + .getRestingLimitAsks( + normedMarketIndex, + slotSubscriber.getSlot(), + normedMarketType, + oracle + ) + ); + } + + res.writeHead(200); + res.end(JSON.stringify([...topMakers])); + } catch (err) { + next(err); + } + }); + app.get("/l2", handleResponseTime, async (req, res, next) => { try { const {