uniswap-interface-uncensored/src/hooks/useUSDCPrice.ts

65 lines
2.2 KiB
TypeScript
Raw Normal View History

2021-05-20 19:21:40 +03:00
import { Currency, CurrencyAmount, Price, Token } from '@uniswap/sdk-core'
import { useMemo } from 'react'
import { SupportedChainId } from '../constants/chains'
import { USDC } from '../constants/tokens'
import { useV2TradeExactOut } from './useV2Trade'
import { useBestV3TradeExactOut } from './useBestV3Trade'
import { useActiveWeb3React } from './web3'
// Stablecoin amounts used when calculating spot price for a given currency.
// The amount is large enough to filter low liquidity pairs.
const STABLECOIN_AMOUNT_OUT: { [chainId: number]: CurrencyAmount<Token> } = {
[SupportedChainId.MAINNET]: CurrencyAmount.fromRawAmount(USDC, 100_000e6),
}
/**
* 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<Currency, Token> | undefined {
const { chainId } = useActiveWeb3React()
const amountOut = chainId ? STABLECOIN_AMOUNT_OUT[chainId] : undefined
const stablecoin = amountOut?.currency
const v2USDCTrade = useV2TradeExactOut(currency, amountOut, {
maxHops: 2,
})
const v3USDCTrade = useBestV3TradeExactOut(currency, amountOut)
return useMemo(() => {
if (!currency || !stablecoin) {
return undefined
}
// handle usdc
if (currency?.wrapped.equals(stablecoin)) {
return new Price(stablecoin, stablecoin, '1', '1')
}
// use v2 price if available, v3 as fallback
if (v2USDCTrade) {
const { numerator, denominator } = v2USDCTrade.route.midPrice
return new Price(currency, stablecoin, denominator, numerator)
} else if (v3USDCTrade.trade) {
const { numerator, denominator } = v3USDCTrade.trade.route.midPrice
return new Price(currency, stablecoin, denominator, numerator)
}
return undefined
}, [currency, stablecoin, v2USDCTrade, v3USDCTrade.trade])
}
2021-05-04 00:29:45 +03:00
export function useUSDCValue(currencyAmount: CurrencyAmount<Currency> | undefined | null) {
2021-05-04 00:29:45 +03:00
const price = useUSDCPrice(currencyAmount?.currency)
return useMemo(() => {
if (!price || !currencyAmount) return null
try {
return price.quote(currencyAmount)
} catch (error) {
return null
}
2021-05-04 00:29:45 +03:00
}, [currencyAmount, price])
}