ci(release): publish latest release

parent f16a99c9
IPFS hash of the deployment: IPFS hash of the deployment:
- CIDv0: `QmcrR5faskhjW7PVj7g5tA4gAqASyDvySRHAQes9fVCSvJ` - CIDv0: `QmeVXtPfnqJ2PeigSXgwizJDYf2EmwfVrCE4Qi3dXhAbdL`
- CIDv1: `bafybeigxuoq3myrrht67aku2bu7jqvr6rdfwfp6bycbgu7tbybbktumvz4` - CIDv1: `bafybeihqagapczekcmizn4zden7rrz6h4mfhtnd3dc3wa3wnatqc4eu6vm`
The latest release is always mirrored at [app.uniswap.org](https://app.uniswap.org). 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. ...@@ -10,15 +10,15 @@ You can also access the Uniswap Interface from an IPFS gateway.
Your Uniswap settings are never remembered across different URLs. Your Uniswap settings are never remembered across different URLs.
IPFS gateways: IPFS gateways:
- https://bafybeigxuoq3myrrht67aku2bu7jqvr6rdfwfp6bycbgu7tbybbktumvz4.ipfs.dweb.link/ - https://bafybeihqagapczekcmizn4zden7rrz6h4mfhtnd3dc3wa3wnatqc4eu6vm.ipfs.dweb.link/
- https://bafybeigxuoq3myrrht67aku2bu7jqvr6rdfwfp6bycbgu7tbybbktumvz4.ipfs.cf-ipfs.com/ - https://bafybeihqagapczekcmizn4zden7rrz6h4mfhtnd3dc3wa3wnatqc4eu6vm.ipfs.cf-ipfs.com/
- [ipfs://QmcrR5faskhjW7PVj7g5tA4gAqASyDvySRHAQes9fVCSvJ/](ipfs://QmcrR5faskhjW7PVj7g5tA4gAqASyDvySRHAQes9fVCSvJ/) - [ipfs://QmeVXtPfnqJ2PeigSXgwizJDYf2EmwfVrCE4Qi3dXhAbdL/](ipfs://QmeVXtPfnqJ2PeigSXgwizJDYf2EmwfVrCE4Qi3dXhAbdL/)
### 5.67.3 (2025-01-23) ### 5.67.4 (2025-01-23)
### Bug Fixes ### Bug Fixes
* **web:** lp flow error logging updates (#15424) d7de5d5 * **web:** Phil/lp polling prod (#15462) 7533563
web/5.67.3 web/5.67.4
\ No newline at end of file \ No newline at end of file
...@@ -4,6 +4,7 @@ import { DepositInfo } from 'components/Liquidity/types' ...@@ -4,6 +4,7 @@ import { DepositInfo } from 'components/Liquidity/types'
import { Dispatch, PropsWithChildren, SetStateAction, createContext, useContext, useMemo, useState } from 'react' import { Dispatch, PropsWithChildren, SetStateAction, createContext, useContext, useMemo, useState } from 'react'
import { LiquidityModalInitialState } from 'state/application/reducer' import { LiquidityModalInitialState } from 'state/application/reducer'
import { PositionField } from 'types/position' import { PositionField } from 'types/position'
import { TransactionStep } from 'uniswap/src/features/transactions/swap/types/steps'
export enum IncreaseLiquidityStep { export enum IncreaseLiquidityStep {
Input, Input,
...@@ -35,6 +36,8 @@ interface IncreaseLiquidityContextType { ...@@ -35,6 +36,8 @@ interface IncreaseLiquidityContextType {
setIncreaseLiquidityState: Dispatch<SetStateAction<IncreaseLiquidityState>> setIncreaseLiquidityState: Dispatch<SetStateAction<IncreaseLiquidityState>>
unwrapNativeCurrency: boolean unwrapNativeCurrency: boolean
setUnwrapNativeCurrency: Dispatch<SetStateAction<boolean>> setUnwrapNativeCurrency: Dispatch<SetStateAction<boolean>>
currentTransactionStep?: { step: TransactionStep; accepted: boolean }
setCurrentTransactionStep: Dispatch<SetStateAction<{ step: TransactionStep; accepted: boolean } | undefined>>
} }
const IncreaseLiquidityContext = createContext<IncreaseLiquidityContextType>({ const IncreaseLiquidityContext = createContext<IncreaseLiquidityContextType>({
...@@ -45,6 +48,8 @@ const IncreaseLiquidityContext = createContext<IncreaseLiquidityContextType>({ ...@@ -45,6 +48,8 @@ const IncreaseLiquidityContext = createContext<IncreaseLiquidityContextType>({
setIncreaseLiquidityState: () => undefined, setIncreaseLiquidityState: () => undefined,
unwrapNativeCurrency: true, unwrapNativeCurrency: true,
setUnwrapNativeCurrency: () => undefined, setUnwrapNativeCurrency: () => undefined,
currentTransactionStep: undefined,
setCurrentTransactionStep: () => undefined,
}) })
export function useIncreaseLiquidityContext() { export function useIncreaseLiquidityContext() {
...@@ -60,6 +65,9 @@ export function IncreaseLiquidityContextProvider({ children }: PropsWithChildren ...@@ -60,6 +65,9 @@ export function IncreaseLiquidityContextProvider({ children }: PropsWithChildren
...DEFAULT_INCREASE_LIQUIDITY_STATE, ...DEFAULT_INCREASE_LIQUIDITY_STATE,
position: positionInfo, position: positionInfo,
}) })
const [currentTransactionStep, setCurrentTransactionStep] = useState<
{ step: TransactionStep; accepted: boolean } | undefined
>()
const derivedIncreaseLiquidityInfo = useDerivedIncreaseLiquidityInfo(increaseLiquidityState, unwrapNativeCurrency) const derivedIncreaseLiquidityInfo = useDerivedIncreaseLiquidityInfo(increaseLiquidityState, unwrapNativeCurrency)
...@@ -72,8 +80,10 @@ export function IncreaseLiquidityContextProvider({ children }: PropsWithChildren ...@@ -72,8 +80,10 @@ export function IncreaseLiquidityContextProvider({ children }: PropsWithChildren
derivedIncreaseLiquidityInfo, derivedIncreaseLiquidityInfo,
unwrapNativeCurrency, unwrapNativeCurrency,
setUnwrapNativeCurrency, setUnwrapNativeCurrency,
currentTransactionStep,
setCurrentTransactionStep,
}), }),
[increaseLiquidityState, derivedIncreaseLiquidityInfo, step, unwrapNativeCurrency], [increaseLiquidityState, derivedIncreaseLiquidityInfo, step, unwrapNativeCurrency, currentTransactionStep],
) )
return <IncreaseLiquidityContext.Provider value={value}>{children}</IncreaseLiquidityContext.Provider> return <IncreaseLiquidityContext.Provider value={value}>{children}</IncreaseLiquidityContext.Provider>
......
...@@ -36,7 +36,8 @@ export function IncreaseLiquidityReview({ onClose }: { onClose: () => void }) { ...@@ -36,7 +36,8 @@ export function IncreaseLiquidityReview({ onClose }: { onClose: () => void }) {
const { formatCurrencyAmount, formatPercent } = useLocalizationContext() const { formatCurrencyAmount, formatPercent } = useLocalizationContext()
const { derivedIncreaseLiquidityInfo, increaseLiquidityState } = useIncreaseLiquidityContext() const { derivedIncreaseLiquidityInfo, increaseLiquidityState, currentTransactionStep, setCurrentTransactionStep } =
useIncreaseLiquidityContext()
const { txInfo, gasFeeEstimateUSD } = useIncreaseLiquidityTxContext() const { txInfo, gasFeeEstimateUSD } = useIncreaseLiquidityTxContext()
const { dependentAmount } = txInfo || {} const { dependentAmount } = txInfo || {}
...@@ -57,7 +58,6 @@ export function IncreaseLiquidityReview({ onClose }: { onClose: () => void }) { ...@@ -57,7 +58,6 @@ export function IncreaseLiquidityReview({ onClose }: { onClose: () => void }) {
) )
const [steps, setSteps] = useState<TransactionStep[]>([]) const [steps, setSteps] = useState<TransactionStep[]>([])
const [currentStep, setCurrentStep] = useState<{ step: TransactionStep; accepted: boolean } | undefined>()
if (!increaseLiquidityState.position) { if (!increaseLiquidityState.position) {
throw new Error('a position must be defined') throw new Error('a position must be defined')
...@@ -95,12 +95,12 @@ export function IncreaseLiquidityReview({ onClose }: { onClose: () => void }) { ...@@ -95,12 +95,12 @@ export function IncreaseLiquidityReview({ onClose }: { onClose: () => void }) {
const newToken1AmountUSD = useUSDCValue(newToken1Amount) const newToken1AmountUSD = useUSDCValue(newToken1Amount)
const onFailure = () => { const onFailure = () => {
setCurrentStep(undefined) setCurrentTransactionStep(undefined)
} }
const onSuccess = () => { const onSuccess = () => {
setSteps([]) setSteps([])
setCurrentStep(undefined) setCurrentTransactionStep(undefined)
onClose() onClose()
} }
...@@ -123,7 +123,7 @@ export function IncreaseLiquidityReview({ onClose }: { onClose: () => void }) { ...@@ -123,7 +123,7 @@ export function IncreaseLiquidityReview({ onClose }: { onClose: () => void }) {
startChainId, startChainId,
account, account,
liquidityTxContext: txInfo, liquidityTxContext: txInfo,
setCurrentStep, setCurrentStep: setCurrentTransactionStep,
setSteps, setSteps,
onSuccess, onSuccess,
onFailure, onFailure,
...@@ -156,8 +156,8 @@ export function IncreaseLiquidityReview({ onClose }: { onClose: () => void }) { ...@@ -156,8 +156,8 @@ export function IncreaseLiquidityReview({ onClose }: { onClose: () => void }) {
</Text> </Text>
<TokenInfo currencyAmount={displayCurrencyAmounts?.TOKEN1} currencyUSDAmount={displayUSDAmounts?.TOKEN1} /> <TokenInfo currencyAmount={displayCurrencyAmounts?.TOKEN1} currencyUSDAmount={displayUSDAmounts?.TOKEN1} />
</Flex> </Flex>
{currentStep ? ( {currentTransactionStep ? (
<ProgressIndicator currentStep={currentStep} steps={steps} /> <ProgressIndicator currentStep={currentTransactionStep} steps={steps} />
) : ( ) : (
<> <>
<Separator mx="$padding16" /> <Separator mx="$padding16" />
......
...@@ -21,6 +21,7 @@ import { ...@@ -21,6 +21,7 @@ import {
LiquidityTransactionType, LiquidityTransactionType,
} from 'uniswap/src/features/transactions/liquidity/types' } from 'uniswap/src/features/transactions/liquidity/types'
import { useTransactionSettingsContext } from 'uniswap/src/features/transactions/settings/contexts/TransactionSettingsContext' 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 { validatePermit, validateTransactionRequest } from 'uniswap/src/features/transactions/swap/utils/trade'
import { logger } from 'utilities/src/logger/logger' import { logger } from 'utilities/src/logger/logger'
import { ONE_SECOND_MS } from 'utilities/src/time/time' import { ONE_SECOND_MS } from 'utilities/src/time/time'
...@@ -37,7 +38,7 @@ const IncreaseLiquidityTxContext = createContext<IncreasePositionContextType | u ...@@ -37,7 +38,7 @@ const IncreaseLiquidityTxContext = createContext<IncreasePositionContextType | u
export function IncreaseLiquidityTxContextProvider({ children }: PropsWithChildren): JSX.Element { export function IncreaseLiquidityTxContextProvider({ children }: PropsWithChildren): JSX.Element {
const positionInfo = useModalLiquidityInitialState() const positionInfo = useModalLiquidityInitialState()
const { derivedIncreaseLiquidityInfo, increaseLiquidityState } = useIncreaseLiquidityContext() const { derivedIncreaseLiquidityInfo, increaseLiquidityState, currentTransactionStep } = useIncreaseLiquidityContext()
const { customDeadline, customSlippageTolerance } = useTransactionSettingsContext() const { customDeadline, customSlippageTolerance } = useTransactionSettingsContext()
const { currencyAmounts, error } = derivedIncreaseLiquidityInfo const { currencyAmounts, error } = derivedIncreaseLiquidityInfo
...@@ -154,6 +155,10 @@ export function IncreaseLiquidityTxContextProvider({ children }: PropsWithChildr ...@@ -154,6 +155,10 @@ export function IncreaseLiquidityTxContextProvider({ children }: PropsWithChildr
} }
}, [account, positionInfo, currencyAmounts, approvalsNeeded, customSlippageTolerance, exactField]) }, [account, positionInfo, currencyAmounts, approvalsNeeded, customSlippageTolerance, exactField])
const isUserCommittedToIncrease =
currentTransactionStep?.step.type === TransactionStepType.IncreasePositionTransaction ||
currentTransactionStep?.step.type === TransactionStepType.IncreasePositionTransactionAsync
const { const {
data: increaseCalldata, data: increaseCalldata,
isLoading: isCalldataLoading, isLoading: isCalldataLoading,
...@@ -163,7 +168,12 @@ export function IncreaseLiquidityTxContextProvider({ children }: PropsWithChildr ...@@ -163,7 +168,12 @@ export function IncreaseLiquidityTxContextProvider({ children }: PropsWithChildr
params: increaseCalldataQueryParams, params: increaseCalldataQueryParams,
deadlineInMinutes: customDeadline, deadlineInMinutes: customDeadline,
refetchInterval: 5 * ONE_SECOND_MS, refetchInterval: 5 * ONE_SECOND_MS,
enabled: !error && !approvalLoading && !approvalError && Boolean(increaseCalldataQueryParams), enabled:
!isUserCommittedToIncrease &&
!error &&
!approvalLoading &&
!approvalError &&
Boolean(increaseCalldataQueryParams),
}) })
const { increase, gasFee: actualGasFee, dependentAmount } = increaseCalldata || {} const { increase, gasFee: actualGasFee, dependentAmount } = increaseCalldata || {}
......
import { useModalLiquidityInitialState } from 'components/Liquidity/hooks' import { useModalLiquidityInitialState } from 'components/Liquidity/hooks'
import { Dispatch, PropsWithChildren, SetStateAction, createContext, useContext, useMemo, useState } from 'react' import { Dispatch, PropsWithChildren, SetStateAction, createContext, useContext, useMemo, useState } from 'react'
import { LiquidityModalInitialState } from 'state/application/reducer' import { LiquidityModalInitialState } from 'state/application/reducer'
import { TransactionStep } from 'uniswap/src/features/transactions/swap/types/steps'
export enum DecreaseLiquidityStep { export enum DecreaseLiquidityStep {
Input, Input,
...@@ -16,6 +17,8 @@ type RemoveLiquidityModalState = { ...@@ -16,6 +17,8 @@ type RemoveLiquidityModalState = {
percentInvalid?: boolean percentInvalid?: boolean
unwrapNativeCurrency: boolean unwrapNativeCurrency: boolean
setUnwrapNativeCurrency: Dispatch<SetStateAction<boolean>> setUnwrapNativeCurrency: Dispatch<SetStateAction<boolean>>
currentTransactionStep?: { step: TransactionStep; accepted: boolean }
setCurrentTransactionStep: Dispatch<SetStateAction<{ step: TransactionStep; accepted: boolean } | undefined>>
} }
const RemoveLiquidityModalContext = createContext<RemoveLiquidityModalState>({ const RemoveLiquidityModalContext = createContext<RemoveLiquidityModalState>({
...@@ -26,12 +29,17 @@ const RemoveLiquidityModalContext = createContext<RemoveLiquidityModalState>({ ...@@ -26,12 +29,17 @@ const RemoveLiquidityModalContext = createContext<RemoveLiquidityModalState>({
percentInvalid: true, percentInvalid: true,
unwrapNativeCurrency: true, unwrapNativeCurrency: true,
setUnwrapNativeCurrency: () => null, setUnwrapNativeCurrency: () => null,
currentTransactionStep: undefined,
setCurrentTransactionStep: () => null,
}) })
export function RemoveLiquidityModalContextProvider({ children }: PropsWithChildren): JSX.Element { export function RemoveLiquidityModalContextProvider({ children }: PropsWithChildren): JSX.Element {
const [step, setStep] = useState(DecreaseLiquidityStep.Input) const [step, setStep] = useState(DecreaseLiquidityStep.Input)
const [unwrapNativeCurrency, setUnwrapNativeCurrency] = useState(true) const [unwrapNativeCurrency, setUnwrapNativeCurrency] = useState(true)
const [percent, setPercent] = useState<string>('') const [percent, setPercent] = useState<string>('')
const [currentTransactionStep, setCurrentTransactionStep] = useState<
{ step: TransactionStep; accepted: boolean } | undefined
>()
const positionInfo = useModalLiquidityInitialState() const positionInfo = useModalLiquidityInitialState()
const percentInvalid = percent === '0' || percent === '' || !percent const percentInvalid = percent === '0' || percent === '' || !percent
...@@ -45,8 +53,18 @@ export function RemoveLiquidityModalContextProvider({ children }: PropsWithChild ...@@ -45,8 +53,18 @@ export function RemoveLiquidityModalContextProvider({ children }: PropsWithChild
percentInvalid, percentInvalid,
unwrapNativeCurrency, unwrapNativeCurrency,
setUnwrapNativeCurrency, setUnwrapNativeCurrency,
currentTransactionStep,
setCurrentTransactionStep,
}), }),
[percent, step, positionInfo, percentInvalid, unwrapNativeCurrency, setUnwrapNativeCurrency], [
percent,
step,
positionInfo,
percentInvalid,
unwrapNativeCurrency,
setUnwrapNativeCurrency,
currentTransactionStep,
],
) )
return <RemoveLiquidityModalContext.Provider value={ctx}>{children}</RemoveLiquidityModalContext.Provider> return <RemoveLiquidityModalContext.Provider value={ctx}>{children}</RemoveLiquidityModalContext.Provider>
......
...@@ -36,11 +36,11 @@ import { useTrace } from 'utilities/src/telemetry/trace/TraceContext' ...@@ -36,11 +36,11 @@ import { useTrace } from 'utilities/src/telemetry/trace/TraceContext'
export function RemoveLiquidityReview({ onClose }: { onClose: () => void }) { export function RemoveLiquidityReview({ onClose }: { onClose: () => void }) {
const { t } = useTranslation() const { t } = useTranslation()
const { percent, positionInfo, unwrapNativeCurrency, currentTransactionStep, setCurrentTransactionStep } =
useRemoveLiquidityModalContext()
const [steps, setSteps] = useState<TransactionStep[]>([]) const [steps, setSteps] = useState<TransactionStep[]>([])
const { percent, positionInfo, unwrapNativeCurrency } = useRemoveLiquidityModalContext()
const removeLiquidityTxContext = useRemoveLiquidityTxContext() const removeLiquidityTxContext = useRemoveLiquidityTxContext()
const { formatCurrencyAmount, formatPercent } = useLocalizationContext() const { formatCurrencyAmount, formatPercent } = useLocalizationContext()
const [currentStep, setCurrentStep] = useState<{ step: TransactionStep; accepted: boolean } | undefined>()
const currency0FiatAmount = useUSDCValue(positionInfo?.currency0Amount) ?? undefined const currency0FiatAmount = useUSDCValue(positionInfo?.currency0Amount) ?? undefined
const currency1FiatAmount = useUSDCValue(positionInfo?.currency1Amount) ?? undefined const currency1FiatAmount = useUSDCValue(positionInfo?.currency1Amount) ?? undefined
const selectChain = useSelectChain() const selectChain = useSelectChain()
...@@ -53,12 +53,12 @@ export function RemoveLiquidityReview({ onClose }: { onClose: () => void }) { ...@@ -53,12 +53,12 @@ export function RemoveLiquidityReview({ onClose }: { onClose: () => void }) {
const onSuccess = () => { const onSuccess = () => {
setSteps([]) setSteps([])
setCurrentStep(undefined) setCurrentTransactionStep(undefined)
onClose() onClose()
} }
const onFailure = () => { const onFailure = () => {
setCurrentStep(undefined) setCurrentTransactionStep(undefined)
} }
if (!positionInfo) { if (!positionInfo) {
...@@ -131,7 +131,7 @@ export function RemoveLiquidityReview({ onClose }: { onClose: () => void }) { ...@@ -131,7 +131,7 @@ export function RemoveLiquidityReview({ onClose }: { onClose: () => void }) {
startChainId, startChainId,
account, account,
liquidityTxContext: txContext, liquidityTxContext: txContext,
setCurrentStep, setCurrentStep: setCurrentTransactionStep,
setSteps, setSteps,
onSuccess, onSuccess,
onFailure, onFailure,
...@@ -203,8 +203,8 @@ export function RemoveLiquidityReview({ onClose }: { onClose: () => void }) { ...@@ -203,8 +203,8 @@ export function RemoveLiquidityReview({ onClose }: { onClose: () => void }) {
</Flex> </Flex>
)} )}
</Flex> </Flex>
{currentStep ? ( {currentTransactionStep ? (
<ProgressIndicator steps={steps} currentStep={currentStep} /> <ProgressIndicator steps={steps} currentStep={currentTransactionStep} />
) : ( ) : (
<> <>
<Separator mx="$padding16" /> <Separator mx="$padding16" />
......
...@@ -17,11 +17,13 @@ import { ...@@ -17,11 +17,13 @@ import {
} from 'uniswap/src/data/tradingApi/__generated__' } from 'uniswap/src/data/tradingApi/__generated__'
import { useTransactionGasFee, useUSDCurrencyAmountOfGasFee } from 'uniswap/src/features/gas/hooks' import { useTransactionGasFee, useUSDCurrencyAmountOfGasFee } from 'uniswap/src/features/gas/hooks'
import { useTransactionSettingsContext } from 'uniswap/src/features/transactions/settings/contexts/TransactionSettingsContext' 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 { logger } from 'utilities/src/logger/logger'
import { ONE_SECOND_MS } from 'utilities/src/time/time' import { ONE_SECOND_MS } from 'utilities/src/time/time'
export function useRemoveLiquidityTxAndGasInfo({ account }: { account?: string }): RemoveLiquidityTxInfo { 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 { customDeadline, customSlippageTolerance } = useTransactionSettingsContext()
const currency0Info = useCurrencyInfoWithUnwrapForTradingApi({ const currency0Info = useCurrencyInfoWithUnwrapForTradingApi({
...@@ -132,6 +134,9 @@ export function useRemoveLiquidityTxAndGasInfo({ account }: { account?: string } ...@@ -132,6 +134,9 @@ export function useRemoveLiquidityTxAndGasInfo({ account }: { account?: string }
customSlippageTolerance, customSlippageTolerance,
]) ])
const isUserCommittedToDecrease =
currentTransactionStep?.step.type === TransactionStepType.DecreasePositionTransaction
const { const {
data: decreaseCalldata, data: decreaseCalldata,
isLoading: decreaseCalldataLoading, isLoading: decreaseCalldataLoading,
...@@ -142,6 +147,7 @@ export function useRemoveLiquidityTxAndGasInfo({ account }: { account?: string } ...@@ -142,6 +147,7 @@ export function useRemoveLiquidityTxAndGasInfo({ account }: { account?: string }
deadlineInMinutes: customDeadline, deadlineInMinutes: customDeadline,
refetchInterval: 5 * ONE_SECOND_MS, refetchInterval: 5 * ONE_SECOND_MS,
enabled: enabled:
!isUserCommittedToDecrease &&
!!decreaseCalldataQueryParams && !!decreaseCalldataQueryParams &&
((!percentInvalid && !v2LpTokenApprovalQueryParams) || ((!percentInvalid && !v2LpTokenApprovalQueryParams) ||
(!v2ApprovalLoading && !approvalError && Boolean(v2LpTokenApproval))), (!v2ApprovalLoading && !approvalError && Boolean(v2LpTokenApproval))),
......
...@@ -37,6 +37,7 @@ import { useCheckLpApprovalQuery } from 'uniswap/src/data/apiClients/tradingApi/ ...@@ -37,6 +37,7 @@ import { useCheckLpApprovalQuery } from 'uniswap/src/data/apiClients/tradingApi/
import { useCreateLpPositionCalldataQuery } from 'uniswap/src/data/apiClients/tradingApi/useCreateLpPositionCalldataQuery' import { useCreateLpPositionCalldataQuery } from 'uniswap/src/data/apiClients/tradingApi/useCreateLpPositionCalldataQuery'
import { useTransactionGasFee, useUSDCurrencyAmountOfGasFee } from 'uniswap/src/features/gas/hooks' import { useTransactionGasFee, useUSDCurrencyAmountOfGasFee } from 'uniswap/src/features/gas/hooks'
import { useTransactionSettingsContext } from 'uniswap/src/features/transactions/settings/contexts/TransactionSettingsContext' 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 { logger } from 'utilities/src/logger/logger'
import { ONE_SECOND_MS } from 'utilities/src/time/time' import { ONE_SECOND_MS } from 'utilities/src/time/time'
...@@ -49,6 +50,9 @@ export function CreatePositionContextProvider({ ...@@ -49,6 +50,9 @@ export function CreatePositionContextProvider({
}) { }) {
const [positionState, setPositionState] = useState<PositionState>({ ...DEFAULT_POSITION_STATE, ...initialState }) const [positionState, setPositionState] = useState<PositionState>({ ...DEFAULT_POSITION_STATE, ...initialState })
const [step, setStep] = useState<PositionFlowStep>(PositionFlowStep.SELECT_TOKENS_AND_FEE_TIER) const [step, setStep] = useState<PositionFlowStep>(PositionFlowStep.SELECT_TOKENS_AND_FEE_TIER)
const [currentTransactionStep, setCurrentTransactionStep] = useState<
{ step: TransactionStep; accepted: boolean } | undefined
>()
const derivedPositionInfo = useDerivedPositionInfo(positionState) const derivedPositionInfo = useDerivedPositionInfo(positionState)
const [feeTierSearchModalOpen, setFeeTierSearchModalOpen] = useState(false) const [feeTierSearchModalOpen, setFeeTierSearchModalOpen] = useState(false)
const [dynamicFeeTierSpeedbumpData, setDynamicFeeTierSpeedbumpData] = useState<DynamicFeeTierSpeedbumpData>({ const [dynamicFeeTierSpeedbumpData, setDynamicFeeTierSpeedbumpData] = useState<DynamicFeeTierSpeedbumpData>({
...@@ -74,6 +78,8 @@ export function CreatePositionContextProvider({ ...@@ -74,6 +78,8 @@ export function CreatePositionContextProvider({
setPositionState, setPositionState,
derivedPositionInfo, derivedPositionInfo,
feeTierSearchModalOpen, feeTierSearchModalOpen,
currentTransactionStep,
setCurrentTransactionStep,
setFeeTierSearchModalOpen, setFeeTierSearchModalOpen,
dynamicFeeTierSpeedbumpData, dynamicFeeTierSpeedbumpData,
setDynamicFeeTierSpeedbumpData, setDynamicFeeTierSpeedbumpData,
...@@ -146,7 +152,7 @@ export function DepositContextProvider({ children }: { children: React.ReactNode ...@@ -146,7 +152,7 @@ export function DepositContextProvider({ children }: { children: React.ReactNode
export function CreateTxContextProvider({ children }: { children: React.ReactNode }) { export function CreateTxContextProvider({ children }: { children: React.ReactNode }) {
const account = useAccountMeta() const account = useAccountMeta()
const { derivedPositionInfo, positionState } = useCreatePositionContext() const { derivedPositionInfo, positionState, currentTransactionStep } = useCreatePositionContext()
const { derivedDepositInfo, depositState } = useDepositContext() const { derivedDepositInfo, depositState } = useDepositContext()
const { priceRangeState, derivedPriceRangeInfo } = usePriceRangeContext() const { priceRangeState, derivedPriceRangeInfo } = usePriceRangeContext()
const swapSettings = useTransactionSettingsContext() const swapSettings = useTransactionSettingsContext()
...@@ -214,6 +220,11 @@ export function CreateTxContextProvider({ children }: { children: React.ReactNod ...@@ -214,6 +220,11 @@ export function CreateTxContextProvider({ children }: { children: React.ReactNod
priceRangeState, priceRangeState,
depositState.exactField, depositState.exactField,
]) ])
const isUserCommittedToCreate =
currentTransactionStep?.step.type === TransactionStepType.IncreasePositionTransaction ||
currentTransactionStep?.step.type === TransactionStepType.IncreasePositionTransactionAsync
const { const {
data: createCalldata, data: createCalldata,
error: createError, error: createError,
...@@ -223,6 +234,7 @@ export function CreateTxContextProvider({ children }: { children: React.ReactNod ...@@ -223,6 +234,7 @@ export function CreateTxContextProvider({ children }: { children: React.ReactNod
deadlineInMinutes: swapSettings.customDeadline, deadlineInMinutes: swapSettings.customDeadline,
refetchInterval: 5 * ONE_SECOND_MS, refetchInterval: 5 * ONE_SECOND_MS,
enabled: enabled:
!isUserCommittedToCreate &&
!hasError && !hasError &&
!approvalLoading && !approvalLoading &&
!approvalError && !approvalError &&
......
...@@ -32,6 +32,8 @@ export const CreatePositionContext = React.createContext<CreatePositionContextTy ...@@ -32,6 +32,8 @@ export const CreatePositionContext = React.createContext<CreatePositionContextTy
wishFeeData: DEFAULT_POSITION_STATE.fee, wishFeeData: DEFAULT_POSITION_STATE.fee,
}, },
setDynamicFeeTierSpeedbumpData: () => undefined, setDynamicFeeTierSpeedbumpData: () => undefined,
currentTransactionStep: undefined,
setCurrentTransactionStep: () => undefined,
}) })
export const useCreatePositionContext = () => { export const useCreatePositionContext = () => {
......
...@@ -50,6 +50,8 @@ export function CreatePositionModal({ isOpen, onClose }: { isOpen: boolean; onCl ...@@ -50,6 +50,8 @@ export function CreatePositionModal({ isOpen, onClose }: { isOpen: boolean; onCl
const { const {
positionState: { fee, hook }, positionState: { fee, hook },
derivedPositionInfo, derivedPositionInfo,
currentTransactionStep,
setCurrentTransactionStep,
} = useCreatePositionContext() } = useCreatePositionContext()
const { const {
derivedPriceRangeInfo, derivedPriceRangeInfo,
...@@ -75,7 +77,6 @@ export function CreatePositionModal({ isOpen, onClose }: { isOpen: boolean; onCl ...@@ -75,7 +77,6 @@ export function CreatePositionModal({ isOpen, onClose }: { isOpen: boolean; onCl
const versionLabel = getProtocolVersionLabel(protocolVersion) const versionLabel = getProtocolVersionLabel(protocolVersion)
const [steps, setSteps] = useState<TransactionStep[]>([]) const [steps, setSteps] = useState<TransactionStep[]>([])
const [currentStep, setCurrentStep] = useState<{ step: TransactionStep; accepted: boolean } | undefined>()
const dispatch = useDispatch() const dispatch = useDispatch()
const { txInfo, gasFeeEstimateUSD, error, refetch } = useCreateTxContext() const { txInfo, gasFeeEstimateUSD, error, refetch } = useCreateTxContext()
const account = useAccountMeta() const account = useAccountMeta()
...@@ -85,12 +86,12 @@ export function CreatePositionModal({ isOpen, onClose }: { isOpen: boolean; onCl ...@@ -85,12 +86,12 @@ export function CreatePositionModal({ isOpen, onClose }: { isOpen: boolean; onCl
const trace = useTrace() const trace = useTrace()
const onFailure = () => { const onFailure = () => {
setCurrentStep(undefined) setCurrentTransactionStep(undefined)
} }
const onSuccess = useCallback(() => { const onSuccess = useCallback(() => {
setSteps([]) setSteps([])
setCurrentStep(undefined) setCurrentTransactionStep(undefined)
onClose() onClose()
navigate('/positions') navigate('/positions')
}, [onClose, navigate]) }, [onClose, navigate])
...@@ -122,7 +123,7 @@ export function CreatePositionModal({ isOpen, onClose }: { isOpen: boolean; onCl ...@@ -122,7 +123,7 @@ export function CreatePositionModal({ isOpen, onClose }: { isOpen: boolean; onCl
startChainId, startChainId,
account, account,
liquidityTxContext: txInfo, liquidityTxContext: txInfo,
setCurrentStep, setCurrentStep: setCurrentTransactionStep,
setSteps, setSteps,
onSuccess, onSuccess,
onFailure, onFailure,
...@@ -299,8 +300,8 @@ export function CreatePositionModal({ isOpen, onClose }: { isOpen: boolean; onCl ...@@ -299,8 +300,8 @@ export function CreatePositionModal({ isOpen, onClose }: { isOpen: boolean; onCl
{error && <TradingAPIError refetch={refetch} />} {error && <TradingAPIError refetch={refetch} />}
<PoolOutOfSyncError /> <PoolOutOfSyncError />
</Flex> </Flex>
{currentStep && steps.length > 1 ? ( {currentTransactionStep && steps.length > 1 ? (
<ProgressIndicator steps={steps} currentStep={currentStep} /> <ProgressIndicator steps={steps} currentStep={currentTransactionStep} />
) : ( ) : (
<> <>
<Separator mx="$padding12" /> <Separator mx="$padding12" />
...@@ -327,7 +328,7 @@ export function CreatePositionModal({ isOpen, onClose }: { isOpen: boolean; onCl ...@@ -327,7 +328,7 @@ export function CreatePositionModal({ isOpen, onClose }: { isOpen: boolean; onCl
}} }}
/> />
</Flex> </Flex>
{currentStep ? ( {currentTransactionStep ? (
<LoaderButton disabled={true} loading={true} buttonKey="create-position-confirm"> <LoaderButton disabled={true} loading={true} buttonKey="create-position-confirm">
<Text variant="buttonLabel1" color="$white"> <Text variant="buttonLabel1" color="$white">
<Trans i18nKey="common.confirmWallet" /> <Trans i18nKey="common.confirmWallet" />
......
...@@ -6,6 +6,7 @@ import { FeeAmount, TICK_SPACINGS, Pool as V3Pool } from '@uniswap/v3-sdk' ...@@ -6,6 +6,7 @@ import { FeeAmount, TICK_SPACINGS, Pool as V3Pool } from '@uniswap/v3-sdk'
import { Pool as V4Pool } from '@uniswap/v4-sdk' import { Pool as V4Pool } from '@uniswap/v4-sdk'
import { Dispatch, SetStateAction } from 'react' import { Dispatch, SetStateAction } from 'react'
import { PositionField } from 'types/position' import { PositionField } from 'types/position'
import { TransactionStep } from 'uniswap/src/features/transactions/swap/types/steps'
export type FeeData = { export type FeeData = {
feeAmount: number feeAmount: number
...@@ -87,6 +88,8 @@ export type CreatePositionContextType = { ...@@ -87,6 +88,8 @@ export type CreatePositionContextType = {
setFeeTierSearchModalOpen: Dispatch<SetStateAction<boolean>> setFeeTierSearchModalOpen: Dispatch<SetStateAction<boolean>>
dynamicFeeTierSpeedbumpData: DynamicFeeTierSpeedbumpData dynamicFeeTierSpeedbumpData: DynamicFeeTierSpeedbumpData
setDynamicFeeTierSpeedbumpData: Dispatch<SetStateAction<DynamicFeeTierSpeedbumpData>> setDynamicFeeTierSpeedbumpData: Dispatch<SetStateAction<DynamicFeeTierSpeedbumpData>>
currentTransactionStep?: { step: TransactionStep; accepted: boolean }
setCurrentTransactionStep: Dispatch<SetStateAction<{ step: TransactionStep; accepted: boolean } | undefined>>
} }
export interface PriceRangeState { export interface PriceRangeState {
......
...@@ -78,6 +78,7 @@ export const SHARED_FEATURE_FLAG_NAMES = new Map<FeatureFlags, string>([ ...@@ -78,6 +78,7 @@ export const SHARED_FEATURE_FLAG_NAMES = new Map<FeatureFlags, string>([
[FeatureFlags.PortionFields, 'portion-fields'], [FeatureFlags.PortionFields, 'portion-fields'],
[FeatureFlags.SharedSwapArbitrumUniswapXExperiment, 'shared_swap_arbitrum_uniswapx_experiment'], [FeatureFlags.SharedSwapArbitrumUniswapXExperiment, 'shared_swap_arbitrum_uniswapx_experiment'],
[FeatureFlags.TokenSelectorTrendingTokens, 'token_selector_trending_tokens'], [FeatureFlags.TokenSelectorTrendingTokens, 'token_selector_trending_tokens'],
[FeatureFlags.TwoSecondSwapQuotePollingInterval, 'two_second_swap_quote_polling_interval'],
[FeatureFlags.Unichain, 'unichain'], [FeatureFlags.Unichain, 'unichain'],
[FeatureFlags.UnichainPromo, 'unichain_promo'], [FeatureFlags.UnichainPromo, 'unichain_promo'],
[FeatureFlags.UniswapX, 'uniswapx'], [FeatureFlags.UniswapX, 'uniswapx'],
...@@ -101,7 +102,6 @@ export const WEB_FEATURE_FLAG_NAMES = new Map<FeatureFlags, string>([ ...@@ -101,7 +102,6 @@ export const WEB_FEATURE_FLAG_NAMES = new Map<FeatureFlags, string>([
[FeatureFlags.LimitsFees, 'limits_fees'], [FeatureFlags.LimitsFees, 'limits_fees'],
[FeatureFlags.MultipleRoutingOptions, 'multiple_routing_options'], [FeatureFlags.MultipleRoutingOptions, 'multiple_routing_options'],
[FeatureFlags.NavigationHotkeys, 'navigation_hotkeys'], [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. // TODO(WEB-3625): Remove these once we have a generalized system for outage banners.
[FeatureFlags.OutageBannerArbitrum, 'outage_banner_feb_2024_arbitrum'], [FeatureFlags.OutageBannerArbitrum, 'outage_banner_feb_2024_arbitrum'],
[FeatureFlags.OutageBannerOptimism, 'outage_banner_feb_2024_optimism'], [FeatureFlags.OutageBannerOptimism, 'outage_banner_feb_2024_optimism'],
......
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