refactor: TOB check uses user+orderId instead of prices
This commit is contained in:
28
.vscode/launch.json
vendored
28
.vscode/launch.json
vendored
@@ -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"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 &&
|
||||||
|
|||||||
Reference in New Issue
Block a user