From 2c479b5f9150086a2c8821f8d855cfd103a7ee3d Mon Sep 17 00:00:00 2001 From: micky Date: Fri, 13 Sep 2024 20:27:16 +0200 Subject: [PATCH 1/2] Revert "rollout static markets exp" This reverts commit c43c2a07cac9a372cf95bffbe2ea9b178566ee45. --- src/domain/synthetics/markets/useMarkets.ts | 95 +++++++++++++++++-- .../markets/useMarketsInfoRequest/index.ts | 4 +- 2 files changed, 91 insertions(+), 8 deletions(-) diff --git a/src/domain/synthetics/markets/useMarkets.ts b/src/domain/synthetics/markets/useMarkets.ts index 992ae8aa09..8306d66ab5 100644 --- a/src/domain/synthetics/markets/useMarkets.ts +++ b/src/domain/synthetics/markets/useMarkets.ts @@ -1,12 +1,18 @@ import { useMemo } from "react"; import { ethers } from "ethers"; +import { getContract } from "config/contracts"; import { isMarketEnabled } from "config/markets"; import { convertTokenAddress, getToken } from "config/tokens"; +import { useMulticall } from "lib/multicall"; +import { CONFIG_UPDATE_INTERVAL } from "lib/timeConstants"; +import { getIsFlagEnabled } from "config/ab"; import { MarketsData } from "./types"; import { getMarketFullName } from "./utils"; +import SyntheticsReader from "abis/SyntheticsReader.json"; + import { MARKETS } from "config/markets"; export type MarketsResult = { @@ -15,15 +21,20 @@ export type MarketsResult = { error?: Error | undefined; }; +const MARKETS_COUNT = 100; + export function useMarkets(chainId: number): MarketsResult { - return useMemo(() => { - const markets = MARKETS[chainId]; + const staticMarketData = useMemo(() => { + const enabledMarkets = MARKETS[chainId]; + + if (!enabledMarkets) { + // eslint-disable-next-line no-console + console.warn(`Static markets data for chain ${chainId} not found`); - if (!markets) { - throw new Error(`Static markets data for chain ${chainId} not found`); + return null; } - return Object.values(markets).reduce( + return Object.values(enabledMarkets).reduce( (acc: MarketsResult, enabledMarketConfig) => { const market = enabledMarketConfig; @@ -56,7 +67,79 @@ export function useMarkets(chainId: number): MarketsResult { return acc; }, - { marketsData: {}, marketsAddresses: [] } + { marketsData: {}, marketsAddresses: [], error: undefined } ); }, [chainId]); + + const shouldUseStaticMarketKeys = staticMarketData && getIsFlagEnabled("testPrebuiltMarkets"); + + const freshData = useMarketsMulticall(chainId, { enabled: !shouldUseStaticMarketKeys }); + + return shouldUseStaticMarketKeys ? staticMarketData : freshData; +} + +function useMarketsMulticall(chainId: number, { enabled = true } = {}): MarketsResult { + const { data, error } = useMulticall(chainId, "useMarketsData", { + key: enabled ? [] : null, + + refreshInterval: CONFIG_UPDATE_INTERVAL, + + request: () => ({ + reader: { + contractAddress: getContract(chainId, "SyntheticsReader"), + abi: SyntheticsReader.abi, + calls: { + markets: { + methodName: "getMarkets", + params: [getContract(chainId, "DataStore"), 0, MARKETS_COUNT], + }, + }, + }, + }), + parseResponse: (res) => { + return res.data.reader.markets.returnValues.reduce( + (acc: { marketsData: MarketsData; marketsAddresses: string[] }, marketValues) => { + if (!isMarketEnabled(chainId, marketValues.marketToken)) { + return acc; + } + + try { + const indexToken = getToken(chainId, convertTokenAddress(chainId, marketValues.indexToken, "native")); + const longToken = getToken(chainId, marketValues.longToken); + const shortToken = getToken(chainId, marketValues.shortToken); + + const isSameCollaterals = marketValues.longToken === marketValues.shortToken; + const isSpotOnly = marketValues.indexToken === ethers.ZeroAddress; + + const name = getMarketFullName({ indexToken, longToken, shortToken, isSpotOnly }); + + acc.marketsData[marketValues.marketToken] = { + marketTokenAddress: marketValues.marketToken, + indexTokenAddress: marketValues.indexToken, + longTokenAddress: marketValues.longToken, + shortTokenAddress: marketValues.shortToken, + isSameCollaterals, + isSpotOnly, + name, + data: "", + }; + + acc.marketsAddresses.push(marketValues.marketToken); + } catch (e) { + // eslint-disable-next-line no-console + console.warn("unsupported market", e); + } + + return acc; + }, + { marketsData: {}, marketsAddresses: [] } + ); + }, + }); + + return { + marketsData: data?.marketsData, + marketsAddresses: data?.marketsAddresses, + error, + }; } diff --git a/src/domain/synthetics/markets/useMarketsInfoRequest/index.ts b/src/domain/synthetics/markets/useMarketsInfoRequest/index.ts index e44e6b0f8b..70ddc7a206 100644 --- a/src/domain/synthetics/markets/useMarketsInfoRequest/index.ts +++ b/src/domain/synthetics/markets/useMarketsInfoRequest/index.ts @@ -205,7 +205,7 @@ export type MarketConfigMulticallRequestConfig = MulticallRequestConfig<{ export function useMarketsInfoRequest(chainId: number): MarketsInfoResult { const { address: account } = useAccount(); - const { marketsData, marketsAddresses } = useMarkets(chainId); + const { marketsData, marketsAddresses, error: marketsError } = useMarkets(chainId); const { tokensData, pricesUpdatedAt, error: tokensDataError } = useTokensDataRequest(chainId); const isDependenciesLoading = !marketsAddresses || !tokensData; @@ -261,7 +261,7 @@ export function useMarketsInfoRequest(chainId: number): MarketsInfoResult { return data as MarketsInfoData; }, [marketsValues.data, marketsConfigs.data, marketsAddresses, marketsData, tokensData, chainId]); - const error = tokensDataError || marketsValues.error || marketsConfigs.error; + const error = marketsError || tokensDataError || marketsValues.error || marketsConfigs.error; return { marketsInfoData: isDependenciesLoading ? undefined : mergedData, From 5f86886f92c952ebc78eea0e3e09b00be37560aa Mon Sep 17 00:00:00 2001 From: micky Date: Fri, 13 Sep 2024 20:28:37 +0200 Subject: [PATCH 2/2] Revert "rollout rpc window fallback ab" This reverts commit 43f4de4e64aee6c86fe9636ab0bd76dd729b4b90. --- src/config/ab.ts | 3 ++- src/lib/multicall/Multicall.ts | 12 ++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/config/ab.ts b/src/config/ab.ts index cbcac80a61..b4c3dae08c 100644 --- a/src/config/ab.ts +++ b/src/config/ab.ts @@ -1,7 +1,7 @@ import mapValues from "lodash/mapValues"; import { AB_FLAG_STORAGE_KEY } from "./localStorage"; -type Flag = "testPrebuiltMarkets"; +type Flag = "testRpcWindowFallback" | "testPrebuiltMarkets"; type AbFlag = { enabled: boolean; @@ -12,6 +12,7 @@ type AbStorage = { }; const abFlagsConfig: Record = { + testRpcWindowFallback: 0.5, testPrebuiltMarkets: 0.5, }; diff --git a/src/lib/multicall/Multicall.ts b/src/lib/multicall/Multicall.ts index 7d67565508..1dd84418d3 100644 --- a/src/lib/multicall/Multicall.ts +++ b/src/lib/multicall/Multicall.ts @@ -282,7 +282,7 @@ export class Multicall { // eslint-disable-next-line no-console console.groupEnd(); - if (!isFallbackMode) { + if (!isFallbackMode && this.abFlags?.testRpcWindowFallback) { this.fallbackRpcSwitcher?.trigger(); } @@ -373,10 +373,14 @@ export class Multicall { isAlchemy: isFallbackMode, }); - if (!isFallbackMode) { - this.fallbackRpcSwitcher?.trigger(); + if (this.abFlags?.testRpcWindowFallback) { + if (!isFallbackMode) { + this.fallbackRpcSwitcher?.trigger(); + } + + return await fallbackMulticall(new Error("multicall fallback error")).then(processResponse); } - return await fallbackMulticall(new Error("multicall fallback error")).then(processResponse); + return result; } }