diff --git a/RELEASE b/RELEASE index 690b5eda3e8..71f2cd1638f 100644 --- a/RELEASE +++ b/RELEASE @@ -1,6 +1,6 @@ IPFS hash of the deployment: -- CIDv0: `QmcrR5faskhjW7PVj7g5tA4gAqASyDvySRHAQes9fVCSvJ` -- CIDv1: `bafybeigxuoq3myrrht67aku2bu7jqvr6rdfwfp6bycbgu7tbybbktumvz4` +- CIDv0: `QmeVXtPfnqJ2PeigSXgwizJDYf2EmwfVrCE4Qi3dXhAbdL` +- CIDv1: `bafybeihqagapczekcmizn4zden7rrz6h4mfhtnd3dc3wa3wnatqc4eu6vm` The latest release is always mirrored at [app.uniswap.org](https://app.uniswap.org). @@ -10,15 +10,15 @@ You can also access the Uniswap Interface from an IPFS gateway. Your Uniswap settings are never remembered across different URLs. IPFS gateways: -- https://bafybeigxuoq3myrrht67aku2bu7jqvr6rdfwfp6bycbgu7tbybbktumvz4.ipfs.dweb.link/ -- https://bafybeigxuoq3myrrht67aku2bu7jqvr6rdfwfp6bycbgu7tbybbktumvz4.ipfs.cf-ipfs.com/ -- [ipfs://QmcrR5faskhjW7PVj7g5tA4gAqASyDvySRHAQes9fVCSvJ/](ipfs://QmcrR5faskhjW7PVj7g5tA4gAqASyDvySRHAQes9fVCSvJ/) +- https://bafybeihqagapczekcmizn4zden7rrz6h4mfhtnd3dc3wa3wnatqc4eu6vm.ipfs.dweb.link/ +- https://bafybeihqagapczekcmizn4zden7rrz6h4mfhtnd3dc3wa3wnatqc4eu6vm.ipfs.cf-ipfs.com/ +- [ipfs://QmeVXtPfnqJ2PeigSXgwizJDYf2EmwfVrCE4Qi3dXhAbdL/](ipfs://QmeVXtPfnqJ2PeigSXgwizJDYf2EmwfVrCE4Qi3dXhAbdL/) -### 5.67.3 (2025-01-23) +### 5.67.4 (2025-01-23) ### Bug Fixes -* **web:** lp flow error logging updates (#15424) d7de5d5 +* **web:** Phil/lp polling prod (#15462) 7533563 diff --git a/VERSION b/VERSION index d0cc9af37a2..c384f04c7e3 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -web/5.67.3 \ No newline at end of file +web/5.67.4 \ No newline at end of file diff --git a/apps/web/src/components/IncreaseLiquidity/IncreaseLiquidityContext.tsx b/apps/web/src/components/IncreaseLiquidity/IncreaseLiquidityContext.tsx index 67ae7a1a17c..0a6054f7b82 100644 --- a/apps/web/src/components/IncreaseLiquidity/IncreaseLiquidityContext.tsx +++ b/apps/web/src/components/IncreaseLiquidity/IncreaseLiquidityContext.tsx @@ -4,6 +4,7 @@ import { DepositInfo } from 'components/Liquidity/types' import { Dispatch, PropsWithChildren, SetStateAction, createContext, useContext, useMemo, useState } from 'react' import { LiquidityModalInitialState } from 'state/application/reducer' import { PositionField } from 'types/position' +import { TransactionStep } from 'uniswap/src/features/transactions/swap/types/steps' export enum IncreaseLiquidityStep { Input, @@ -35,6 +36,8 @@ interface IncreaseLiquidityContextType { setIncreaseLiquidityState: Dispatch> unwrapNativeCurrency: boolean setUnwrapNativeCurrency: Dispatch> + currentTransactionStep?: { step: TransactionStep; accepted: boolean } + setCurrentTransactionStep: Dispatch> } const IncreaseLiquidityContext = createContext({ @@ -45,6 +48,8 @@ const IncreaseLiquidityContext = createContext({ setIncreaseLiquidityState: () => undefined, unwrapNativeCurrency: true, setUnwrapNativeCurrency: () => undefined, + currentTransactionStep: undefined, + setCurrentTransactionStep: () => undefined, }) export function useIncreaseLiquidityContext() { @@ -60,6 +65,9 @@ export function IncreaseLiquidityContextProvider({ children }: PropsWithChildren ...DEFAULT_INCREASE_LIQUIDITY_STATE, position: positionInfo, }) + const [currentTransactionStep, setCurrentTransactionStep] = useState< + { step: TransactionStep; accepted: boolean } | undefined + >() const derivedIncreaseLiquidityInfo = useDerivedIncreaseLiquidityInfo(increaseLiquidityState, unwrapNativeCurrency) @@ -72,8 +80,10 @@ export function IncreaseLiquidityContextProvider({ children }: PropsWithChildren derivedIncreaseLiquidityInfo, unwrapNativeCurrency, setUnwrapNativeCurrency, + currentTransactionStep, + setCurrentTransactionStep, }), - [increaseLiquidityState, derivedIncreaseLiquidityInfo, step, unwrapNativeCurrency], + [increaseLiquidityState, derivedIncreaseLiquidityInfo, step, unwrapNativeCurrency, currentTransactionStep], ) return {children} diff --git a/apps/web/src/components/IncreaseLiquidity/IncreaseLiquidityReview.tsx b/apps/web/src/components/IncreaseLiquidity/IncreaseLiquidityReview.tsx index be2a47ab0ec..0c4b72f22d1 100644 --- a/apps/web/src/components/IncreaseLiquidity/IncreaseLiquidityReview.tsx +++ b/apps/web/src/components/IncreaseLiquidity/IncreaseLiquidityReview.tsx @@ -36,7 +36,8 @@ export function IncreaseLiquidityReview({ onClose }: { onClose: () => void }) { const { formatCurrencyAmount, formatPercent } = useLocalizationContext() - const { derivedIncreaseLiquidityInfo, increaseLiquidityState } = useIncreaseLiquidityContext() + const { derivedIncreaseLiquidityInfo, increaseLiquidityState, currentTransactionStep, setCurrentTransactionStep } = + useIncreaseLiquidityContext() const { txInfo, gasFeeEstimateUSD } = useIncreaseLiquidityTxContext() const { dependentAmount } = txInfo || {} @@ -57,7 +58,6 @@ export function IncreaseLiquidityReview({ onClose }: { onClose: () => void }) { ) const [steps, setSteps] = useState([]) - const [currentStep, setCurrentStep] = useState<{ step: TransactionStep; accepted: boolean } | undefined>() if (!increaseLiquidityState.position) { throw new Error('a position must be defined') @@ -95,12 +95,12 @@ export function IncreaseLiquidityReview({ onClose }: { onClose: () => void }) { const newToken1AmountUSD = useUSDCValue(newToken1Amount) const onFailure = () => { - setCurrentStep(undefined) + setCurrentTransactionStep(undefined) } const onSuccess = () => { setSteps([]) - setCurrentStep(undefined) + setCurrentTransactionStep(undefined) onClose() } @@ -123,7 +123,7 @@ export function IncreaseLiquidityReview({ onClose }: { onClose: () => void }) { startChainId, account, liquidityTxContext: txInfo, - setCurrentStep, + setCurrentStep: setCurrentTransactionStep, setSteps, onSuccess, onFailure, @@ -156,8 +156,8 @@ export function IncreaseLiquidityReview({ onClose }: { onClose: () => void }) { - {currentStep ? ( - + {currentTransactionStep ? ( + ) : ( <> diff --git a/apps/web/src/components/IncreaseLiquidity/IncreaseLiquidityTxContext.tsx b/apps/web/src/components/IncreaseLiquidity/IncreaseLiquidityTxContext.tsx index 6857e5792ee..fb2add463f2 100644 --- a/apps/web/src/components/IncreaseLiquidity/IncreaseLiquidityTxContext.tsx +++ b/apps/web/src/components/IncreaseLiquidity/IncreaseLiquidityTxContext.tsx @@ -21,6 +21,7 @@ import { LiquidityTransactionType, } from 'uniswap/src/features/transactions/liquidity/types' import { useTransactionSettingsContext } from 'uniswap/src/features/transactions/settings/contexts/TransactionSettingsContext' +import { TransactionStepType } from 'uniswap/src/features/transactions/swap/types/steps' import { validatePermit, validateTransactionRequest } from 'uniswap/src/features/transactions/swap/utils/trade' import { logger } from 'utilities/src/logger/logger' import { ONE_SECOND_MS } from 'utilities/src/time/time' @@ -37,7 +38,7 @@ const IncreaseLiquidityTxContext = createContext> + currentTransactionStep?: { step: TransactionStep; accepted: boolean } + setCurrentTransactionStep: Dispatch> } const RemoveLiquidityModalContext = createContext({ @@ -26,12 +29,17 @@ const RemoveLiquidityModalContext = createContext({ percentInvalid: true, unwrapNativeCurrency: true, setUnwrapNativeCurrency: () => null, + currentTransactionStep: undefined, + setCurrentTransactionStep: () => null, }) export function RemoveLiquidityModalContextProvider({ children }: PropsWithChildren): JSX.Element { const [step, setStep] = useState(DecreaseLiquidityStep.Input) const [unwrapNativeCurrency, setUnwrapNativeCurrency] = useState(true) const [percent, setPercent] = useState('') + const [currentTransactionStep, setCurrentTransactionStep] = useState< + { step: TransactionStep; accepted: boolean } | undefined + >() const positionInfo = useModalLiquidityInitialState() const percentInvalid = percent === '0' || percent === '' || !percent @@ -45,8 +53,18 @@ export function RemoveLiquidityModalContextProvider({ children }: PropsWithChild percentInvalid, unwrapNativeCurrency, setUnwrapNativeCurrency, + currentTransactionStep, + setCurrentTransactionStep, }), - [percent, step, positionInfo, percentInvalid, unwrapNativeCurrency, setUnwrapNativeCurrency], + [ + percent, + step, + positionInfo, + percentInvalid, + unwrapNativeCurrency, + setUnwrapNativeCurrency, + currentTransactionStep, + ], ) return {children} diff --git a/apps/web/src/components/RemoveLiquidity/RemoveLiquidityReview.tsx b/apps/web/src/components/RemoveLiquidity/RemoveLiquidityReview.tsx index 8624b900e98..e729457e574 100644 --- a/apps/web/src/components/RemoveLiquidity/RemoveLiquidityReview.tsx +++ b/apps/web/src/components/RemoveLiquidity/RemoveLiquidityReview.tsx @@ -36,11 +36,11 @@ import { useTrace } from 'utilities/src/telemetry/trace/TraceContext' export function RemoveLiquidityReview({ onClose }: { onClose: () => void }) { const { t } = useTranslation() + const { percent, positionInfo, unwrapNativeCurrency, currentTransactionStep, setCurrentTransactionStep } = + useRemoveLiquidityModalContext() const [steps, setSteps] = useState([]) - const { percent, positionInfo, unwrapNativeCurrency } = useRemoveLiquidityModalContext() const removeLiquidityTxContext = useRemoveLiquidityTxContext() const { formatCurrencyAmount, formatPercent } = useLocalizationContext() - const [currentStep, setCurrentStep] = useState<{ step: TransactionStep; accepted: boolean } | undefined>() const currency0FiatAmount = useUSDCValue(positionInfo?.currency0Amount) ?? undefined const currency1FiatAmount = useUSDCValue(positionInfo?.currency1Amount) ?? undefined const selectChain = useSelectChain() @@ -53,12 +53,12 @@ export function RemoveLiquidityReview({ onClose }: { onClose: () => void }) { const onSuccess = () => { setSteps([]) - setCurrentStep(undefined) + setCurrentTransactionStep(undefined) onClose() } const onFailure = () => { - setCurrentStep(undefined) + setCurrentTransactionStep(undefined) } if (!positionInfo) { @@ -131,7 +131,7 @@ export function RemoveLiquidityReview({ onClose }: { onClose: () => void }) { startChainId, account, liquidityTxContext: txContext, - setCurrentStep, + setCurrentStep: setCurrentTransactionStep, setSteps, onSuccess, onFailure, @@ -203,8 +203,8 @@ export function RemoveLiquidityReview({ onClose }: { onClose: () => void }) { )} - {currentStep ? ( - + {currentTransactionStep ? ( + ) : ( <> diff --git a/apps/web/src/components/RemoveLiquidity/hooks.ts b/apps/web/src/components/RemoveLiquidity/hooks.ts index 743cb2fdcea..2e6c9b99855 100644 --- a/apps/web/src/components/RemoveLiquidity/hooks.ts +++ b/apps/web/src/components/RemoveLiquidity/hooks.ts @@ -17,11 +17,13 @@ import { } from 'uniswap/src/data/tradingApi/__generated__' import { useTransactionGasFee, useUSDCurrencyAmountOfGasFee } from 'uniswap/src/features/gas/hooks' import { useTransactionSettingsContext } from 'uniswap/src/features/transactions/settings/contexts/TransactionSettingsContext' +import { TransactionStepType } from 'uniswap/src/features/transactions/swap/types/steps' import { logger } from 'utilities/src/logger/logger' import { ONE_SECOND_MS } from 'utilities/src/time/time' export function useRemoveLiquidityTxAndGasInfo({ account }: { account?: string }): RemoveLiquidityTxInfo { - const { positionInfo, percent, percentInvalid, unwrapNativeCurrency } = useRemoveLiquidityModalContext() + const { positionInfo, percent, percentInvalid, unwrapNativeCurrency, currentTransactionStep } = + useRemoveLiquidityModalContext() const { customDeadline, customSlippageTolerance } = useTransactionSettingsContext() const currency0Info = useCurrencyInfoWithUnwrapForTradingApi({ @@ -132,6 +134,9 @@ export function useRemoveLiquidityTxAndGasInfo({ account }: { account?: string } customSlippageTolerance, ]) + const isUserCommittedToDecrease = + currentTransactionStep?.step.type === TransactionStepType.DecreasePositionTransaction + const { data: decreaseCalldata, isLoading: decreaseCalldataLoading, @@ -142,6 +147,7 @@ export function useRemoveLiquidityTxAndGasInfo({ account }: { account?: string } deadlineInMinutes: customDeadline, refetchInterval: 5 * ONE_SECOND_MS, enabled: + !isUserCommittedToDecrease && !!decreaseCalldataQueryParams && ((!percentInvalid && !v2LpTokenApprovalQueryParams) || (!v2ApprovalLoading && !approvalError && Boolean(v2LpTokenApproval))), diff --git a/apps/web/src/pages/Pool/Positions/create/ContextProviders.tsx b/apps/web/src/pages/Pool/Positions/create/ContextProviders.tsx index bfbb7966721..0126b2f1a0a 100644 --- a/apps/web/src/pages/Pool/Positions/create/ContextProviders.tsx +++ b/apps/web/src/pages/Pool/Positions/create/ContextProviders.tsx @@ -37,6 +37,7 @@ import { useCheckLpApprovalQuery } from 'uniswap/src/data/apiClients/tradingApi/ import { useCreateLpPositionCalldataQuery } from 'uniswap/src/data/apiClients/tradingApi/useCreateLpPositionCalldataQuery' import { useTransactionGasFee, useUSDCurrencyAmountOfGasFee } from 'uniswap/src/features/gas/hooks' import { useTransactionSettingsContext } from 'uniswap/src/features/transactions/settings/contexts/TransactionSettingsContext' +import { TransactionStep, TransactionStepType } from 'uniswap/src/features/transactions/swap/types/steps' import { logger } from 'utilities/src/logger/logger' import { ONE_SECOND_MS } from 'utilities/src/time/time' @@ -49,6 +50,9 @@ export function CreatePositionContextProvider({ }) { const [positionState, setPositionState] = useState({ ...DEFAULT_POSITION_STATE, ...initialState }) const [step, setStep] = useState(PositionFlowStep.SELECT_TOKENS_AND_FEE_TIER) + const [currentTransactionStep, setCurrentTransactionStep] = useState< + { step: TransactionStep; accepted: boolean } | undefined + >() const derivedPositionInfo = useDerivedPositionInfo(positionState) const [feeTierSearchModalOpen, setFeeTierSearchModalOpen] = useState(false) const [dynamicFeeTierSpeedbumpData, setDynamicFeeTierSpeedbumpData] = useState({ @@ -74,6 +78,8 @@ export function CreatePositionContextProvider({ setPositionState, derivedPositionInfo, feeTierSearchModalOpen, + currentTransactionStep, + setCurrentTransactionStep, setFeeTierSearchModalOpen, dynamicFeeTierSpeedbumpData, setDynamicFeeTierSpeedbumpData, @@ -146,7 +152,7 @@ export function DepositContextProvider({ children }: { children: React.ReactNode export function CreateTxContextProvider({ children }: { children: React.ReactNode }) { const account = useAccountMeta() - const { derivedPositionInfo, positionState } = useCreatePositionContext() + const { derivedPositionInfo, positionState, currentTransactionStep } = useCreatePositionContext() const { derivedDepositInfo, depositState } = useDepositContext() const { priceRangeState, derivedPriceRangeInfo } = usePriceRangeContext() const swapSettings = useTransactionSettingsContext() @@ -214,6 +220,11 @@ export function CreateTxContextProvider({ children }: { children: React.ReactNod priceRangeState, depositState.exactField, ]) + + const isUserCommittedToCreate = + currentTransactionStep?.step.type === TransactionStepType.IncreasePositionTransaction || + currentTransactionStep?.step.type === TransactionStepType.IncreasePositionTransactionAsync + const { data: createCalldata, error: createError, @@ -223,6 +234,7 @@ export function CreateTxContextProvider({ children }: { children: React.ReactNod deadlineInMinutes: swapSettings.customDeadline, refetchInterval: 5 * ONE_SECOND_MS, enabled: + !isUserCommittedToCreate && !hasError && !approvalLoading && !approvalError && diff --git a/apps/web/src/pages/Pool/Positions/create/CreatePositionContext.tsx b/apps/web/src/pages/Pool/Positions/create/CreatePositionContext.tsx index 0f9da7f7f6b..5b37360281e 100644 --- a/apps/web/src/pages/Pool/Positions/create/CreatePositionContext.tsx +++ b/apps/web/src/pages/Pool/Positions/create/CreatePositionContext.tsx @@ -32,6 +32,8 @@ export const CreatePositionContext = React.createContext undefined, + currentTransactionStep: undefined, + setCurrentTransactionStep: () => undefined, }) export const useCreatePositionContext = () => { diff --git a/apps/web/src/pages/Pool/Positions/create/CreatePositionModal.tsx b/apps/web/src/pages/Pool/Positions/create/CreatePositionModal.tsx index 8b91f951075..c228b5a3104 100644 --- a/apps/web/src/pages/Pool/Positions/create/CreatePositionModal.tsx +++ b/apps/web/src/pages/Pool/Positions/create/CreatePositionModal.tsx @@ -50,6 +50,8 @@ export function CreatePositionModal({ isOpen, onClose }: { isOpen: boolean; onCl const { positionState: { fee, hook }, derivedPositionInfo, + currentTransactionStep, + setCurrentTransactionStep, } = useCreatePositionContext() const { derivedPriceRangeInfo, @@ -75,7 +77,6 @@ export function CreatePositionModal({ isOpen, onClose }: { isOpen: boolean; onCl const versionLabel = getProtocolVersionLabel(protocolVersion) const [steps, setSteps] = useState([]) - const [currentStep, setCurrentStep] = useState<{ step: TransactionStep; accepted: boolean } | undefined>() const dispatch = useDispatch() const { txInfo, gasFeeEstimateUSD, error, refetch } = useCreateTxContext() const account = useAccountMeta() @@ -85,12 +86,12 @@ export function CreatePositionModal({ isOpen, onClose }: { isOpen: boolean; onCl const trace = useTrace() const onFailure = () => { - setCurrentStep(undefined) + setCurrentTransactionStep(undefined) } const onSuccess = useCallback(() => { setSteps([]) - setCurrentStep(undefined) + setCurrentTransactionStep(undefined) onClose() navigate('/positions') }, [onClose, navigate]) @@ -122,7 +123,7 @@ export function CreatePositionModal({ isOpen, onClose }: { isOpen: boolean; onCl startChainId, account, liquidityTxContext: txInfo, - setCurrentStep, + setCurrentStep: setCurrentTransactionStep, setSteps, onSuccess, onFailure, @@ -299,8 +300,8 @@ export function CreatePositionModal({ isOpen, onClose }: { isOpen: boolean; onCl {error && } - {currentStep && steps.length > 1 ? ( - + {currentTransactionStep && steps.length > 1 ? ( + ) : ( <> @@ -327,7 +328,7 @@ export function CreatePositionModal({ isOpen, onClose }: { isOpen: boolean; onCl }} /> - {currentStep ? ( + {currentTransactionStep ? ( diff --git a/apps/web/src/pages/Pool/Positions/create/types.ts b/apps/web/src/pages/Pool/Positions/create/types.ts index cb2c5616cf9..b77ea744283 100644 --- a/apps/web/src/pages/Pool/Positions/create/types.ts +++ b/apps/web/src/pages/Pool/Positions/create/types.ts @@ -6,6 +6,7 @@ import { FeeAmount, TICK_SPACINGS, Pool as V3Pool } from '@uniswap/v3-sdk' import { Pool as V4Pool } from '@uniswap/v4-sdk' import { Dispatch, SetStateAction } from 'react' import { PositionField } from 'types/position' +import { TransactionStep } from 'uniswap/src/features/transactions/swap/types/steps' export type FeeData = { feeAmount: number @@ -87,6 +88,8 @@ export type CreatePositionContextType = { setFeeTierSearchModalOpen: Dispatch> dynamicFeeTierSpeedbumpData: DynamicFeeTierSpeedbumpData setDynamicFeeTierSpeedbumpData: Dispatch> + currentTransactionStep?: { step: TransactionStep; accepted: boolean } + setCurrentTransactionStep: Dispatch> } export interface PriceRangeState { diff --git a/packages/uniswap/src/features/gating/flags.ts b/packages/uniswap/src/features/gating/flags.ts index 4065b808526..aaffd53dcf5 100644 --- a/packages/uniswap/src/features/gating/flags.ts +++ b/packages/uniswap/src/features/gating/flags.ts @@ -78,6 +78,7 @@ export const SHARED_FEATURE_FLAG_NAMES = new Map([ [FeatureFlags.PortionFields, 'portion-fields'], [FeatureFlags.SharedSwapArbitrumUniswapXExperiment, 'shared_swap_arbitrum_uniswapx_experiment'], [FeatureFlags.TokenSelectorTrendingTokens, 'token_selector_trending_tokens'], + [FeatureFlags.TwoSecondSwapQuotePollingInterval, 'two_second_swap_quote_polling_interval'], [FeatureFlags.Unichain, 'unichain'], [FeatureFlags.UnichainPromo, 'unichain_promo'], [FeatureFlags.UniswapX, 'uniswapx'], @@ -101,7 +102,6 @@ export const WEB_FEATURE_FLAG_NAMES = new Map([ [FeatureFlags.LimitsFees, 'limits_fees'], [FeatureFlags.MultipleRoutingOptions, 'multiple_routing_options'], [FeatureFlags.NavigationHotkeys, 'navigation_hotkeys'], - [FeatureFlags.TwoSecondSwapQuotePollingInterval, 'two_second_swap_quote_polling_interval'], // TODO(WEB-3625): Remove these once we have a generalized system for outage banners. [FeatureFlags.OutageBannerArbitrum, 'outage_banner_feb_2024_arbitrum'], [FeatureFlags.OutageBannerOptimism, 'outage_banner_feb_2024_optimism'],