cache top makers
This commit is contained in:
@@ -4,6 +4,7 @@ import {
|
|||||||
DLOBSubscriptionConfig,
|
DLOBSubscriptionConfig,
|
||||||
L2OrderBookGenerator,
|
L2OrderBookGenerator,
|
||||||
MarketType,
|
MarketType,
|
||||||
|
PositionDirection,
|
||||||
groupL2,
|
groupL2,
|
||||||
isVariant,
|
isVariant,
|
||||||
} from '@drift-labs/sdk';
|
} from '@drift-labs/sdk';
|
||||||
@@ -248,6 +249,35 @@ export class DLOBSubscriberIO extends DLOBSubscriber {
|
|||||||
`last_update_orderbook_${marketType}_${marketArgs.marketIndex}_depth_5`,
|
`last_update_orderbook_${marketType}_${marketArgs.marketIndex}_depth_5`,
|
||||||
JSON.stringify(l2Formatted_depth5)
|
JSON.stringify(l2Formatted_depth5)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const oraclePriceData =
|
||||||
|
marketType === 'spot'
|
||||||
|
? this.driftClient.getOracleDataForSpotMarket(marketArgs.marketIndex)
|
||||||
|
: this.driftClient.getOracleDataForPerpMarket(marketArgs.marketIndex);
|
||||||
|
const bids = this.dlob
|
||||||
|
.getBestMakers({
|
||||||
|
marketIndex: marketArgs.marketIndex,
|
||||||
|
marketType: marketArgs.marketType,
|
||||||
|
direction: PositionDirection.LONG,
|
||||||
|
slot: slot,
|
||||||
|
oraclePriceData,
|
||||||
|
numMakers: 4,
|
||||||
|
})
|
||||||
|
.map((x) => x.toString());
|
||||||
|
const asks = this.dlob
|
||||||
|
.getBestMakers({
|
||||||
|
marketIndex: marketArgs.marketIndex,
|
||||||
|
marketType: marketArgs.marketType,
|
||||||
|
direction: PositionDirection.SHORT,
|
||||||
|
slot,
|
||||||
|
oraclePriceData,
|
||||||
|
numMakers: 4,
|
||||||
|
})
|
||||||
|
.map((x) => x.toString());
|
||||||
|
this.redisClient.client.set(
|
||||||
|
`last_update_orderbook_best_makers_${marketType}_${marketArgs.marketIndex}`,
|
||||||
|
JSON.stringify({ bids, asks, slot })
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
getL3AndSendMsg(marketArgs: wsMarketArgs): void {
|
getL3AndSendMsg(marketArgs: wsMarketArgs): void {
|
||||||
|
|||||||
67
src/index.ts
67
src/index.ts
@@ -19,7 +19,6 @@ import {
|
|||||||
DriftEnv,
|
DriftEnv,
|
||||||
SlotSubscriber,
|
SlotSubscriber,
|
||||||
Wallet,
|
Wallet,
|
||||||
getUserStatsAccountPublicKey,
|
|
||||||
getVariant,
|
getVariant,
|
||||||
initialize,
|
initialize,
|
||||||
isVariant,
|
isVariant,
|
||||||
@@ -720,8 +719,7 @@ const main = async (): Promise<void> => {
|
|||||||
marketIndex,
|
marketIndex,
|
||||||
marketType,
|
marketType,
|
||||||
side, // bid or ask
|
side, // bid or ask
|
||||||
limit, // number of unique makers to return, if undefined will return all
|
limit,
|
||||||
includeUserStats,
|
|
||||||
} = req.query;
|
} = req.query;
|
||||||
|
|
||||||
const { normedMarketType, normedMarketIndex, error } = validateDlobQuery(
|
const { normedMarketType, normedMarketIndex, error } = validateDlobQuery(
|
||||||
@@ -752,9 +750,46 @@ const main = async (): Promise<void> => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
normedLimit = parseInt(limit as string);
|
normedLimit = parseInt(limit as string);
|
||||||
|
} else {
|
||||||
|
normedLimit = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
const topMakers = new Set();
|
let topMakers: string[];
|
||||||
|
if (useRedis) {
|
||||||
|
const redisClient = isVariant(normedMarketType, 'perp')
|
||||||
|
? perpMarketRedisMap.get(normedMarketIndex).client
|
||||||
|
: spotMarketRedisMap.get(normedMarketIndex).client;
|
||||||
|
const redisResponse = await redisClient.client.get(
|
||||||
|
`last_update_orderbook_best_makers_${getVariant(
|
||||||
|
normedMarketType
|
||||||
|
)}_${marketIndex}`
|
||||||
|
);
|
||||||
|
if (redisResponse) {
|
||||||
|
const parsedResponse = JSON.parse(redisResponse);
|
||||||
|
if (
|
||||||
|
parsedResponse.slot &&
|
||||||
|
Math.abs(dlobProvider.getSlot() - parsedResponse.slot) <
|
||||||
|
SLOT_STALENESS_TOLERANCE
|
||||||
|
) {
|
||||||
|
if (side === 'bid') {
|
||||||
|
topMakers = parsedResponse.bids;
|
||||||
|
} else {
|
||||||
|
topMakers = parsedResponse.asks;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (topMakers) {
|
||||||
|
cacheHitCounter.add(1, {
|
||||||
|
miss: false,
|
||||||
|
});
|
||||||
|
res.writeHead(200);
|
||||||
|
res.end(JSON.stringify(topMakers));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const topMakersSet = new Set<string>();
|
||||||
let foundMakers = 0;
|
let foundMakers = 0;
|
||||||
const findMakers = async (sideGenerator: Generator<DLOBNode>) => {
|
const findMakers = async (sideGenerator: Generator<DLOBNode>) => {
|
||||||
for (const side of sideGenerator) {
|
for (const side of sideGenerator) {
|
||||||
@@ -763,23 +798,10 @@ const main = async (): Promise<void> => {
|
|||||||
}
|
}
|
||||||
if (side.userAccount) {
|
if (side.userAccount) {
|
||||||
const maker = side.userAccount;
|
const maker = side.userAccount;
|
||||||
if (topMakers.has(maker)) {
|
if (topMakersSet.has(maker)) {
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
if (`${includeUserStats}`.toLowerCase() === 'true') {
|
topMakersSet.add(side.userAccount);
|
||||||
const userAccount = dlobProvider.getUserAccount(
|
|
||||||
new PublicKey(side.userAccount)
|
|
||||||
);
|
|
||||||
topMakers.add([
|
|
||||||
userAccount,
|
|
||||||
getUserStatsAccountPublicKey(
|
|
||||||
driftClient.program.programId,
|
|
||||||
userAccount.authority
|
|
||||||
),
|
|
||||||
]);
|
|
||||||
} else {
|
|
||||||
topMakers.add(side.userAccount);
|
|
||||||
}
|
|
||||||
foundMakers++;
|
foundMakers++;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -811,9 +833,12 @@ const main = async (): Promise<void> => {
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
topMakers = [...topMakersSet];
|
||||||
|
cacheHitCounter.add(1, {
|
||||||
|
miss: true,
|
||||||
|
});
|
||||||
res.writeHead(200);
|
res.writeHead(200);
|
||||||
res.end(JSON.stringify([...topMakers]));
|
res.end(JSON.stringify(topMakers));
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
next(err);
|
next(err);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user