ci(release): publish latest release

parent f16a99c9
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
web/5.67.3
\ No newline at end of file
web/5.67.4
\ No newline at end of file
......@@ -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<SetStateAction<IncreaseLiquidityState>>
unwrapNativeCurrency: boolean
setUnwrapNativeCurrency: Dispatch<SetStateAction<boolean>>
currentTransactionStep?: { step: TransactionStep; accepted: boolean }
setCurrentTransactionStep: Dispatch<SetStateAction<{ step: TransactionStep; accepted: boolean } | undefined>>
}
const IncreaseLiquidityContext = createContext<IncreaseLiquidityContextType>({
......@@ -45,6 +48,8 @@ const IncreaseLiquidityContext = createContext<IncreaseLiquidityContextType>({
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 <IncreaseLiquidityContext.Provider value={value}>{children}</IncreaseLiquidityContext.Provider>
......
......@@ -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<TransactionStep[]>([])
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 }) {
</Text>
<TokenInfo currencyAmount={displayCurrencyAmounts?.TOKEN1} currencyUSDAmount={displayUSDAmounts?.TOKEN1} />
</Flex>
{currentStep ? (
<ProgressIndicator currentStep={currentStep} steps={steps} />
{currentTransactionStep ? (
<ProgressIndicator currentStep={currentTransactionStep} steps={steps} />
) : (
<>
<Separator mx="$padding16" />
......
......@@ -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<IncreasePositionContextType | u
export function IncreaseLiquidityTxContextProvider({ children }: PropsWithChildren): JSX.Element {
const positionInfo = useModalLiquidityInitialState()
const { derivedIncreaseLiquidityInfo, increaseLiquidityState } = useIncreaseLiquidityContext()
const { derivedIncreaseLiquidityInfo, increaseLiquidityState, currentTransactionStep } = useIncreaseLiquidityContext()
const { customDeadline, customSlippageTolerance } = useTransactionSettingsContext()
const { currencyAmounts, error } = derivedIncreaseLiquidityInfo
......@@ -154,6 +155,10 @@ export function IncreaseLiquidityTxContextProvider({ children }: PropsWithChildr
}
}, [account, positionInfo, currencyAmounts, approvalsNeeded, customSlippageTolerance, exactField])
const isUserCommittedToIncrease =
currentTransactionStep?.step.type === TransactionStepType.IncreasePositionTransaction ||
currentTransactionStep?.step.type === TransactionStepType.IncreasePositionTransactionAsync
const {
data: increaseCalldata,
isLoading: isCalldataLoading,
......@@ -163,7 +168,12 @@ export function IncreaseLiquidityTxContextProvider({ children }: PropsWithChildr
params: increaseCalldataQueryParams,
deadlineInMinutes: customDeadline,
refetchInterval: 5 * ONE_SECOND_MS,
enabled: !error && !approvalLoading && !approvalError && Boolean(increaseCalldataQueryParams),
enabled:
!isUserCommittedToIncrease &&
!error &&
!approvalLoading &&
!approvalError &&
Boolean(increaseCalldataQueryParams),
})
const { increase, gasFee: actualGasFee, dependentAmount } = increaseCalldata || {}
......
import { useModalLiquidityInitialState } from 'components/Liquidity/hooks'
import { Dispatch, PropsWithChildren, SetStateAction, createContext, useContext, useMemo, useState } from 'react'
import { LiquidityModalInitialState } from 'state/application/reducer'
import { TransactionStep } from 'uniswap/src/features/transactions/swap/types/steps'
export enum DecreaseLiquidityStep {
Input,
......@@ -16,6 +17,8 @@ type RemoveLiquidityModalState = {
percentInvalid?: boolean
unwrapNativeCurrency: boolean
setUnwrapNativeCurrency: Dispatch<SetStateAction<boolean>>
currentTransactionStep?: { step: TransactionStep; accepted: boolean }
setCurrentTransactionStep: Dispatch<SetStateAction<{ step: TransactionStep; accepted: boolean } | undefined>>
}
const RemoveLiquidityModalContext = createContext<RemoveLiquidityModalState>({
......@@ -26,12 +29,17 @@ const RemoveLiquidityModalContext = createContext<RemoveLiquidityModalState>({
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<string>('')
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 <RemoveLiquidityModalContext.Provider value={ctx}>{children}</RemoveLiquidityModalContext.Provider>
......
......@@ -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<TransactionStep[]>([])
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 }) {
</Flex>
)}
</Flex>
{currentStep ? (
<ProgressIndicator steps={steps} currentStep={currentStep} />
{currentTransactionStep ? (
<ProgressIndicator steps={steps} currentStep={currentTransactionStep} />
) : (
<>
<Separator mx="$padding16" />
......
......@@ -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))),
......
......@@ -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<PositionState>({ ...DEFAULT_POSITION_STATE, ...initialState })
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 [feeTierSearchModalOpen, setFeeTierSearchModalOpen] = useState(false)
const [dynamicFeeTierSpeedbumpData, setDynamicFeeTierSpeedbumpData] = useState<DynamicFeeTierSpeedbumpData>({
......@@ -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 &&
......
......@@ -32,6 +32,8 @@ export const CreatePositionContext = React.createContext<CreatePositionContextTy
wishFeeData: DEFAULT_POSITION_STATE.fee,
},
setDynamicFeeTierSpeedbumpData: () => undefined,
currentTransactionStep: undefined,
setCurrentTransactionStep: () => undefined,
})
export const useCreatePositionContext = () => {
......
......@@ -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<TransactionStep[]>([])
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 && <TradingAPIError refetch={refetch} />}
<PoolOutOfSyncError />
</Flex>
{currentStep && steps.length > 1 ? (
<ProgressIndicator steps={steps} currentStep={currentStep} />
{currentTransactionStep && steps.length > 1 ? (
<ProgressIndicator steps={steps} currentStep={currentTransactionStep} />
) : (
<>
<Separator mx="$padding12" />
......@@ -327,7 +328,7 @@ export function CreatePositionModal({ isOpen, onClose }: { isOpen: boolean; onCl
}}
/>
</Flex>
{currentStep ? (
{currentTransactionStep ? (
<LoaderButton disabled={true} loading={true} buttonKey="create-position-confirm">
<Text variant="buttonLabel1" color="$white">
<Trans i18nKey="common.confirmWallet" />
......
......@@ -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<SetStateAction<boolean>>
dynamicFeeTierSpeedbumpData: DynamicFeeTierSpeedbumpData
setDynamicFeeTierSpeedbumpData: Dispatch<SetStateAction<DynamicFeeTierSpeedbumpData>>
currentTransactionStep?: { step: TransactionStep; accepted: boolean }
setCurrentTransactionStep: Dispatch<SetStateAction<{ step: TransactionStep; accepted: boolean } | undefined>>
}
export interface PriceRangeState {
......
......@@ -78,6 +78,7 @@ export const SHARED_FEATURE_FLAG_NAMES = new Map<FeatureFlags, string>([
[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, string>([
[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'],
......
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