From 6921fb1cdd15f9162a331808400626495819ecc1 Mon Sep 17 00:00:00 2001 From: multipleof4 Date: Sun, 15 Mar 2026 14:40:21 -0700 Subject: [PATCH] Fix: empty markets fallback + rotation fix --- lib/market/tracker.js | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/lib/market/tracker.js b/lib/market/tracker.js index 75e487d..e75ea2e 100644 --- a/lib/market/tracker.js +++ b/lib/market/tracker.js @@ -2,6 +2,8 @@ import { getActiveBTCEvent, getEventMarkets, getOrderbook, getMarket } from '../ import { KalshiWS } from '../kalshi/websocket.js'; import { EventEmitter } from 'events'; +const OPEN_MARKET_STATUSES = new Set(['open', 'active', 'initialized', 'trading']); + /** * Tracks the currently active BTC 15-min market. * Auto-rotates when the current market expires. @@ -80,28 +82,41 @@ export class MarketTracker extends EventEmitter { async _findAndSubscribe() { try { const event = await getActiveBTCEvent(); + if (!event) { + if (!this.currentTicker) this.emit('update', null); console.log('[Tracker] No active BTC 15m event found. Retrying in 30s...'); return; } - const markets = event.markets || await getEventMarkets(event.event_ticker); - // Find the up/down market (usually only one market per event) - const market = markets.find(m => m.status === 'active' || m.status === 'open') || markets[0]; + const inlineMarkets = Array.isArray(event.markets) ? event.markets : []; + const markets = inlineMarkets.length ? inlineMarkets : await getEventMarkets(event.event_ticker); + + const market = markets.find((m) => OPEN_MARKET_STATUSES.has(String(m?.status || '').toLowerCase())) || markets[0]; if (!market) { - console.log('[Tracker] No active market in event. Retrying...'); + if (!this.currentTicker) { + this.currentEvent = event.event_ticker || null; + this.marketData = null; + this.orderbook = { yes: [], no: [] }; + this.emit('update', null); + } + console.log(`[Tracker] Event ${event.event_ticker} has no active market yet. Retrying...`); return; } const newTicker = market.ticker; + if (newTicker === this.currentTicker) { + this.currentEvent = event.event_ticker; + return; + } - if (newTicker === this.currentTicker) return; + const oldTicker = this.currentTicker; // Unsubscribe from old - if (this.currentTicker) { - console.log(`[Tracker] Rotating from ${this.currentTicker} → ${newTicker}`); - this.ws.unsubscribeTicker(this.currentTicker); + if (oldTicker) { + console.log(`[Tracker] Rotating from ${oldTicker} → ${newTicker}`); + this.ws.unsubscribeTicker(oldTicker); } this.currentTicker = newTicker; @@ -122,8 +137,7 @@ export class MarketTracker extends EventEmitter { console.log(`[Tracker] Now tracking: ${newTicker} (${market.title || market.subtitle})`); this.emit('update', this.getState()); - this.emit('market-rotated', { from: this.currentTicker, to: newTicker }); - + this.emit('market-rotated', { from: oldTicker, to: newTicker }); } catch (err) { console.error('[Tracker] Discovery error:', err.message); }