Commit c0d42ade authored by eddie's avatar eddie Committed by GitHub

fix: clear dependent variable when trade inputs become invalid (#6782)

* fix: handle polling interrupt separately from invalid trades

* fix: clear output when trade becomes invalid, dont use stale trade

* fix: tests

* fix: invert skip

* fix: remove debounce delay
parent 0e2344ba
...@@ -37,6 +37,20 @@ describe('Swap', () => { ...@@ -37,6 +37,20 @@ describe('Swap', () => {
cy.get('#swap-currency-input .token-amount-input').should('have.value', '') cy.get('#swap-currency-input .token-amount-input').should('have.value', '')
}) })
it('resets the dependent input when the independent input is cleared', () => {
cy.visit(`/swap?inputCurrency=ETH&outputCurrency=${UNI_MAINNET.address}`)
cy.get('#swap-currency-input .token-amount-input').should('have.value', '')
cy.get(`#swap-currency-output .token-amount-input`).should('have.value', '')
cy.get('#swap-currency-input .token-amount-input').type('0.01').should('have.value', '0.01')
cy.get(`#swap-currency-output .token-amount-input`).should('not.have.value', '')
cy.get('#swap-currency-input .token-amount-input').clear()
cy.get(`#swap-currency-output .token-amount-input`).should('not.have.value')
cy.window().trigger('blur')
cy.get(`#swap-currency-output .token-amount-input`).should('not.have.value')
})
it('swaps ETH for USDC', () => { it('swaps ETH for USDC', () => {
cy.visit('/swap', { ethereum: 'hardhat' }) cy.visit('/swap', { ethereum: 'hardhat' })
cy.hardhat({ automine: false }) cy.hardhat({ automine: false })
......
...@@ -49,7 +49,13 @@ describe('#useBestV3Trade ExactIn', () => { ...@@ -49,7 +49,13 @@ describe('#useBestV3Trade ExactIn', () => {
const { result } = renderHook(() => useBestTrade(TradeType.EXACT_INPUT, USDCAmount, DAI)) const { result } = renderHook(() => useBestTrade(TradeType.EXACT_INPUT, USDCAmount, DAI))
expect(useRoutingAPITrade).toHaveBeenCalledWith(TradeType.EXACT_INPUT, undefined, DAI, RouterPreference.CLIENT) expect(useRoutingAPITrade).toHaveBeenCalledWith(
TradeType.EXACT_INPUT,
USDCAmount,
DAI,
RouterPreference.CLIENT,
true // skipFetch
)
expect(useClientSideV3Trade).toHaveBeenCalledWith(TradeType.EXACT_INPUT, USDCAmount, DAI) expect(useClientSideV3Trade).toHaveBeenCalledWith(TradeType.EXACT_INPUT, USDCAmount, DAI)
expect(result.current).toEqual({ state: TradeState.VALID, trade: undefined }) expect(result.current).toEqual({ state: TradeState.VALID, trade: undefined })
}) })
...@@ -61,7 +67,13 @@ describe('#useBestV3Trade ExactIn', () => { ...@@ -61,7 +67,13 @@ describe('#useBestV3Trade ExactIn', () => {
const { result } = renderHook(() => useBestTrade(TradeType.EXACT_INPUT, USDCAmount, DAI)) const { result } = renderHook(() => useBestTrade(TradeType.EXACT_INPUT, USDCAmount, DAI))
expect(useRoutingAPITrade).toHaveBeenCalledWith(TradeType.EXACT_INPUT, undefined, DAI, RouterPreference.CLIENT) expect(useRoutingAPITrade).toHaveBeenCalledWith(
TradeType.EXACT_INPUT,
USDCAmount,
DAI,
RouterPreference.CLIENT,
true // skipFetch
)
expect(result.current).toEqual({ state: TradeState.NO_ROUTE_FOUND, trade: undefined }) expect(result.current).toEqual({ state: TradeState.NO_ROUTE_FOUND, trade: undefined })
}) })
...@@ -117,9 +129,10 @@ describe('#useBestV3Trade ExactOut', () => { ...@@ -117,9 +129,10 @@ describe('#useBestV3Trade ExactOut', () => {
expect(useRoutingAPITrade).toHaveBeenCalledWith( expect(useRoutingAPITrade).toHaveBeenCalledWith(
TradeType.EXACT_OUTPUT, TradeType.EXACT_OUTPUT,
undefined, DAIAmount,
USDC_MAINNET, USDC_MAINNET,
RouterPreference.CLIENT RouterPreference.CLIENT,
true // skipFetch
) )
expect(useClientSideV3Trade).toHaveBeenCalledWith(TradeType.EXACT_OUTPUT, DAIAmount, USDC_MAINNET) expect(useClientSideV3Trade).toHaveBeenCalledWith(TradeType.EXACT_OUTPUT, DAIAmount, USDC_MAINNET)
expect(result.current).toEqual({ state: TradeState.VALID, trade: undefined }) expect(result.current).toEqual({ state: TradeState.VALID, trade: undefined })
...@@ -134,9 +147,10 @@ describe('#useBestV3Trade ExactOut', () => { ...@@ -134,9 +147,10 @@ describe('#useBestV3Trade ExactOut', () => {
expect(useRoutingAPITrade).toHaveBeenCalledWith( expect(useRoutingAPITrade).toHaveBeenCalledWith(
TradeType.EXACT_OUTPUT, TradeType.EXACT_OUTPUT,
undefined, DAIAmount,
USDC_MAINNET, USDC_MAINNET,
RouterPreference.CLIENT RouterPreference.CLIENT,
true // skipFetch
) )
expect(result.current).toEqual({ state: TradeState.NO_ROUTE_FOUND, trade: undefined }) expect(result.current).toEqual({ state: TradeState.NO_ROUTE_FOUND, trade: undefined })
}) })
......
...@@ -56,9 +56,10 @@ export function useBestTrade( ...@@ -56,9 +56,10 @@ export function useBestTrade(
const [routerPreference] = useRouterPreference() const [routerPreference] = useRouterPreference()
const routingAPITrade = useRoutingAPITrade( const routingAPITrade = useRoutingAPITrade(
tradeType, tradeType,
autoRouterSupported && shouldGetTrade ? debouncedAmount : undefined, amountSpecified ? debouncedAmount : undefined,
debouncedOtherCurrency, debouncedOtherCurrency,
routerPreference routerPreference,
!(autoRouterSupported && shouldGetTrade) // skip fetching
) )
const inDebounce = const inDebounce =
......
...@@ -8,6 +8,7 @@ import { RouterPreference } from './slice' ...@@ -8,6 +8,7 @@ import { RouterPreference } from './slice'
export enum TradeState { export enum TradeState {
LOADING, LOADING,
INVALID, INVALID,
STALE,
NO_ROUTE_FOUND, NO_ROUTE_FOUND,
VALID, VALID,
} }
......
...@@ -25,7 +25,8 @@ export function useRoutingAPITrade<TTradeType extends TradeType>( ...@@ -25,7 +25,8 @@ export function useRoutingAPITrade<TTradeType extends TradeType>(
tradeType: TTradeType, tradeType: TTradeType,
amountSpecified: CurrencyAmount<Currency> | undefined, amountSpecified: CurrencyAmount<Currency> | undefined,
otherCurrency: Currency | undefined, otherCurrency: Currency | undefined,
routerPreference: RouterPreference | typeof INTERNAL_ROUTER_PREFERENCE_PRICE routerPreference: RouterPreference | typeof INTERNAL_ROUTER_PREFERENCE_PRICE,
skipFetch = false
): { ): {
state: TradeState state: TradeState
trade?: InterfaceTrade trade?: InterfaceTrade
...@@ -41,7 +42,7 @@ export function useRoutingAPITrade<TTradeType extends TradeType>( ...@@ -41,7 +42,7 @@ export function useRoutingAPITrade<TTradeType extends TradeType>(
const queryArgs = useRoutingAPIArguments({ const queryArgs = useRoutingAPIArguments({
tokenIn: currencyIn, tokenIn: currencyIn,
tokenOut: currencyOut, tokenOut: currencyOut,
amount: amountSpecified, amount: skipFetch ? undefined : amountSpecified,
tradeType, tradeType,
routerPreference, routerPreference,
}) })
...@@ -77,8 +78,11 @@ export function useRoutingAPITrade<TTradeType extends TradeType>( ...@@ -77,8 +78,11 @@ export function useRoutingAPITrade<TTradeType extends TradeType>(
const isCurrent = currentTradeResult === tradeResult const isCurrent = currentTradeResult === tradeResult
return useMemo(() => { return useMemo(() => {
if (!amountSpecified || isError || !queryArgs) { if (skipFetch && amountSpecified) {
return { state: TradeState.INVALID, trade: tradeResult?.trade } // If we don't want to fetch new trades, but have valid inputs, return the stale trade.
return { state: TradeState.STALE, trade: tradeResult?.trade }
} else if (!amountSpecified || isError || !queryArgs) {
return { state: TradeState.INVALID, trade: undefined }
} else if (tradeResult?.state === QuoteState.NOT_FOUND && isCurrent) { } else if (tradeResult?.state === QuoteState.NOT_FOUND && isCurrent) {
return TRADE_NOT_FOUND return TRADE_NOT_FOUND
} else if (!tradeResult?.trade) { } else if (!tradeResult?.trade) {
...@@ -90,7 +94,7 @@ export function useRoutingAPITrade<TTradeType extends TradeType>( ...@@ -90,7 +94,7 @@ export function useRoutingAPITrade<TTradeType extends TradeType>(
trade: tradeResult.trade, trade: tradeResult.trade,
} }
} }
}, [amountSpecified, isCurrent, isError, queryArgs, tradeResult]) }, [amountSpecified, isCurrent, isError, queryArgs, skipFetch, tradeResult?.state, tradeResult?.trade])
} }
// only want to enable this when app hook called // only want to enable this when app hook called
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment