Skip to content

Commit

Permalink
fix: do not send permit to quote when enough allowance
Browse files Browse the repository at this point in the history
  • Loading branch information
alfetopito authored and anxolin committed Nov 23, 2023
1 parent 86743fe commit dbe99a7
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
20 changes: 14 additions & 6 deletions apps/cowswap-frontend/src/modules/swap/hooks/useFlowContext.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down Expand Up @@ -82,13 +82,24 @@ interface BaseFlowContextSetup {
dispatch: AppDispatch
}

export function useSwapAmountsWithSlippage(): [
CurrencyAmount<Currency> | undefined,
CurrencyAmount<Currency> | 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()
Expand All @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down Expand Up @@ -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
}

0 comments on commit dbe99a7

Please sign in to comment.