import {
DriftL2OrderbookManager,
MarketId,
DEFAULT_ORDERBOOK_GROUPING
} from '@drift-labs/common';
// Create manager
const orderbookManager = new DriftL2OrderbookManager({
wsUrl: 'wss://dlob.drift.trade/ws',
subscriptionConfig: {
marketId: MarketId.createPerpMarket(0), // SOL-PERP
channel: 'orderbook_indicative',
grouping: DEFAULT_ORDERBOOK_GROUPING, // 0.01
},
});
// Subscribe to updates
const subscription = orderbookManager.onUpdate((orderbook) => {
console.log('\n=== Orderbook Update ===');
console.log('Market:', orderbook.marketIndex);
console.log('Mark Price:', orderbook.markPrice);
console.log('Oracle Price:', orderbook.oracleData.price);
console.log('Slot:', orderbook.slot);
// Display top 5 levels
console.log('\nTop 5 Asks:');
orderbook.asks.slice(0, 5).forEach(([price, size]) => {
console.log(` ${price.toFixed(2)} | ${size.toFixed(2)}`);
});
console.log('\nTop 5 Bids:');
orderbook.bids.slice(0, 5).forEach(([price, size]) => {
console.log(` ${price.toFixed(2)} | ${size.toFixed(2)}`);
});
// Calculate spread
const spread = orderbook.bestAskPrice - orderbook.bestBidPrice;
const spreadBps = (spread / orderbook.markPrice) * 10000;
console.log(`\nSpread: $${spread.toFixed(2)} (${spreadBps.toFixed(2)} bps)`);
// Calculate depth
const bidDepth = orderbook.bids.reduce((sum, [_, size]) => sum + size, 0);
const askDepth = orderbook.asks.reduce((sum, [_, size]) => sum + size, 0);
console.log(`Bid Depth: ${bidDepth.toFixed(2)} SOL`);
console.log(`Ask Depth: ${askDepth.toFixed(2)} SOL`);
});
// Start subscription
await orderbookManager.subscribe();
// Switch to different market after 30 seconds
setTimeout(() => {
console.log('Switching to BTC-PERP...');
orderbookManager.updateSubscription({
marketId: MarketId.createPerpMarket(1), // BTC-PERP
grouping: 1.0, // Wider grouping for BTC
});
}, 30000);
// Cleanup after 60 seconds
setTimeout(() => {
subscription.unsubscribe();
orderbookManager.destroy();
console.log('Orderbook manager destroyed');
}, 60000);