diff --git a/src/components/transactions/Swap/errors/shared/SupplyCapBlockingGuard.tsx b/src/components/transactions/Swap/errors/shared/SupplyCapBlockingGuard.tsx index 236919dc10..0c330a4d73 100644 --- a/src/components/transactions/Swap/errors/shared/SupplyCapBlockingGuard.tsx +++ b/src/components/transactions/Swap/errors/shared/SupplyCapBlockingGuard.tsx @@ -2,12 +2,18 @@ import { valueToBigNumber } from '@aave/math-utils'; import { SxProps } from '@mui/material'; import { Dispatch, useEffect } from 'react'; -import { ActionsBlockedReason, ProtocolSwapState, SwapError, SwapState } from '../../types'; +import { + ActionsBlockedReason, + ProtocolSwapState, + SwapError, + SwapState, + SwapType, +} from '../../types'; import { isProtocolSwapState } from '../../types/state.types'; import { SupplyCapBlockingError } from './SupplyCapBlockingError'; export const hasSupplyCapBlocking = (state: SwapState) => { - if (!isProtocolSwapState(state)) return false; + if (!isProtocolSwapState(state) || state.swapType === SwapType.RepayWithCollateral) return false; const reserve = state.isInvertedSwap ? state.sourceReserve?.reserve : state.destinationReserve?.reserve; diff --git a/src/components/transactions/Swap/errors/shared/ZeroLTVBlockingGuard.tsx b/src/components/transactions/Swap/errors/shared/ZeroLTVBlockingGuard.tsx index ab07d55f23..8da027e8bd 100644 --- a/src/components/transactions/Swap/errors/shared/ZeroLTVBlockingGuard.tsx +++ b/src/components/transactions/Swap/errors/shared/ZeroLTVBlockingGuard.tsx @@ -2,11 +2,15 @@ import { SxProps } from '@mui/material'; import React, { Dispatch, useEffect } from 'react'; import { useZeroLTVBlockingWithdraw } from 'src/hooks/useZeroLTVBlockingWithdraw'; -import { ActionsBlockedReason, SwapError, SwapState } from '../../types'; +import { ActionsBlockedReason, SwapError, SwapState, SwapType } from '../../types'; import { ZeroLTVBlockingError } from './ZeroLTVBlockingError'; export const hasZeroLTVBlocking = (state: SwapState, blockingAssets: string[]) => { - return blockingAssets.length > 0 && !blockingAssets.includes(state.sourceToken.symbol); + return ( + blockingAssets.length > 0 && + !blockingAssets.includes(state.sourceToken.symbol) && + state.swapType !== SwapType.RepayWithCollateral + ); }; export const ZeroLTVBlockingGuard = ({ diff --git a/src/components/transactions/Swap/hooks/useSwapQuote.ts b/src/components/transactions/Swap/hooks/useSwapQuote.ts index e2f8015745..453f0a1671 100644 --- a/src/components/transactions/Swap/hooks/useSwapQuote.ts +++ b/src/components/transactions/Swap/hooks/useSwapQuote.ts @@ -433,12 +433,15 @@ const useMultiProviderSwapQuoteQuery = ({ !state.mainTxState.txHash && // Don't fetch quotes once transaction is sent !state.mainTxState.loading && // Don't fetch quotes while transaction is processing !approvalTxState?.loading && // Don't fetch quotes while approval is processing + !approvalTxState?.success && // Don't fetch quotes while approval is successful + !state.quoteRefreshPaused && // Respect paused refresh state (e.g. after approval or manual edits) provider !== SwapProvider.NONE && !state.isWrongNetwork ); })(), retry: 0, throwOnError: false, + refetchOnWindowFocus: false, refetchInterval: (() => { const isInsufficientBalance = hasInsufficientBalance(state); const isFlashloanDisabled = hasFlashLoanDisabled(state); diff --git a/src/components/transactions/Swap/inputs/SwapInputs.tsx b/src/components/transactions/Swap/inputs/SwapInputs.tsx index 5f855df1b0..e3e6de50a2 100644 --- a/src/components/transactions/Swap/inputs/SwapInputs.tsx +++ b/src/components/transactions/Swap/inputs/SwapInputs.tsx @@ -2,6 +2,7 @@ import { BigNumberValue, valueToBigNumber } from '@aave/math-utils'; import { WRAPPED_NATIVE_CURRENCIES } from '@cowprotocol/cow-sdk'; import { useQueryClient } from '@tanstack/react-query'; import { Dispatch, useEffect, useMemo } from 'react'; +import { useModalContext } from 'src/hooks/useModal'; import { useRootStore } from 'src/store/root'; import { queryKeysFactory } from 'src/ui-config/queries'; @@ -54,6 +55,7 @@ export const SwapInputs = ({ setState: Dispatch>; trackingHandlers: TrackAnalyticsHandlers; }) => { + const { setApprovalTxState, approvalTxState } = useModalContext(); const resetErrorsAndWarnings = () => { setState({ error: undefined, @@ -65,6 +67,14 @@ export const SwapInputs = ({ const handleInputChange = (value: string) => { resetErrorsAndWarnings(); + // Changing amounts invalidates any prior approval + if (approvalTxState?.txHash || approvalTxState?.success || approvalTxState?.loading) { + setApprovalTxState({ + txHash: undefined, + loading: false, + success: false, + }); + } // Calculate USD per token unit if possible const usdPerToken = state.swapRate?.srcTokenPriceUsd; @@ -122,6 +132,14 @@ export const SwapInputs = ({ const computeUSD = (amt: string) => usdPerToken ? valueToBigNumber(amt).multipliedBy(usdPerToken).toString(10) : ''; + // Changing amounts invalidates any prior approval + if (approvalTxState?.txHash || approvalTxState?.success || approvalTxState?.loading) { + setApprovalTxState({ + txHash: undefined, + loading: false, + success: false, + }); + } if (state.swapRate) { // Block quote refreshs if user is changing the output amount after getting quotes