2021-05-20 19:21:40 +03:00
|
|
|
import { Currency, CurrencyAmount, Price, Token } from '@uniswap/sdk-core'
|
2020-08-17 16:36:38 +03:00
|
|
|
import { useMemo } from 'react'
|
2021-06-02 23:14:34 +03:00
|
|
|
import { SupportedChainId } from '../constants/chains'
|
2021-07-12 19:03:10 +03:00
|
|
|
import { DAI_OPTIMISM, USDC, USDC_ARBITRUM } from '../constants/tokens'
|
2021-05-18 20:07:37 +03:00
|
|
|
import { useV2TradeExactOut } from './useV2Trade'
|
2021-09-16 17:50:58 +03:00
|
|
|
import { useClientSideV3TradeExactOut } from './useClientSideV3Trade'
|
2021-05-18 18:31:22 +03:00
|
|
|
import { useActiveWeb3React } from './web3'
|
2021-05-18 20:07:37 +03:00
|
|
|
|
2021-06-02 23:14:34 +03:00
|
|
|
// Stablecoin amounts used when calculating spot price for a given currency.
|
2021-05-18 20:07:37 +03:00
|
|
|
// The amount is large enough to filter low liquidity pairs.
|
2021-06-02 23:14:34 +03:00
|
|
|
const STABLECOIN_AMOUNT_OUT: { [chainId: number]: CurrencyAmount<Token> } = {
|
|
|
|
[SupportedChainId.MAINNET]: CurrencyAmount.fromRawAmount(USDC, 100_000e6),
|
2021-06-24 04:58:03 +03:00
|
|
|
[SupportedChainId.ARBITRUM_ONE]: CurrencyAmount.fromRawAmount(USDC_ARBITRUM, 10_000e6),
|
2021-07-12 19:03:10 +03:00
|
|
|
[SupportedChainId.OPTIMISM]: CurrencyAmount.fromRawAmount(DAI_OPTIMISM, 10_000e18),
|
2021-06-02 23:14:34 +03:00
|
|
|
}
|
2020-08-17 16:36:38 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the price in USDC of the input currency
|
|
|
|
* @param currency currency to compute the USDC price of
|
|
|
|
*/
|
2021-05-12 16:52:17 +03:00
|
|
|
export default function useUSDCPrice(currency?: Currency): Price<Currency, Token> | undefined {
|
2020-08-17 16:36:38 +03:00
|
|
|
const { chainId } = useActiveWeb3React()
|
2021-04-29 03:44:10 +03:00
|
|
|
|
2021-06-02 23:14:34 +03:00
|
|
|
const amountOut = chainId ? STABLECOIN_AMOUNT_OUT[chainId] : undefined
|
|
|
|
const stablecoin = amountOut?.currency
|
|
|
|
|
|
|
|
const v2USDCTrade = useV2TradeExactOut(currency, amountOut, {
|
2021-05-19 23:21:27 +03:00
|
|
|
maxHops: 2,
|
|
|
|
})
|
2021-09-16 17:50:58 +03:00
|
|
|
const v3USDCTrade = useClientSideV3TradeExactOut(currency, amountOut)
|
2020-08-17 16:36:38 +03:00
|
|
|
|
|
|
|
return useMemo(() => {
|
2021-06-02 23:14:34 +03:00
|
|
|
if (!currency || !stablecoin) {
|
2021-06-02 01:33:31 +03:00
|
|
|
return undefined
|
2021-04-29 03:44:10 +03:00
|
|
|
}
|
|
|
|
|
2021-05-22 02:45:39 +03:00
|
|
|
// handle usdc
|
2021-06-02 23:14:34 +03:00
|
|
|
if (currency?.wrapped.equals(stablecoin)) {
|
|
|
|
return new Price(stablecoin, stablecoin, '1', '1')
|
2021-05-22 02:45:39 +03:00
|
|
|
}
|
|
|
|
|
2021-05-18 20:07:37 +03:00
|
|
|
// use v2 price if available, v3 as fallback
|
|
|
|
if (v2USDCTrade) {
|
|
|
|
const { numerator, denominator } = v2USDCTrade.route.midPrice
|
2021-06-02 23:14:34 +03:00
|
|
|
return new Price(currency, stablecoin, denominator, numerator)
|
2021-05-27 23:28:45 +03:00
|
|
|
} else if (v3USDCTrade.trade) {
|
2021-05-18 20:07:37 +03:00
|
|
|
const { numerator, denominator } = v3USDCTrade.trade.route.midPrice
|
2021-06-02 23:14:34 +03:00
|
|
|
return new Price(currency, stablecoin, denominator, numerator)
|
2020-08-17 16:36:38 +03:00
|
|
|
}
|
|
|
|
|
2020-08-27 20:05:09 +03:00
|
|
|
return undefined
|
2021-06-02 23:14:34 +03:00
|
|
|
}, [currency, stablecoin, v2USDCTrade, v3USDCTrade.trade])
|
2020-08-17 16:36:38 +03:00
|
|
|
}
|
2021-05-04 00:29:45 +03:00
|
|
|
|
2021-05-12 16:52:17 +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
|
2021-05-14 01:27:34 +03:00
|
|
|
try {
|
|
|
|
return price.quote(currencyAmount)
|
|
|
|
} catch (error) {
|
|
|
|
return null
|
|
|
|
}
|
2021-05-04 00:29:45 +03:00
|
|
|
}, [currencyAmount, price])
|
|
|
|
}
|