diff --git a/src/exchanges/lighter/gateway.ts b/src/exchanges/lighter/gateway.ts index d632e69..98c327f 100644 --- a/src/exchanges/lighter/gateway.ts +++ b/src/exchanges/lighter/gateway.ts @@ -541,8 +541,8 @@ export class LighterGateway { const snapshot: LighterOrderBookSnapshot = { market_id: this.marketId ?? 0, offset: message.order_book.offset ?? Date.now(), - bids: normalizeLevels(message.order_book.bids ?? []), - asks: normalizeLevels(message.order_book.asks ?? []), + bids: sortAndTrimLevels(normalizeLevels(message.order_book.bids ?? []), "bid"), + asks: sortAndTrimLevels(normalizeLevels(message.order_book.asks ?? []), "ask"), }; this.orderBook = snapshot; this.lastOrderBookOffset = snapshot.offset ?? incomingOffset ?? this.lastOrderBookOffset; @@ -564,11 +564,11 @@ export class LighterGateway { if (!update) return; if (Array.isArray(update.asks)) { const asks = normalizeLevels(update.asks); - this.orderBook.asks = mergeLevels(this.orderBook.asks ?? [], asks); + this.orderBook.asks = sortAndTrimLevels(mergeLevels(this.orderBook.asks ?? [], asks), "ask"); } if (Array.isArray(update.bids)) { const bids = normalizeLevels(update.bids); - this.orderBook.bids = mergeLevels(this.orderBook.bids ?? [], bids); + this.orderBook.bids = sortAndTrimLevels(mergeLevels(this.orderBook.bids ?? [], bids), "bid"); } this.orderBook.offset = update.offset ?? this.orderBook.offset; this.lastOrderBookOffset = Number(this.orderBook.offset ?? incomingOffset ?? this.lastOrderBookOffset); @@ -892,6 +892,22 @@ function normalizeLevels(raw: Array lvl.price != null && lvl.size != null); } +// Ensure correct side ordering and limit depth size +function sortAndTrimLevels( + levels: LighterOrderBookLevel[] | undefined, + side: "bid" | "ask", + limit: number = 200 +): LighterOrderBookLevel[] { + const list = Array.isArray(levels) ? levels.slice() : []; + list.sort((a, b) => { + const pa = Number(a.price); + const pb = Number(b.price); + if (!Number.isFinite(pa) || !Number.isFinite(pb)) return 0; + return side === "bid" ? pb - pa : pa - pb; + }); + return list.slice(0, Math.max(1, limit)); +} + function mapOrderType(type: OrderType): number { switch (type) { case "MARKET":