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

67 lines
2.4 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 { DAI_OPTIMISM, USDC, USDC_ARBITRUM } from '../constants/tokens'
import { useV2TradeExactOut } from './useV2Trade'
feat: routing api integration (#2116) * initial routing api integration * add routing api slice * display route in dialog * addressed pr feedback * improved routing * switch to `get` * first pass at integration new MultiRouteTrade * initial implementation of RoutingDiagram * add RoutingDiagram tests * improve tests in RoutingDiagram * integrate with v3-sdk 3.3.1 * removed references to MultiRouteTrade * revert swapcallback * fix abi compilation error * added useRoute hook to build a Route from edges and nodes * added react-hooks-testing-library * integrated latest changes * renamed router hook to routerTrade * improve integration * fixed routing * usability * mock RoutingDiagram children to reduce size * undo mocked children * adjust ui * better support long routes * use routing api logo and adjust ux * set default percent to 0 * added intermediary hook to combine local and routing api trades * added intermediary hook to combine local and routing api trades * make account optional * improve ux * improve router * fixed duplicate pool bug and inputAmount undefined bug * extract input/outputAmounts from routes * add todo * fixed uninitialized issue and added % * fixed tests * fix duplicate pool bug * added routing api setting * change router label based on router version * improve useRoutes and fix duplicate pool bug * debounce routing api/local routing * removed single hop setting * fix bug when moving between v2/v3 * consider isUnitialized non loading * ui fixes * reverted change to usedebounce * use new route schema * visual updates * log quoteId for polish session * fix: persist advanced swap details toggle state * fix no route found * poll every 10s * derive currencies from pool rather than input * polish query status handling in useRouterTrade * removed RouterVersion * update ui * update ui * update loading state * animate auto router * apply loading treatment to out * disable routing api on l2 and support auto slippage * use opacity on the whole element * show loading card when syncing * updated gradient * polished ui * create routerlabel component * disable router on all bu mainnet * polish * feat: [draft] routing api polish (#2224) * show loading card when syncing * updated gradient * polished ui * create routerlabel component * disable router on all bu mainnet * polish * polished loading state * add dashes * fixed tooltip styles * fixed merge conflict * few updates * polish * updated yarn.lock * fixed styles * updated routing diagram * Fix code style issues with ESLint * routing api enabled without localstorage upgrade * fixed lint error * Fix code style issues with ESLint * refined mocks in routing diagram tests * addressed pr feedback * polish * revert sending eth * improved loading animation * handle stale routing api * Fix code style issues with ESLint * updated yarn.lock * support native eth * Compute gas adjusted quote for V2 trade and compare to V3 gas adjusted quote * Incorporate approval gas cost estimate * feat: simplify routing api ux (#2258) * support native eth * simplified ui * perf optimization * implement realized lp fee * improved route realized lp fee * fix lp realized fee * fix auto router gradient * initial route overlay * add auto router svg * adjusted ux to mocks * fix lp fee * upddated routing diagram * optimize tradeBetter hook * adjust type and name * add useBetterTrade * useBetterTrade takes gasEstimateWei * implement gasEstimateForApproval * import state from react * use gas estimate * improve integration with gas estimate comparison * remove dependency on account * fix currency switch bug * improve syncing state * add loadingbar * style tooltip container * updated tooltip styles * increase opacity range * always keep dependent currency input interactable * show placeholders in tooltips * Revert v2 gas estimates and approval estimates * Add debug logs * refactor * fix bug * removed comment * update engish key * add try-catch * addressed pr feedback * remove loading bar for price impact * addressed pr feedback and bug bash feedback * fix: use url to force version * addressed pr feedback and bug bash feedback * stop fetching when losing focus * only show auto router label when activated * avoid showing syncing status * move V3TradeSTate to own file * make useRoutes a function rather than hook * use logo from active list when possible * renamed and refactored hook * renamed and refactored hook * update status * polish * remove unused import * fixed merge error * updated combined trade tests * remove priceimpact while loading * Design tweaks * polish latest design * removed some styles * log gaevent on tooltip open and clean up origin * Small tweaks * addressed pr feedback * wrap route length in a loading container * renamed local to clientside * fix percent and token logo * addressed pr feedback * avoid comparing trades when v3 not ready * some refactor Co-authored-by: Lint Action <lint-action@samuelmeuli.com> Co-authored-by: Will Pote <will@uniswap.org> Co-authored-by: Callil Capuozzo <callil.capuozzo@gmail.com>
2021-09-16 17:50:58 +03:00
import { useClientSideV3TradeExactOut } from './useClientSideV3Trade'
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),
[SupportedChainId.ARBITRUM_ONE]: CurrencyAmount.fromRawAmount(USDC_ARBITRUM, 10_000e6),
[SupportedChainId.OPTIMISM]: CurrencyAmount.fromRawAmount(DAI_OPTIMISM, 10_000e18),
}
/**
* 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,
})
feat: routing api integration (#2116) * initial routing api integration * add routing api slice * display route in dialog * addressed pr feedback * improved routing * switch to `get` * first pass at integration new MultiRouteTrade * initial implementation of RoutingDiagram * add RoutingDiagram tests * improve tests in RoutingDiagram * integrate with v3-sdk 3.3.1 * removed references to MultiRouteTrade * revert swapcallback * fix abi compilation error * added useRoute hook to build a Route from edges and nodes * added react-hooks-testing-library * integrated latest changes * renamed router hook to routerTrade * improve integration * fixed routing * usability * mock RoutingDiagram children to reduce size * undo mocked children * adjust ui * better support long routes * use routing api logo and adjust ux * set default percent to 0 * added intermediary hook to combine local and routing api trades * added intermediary hook to combine local and routing api trades * make account optional * improve ux * improve router * fixed duplicate pool bug and inputAmount undefined bug * extract input/outputAmounts from routes * add todo * fixed uninitialized issue and added % * fixed tests * fix duplicate pool bug * added routing api setting * change router label based on router version * improve useRoutes and fix duplicate pool bug * debounce routing api/local routing * removed single hop setting * fix bug when moving between v2/v3 * consider isUnitialized non loading * ui fixes * reverted change to usedebounce * use new route schema * visual updates * log quoteId for polish session * fix: persist advanced swap details toggle state * fix no route found * poll every 10s * derive currencies from pool rather than input * polish query status handling in useRouterTrade * removed RouterVersion * update ui * update ui * update loading state * animate auto router * apply loading treatment to out * disable routing api on l2 and support auto slippage * use opacity on the whole element * show loading card when syncing * updated gradient * polished ui * create routerlabel component * disable router on all bu mainnet * polish * feat: [draft] routing api polish (#2224) * show loading card when syncing * updated gradient * polished ui * create routerlabel component * disable router on all bu mainnet * polish * polished loading state * add dashes * fixed tooltip styles * fixed merge conflict * few updates * polish * updated yarn.lock * fixed styles * updated routing diagram * Fix code style issues with ESLint * routing api enabled without localstorage upgrade * fixed lint error * Fix code style issues with ESLint * refined mocks in routing diagram tests * addressed pr feedback * polish * revert sending eth * improved loading animation * handle stale routing api * Fix code style issues with ESLint * updated yarn.lock * support native eth * Compute gas adjusted quote for V2 trade and compare to V3 gas adjusted quote * Incorporate approval gas cost estimate * feat: simplify routing api ux (#2258) * support native eth * simplified ui * perf optimization * implement realized lp fee * improved route realized lp fee * fix lp realized fee * fix auto router gradient * initial route overlay * add auto router svg * adjusted ux to mocks * fix lp fee * upddated routing diagram * optimize tradeBetter hook * adjust type and name * add useBetterTrade * useBetterTrade takes gasEstimateWei * implement gasEstimateForApproval * import state from react * use gas estimate * improve integration with gas estimate comparison * remove dependency on account * fix currency switch bug * improve syncing state * add loadingbar * style tooltip container * updated tooltip styles * increase opacity range * always keep dependent currency input interactable * show placeholders in tooltips * Revert v2 gas estimates and approval estimates * Add debug logs * refactor * fix bug * removed comment * update engish key * add try-catch * addressed pr feedback * remove loading bar for price impact * addressed pr feedback and bug bash feedback * fix: use url to force version * addressed pr feedback and bug bash feedback * stop fetching when losing focus * only show auto router label when activated * avoid showing syncing status * move V3TradeSTate to own file * make useRoutes a function rather than hook * use logo from active list when possible * renamed and refactored hook * renamed and refactored hook * update status * polish * remove unused import * fixed merge error * updated combined trade tests * remove priceimpact while loading * Design tweaks * polish latest design * removed some styles * log gaevent on tooltip open and clean up origin * Small tweaks * addressed pr feedback * wrap route length in a loading container * renamed local to clientside * fix percent and token logo * addressed pr feedback * avoid comparing trades when v3 not ready * some refactor Co-authored-by: Lint Action <lint-action@samuelmeuli.com> Co-authored-by: Will Pote <will@uniswap.org> Co-authored-by: Callil Capuozzo <callil.capuozzo@gmail.com>
2021-09-16 17:50:58 +03:00
const v3USDCTrade = useClientSideV3TradeExactOut(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])
}