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