From dbe99a7bee08a0e99700d0b3d5788a99621333bf Mon Sep 17 00:00:00 2001 From: Alfetopito Date: Fri, 17 Nov 2023 15:28:59 +0000 Subject: [PATCH] fix: do not send permit to quote when enough allowance --- .../appData/updater/AppDataHooksUpdater.ts | 14 +++++++++--- .../limitOrders/hooks/useTradeFlowContext.ts | 13 +++++++++++ .../src/modules/swap/hooks/useFlowContext.ts | 20 ++++++++++++----- .../modules/swap/hooks/useSwapFlowContext.ts | 22 ++++++++++++++++++- 4 files changed, 59 insertions(+), 10 deletions(-) diff --git a/apps/cowswap-frontend/src/modules/appData/updater/AppDataHooksUpdater.ts b/apps/cowswap-frontend/src/modules/appData/updater/AppDataHooksUpdater.ts index d0a7060837..9dfcc59fc8 100644 --- a/apps/cowswap-frontend/src/modules/appData/updater/AppDataHooksUpdater.ts +++ b/apps/cowswap-frontend/src/modules/appData/updater/AppDataHooksUpdater.ts @@ -2,17 +2,25 @@ import { useEffect, useRef } from 'react' import { useAccountAgnosticPermitHookData } from 'modules/permit' +import { useLimitHasEnoughAllowance } from '../../limitOrders/hooks/useTradeFlowContext' +import { useSwapEnoughAllowance } from '../../swap/hooks/useSwapFlowContext' import { useUpdateAppDataHooks } from '../hooks' import { buildAppDataHooks } from '../utils/buildAppDataHooks' export function AppDataHooksUpdater(): null { const updateAppDataHooks = useUpdateAppDataHooks() const permitHookData = useAccountAgnosticPermitHookData() + // load connected account + const swapHasEnoughAllowance = useSwapEnoughAllowance() + const limitHasEnoughAllowance = useLimitHasEnoughAllowance() + + const shouldUsePermit = !swapHasEnoughAllowance && !limitHasEnoughAllowance + const permitData = shouldUsePermit ? permitHookData : undefined // To avoid dumb re-renders - const ref = useRef(permitHookData) - ref.current = permitHookData - const stableRef = JSON.stringify(permitHookData) + const ref = useRef(permitData) + ref.current = permitData + const stableRef = JSON.stringify(permitData) useEffect(() => { if (stableRef) { diff --git a/apps/cowswap-frontend/src/modules/limitOrders/hooks/useTradeFlowContext.ts b/apps/cowswap-frontend/src/modules/limitOrders/hooks/useTradeFlowContext.ts index 488fa09af8..f9aba04437 100644 --- a/apps/cowswap-frontend/src/modules/limitOrders/hooks/useTradeFlowContext.ts +++ b/apps/cowswap-frontend/src/modules/limitOrders/hooks/useTradeFlowContext.ts @@ -22,6 +22,19 @@ import { useTradeQuote } from 'modules/tradeQuote' import { useLimitOrdersDerivedState } from './useLimitOrdersDerivedState' +export function useLimitHasEnoughAllowance(): boolean | undefined { + const state = useLimitOrdersDerivedState() + const { chainId, account } = useWalletInfo() + + const checkAllowanceAddress = GP_VAULT_RELAYER[chainId] + const { enoughAllowance } = useEnoughBalanceAndAllowance({ + account, + amount: state.slippageAdjustedSellAmount || undefined, + checkAllowanceAddress, + }) + return enoughAllowance +} + export function useTradeFlowContext(): TradeFlowContext | null { const { provider } = useWeb3React() const { chainId, account } = useWalletInfo() diff --git a/apps/cowswap-frontend/src/modules/swap/hooks/useFlowContext.ts b/apps/cowswap-frontend/src/modules/swap/hooks/useFlowContext.ts index 165cb299d1..efa861c1fa 100644 --- a/apps/cowswap-frontend/src/modules/swap/hooks/useFlowContext.ts +++ b/apps/cowswap-frontend/src/modules/swap/hooks/useFlowContext.ts @@ -20,8 +20,8 @@ import { useUserTransactionTTL } from 'legacy/state/user/hooks' import { computeSlippageAdjustedAmounts } from 'legacy/utils/prices' import { PostOrderParams } from 'legacy/utils/trade' -import { useAppData, useUploadAppData } from 'modules/appData' import type { AppDataInfo, UploadAppDataParams } from 'modules/appData' +import { useAppData, useUploadAppData } from 'modules/appData' import { useIsSafeApprovalBundle } from 'modules/limitOrders/hooks/useIsSafeApprovalBundle' import { useIsEoaEthFlow } from 'modules/swap/hooks/useIsEoaEthFlow' import { SwapConfirmManager, useSwapConfirmManager } from 'modules/swap/hooks/useSwapConfirmManager' @@ -82,13 +82,24 @@ interface BaseFlowContextSetup { dispatch: AppDispatch } +export function useSwapAmountsWithSlippage(): [ + CurrencyAmount | undefined, + CurrencyAmount | undefined +] { + const { v2Trade: trade, allowedSlippage } = useDerivedSwapInfo() + + const { INPUT, OUTPUT } = computeSlippageAdjustedAmounts(trade, allowedSlippage) + + return [INPUT, OUTPUT] +} + export function useBaseFlowContextSetup(): BaseFlowContextSetup { const { provider } = useWeb3React() const { account, chainId } = useWalletInfo() const { allowsOffchainSigning } = useWalletDetails() const gnosisSafeInfo = useGnosisSafeInfo() const { recipient } = useSwapState() - const { v2Trade: trade, allowedSlippage } = useDerivedSwapInfo() + const { v2Trade: trade } = useDerivedSwapInfo() const appData = useAppData() const closeModals = useCloseModals() @@ -104,10 +115,7 @@ export function useBaseFlowContextSetup(): BaseFlowContextSetup { const isEoaEthFlow = useIsEoaEthFlow() const isSafeEthFlow = useIsSafeEthFlow() - const { INPUT: inputAmountWithSlippage, OUTPUT: outputAmountWithSlippage } = computeSlippageAdjustedAmounts( - trade, - allowedSlippage - ) + const [inputAmountWithSlippage, outputAmountWithSlippage] = useSwapAmountsWithSlippage() const sellTokenContract = useTokenContract(getAddress(inputAmountWithSlippage?.currency) || undefined, true) const isSafeBundle = useIsSafeApprovalBundle(inputAmountWithSlippage) diff --git a/apps/cowswap-frontend/src/modules/swap/hooks/useSwapFlowContext.ts b/apps/cowswap-frontend/src/modules/swap/hooks/useSwapFlowContext.ts index 13bc3ef6b6..d8bcda4991 100644 --- a/apps/cowswap-frontend/src/modules/swap/hooks/useSwapFlowContext.ts +++ b/apps/cowswap-frontend/src/modules/swap/hooks/useSwapFlowContext.ts @@ -2,10 +2,16 @@ import { GP_VAULT_RELAYER } from '@cowprotocol/common-const' import { useGP2SettlementContract } from '@cowprotocol/common-hooks' import { getWrappedToken } from '@cowprotocol/common-utils' import { OrderKind, SupportedChainId } from '@cowprotocol/cow-sdk' +import { useWalletInfo } from '@cowprotocol/wallet' import { TradeType as UniTradeType } from '@uniswap/sdk-core' import { useGeneratePermitHook, useIsTokenPermittable } from 'modules/permit' -import { FlowType, getFlowContext, useBaseFlowContextSetup } from 'modules/swap/hooks/useFlowContext' +import { + FlowType, + getFlowContext, + useBaseFlowContextSetup, + useSwapAmountsWithSlippage, +} from 'modules/swap/hooks/useFlowContext' import { SwapFlowContext } from 'modules/swap/services/types' import { useEnoughBalanceAndAllowance } from 'modules/tokens' import { TradeType } from 'modules/trade' @@ -41,3 +47,17 @@ export function useSwapFlowContext(): SwapFlowContext | null { generatePermitHook, } } + +export function useSwapEnoughAllowance(): boolean | undefined { + const { chainId, account } = useWalletInfo() + const [inputAmountWithSlippage] = useSwapAmountsWithSlippage() + + const checkAllowanceAddress = GP_VAULT_RELAYER[chainId] + const { enoughAllowance } = useEnoughBalanceAndAllowance({ + account, + amount: inputAmountWithSlippage, + checkAllowanceAddress, + }) + + return enoughAllowance +}