Skip to content

Commit

Permalink
perf: Make common pairs unique
Browse files Browse the repository at this point in the history
  • Loading branch information
memoyil committed Jul 7, 2023
1 parent 09be4f1 commit f25224c
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 44 deletions.
68 changes: 39 additions & 29 deletions apps/web/src/hooks/Trades.ts
Original file line number Diff line number Diff line change
@@ -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'
Expand Down Expand Up @@ -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 []
Expand All @@ -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],
)
Expand Down
26 changes: 13 additions & 13 deletions apps/web/src/hooks/useBUSDPrice.ts
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ export default function useBUSDPrice(currency?: Currency): Price<Currency, Curre
const tokenPairs: [Currency | undefined, Currency | undefined][] = useMemo(
() => [
[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],
Expand All @@ -181,16 +181,16 @@ export default function useBUSDPrice(currency?: Currency): Price<Currency, Curre
return new Price(stable, stable, '1', '1')
}

const isBUSDPairExist =
busdPair &&
busdPairState === PairState.EXISTS &&
busdPair.reserve0.greaterThan('0') &&
busdPair.reserve1.greaterThan('0')
const isBusdBnbPairExist =
busdBnbPair &&
busdBnbPairState === PairState.EXISTS &&
busdBnbPair.reserve0.greaterThan('0') &&
busdBnbPair.reserve1.greaterThan('0')

// handle wbnb/bnb
if (wrapped.equals(wnative)) {
if (isBUSDPairExist) {
const price = busdPair.priceOf(wnative)
if (isBusdBnbPairExist) {
const price = busdBnbPair.priceOf(wnative)
return new Price(currency, stable, price.denominator, price.numerator)
}
return undefined
Expand All @@ -201,11 +201,11 @@ export default function useBUSDPrice(currency?: Currency): Price<Currency, Curre
bnbPairState === PairState.EXISTS &&
bnbPair.reserve0.greaterThan('0') &&
bnbPair.reserve1.greaterThan('0')
const isBusdBnbPairExist =
busdBnbPair &&
busdBnbPairState === PairState.EXISTS &&
busdBnbPair.reserve0.greaterThan('0') &&
busdBnbPair.reserve1.greaterThan('0')
const isBUSDPairExist =
busdPair &&
busdPairState === PairState.EXISTS &&
busdPair.reserve0.greaterThan('0') &&
busdPair.reserve1.greaterThan('0')

const bnbPairBNBAmount = isBnbPairExist && bnbPair?.reserveOf(wnative)
const bnbPairBNBBUSDValue: bigint =
Expand Down
4 changes: 2 additions & 2 deletions apps/web/src/hooks/usePairs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,10 @@ export function useV2Pairs(currencies: [Currency | undefined, Currency | undefin
return useMemo(() => {
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
Expand Down

0 comments on commit f25224c

Please sign in to comment.