From f25224cfaef7f86d9e4dd0540673f9597ea48d88 Mon Sep 17 00:00:00 2001 From: memoyil <2213635+memoyil@users.noreply.github.com> Date: Sun, 16 Apr 2023 11:26:28 +0200 Subject: [PATCH] perf: Make common pairs unique --- apps/web/src/hooks/Trades.ts | 68 +++++++++++++++++------------- apps/web/src/hooks/useBUSDPrice.ts | 26 ++++++------ apps/web/src/hooks/usePairs.ts | 4 +- 3 files changed, 54 insertions(+), 44 deletions(-) diff --git a/apps/web/src/hooks/Trades.ts b/apps/web/src/hooks/Trades.ts index 0c4dde40d93255..dc3b15ce8b4e27 100644 --- a/apps/web/src/hooks/Trades.ts +++ b/apps/web/src/hooks/Trades.ts @@ -1,6 +1,7 @@ /* eslint-disable no-param-reassign */ import { Currency, CurrencyAmount, isTradeBetter, Pair, Token, Trade, TradeType } from '@pancakeswap/sdk' import flatMap from 'lodash/flatMap' +import uniqBy from 'lodash/uniqBy' import { useMemo } from 'react' import { useUserSingleHopOnly } from '@pancakeswap/utils/user' @@ -87,9 +88,9 @@ export function useAllCurrencyCombinations(currencyA?: Currency, currencyB?: Cur export function useAllCommonPairs(currencyA?: Currency, currencyB?: Currency): Pair[] { const { chainId } = useActiveChainId() - const [tokenA, tokenB] = chainId - ? [wrappedCurrency(currencyA, chainId), wrappedCurrency(currencyB, chainId)] - : [undefined, undefined] + const [tokenA, tokenB] = useMemo(() => { + return chainId ? [wrappedCurrency(currencyA, chainId), wrappedCurrency(currencyB, chainId)] : [undefined, undefined] + }, [currencyA, currencyB, chainId]) const bases: Token[] = useMemo(() => { if (!chainId) return [] @@ -109,32 +110,41 @@ export function useAllCommonPairs(currencyA?: Currency, currencyB?: Currency): P const allPairCombinations: [Token, Token][] = useMemo( () => tokenA && tokenB - ? [ - // the direct pair - [tokenA, tokenB], - // token A against all bases - ...bases.map((base): [Token, Token] => [tokenA, base]), - // token B against all bases - ...bases.map((base): [Token, Token] => [tokenB, base]), - // each base against all bases - ...basePairs, - ] - .filter((tokens): tokens is [Token, Token] => Boolean(tokens[0] && tokens[1])) - .filter(([t0, t1]) => t0.address !== t1.address) - .filter(([tokenA_, tokenB_]) => { - if (!chainId) return true - const customBases = CUSTOM_BASES[chainId] - - const customBasesA: Token[] | undefined = customBases?.[tokenA_.address] - const customBasesB: Token[] | undefined = customBases?.[tokenB_.address] - - if (!customBasesA && !customBasesB) return true - - if (customBasesA && !customBasesA.find((base) => tokenB_.equals(base))) return false - if (customBasesB && !customBasesB.find((base) => tokenA_.equals(base))) return false - - return true - }) + ? uniqBy( + [ + // the direct pair + [tokenA, tokenB], + // token A against all bases + ...bases.map((base): [Token, Token] => [tokenA, base]), + // token B against all bases + ...bases.map((base): [Token, Token] => [tokenB, base]), + // each base against all bases + ...basePairs, + ] + .filter((tokens): tokens is [Token, Token] => Boolean(tokens[0] && tokens[1])) + .filter(([t0, t1]) => t0.address !== t1.address) + .filter(([tokenA_, tokenB_]) => { + if (!chainId) return true + const customBases = CUSTOM_BASES[chainId] + + const customBasesA: Token[] | undefined = customBases?.[tokenA_.address] + const customBasesB: Token[] | undefined = customBases?.[tokenB_.address] + + if (!customBasesA && !customBasesB) return true + + if (customBasesA && !customBasesA.find((base) => tokenB_.equals(base))) return false + if (customBasesB && !customBasesB.find((base) => tokenA_.equals(base))) return false + + return true + }) + .map(([t0, t1]) => { + if (t0.sortsBefore(t1)) { + return [t0, t1] + } + return [t1, t0] + }), + ([tA, tB]) => `${tA.chainId}${tA.address}#${tB.chainId}${tB.address}`, + ) : [], [tokenA, tokenB, bases, basePairs, chainId], ) diff --git a/apps/web/src/hooks/useBUSDPrice.ts b/apps/web/src/hooks/useBUSDPrice.ts index e5e75344ce67ed..5a3857523be85f 100644 --- a/apps/web/src/hooks/useBUSDPrice.ts +++ b/apps/web/src/hooks/useBUSDPrice.ts @@ -164,7 +164,7 @@ export default function useBUSDPrice(currency?: Currency): Price [ [chainId && wrapped && wnative?.equals(wrapped) ? undefined : currency, chainId ? wnative : undefined], - [stable && wrapped?.equals(stable) ? undefined : wrapped, stable], + [stable && (!wrapped || wrapped?.equals(stable) || wnative?.equals(wrapped)) ? undefined : wrapped, stable], [chainId ? wnative : undefined, stable], ], [wnative, stable, chainId, currency, wrapped], @@ -181,16 +181,16 @@ export default function useBUSDPrice(currency?: Currency): Price { return results.map((result, i) => { const { result: reserves, loading } = result + if (loading) return [PairState.LOADING, null] + const tokenA = tokens[i][0] const tokenB = tokens[i][1] - - if (loading) return [PairState.LOADING, null] if (!tokenA || !tokenB || tokenA.equals(tokenB)) return [PairState.INVALID, null] if (!reserves) return [PairState.NOT_EXISTS, null] const [reserve0, reserve1] = reserves