From 54990c902f1de5fed61fe6eb852dfdb0211781e8 Mon Sep 17 00:00:00 2001 From: Adam Fraser Date: Wed, 5 Feb 2025 14:32:18 -0500 Subject: [PATCH] Remove unused orderbook-mid-price --- .../caches/orderbook-mid-prices-cache.test.ts | 331 ------------------ .../src/caches/orderbook-mid-prices-cache.ts | 197 ----------- indexer/packages/redis/src/index.ts | 1 - .../tasks/cache-orderbook-mid-prices.test.ts | 95 ----- indexer/services/roundtable/src/index.ts | 7 - .../src/tasks/cache-orderbook-mid-prices.ts | 52 --- .../roundtable/src/tasks/market-updater.ts | 9 +- 7 files changed, 1 insertion(+), 691 deletions(-) delete mode 100644 indexer/packages/redis/__tests__/caches/orderbook-mid-prices-cache.test.ts delete mode 100644 indexer/packages/redis/src/caches/orderbook-mid-prices-cache.ts delete mode 100644 indexer/services/roundtable/__tests__/tasks/cache-orderbook-mid-prices.test.ts delete mode 100644 indexer/services/roundtable/src/tasks/cache-orderbook-mid-prices.ts diff --git a/indexer/packages/redis/__tests__/caches/orderbook-mid-prices-cache.test.ts b/indexer/packages/redis/__tests__/caches/orderbook-mid-prices-cache.test.ts deleted file mode 100644 index 4ea457764c8..00000000000 --- a/indexer/packages/redis/__tests__/caches/orderbook-mid-prices-cache.test.ts +++ /dev/null @@ -1,331 +0,0 @@ -import { deleteAllAsync } from '../../src/helpers/redis'; -import { redis as client } from '../helpers/utils'; -import { - fetchAndCacheOrderbookMidPrices, - getMedianPrices, - ORDERBOOK_MID_PRICES_CACHE_KEY_PREFIX, -} from '../../src/caches/orderbook-mid-prices-cache'; -import * as OrderbookLevelsCache from '../../src/caches/orderbook-levels-cache'; - -// Mock the OrderbookLevelsCache module -jest.mock('../../src/caches/orderbook-levels-cache', () => ({ - getOrderBookMidPrice: jest.fn(), -})); - -describe('orderbook-mid-prices-cache', () => { - const defaultTicker: string = 'BTC-USD'; - - // Helper function to set a price for a given market ticker - const setPrice = (marketTicker: string, price: string) => { - const now = Date.now(); - client.zadd(`${ORDERBOOK_MID_PRICES_CACHE_KEY_PREFIX}${marketTicker}`, now, price); - }; - - afterAll(async () => { - await deleteAllAsync(client); - }); - - beforeEach(async () => { - await deleteAllAsync(client); - jest.resetAllMocks(); - (OrderbookLevelsCache.getOrderBookMidPrice as jest.Mock).mockReset(); - }); - - describe('fetchAndCacheOrderbookMidPrices', () => { - it('sets a price for a ticker', async () => { - (OrderbookLevelsCache.getOrderBookMidPrice as jest.Mock).mockResolvedValue('50000'); - - await fetchAndCacheOrderbookMidPrices(client, [defaultTicker]); - - expect(OrderbookLevelsCache.getOrderBookMidPrice).toHaveBeenCalledTimes(1); - expect(OrderbookLevelsCache.getOrderBookMidPrice).toHaveBeenCalledWith( - defaultTicker, - client, - ); - - client.zrange( - `${ORDERBOOK_MID_PRICES_CACHE_KEY_PREFIX}${defaultTicker}`, - 0, - -1, - (_: any, response: string[]) => { - expect(response[0]).toBe('50000'); - }, - ); - }); - - it('sets multiple prices for a ticker', async () => { - const mockPrices = ['49000', '50000', '51000']; - for (const price of mockPrices) { - (OrderbookLevelsCache.getOrderBookMidPrice as jest.Mock).mockResolvedValue(price); - await fetchAndCacheOrderbookMidPrices(client, [defaultTicker]); - } - - client.zrange( - `${ORDERBOOK_MID_PRICES_CACHE_KEY_PREFIX}${defaultTicker}`, - 0, - -1, - (_: any, response: string[]) => { - expect(response).toEqual(mockPrices); - }, - ); - expect(OrderbookLevelsCache.getOrderBookMidPrice).toHaveBeenCalledTimes(3); - }); - - it('sets prices for multiple tickers', async () => { - const ticker2 = 'SHIB-USD'; - const ticker3 = 'SOL-USD'; - const mockPrices = { - [defaultTicker]: '49000', - [ticker2]: '50000', - [ticker3]: '51000', - }; - - // Mock the getOrderBookMidPrice function for each ticker - (OrderbookLevelsCache.getOrderBookMidPrice as jest.Mock) - .mockResolvedValueOnce(mockPrices[defaultTicker]) - .mockResolvedValueOnce(mockPrices[ticker2]) - .mockResolvedValueOnce(mockPrices[ticker3]); - - await fetchAndCacheOrderbookMidPrices(client, [defaultTicker, ticker2, ticker3]); - expect(OrderbookLevelsCache.getOrderBookMidPrice).toHaveBeenCalledTimes(3); - - for (const [key, price] of Object.entries(mockPrices)) { - client.zrange(`${ORDERBOOK_MID_PRICES_CACHE_KEY_PREFIX}${key}`, - 0, - -1, - (err: Error, res: string[]) => { - expect(res).toHaveLength(1); - expect(res[0]).toEqual(price); - }); - } - }); - }); - - describe('getMedianPrice', () => { - - it('returns null when no prices are set', async () => { - const result: {[ticker: string]: string | undefined} = await getMedianPrices( - client, - [defaultTicker], - ); - expect(result).toEqual({ 'BTC-USD': undefined }); - }); - - it('returns the median price for odd number of prices', async () => { - setPrice(defaultTicker, '51000'); - setPrice(defaultTicker, '50000'); - setPrice(defaultTicker, '49000'); - - const result: {[ticker: string]: string | undefined} = await getMedianPrices( - client, - [defaultTicker], - ); - expect(result).toEqual({ 'BTC-USD': '50000' }); - }); - - it('returns the median price for even number of prices', async () => { - setPrice(defaultTicker, '50000'); - setPrice(defaultTicker, '51000'); - setPrice(defaultTicker, '49000'); - setPrice(defaultTicker, '52000'); - - const result: {[ticker: string]: string | undefined} = await getMedianPrices( - client, - [defaultTicker], - ); - expect(result).toEqual({ 'BTC-USD': '50500' }); - }); - - it('returns the correct median price after 60 seconds', async () => { - jest.useFakeTimers(); - // Mock the getOrderBookMidPrice function for the ticker - const mockPrices: string[] = ['50000', '51000', '49000', '48000', '52000', '53000']; - - (OrderbookLevelsCache.getOrderBookMidPrice as jest.Mock) - .mockResolvedValueOnce(mockPrices[0]) - .mockResolvedValueOnce(mockPrices[1]) - .mockResolvedValueOnce(mockPrices[2]) - .mockResolvedValueOnce(mockPrices[3]) - .mockResolvedValueOnce(mockPrices[4]) - .mockResolvedValueOnce(mockPrices[5]); - - // Fetch and cache initial prices - await fetchAndCacheOrderbookMidPrices(client, [defaultTicker, defaultTicker]); - expect(OrderbookLevelsCache.getOrderBookMidPrice).toHaveBeenCalledTimes(2); - - // Advance time and fetch more prices - jest.advanceTimersByTime(61000); // Advance time by 61 seconds - await fetchAndCacheOrderbookMidPrices( - client, - [defaultTicker, defaultTicker, defaultTicker, defaultTicker], - ); - - client.zrange(`${ORDERBOOK_MID_PRICES_CACHE_KEY_PREFIX}${defaultTicker}`, - 0, - -1, - (err: Error, res: string[]) => { - expect(res).toHaveLength(4); - }); - expect(OrderbookLevelsCache.getOrderBookMidPrice).toHaveBeenCalledTimes(6); - - // Check the median price - const result:{[ticker: string]: string | undefined} = await getMedianPrices( - client, - [defaultTicker], - ); - // Median of last 4 prices, as first two should have expired after moving clock forward - expect(result).toEqual({ 'BTC-USD': '50500' }); - - jest.useRealTimers(); - }); - - it('returns the correct median price for small numbers with even number of prices', async () => { - setPrice(defaultTicker, '0.00000000002345'); - setPrice(defaultTicker, '0.00000000002346'); - - const midPrice1: { [ticker: string]: string | undefined } = await getMedianPrices( - client, - [defaultTicker], - ); - expect(midPrice1).toEqual({ 'BTC-USD': '0.000000000023455' }); - }); - - it('returns the correct median price for small numbers with odd number of prices', async () => { - setPrice(defaultTicker, '0.00000000001'); - setPrice(defaultTicker, '0.00000000002'); - setPrice(defaultTicker, '0.00000000003'); - setPrice(defaultTicker, '0.00000000004'); - setPrice(defaultTicker, '0.00000000005'); - - const midPrice1: { [ticker: string]: string | undefined } = await getMedianPrices( - client, - [defaultTicker], - ); - expect(midPrice1).toEqual({ 'BTC-USD': '0.00000000003' }); - - await deleteAllAsync(client); - - setPrice(defaultTicker, '0.00000847007'); - setPrice(defaultTicker, '0.00000847006'); - setPrice(defaultTicker, '0.00000847008'); - - const midPrice2: { [ticker: string]: string | undefined } = await getMedianPrices( - client, - [defaultTicker], - ); - expect(midPrice2).toEqual({ 'BTC-USD': '0.00000847007' }); - }); - }); - - describe('getMedianPrices for multiple markets', () => { - const btcUsdTicker = 'BTC-USD'; - const ethUsdTicker = 'ETH-USD'; - const solUsdTicker = 'SOL-USD'; - - beforeEach(async () => { - await deleteAllAsync(client); - }); - - it('returns correct median prices for multiple markets with odd number of prices', async () => { - // Set prices for BTC-USD - setPrice(btcUsdTicker, '50000'); - setPrice(btcUsdTicker, '51000'); - setPrice(btcUsdTicker, '49000'); - - // Set prices for ETH-USD - setPrice(ethUsdTicker, '3000'); - setPrice(ethUsdTicker, '3100'); - setPrice(ethUsdTicker, '2900'); - - // Set prices for SOL-USD - setPrice(solUsdTicker, '100'); - setPrice(solUsdTicker, '102'); - setPrice(solUsdTicker, '98'); - - const result: { [ticker: string]: string | undefined } = await getMedianPrices( - client, - [btcUsdTicker, ethUsdTicker, solUsdTicker], - ); - expect(result).toEqual({ - 'BTC-USD': '50000', - 'ETH-USD': '3000', - 'SOL-USD': '100', - }); - }); - - it('returns correct median prices for multiple markets with even number of prices', async () => { - // Set prices for BTC-USD - setPrice(btcUsdTicker, '50000'); - setPrice(btcUsdTicker, '51000'); - setPrice(btcUsdTicker, '49000'); - setPrice(btcUsdTicker, '52000'); - - // Set prices for ETH-USD - setPrice(ethUsdTicker, '3000'); - setPrice(ethUsdTicker, '3100'); - setPrice(ethUsdTicker, '2900'); - setPrice(ethUsdTicker, '3200'); - - const result: { [ticker: string]: string | undefined } = await getMedianPrices( - client, - [btcUsdTicker, ethUsdTicker], - ); - expect(result).toEqual({ - 'BTC-USD': '50500', - 'ETH-USD': '3050', - }); - }); - - it('handles markets with different numbers of prices', async () => { - // Set prices for BTC-USD (odd number) - setPrice(btcUsdTicker, '50000'); - setPrice(btcUsdTicker, '51000'); - setPrice(btcUsdTicker, '49000'); - - // Set prices for ETH-USD (even number) - setPrice(ethUsdTicker, '3000'); - setPrice(ethUsdTicker, '3100'); - setPrice(ethUsdTicker, '2900'); - setPrice(ethUsdTicker, '3200'); - - // Set no prices for SOL-USD - - const result: { [ticker: string]: string | undefined } = await getMedianPrices( - client, - [btcUsdTicker, ethUsdTicker, solUsdTicker], - ); - expect(result).toEqual({ - 'BTC-USD': '50000', - 'ETH-USD': '3050', - 'SOL-USD': undefined, - }); - }); - - it('calculates correct median prices for markets with small and large numbers', async () => { - // Set prices for BTC-USD (large numbers) - setPrice(btcUsdTicker, '50000.12345'); - setPrice(btcUsdTicker, '50000.12346'); - - // Set prices for ETH-USD (medium numbers) - setPrice(ethUsdTicker, '3000.5'); - setPrice(ethUsdTicker, '3000.6'); - setPrice(ethUsdTicker, '3000.7'); - - // Set prices for SOL-USD (small numbers) - setPrice(solUsdTicker, '0.00000123'); - setPrice(solUsdTicker, '0.00000124'); - setPrice(solUsdTicker, '0.00000125'); - setPrice(solUsdTicker, '0.00000126'); - - const result: { [ticker: string]: string | undefined } = await getMedianPrices( - client, - [btcUsdTicker, ethUsdTicker, solUsdTicker], - ); - expect(result).toEqual({ - 'BTC-USD': '50000.123455', - 'ETH-USD': '3000.6', - 'SOL-USD': '0.000001245', - }); - }); - }); -}); diff --git a/indexer/packages/redis/src/caches/orderbook-mid-prices-cache.ts b/indexer/packages/redis/src/caches/orderbook-mid-prices-cache.ts deleted file mode 100644 index 62d6484df9c..00000000000 --- a/indexer/packages/redis/src/caches/orderbook-mid-prices-cache.ts +++ /dev/null @@ -1,197 +0,0 @@ -import { logger } from '@dydxprotocol-indexer/base'; -import { PerpetualMarketFromDatabase, PriceMap } from '@dydxprotocol-indexer/postgres'; -import Big from 'big.js'; -import { Callback, RedisClient } from 'redis'; - -import { getOrderBookMidPrice } from './orderbook-levels-cache'; -import { - addOrderbookMidPricesScript, - getOrderbookMidPricesScript, -} from './scripts'; - -// Cache of orderbook prices for each clob pair -// Each price is cached for a 5 second window and in a ZSET -export const ORDERBOOK_MID_PRICES_CACHE_KEY_PREFIX: string = 'v4/orderbook_mid_prices/'; - -/** - * Generates a cache key for a given ticker's orderbook mid price. - * @param ticker The ticker symbol - * @returns The cache key string - */ -function getOrderbookMidPriceCacheKey(ticker: string): string { - return `${ORDERBOOK_MID_PRICES_CACHE_KEY_PREFIX}${ticker}`; -} - -export async function cacheOraclePrices( - client: RedisClient, - markets: PerpetualMarketFromDatabase[], - prices: PriceMap, -): Promise { - const cacheKeyPricePairs: - ({cacheKey: string, price: string})[] = markets.flatMap((market) => { - const cacheKey: string = getOrderbookMidPriceCacheKey(market.ticker); - const price = prices[market.marketId]; - - return price !== undefined ? { cacheKey, price } : []; - }); - - // Extract cache keys and prices - const { priceCacheKeys, priceValues } = cacheKeyPricePairs.reduce( - (acc, pair) => { - acc.priceCacheKeys.push(pair.cacheKey); - acc.priceValues.push(pair.price); - return acc; - }, - { priceCacheKeys: [] as string[], priceValues: [] as string[] }, - ); - - const nowSeconds: number = Math.floor(Date.now() / 1000); // Current time in seconds - - logger.info({ - at: 'orderbook-mid-prices-cache#cacheOraclePrices', - message: 'Caching orderbook mid price', - cacheKey: priceCacheKeys[0], - midPrice: priceValues[0], - }); - - return new Promise((resolve, reject) => { - client.evalsha( - addOrderbookMidPricesScript.hash, - priceCacheKeys.length, - ...priceCacheKeys, - ...priceValues, - nowSeconds, - (err: Error | null) => { - if (err) { - reject(err); - } else { - resolve(); - } - }, - ); - }); -} - -/** - * Fetches and caches mid prices for multiple tickers. - * @param client The Redis client - * @param tickers An array of ticker symbols - * @returns A promise that resolves when all prices are fetched and cached - */ -export async function fetchAndCacheOrderbookMidPrices( - client: RedisClient, - tickers: string[], -): Promise { - // Fetch midPrices and filter out undefined values - const cacheKeyPricePairs: ({ cacheKey: string, midPrice: string } | null)[] = await Promise.all( - tickers.map(async (ticker) => { - const cacheKey: string = getOrderbookMidPriceCacheKey(ticker); - const midPrice: string | undefined = await getOrderBookMidPrice(ticker, client); - if (midPrice !== undefined) { - return { cacheKey, midPrice }; - } - return null; - }), - ); - - // Filter out null values - const validPairs: { cacheKey: string, midPrice: string }[] = cacheKeyPricePairs.filter( - (pair): pair is { cacheKey: string, midPrice: string } => pair !== null, - ); - if (validPairs.length === 0) { - // No valid midPrices to cache - return; - } - - const nowSeconds: number = Math.floor(Date.now() / 1000); // Current time in seconds - // Extract cache keys and prices - const priceValues: string[] = validPairs.map((pair) => pair.midPrice); - const priceCacheKeys: string[] = validPairs.map((pair) => { - - logger.info({ - at: 'orderbook-mid-prices-cache#fetchAndCacheOrderbookMidPrices', - message: 'Caching orderbook mid price', - cacheKey: pair.cacheKey, - midPrice: pair.midPrice, - }); - return pair.cacheKey; - }); - - return new Promise((resolve, reject) => { - client.evalsha( - addOrderbookMidPricesScript.hash, - priceCacheKeys.length, - ...priceCacheKeys, - ...priceValues, - nowSeconds, - (err: Error | null) => { - if (err) { - reject(err); - } else { - resolve(); - } - }, - ); - }); -} - -/** - * Retrieves the median prices for a given array of tickers from the cache. - * @param client The Redis client - * @param tickers Array of ticker symbols - * @returns A promise that resolves with an object mapping tickers - * to their median prices (as strings) or undefined if not found - */ -export async function getMedianPrices( - client: RedisClient, - tickers: string[], -): Promise<{ [ticker: string]: string | undefined }> { - - let evalAsync: ( - marketCacheKeys: string[], - ) => Promise = ( - marketCacheKeys, - ) => { - return new Promise((resolve, reject) => { - const callback: Callback = ( - err: Error | null, - results: string[], - ) => { - if (err) { - return reject(err); - } - return resolve(results); - }; - - client.evalsha( - getOrderbookMidPricesScript.hash, // The Lua script to get cached prices - marketCacheKeys.length, - ...marketCacheKeys, - callback, - ); - }); - }; - evalAsync = evalAsync.bind(client); - - // Map tickers to cache keys - const marketCacheKeys: string[] = tickers.map(getOrderbookMidPriceCacheKey); - // Fetch the prices arrays from Redis (without scores) - const pricesArray: string[] = await evalAsync(marketCacheKeys); - - const result: { [ticker: string]: string | undefined } = {}; - tickers.forEach((ticker, index) => { - const price = pricesArray[index]; - - // Check if there are any prices - if (!price || price.length === 0) { - result[ticker] = undefined; - return; - } - - // Convert the prices to Big.js objects for precision - const bigPrice = Big(price); - result[ticker] = bigPrice.toFixed(); - }); - - return result; -} diff --git a/indexer/packages/redis/src/index.ts b/indexer/packages/redis/src/index.ts index 5c7aeed1037..2ce64e9b889 100644 --- a/indexer/packages/redis/src/index.ts +++ b/indexer/packages/redis/src/index.ts @@ -12,7 +12,6 @@ export * as CanceledOrdersCache from './caches/canceled-orders-cache'; export * as StatefulOrderUpdatesCache from './caches/stateful-order-updates-cache'; export * as StateFilledQuantumsCache from './caches/state-filled-quantums-cache'; export * as LeaderboardPnlProcessedCache from './caches/leaderboard-processed-cache'; -export * as OrderbookMidPricesCache from './caches/orderbook-mid-prices-cache'; export { placeOrder } from './caches/place-order'; export { removeOrder } from './caches/remove-order'; export { updateOrder } from './caches/update-order'; diff --git a/indexer/services/roundtable/__tests__/tasks/cache-orderbook-mid-prices.test.ts b/indexer/services/roundtable/__tests__/tasks/cache-orderbook-mid-prices.test.ts deleted file mode 100644 index 84ffc577e00..00000000000 --- a/indexer/services/roundtable/__tests__/tasks/cache-orderbook-mid-prices.test.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { - dbHelpers, - PerpetualMarketFromDatabase, - PerpetualMarketTable, - testConstants, - testMocks, - perpetualMarketRefresher, -} from '@dydxprotocol-indexer/postgres'; -import { - OrderbookLevelsCache, - OrderbookMidPricesCache, - redis, -} from '@dydxprotocol-indexer/redis'; -import { redisClient } from '../../src/helpers/redis'; -import runTask from '../../src/tasks/cache-orderbook-mid-prices'; - -describe('cache-orderbook-mid-prices', () => { - beforeEach(async () => { - await redis.deleteAllAsync(redisClient); - await testMocks.seedData(); - await perpetualMarketRefresher.updatePerpetualMarkets(); - }); - - afterAll(() => { - jest.restoreAllMocks(); - }); - - beforeAll(async () => { - await dbHelpers.migrate(); - await dbHelpers.clearData(); - }); - - afterEach(async () => { - await dbHelpers.clearData(); - await perpetualMarketRefresher.clear(); - }); - - it('caches mid prices for all markets', async () => { - const market1: PerpetualMarketFromDatabase | undefined = await PerpetualMarketTable - .findByMarketId( - testConstants.defaultMarket.id, - ); - const market2: PerpetualMarketFromDatabase | undefined = await PerpetualMarketTable - .findByMarketId( - testConstants.defaultMarket2.id, - ); - const market3: PerpetualMarketFromDatabase | undefined = await PerpetualMarketTable - .findByMarketId( - testConstants.defaultMarket3.id, - ); - if (!market1 || !market2 || !market3) { - throw new Error('Test market not found'); - } - - jest.spyOn(OrderbookLevelsCache, 'getOrderBookMidPrice') - .mockReturnValueOnce(Promise.resolve('200')) - .mockReturnValueOnce(Promise.resolve('300')) - .mockReturnValueOnce(Promise.resolve('400')); - - await runTask(); - expect(OrderbookLevelsCache.getOrderBookMidPrice).toHaveBeenCalledTimes(5); - - const prices: {[ticker: string]: string | undefined} = await - OrderbookMidPricesCache.getMedianPrices( - redisClient, - [market1.ticker, market2.ticker, market3.ticker], - ); - - expect(prices[market1.ticker]).toBe('200'); - expect(prices[market2.ticker]).toBe('300'); - expect(prices[market3.ticker]).toBe('400'); - }); - - it('handles undefined prices', async () => { - const market1 = await PerpetualMarketTable - .findByMarketId( - testConstants.defaultMarket.id, - ); - - if (!market1) { - throw new Error('Market 1 not found'); - } - - jest.spyOn(PerpetualMarketTable, 'findAll') - .mockReturnValueOnce(Promise.resolve([market1] as PerpetualMarketFromDatabase[])); - - jest.spyOn(OrderbookLevelsCache, 'getOrderBookMidPrice') - .mockReturnValueOnce(Promise.resolve(undefined)); - - await runTask(); - - const price = await OrderbookMidPricesCache.getMedianPrices(redisClient, [market1.ticker]); - expect(price).toEqual({ 'BTC-USD': undefined }); - }); -}); diff --git a/indexer/services/roundtable/src/index.ts b/indexer/services/roundtable/src/index.ts index d646ac4a02f..5a2db7c7283 100644 --- a/indexer/services/roundtable/src/index.ts +++ b/indexer/services/roundtable/src/index.ts @@ -280,13 +280,6 @@ async function start(): Promise { config.LOOPS_INTERVAL_MS_REFRESH_VAULT_PNL, ); } - // if (config.LOOPS_ENABLED_CACHE_ORDERBOOK_MID_PRICES) { - // startLoop( - // cacheOrderbookMidPrices, - // 'cache-orderbook-mid-prices', - // config.LOOPS_INTERVAL_MS_CACHE_ORDERBOOK_MID_PRICES, - // ); - // } logger.info({ at: 'index', diff --git a/indexer/services/roundtable/src/tasks/cache-orderbook-mid-prices.ts b/indexer/services/roundtable/src/tasks/cache-orderbook-mid-prices.ts deleted file mode 100644 index 3705d07d3af..00000000000 --- a/indexer/services/roundtable/src/tasks/cache-orderbook-mid-prices.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { - logger, -} from '@dydxprotocol-indexer/base'; -import { - PerpetualMarketFromDatabase, - perpetualMarketRefresher, -} from '@dydxprotocol-indexer/postgres'; -import { - OrderbookMidPricesCache, -} from '@dydxprotocol-indexer/redis'; - -import { redisClient } from '../helpers/redis'; - -/** - * Updates OrderbookMidPricesCache with current orderbook mid price for each market - */ -export default async function runTask(): Promise { - try { - let perpetualMarkets: PerpetualMarketFromDatabase[] = Object.values( - perpetualMarketRefresher.getPerpetualMarketsMap(), - ); - let marketTickers: string[] = perpetualMarkets.map( - (market: PerpetualMarketFromDatabase) => market.ticker, - ); - - // If no markets found, try updating the perpetual markets cache and fetch again - if (marketTickers.length === 0) { - await perpetualMarketRefresher.updatePerpetualMarkets(); - perpetualMarkets = Object.values(perpetualMarketRefresher.getPerpetualMarketsMap()); - marketTickers = perpetualMarkets.map( - (market: PerpetualMarketFromDatabase) => market.ticker, - ); - - if (marketTickers.length === 0) { - throw new Error('perpetualMarketRefresher is empty'); - } - } - - logger.info({ - at: 'cache-orderbook-mid-prices#runTask', - message: 'Caching orderbook mid prices for markets', - markets: marketTickers.join(', '), - }); - await OrderbookMidPricesCache.fetchAndCacheOrderbookMidPrices(redisClient, marketTickers); - } catch (error) { - logger.error({ - at: 'cache-orderbook-mid-prices#runTask', - message: (error as Error).message, - error, - }); - } -} diff --git a/indexer/services/roundtable/src/tasks/market-updater.ts b/indexer/services/roundtable/src/tasks/market-updater.ts index 3a057c1f01c..ab6d2ea30ec 100644 --- a/indexer/services/roundtable/src/tasks/market-updater.ts +++ b/indexer/services/roundtable/src/tasks/market-updater.ts @@ -17,7 +17,7 @@ import { LiquidityTiersFromDatabase, LiquidityTiersTable, LiquidityTiersMap, LiquidityTiersColumns, } from '@dydxprotocol-indexer/postgres'; -import { NextFundingCache, OrderbookMidPricesCache } from '@dydxprotocol-indexer/redis'; +import { NextFundingCache } from '@dydxprotocol-indexer/redis'; import Big from 'big.js'; import _ from 'lodash'; @@ -79,13 +79,6 @@ export default async function runTask(): Promise { Date.now() - start, ); - await OrderbookMidPricesCache.cacheOraclePrices(redisClient, perpetualMarkets, latestPrices); - const count = perpetualMarkets.length; - logger.info({ - at: 'market_updater#cache_oracle_prices', - message: `Caching prices for ${count} markets`, - }); - const clobPairIdToPerpetualMarketId: _.Dictionary = _.chain(perpetualMarkets) .keyBy(PerpetualMarketColumns.clobPairId) .mapValues(PerpetualMarketColumns.id)