From 173dd634d82b80fbad17e5fd85b3a31b856e8461 Mon Sep 17 00:00:00 2001 From: AnuragR3k Date: Tue, 22 Sep 2026 22:50:02 +0530 Subject: [PATCH] fix: normalize Binance ticker symbols --- core/src/feeds/binance/binance-feed.ts | 4 +- core/test/unit/dataFeeds.core.test.ts | 59 +++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 3 deletions(-) diff --git a/core/src/feeds/binance/binance-feed.ts b/core/src/feeds/binance/binance-feed.ts index a9020cb6..49f24193 100644 --- a/core/src/feeds/binance/binance-feed.ts +++ b/core/src/feeds/binance/binance-feed.ts @@ -100,7 +100,7 @@ export class BinanceFeed extends BaseDataFeed { } protected async fetchTickerImpl(symbol: string): Promise { - const cached = this.latestTickers.get(symbol); + const cached = this.latestTickers.get(symbol.toUpperCase()); if (cached) return cached; await this.ensureConnected(); @@ -130,7 +130,7 @@ export class BinanceFeed extends BaseDataFeed { } protected watchTickerImpl(symbol: string, callback: (ticker: Ticker) => void): () => void { - const sub: Subscription = { symbol, callback }; + const sub: Subscription = { symbol: symbol.toUpperCase(), callback }; this.subscriptions.push(sub); this.ensureConnected().catch((err: unknown) => { logger.error('[BinanceFeed] initial connect failed in watchTickerImpl', { diff --git a/core/test/unit/dataFeeds.core.test.ts b/core/test/unit/dataFeeds.core.test.ts index aa30892c..bc6a9250 100644 --- a/core/test/unit/dataFeeds.core.test.ts +++ b/core/test/unit/dataFeeds.core.test.ts @@ -1,6 +1,16 @@ import { ExchangeNotAvailable, NotSupported } from '../../src/errors'; import { BinanceFeed } from '../../src/feeds/binance'; import { ChainlinkFeed } from '../../src/feeds/chainlink/chainlink-feed'; +import { Ticker } from '../../src/feeds/types'; + +class TestBinanceFeed extends BinanceFeed { + subscribe(symbol: string, callback: (ticker: Ticker) => void) { + return this.watchTickerImpl(symbol, callback); + } + setCachedTicker(ticker: Ticker) { + (this as any).latestTickers.set(ticker.symbol, ticker); + } +} describe('Data feed backend errors', () => { test('Binance fetchTicker names the missing relay URL setting', async () => { @@ -22,6 +32,53 @@ describe('Data feed backend errors', () => { } satisfies Partial); }); + test('Binance watchTicker normalizes symbol case', async () => { + const feed = new TestBinanceFeed({ wsUrl: '', apiKey: '' }); + const callback = jest.fn<(ticker: Ticker) => void>(); + + feed.subscribe('btc/usdt', callback); + + const subscriptions = (feed as any).subscriptions; + + expect(subscriptions[0].symbol).toBe('BTC/USDT'); + + await feed.close(); + }); + + test('Binance fetchTicker normalizes symbol case', async () => { + const feed = new TestBinanceFeed({ wsUrl: '', apiKey: '' }); + const ticker = { + symbol: 'BTC/USDT', + info: {}, + timestamp: undefined, + datetime: undefined, + high: undefined, + low: undefined, + bid: undefined, + bidVolume: undefined, + ask: undefined, + askVolume: undefined, + vwap: undefined, + open: undefined, + close: 50000, + last: 50000, + previousClose: undefined, + change: undefined, + percentage: undefined, + average: undefined, + quoteVolume: undefined, + baseVolume: undefined, + indexPrice: undefined, + markPrice: undefined, + } satisfies Ticker; + + feed.setCachedTicker(ticker); + + await expect(feed.fetchTicker('btc/usdt')).resolves.toBe(ticker); + + await feed.close(); + }); + test('Chainlink oracle calls name the missing REST API URL setting', async () => { const feed = new ChainlinkFeed({ baseUrl: '', apiKey: '', wsUrl: '' }); @@ -40,4 +97,4 @@ describe('Data feed backend errors', () => { status: 501, } satisfies Partial); }); -}); +}); \ No newline at end of file