Merge pull request #108 from drift-labs/master
cache top makers to staging
This commit is contained in:
@@ -6,7 +6,7 @@
|
|||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@coral-xyz/anchor": "^0.29.0",
|
"@coral-xyz/anchor": "^0.29.0",
|
||||||
"@drift-labs/sdk": "2.67.0-beta.6",
|
"@drift-labs/sdk": "2.69.0-beta.0",
|
||||||
"@opentelemetry/api": "^1.1.0",
|
"@opentelemetry/api": "^1.1.0",
|
||||||
"@opentelemetry/auto-instrumentations-node": "^0.31.1",
|
"@opentelemetry/auto-instrumentations-node": "^0.31.1",
|
||||||
"@opentelemetry/exporter-prometheus": "^0.31.0",
|
"@opentelemetry/exporter-prometheus": "^0.31.0",
|
||||||
|
|||||||
@@ -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 &&
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -115,10 +115,10 @@
|
|||||||
enabled "2.0.x"
|
enabled "2.0.x"
|
||||||
kuler "^2.0.0"
|
kuler "^2.0.0"
|
||||||
|
|
||||||
"@drift-labs/sdk@2.67.0-beta.6":
|
"@drift-labs/sdk@2.69.0-beta.0":
|
||||||
version "2.67.0-beta.6"
|
version "2.69.0-beta.0"
|
||||||
resolved "https://registry.yarnpkg.com/@drift-labs/sdk/-/sdk-2.67.0-beta.6.tgz#3c3109eb1b86b58023b6376dc50607d56af851f9"
|
resolved "https://registry.yarnpkg.com/@drift-labs/sdk/-/sdk-2.69.0-beta.0.tgz#3e540e594a43f77120e6451749159ac3f0faa72b"
|
||||||
integrity sha512-cBYk2J9wY8XYBy0m7MvPeq6yoWTWYxKwZPPSJApFeiLLt8pQkAFSyTMZUhPhDFtEXkHBiCHaqOdIjGyQww6qrg==
|
integrity sha512-9JQcw/BxHEh9TpCKg/ahyj3cb7k4ecudtJ6McGuzR2OQE8Nfvtp3wIA/Q1cl604V76FJTLsGVB+4nGcW7KVnsQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@coral-xyz/anchor" "0.28.1-beta.2"
|
"@coral-xyz/anchor" "0.28.1-beta.2"
|
||||||
"@ellipsis-labs/phoenix-sdk" "^1.4.2"
|
"@ellipsis-labs/phoenix-sdk" "^1.4.2"
|
||||||
|
|||||||
Reference in New Issue
Block a user