From 6caec8e8e1a9b5aa996bc751f20ef8776b7e0118 Mon Sep 17 00:00:00 2001 From: Lukas deConantsesznak Date: Fri, 1 Aug 2025 16:00:23 -0600 Subject: [PATCH] refactor: TOB check uses user+orderId instead of prices --- .vscode/launch.json | 28 ++++++++++++++++++ src/publishers/dlobPublisher.ts | 50 ++++++++++++++++++++------------- 2 files changed, 58 insertions(+), 20 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 3cce174..2c2d82b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -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" } ] } diff --git a/src/publishers/dlobPublisher.ts b/src/publishers/dlobPublisher.ts index 118ac40..47a439a 100644 --- a/src/publishers/dlobPublisher.ts +++ b/src/publishers/dlobPublisher.ts @@ -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(); - const lastTobValues = new Map(); + 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 &&