import { ChainId, Currency, currencyEquals, JSBI, Price, WDEV } from 'moonbeamswap' import { useMemo } from 'react' import { USDC } from '../constants' import { PairState, usePairs } from '../data/Reserves' import { useActiveWeb3React } from '../hooks' import { wrappedCurrency } from './wrappedCurrency' /** * Returns the price in USDC of the input currency * @param currency currency to compute the USDC price of */ export default function useUSDCPrice(currency?: Currency): Price | undefined { const { chainId } = useActiveWeb3React() const wrapped = wrappedCurrency(currency, chainId) const tokenPairs: [Currency | undefined, Currency | undefined][] = useMemo( () => [ [ chainId && wrapped && currencyEquals(WDEV[chainId], wrapped) ? undefined : currency, chainId ? WDEV[chainId] : undefined ], [wrapped?.equals(USDC) ? undefined : wrapped, chainId === ChainId.MAINNET ? USDC : undefined], [chainId ? WDEV[chainId] : undefined, chainId === ChainId.MAINNET ? USDC : undefined] ], [chainId, currency, wrapped] ) const [[ethPairState, ethPair], [usdcPairState, usdcPair], [usdcEthPairState, usdcEthPair]] = usePairs(tokenPairs) return useMemo(() => { if (!currency || !wrapped || !chainId) { return undefined } // handle weth/eth if (wrapped.equals(WDEV[chainId])) { if (usdcPair) { const price = usdcPair.priceOf(WDEV[chainId]) return new Price(currency, USDC, price.denominator, price.numerator) } else { return undefined } } // handle usdc if (wrapped.equals(USDC)) { return new Price(USDC, USDC, '1', '1') } const ethPairETHAmount = ethPair?.reserveOf(WDEV[chainId]) const ethPairETHUSDCValue: JSBI = ethPairETHAmount && usdcEthPair ? usdcEthPair.priceOf(WDEV[chainId]).quote(ethPairETHAmount).raw : JSBI.BigInt(0) // all other tokens // first try the usdc pair if (usdcPairState === PairState.EXISTS && usdcPair && usdcPair.reserveOf(USDC).greaterThan(ethPairETHUSDCValue)) { const price = usdcPair.priceOf(wrapped) return new Price(currency, USDC, price.denominator, price.numerator) } if (ethPairState === PairState.EXISTS && ethPair && usdcEthPairState === PairState.EXISTS && usdcEthPair) { if (usdcEthPair.reserveOf(USDC).greaterThan('0') && ethPair.reserveOf(WDEV[chainId]).greaterThan('0')) { const ethUsdcPrice = usdcEthPair.priceOf(USDC) const currencyEthPrice = ethPair.priceOf(WDEV[chainId]) const usdcPrice = ethUsdcPrice.multiply(currencyEthPrice).invert() return new Price(currency, USDC, usdcPrice.denominator, usdcPrice.numerator) } } return undefined }, [chainId, currency, ethPair, ethPairState, usdcEthPair, usdcEthPairState, usdcPair, usdcPairState, wrapped]) }