refactor: TOB check uses user+orderId instead of prices

This commit is contained in:
Lukas deConantsesznak
2025-08-01 16:00:23 -06:00
parent 9df6c84abd
commit 6caec8e8e1
2 changed files with 58 additions and 20 deletions

28
.vscode/launch.json vendored
View File

@@ -11,6 +11,34 @@
"port": 2230,
"timeout": 3000,
"restart": true
},
{
"type": "node",
"request": "launch",
"name": "Launch DLOB Publisher",
"runtimeExecutable": "ts-node",
"program": "${workspaceFolder}/src/publishers/dlobPublisher.ts",
"args": ["--D"],
"env": {
"KILLSWITCH_SLOT_DIFF_THRESHOLD": "2500",
"PERP_MARKETS_TO_LOAD": "1,2",
"LOCAL_CACHE": "true",
"RUNNING_LOCAL": "true",
"USE_REDIS": "true",
"ENDPOINT": "",
"WS_ENDPOINT": "",
"USE_WEBSOCKET": "true",
"USE_GRPC": "true",
"GRPC_ENDPOINT": "",
"TOKEN": "",
"USE_ORDER_SUBSCRIBER": "true",
"STATE_COMMITMENT": "confirmed",
"DRIFT_ENV": "mainnet-beta",
"ENV": "mainnet-beta",
"ENABLE_TOB_MONITORING": "true",
"TOB_MONITORING_ENABLED_PERP_MARKETS": "1,2"
},
"console": "integratedTerminal"
}
]
}

View File

@@ -665,14 +665,17 @@ const main = async () => {
useOrderSubscriber &&
tobMonitoringMarketsInThisNode.length > 0;
// Track last TOB update times and values for each TOB monitoring market
// Track last TOB update times and order IDs for each TOB monitoring market
const lastTobUpdateTimes = new Map<number, number>();
const lastTobValues = new Map<number, { bid: string; ask: string }>();
const lastTobOrderIds = new Map<
number,
{ bidOrderId: string; askOrderId: string }
>();
// Initialize TOB tracking for TOB monitoring markets in this node
tobMonitoringMarketsInThisNode.forEach((marketIndex) => {
lastTobUpdateTimes.set(marketIndex, Date.now());
lastTobValues.set(marketIndex, { bid: '', ask: '' });
lastTobOrderIds.set(marketIndex, { bidOrderId: '', askOrderId: '' });
});
// Log TOB monitoring status
@@ -706,38 +709,45 @@ const main = async () => {
// Get oracle data for the market
const oracleData = driftClient.getOracleDataForPerpMarket(marketIndex);
// Get L2 orderbook to check TOB
const l2OrderBook = dlob.getL2({
// Get L3 orderbook to check TOB
const l3OrderBook = dlob.getL3({
marketIndex,
marketType: { perp: {} },
slot,
oraclePriceData: oracleData,
depth: 1, // Only need top level
});
const bestBid = l2OrderBook.bids[0]?.price;
const bestAsk = l2OrderBook.asks[0]?.price;
const bestBidOrder = l3OrderBook.bids[0];
const bestAskOrder = l3OrderBook.asks[0];
if (bestBid && bestAsk) {
const currentTobValues = {
bid: bestBid.toString(),
ask: bestAsk.toString(),
if (bestBidOrder && bestAskOrder) {
// Create order ID strings using maker (user account) and orderId
const currentBidOrderId = `${bestBidOrder.maker.toBase58()}-${
bestBidOrder.orderId
}`;
const currentAskOrderId = `${bestAskOrder.maker.toBase58()}-${
bestAskOrder.orderId
}`;
const currentTobOrderIds = {
bidOrderId: currentBidOrderId,
askOrderId: currentAskOrderId,
};
const lastTobValue = lastTobValues.get(marketIndex);
const lastTobOrderId = lastTobOrderIds.get(marketIndex);
const lastUpdate = lastTobUpdateTimes.get(marketIndex);
// Check if TOB has changed
// Check if TOB orders have changed (not just prices)
const tobChanged =
!lastTobValue ||
lastTobValue.bid !== currentTobValues.bid ||
lastTobValue.ask !== currentTobValues.ask;
!lastTobOrderId ||
lastTobOrderId.bidOrderId !== currentTobOrderIds.bidOrderId ||
lastTobOrderId.askOrderId !== currentTobOrderIds.askOrderId;
if (tobChanged) {
// TOB changed, update tracking
lastTobValues.set(marketIndex, currentTobValues);
// TOB orders changed, update tracking
lastTobOrderIds.set(marketIndex, currentTobOrderIds);
lastTobUpdateTimes.set(marketIndex, currentTime);
logger.debug(
`TOB updated for market ${marketIndex}: bid=${currentTobValues.bid}, ask=${currentTobValues.ask}`
`TOB orders updated for market ${marketIndex}: bidOrderId=${currentTobOrderIds.bidOrderId}, askOrderId=${currentTobOrderIds.askOrderId}`
);
} else if (
lastUpdate &&